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

fedragon

  • Захожу иногда
  • 232
  • 22 / 0
  • You move like an insect
Как в 2.5 Joomla в коде проверить, на главной ли ты странице или нет?

Пробовал так
Цитировать
<?php
$menu = &JSite::getMenu();
if ($menu->getActive()!= $menu->getDefault()) {
?>
ТУТ ВЫПОЛНЯЕМЫЙ КОД
<?php } ?>

но код не лишен недостатков, срабатывает ложно бывает; хотелось бы какую-то точную проверку, чтоб знать - на главной ли я или нет.
« Последнее редактирование: 29.08.2013, 09:57:31 от b2z »
Your flesh is an insult to the perfection of the digital.
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
При определенных условиях (главная имя домена) работает такой код
Код
<? php if (JFactory::getURI()->toString() == JURI::base()) : ?>
<h1>Мы на главной</h1>
<?php endif; ?>
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Простой пример. VirtueMart в качестве главной. Нажимаешь на категорию( я так понимаю на ссылку не привязанную к меню) и ваша проверка не срабатывает. Она вообще, по принципу работает как в первом посте от fedragon . Я же предложил совсем иной принцип сверять JFactory::getURI()->toString() адрес текущей страницы с адресом сайта JURI::base()
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Цитировать
вам не кажется что вы бред написали?! перейдете в категорию то вы уже будете не на главной! (перешли в категорию ссылка стала mysite.ru/cat.html и она не равна mysite.ru) что то вы выдумываете!
нет не кажется. Прежде чем так заявлять, тестируйте. Ваше решение я протестировал. Автор темы не зря поднял этот вопрос. Ссылка, да имеет другое значение mysite.ru/cat.html, но проверка ваша говорит, что мы на главной странице. Мы же находимся на странице категории VirtueMart
Похожая тема

P.S. И это не решает проблему
Код
if ($menu->getActive()->id == $menu->getDefault()->id) {}
*

fedragon

  • Захожу иногда
  • 232
  • 22 / 0
  • You move like an insect
Poznakomlus, спасибо, всё работает в лучшем виде.
frisian, не стал проверять ваш код, потому что всё заработало и так, так что не могу сказать за его эффективность
Your flesh is an insult to the perfection of the digital.
*

Stake1988

  • Захожу иногда
  • 66
  • 0 / 0
При определенных условиях (главная имя домена) работает такой код
Код
<? php if (JFactory::getURI()->toString() == JURI::base()) : ?>
<h1>Мы на главной</h1>
<?php endif; ?>

Странно, почему-то при добавлении этого кода сайт падает (в данное условие заключается только один блок div), точнее в тэге <body> пусто. Может это быть связанно с тем что сайт располагается в домене .рф?
*

Stake1988

  • Захожу иногда
  • 66
  • 0 / 0
Поковырялся немного, заработал такой вариант:

Код
<?php $uri = &JFactory::getURI();
$url = $uri->toString(array('path', 'query', 'fragment'));
if ($url == "/") : ?>
<div >

</div>
<?php endif ?>
Кривовато конечно, но зато работает. Не проверял как оно будет работать в выше описанных вариантах с категориями VirtueMart и т.д.
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Код: php
if ( JRequest::getVar('view') == 'featured' ) {$start=1;};
//и далее используем условие как хотим. Например так:
if ($start){
   echo 'Превед! Йа на главной!';
};

*

angpyxa

  • Новичок
  • 1
  • 0 / 0
Привет! я попробовал ваши способы они что то не комильфо.. и написал свой
100% проверка

в шаблоне статьи например
templates/kino7/html/com_content/article/default.php

добавляем в любое место
$GLOBALS["myitem"] = $this->item->id; (айдишник статьи Привязанный к главному пункту меню)

templates/kino7/index.php (главный файл шаблона)

$myid = $GLOBALS["myitem"];

и где то в коде

<? if ($myid==24) :?>

тут все что на главной

 <? endif;?>
 к этому методу добавить ифку по поиску, но это уже производная..) задача решается просто

« Последнее редактирование: 31.03.2012, 17:26:55 от angpyxa »
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
angpyxa молодцом. Хороший велосипед. Работать с глобальными переменными при наличии фреймворка... Явно прописывать айдишники в разметке... В общем, я бы до такого не додумался.
Код: php
if ( JRequest::getVar('view') == 'featured' )
Всё, это самый универсальный, компактный и правильный способ проверки.
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Shustry, не у всех же на главной отображается featured, ты не подумал?

Давайте помыслим.

Как вобще определить на главной мы или нет?

Можно сравнивать пункты меню - активный, и домашний.
Но домашний пункт может быть активным, даже когда мы не на домашней странице.
Тот же пример выше с виртом, который приводил Poznakomlus
Значит, этот способ не для всех случаев подходит.

Можно сравнивать url главной страницы, и урл текущей.
Если игнорировать подстроку параметров урла (то что после ?) будут например проблемы с кривожопым виртом, который шлет все формы на index.php

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

Подводим итог:
Каждый "главная страница" понимает по-своему. Кто то - домашний пункт меню, кто-то site.ru/ , кто-то featured статьи Joomla и тд.

А значит нет универсального способа. В каждом случае надо выбирать под свои задачи.
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
danik.html, затупил, не то скопипастил. :( Вот оно, вот оно решение моей мечты: написано Poznakomlus, доработано мной:
Код: php
 if (JURI::current() == JURI::base()){}
Абсолютно универсально и компактно.
*

danik.html

  • Живу я здесь
  • 2650
  • 353 / 4
Универсально, но не абсолютно. читай пост выше. А так да, наверно в 90% подойдет )
Так что закину к себе в копилку, чтоб потом самому не велосипедить.
【Мегапак Virtuemart:
 • метатеги (description,keywords)
 • заголовки (title)
 • красивые алиасы (чпу) без тормозов и дублей!
*

genetics

  • Захожу иногда
  • 51
  • 5 / 0
  • «GeneticsPro»
 ^-^ Смотрите Joomla-документацию >> http://docs.joomla.org/How_to_determine_if_the_user_is_viewing_the_front_page
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
genetics, с этого (из документации по ссылке который) способа и начал тему ТС :)
*

dron

  • Завсегдатай
  • 1581
  • 16 / 10
Подскажите, пожалуйста, а как вывести модуль только на главной странице? я только что на 2.5. перешел... извиняюсь за ламерский вопрос
*

genetics

  • Захожу иногда
  • 51
  • 5 / 0
  • «GeneticsPro»
Менеджер модулей - Привязка к пунктам меню
*

dron

  • Завсегдатай
  • 1581
  • 16 / 10
Менеджер модулей - Привязка к пунктам меню
ненене... условие в шаблоне как-то прописывается... в предыдущих Joomlaх так было.
*

Dgikar

  • Захожу иногда
  • 192
  • 3 / 0
  • Я только учусь
http://joomlaforum.ru/index.php/topic,199690.msg1059654.html#msg1059654 - Ответ #8 - Проверено - все работает на ура!
*

ivan414

  • Новичок
  • 3
  • 0 / 0
Помогите. Перестали открываться ссылки. Открывается только главная страница. сайт http://foto-ivan.ru/
*

b2z

  • Глобальный модератор
  • 7287
  • 778 / 0
  • Разраблю понемногу
Помогите. Перестали открываться ссылки. Открывается только главная страница. сайт http://foto-ivan.ru/
И как это относиться к этой теме? Создайте отдельную!
*

swyatoslaw.ivanovich

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
что нужно для того, что бы выводить модули только на внутренних страницах?
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Поставить перед условием восклицательный знак. Например так:
Код: php
if (!((JURI::current() == JURI::base())||(JRequest::getVar('view') == 'featured')))
{};
*

swyatoslaw.ivanovich

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Поставить перед условием восклицательный знак. Например так:
Код: php
if (!((JURI::current() == JURI::base())||(JRequest::getVar('view') == 'featured')))
{};
Я чайник полный, так не получается=)) Мне кажется, что я совсем неправильно сделал=)) Код написал ниже, который вставлял в шаблон.
Код
<?php if (!((JURI::current() == JURI::base())||(JRequest::getVar('view') == 'featured')))
{}; ?> модуль на внутренних страницах <?php endif; ?>
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
что нужно для того, что бы выводить модули только на внутренних страницах?
Все страницы кроме главной
Код: php-brief
<?php if(JURI::current()!= JURI::base()){}?>
Все страницы кроме главной, привязанные к меню главной
Код: php-brief
<?php if(JURI::current()!= JURI::base() && JMenuSite::getInstance('site')->getActive()->home){}?>
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Тогда может так?
Код: php
<?php if(JURI::current()!== JURI::base()){}>
*

swyatoslaw.ivanovich

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Пробую, вставляю, выдает ошибку Parse error: syntax error, unexpected '>' in /home/sandro2584/3v1.biz/docs/stylage/templates/stylage/index.php on line 38, ребят, как именно нужно прописывать в шаблоне, так?:
Код
<?php if(JURI::current()!== JURI::base()){}>
проверка
<?php endif; ?>
*

swyatoslaw.ivanovich

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Спасибо огромное за помощь! yes!
*

swyatoslaw.ivanovich

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Рано я радовался=)) Если писать что нибудь или вставлять между, то выводит внутри, но если в таком виде:
Код
<?php if (JURI::current()!== JURI::base()) : ?>
<jdoc:include type="modules" name="topblock" style="xhtml" />
<?php endif; ?>
, то ничего не отображает, не выводит модули на позицию.
*

swyatoslaw.ivanovich

  • Осваиваюсь на форуме
  • 14
  • 0 / 0
Причем странно, что если пписать следующее:
Код
 <?php if (JURI::current() == JURI::base()) : ?>
<jdoc:include type="modules" name="позиция" style="xhtml" />
<?php endif; ?>
, то модули выводятся(только на главной)
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Руководство пользователя Joomla! 2.5 + 10 легких шагов к освоению Joomla! 3 (книги в pdf)

Автор Marques

Ответов: 69
Просмотров: 215410
Последний ответ 31.01.2025, 12:42:10
от brat_ii
Как редактировать отдельную страницу Joomla 2.5?

Автор mrporter

Ответов: 1
Просмотров: 7838
Последний ответ 17.12.2024, 00:13:11
от brat_ii
Почему в админке Joomla 2.58 - у меня 16 админов показывает?

Автор dyalex

Ответов: 8
Просмотров: 9141
Последний ответ 09.12.2024, 23:36:51
от brat_ii
Joomla 2.5.28, Safari под маком и сессии session

Автор beliyadm

Ответов: 19
Просмотров: 10393
Последний ответ 29.03.2023, 12:17:19
от Sawell
Joomla 2.5.28 как скачать все файлы через панель управления

Автор Sergei41984

Ответов: 7
Просмотров: 8232
Последний ответ 27.12.2022, 23:30:38
от Sergei41984