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

ShutTap

  • Захожу иногда
  • 131
  • 0 / 0
Здравствуйте.
В стандартном модуле вывода категорий как меню http://joomshopping.pro/download/module-category.html хочу сделать вывод категорий в зависимости от их вложения.
Уже доделывал, чтоб показывало количество вложенной продукции.
Сейчас выводит все одним списком подряд
Сделал, чтобы если выбираешь категорию, у которой есть вложения - подставляет ul li как надо, и тогда категории на одном уровне с выбранной отображаются рядом как li, а вложенные категории в ul. То есть многоуровневый список вроде норм.
Но если выделять дочернюю категорию, то строится начинает относительно нее, и все категории выше - тоже на уровне ее. А надо что бы дочерние все равно в ul были... никак не могу придумать, как это сделать.
Сейчас вот такой вариант:
код шаблона вывода default.php
Код
<?php 
<ul<?php if ($params->get('moduleclass_sfx')){ echo (" class=\"".$params->get('moduleclass_sfx')."\"");} ?>>
<?php

foreach($categories_arr as $key => $curr){

print $curr->html_tags_open;?>
            <a href = "<?php print $curr->category_link; ?>"><?php print $curr->name; if ($params->get('show_count')){?><span class="count"><?php print " (".$countproducts_all[$key].")"; ?></span><?php }?>
                <?php if ($show_image && $curr->category_image){?>
                    <img align = "absmiddle" src = "<?php print $jshopConfig->image_category_live_path."/".$curr->category_image?>" alt = "<?php print $curr->name?>" />
                <?php } ?>
            </a>
     <?php print $curr->html_tags_close;?>

<?php  } ?>

в html_tags_open и html_tags_close подставляются li или открывающие/закрывающие ul

файл с формированием данных helper.php
Код
<?php
class jShopCategoriesHelper{
    
  public static function getTreeCats($order, $ordering, $category_id, $categories_id, &$categories, $level=0){

        if ($category_id){

            if (isset($categories_id[$level])){
                $cat = JTable::getInstance('category', 'jshop');        
                $cat->load($categories_id[$level]);

                $cats = $cat->getSisterCategories($order, $ordering);

                foreach ($cats as $key=>$value){
                    $value->level = $level;

                    if (in_array($value->category_id, $categories_id)){

$value->html_tags_open .= "<li>";
$categories[] = $value;

 if ($value->category_id == $category_id){ //просматриваемая категория выделена, показываем подкатегории
 
 $value->html_tags_open .= "<active>";
 $value->html_tags_close .= "</active>";
 
 $cat = JTable::getInstance('category', 'jshop');        
 $cat->load($categories_id[$level]);
 $cat->category_id = $category_id;
 $childs = $cat->getChildCategories($order, $ordering);
 
 
  //список вложенных категорий
  foreach ($childs as $key2=>$value2){
  $value2->level = $level + 1;
  $value2->html_tags_open .= "<li>";
  $categories[] = $value2;
  }
  if ($childs){
  $value->html_tags_close .= "<ul>";
  $childs[count($childs)-1]->html_tags_close .= "</ul>";
  }
  //конец списка вложенных категорий
}
                        
jShopCategoriesHelper::getTreeCats($order, $ordering, $category_id, $categories_id, $categories, ++$level);
$level--;
} else { $categories[] = $value;

}

                }

            }
        } else {
            $cat = JTable::getInstance('category', 'jshop');
            $cat->category_parent_id = 0;
            $cats = $cat->getSisterCategories($order, $ordering);
            foreach($cats as $key=>$value){
                $cats[$key]->level = 0;
$value->html_tags_open = "<li>";
            }
            $categories = $cats;  
            $count = count($cats);
        }

    }
    
  public static function getCatsArray($order, $ordering, $category_id, $categories_id = array()){
       $res_arr = array();
       jShopCategoriesHelper::getTreeCats($order, $ordering, $category_id, $categories_id, $res_arr, 0);
       return $res_arr;
    }

   function getTotalItem($category_id){
      $arrCate = array();
      $arrCate = jShopCategoriesHelper::getAllSubcates($category_id);
      if(empty($arrCate)){
         return 0;
      }
      if(count($arrCate) == 1){
         $where = " WHERE pc.category_id = ".$arrCate[0]. " ";
      }else{
         $strCate = implode(',',$arrCate);
         $where = " WHERE pc.category_id IN (".$strCate.") ";
      }
      $db = &JFactory::getDBO();
      $query = "SELECT COUNT(DISTINCT pc.product_id) AS total FROM `#__jshopping_products_to_categories` pc ".$where;
      $db->setQuery($query);
        $total = $db->loadObject();
      return $total->total;
   }
    
 function getAllSubcates($category_id){
      $lang = &JSFactory::getLang();
      $db = &JFactory::getDBO();
      $tmp[] = $category_id;
      $query = "SELECT `".$lang->get('name')."` as name, category_id, category_parent_id, category_publish FROM `#__jshopping_categories`
      where category_publish = '1' ORDER BY category_parent_id, ordering";
      $db->setQuery($query);
      $all_cats = $db->loadObjectList();

      if(count($all_cats)) {
         foreach ($all_cats as $key => $value) {
            if(!empty( $value->category_parent_id ) && in_array($value->category_parent_id, $tmp)){
               $tmp[] = $value->category_id;
            }
         }
      }
      return $tmp;
   }

}
?>
« Последнее редактирование: 13.10.2014, 08:06:38 от ShutTap »
*

ShutTap

  • Захожу иногда
  • 131
  • 0 / 0
Всё, решено. Вот, может кому пригодится:

файл helper.php
Код
<?php
class jShopCategoriesHelper{
    
  public static function getTreeCats($order, $ordering, $category_id, $categories_id, &$categories, $level=0){

        if ($category_id){

            if (isset($categories_id[$level])){
                $cat = JTable::getInstance('category', 'jshop');        
                $cat->load($categories_id[$level]);

                $cats = $cat->getSisterCategories($order, $ordering);

if ($level!==0){
$cats[0]->html_tags_open .= "<ul>";
$cats[count($cats)-1]->html_tags_close .= "</ul>";
}

                foreach ($cats as $key=>$value){
                    $value->level = $level;

                    if (in_array($value->category_id, $categories_id)){

$value->html_tags_open .= "<li>";
$categories[] = $value;

 if ($value->category_id == $category_id){ //просматриваемая категория выделена, показываем подкатегории
 
 $value->html_tags_open .= "<active>";
 $value->html_tags_close .= "</active>";
 
 $cat = JTable::getInstance('category', 'jshop');        
 $cat->load($categories_id[$level]);
 $cat->category_id = $category_id;
 $childs = $cat->getChildCategories($order, $ordering);
 
 
  //список вложенных категорий
  foreach ($childs as $key2=>$value2){
  $value2->level = $level + 1;
  $value2->html_tags_open .= "<li>";
  $categories[] = $value2;
  }
  if ($childs){
  $value->html_tags_close .= "<ul>";
  $childs[count($childs)-1]->html_tags_close .= "</ul>";
  }
  //конец списка вложенных категорий
}
                        
jShopCategoriesHelper::getTreeCats($order, $ordering, $category_id, $categories_id, $categories, ++$level);
$level--;
} else {
 $value->html_tags_open .= "<li>";
 $categories[] = $value;
}

                }

            }
        } else {
            $cat = JTable::getInstance('category', 'jshop');
            $cat->category_parent_id = 0;
            $cats = $cat->getSisterCategories($order, $ordering);
            foreach($cats as $key=>$value){
             $cats[$key]->level = 0;
             $value->html_tags_open .= "<li>";
            }
            $categories = $cats;  
            $count = count($cats);
        }

}
    
  public static function getCatsArray($order, $ordering, $category_id, $categories_id = array()){
       $res_arr = array();
       jShopCategoriesHelper::getTreeCats($order, $ordering, $category_id, $categories_id, $res_arr, 0);
       return $res_arr;
    }

   function getTotalItem($category_id){
      $arrCate = array();
      $arrCate = jShopCategoriesHelper::getAllSubcates($category_id);
      if(empty($arrCate)){
         return 0;
      }
      if(count($arrCate) == 1){
         $where = " WHERE pc.category_id = ".$arrCate[0]. " ";
      }else{
         $strCate = implode(',',$arrCate);
         $where = " WHERE pc.category_id IN (".$strCate.") ";
      }
      $db = &JFactory::getDBO();
      $query = "SELECT COUNT(DISTINCT pc.product_id) AS total FROM `#__jshopping_products_to_categories` pc ".$where;
      $db->setQuery($query);
        $total = $db->loadObject();
      return $total->total;
   }
    
 function getAllSubcates($category_id){
      $lang = &JSFactory::getLang();
      $db = &JFactory::getDBO();
      $tmp[] = $category_id;
      $query = "SELECT `".$lang->get('name')."` as name, category_id, category_parent_id, category_publish FROM `#__jshopping_categories`
      where category_publish = '1' ORDER BY category_parent_id, ordering";
      $db->setQuery($query);
      $all_cats = $db->loadObjectList();

      if(count($all_cats)) {
         foreach ($all_cats as $key => $value) {
            if(!empty( $value->category_parent_id ) && in_array($value->category_parent_id, $tmp)){
               $tmp[] = $value->category_id;
            }
         }
      }
      return $tmp;
   }

}
?>
« Последнее редактирование: 10.10.2014, 13:34:04 от ShutTap »
Чтобы оставить сообщение,
Вам необходимо Войти или Зарегистрироваться
 

Вывод списка товаров с учетом значения связанного атрибута

Автор newalex

Ответов: 2
Просмотров: 1172
Последний ответ 17.10.2024, 08:51:19
от newalex
[Решено] Адрес e-mail как логин при регистрации

Автор orexov_m

Ответов: 51
Просмотров: 15141
Последний ответ 28.02.2024, 18:34:01
от nevigen
Плагин - Вывод значения поля из таблицы продуктов в корзине JoomShopping

Автор draff

Ответов: 3
Просмотров: 2192
Последний ответ 26.02.2024, 07:00:01
от kit2m2
[Решено] - Заказ на одной странице

Автор shurakana

Ответов: 58
Просмотров: 18993
Последний ответ 16.03.2023, 09:53:16
от kit2m2
[Решено] Товар на замену в блоке с ценой

Автор dron

Ответов: 2
Просмотров: 2676
Последний ответ 13.04.2022, 16:09:53
от dron