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

n_drey

  • Захожу иногда
  • 156
  • 3 / 1
  • Давай телевиденье!
Доброго времени!
Чёрт дёрнул переписать свой компонент под Joomla 3 (((
Взял за аналогию сom_content и вроде всё как бы получилось. Выводятся материалы из таблицы сортируются итп.
Но когда кликаешь на редактирование просто белый экран (

В логах веб сервера наблюдаю вот такое вот сообщение:
Call to a member function getKeyName() on a non-object in /test/libraries/legacy/controller/form.php on line 387"

Понимаю что дело в Контроллере форм.
Облазил весь инет, но нормальной документации на joomla3 так и не нашёл (( много отличий получается.

Кто нибудь может подсказать на каком этапе вызывается этот метод?

Вот класс моего контроллера, ошибка где то здесь. Проверил его уже несколько раз всё в с ним в порядке. Аналогичен ком контентовскому только с исправлениями вьюшек.
Код
class MyshopControllerMyshop extends JControllerForm
{
/**
* Class constructor.
*
* @param   array  $config  A named array of configuration variables.
*
* @since   1.6
*/
public function __construct($config = array())
{
parent::__construct($config);
// An article edit form can come from the articles or featured view.
// Adjust the redirect view on the value of 'return' in the request.
if ($this->input->get('return') == 'featured')
{
$this->view_list = 'featured';
$this->view_item = 'myshop&return=featured';
}
}

/**
* Method override to check if you can add a new record.
*
* @param   array  $data  An array of input data.
*
* @return  boolean
*
* @since   1.6
*/
protected function allowAdd($data = array())
{
$user = JFactory::getUser();
                
$categoryId = JArrayHelper::getValue($data, 'catid', $this->input->getInt('filter_category_id'), 'int');
$allow = null;

if ($categoryId)
{
// If the category has been passed in the data or URL check it.
$allow = $user->authorise('core.create', 'com_myshop.category.' . $categoryId);
}

if ($allow === null)
{
// In the absense of better information, revert to the component permissions.
return parent::allowAdd();
}
else
{
return $allow;
}
}

/**
* Method override to check if you can edit an existing record.
*
* @param   array   $data  An array of input data.
* @param   string  $key   The name of the key for the primary key.
*
* @return  boolean
*
* @since   1.6
*/
protected function allowEdit($data = array(), $key = 'id')
{      
$recordId = (int) isset($data[$key])? $data[$key] : 0;
$user = JFactory::getUser();
$userId = $user->get('id');
                
// Check general edit permission first.
if ($user->authorise('core.edit', 'com_myshop.myshop.' . $recordId))
{
return true;
}

// Fallback on edit.own.
// First test if the permission is available.
if ($user->authorise('core.edit.own', 'com_myshop.myshop.' . $recordId))
{
// Now test the owner is the user.
$ownerId = (int) isset($data['created_by'])? $data['created_by'] : 0;
if (empty($ownerId) && $recordId)
{
// Need to do a lookup from the model.
$record = $this->getModel()->getItem($recordId);

if (empty($record))
{
return false;
}

$ownerId = $record->created_by;
}

// If the owner matches 'me' then do the test.
if ($ownerId == $userId)
{
return true;
}
}

// Since there is no asset tracking, revert to the component permissions.
return parent::allowEdit($data, $key);
}

/**
* Method to run batch operations.
*
* @param   object  $model  The model.
*
* @return  boolean   True if successful, false otherwise and internal error is set.
*
* @since   1.6
*/
public function batch($model = null)
{
JSession::checkToken() or jexit(JText::_('JINVALID_TOKEN'));

// Set the model
$model = $this->getModel('Myshop', '', array());

// Preset the redirect
$this->setRedirect(JRoute::_('index.php?option=com_myshop&view=myshops' . $this->getRedirectToListAppend(), false));

return parent::batch($model);
}

/**
* Function that allows child controller access to model data after the data has been saved.
*
* @param   JModelLegacy  $model  The data model object.
* @param   array         $validData   The validated data.
*
* @return void
*
* @since 3.1
*/
protected function postSaveHook(JModelLegacy $model, $validData = array())
{
return;
}
}

Но почему то дальше конструктора дело не идёт. Спасиб
« Последнее редактирование: 05.12.2013, 09:54:11 от n_drey »
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: "PHP Fatal error: Call to a member function getKeyName()
« Ответ #1 : 04.12.2013, 22:20:37 »
потому что ошибка не в контроллере, а в модели
Цитировать
Но почему то дальше конструктора дело не идёт.
а куда оно должно идти?)
*

n_drey

  • Захожу иногда
  • 156
  • 3 / 1
  • Давай телевиденье!
Re: "PHP Fatal error: Call to a member function getKeyName()
« Ответ #2 : 04.12.2013, 22:44:28 »
Хммм очень странно. Пересмотрел модель.
Там есть метод:
Код
public function getTable($type = 'Myshop', $prefix = 'JTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}

Название таблицы так и есть myshop, в папке tables файл присутствует

Код
<?php
/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 *
 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
 * @license     GNU General Public License version 2 or later; see LICENSE.txt
 */

defined('_JEXEC') or die;

/**
 * @package     Joomla.Administrator
 * @subpackage  com_content
 */
class MyshopTableMyshop extends JTable
{
/**
* @param   JDatabaseDriver  A database connector object
*/
public function __construct(&$db)
{
parent::__construct('#__myshop', 'id', $db);
}
}



Вроде всё как полагается. (( чтож такое то может быть..
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: "PHP Fatal error: Call to a member function getKeyName()
« Ответ #3 : 04.12.2013, 22:55:36 »
Код
public function getTable($type = 'TableMyshop', $prefix = 'Myshop', $config = array())
*

n_drey

  • Захожу иногда
  • 156
  • 3 / 1
  • Давай телевиденье!
Re: "PHP Fatal error: Call to a member function getKeyName()
« Ответ #4 : 04.12.2013, 23:03:38 »
Увы не помогло (
Принтанул объект $model в методе edit() \libraries\legacy\controller\form.php

Вот такое сообщение в дампе:
Код
[_messageQueue:protected] => Array
 (
     [0] => Array
      (
          [message] => Таблица TableMyshop не поддерживается. Файл не найден.
          [type] => warning
          )

)
*

n_drey

  • Захожу иногда
  • 156
  • 3 / 1
  • Давай телевиденье!
Re: "PHP Fatal error: Call to a member function getKeyName()
« Ответ #5 : 04.12.2013, 23:14:03 »
Для и нтереса заглянул ещё раз в модель articles.php там метод getgTable выглядит иначе (собственно оттуда и скопирован был)
Код
/**
* Returns a Table object, always creating it.
*
* @param   type      The table type to instantiate
* @param   string    A prefix for the table class name. Optional.
* @param   array     Configuration array for model. Optional.
*
* @return  JTable    A database object
*/
public function getTable($type = 'Content', $prefix = 'JTable', $config = array())
{
return JTable::getInstance($type, $prefix, $config);
}
*

SmokerMan

  • Гуру
  • 5290
  • 720 / 26
Re: "PHP Fatal error: Call to a member function getKeyName()
« Ответ #6 : 04.12.2013, 23:23:20 »
ну ошибся, уже бы сами догадались
Код
public function getTable($type = 'Myshop', $prefix = 'MyshopTable', $config = array())
файл таблицы должен называться myshop.php
*

n_drey

  • Захожу иногда
  • 156
  • 3 / 1
  • Давай телевиденье!
Re: "PHP Fatal error: Call to a member function getKeyName()
« Ответ #7 : 04.12.2013, 23:25:19 »
Я догадался канеш, но всё равно Хвала Вам )))  Большое спасибо сам бы не нашёл, не очень хорошо знаю структуру классов Joomla.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Ненавижу джумловский database!

Автор effrit

Ответов: 19
Просмотров: 1785
Последний ответ 14.10.2018, 21:28:40
от Aleks.Denezh
[решено] Использование model - setState для фильтра по дате

Автор effrit

Ответов: 8
Просмотров: 1779
Последний ответ 13.10.2018, 19:13:49
от effrit
[Решено] принудительно заполнить поле tags в плагине

Автор Sergeyy

Ответов: 5
Просмотров: 1734
Последний ответ 30.01.2017, 14:40:43
от Sergeyy
[Решено] Создание контент плагина

Автор IvanTopor

Ответов: 4
Просмотров: 1686
Последний ответ 26.02.2016, 13:10:37
от IvanTopor
[Решено] Как заполнить Тег <select> из базы?

Автор кодик

Ответов: 9
Просмотров: 1834
Последний ответ 03.12.2015, 20:42:46
от кодик