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

OnePrg

  • Осваиваюсь на форуме
  • 49
  • 1 / 0
Братья и сестры!

Смиренно прошу направить новичка на путь истинный.

Пытаюсь писать свою компоненту. Первые шаги прошли удачно: форма front-end открывается. Теперь нужно на форму добавить поля и тут ошибка

Call to a member function getLabel() on a non-object ..... components\com_drazs\views\application_add\tmpl\default.php on line 12

Файлики тута https://yadi.sk/d/CsCZiil5342LQj

Не могу разобраться с объектами, кто-что вызывает. Дайте ссылки почитать, чтобы ошибку исправить.
« Последнее редактирование: 19.12.2016, 15:57:32 от OnePrg »
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: Ошибка: Call to a member function on a non-object
« Ответ #1 : 19.12.2016, 12:54:22 »
Так дали бы сразу код 12 строки и смой функции
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

OnePrg

  • Осваиваюсь на форуме
  • 49
  • 1 / 0
Re: Ошибка: Call to a member function on a non-object
« Ответ #2 : 19.12.2016, 15:24:37 »
Так дали бы сразу код 12 строки и смой функции

даю весь файл

<?php   
/** @var $this DrazsViewApplication_Add */
defined( '_JEXEC' ) or die; // No direct access
?>

<div class="item-page">
   <h1>Форма подачи заявки на приём</h1>
    
    <form action="<?php echo JRoute::_( 'index.php?view=application_add' )?>" method="post" class="form-validate">
 
        <div class="control-group form-inline">

ВОТ ТУТ ОШИБКА!           <div class="control-label"><?php echo $this->form->getLabel( 'name' ); ?></div>
            <div class="controls"><?php echo $this->form->getInput( 'name' ); ?></div>
        </div>
 
        <input type="hidden" name="task" value="form.save" />
        <input type="submit" value="Отправить" />
        <?php echo JHtml::_( 'form.token' ); ?>
    </form>
    
</div>
« Последнее редактирование: 19.12.2016, 15:55:44 от OnePrg »
*

OnePrg

  • Осваиваюсь на форуме
  • 49
  • 1 / 0
Re: Ошибка: Call to a member function on a non-object
« Ответ #3 : 19.12.2016, 15:26:16 »
Менял

<div class="control-label"><?php echo $this->form->getLabel( 'name' ); ?></div>

на

<div class="control-label"><?php echo $this->application_add->getLabel( 'name' ); ?></div>


- не помогло
« Последнее редактирование: 19.12.2016, 15:56:07 от OnePrg »
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: Ошибка: Call to a member function on a non-object
« Ответ #4 : 19.12.2016, 16:06:56 »
Ну все просто он не может получить занчение name label а точнее его просто нет, а нулевое там не сделали, ну или в XML забыл label написать. обратисеь к создателю комопнета пусть подправить. чистый баг
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

OnePrg

  • Осваиваюсь на форуме
  • 49
  • 1 / 0
Re: Ошибка: Call to a member function on a non-object
« Ответ #5 : 19.12.2016, 16:12:56 »
В файле

com_drazs\models\forms\application_add.xml прописано

<?xml version="1.0" ?>
<form>
    <fieldset>
        <field name="name" type="text" label="Имя:" class="span3" required="true" />
    </fieldset>
</form>

*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Ошибка: Call to a member function on a non-object
« Ответ #6 : 19.12.2016, 17:35:37 »
Ну все просто он не может получить занчение name label а точнее его просто нет, а нулевое там не сделали, ну или в XML забыл label написать. обратисеь к создателю комопнета пусть подправить. чистый баг
Да нет, в таком случае вернуло бы просто пустую строку.
OnePrg, объект $this->form у вас либо не определен, либо не экземпляр JForm. Сделайте print_r($this->form); и посмотрите, что выводит.
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Septdir

  • Живу я здесь
  • 3370
  • 168 / 4
Re: Ошибка: Call to a member function on a non-object
« Ответ #7 : 19.12.2016, 17:39:57 »
Да нет, в таком случае вернуло бы просто пустую строку.
Даже как-то не подумал увидел non-object  и мышенально среагировал.
Не можете справиться с задачей сами пишите, решу ее за вас, не бесплатно*.
*Интересная задача, Деньги или Бартер. Натурой не беру!
CodersRank | Контакты | Мой GitHub | Workshop
*

OnePrg

  • Осваиваюсь на форуме
  • 49
  • 1 / 0
Re: Ошибка: Call to a member function on a non-object
« Ответ #8 : 20.12.2016, 09:30:44 »
OnePrg, объект $this->form у вас либо не определен, либо не экземпляр JForm. Сделайте print_r($this->form); и посмотрите, что выводит.

ничего не выводит

Как я понимаю последовательность операций:
1. drazs.php - точка входа
2. controller.php - контролер по умолчанию
3. views/appliations_add/view.html.php - вызываемый им вид
4. models/appliations_add.php - вызываемая модель   
5. views\application_add\tmpl\default.php - сама форма

правильно?

я правильно понимаю, что мой объект должен определяться в п.3?

   public function display( $tpl = null )
   {
      
      $this->item = $this->get( 'Item' );
      $this->form = $this->get( 'application_add' );
      $this->state = $this->get( 'State' );
      DrazsSiteHelper::setDocument( 'view title');
      print_r($form);   ВОТ ТУТ ВЫДАЁТ ПУСТО - НИЧЕГО НЕ ПИШЕТ
      parent::display( $tpl );
   }


А если делаю print_r($this);, то выдаёт вот что:

Спойлер
[свернуть]
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Re: Ошибка: Call to a member function on a non-object
« Ответ #9 : 20.12.2016, 09:37:50 »
      $this->form = $this->get( 'application_add' );
Покажите код модели.
      print_r($form);   ВОТ ТУТ ВЫДАЁТ ПУСТО - НИЧЕГО НЕ ПИШЕТ
$form откуда взялась?
Не будь паразитом, сделай что-нибудь самостоятельно!
*

OnePrg

  • Осваиваюсь на форуме
  • 49
  • 1 / 0
Re: Ошибка: Call to a member function on a non-object
« Ответ #10 : 20.12.2016, 10:04:43 »
Разобрался :)

   public function display( $tpl = null )
   {
     
      $this->item = $this->get( 'Item' );
      $this->form = $this->get( 'application_add' ); ВОТ ТУТ ОШИБКА; нужно $this->get( 'form' )
      $this->state = $this->get( 'State' );
      DrazsSiteHelper::setDocument( 'view title');
      print_r($form);   
      parent::display( $tpl );
   }


Всем спасибо!
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

YOOtheme pro ошибка фото

Автор andersonov

Ответов: 1
Просмотров: 1269
Последний ответ 20.12.2024, 19:16:38
от Missile
Ошибка после обновления Templater manager от разработчика Regular Labs

Автор fbr

Ответов: 2
Просмотров: 1045
Последний ответ 24.03.2021, 21:17:35
от fbr
Ошибка при установке DJ Reviews

Автор Kijv

Ответов: 0
Просмотров: 943
Последний ответ 15.02.2021, 14:52:09
от Kijv
Ошибка при работе с widgetkit в админке

Автор stanzdor

Ответов: 2
Просмотров: 1724
Последний ответ 22.09.2020, 18:05:07
от Vekach
Ошибка Declaration of ticketController

Автор Limonkevich

Ответов: 6
Просмотров: 1477
Последний ответ 10.03.2020, 11:51:24
от Limonkevich