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

kolio

  • Захожу иногда
  • 91
  • 11 / 4
сделал 404 страницу как описано в  http://joomlaforum.ru/index.php/topic,219664.new.html, на сайте SEF отключили
при вводе вместо
http://________/index.php?option=com_content&view=article&id=5419&catid=59&Itemid=15
явно ошибочную страницу
http://________/index.php?option=com_conte5nt&view=article&id=5419&catid=59&Itemid=15

выдает страницу ошибки, и 404й код
то есть всё ОКЕЙ

НО! если ввести
например типа http://_________/sdfsdfsdf/sdfsdfsdf.html
выдает главную страницу сайта, и код 200

может кто знает, это настройки сайта? или hatcess? или еще чего-то?

ну или может кто подскажет как доделать htacess так чтобы - если в URL есть ".html", то, чтобы он или выдавал браузеру код 404
*

voland

  • Легенда
  • 11026
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
Re: Не срабатывает страница 404
« Ответ #1 : 01.04.2014, 15:52:22 »
А если временно включить SEF и переименовать htaccess.txt -> .htaccess - это решает проблему?
*

kolio

  • Захожу иногда
  • 91
  • 11 / 4
Re: Не срабатывает страница 404
« Ответ #2 : 01.04.2014, 16:08:07 »
.htaccess такой и есть. (.txt почти нигде не юзается на серваках)
---------------------------
включил SEF + плагин SEF - перебросило на 404 созданную страницу
но при этом и SEF ссылки  стали - что мне не нужно

то есть Joomla как то определила, что это не SEF ссылка
*

kolio

  • Захожу иногда
  • 91
  • 11 / 4
Re: Не срабатывает страница 404
« Ответ #3 : 02.04.2014, 10:15:10 »
скорее всего придется смотреть код, как SEF плагин определяет, что ссылка неверная, после чего дергает файл error.php в шаблоне
и эту часть кода переместить в какой то из плагинов,

или доработать плагин SEF, чтобы он был полурабочем состоянии, типа- служил чисто для определения бракованной ссылки и перевода на 404 и всё
*

kolio

  • Захожу иногда
  • 91
  • 11 / 4
Re: Не срабатывает страница 404
« Ответ #4 : 02.04.2014, 11:23:43 »
всё оказалось гораздо проще
отключил плагин SEF, но включил настройку SEF в параметрах сайта
и сделал кастом страницу 404 с кодом ответа 404

всё равно SEF ссылки генерсятся. хрень какая-то
получается сам движок Joomla отрабатывает корректность URL

нужно только найти где он делает проверку на то, что SEF URL битый и перекидывает на error.php
« Последнее редактирование: 02.04.2014, 14:08:12 от kolio »
*

kolio

  • Захожу иногда
  • 91
  • 11 / 4
Re: Не срабатывает страница 404
« Ответ #5 : 02.04.2014, 14:46:08 »
бред какой то
при включенной параметре SEF и дергании левой ссылки - имя компонента пустой! согласен
а при выключенном SEF - com_content. я так понимаю он ставит по дефолту, так как default menu ссылается на "com_content - Главная страница"

а это в свою очередь делает функция
Код
$option = JRequest::getCmd('option');
в index.php

а getCmd даргает в свою очередь getVar
где уже и происходит присвоение com_content

по сути нужно сделать проверку, что если идет запрос getvar('option') и оно решило в конце, что это com_content, но URI нет фразы com_content, и URI не равно '/'
 и тип запроса = GET, то в этом случае случае просто делать пустой ответ
*

kolio

  • Захожу иногда
  • 91
  • 11 / 4
Re: Не срабатывает страница 404
« Ответ #6 : 02.04.2014, 15:27:58 »
в итоге я забрел в дебри.
аж вот сюда
Код
includes/router.php

и тут есть заМУчательная функция
Код
function _parseRawRoute(&$uri)

и там я просто добавил проверку на то, что путь не является корневым
Код
//Handle an empty URL (special case)
if(!$uri->getVar('Itemid') && !$uri->getVar('option') && !$uri->_path)
{
$item = $menu->getDefault();
if(!is_object($item)) return $vars; // No default item set

//Set the information in the request
$vars = $item->query;

//Get the itemid
$vars['Itemid'] = $item->id;

// Set the active menu item
$menu->setActive($vars['Itemid']);

return $vars;
}

и если набирать в браузере URL который яво бредовый, то перекидывает на error.php , который в корне шаблона
и там уже:

Код
<?php
// no direct access
defined( '_JEXEC' ) or die( 'Restricted access' );

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $this->language; ?>" lang="<?php echo $this->language; ?>" dir="<?php echo $this->direction; ?>">
<head>
</head>
<body>
<?php
if (($this->error->code) == '404') {
header("HTTP/1.0 404 Not Found"); /*добавлено после учёта комментариев - отправляет код ошибки для поисковика*/
echo file_get_contents('http://САЙТ/index.php?option=com_content&view=article&id=66'); /*открывает страницу ошибок для пользователя*/
exit;
}
?>
</body>
</html>

Спасибо voland за наводку, и мне за поиск проблемы :)
« Последнее редактирование: 02.04.2014, 19:33:38 от kolio »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

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

Автор vitaliywolf

Ответов: 20
Просмотров: 18155
Последний ответ 07.05.2020, 22:24:16
от sivers
Как сделать, чтобы внутренняя страница не показывалась в качестве главной?

Автор kpripper

Ответов: 21
Просмотров: 2463
Последний ответ 19.03.2016, 16:51:11
от flyingspook
Не отображаются страница материалов

Автор MOZ

Ответов: 8
Просмотров: 1756
Последний ответ 28.02.2016, 19:50:37
от effrit
Одна страница доступна по разным адресам

Автор sinplus

Ответов: 4
Просмотров: 1682
Последний ответ 17.02.2015, 10:49:25
от sinplus
[Инфо] Собственная страница - Ошибка 404. Ответ

Автор css_ufa

Ответов: 12
Просмотров: 3731
Последний ответ 01.04.2014, 11:44:12
от kolio