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

Artrum

  • Осваиваюсь на форуме
  • 31
  • 2 / 0
Создал фильтр товара, но фильтрация происходит только по одному введённому значению, а необходимо, чтобы по выбранным нескольким значениям.

Сейчас поиск происходит: Тип одежды: Куртка; Размер XXL. находит либо куртку, либо по размеру, но не находит совместный вариант.

Подскажите пожалуйста, что сделал не так ?

Код формы поиска:
    <?php
    if( !defined( '_VALID_MOS' ) && !defined( '_JEXEC' ) ) die( 'Direct Access to '.basename(__FILE__).' is not allowed.' );
    if( file_exists(dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' )) {
        require_once( dirname(__FILE__).'/../../components/com_virtuemart/virtuemart_parser.php' );
    } else {
        require_once( dirname(__FILE__).'/../components/com_virtuemart/virtuemart_parser.php' );
    }
    global $VM_LANG, $mm_action_url, $sess;
    ?>

    <form action="<?php $sess->purl( $mm_action_url."index.php?page=shop.browse" )?>" method="post">
  
    <table class="pl-1" border="0" cellspacing="0" cellpadding="0" align="left">
    <tbody>
    <tr>
    <td>
    <table style="width: 170px;" border="0" cellspacing="0" cellpadding="0" align="left">
    <tbody>
    <tr>
      <td width="163"><input name="keyword" type="checkbox" value=" 75E" id="keyword" /> 75E</td>
      </tr>
    <tr>
<td width="163"><select class="inputbox" type="checkbox" name="keyword" id="keyword" size="1">
<option value='БюстгальтеÑ?'>БюстгальтеÑ?</option>
<option value='ТÑ?усы'>ТÑ?усы</option>
</select> </td>
    </tr>

    <tr>
      <td><input name="keyword" type="checkbox" value=" 75F" id="keyword" /> 75F</td>
    </tr>
    <tr>
    <td><input name="keyword" type="checkbox" value=" 75G" id="keyword" /> 75G</td>
    </tr>
    <tr>
    <td></td>
    </tr>
    <tr>
    <td align="right"><input class="button" name="Search2" type="submit" value="Найти" /></td>
    </tr>
    </tbody>
    </table>
    </td>
    </tr>
    </tbody>
    </table>
    </form>

Фрагмент кода отвечающего за поиск из shop_browse_queries.php

// This is the "normal" search
if( !empty($keywordArr) ) {
   $sq = "(";
   $numKeywords = count( $keywordArr );
   $i = 1;
   foreach( $keywordArr as $searchstring ) {
      $sq .= "\n (`#__{vm}_product`.`product_name` LIKE '%$searchstring%' OR ";
        $sq .= "\n `#__{vm}_product`.`attribute` LIKE '%$searchstring%' OR ";
      $sq .= "\n `#__{vm}_product`.`product_s_desc` LIKE '%$searchstring%' OR ";
      $sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%') ";
   
      if( $i++ < $numKeywords ) {
         $sq .= "\n  AND ";
      }
   }
   $sq .= ")";
   $where_clause[] = $sq;
}   
// Process the advanced search
elseif( !empty($keyword1Arr) ) {
   $sq = "(";
   $numKeywords = count( $keyword1Arr );
   $i = 1;
   foreach( $keyword1Arr as $searchstring ) {
      switch($search_limiter) {
         case "name":
         $sq .= "\n `#__{vm}_product`.`product_name` LIKE '%$searchstring%' ";
         break;
      case "cp":
         $sq .= "\n `#__{vm}_product`.`product_url` LIKE '%$searchstring%' ";
         break;
      case "desc":
         $sq .= "\n (`#__{vm}_product`.`product_s_desc` LIKE '%$searchstring%' OR ";
         $sq .= "\n `#__{vm}_product`.`attribute` LIKE '%$searchstring%')' OR ";
         $sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%')";
         break;
      default:
         $sq .= "\n (`#__{vm}_product`.`product_name` LIKE '%$searchstring%' OR ";
         $sq .= "\n `#__{vm}_product`.`attribute` LIKE '%$searchstring%') OR ";
         $sq .= "\n `#__{vm}_product`.`product_url` LIKE '%$searchstring%' OR ";
         $sq .= "\n `#__{vm}_category`.`category_name` LIKE '%$searchstring%' OR ";
         $sq .= "\n `#__{vm}_product`.`product_sku` LIKE '%$searchstring%' OR ";
         $sq .= "\n `#__{vm}_product`.`product_s_desc` LIKE '%$searchstring%' OR ";
         $sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%') ";
      }
      if( $i++ < $numKeywords ) {
         $sq .= "\n  AND ";
      }
   }
   $sq .= ") ";
   // KEYWORD 2 TO REFINE THE SEARCH
   if ( !empty($keyword2Arr) ) {
      $search_op= strtoupper(vmGet( $_REQUEST, 'search_op', 'AND' )) == 'AND' ? 'AND' : 'AND NOT';
      $sq .= "\n $search_op (";
      $numKeywords = count( $keyword2Arr );
      $i = 1;
      foreach( $keyword2Arr as $searchstring ) {
         switch($search_limiter) {
            case "name":
            $sq .= "\n `#__{vm}_product`.`product_name` LIKE '%$searchstring%' ";
            break;
         case "cp":
            $sq .= "\n `#__{vm}_product`.`product_url` LIKE '%$searchstring%' ";
            break;
         case "desc":
            $sq .= "\n (`#__{vm}_product`.`product_s_desc` LIKE '%$searchstring%' OR ";
             $sq .= "\n `#__{vm}_product`.`attribute` LIKE '%$searchstring%') ";
            $sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%')";
            break;
         default:
            $sq .= "\n (`#__{vm}_product`.`product_name` LIKE '%$searchstring%' OR ";
              $sq .= "\n `#__{vm}_product`.`attribute` LIKE '%$searchstring%')' OR ";
            $sq .= "\n `#__{vm}_product`.`product_url` LIKE '%$searchstring%' OR ";
            $sq .= "\n `#__{vm}_category`.`category_name` LIKE '%$searchstring%' OR ";
            $sq .= "\n `#__{vm}_product`.`product_sku` LIKE '%$searchstring%' OR ";
            $sq .= "\n `#__{vm}_product`.`product_s_desc` LIKE '%$searchstring%' OR ";
            $sq .= "\n `#__{vm}_product`.`product_desc` LIKE '%$searchstring%')";
         }
         if( $i++ < $numKeywords ) {
            $sq .= "\n  AND ";
         }
      }
      $sq .= "\n ) ";
   }
   $where_clause[] = $sq;
}
« Последнее редактирование: 17.01.2012, 13:35:38 от Artrum »
*

Artrum

  • Осваиваюсь на форуме
  • 31
  • 2 / 0
Очень нужно! Готов заплатить за помощь в реализации, в разумных пределах, предложения в приват. Готовые решения c "Свойствами товара" не подходят. Так как мне нужен фильтр именно из БД, а свойства товара проставляются вручную и автоматически не обновляются.
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

[Решено] Чебокс "Показывать только товары, которые есть в наличии"

Автор artMelnikov

Ответов: 20
Просмотров: 7739
Последний ответ 28.06.2017, 11:19:51
от OutLaw1
Исправить подтягивание значений контактов клиента из базы SQL

Автор Nessy74

Ответов: 5
Просмотров: 1021
Последний ответ 31.12.2015, 07:05:16
от Филипп Сорокин
Вывод товара из дочерних категорий в родительскую

Автор B0nG

Ответов: 0
Просмотров: 1853
Последний ответ 03.08.2014, 15:13:57
от B0nG
ID товара вместо cdata

Автор newsky

Ответов: 0
Просмотров: 1626
Последний ответ 01.07.2014, 13:05:12
от newsky
Расширенный Ajax-поиск по характеристикам товара VirtueMart

Автор Arkadiy

Ответов: 990
Просмотров: 207089
Последний ответ 27.06.2014, 16:47:52
от DeLight