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

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Мне немного надо исправить, но всё же надо. Для всех модулей не хочется свой стиль, только для некоторых.
Добавляю в пункте "Суффикс CSS-класса модуля" свой суффикс (-mystyle) firebug-ом смотрю - а он добавляется всё время с прбелом к основному стилю! Почему? Что я неправильно делаю? Подскажите!
« Последнее редактирование: 01.04.2014, 15:18:41 от Shustry »
*

ShfVD

  • Давно я тут
  • 871
  • 65 / 0
Здесь все правильно
Цитировать
он добавляется всё время с прбелом к основному стилю!
  модуль имеет свой стиль (какой-то), добавляя суффикс начинают
работать оба стиля, сначала стиль модуля, затем стиль из суффикса,
а пробел нужен дабы браузер их разделял.
Если не устраивает стиль модуля, то нужно в стиле суффикса поотменять стили модуля и добавить свои.
как то так.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
нужно в стиле суффикса поотменять стили модуля и добавить свои.

Вот это я чей-то совсем не понял.:( Это как?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Да и пусть с пробелом добавляется. Это как раз правильный подход. Просто всю фишку похоже до конца не поняли.
Пример: Все модули обозначены так:

Код: css
.module {background:#eee; color:#000;}

Вы хотите ТОЛЬКО изменить цвет текста. Тогда дописываете класс red. Получаете разметку:

Код: html4strict
<div class="module red"></div>

Теперь пишите:

Код: css
.module.red {color:#f00;}

Теперь модуль будет И с серым фоном И с красным текстом. Т.е. «старые» стили останутся.
*

ShfVD

  • Давно я тут
  • 871
  • 65 / 0
Вот это я чей-то совсем не понял.:( Это как?
Я так понимаю Вас не устраивает стиль модуля.
Иногда это просто правка (сдвинуть, изменить цвет, отступы и т.д.),
 иногда достаточно просто изменить значения свойств
или добавить новые описания.
Но бывает необходимость отменить свойства, прописанные в стиле модуля.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
видать я много чего не понимаю.
в Joomla 3  наверное эта фишка?
есть в CSS файле шаблона стили вывода модулей и ещё чего-то...
в учебных материалах говорится о том, что необходимо добавить в файл стилей, например:
".panel-box" скопировать вместе со свойствами стилями рядышком (ниже), добавить к нему "-mystyle", получается стиль вида ".panel-box-mystyle" и там изменяем свойства стиля. а в поле суффикс css-класса мудуля добавить собственно "-mystyle".
это правильно?
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Иногда это просто правка (сдвинуть, изменить цвет, отступы и т.д.),
 иногда достаточно просто изменить значения свойств

если поменяю значение свойств - то так будут отображаться и другие модули.
я же хочу конкретно для этого модуля добавить свой стиль (подправить).
да и вообще на будущее - научится это делать без помощи других.
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
ingavr, эта фишка называется «css-каскадирование» и есть с рождения интернета. Не только в Joomla ^-^
*

ShfVD

  • Давно я тут
  • 871
  • 65 / 0
Цитировать
если поменяю значение свойств - то так будут отображаться и другие модули.
Вы имели ввиду вывод одного и того же модуля на разных страницах/в разных позициях с разными стилями?
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
ingavr, эта фишка называется «css-каскадирование» и есть с рождения интернета. Не только в Joomla ^-^
это конечно хорошо, но мне от этого не легче.
как же мне добавить суффикс к классу, если он не прилипает к нему?
« Последнее редактирование: 01.04.2014, 12:17:39 от ingavr »
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Вы имели ввиду вывод одного и того же модуля на разных страницах/в разных позициях с разными стилями?
я имел ввиду что все модули на разных страницах в данной позиции/позициях будут отображаться одинаково.
а мне надо только один модуль подправить по-своему.
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
ingavr, да его не нужно «прилеплять». Суффикс будет вторым классом. В общем, если вы всё равно хотите сделать по-своему а не как правильно, то это так делается:

1. Открываете templates/шаблон/index.php своего шаблона и ищете место, где выводится позиция. Как-то так должно быть: <jdoc:include type="modules" name="pathway" style="clear" />. Значение стиля запоминаете.

2. Открываете templates/шаблон/html/modules.php и функцию вывода модуля под свой стиль:

function modChrome_clear($module, &$params, &$attribs) {
/*тут функция*/
}

3. Находите и убираете пробел в выводе класса модуля. Возможно это так:

<div class="moduletable <?php echo htmlspecialchars($params->get('moduleclass_sfx')); ?>">

или так:

$module->sfx = ' '.$params->get('moduleclass_sfx');
<div class="module-side<?php echo $module->sfx; ?>">

В общем, индивидуально от шаблона зависит.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Вот только есть одна проблема. у меня нет вот этого: templates/шаблон/html/modules.php
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
давайте вот это разберём подробнее.
Да и пусть с пробелом добавляется. Это как раз правильный подход. Просто всю фишку похоже до конца не поняли.
Пример: Все модули обозначены так:

Код: css
.module {background:#eee; color:#000;}

это, я так понимаю основной класс модуля (предположим)
Вы хотите ТОЛЬКО изменить цвет текста. Тогда дописываете класс red. Получаете разметку:

Код: html4strict
<div class="module red"></div>

Это где нужно добавить? (в php файле моего шаблона?)
Теперь пишите:

Код: css
.module.red {color:#f00;}

Теперь модуль будет И с серым фоном И с красным текстом. Т.е. «старые» стили останутся.

*

Shustry

  • Moderator
  • 6434
  • 745 / 3
После того, как вы напишите «red» в css-классе, в настройках модуля, он автоматом добавится и будет как в моём примере. Стили нужно писать в любом подключенном css-файле. Эта запись буквально означает: найти элемент у которого есть оба класса, т.е. и module и red.
А вот если бы я записал правило так, т.е. с пробелом:
.module .red {color:#f00;}
То это уже по-другому работает: найти все элементы с классом module, а внутри них элементы с классом red.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
После того, как вы напишите «red» в css-классе, в настройках модуля, он автоматом добавится и будет как в моём примере. Стили нужно писать в любом подключенном css-файле. Эта запись буквально означает: найти элемент у которого есть оба класса, т.е. и module и red.
А вот если бы я записал правило так, т.е. с пробелом:
.module .red {color:#f00;}
То это уже по-другому работает: найти все элементы с классом module, а внутри них элементы с классом red.
т.е. класс red является как-бы подклассом класса module?
и для того, чтобы он (класс red) подхватывался, необходимо дописывать ко всем элементам с классом module? и там уже изменять?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Не то, чтобы подкласс. Они равнозначны. Т.е. class="red module" и class="module red" тождественно. Почитайте мануалы, тут немного и по делу.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Не то, чтобы подкласс. Они равнозначны. Т.е. class="red module" и class="module red" тождественно..
Хорошо. Задам вопрос по-другому. более точно.
есть класс (panel-title) он для всего вывода материалов с классом "panel", а это и модули и некоторые другие компоненты.
как поменять заголовок к этому модулю используя свой суффикс класса модуля?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
А что изменилось? Вопрос всё тот же. Ответ тоже. Для модулей вписываете в поле css-класс модуля и переопределяете стили. Для компонентов это другая совсем ситуация.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Хорошо. Задам вопрос по-другому. более точно.
есть класс (panel-title) он для всего вывода материалов с классом "panel", а это и модули и некоторые другие компоненты.
как поменять заголовок к этому модулю используя свой суффикс класса модуля?
наверное неправильно выразился.
класс (panel-title) для заголовков всех модулей. и когда ставлю свой класс например (panel-title-new) он видит только стили (panel-title) хотя для своего я прописываю свои стили.
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Как вы ставите свой стиль?
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Как вы ставите свой стиль?
да по-разному уже ставил и в виде (-mystyle) и (panel-title-mystyle) добавляю в графу (Суффикс CSS-класса модуля)
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
У вас должен появиться новый класс у элемента. Не верьте тому, что написано в некоторых статьях. Типа дописываем -myclass, получаем module-myclass. Это зависит исключительно от шаблона. Может получиться и module-myclass и module -myclass и module trololo-myclass. Выложите ссылку на сайт.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
У вас должен появиться новый класс у элемента. Не верьте тому, что написано в некоторых статьях. Типа дописываем -myclass, получаем module-myclass. Это зависит исключительно от шаблона. Может получиться и module-myclass и module -myclass и module trololo-myclass. Выложите ссылку на сайт.
да, я так думаю - это шаблон такой. получается именно module -myclass.
сайт, к сожалению только на локалке пока.
новый класс появляется.
и ещё... panel-title идёт к тегу h3, наверное надо добавить к этому тегу мой класс?
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Не надо. Если получилось что-то типа:

Код: html4strict
<div class="panel-title my-class">
  <h3>заголовок модуля</h3>
</div>

то достаточно так прописать:

Код: css
.my-class h3 {color:#f00;}

Почитайте пожалуйста основы про CSS. Я ссылку выше давал. Тут Joomla совсем не при делах. Если на то пошло, можно вообще не назначать никакой класс, но оформлять все элементы индивидуально. Кроме css2 есть более продвинутые селекторы типа сестринского, селектора атрибутов, селектор со счётчиком и т.д.
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Не надо. Если получилось что-то типа:

Код: html4strict
<div class="panel-title my-class">
  <h3>заголовок модуля</h3>
</div>

то достаточно так прописать:

Код: css
.my-class h3 {color:#f00;}

Почитайте пожалуйста основы про CSS.  Кроме css2 есть более продвинутые селекторы типа сестринского, селектора атрибутов, селектор со счётчиком и т.д.
Уже читаю.
получается так:
Код: html4strict
<div class="panel-title my-class">
  <h3 class="panel-title">заголовок модуля</h3>
</div>
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Код: css
.my-class h3 {}
*

ingavr

  • Захожу иногда
  • 283
  • 0 / 0
Код: css
.my-class h3 {}
спасибо Вам большое!
я какого-то .... писал .panel-title .my-class h3 {}
теперь всё получилось!
плюсую.
*

Shustry

  • Moderator
  • 6434
  • 745 / 3
Позалуйста. Закрываю. ^-^
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

CSS для позиции модуля

Автор tierex

Ответов: 3
Просмотров: 2649
Последний ответ 26.05.2023, 11:06:00
от tierex
Позиционирование модуля

Автор Frost_

Ответов: 4
Просмотров: 2966
Последний ответ 25.01.2023, 11:36:57
от Frost_
Расположить элементы без класса

Автор AlexB

Ответов: 4
Просмотров: 992
Последний ответ 21.01.2021, 12:47:08
от AlexB
Как вставить свой CSS в общий файл CSS шаблона Yootheme?

Автор Lemonez

Ответов: 16
Просмотров: 1449
Последний ответ 21.01.2021, 05:11:58
от Lemonez
[Решено] Как сделать чтобы фотография открылась в отдельном окне?

Автор a-two

Ответов: 11
Просмотров: 2117
Последний ответ 03.11.2020, 16:57:40
от Nikolay89