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

Ренат

  • Осваиваюсь на форуме
  • 11
  • 2 / 0
Написал модуль для своего сайта. Форма заказа. При этом, если присутствует куки с именем "r", то поле (у меня это поле для промо-кода) автоматически заполняется его значением. Сделал как проще для меня: c помощью PHP. Вот что было:
Код
<form method="post" class="form-inline">
  <?php echo "<input name='session_id' type='hidden' value=".session_id().">" ?>
    ... ... ...
    <div class="control-group"><label for="promo" title="Если кто-то Вам предоставил промо-код на скидку, введите его здесь">Промо-код</label>
    <input type="text" name="promo" id="orderpromo" autocomplete="off" title="Если кто-то Вам предоставил промо-код на скидку, введите его здесь" value="<?php echo @$_COOKIE['r'] ?>"></div>
    <div class="control-group"><div class="controls"><button type="submit" tabindex="0" name="Submit" class="btn btn-large">Отправить заказ</button></div></div>
</form>
Возникла проблема. Если на сайте включить, кеширование, то код работать не будет, так как тело модуля кешируется вместе с его значением.
Соответственно возникла необходимость все-таки использовать JavaScript. Не часто его использовал, поэтому тут совсем нет опыта.
В теле модуля прописал код для добавление соответствующего скрипта. Вот мои потуги:
Код
<?php
  JHtml::_('jquery.framework', false);
  $document = JFactory::getDocument();
  $document->addScript('modules/mod_orderform/js/jquery.cookie.js');
  $document->addScriptDeclaration(
    'window.event("domready", function()
      {
        document.getElementById("orderpromo").value = $.cookie("r");
      });'
  );
?>
Код не работает. Отладчик говорит, что функции window.event не существует. Что делаю так. Могу предположить, что все :) Не подскажите как правильно реализовать такую простую задачу (автоматическое заполнение поля из куки)? Пока пришлось вернуться к своему варианту на PHP с отключенным кешированием на Joomla
*

robert

  • Живу я здесь
  • 4974
  • 457 / 20
Код: javascript
jQuery(document).ready(function($){
$('#orderpromo').val($.cookie('r'));
});
Не будь паразитом, сделай что-нибудь самостоятельно!
*

Ренат

  • Осваиваюсь на форуме
  • 11
  • 2 / 0
Спасибо большое! Так заработало!
Код
<?php
  JHtml::_('jquery.framework', false);
  $document = JFactory::getDocument();
  $document->addScript('modules/mod_orderform/js/jquery.cookie.js');
  $document->addScriptDeclaration(
    'jQuery(document).ready(function($){
$("#orderpromo").val($.cookie("r"));
     });'
  );
?>
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Пипец, чтобы вывести одну строку подключить целый файл  :laugh:
Код: javascript
function getCookie(name) {
  var matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\function getCookie(name) {
  var matches = document.cookie.match(new RegExp(
    "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
  ));
  return matches ? decodeURIComponent(matches[1]) : undefined;
}
document.getElementById('orderpromo').value = getCookie('r');
alert(getCookie('r');
') + "=([^;]*)"
  ));
  return matches ? decodeURIComponent(matches[1]) : undefined;
}
document.getElementById('orderpromo').value = getCookie('r');
alert(getCookie('r');
*

Ренат

  • Осваиваюсь на форуме
  • 11
  • 2 / 0
Спасибо!
Правда все равно пришлось использовать jQuery. Если использовать window.event("domready", function(){...}, то выдается сообщение об ошибке, что такой функции нет. Использовал конструкцию, предложенную выше (jQuery(document).ready(function($){...}). Получилось вот так
Код
<?php
  JHtml::_('jquery.framework');
  $document = JFactory::getDocument();
  $document->addScriptDeclaration(
    'function getCookie(name) {
      var matches = document.cookie.match(new RegExp(
        "(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, "\\$1") + "=([^;]*)"
        ));
      return matches ? decodeURIComponent(matches[1]) : undefined;
    }
    jQuery(document).ready(function($)
 {
   document.getElementById("orderpromo").value = getCookie("r")
 }
);
    ');
?>
Можно еще как-то оптимизировать сей код?
*

Fedor Vlasenko

  • Живу я здесь
  • 3845
  • 733 / 7
  • https://fedor-vlasenko.web.app
Код: javascript
window.onload = function(){
function getCookie(name) {
 var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\window.onload = function(){
function getCookie(name) {
 var matches = document.cookie.match(new RegExp(
"(?:^|; )" + name.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, '\\$1') + "=([^;]*)"
 ));
 return matches ? decodeURIComponent(matches[1]) : undefined;
}
document.getElementById('orderpromo').value = getCookie('r');
alert(getCookie('r');
};
') + "=([^;]*)"
 ));
 return matches ? decodeURIComponent(matches[1]) : undefined;
}
document.getElementById('orderpromo').value = getCookie('r');
alert(getCookie('r');
};
*

Ренат

  • Осваиваюсь на форуме
  • 11
  • 2 / 0
Спасибо, Fedor и Robert! Не понимаю почему тут нет кнопочки, чтобы плюсануть вашу карму.
P.S. А нет, появилось  ;D
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Получить данные из поля " file", и передать в файл обработчик

Автор Glog

Ответов: 5
Просмотров: 1609
Последний ответ 01.08.2017, 13:55:40
от Glog
Проблема с сохранением записи в БД (не все поля сохраняются)

Автор GuDeVic

Ответов: 42
Просмотров: 2915
Последний ответ 07.12.2016, 14:19:59
от b2z
Объясните как работает MVC Override с помощью плагина Joomla!

Автор kens1n

Ответов: 8
Просмотров: 2026
Последний ответ 09.10.2016, 11:00:25
от robert
Передача поля формы во view в другую модель по кнопке контроллера

Автор tm2010

Ответов: 28
Просмотров: 1910
Последний ответ 18.02.2016, 17:27:06
от tm2010
Поиск по списку значений поля как в админке. j3.3

Автор Aeliot

Ответов: 0
Просмотров: 882
Последний ответ 12.06.2014, 23:21:14
от Aeliot