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

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Настроил правильную отдачу кода ошибки страницы 404, по способу описанному здесь:
http://joomlaforum.ru/index.php/topic,219602.msg1151167.html#msg1151167

При проверке Ответа сервера в яндекc.вебмастере код 404 отдаётся только при первом обращении к странице 404. При повторном обращении к этой странице отдаётся код 200.
При сбросе кеша в админке ситуация исправляется, но опять 400 отдаётся только один раз. Что делать?
« Последнее редактирование: 22.01.2013, 14:22:02 от rdk »
*

ELLE

  • Глобальный модератор
  • 4506
  • 893 / 0
а с чего она должна 404 постоянно отдавать, если это обычная страница - материал (или что там у вас)?
Efanych в данном случае - неправильно написал

« Последнее редактирование: 22.01.2013, 14:26:59 от ELLE »
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
а с чего она должна 404 постоянно отдавать, если это обычная страница - материал (или что там у вас)?
Efanych в данном случае - неправильно написал

Это страница с описанием ошибки 404, созданная как материал.
Почему тогда один раз код 404 всётаки отдаётся, после отчистки кеша? Может нужно как то запретить кеширование данной страницы?

Если это вариант реализации отдачи неверный, какай тогда лучше использовать?
*

ELLE

  • Глобальный модератор
  • 4506
  • 893 / 0
Вы мне можете объяснить просто логически - почему эта страница должна отдавать код ответа 404, если она реально существует?

В моем понимании код ответа 404 должен быть отдан в случае, если документ не найдет по какому-либо адресу.

Что у вас отдает в случае site.ru/abrakadabra ?
*

Efanych

  • Глобальный модератор
  • 4683
  • 644 / 0
  • Меняю свою жизнь на 360°!
Цитировать
Вы мне можете объяснить просто логически - почему эта страница должна отдавать код ответа 404, если она реально существует?
Я могу.
Цитировать
<?php
$sv = $_SERVER['REQUEST_URI'];
if ($sv == '/урл_страницы_ошибки') {
header("HTTP/1.0 404 Not Found");
} ?>
Если нужный нам URL - отдавать ответ 404
Создание сайтов, шаблонов, помощь в решении проблем.
*

ELLE

  • Глобальный модератор
  • 4506
  • 893 / 0
Efanych, я с кодом согласна. Яне согласна с тем, чтобы таким образом отдавать контентную страницу на ответ 404

Код
header("HTTP/1.1 301 Moved Permanently");
  header('Location: ' . $this->baseurl . '/vnesti-pozhelaniya/avtorizaciya/404.html');

мы делаем 301 редирект на ошибку 404 - это как?
*

Efanych

  • Глобальный модератор
  • 4683
  • 644 / 0
  • Меняю свою жизнь на 360°!
Ну, насчёт способа согласен. error.php использовать логичнее
Создание сайтов, шаблонов, помощь в решении проблем.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: php-brief
<?php
defined('JPATH_BASE') or die();
if ($_SERVER['REQUEST_URI'] == '/урл_страницы_ошибки')
{
header("HTTP/1.0 404 Not Found");
header("HTTP/1.1 404 Not Found");
header("Status: 404 Not Found");
}
?>
Чуточку добавил  ^-^
Не могу понять зачем редирект делать
404 это статическая страница. Что проблема в файл вставить HTML код в файл
Ну наконец так можно
echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id=1');
*

ELLE

  • Глобальный модератор
  • 4506
  • 893 / 0
В общем обсудили что так неправильно. И снова толкаем ТС на те же грабли.

Я хочу сказать, что правильно, - это когда набрали любую /abrakadabry и по этому адресу получили 404, а не что-то иное.

Файл error.php и есть тот статичный материал (его шаблон), который будет показан при возникновении 404ой, его можно отверстать, добавить инфу и т.д. - оформить как пожелаете.

Как выше уже отметил Poznakomlus, можно не заморачиваться с оформление, а подтянуть контент с другой страницы.
Для этого в файл error.php можно добавить такой код

Код: php
<?php
if ($this->error->getCode() == '404') {
echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id=1');
}
?>
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Суть в том чтобы подцеплять красиво оформленную, под стиль шаблона страницу 404, дабы не терять посетителй сайта.  И при этом чтобы роботы яндекса и Google получали ответ сервера 404, а не 200, по неверным ссылкам.

Заменил содержимое файла error.php на:
 
Код
<?php
if ($this->error->getCode() == '404') {
echo file_get_contents(JURI::root().'index.php?option=com_content&view=article&id=46');
}
?>

Теперь на /abrakadabru ответ сервера верный - 404. Но при запросе /abrakadabra из броузера получаем "Ошибка. Ссылка не работает". Может есть ещё какойнибудь способ "подцепить" содержание другой страницы? Или в error.php нужно ещё что то прописать?
*

ELLE

  • Глобальный модератор
  • 4506
  • 893 / 0
а если со слэшем, так -
echo file_get_contents(JURI::root().'/index.php?option=com_content&view=article&id=46');
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
а если со слэшем, так -
echo file_get_contents(JURI::root().'/index.php?option=com_content&view=article&id=46');

тоже не работает, уже попробывал.
« Последнее редактирование: 22.01.2013, 18:46:55 от rdk »
*

Efanych

  • Глобальный модератор
  • 4683
  • 644 / 0
  • Меняю свою жизнь на 360°!
Не все компоненты в случае ошибки на error.php отправляют. Или URL не тот. Вместо index.php?option=com_content&view=article&id=46 вам нужно писать URL материала, который у вас под 404 ошибку косит.
Создание сайтов, шаблонов, помощь в решении проблем.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
тоже не работает, уже попробывал.
А если напишите так
Код: php-brief
<?php echo 'Здесь я ';?>
Не туда вставили значит
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Не все компоненты в случае ошибки на error.php отправляют. Или URL не тот. Вместо index.php?option=com_content&view=article&id=46 вам нужно писать URL материала, который у вас под 404 ошибку косит.

 index.php?option=com_content&view=article&id=46 этот материал и косит под 404 ошибку.
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
А если напишите так
Код: php-brief
<?php echo 'Здесь я ';?>
Не туда вставили значит

вместо 'я здесь' белый экран. А куда там в error.php можно ещё то вставить, файлик то на 2 строки:
Сейчас он выглядт так:
 
Код
<?php
if ($this->error->getCode() == '404') {
<?php echo 'Здесь я ';?>
}
?>
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
файлик то на 2 строки:
Скопируйте из шаблона system тогда
Так неправильно
Цитировать
<?php
if ($this->error->getCode() == '404') {
   <?php echo 'Здесь я ';?>
}
?>
Весь код Неправильный и синтаксис
по синтаксису <?php
if ($this->error->getCode() == '404') {
echo 'Здесь я ';
}
?>
Скопируйте из шаблона system error.php
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
а если со слэшем, так -
echo file_get_contents(JURI::root().'/index.php?option=com_content&view=article&id=46');

Разобрался, почему не работала эта функция. На хостинге в настройках PHP был выключен параметр allow_url_fopen (Работать с URL как с файлами), после включения всё заработало. Всем спасибо!   
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
Разобрался, почему не работала эта функция. На хостинге в настройках PHP был выключен параметр allow_url_fopen (Работать с URL как с файлами), после включения всё заработало. Всем спасибо!   

После включения allow_url_fopen в параметрах PHP на хостинге, перестала работать админка сайта, т.е. захожу туда, первая страница админки открывается и висит, менюшки не активны. Если при этом убрать  из error.php
echo file_get_contents(JURI::root().'/index.php?option=com_content&view=article&id=46');
админка работает нормально. Кэш чистил. В чём может быть дело?
*

rdk

  • Осваиваюсь на форуме
  • 32
  • 0 / 0
После включения allow_url_fopen в параметрах PHP на хостинге, перестала работать админка сайта, т.е. захожу туда, первая страница админки открывается и висит, менюшки не активны. Если при этом убрать  из error.php
echo file_get_contents(JURI::root().'/index.php?option=com_content&view=article&id=46');
админка работает нормально. Кэш чистил. В чём может быть дело?

Проблема была в компоненте экспорта/импорта CSV Implroved - решилось переустановкой компонента.

А подгрузку контента страницы 404 решил не через file_get_contents, а через cURL. Вроде как использование cURL безопаснее, но не уверен. 
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

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

Автор vitaliywolf

Ответов: 20
Просмотров: 18148
Последний ответ 07.05.2020, 22:24:16
от sivers
Для чего нужны пустые index.html в каждой папке?

Автор webusver

Ответов: 13
Просмотров: 11350
Последний ответ 12.11.2016, 18:23:42
от ProtectYourSite
Как сделать, чтобы внутренняя страница не показывалась в качестве главной?

Автор kpripper

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

Автор MOZ

Ответов: 8
Просмотров: 1754
Последний ответ 28.02.2016, 19:50:37
от effrit
Joomla 1.5.26 карта-сайта не отдает Content-Encoding: gzip

Автор lotosss

Ответов: 1
Просмотров: 1173
Последний ответ 09.07.2015, 15:30:06
от lotosss