Новости 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 Ответов
  • 573 Просмотров
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Здравствуйте!

Разрабатываю компонент, в котором есть вид(view), со страницы которого открываются три варианта дальнейшего развития событий:
1. увидеть список книг контактов с возможностью добавления или удаления книги.
2. добавить контакт в одну из книг.
3. импорт контактов.
Эти три пути отображает layout c наименованием default этого вида. Как правильно реализовать эти страницы под номерами 1,2,3 - с помощью отдельных view или с помощью отдельных layout этого view(потому что все эти страницы предназначены для работы с контактами)?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
View - об'ект, сформированный главным образом работой модели, которая работает с БД.
Layout берет готовые данные от своего view и отображает их.
У каждого элемента своя задача, при этом view - более ресурсозатратный.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
View - об'ект, сформированный главным образом работой модели, которая работает с БД.
Layout берет готовые данные от своего view и отображает их.
У каждого элемента своя задача, при этом view - более ресурсозатратный.
Попробую прийти к ответу на мой вопрос :) Получается, если модель у меня будет одна для всех этих страниц, то делаю один вид. Поскольку мне сейчас проще, чтобы все было просто(да и выигрыш какой-то может будет по производительности, если одному view и его модели не надо будет тащить все данные для этих страниц), то мне лучше наделать отдельные view под каждую из страниц. Логично?
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Логично?
Нет.
1. Нужно будет организовать так, чтобы разные view делили между собой 1 модель.
2. Будет меньше производительности, поскольку в отличие от view, layout нет никакого дела до модели и БД(соответственно, и запросов туда).
Не будь паразитом, сделай что-нибудь самостоятельно!
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Разрешите я Вас поправлю
Цитировать
Эти три пути отображает layout c наименованием default
Это не layouts это макет
UPD : Может немного не по теме
А про то что Вы спрашиваете ==
Цитировать
1. увидеть список книг контактов с возможностью добавления или удаления книги.
2. добавить контакт в одну из книг.
3. импорт контактов.
в модели представления есть такие методы
getLayout
setLayout

то есть в файле view.html.php
Вы можете переключать их
По умолчанию это default
Но если при выполнении какого нибудь условия Вы (можете) переключите его
к примеру так
Цитировать
$app = \JFactory::getApplication() ;
if( $app->input->get('view' , false , 'STRING') == 'add_contact' )
{
// Тут мы изменили макет с default => add_contact
$this->setLayout('add_contact');
// теперь в папке  tmpl - Joomla будет искать макет add_contact            
}#END IF
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
Спасибо. То есть robert за несколько view, а gartes за один вью с разными макетами?
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Нужно будет организовать так, чтобы разные view делили между собой 1 модель.
Если одна модель - то и view - должен быть один !
Цитировать
Будет меньше производительности, поскольку в отличие от view, layout нет никакого дела до модели и БД(соответственно, и запросов туда).
layout - Это просто кусочки - макетов которые Вы можете использовать в любых макетах default.php
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
а gartes за один вью с разными макетами
Да - нужен - 1 вью
Зайдите в менеджер пользователей посмотрите как там ! yes!
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Спасибо. То есть robert за несколько view, а gartes за один вью с разными макетами?
Нет, как раз наоборот. ;D
В общем так: если можно работать с 1 view, то так и сделаем.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

borro

  • Завсегдатай
  • 1379
  • 22 / 0
  • желаю вам счастья
*

gartes

  • Завсегдатай
  • 1859
  • 142 / 6
  • Е = mс²
Цитировать
Нет, как раз наоборот.
Что то мы совсем запутались ! ))))
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Да уж, перечитал свои посты, так и не понял, почему их можно было трактовать наоборот :o.
Не будь паразитом, сделай что-нибудь самостоятельно!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Зачем нужны шаблоны вида компонента?

Автор NeuroZ

Ответов: 12
Просмотров: 1049
Последний ответ 04.10.2016, 14:31:05
от Septdir