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

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
Здравствуйте!

Буду очень благодарен за советы как реализовать, чтобы страница не могла ссылаться сама на себя ни в меню, ни в логотипе на главной странице

Заранее спасибо добрым людям! ;) Joomla 1.5
« Последнее редактирование: 15.11.2012, 21:05:10 от safronoff343 »
*

hooten

  • Захожу иногда
  • 443
  • 26 / 0
Цитировать
как реализовать, чтобы страница не могла ссылаться сама на себя
а почему она ссылается сама на себя?
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
а почему она ссылается сама на себя?

В смысле почему? Из меню...
Я и спрашиваю как сделать чтобы выбранный пункт меню становился не активным(не ссылкой) и чтобы логотип не был ссылкой только на главной?
« Последнее редактирование: 15.11.2012, 19:15:59 от safronoff343 »
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
В mod_exmenu-j15 это можно настроить?
*

voland

  • Легенда
  • 11026
  • 588 / 112
  • Эта строка съедает место на вашем мониторе
В mod_exmenu-j15 это можно настроить?
В стандартном и так не ссылается.
Вот зачем ставить непонятную хрень и искать ошибки?
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
В стандартном и так не ссылается.

для интереса поставил стандарт...тоже самое.
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
С лого решил проблему так

<?php $sv = $_SERVER['REQUEST_URI']; if ($sv == '/') { ?>
<img src="Лого" />(на главной)
<?php } else { ?>
<a href="/"><img src="Лого" /></a>(на внутренних)
<?php } ?>

Осталось меню :(
« Последнее редактирование: 15.11.2012, 20:13:39 от safronoff343 »
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
Разве никто не сталкивался?
Если выбран пункт меню, то он не должен быть ссылкой.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
файл default_component.php
сделай так
Код: php-brief
switch ($item->browserNav) :
default:
case 0:
if (in_array($item->id, $path)){
echo '<span '.$class.'>'.$linktype.'</span>';
}else {
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
}
break;
case 1:
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
файл default_component.php
сделай так
Код: php-brief
switch ($item->browserNav) :
default:
case 0:
if (in_array($item->id, $path)){
echo '<span '.$class.'>'.$linktype.'</span>';
}else {
?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
}
break;
case 1:

Скажите, а где этот файл?
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
Нашел только helper.php....Но не работает...

Код
switch ($tmp->browserNav) 
{
default:
                       case 0:
                              if (in_array($item->id, $path)){
                      echo '<span '.$class.'>'.$linktype.'</span>';
                              }else {
                                       ?><a <?php echo $class; ?>href="<?php echo $item->flink; ?>" <?php echo $title; ?>><?php echo $linktype; ?></a><?php
                                       }
                      break;
                       case 1:
// _blank
$data = '<a href="'.$tmp->url.'" target="_blank">'.$image.$tmp->name.'</a>';
break;
case 2:
// window.open
$attribs = 'toolbar=no,location=no,status=no,menubar=no,scrollbars=yes,resizable=yes,'.$this->_params->get('window_open');

// hrm...this is a bit dickey
$link = str_replace('index.php', 'index2.php', $tmp->url);
$data = '<a href="'.$link.'" onclick="window.open(this.href,\'targetWindow\',\''.$attribs.'\');return false;">'.$image.$tmp->name.'</a>';
break;

Не?
« Последнее редактирование: 15.11.2012, 22:57:14 от safronoff343 »
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
да перепутал версию написал для 2,5 Это для Joomla 1.5
Код: php-brief
			switch ($tmp->browserNav)
{
default:
case 0:
// _top
                                        if($active){
                                        $data = '<span>'.$image.$tmp->name.'</span>'
                                         } else {
$data = '<a href="'.$tmp->url.'">'.$image.$tmp->name.'</a>';
                                         }
break;
case 1:
// _blank
$data = '<a href="'.$tmp->url.'" target="_blank">'.$image.$tmp->name.'</a>';
break;
case 2:
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
да перепутал версию написал для 2,5 Это для Joomla 1.5
Код: php-brief
			switch ($tmp->browserNav)
{
default:
case 0:
// _top
                                        if($active){
                                        $data = '<span>'.$image.$tmp->name.'</span>'
                                         } else {
$data = '<a href="'.$tmp->url.'">'.$image.$tmp->name.'</a>';
                                         }
break;
case 1:
// _blank
$data = '<a href="'.$tmp->url.'" target="_blank">'.$image.$tmp->name.'</a>';
break;
case 2:

Ошибка 500!
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
а попробу заменить if($active){ на
if(JSite::getMenu()->getActive()->id){

Неа..все ровно...
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
Решил проблему так:
в legacy.php
Код
default : // formerly case 2
// open in parent window
if($id != '') $mitem->url = 'javascript: return false;';
$txt = '<a href="' . $mitem->url . '" class="' . $menuclass . '" '
. $id . '>' . $mitem->name . '</a>';
break;
}

Но теперь при наведении курсора вот "javascript: return false;"
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
файл legasy.php
Код: php-brief
	default : // formerly case 2
// open in parent window
if ($current_itemid == $mitem->id) {
$txt = '<span>' . $mitem->name . '</span>';
} else {
$txt = '<a href="' . $mitem->url . '" class="' . $menuclass . '" ' . $id . '>' . $mitem->name . '</a>';
}
break;
}
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
Poznakomlus, спасибо!+

Все робит))

Еще вопрос. Пункт меню теперь неактивен во всей категории. Возможно ли так, чтобы меню было неактивно только по привязанному URL? Например - сайт.ру/квартры - неактивный пункт, сайт.ру/квартиры/однокомнатные/ - активный.
« Последнее редактирование: 19.12.2012, 20:03:27 от safronoff343 »
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: php-brief
default : // formerly case 2
// open in parent window
$this_url = JFactory::getURI()->toString(); //адрес текущей
if ($current_itemid == $mitem->id && $this_url!="сайт.ру/квартиры/однокомнатные") {
$txt = '<span>' . $mitem->name . '</span>';
} else {
$txt = '<a href="' . $mitem->url . '" class="' . $menuclass . '" ' . $id . '>' . $mitem->name . '</a>';
}
break;
}
*

safronoff343

  • Захожу иногда
  • 117
  • 0 / 3
Код: php-brief
default : // formerly case 2
// open in parent window
$this_url = JFactory::getURI()->toString(); //адрес текущей
if ($current_itemid == $mitem->id && $this_url!="сайт.ру/квартиры/однокомнатные") {
$txt = '<span>' . $mitem->name . '</span>';
} else {
$txt = '<a href="' . $mitem->url . '" class="' . $menuclass . '" ' . $id . '>' . $mitem->name . '</a>';
}
break;
}


Fedor Vlasenko Все таки я Неправильно выразился.

Сейчас стоит этот код
Код
default : // formerly case 2
// open in parent window
if ($current_itemid == $mitem->id) {
$txt = '<span>' . $mitem->name . '</span>';
} else {
$txt = '<a href="' . $mitem->url . '" class="' . $menuclass . '" ' . $id . '>' . $mitem->name . '</a>';
}
break;
}

но пункт не активен во всей категории по пункту меню. Т.е. , например, я перешел по меню "АВТОМОБИЛИ" сайт.ру/avto - все ок и "АВТОМОБИЛИ" не ссылка, перехожу далее сайт.ру/avto/vaz.html - и пункт "АВТОМОБИЛИ" тоже не ссылка. Как сделать чтобы из сайт.ру/avto/vaz.html пункт становился ссылкой?
*

Antig

  • Осваиваюсь на форуме
  • 44
  • 0 / 0
Уважаемый Fedor Vlasenko, подскажите пожалуйста, перепробовал все варианты в данной теме, в пером ошибка, во втором - ничего не происходит.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Antig создайте отдельную тему.
Четко опишите вашу проблему. Версию, что делаете, что хотите получить
Незачем поднимать темы 3-х годичной давности
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться