Юрий

Юрий

Был в сети 25 июня 2023, 19:24
Заказы не принимаю
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
Проблему решил, проблема была в следующем — при копировании сайта выставил в настройках «Статус сайта» — нет. Пол дня искал проблему, писал в службу поддержки двух хостингов, переписывал, и перезаписывал все конфиги по 10 раз. В итоге «статус сайта» поставил да. Установилось нормально. Может кому поможет.