[РЕШЕНО] Вывод товаров minishop2 по производителям

Как вывести товары в minishop2 с разбивкой по производителям. Чтобы при добавлении нового производителя и товаров от него они автоматически попадали в выборку. И имели следующий вид

Sony
Список товаров Sony

Samsung
Список товаров samsung

LG
Список товаров LG

И так далее.

Спасибо!
Юрий
02 мая 2020, 09:16
modx.pro
1 774
0

Комментарии: 3

Максим
03 мая 2020, 12:40
0
Есть несколько вариантов решения задачи:

Для создания отдельных страниц для брендов (выбрали Самсунг — попали на страницу Самсунг)
1) Указать у производителя соответствующую страницу и на ней вызывать сниппет (для каждого производителя придется создавать отдельную страницу).
2) Создать единую страницу для всех брендов и воспользоваться этой инструкцией для настройки

Для создания страницы, на которой партянкой отображаются все бренды с товарами я бы написал собственный сниппет для получения брендов с товарами, но так как страница, скорее всего окажется очень большой и будет долго грузиться, то никто не мешает дописать аякс подгрузку на скролл.
    Юрий
    03 мая 2020, 14:56
    1
    0
    1) Указать у производителя соответствующую страницу и на ней вызывать сниппет (для каждого производителя придется создавать отдельную страницу).
    Такой вариант не подходит требования были именно выводить все товары в категории с разбивкой по производителям.

    Для создания страницы, на которой партянкой отображаются все бренды с товарами я бы написал собственный сниппет для получения брендов с товарами,
    Так и поступил, если кому то понадобится забирайте.

    Сниппет miniShopVendorsList
    <?php
    
    $output = '';
    $categoryId = (int)$modx->getOption('category', $scriptProperties, -1);
    
    if ($categoryId >= 0) {
      $categoryEntries = [];
      
      $categoriesQuery = $modx->newQuery('modResource');
      $categoriesQuery->where(array(
         'parent:IN' => array($categoryId),
         'deleted' => false,
         'hidemenu' => false,
         'published' => true,
      ));
      $categoriesResources = $modx->getCollection('modResource', $categoriesQuery);
      
      foreach ($categoriesResources as $categoryResource) {
        $categoryEntries[] = $categoryResource->get('id');
      }
      
      if (!empty($categoryEntries)) {
        $vendorsListQuery = $modx->query("SELECT id, name FROM modx_ms2_vendors");
        $vendorsListArray = $vendorsListQuery->fetchAll(PDO::FETCH_ASSOC);
        
        if (!empty($vendorsListArray)) {
          $tpl = $modx->getParser()->getElement('modChunk', 'miniShopVendorsProductsList');
          $tpl->setCacheable(false);
          
          foreach ($vendorsListArray as $vendorRow) {
            $vendorData = $vendorRow;
            $vendorData['id'] = (int) $vendorData['id'];
            
            $vendorId = $modx->quote($vendorData['id'], PDO::PARAM_INT);
            
            $vendorProductsQuery = $modx->query("SELECT id FROM modx_ms2_products WHERE vendor = $vendorId");
            $vendorProductsArray = $vendorProductsQuery->fetchAll(PDO::FETCH_ASSOC);
        
            foreach ($vendorProductsArray as $vendorProductRow) {
              $vendorProductId = (int) $vendorProductRow['id'];
              if (in_array($vendorProductId, $categoryEntries)) {
                $vendorData['productsList'][] = $vendorProductId;
              }
            }
            $vendorData['productsList'] = implode(', ', $vendorData['productsList']);
            
            if (!empty($vendorData['productsList'])) {
              $tpl->_processed = false;
              $output .= $tpl->process($vendorData);
            }
            
          }
          
        }
        
      }
      
    }
    
    return $output;
    Вывод на странице
    <div class="col-12">
      <h3>[[+name]]</h3> // Название бренда
    </div>
    
    // Вывод товаров этого бренда
    
    [[!msProducts?
      &parents=`0`
      &resources=`[[+productsList]]`
      &tpl=`catalog_list`
    ]]
    но так как страница, скорее всего окажется очень большой и будет долго грузиться, то никто не мешает дописать аякс подгрузку на скролл.
    В данном примере товаров всего около 100 шт. в 6 категориях и 5-6 брендов. В итоге на одной странице не больше 10-20 товаров. Поэтому в этом примере обошлись без ajax подгрузки.

    PS код писал не сам, помог знакомый программист. Код писался «на коленке» по быстрому, если есть предложения по оптимизации и улучшению welcome
      Максим
      03 мая 2020, 20:18
      0
      Конечно есть!
      1) Отказаться от сырых запросов. Зачем сначала получать вендеров, потом получать id товаров и потом еще запускать сниппет для получения товаров по id, если в исходниках miniShop2 указана связь?
      2) Зачем тук сложно реализована работа с чанком? Зачем чанку отключать кеширование? У меня, по крайней мере, никогда не было проблем с кешированием. На мой взгляд куда правильнее получить сервис pdoTools и использовать его метод getChank, тем самым получив возможность использовать в чанке fenom и обойтись одним чанком.
      Думаю что код станет меньше и корректнее по отношению к MODX и установленным компонентам.
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    3