Новости 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 Гость просматривают эту тему.
  • 11 Ответов
  • 1156 Просмотров
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Разрабатываю плагин для articles тип "content".

Есть задача вытянуть актуальные языковые связи article с выбранными статьями/материалами.
Суть следующая
Код
 public function onContentAfterSave($context, $article, $isNew)
    {

        if ($context !== 'com_content.article')
            return true;
        if (empty($this->_db)) {
            $this->_db = JFactory::getDBO();
        }
        $associations = JLanguageAssociations::getAssociations('com_content', '#__content', 'com_content.item', $article->id);
}
Проблема в том что $associations имеет неактуальную информацию. Оно вринципе логично, судя по коду JModelAdmin Dispatcher срабатывает до сохранения ассоциаций.

Как можно обойти эту проблему без двойного сохранения?


*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #1 : 16.09.2016, 09:54:48 »
А вам религия не позволяет два раза сохранять?)
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #2 : 16.09.2016, 11:27:17 »
А вам религия не позволяет два раза сохранять?)
Типа того, но сохраняет пользователь. Заставлять его сохранять два раза - выглядит как костыль.
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #3 : 16.09.2016, 11:38:45 »
Типа того, но сохраняет пользователь. Заставлять его сохранять два раза - выглядит как костыль.
ну тогда не совсем понятно что где и когда должен делать плагин ваш и на каком этапе должен получать языковые связи и для чего!
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #4 : 16.09.2016, 11:55:08 »
как вариант можно переопределить системным плагином модель и в ней уже делать что душе угодно)
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #5 : 16.09.2016, 11:56:11 »
ну тогда не совсем понятно что где и когда должен делать плагин ваш и на каком этапе должен получать языковые связи и для чего!

1. Есть статьи, которые создает юзер. Указывает раздел, язык и тд
2. Плагин цепляется на событие onContentAfterSave - то есть после сохранения статьи или создание новой.
3. Юзер использует встроенную возможность Joomla мультиязычность и создает еще статьи но с другим языком
4. В статье указывает связанные статьи и вот тут начинается проблема
5. Плагин в событии onContentAfterSave пытается получить эти связанные статьи, но их там нет потому что сохранение самих связей происходит после вызова события.

вот кусок кода /libraries/legacy/model/admin.php
Код
$dispatcher->trigger($this->event_after_save, array($context, $table, $isNew));
}
catch (Exception $e)
{
$this->setError($e->getMessage());

return false;
}

if (isset($table->$key))
{
$this->setState($this->getName(). '.id', $table->$key);
}

$this->setState($this->getName(). '.new', $isNew);

if ($this->associationsContext && JLanguageAssociations::isEnabled() && !empty($data['associations']))
{
$associations = $data['associations'];

// Unset any invalid associations
$associations = Joomla\Utilities\ArrayHelper::toInteger($associations);


тут происходит вызов триггера и только потом обработка связей.

То есть и получается: чтобы мне получить актуальную инфу по связям нужно юзера заставить два раза жмакнуть кнопку сохранить.
Либо сделать это за него, но как понять когда перестать сохранять, чтобы не зациклиться.
 
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #6 : 16.09.2016, 11:56:32 »
как вариант можно переопределить системным плагином модель и в ней уже делать что душе угодно)

Можно поподробней.
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #7 : 16.09.2016, 12:10:20 »
Можно поподробней.
будет подключаться модель из плагина
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #8 : 16.09.2016, 12:22:28 »
будет подключаться модель из плагина
Спасибо. Интересный подход. Это распространенная практика в среде Joomla?
*

Aleks.Denezh

  • Живу я здесь
  • 3401
  • 428 / 4
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #9 : 16.09.2016, 12:25:47 »
Спасибо. Интересный подход. Это распространенная практика в среде Joomla?
Это больше костыль чем практика )
можно попробовать в плагине самому сохранить связи (скопировав код administrator/components/com_content/models/article.php) со строки 545 начинается..
но я не знаю что больше костыль это или то (

Но я так и не понял зачем вам получать эти связи в момент сохранения, чего вы пытаетесь с ними потом сделать?
« Последнее редактирование: 16.09.2016, 12:31:55 от Istaan »
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #10 : 16.09.2016, 12:33:54 »
Это больше костыль чем практика )
ну костыль не костыль не знаю, иногда другого выхода просто нет
бывают ситуации что не только модель ну допустим макеты надо переопределять, допустим в таблицу надо добавить вывод столбца или еще чего-то
по другому это не сделать
*

Cristoff

  • Осваиваюсь на форуме
  • 24
  • 0 / 0
Re: onContentAfterSave и JLanguageAssociations::getAssociations
« Ответ #11 : 16.09.2016, 12:45:29 »
Это больше костыль чем практика )
можно попробовать в плагине самому сохранить связи (скопировав код administrator/components/com_content/models/article.php) со строки 545 начинается..
но я не знаю что больше костыль это или то (

Но я так и не понял зачем вам получать эти связи в момент сохранения, чего вы пытаетесь с ними потом сделать?

вся эта затея для автоматического создания меню по этим статьям. При включенном SEF режиме ссылки на новости выдают 404 если не сделать для него меню.
А меню так же имеет языковые связи.

чтобы сохранить эти связи мне их нужно получить, а в плагин они не попадают(
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться