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

Allisa999

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Всем привет. С новым Годом!)

Вопрос:
На сайте есть материал №1 "Автор Иванов", категория "Авторы" и материал №2 "Книга Иванова", категория "Книги".
В материале №2 созданы доп.поля штатными средствами Joomla: ISBN и год.
Нужно вывести в материале №1 в отдельное поле материал №2.

Пробовала два плагина "Include Content" и "Articles Anywhere".
Если в меню делать прямую ссылку на материал №2, то поля отображаются.
Если сделать ссылку на материал №1, который должен включать материал №2, то поля не видны.

Как решить?
*

AlekVolsk

  • Гуру
  • 6913
  • 416 / 4
У вас оч.специфичная задача, вам проще переопределить вывод материала под место, создать для него доп.поле с сылкой на второй материал (указать id к примеру, это легко делается полем типа sql), и уже в перопределённом макете цеплять поля из привязанного материала
*

Allisa999

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Так id  материалов все время разные будут. У разных авторов разные книги.
Вся проблема только в полях. Я их задумала для облегчения ввода. Если писать ручками HTML без полей, то все отлично работает.
Если добавляю в материал №2 поля - они не отображаются.

Для плагина "Include Content" нашла совет добавить
$output = JHTML::_('content.prepare', $output);  перед return $output;
но тоже не помогло.
*

Allisa999

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
AlekVolsk, спасибо за идею, я сначала не поняла, сорри)
Сейчас пытаюсь решить задачу двумя способами:
ПЕРВЫЙ (Ваш)

1. Создала поле sql "Выбор книги"
2. Прописала
Код
SELECT id as value, title as text  FROM `#_content` WHERE `catid`=9
3. Выбрала "Мультивыбор"
В статье появилось поле для выбора, где можно выбрать книги из нужной мне категории.
В тело статьи вставила {field 6} (номер поля). Но выводит только текст (заголовок статьи), а мне нужно всю статью. Как решить?

ВТОРОЙ

Посмотрела базу в phpMyAdmin, посмотрела плагин "Include Content".
Поля лежат в отдельной таблице _fields_values, где есть три поля: field_id, item_id, value.
Запрос в плагине делается только к таблице _content.
Попробовала потренироваться в phpMyAdmin, исправила запрос:

Код
SELECT catid, title, introtext,`fulltext`, state, b.item_id, b.field_id, b.value
FROM #_content
RIGHT JOIN #_fields_values AS b ON id=b.item_id
WHERE id=30
(id=30 просто для примера)

Получилась таблица с полями. Все ОК.
Вставила этот код в плагин, а все равно не работает, поля не выводятся.
Хелп.
*

fsv

  • Живу я здесь
  • 2781
  • 411 / 2
"первый" вариант:  тип поля sql, запрос что-то вроде
Код
SELECT `c`.`id` as `value`,   
CONCAT_WS(", ", `c`.`title`,
  CONCAT_WS(": ", "ISBN",
    ( SELECT `fv`.`value` FROM `#__fields_values` as `fv`
      LEFT JOIN `#__fields` as `f` ON `f`.`id`=`fv`.`field_id`
      WHERE `fv`.`item_id` = `c`.`id`
      AND `f`.`name`='isbn'
    )
  ),
  CONCAT_WS(": ", "год",
    ( SELECT `fv`.`value` FROM `#__fields_values` as `fv`
      LEFT JOIN `#__fields` as `f` ON `f`.`id`=`fv`.`field_id`
      WHERE `fv`.`item_id` = `c`.`id`
      AND `f`.`name`='year'
    )
  )
) as `text`
FROM `#__content` as `c` 
WHERE `c`.`catid`='17'
Админка - https://clip2net.com/s/3Z0FeQl
Фронт - https://clip2net.com/s/3Z0Fhyh
Кривенько на фронте, с форматированием поиграйтесь в запросе. Да и сам запрос, если заморочиться, наверняка можно оптимизировать, на коленке собрал.

Контентный плагин свой лучше под это написать, любое форматирование, расширяемость. Вы же в теме, раз в PMA запросы джойните. Пробуйте, это не сложно. Изучите дефолтные, создайте тему "мой первый (?) плагин", и вам помогут (именно помогут, код за вас писать не станут).
« Последнее редактирование: 08.01.2019, 20:52:12 от fsv »
Веб-разработка: заказ. Только новая разработка.
*

ProtectYourSite

  • Живу я здесь
  • 2366
  • 138 / 4
  • Безопасность вебсайтов
А почему авторов вообще не сделать категориями ?
*

kit2m2

  • Живу я здесь
  • 3362
  • 276 / 0
  • Беру сайты на полное сопровождение
Может у Вас в настройках полей не выбрана категория "Авторы", поэтому не отображаются поля?
Расширения для JoomShopping | Ссылка на Телеграм-канал | Сайты и магазины под ключ: Дизайн, Верстка, Программирование (расширения на заказ), СЕО-оптимизация, Сопровождение, Перенос на Joomla 4+ (5+) и JoomShopping 5+
*

Allisa999

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Может у Вас в настройках полей не выбрана категория "Авторы", поэтому не отображаются поля?

Попробовала добавить к полю категорию "Авторы".
Не отображаются.
*

Allisa999

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
А почему авторов вообще не сделать категориями ?

Как сделать ссылку в меню на категорию? Через обертку?
Никогда не делала. Какой путь ссылки на категорию?
*

Allisa999

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
"первый" вариант:  тип поля sql, запрос что-то вроде
Код
SELECT `c`.`id` as `value`,   
CONCAT_WS(", ", `c`.`title`,
  CONCAT_WS(": ", "ISBN",
    ( SELECT `fv`.`value` FROM `#__fields_values` as `fv`
      LEFT JOIN `eifsc_fields` as `f` ON `f`.`id`=`fv`.`field_id`
      WHERE `fv`.`item_id` = `c`.`id`
      AND `f`.`name`='isbn'
    )
  ),
  CONCAT_WS(": ", "год",
    ( SELECT `fv`.`value` FROM `#__fields_values` as `fv`
      LEFT JOIN `eifsc_fields` as `f` ON `f`.`id`=`fv`.`field_id`
      WHERE `fv`.`item_id` = `c`.`id`
      AND `f`.`name`='year'
    )
  )
) as `text`
FROM `#__content` as `c` 
WHERE `c`.`catid`='17'
Админка - https://clip2net.com/s/3Z0FeQl
Фронт - https://clip2net.com/s/3Z0Fhyh
Кривенько на фронте, с форматированием поиграйтесь в запросе. Да и сам запрос, если заморочиться, наверняка можно оптимизировать, на коленке собрал.

Мне нужно не текст вывести, а всю статью "Книга Иванова" с картинками, кнопочками и пр.

Контентный плагин свой лучше под это написать, любое форматирование, расширяемость. Вы же в теме, раз в PMA запросы джойните. Пробуйте, это не сложно. Изучите дефолтные, создайте тему "мой первый (?) плагин", и вам помогут (именно помогут, код за вас писать не станут).
В PMA запросы джойню только потому, что с 1С 8 нахожусь в очень близких и дружественных отношениях  ^-^
Написать свой плагин не потяну.
*

kit2m2

  • Живу я здесь
  • 3362
  • 276 / 0
  • Беру сайты на полное сопровождение
Я бы сделал так:
Книги - материалами в категории "Книги", Авторов - метками. Нажимаешь на Автора (метку) получаешь список материалов автора (а там точно будут отображаться доп.поля) это самый простой вариант.

Можно еще конечно использовать какой нибудь компонент каталога, но это совсем другая история...
Расширения для JoomShopping | Ссылка на Телеграм-канал | Сайты и магазины под ключ: Дизайн, Верстка, Программирование (расширения на заказ), СЕО-оптимизация, Сопровождение, Перенос на Joomla 4+ (5+) и JoomShopping 5+
*

Allisa999

  • Осваиваюсь на форуме
  • 11
  • 0 / 0
Всем спасибо. Помог AlekVolsk. Тема закрыта.
С праздником ^-^
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Gantry 5. Как вывести материал?

Автор Pavel_L

Ответов: 4
Просмотров: 2233
Последний ответ 08.05.2018, 15:32:35
от Pavel_L
Отобразить только материал в iframe

Автор semalexandro

Ответов: 3
Просмотров: 1281
Последний ответ 09.03.2017, 10:13:45
от semalexandro
Подключение удаленной компоненты в нутри другой компоненты

Автор sanyva

Ответов: 0
Просмотров: 1027
Последний ответ 07.03.2017, 15:34:17
от sanyva
Komento: Включить автоматическую подписку по e-mail при комментировании

Автор slepoy

Ответов: 0
Просмотров: 984
Последний ответ 28.01.2017, 12:16:28
от slepoy
Плагин Shortcode_Ultimate. Шорт код Карусель. Ссылка на материал

Автор sgeleta

Ответов: 3
Просмотров: 1810
Последний ответ 11.11.2016, 21:46:51
от sgeleta