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

foreach

  • Осваиваюсь на форуме
  • 43
  • 1 / 0
Прошу помощи у программистов.
Пытаюсь написать свой компонент.У же совсем запарился с этим Joomla API.
получаю вот такую ошибку
Цитировать
Fatal error: Call to a member function set() on a non-object in Z:\home\joomtest15\www\libraries\joomla\application\component\model.php on line 144
Не могу понять изза чего.Понимаю, что ошибка не в 144 строке библиотеки, но где у меня(кроме ДНК),не въеду.
Вот контроллер
Код: php
class ScenbasesController extends JController
{
    /**
     * Конструктор(Регистрация дополнительных задач)
     */
    function __construct()
    {
        parent::__construct();
       
        //Регистрация дополнительных задач
        //первый параметр задача, второй параметр метод для выполнения задачи
        $this->registerTask('add','display');
        $this->registerTask( 'edit'  , 'display'  );
$this->registerTask( 'apply', 'save'  );
    }
   
    /**
     * Метод для отображения вида
     */
    function display()
    {
        switch($this->getTask())
{
case 'add'     :
{ //указываем представление
                                            JRequest::setVar('view','scenbase');
                                            //и макет для загрузки
                                            JRequest::setVar('layout','form');
                                            //скроем главное меню
                                            JRequest::setVar('hidemainmenu',1);
} break;
case 'edit'    :
{
//указываем представление
                                             JRequest::setVar('view','scenbase');
                                            //и макет для загрузки
                                            JRequest::setVar('layout','form');             
                                           //скроем главное меню
                                           JRequest::setVar('hidemainmenu',1);
} break;
}     
        parent::display();
    }
}
Вот вид
Код: php
class scenbasesViewScenbase extends JView
{
    /**
     * Метод для отображения вида
     */   
    function display($tpl=null)
    {
        //получаем данные
        $scenary=$this->get('getData','scenbase');
        //если айди сценария меньше еденицы
        //значит новый сценарий
        $isNew = ($scenary->id<1);
       
        $text=$isNew?JText::_('New'):JText::_('Edit');
       
        JToolBarHelper::title(JText::_('Сценарий').':<small><small>['.$text.']</small></small>');
        JToolBarHelper::save();
       
        if($isNew)
        {
            //добавляем кнопку отмена
            JToolBarHelper::cancel();
        }
        else
        {
            //для существующих записей кнопка переименовывается на close
            JToolBarHelper::cancel('cancel','Close');
        }
        $this->assignRef('scenary',$scenary);
        parent::display($tpl);
       
    }
}

Вот модель
Код: php
class scenbasesModelScenbase extends Jmodel
{
    var $_id;//идентификатор записи
    var $_data;//данные
   
    function __construct()
    {
        /* Конструктор поучает первое значение из cid и присваивает его id */
        $array=JRequest::getVar('cid',0,'','array');
        //Устанавливаем id
        $this->setId((int)$array[0]);
    }
    /**
     * Метод установки идентификатора
     */
    function setId($id)
    {
        //устанавливаем id и удаляем данные из свойства _data
        $this->_id=$id;
        $this->_data=null;
    }
    /**
     * Метод для получения данных
     * Проверяет установлено лми своййство _data, если да
     * то посто возвратит его,если нет то будут получены данные из базы данных
     */
    function &getData()
    {
        //загружаем данные
        if(empty($this->_data))
        {
            //если данных нет загружаем их из базы данных
            $query='select * from #__scenarii where id='.$this->_id;
            $this->_db->setQuery($query);
            $this->_data=$this->_db->loadObject();
            //$this->_db->stderr();
           
        }
        if(!$this->_data)
        {
            $this->_data=new stdClass();
            $this->_data->id=0;
            $this->_data->name=null;
            $this->_data->type=null;
            $this->_data->date=null;
            $this->_data->regnum=null;
            $this->_data->rate=null;
            $this->_data->poll=null;
            $this->_data->published=null;
        }
        return $this->_data;
    }
}

Подскажите люди добрые, что не так делаю >:(
Уже голова сейчас взорвется.Гугл уже красный.На мои поиски пишет - Вы уже спрашивали, зае... уже.
*

friendmaster

  • Новичок
  • 2
  • 0 / 0
Вот нашел такое решение!
Код: php
class A1ModelA2 extends JModel{
    function __construct($config = array()){
        parent::__construct($config);                   //    <----   Решение проблемы
    }
}
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Не работает страница XML выдает ошибку: This page contains the following errors

Автор vitaliywolf

Ответов: 20
Просмотров: 18157
Последний ответ 07.05.2020, 22:24:16
от sivers
Подскажите - сайт стал в фронтэнде выводить ошибку. Как ее убрать

Автор vovchikku

Ответов: 7
Просмотров: 1993
Последний ответ 30.01.2017, 10:35:49
от vovchikku
Undefined variable, прошу помощи, важный проект!

Автор Elimelech

Ответов: 15
Просмотров: 1550
Последний ответ 22.12.2016, 12:42:23
от Elimelech
Постоянно выбивает ошибку 400 на любой странице

Автор timber

Ответов: 1
Просмотров: 1421
Последний ответ 10.01.2016, 11:41:26
от timber
Выдает ошибку "Невозможно найти установочный пакет"

Автор riabina2

Ответов: 13
Просмотров: 2791
Последний ответ 19.11.2015, 12:03:51
от Ragivort