Новости Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla

👩‍💻 SW JProjects v.2.5.0 - компонент каталога цифровых проектов на Joomla.Компонент - менеджер цифровых проектов для Joomla! CMS. Компонент обеспечивает создание каталога цифровых проектов и предоставляет возможность скачивания, в том числе с использованием лицензионных ключей.👩‍💻 v.2.5.0. Что нового?Схемы структур данных для серверов обновлений. Теперь с SW JProjects вы может создавать сервер обновлений не только для расширений Joomla, но и свои собственные. Например, вам нужно, чтобы структура данных сервера обновлений была другая и формат должен быть, например, не XML, а JSON. Формирование структуры данных для сервера обновлений расширений Joomla вынесено в отдельный плагин. Вы можете создать свой собственный плагин и реализовать в нём нужную вам структуру данных, добавив или наоборот исключив отображаемые данные. Сервер обновлений в компоненте по-прежнему отображает информацию о списке проектов и их версиях, о конкретном проекте и его changelog.Можно выбрать схему данных сервера обновлений глобально для всего компонента, выбрать другую схему данных для категории проектов, а так же выбрать схему в каждом проекте.

Разработчикам в качестве образца можно посмотреть плагин схемы данных для Joomla в составе компонента или же плагин-образец JSON-схемы на GitHub.
Группа плагинов swjprojects. Для нужд компонента создана группа плагинов swjprojects. В частности, в этой группе находится плагин структуры данных Joomla расширений для сервера обновлений.Изменение языковых констант. Изменены некоторые языковые константы в панели администратора. Если вы делали переопределение констант - переопределите их снова.👩‍💻 Joomla 6. Внесены изменения для корректной установки и работы компонента на Joomla 6. Компонент успешно протестирован на Joomla 6-beta2.Минимальная версия Joomla - 5. Подняты минимальные системные требования: Joomla 5.0.0 и PHP 8.1.
- Страница расширения👉 Плагин-образец кастомной JSON-схемы данных для сервера обновлений на GitHub.- GitHub расширения- Документация на GitHub- Joomla Extensions Directory#joomla #расширения

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод...

👩‍💻 Как триггерить события для плагинов на манер Joomla 5+?В Joomla 6 должны удалить метод triggerEvent(), с помощью которого раньше вызывались события для плагинов. Теперь чтобы в своём коде вызвать событие для плагина и получить от него результаты нужно:- создать объект класса события- передать в него параметры

use Joomla\CMS\Event\AbstractEvent;use Joomla\CMS\Factory;use Joomla\CMS\Plugin\PluginHelper;// Грузим плагины нужных группPluginHelper::importPlugin('system');// Создаём объект события$event = AbstractEvent::create('onAfterInitUniverse', [    'subject' => $this,    'data'    => $data, // какие-то данные    'article' => $article, // ещё материал вдовесок    'product' => $product, // и товаров подвезли]);// Триггерим событиеFactory::getApplication()->getDispatcher()->dispatch(    $event->getName(), // Тут можно строку передать 'onAfterInitUniverse'    $event);// Получаем результаты// В случае с AbstractEvent это может быть не 'result',// а что-то ещё - куда сами отдадите данные.// 2-й аргумент - значение по умолчанию, // если не получены результаты$results = $event->getArgument('result', []);
Плюсы такого подхода - вам не нужно запоминать порядок аргументов и проверять их наличие. Если вы написали свой класс события, то в плагине можно получать аргументы с помощью методов $event->getArticle(), $event->getData(), $event->getProduct() и подобными - реализуете сами под свои нужды. Если такой класс события написали, то создаёте экземпляр своего класса события и укажите его явно в аргументе eventClass
use Joomla\Component\MyComponent\Administrator\Event\MyCoolEvent;$event = MyCoolEvent::create('onAfterInitUniverse', [    'subject'    => $this,    'eventClass' => MyCoolEvent::class, // ваш класс события    'data'       => $data, // какие-то данные    'article'    => $article, // ещё материал вдовесок    'product'    => $product, // и товаров подвезли]);
Ожидаемо, что класс вашего события будет расширять AbsractEvent или другие классы событий Joomla.🙁 Есть неприятный нюанс - нельзя просто так вызывать событие и ничего не передать в аргументы. Аргумент subject обязательный. Но если вы всё-таки не хотите туда ничего передавать - передайте туда пустой stdClass или объект Joomla\registry\Registry.
@joomlafeed#joomla #php #webdev

0 Пользователей и 1 Гость просматривают эту тему.
  • 182 Ответов
  • 10533 Просмотров
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Во вьюхе получаю результат работы функции из модели:
$result = $this->get('getMyFunc');
А как передать ей параметры?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Так ведь со второго списка будет открываться отдельная форма, будет ли она работать? Не въеду никак в технопроцесс

Хотя для начала надо заставить работать то, что есть (#51 пост)
<form>
<tab1></tab1>
<tab2></tab2>
<tab3></tab3>
<tab4></tab4>
</form>
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
)) я имел ввиду как в модели все это реализуется.



Добавил автоинкрементное id в таблицу, внес правки везде, где нашел.
При редактировании записи, при сохранении вместо изменения текущей записи добавляется новая.
Что показать?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Во вьюхе получаю результат работы функции из модели:
$result = $this->get('getMyFunc');
А как передать ей параметры?
Код: php
                        $model = JModelLegacy::getInstance('Articles', 'ContentModel', array('ignore_request' => true));
$model->setState('params', JFactory::getApplication()->getParams());
$model->setState('filter.category_id', $category->id);
$model->setState('filter.published', $this->getState('filter.published'));
$model->setState('filter.access', $this->getState('filter.access'));
.......
                        $this->_articles = $model->getItems();
components/com_content/models/category.php
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
)) я имел ввиду как в модели все это реализуется.



Добавил автоинкрементное id в таблицу, внес правки везде, где нашел.
При редактировании записи, при сохранении вместо изменения текущей записи добавляется новая.
Что показать?
В форме input id забыл или неправильно назвал или неправильно передал значение.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
а если я не хочу поле id показывать в форме, могу сделать скрытым?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Создал в XML поле скрытым, вопрос с сохранением решен.

Как мне теперь вывести данные из другой таблицы в этой же форме, в виде списка, аналогичного тому, что строится через JModelList?
« Последнее редактирование: 21.10.2014, 22:41:58 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Сделать select (там где у вас getItem)
и $item->list = $db->setQuery($query)->loadObjectList();

в шаблоне перебирать
foreach($this->item->lias as $list){}
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
А как быть с сортировкой и множественным выбором?
каждый элемент этого списка нужно будет еще редактировать и удалять при необходимости, а также новые добавлять



Кнопки пририсовал ручками, их код onclick еще править соответственно нужно.
Как вызывать форму добавления/редактирования этих записей?
« Последнее редактирование: 21.10.2014, 23:18:54 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
А как быть с сортировкой и множественным выбором?
каждый элемент этого списка нужно будет еще редактировать и удалять при необходимости, а также новые добавлять
У вас два варианта:
1. IFRAME
2. AJAX
так как нельзя ставить форму в форме!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Оба варианта, если я понял правильно, подразумевают создание отдельной вьюхи и модели с последующей вставкой в данную форму, я правильно понял?

Интересно, подобное решение кто-нибудь реализовывал ранее?



Конечно, можно список и отдельной вьюхой организовать, но там будет еще и 3 колонка: имя пользователя
Теперь представьте, сейчас около 62 000 клиентов, около 30 релизов, 62000*30=1 860 000 записей скопом из базы будут тянуться...
« Последнее редактирование: 22.10.2014, 00:21:45 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
первый вариант с фреймом подразумевает в себе что да у вас будет отдельная вьюха, отдельная модель, отдельный слой для отображения всего этого! Даже две модели и вьюхи (одна на список вторая на форму)
Второй вариант предполагает что у вас будет одна модель и одна вьюха!
Но в первом варианте все просто (вы грузите страницу в фрем, но не очень красиво, ибо будут появляться скролы!
Второй вариант все сложнее, ибо вам придется каждое действие отдельно обрабатывать, писать свою сортировку, удаление, редактирование добавление!

Да я подобное  реализовывал и не раз! В реализации этого нет ничего сложного! И я всегда выбирал аяксовскую сторону, она мне удобнее!
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Да, второй вариант мне тоже больше по душе, но с какой стороны к нему подъехать - ума не приложу.
Делать
Сделать select (там где у вас getItem)
и $item->list = $db->setQuery($query)->loadObjectList();

в шаблоне перебирать
foreach($this->item->lias as $list){}
а остальное AJAX?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Положим, сортировку можно и опустить, благо там сортировать-то особо и нечего, запросом отсортирую, а вот действия с кнопками...


Список я вывел, с чекбоксами. Как реализовывать форму редактирования (может, модальным окошком можно?) и  события действия кнопок - хз.
Прошу помощи.
« Последнее редактирование: 22.10.2014, 01:00:00 от AlekVolsk »
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Положим, сортировку можно и опустить, благо там сортировать-то особо и нечего, запросом отсортирую, а вот действия с кнопками...

Список я вывел, с чекбоксами. Как реализовывать форму редактирования (может, модальным окошком можно?) и  события действия кнопок - хз.
Прошу помощи.
Ну смотрите как я реализовывал:
Например кнопка удалить запись
<input  type="button" value="Удалить" class="btn btn-delete" data-id="<?php echo $list->id; ?>"  />

В jQ писал:
Код: php
<script>jQuery(document).ready(function ($) {
$(document).on('click', '.btn-delete',function(){
var button = $(this);//Текущая кнопка на которую тыкнул юзер
button.hide(); //скрываем кнопку что бы несколько раз на неё не тыкнули
if(confirm("Удалить запись?")){ //узнаем ли реально хотят удалить запись,  а не тыкнули случайно на неё
$.getJSON('index.php?option=com_ващ_компонент&task=getAjax&action=deleteRow&ud=' + button.data('id'), function(response){ //посылаем AJAX запрос
if(response.result) {//Если удачное уделание
button.closest('tr').remove(); //удаляем текущу запись с HTML страницы
}
else{//если не удалось удалить
button.show(); //показываем кнопку
alert(response.message); //выдаем сообщение об ошибке!
}
})
}
});
});</script>

Тут все банально!
Дальше в контроллер по умолчанию вашего компонента вставляете такой метод:
Код: php
public function getAjax(){
$input = JFactory::getApplication()->input;
$model = $this->getModel( 'ajax' );
$action = $input->getCmd( 'action' );
$reflection = new ReflectionClass( $model );
$methods = $reflection->getMethods( ReflectionMethod::IS_PUBLIC );
$methodList = array();
foreach ( $methods as $method ) {
$methodList[] = $method->name;
}
if ( in_array( $action, $methodList ) ) {
$model->$action();
}
exit;
}
Этот медод позволит из модели AJAX дергать нужную функцию, что бы не создавать кучу методов в контроллере!

И создаете модель AJAX (создать файл AJAX.php в папке models)
Код: php
<?php
// No direct access
defined( '_JEXEC' ) or die;


class ВашКомпонентModelAjax extends JModelLegacy
{
/**
* Вывод JSON данных
* @param $message
* @param bool $result
* @param array $custom
*/
private function printJson( $message, $result = false, $custom = array() )
{
$jsonData = array( 'result' => $result, 'message' => $message );
foreach ( $custom as $key => $value ) {
$jsonData[$key] = $value;
}
echo json_encode( $jsonData );
exit;
}

//метод с который вы передаете в action JQ
public function deleteRow( ){
//удаляете тут нужную вам запись
$this->printJson('Запись удалена', true);//если удаление успешно

$this->printJson('Ошибка удаления');//Если возникла какая либо ошибка при удаление, например юзер не может удалять эту запись на основании ACL
}

}


А дальше дергаете любой метод для аякса из модели аяксово строкой inex.php?option=com_ваш_компонент&task=getAjax&action=название_метода_в_модели_ajax&перменная1=1&переменная2=2...


Для редактирования и создания записи я бы использовал форму в Lightbox!
« Последнее редактирование: 22.10.2014, 01:30:45 от Istaan »
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Попробую разобраться.

А почему  Lightbox? админка же на bs - там свой модал есть. Саму форму рисовать в методе в AJAX.php?
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Попробую разобраться.

А почему  Lightbox? админка же на bs - там свой модал есть. Саму форму рисовать в методе в AJAX.php?
Ну я использую например FancyBox2 мне он больше нравится чем бутстаповское окошко!
Можете форму отдать в методе AJAX.php
Можете после ваше формы создать ещё одну форму скрытую уже с полями и просто заполнять значениями из того что отдал вам AJAX! Дело вкуса )
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Чувствую, это надолго...
Буду пробовать, спасибо.

В вашем примере кнопка удалить - каждая на своей строке? А как быть, если она одна, а выбор строки - чекбоксом?
Я с jq пока еще плохо ((
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Чувствую, это надолго...
Буду пробовать, спасибо.

В вашем примере кнопка удалить - каждая на своей строке? А как быть, если она одна, а выбор строки - чекбоксом?
Я с jq пока еще плохо ((
Передавать массив выделенных кнопок) например так http://www.oddler.ru/i/304
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Или вот Федя Власенко читает тему и говорит мне в аську что красивее так (так что ему плюса влупить):
Код: javascript
$.getJSON('index.php',
{
option: 'com_ващ_компонент',
task: 'getAjax',
action: 'deleteRow',
id: button.data('id')
}, function(response){});
где вы можете добавить

И передасца массив значений для удаления!
Код: javascript
var ids = [1, 2, 3];
$.getJSON('index.php',
{
option: 'com_ващ_компонент',
task: 'getAjax',
action: 'deleteRow',
ids : ids
}, function(response){});
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Попробую, спс
*

aspidy

  • Завсегдатай
  • 1008
  • 55 / 1
  • Миграция joomla 1.0-1.5-2.5
Вы правы в админке своя модалка, сквези. Вешать фанси бокс рентабельно если он у вас еще где нибудь задействован. Но лучше литл бокс. Если делаете для 3.0 то просто подключаете jquery Библиотека предустановлена
Мелкий ремонт. skype poisk-plus
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
В аякс-модели, запрос:
Код: php
$db->setQuery('delete from `#__aimfo_codes` where `id` = '.(int)$_REQUEST['id'])->execute();
Как правильно с экранировать $_REQUEST['id'] и как узнать, успешен ли запос?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Как правильно с экранировать $_REQUEST['id']
используйте JInput хотя для числовых переменных  достаточно (int)!
Но лучше юзайте
$input = JFactory::getApplication()->input;
$db->setQuery('delete from `#__aimfo_codes` where `id` = '.$input->getInt('id', 0))->execute();

и как узнать, успешен ли запос?
После запроса:
if($db->getAffectedRows()){//успешный запрос!}
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
Код: php
$this->printJson(JText::_('COM_AIMFO_CODES_DELCODE_'.(int)$result), $result);
Не хочет сообщение показывать
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
JInput, а может похоронить этот сахар. Я так думаю что перепишут они это дело в скором времени. Я намекал на это
так как есть нативные http://php.net/manual/ru/book.filter.php встроенные в язык. Стоит к ним привыкать
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
AlekVolsk а случаем не напутал
Зачем к строке методом конкатенации добавлять число. У тебя выходит так ты переменную приводишь в int? а когда складываешь с строкой, преобразуешь опять в строку. Зачем эти лишние преобразования
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
JInput, а может похоронить этот сахар. Я так думаю что перепишут они это дело в скором времени. Я намекал на это
так как есть нативные http://php.net/manual/ru/book.filter.php встроенные в язык. Стоит к ним привыкать
Вот тут вопрос: в AJAX get или post прилетает?


AlekVolsk а случаем не напутал
Зачем к строке методом конкатенации добавлять число. У тебя выходит так ты переменную приводишь в int? а когда складываешь с строкой, преобразуешь опять в строку. Зачем эти лишние преобразования
Преобразование убрал, все равно не показывает
$this->printJson(JText::_('COM_AIMFO_CODES_DELCODE_'.$result), $result);
Константы COM_AIMFO_CODES_DELCODE_0 и COM_AIMFO_CODES_DELCODE_1 существуют.
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
JInput, а может похоронить этот сахар. Я так думаю что перепишут они это дело в скором времени. Я намекал на это
так как есть нативные http://php.net/manual/ru/book.filter.php встроенные в язык. Стоит к ним привыкать
Код: php
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT);
так правильно будет?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Отправка файлов через ajax в модуль Joomla

Автор hemicide

Ответов: 19
Просмотров: 2108
Последний ответ 11.04.2022, 08:44:33
от sivers
Создание компонента для табеля рабочего времени

Автор sashahz

Ответов: 7
Просмотров: 775
Последний ответ 12.04.2021, 11:12:11
от sashahz
Вызов формы компонента в pop-up, при клике по ссылке из любого места

Автор SkyAn

Ответов: 1
Просмотров: 664
Последний ответ 01.03.2021, 04:08:48
от gartes
Документация по разработки компонента для Joomla 3.x

Автор Aspik

Ответов: 9
Просмотров: 3285
Последний ответ 23.01.2021, 07:55:56
от hmr
Сборка инсталятора компонента файлами из разных папок с привлечением github

Автор borro

Ответов: 1
Просмотров: 670
Последний ответ 25.12.2020, 21:21:30
от platonische