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

kaksdelat

  • Новичок
  • 8
  • 0 / 0
Здравствуйте каким образом можно убрать лишнию вложенность в компоненте например:
на сайте компонент видео галереи при открытии категории с видео ссылка выглядит так
http://prikolnyekartinki.com/s-effektami.html
При нажатии на видео ссылка выглядит так:
http://prikolnyekartinki.com/s-effektami/video/podborka-dtp-dekabr-2012-chast-1.html
По выше написанному мы видим что добавляется категория самого компонента video и вот вопрос как её убрать. Подскажите в каком месте рыть какая функция отвечает за вывод ссылки.
Вот сам компонент http://1000videourokov.ru/downloads/com_allvideoshare_1.2.4.zip
« Последнее редактирование: 29.01.2013, 10:12:02 от kaksdelat »
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
За пути на сайте отвечает router.php
*

kaksdelat

  • Новичок
  • 8
  • 0 / 0
За пути на сайте отвечает router.php
Там нет такого:
Код

/*
 * @version $Id: router.php 1.2.4 2012-10-30 $
 * @package Joomla
 * @copyright   Copyright (C) 2012-2013 MrVinoth
 * @license     GNU/GPL http://www.gnu.org/licenses/gpl-2.0.html
*/

// no direct access
defined('_JEXEC') or die('Restricted access');

function AllVideoShareBuildRoute( &$query ) {
$segments = array();
  
    if(isset($query['view'])) {
     $segments[] = $query['view'];
        unset( $query['view'] );
    }

if(isset($query['orderby'])) {
if($query['orderby'] != 'default') {
$segments[] = $query['orderby'];
}
     unset( $query['orderby'] );
}

    if(isset($query['slg'])) {
     $segments[] = $query['slg'];
        unset( $query['slg'] );
    }

    return $segments;
}

function AllVideoShareParseRoute( $segments ) {
$vars  = array();
$order = array('default', 'latest', 'popular', 'random', 'featured');
$count = count( $segments );

if( $count >= 1 && $segments[0] ) {
     $vars['view'] = $segments[0];
    }

if( $count == 2 ) {
if( in_array($segments[1], $order) ) {
$vars['orderby'] = $segments[1];
} else {
$vars['slg'] = $segments[1];
}
} else if($count == 3) {
$vars['orderby'] = $segments[1];
$vars['slg'] = $segments[2];    
}

    return $vars;
}

?>
Это файл router.php из компонента!
« Последнее редактирование: 30.01.2013, 06:19:48 от kaksdelat »
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Ну вот этот блок скорее всего и добавляет это

Код
    if(isset($query['view'])) {
     $segments[] = $query['view'];
        unset( $query['view'] );
    }
*

kaksdelat

  • Новичок
  • 8
  • 0 / 0
Ну вот этот блок скорее всего и добавляет это

Код
    if(isset($query['view'])) {
    $segments[] = $query['view'];
        unset( $query['view'] );
    }
И какое по вашему правило нужно изменить?
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Есть куча вариантов например в коде закоментировать строчку
Код
    if(isset($query['view'])) {
    //$segments[] = $query['view'];
        unset( $query['view'] );
    }
тогда твои ссылки будут выглядеть так
http://prikolnyekartinki.com/s-effektami/podborka-dtp-dekabr-2012-chast-1.html?view=video
Причем функцию тоже надо будет подправить.

Основная проблема что компонент не понимает что от него хотят категорию или конкретное видео поэтому добавляет этот эллемент. По умолчанию если он не указан то он считает что это категория. Это я вроде выяснил из файла allvideosshare.php
Код
// Require the base controller
if(JRequest::getCmd('view') == '') {
JRequest::setVar('view', 'categories');
} else if(JRequest::getCmd('view') == 'category' && !JRequest::getCmd('slg')){
JRequest::setVar('view', 'categories');
} else if(JRequest::getCmd('view') == 'video' && !JRequest::getCmd('slg')){
JRequest::setVar('view', 'videos');
}

Научи его понимать когда идет категория когда видео и все.
Как вариант префикс к сегменту например

http://prikolnyekartinki.com/s-effektami/vid-podborka-dtp-dekabr-2012-chast-1.html
http://prikolnyekartinki.com/s-effektami/cat-podborka-dtp-dekabr-2012-chast-1.html
*

guloc55

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Есть куча вариантов например в коде закоментировать строчку
Код
    if(isset($query['view'])) {
    //$segments[] = $query['view'];
        unset( $query['view'] );
    }
тогда твои ссылки будут выглядеть так
http://prikolnyekartinki.com/s-effektami/podborka-dtp-dekabr-2012-chast-1.html?view=video
Причем функцию тоже надо будет подправить.

Основная проблема что компонент не понимает что от него хотят категорию или конкретное видео поэтому добавляет этот эллемент. По умолчанию если он не указан то он считает что это категория. Это я вроде выяснил из файла allvideosshare.php
Код
// Require the base controller
if(JRequest::getCmd('view') == '') {
JRequest::setVar('view', 'categories');
} else if(JRequest::getCmd('view') == 'category' && !JRequest::getCmd('slg')){
JRequest::setVar('view', 'categories');
} else if(JRequest::getCmd('view') == 'video' && !JRequest::getCmd('slg')){
JRequest::setVar('view', 'videos');
}

Научи его понимать когда идет категория когда видео и все.
Как вариант префикс к сегменту например

http://prikolnyekartinki.com/s-effektami/vid-podborka-dtp-dekabr-2012-chast-1.html
http://prikolnyekartinki.com/s-effektami/cat-podborka-dtp-dekabr-2012-chast-1.html

Да всё правильно ссылка video исчезает но вылазит что в файле allvideosshare.php ошибка на 29 строке вот срока
Код
require_once JPATH_COMPONENT.DS.'controllers'.DS.$controller.'.php';
Или я что то не так делаю помогите пожалуйста!
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
В router.php исправить функцию парсера
Вместо
Код
	if( $count >= 1 && $segments[0] ) {
    $vars['view'] = $segments[0];
    }

Писать
Код
	if( $count >= 1 && $segments[0] ) {
    $vars['view'] = 'video';
    }
*

guloc55

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
В router.php исправить функцию парсера
Вместо
Код
	if( $count >= 1 && $segments[0] ) {
    $vars['view'] = $segments[0];
    }

Писать
Код
	if( $count >= 1 && $segments[0] ) {
    $vars['view'] = 'video';
    }
Не помогает! Ошибка исчезла ссылка video тоже но само видео не включается страница просто перезагружается и всё.
*

prometheus

  • Захожу иногда
  • 84
  • 7 / 0
Самое главное ты смысл понял нужно исправить функцию function AllVideoShareBuildRoute( &$query )
но также обязательно подправить и функцию function AllVideoShareParseRoute( $segments )
и все получится.
*

guloc55

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Самое главное ты смысл понял нужно исправить функцию function AllVideoShareBuildRoute( &$query )
но также обязательно подправить и функцию function AllVideoShareParseRoute( $segments )
и все получится.
Всё перепробовал видео всё не работает добился только вот такой ссылки
http://prikolnyekartinki.com/s-effektami.html?view=video&slg=uralskie-pelmeni-shou-kvn-shagom-farsh&orderby=default
заменив
Код
function AllVideoShareBuildRoute( &$query )
на
Код
function AllVideoShareBuildRoute( &$video )
Неужели больше ни чего не сделать?
*

z3l

  • Захожу иногда
  • 84
  • 5 / 0
Здравствуйте, решение так никто и не придумал?
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Не сохраняются HTML тэги в самописном компоненте

Автор evgen777

Ответов: 5
Просмотров: 1273
Последний ответ 04.03.2014, 15:40:47
от evgen777
Invlid token на разрабатываемом компоненте

Автор designcenter

Ответов: 1
Просмотров: 1291
Последний ответ 06.01.2014, 02:07:26
от Aleks.Denezh
[Решено] Удаление ID из материалов в своём компоненте

Автор n_drey

Ответов: 9
Просмотров: 1463
Последний ответ 25.12.2013, 16:46:54
от n_drey
Кнопка "Я ИДУ" в компоненте EventList

Автор kichik

Ответов: 5
Просмотров: 2558
Последний ответ 30.05.2013, 12:53:24
от dagolovach
Дерево категорий в компоненте

Автор slav

Ответов: 7
Просмотров: 2612
Последний ответ 15.05.2013, 23:20:59
от slav