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

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Выпустил релиз-кандидат MiniCCK версии 2.5. Добавлен выбор макетов для полей в типах контента. Поля и типы в админке плагина закрыл аккордеономЮ получилось компактно, и, надеюсь, удобно. Качать по старому адресу.
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Ты прям как добрый фей. Как раз сейчас работаю с МиниССК и очень не хватает шаблонизации полей.
*

Gover

  • Захожу иногда
  • 189
  • 3 / 0
Давать свои имена переопределнным шаблонам можно? Или имя должно быть default.php и default_cat.php и никак иначе?
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Да, свои имена можно давать переопределённым шаблонам полей, и выносить в папку шаблона сайта можно. Переопределить шаблон плагина с именованием файлов можно только в папке самого плагина.
*

Igoritaly

  • Давно я тут
  • 659
  • 2 / 0
Установил плагин.
Версия Joomla - 3.3.0
Версия плагина - 2.4

Создал несколько полей. Добавлял материал и заносил информацию в поля. Но в одном материале, прекратилась возможность забивать содержимым одно из полей, а именно последнее и к тому же еще "большое текстовое поле" (textarea), все остальные поля - строки. И во всех новых материалах возможность использовать это поле не появилась. В чем может быть причина?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Посмотрите в настройки плагина, привязаны ли это поле к типу, сохраните настройки. Посмотрите в базу данных есть ли поле в таблице плагина.
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Хочу сделать «живой» фильтр. Т.е. чтобы по изменению чекбоксов в группе в модуле, страницы фильтровались аяксом после секундной задержки. Как сформировать URL для запроса?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Переведи форуму модуля в  get. Увидишь URL.  Но лучше скриптом перехватить событие нажатия кнопки фильтра и сериализовать форму для отправки аяксом.
*

jorevo

  • Давно я тут
  • 595
  • 13 / 1
Аркадий, что насчёт обязательных полей? Есть в планах на обозримое будущее?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Да как-то небыло, Плагин делаю в основном для себя, по спонсорской помощи или когда идея понравится. Обязательные поля пока ни под одну категорию не попадают.
*

alex9158

  • Захожу иногда
  • 64
  • 0 / 0
Подскажите, пожалуйста, как вывести данные на страницу блога категории? В файле ...\html\com_content\category/blog/php
Я пытался использовать этот запрос:
<?php echo $this->item->minicck->getFieldValue($this->item->id, 'field_6');?>
Выдает ошибку:
Fatal error: Call to a member function getFieldLabel() on a non-object in X:\home\drevogroup\www\templates\drevo\html\com_content\category\blog.php on line 17


На странице контента все отлично выводится
« Последнее редактирование: 20.06.2015, 15:32:23 от alex9158 »
*

alex9158

  • Захожу иногда
  • 64
  • 0 / 0
Подскажите, пожалуйста, как вывести данные на страницу блога категории? В файле ...\html\com_content\category/blog/php
Я пытался использовать этот запрос:
<?php echo $this->item->minicck->getFieldValue($this->item->id, 'field_6');?>
Выдает ошибку:
Fatal error: Call to a member function getFieldLabel() on a non-object in X:\home\drevogroup\www\templates\drevo\html\com_content\category\blog.php on line 17


На странице контента все отлично выводится

Сам же нашел ответ на свой вопрос:
конструкция должна быть такого вида

<?php echo $article->minicck->getFieldValue($article->id, 'field_6'); ?>

так как у меня через foreach все записывается в переменную $article
<?php foreach ($this->items as $i => $article) : ?>
   <a class="catalog-tovar" href="<?php echo JRoute::_(ContentHelperRoute::getArticleRoute($article->slug, $article->catid, $article->language)); ?>">
      <span class="price-proekt"><?php echo $article->minicck->getFieldValue($article->id, 'field_6'); ?></span>
   </a>
<?php endforeach; ?>
*

alex9158

  • Захожу иногда
  • 64
  • 0 / 0
Зато появился другой вопрос - как вывести данные в модуле?
Есть модуль "Самые популярные материалы"

Вот код переопределенного макета

<?php defined('_JEXEC') or die;?>

<?php foreach ($list as $item) : ?>
   <?php $img = json_decode($item->images);?>
      <a class="carousel-block" href="<?php echo $item->link; ?>">
         <img src="<?php echo $this->item->minicck->getFieldValue($this->item->id, 'field_8');?> />
         <span class="name-proekt"><?php echo $item->title; ?></span>
         <span class="category-proekt"><?php echo $item->category_title; ?></span>
         <span class="price-proekt"><?php echo $img->image_intro_alt;?></span>
      </a>
<?php endforeach; ?>
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Модуль придется дописывать самому или перейти на http://argens.ru/component/ars/repository/minicck/content-module-minicck?Itemid=128 и, так-же, немного его дописать.
*

alex9158

  • Захожу иногда
  • 64
  • 0 / 0
А в чем их отличия?
А из базы данных нельзя вытаскивать нужное значение? Если можно, то как?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
1. Посмотрите. Не знаю.
2. Можно. Есть таблица #__minicck, в ней хранятся все данные. Как из нее взять нужное посмотрите в модуле по ссылке, которую я вам дал.
*

alex9158

  • Захожу иногда
  • 64
  • 0 / 0
Модуль придется дописывать самому или перейти на http://argens.ru/component/ars/repository/minicck/content-module-minicck?Itemid=128 и, так-же, немного его дописать.
А что именно надо допилить в том, который по ссылке?
Я в php не силен, поэтому сам боюсь не разберусь
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Я не знаю что вам надо, по этому не знаю что там переделывать, но боюсь, что без знания php вам там делать нечего.
*

timoshka

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Выпустил релиз-кандидат MiniCCK версии 2.5. Добавлен выбор макетов для полей в типах контента. Поля и типы в админке плагина закрыл аккордеономЮ получилось компактно, и, надеюсь, удобно. Качать по старому адресу.
Отличное обновление! Спасибо за нижнюю кнопку добавить поле)

Да как-то небыло, Плагин делаю в основном для себя, по спонсорской помощи или когда идея понравится. Обязательные поля пока ни под одну категорию не попадают.

Может заинтересуют идеи:
  • Поле даты
    Чисто для удобства, чтобы руками не вводить, а выбирать из календаря, как в дате создания.
  • Поле связанных материалов
    Кнопка выбора материалов, как в меню или некоторых модулях с мультивыбором, а в базе хранить id материалов.
  • Сортировка полей
    Добавить в поля еще один параметр "номер в списке" (хорошо бы для каждого типа свой порядок), как было раньше для модулей итд в Joomla или сделать как сейчас просто перетаскиванием. Иногда нужно поднять часто использованные поля наверх, чтобы не листать страницу в самый низ после добавления нового часто используемого поля. (Сейчас меняю порядок в базе)


 
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Спасибо за предложения, будем подумать )
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Вот все три предложения timoshka сам хотел написать. Про сортировку — в слайдере или галерее нет возможности фотки выстроить в нужном порядке. Сейчас, если нужно поменять порядок, приходится удалять и заново набивать картинки в поля.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
*

Shustry

  • Гуру
  • 6434
  • 745 / 3
Sortable приделать?
Было бы круто.
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
*

timoshka

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Подскажите пожалуйста, как в шаблоне материала вывести дополнительные поля из другого материала? Без модулей  и прямых запросов в базу такое возможно?
Типа такого:
Код
$id = $this->item->minicck->getFieldValue($this->item->id, 'article_id'); // id другого материала например указывается в дополнительном поле текущего
$article = JControllerLegacy::getInstance('Content')->getModel('Article')->getItem($id);
$country =  $article->minicck->getFieldValue($id, 'country'); // получаем дополнительное поле "Страна" из другого материала в текущем

*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Попробуйте, возможно получится.
*

timoshka

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Попробуйте, возможно получится.
Так я и попробовал, к сожалению не работает. Объект $article получается без дополнительных полей. Что можно сделать?
*

Arkadiy

  • Гуру
  • 5317
  • 463 / 2
  • Крепитесь, други.
Попробуйте запустить триггер onContentPrepare с вашей загруженной статьей.
*

timoshka

  • Осваиваюсь на форуме
  • 22
  • 0 / 0
Спасибо, получилось!

Код
$id = $this->item->minicck->getFieldValue($this->item->id, 'article_id');
$article = JControllerLegacy::getInstance('Content')->getModel('Article')->getItem($id);
$dispatcher = JDispatcher::getInstance();
$dispatcher->trigger('onContentPrepare', array('com_content.article', &$article, &$params));
$country =  $article->minicck->getFieldValue($article->id, 'country');
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Умный поиск Joomla! 4.3.4 Stable не ищет в содержимом SP Page Builder 5.0.8

Автор dmitrypro

Ответов: 4
Просмотров: 2791
Последний ответ 17.10.2023, 13:59:18
от dmitrypro
Поиск аналогичного конструктора контента

Автор TRIGUN

Ответов: 0
Просмотров: 1526
Последний ответ 24.07.2017, 02:12:13
от TRIGUN
MiniCCK - вывод полей в модулях

Автор Nikolay Blinov

Ответов: 1
Просмотров: 1828
Последний ответ 28.06.2016, 02:31:25
от Nikolay Blinov
Как сделать каталог в Joomla?

Автор tao2en

Ответов: 8
Просмотров: 3921
Последний ответ 11.03.2016, 11:14:22
от FitMe
Ребят кто сможет сделать модуль для Joomla 3 с функционалом описанным ниже

Автор foxkirov

Ответов: 4
Просмотров: 1851
Последний ответ 14.01.2016, 21:39:41
от foxkirov