Новичок в Modx. Подскажите пожалуйста, где найти ошибку, чтобы разделить товары из разных подразделов?

Разбираюсь самостоятельно, но пока не могу найти где найти ошибку в коде.
У меня есть две подкатегории товаров: класс 8 и класс 10. В классе 8 товары лежат корректно. Вот пример правильного расположения:

А есть класс 10, где смешался класс 8 и 10 вместе. То есть в классе 10, должны остаться только синие товары.
inkeri21
20 июня 2023, 10:09
modx.pro
382
0

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

Dan
Dan
20 июня 2023, 14:18
0
Покажите код, как выводите товары. По картинке никто вам подсказать дельно не сможет.
При вставке кода в комментарий используйте специальный тег
    inkeri21
    20 июня 2023, 15:13
    0
    Не уверена, что тот самый код. Изначально не я сайт писала. Стараюсь самоучкой разобраться.

    {if $_modx->resource.pr_hide_category != 1}
                      <div class="prod_cats row">
                        [[pdoResources?
                          	&tpl=`category_list_tpl`
                          	&parents=`[[*id]]`
                          	&templates=`4`
                          	&limit=`48`
                          	&depth=`0`
                          	&sortby=`parent`
                          	&sortby=`{"parent":"ASC","menuindex":"ASC"}`
                          	&includeTVs=`image`
                          	&processTVs=`1`
                          	&tvPrefix=``
                          ]]
                      </div>
                 {/if}
    
                {if $_modx->resource.pr_hide_products != 1}
                  <div class="the-category-items row">
                      [[msProducts?
                      	&tpl=`category_prod_tpl`
                      	&parents=`[[*id]]`
                      	&limit=`48`
                      	&sortby=`parent`
                      	&sortby=`{"menuindex":"ASC","parent":"ASC"}`
                      	&includeTVs=`image`
                      ]]
                  </div>
      inkeri21
      20 июня 2023, 15:41
      0
      Возможно этот более верный

      <div class="row">
        [[pdoResources?
        &parents=`1012`
        &resources=`1014,1020,1022`
        &tpl=`category_submenu_cust_tpl`
        &includeTVs=`image`
        &processTVs=`1`
        &tvPrefix=``
        &limit=`48`
        &depth=`1`
        &sortby=`parent`
        ]]
      </div>
        Dan
        Dan
        20 июня 2023, 15:48
        0
        Если товары minishop2, то скорее всего msProducts.
        Найдите шаблон подкатегории и посмотрите какой сниппет вызван на том месте, где выводятся товары?
        Если в вызове нет условий выборки с помощью where, а выводятся просто товары из этой подкатегории, то подозреваю, что у ваших товаров, которые есть и в классе 8 и в классе 10 указано две категории.
        Зайдите в админке в любой товар, который повторяется на обеих страницах классов, и перейдите во вкладку Категории. Скорее всего там галочкой отмечены обе.
          inkeri21
          20 июня 2023, 15:51
          0
          Спасибо. В Категории смотрела, галочки стоят верные. У 8 класса и у 10 класса.
            inkeri21
            20 июня 2023, 15:57
            0
            Это полностью код сниппет msProduct

            <?php
            /** @var modX $modx */
            /** @var array $scriptProperties */
            /** @var miniShop2 $miniShop2 */
            $miniShop2 = $modx->getService('miniShop2');
            $miniShop2->initialize($modx->context->key);
            /** @var pdoFetch $pdoFetch */
            $fqn = $modx->getOption('pdoFetch.class', null, 'pdotools.pdofetch', true);
            $path = $modx->getOption('pdofetch_class_path', null, MODX_CORE_PATH . 'components/pdotools/model/', true);
            if ($pdoClass = $modx->loadClass($fqn, $path, false, true)) {
                $pdoFetch = new $pdoClass($modx, $scriptProperties);
            } else {
                return false;
            }
            $pdoFetch->addTime('pdoTools loaded.');
            
            if (isset($parents) && $parents === '') {
                $scriptProperties['parents'] = $modx->resource->id;
            }
            
            // Start build "where" expression
            $where = array(
                'class_key' => 'msProduct',
            );
            if (empty($showZeroPrice)) {
                $where['Data.price:>'] = 0;
            }
            // Add grouping
            $groupby = array(
                'msProduct.id',
            );
            
            // Join tables
            $leftJoin = array(
                'Data' => array('class' => 'msProductData'),
                'Vendor' => array('class' => 'msVendor', 'on' => 'Data.vendor=Vendor.id'),
            );
            
            $select = array(
                'msProduct' => !empty($includeContent)
                    ? $modx->getSelectColumns('msProduct', 'msProduct')
                    : $modx->getSelectColumns('msProduct', 'msProduct', '', array('content'), true),
                'Data' => $modx->getSelectColumns('msProductData', 'Data', '', array('id'), true),
                'Vendor' => $modx->getSelectColumns('msVendor', 'Vendor', 'vendor.', array('id'), true),
            );
            
            // Include thumbnails
            if (!empty($includeThumbs)) {
                $thumbs = array_map('trim', explode(',', $includeThumbs));
                foreach ($thumbs as $thumb) {
                    if (empty($thumb)) {
                        continue;
                    }
                    $leftJoin[$thumb] = array(
                        'class' => 'msProductFile',
                        'on' => "`{$thumb}`.product_id = msProduct.id AND `{$thumb}`.rank = 0 AND `{$thumb}`.path LIKE '%/{$thumb}/%'",
                    );
                    $select[$thumb] = "`{$thumb}`.url as `{$thumb}`";
                    $groupby[] = "`{$thumb}`.url";
                }
            }
            
            // Include linked products
            $innerJoin = array();
            if (!empty($link) && !empty($master)) {
                $innerJoin['Link'] = array(
                    'class' => 'msProductLink',
                    'on' => 'msProduct.id = Link.slave AND Link.link = ' . $link,
                );
                $where['Link.master'] = $master;
            } elseif (!empty($link) && !empty($slave)) {
                $innerJoin['Link'] = array(
                    'class' => 'msProductLink',
                    'on' => 'msProduct.id = Link.master AND Link.link = ' . $link,
                );
                $where['Link.slave'] = $slave;
            }
            
            // Add user parameters
            foreach (array('where', 'leftJoin', 'innerJoin', 'select', 'groupby') as $v) {
                if (!empty($scriptProperties[$v])) {
                    $tmp = $scriptProperties[$v];
                    if (!is_array($tmp)) {
                        $tmp = json_decode($tmp, true);
                    }
                    if (is_array($tmp)) {
                        $$v = array_merge($$v, $tmp);
                    }
                }
                unset($scriptProperties[$v]);
            }
            $pdoFetch->addTime('Conditions prepared');
            
            // Add filters by options
            $joinedOptions = array();
            if (!empty($scriptProperties['optionFilters'])) {
                $filters = json_decode($scriptProperties['optionFilters'], true);
                foreach ($filters as $key => $value) {
                    $option = preg_replace('#\:.*#', '', $key);
                    $key = str_replace($option, $option . '.value', $key);
                    if (!in_array($option, $joinedOptions)) {
                        $leftJoin[$option] = array(
                            'class' => 'msProductOption',
                            'on' => "`{$option}`.product_id = Data.id AND `{$option}`.key = '{$option}'",
                        );
                        $joinedOptions[] = $option;
                        $where[$key] = $value;
                    }
                }
            }
            
            // Add sort by options
            if (!empty($scriptProperties['sortbyOptions'])) {
                $sorts = array_map('trim', explode(',', $scriptProperties['sortbyOptions']));
                foreach ($sorts as $sort) {
                    $sort = explode(':', $sort);
                    $option = $sort[0];
                    if (preg_match("#\b{$option}\b#", $scriptProperties['sortby'], $matches)) {
                        $type = 'string';
                        if (isset($sort[1])) {
                            $type = $sort[1];
                        }
                        switch ($type) {
                            case 'number':
                            case 'decimal':
                                $sortbyOptions = "CAST(`{$option}`.`value` AS DECIMAL(13,3))";
                                break;
                            case 'int':
                            case 'integer':
                                $sortbyOptions = "CAST(`{$option}`.`value` AS UNSIGNED INTEGER)";
                                break;
                            case 'date':
                            case 'datetime':
                                $sortbyOptions = "CAST(`{$option}`.`value` AS DATETIME)";
                                break;
                            default:
                                $sortbyOptions = "`{$option}`.`value`";
                                break;
                        }
                        $scriptProperties['sortby'] = preg_replace("#\b{$option}\b#", $sortbyOptions, $scriptProperties['sortby']);
                        $groupby[] = "`{$option}`.value";
                    }
            
                    if (!in_array($option, $joinedOptions)) {
                        $leftJoin[$option] = array(
                            'class' => 'msProductOption',
                            'on' => "`{$option}`.product_id = Data.id AND `{$option}`.key = '{$option}'",
                        );
                        $joinedOptions[] = $option;
                    }
            
                }
            }
            
            $default = array(
                'class' => 'msProduct',
                'where' => $where,
                'leftJoin' => $leftJoin,
                'innerJoin' => $innerJoin,
                'select' => $select,
                'sortby' => 'msProduct.id',
                'sortdir' => 'ASC',
                'groupby' => implode(', ', $groupby),
                'return' => !empty($returnIds)
                    ? 'ids'
                    : 'data',
                'nestedChunkPrefix' => 'minishop2_',
            );
            // Merge all properties and run!
            $pdoFetch->setConfig(array_merge($default, $scriptProperties), false);
            $rows = $pdoFetch->run();
            
            // Process rows
            $output = array();
            if (!empty($rows) && is_array($rows)) {
                $c = $modx->newQuery('modPluginEvent', array('event:IN' => array('msOnGetProductPrice', 'msOnGetProductWeight')));
                $c->innerJoin('modPlugin', 'modPlugin', 'modPlugin.id = modPluginEvent.pluginid');
                $c->where('modPlugin.disabled = 0');
            
                $modifications = $modx->getOption('ms2_price_snippet', null, false, true) ||
                    $modx->getOption('ms2_weight_snippet', null, false, true) || $modx->getCount('modPluginEvent', $c);
                if ($modifications) {
                    /** @var msProductData $product */
                    $product = $modx->newObject('msProductData');
                }
                $pdoFetch->addTime('Checked the active modifiers');
            
                $opt_time = 0;
                foreach ($rows as $k => $row) {
                    if ($modifications) {
                        $product->fromArray($row, '', true, true);
                        $tmp = $row['price'];
                        $row['price'] = $product->getPrice($row);
                        $row['weight'] = $product->getWeight($row);
                        // A discount here, so we should replace old price
                        if ($row['price'] < $tmp) {
                            $row['old_price'] = $tmp;
                        }
                    }
                    $row['price'] = $miniShop2->formatPrice($row['price']);
                    $row['old_price'] = $miniShop2->formatPrice($row['old_price']);
                    $row['weight'] = $miniShop2->formatWeight($row['weight']);
                    $row['idx'] = $pdoFetch->idx++;
            
                    $opt_time_start = microtime(true);
                    $options = $modx->call('msProductData', 'loadOptions', array(&$modx, $row['id']));
                    $row = array_merge($row, $options);
                    $opt_time += microtime(true) - $opt_time_start;
            
                    $tpl = $pdoFetch->defineChunk($row);
                    $output[] = $pdoFetch->getChunk($tpl, $row);
                }
                $pdoFetch->addTime('Time to load products options', $opt_time);
            }
            
            $log = '';
            if ($modx->user->hasSessionContext('mgr') && !empty($showLog)) {
                $log .= '<pre class="msProductsLog">' . print_r($pdoFetch->getTime(), 1) . '</pre>';
            }
            
            // Return output
            if (!empty($returnIds) && is_string($rows)) {
                $modx->setPlaceholder('msProducts.log', $log);
                if (!empty($toPlaceholder)) {
                    $modx->setPlaceholder($toPlaceholder, $rows);
                } else {
                    return $rows;
                }
            } elseif (!empty($toSeparatePlaceholders)) {
                $output['log'] = $log;
                $modx->setPlaceholders($output, $toSeparatePlaceholders);
            } else {
                if (empty($outputSeparator)) {
                    $outputSeparator = "\n";
                }
                $output['log'] = $log;
                $output = implode($outputSeparator, $output);
            
                if (!empty($tplWrapper) && (!empty($wrapIfEmpty) || !empty($output))) {
                    $output = $pdoFetch->getChunk($tplWrapper, array(
                        'output' => $output,
                    ));
                }
            
                if (!empty($toPlaceholder)) {
                    $modx->setPlaceholder($toPlaceholder, $output);
                } else {
                    return $output;
                }
            }
              Dan
              Dan
              20 июня 2023, 19:27
              0
              код самого сниппета не нужен))) я имел в виду код вызова этого сниппета в шаблоне, который определен и категории Класс 10. Если это код из самого первого коммента, то тяжело сказать в чем проблема, ибо никаких строгих условий для выборки я не вижу. Единственное — это указание родителя, значит все таки у некоторых товаров из Класс 8 все таки привязка к 2 категориям. Или второй скрин — это не страница Категории Класс 10, а родительской категории для обоих видов (класс 8 и класс 10)
                inkeri21
                21 июня 2023, 09:12
                0
                Спасибо. Буду разбираться)) Единственное, когда в классе 10 я снимаю галочку «Показывать вложенные товары, то из класса 10 товары 8 класса исчезают. Но когда нажимаю сохранить, галочка все равно появляется.
                  Dan
                  Dan
                  21 июня 2023, 09:42
                  +1
                  Так получается у вас класс 8 внутри класс 10 находится, в этом и проблема. Вынесите класс 8 на один уровень с класс 10, либо в msProducts укажите depth 1
                  inkeri21
                  21 июня 2023, 09:18
                  0
                  Может вы мне подскажите еще. Я когда обновляю в галерее фото товара, то исчезает превью в админке. Хотя до этого, когда вставляла в галерею новое фото, в превью в админке сразу вставлялось новое фото. И в Галерее местами не поменять фото, не дает, чтобы одно стало главным, а другое второстепенным. Только если оба фото удалить и вставить сначала
                    Dan
                    Dan
                    21 июня 2023, 09:43
                    0
                    нужно смотреть журнал ошибок и консоль
                      inkeri21
                      21 июня 2023, 10:36
                      0
                      [2023-06-15 13:43:35] (ERROR @ /var/www/fastuser/data/www/stropspb.ru/core/cache/includes/elements/modsnippet/24.include.cache.php: 69) [migxResourceMediaPath]: docid could not be determined.
                      2023-06-15 12:48:35] (ERROR @ /var/www/fastuser/data/www/stropspb.ru/assets/components/modsliderrevolution/vendor/revslider/application/helpers/general_helper.php: 1164) PHP warning: Use of undefined constant MODX_SLIDER_REV_IS_ADMIN — assumed 'MODX_SLIDER_REV_IS_ADMIN' (this will throw an Error in a future version of PHP)

                      вот такие ошибки в журнале ошибок
                        Dan
                        Dan
                        21 июня 2023, 10:44
                        0
                        ошибка migxResourceMediaPath не влияет на это точно
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          13