как отсортировать товары по группам если всё выводим в корне.

#
как отсортировать товары по группам если всё выводим в корне.
выводим все товары в корень магазина с помощью
->group(false)

В итоге у нас выводятся отдельно товары и отдельно группы на одном уровне.

в шаблоне вывода групп необходимо вывести товары которые принадлежат данной группе, непример 4 штуки на каждую группу.
Всё хорошо работает до тех пор пока не появляются подгруппы в группах товара.

подскажите как вывести из подгрупп через шаблон item?

пробую как-то вот так

   <xsl:apply-templates select="..//shop_item[shop_group_id='..//shop_group[@id=$group_id]/shop_group/@id']"/>

но работать это у меня не хочет.
#
Re: как отсортировать товары по группам если всё выводим в корне.
Попробуйте так

<xsl:template match="/shop">
   <ul>
   <xsl:for-each select="shop_group">
      <xsl:variable name="groups" select="descendant-or-self::*" />
      <li style="padding-left: 20px;">
         <h4>Товары из <xsl:value-of select="name"/></h4>
         <ul>
         <xsl:for-each select="//shop_item[shop_group_id = $groups/@id]">
            <xsl:sort select="name" data-type="text" order="ascending" lang="" />
            <li style="padding-left: 40px;"><xsl:value-of select="name"/></li>
         </xsl:for-each>
         </ul>
      </li>
   </xsl:for-each>
   </ul>
</xsl:template>
  
ARTatom
#
Re: как отсортировать товары по группам если всё выводим в корне.
Если ситуация позволяет, я бы выводил вообще через контроллер показа структуры (Structure_Controller_Show), а не магазина, сообщив ему, что надо включать группы и товары магазина. В выходном XML структуры товары иерархически вложены в группы, а не на одном уровне. Неоднократно такой подход сильно облегчал мне жизнь.

Судя по вашему описанию, речь о каком-то рубрикаторе. Идеологически контроллер показа структуры вполне вписывается (по моему мнению).
#
Re: как отсортировать товары по группам если всё выводим в корне.
artatom писал(а):
К сожалению этот вариант так и не смог вывести товары которые находятся во вложенных группах, сейчас буду думать варианты ещё.
#
Re: как отсортировать товары по группам если всё выводим в корне.
Просто вывод из групп я могу сделать без проблем, но вот когда мы пытаемся вывести из подгрупп тут получается засада, у товара есть узел shop_group_id ....а у подгрупп есть только @id и parant_id нходясь в группе мы можем допустим получить все @id групп которые находятся в данной, в итоге у нас получится массив из этих id... как теперь отобрать все товары для которых этот @id группы будет равен shop_group_id..

Уже да склоняюсь к использованию вывода через контроллер показа структуры)  но это как-то неправильно идеалогически.
#
Re: как отсортировать товары по группам если всё выводим в корне.
В итоге сделал на контроллере показа структуры, а теперь самый главный вопрос... А можно случайную сортировку задать контроллеру структуры?
Модератор
#
Re: как отсортировать товары по группам если всё выводим в корне.
в методах _addShopGroups() контроллера Structure_Controller_Show группы выбирается в соответствии с сортировками, указанными в атрибутах магазина.
Также есть событие
Core_Event::notify(get_class($this) . '.onBeforeFindShopGroups', $this, array($oShop_Groups, $parentObject, $oShop));

позволяющее переопределить сортировку у $oShop_Groups (нулевой аргумент в $args)

для указания сортировки при выборе товаров есть событие
Core_Event::notify(get_class($this) . '.onBeforeFindShopItems', $this, array($oShop_Items, $parentObject, $oShop));
#
Re: как отсортировать товары по группам если всё выводим в корне.
про обычную сортировку понятно, это можно сделать и на xsl, но можно ли отсортировать случайным образом? Или другой вариант можно ли в контроллере показа магазина получить вывод аналогичный контроллеру показа структуры, т.е. с иерархической вложенностью?Вариант вывода разных превью из разделов магазина отсортированных по разделам, не частая, но и не совсем редкая задача.
Модератор
#
Re: как отсортировать товары по группам если всё выводим в корне.
Маяковский писал(а):
про обычную сортировку понятно, это можно сделать и на xsl, но можно ли отсортировать случайным образом?

я Вам выше дал примеры о том, как добраться до сортировки. Хотите случайную - задавайте. Не вижу препятствий.
#
Re: как отсортировать товары по группам если всё выводим в корне.
// В корне выводим из всех групп
if ($Shop_Controller_Show->group == 0)
{   

     class my_Structure_Controller_Show extends Structure_Controller_Show
      {
         protected function _addShopGroups($parentObject, $oShop, $level = 0)
   {
      $dateTime = Core_Date::timestamp2sql(time());

      $oShop_Groups = $oShop->Shop_Groups;
      $oShop_Groups->queryBuilder()
         ->where('shop_groups.siteuser_group_id', 'IN', $this->_aSiteuserGroups)
         ->where('shop_groups.active', '=', 1)
         ->clearOrderBy();

      switch ($oShop->groups_sorting_direction)
      {
         case 0:
            $groups_sorting_direction = 'ASC';
            break;
         case 1:
         default:
            
      }

      // Определяем поле сортировки групп
      switch ($oShop->groups_sorting_field)
      {
         case 0:
            $oShop_Groups
               ->queryBuilder()
               ->orderBy('shop_groups.name', $groups_sorting_direction);
            break;
         case 1:
         default:
            $oShop_Groups
               ->queryBuilder()
               ->orderBy('shop_groups.sorting', $groups_sorting_direction);
            break;
      }
            
            if ($level > 1) {
               $oShop_Groups
                     ->queryBuilder()
            ->clearOrderBy()
            ->orderBy('RAND()');
            }
               

      $this->_aShop_Groups = array();

      Core_Event::notify(get_class($this) . '.onBeforeFindShopGroups', $this, array($oShop_Groups, $parentObject, $oShop));

      $aShop_Groups = $oShop_Groups->findAll();
      foreach ($aShop_Groups as $oShop_Group)
      {
         $this->_aShop_Groups[$oShop_Group->parent_id][] = $oShop_Group;
      }

      // Shop's items
      if ($this->showShopItems)
      {
         $oShop_Items = $oShop->Shop_Items;
         $oShop_Items->queryBuilder()
            ->select('shop_items.*')
            ->open()
            ->where('shop_items.start_datetime', '<', $dateTime)
            ->setOr()
            ->where('shop_items.start_datetime', '=', '0000-00-00 00:00:00')
            ->close()
            ->setAnd()
            ->open()
            ->where('shop_items.end_datetime', '>', $dateTime)
            ->setOr()
            ->where('shop_items.end_datetime', '=', '0000-00-00 00:00:00')
            ->close()
            ->where('shop_items.siteuser_group_id', 'IN', $this->_aSiteuserGroups)
            ->where('shop_items.modification_id', '=', 0)
            ->clearOrderBy();

         switch ($oShop->items_sorting_direction)
         {
            case 1:
               $items_sorting_direction = 'DESC';
            break;
            case 0:
            default:
               $items_sorting_direction = 'ASC';
         }
      
         

         // Определяем поле сортировки информационных элементов
         switch ($oShop->items_sorting_field)
         {
            case 1:
               $oShop_Items
                  ->queryBuilder()
                  ->orderBy('shop_items.name', $items_sorting_direction)
                  ->orderBy('shop_items.sorting', $items_sorting_direction);
               break;
            case 2:
               $oShop_Items
                  ->queryBuilder()
                  ->orderBy('shop_items.sorting', $items_sorting_direction)
                  ->orderBy('shop_items.name', $items_sorting_direction);
               break;
            case 0:
            default:
               $oShop_Items
                  ->queryBuilder()
                  ->orderBy('shop_items.datetime', $items_sorting_direction)
                  ->orderBy('shop_items.sorting', $items_sorting_direction);
         }

         $oShop_Items
            ->queryBuilder()
   ->clearOrderBy()
   ->orderBy('RAND()');
         
         
         
         
         $this->_aShop_Items = array();

         Core_Event::notify(get_class($this) . '.onBeforeFindShopItems', $this, array($oShop_Items, $parentObject, $oShop));

         $aShop_Items = $oShop_Items->findAll();
         foreach ($aShop_Items as $oShop_Item)
         {
            $this->_aShop_Items[$oShop_Item->shop_group_id][] = $oShop_Item;
         }
      }

      $this->_addShopGroupsByParentId(0, $parentObject);
   }
         
      };

   
   
   
    $Structure_Controller_Show = new my_Structure_Controller_Show(
        Core_Entity::factory('Site', 3)
    );

   
   
   
    $Structure_Controller_Show
         ->showShopGroups(true)
         ->showShopItems(true)
         ->parentId('134')
        ->xsl(
            Core_Entity::factory('Xsl')->getByName('породукциякорень')
        )
        ->show();


вот так вот сделал,... пробовал проверку делать на $level >1, чтоб на высшем уровне у меня группы выбирались со стандартной сортировкой, а вложенные уже выбирались со случайной, но как-то у меня ничего хорошего не вышло.
Авторизация