Вывод параметра msoption в превью товара

Подскажите, как можно реализовать вывод размеров товара в превью товара. Вот здесь пример: www.childrensalon.com/girl?order=new.
Далее вытекает второй вопрос: как можно вывести значение параметра minishop (size в нашем случае, тип msoption) в виде простого списка?
Станислав
03 июля 2015, 16:30
modx.pro
1
7 096
0

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

Василий Наумкин
04 июля 2015, 04:48
0
По моему, с обоими вопросами должен помочь сниппет msOptions — смотри его параметры.
    Станислав
    05 июля 2015, 00:22
    0
    Да, но этот сниппет выводит значения параметра только в шаблоне самого товара. А мне нужно в теле блока «ms2_product» в каталоге. Вот что имеется пока. Вводит сообщение: «This resource is not instance of msProduct class.»
    [[!msOptions?name=`size` 
    &tplOuter=`INLINE@ <table><tr><td>Размеры:</td></tr>[[+rows]]</table>` 
    &tplInner=`<tr><td>[[+value]]</td></tr>`
    ]]
      Василий Наумкин
      05 июля 2015, 05:14
      +1
      Может, нужно как-то указать id товара, для которого ты собрался выводить опции?

      Как, по твоему, msOptions должен сам об этом догадаться? Ведь ты вызываешь его не на странице товара и $modx->resource->id содержит «not instance of msProduct class».
    Станислав
    05 июля 2015, 10:14
    +1
    Все получилось, благодарю за наводку.
    [[!msOptions? &product=`[[+id]]` &name=`size` &tplOuter=`@INLINE <table><tr><td>Размеры:</td></tr>[[+rows]]</table>` &tplRow=`@INLINE <tr><td>[[+value]]</td></tr>`]]
      Денис Богдановский
      05 июля 2015, 17:50
      0
      Интересно, а как вывести больше одной опции в превью товара?
        Станислав
        07 июля 2015, 09:43
        0
        Для каждой следующей опции вызывать сниппет [[!msoptions]]
          Денис Богдановский
          07 июля 2015, 09:56
          0
          Я тоже об этом подумал, но показалось не совсем правильным.
            Денис Богдановский
            07 июля 2015, 10:07
            0
            msProductOption выводит все опции, но только на странице товара, если вызвать в превью — белая страница.
              Станислав
              08 июля 2015, 23:37
              0
              У меня замечательно все выводится. Не забудьте прописать в каждом вызове сниппета параметры:
              &product=`[[+id]]` &name=`имя опции`
              Возможно, ошибки возникают из за пустого значения поля. Тогда надо делать проверку:
              [[!msOptions:toPlaceholder=`result`? &product=`[[+id]]` &name=`имя опции`]]
              [[+result:isnot=``:then=`[[+result]] `]]
                Денис Богдановский
                09 июля 2015, 00:06
                0
                а не я не msOptions а про msProductOption… это другой сниппет. Но все равно спасибо :)
                  Станислав
                  09 июля 2015, 08:25
                  0
                  Такого сниппета вообще нет. Это название mysql таблицы.
                    Денис Богдановский
                    09 июля 2015, 10:32
                    0
                    В версии miniShop 2.2.0 msProductOption работает аналогично msOptions но выводит все опции товара. С его помощью можно легко построить таблицу характеристик. Удобная штука, но, как ч уже говорил не работает в превью товара, приходиться несколько раз вызывать msOptions.

                    <?php
                    /* @var array $scriptProperties */
                    /* @var miniShop2 $miniShop2 */
                    $miniShop2 = $modx->getService('minishop2');
                    $miniShop2->initialize($modx->context->key);
                    
                    /* @var pdoFetch $pdoFetch */
                    if (!$modx->loadClass('pdofetch', MODX_CORE_PATH . 'components/pdotools/model/pdotools/', false, true)) {return false;}
                    $pdoFetch = new pdoFetch($modx, $scriptProperties);
                    
                    $output = '';
                    
                    if (empty($product) && !empty($input)) {$product = $input;}
                    if (empty($outputSeparator)) {$outputSeparator = "\n";}
                    $options = explode(",",$modx->getOption('options',$scriptProperties,''));
                    
                    $product = !empty($product) ? $modx->getObject('msProduct', $product) : $product = $modx->resource;
                    if (!($product instanceof msProduct)) {
                        $output = 'This resource is not instance of msProduct class.';
                    }
                    
                    $optionKeys = $product->getOptionKeys();
                    $productData = $product->toArray();
                    
                    $ignoreOptions = explode(',', trim($modx->getOption('ignoreOptions', $scriptProperties, '')));
                    
                    if (!empty($groups)) {
                        $groups = explode(',', trim($groups));
                        $groups = array_map('trim', $groups);
                    } else if ($groups === '0') {
                        $groups = array(0);
                    }
                    
                    if(count($optionKeys) > 0){
                        $rows = array();
                        foreach ($optionKeys as $key) {
                            if (in_array($key, $ignoreOptions)) continue;
                            $productOption = array();
                            foreach ($productData as $dataKey => $dataValue) {
                                $dataKey = explode('.', $dataKey);
                                if ($dataKey[0] == $key && (count($dataKey) > 1)) {
                                    $productOption[$dataKey[1]] = $dataValue;
                                }
                            }
                    
                            // Пропускаем, если характеристика группы не указана в параметре &groups
                            if (!empty($groups) && !in_array($productOption['category'], $groups) && !in_array($productOption['category_name'], $groups)) continue;
                            if (isset($groups[0]) && ($groups[0] == 0) && ($productOption['category'] != 0)) continue;
                    
                            if (is_array($productData[$key])) {
                                $values = array();
                                foreach ($productData[$key] as $value) {
                                    $params = array_merge($productData, $productOption, array('value' => $value));
                                    $values[] = $pdoFetch->getChunk($tplValue, $params);
                                }
                                $productOption['value'] = implode($valuesSeparator, $values);
                            } else {
                                $productOption['value'] = $productData[$key];
                            }
                    
                            // Пропускаем, если значение пустое
                            if ($hideEmpty && empty($productOption['value'])) continue;
                    
                            $rows[] = $pdoFetch->getChunk($tplRow, array_merge($productData, $productOption));
                        }
                        $rows = implode($outputSeparator, $rows);
                    
                        $output = empty($tplOuter)
                            ? $pdoFetch->getChunk('', array_merge($productData, array('rows' => $rows)))
                            : $pdoFetch->getChunk($tplOuter, array_merge($scriptProperties, $productData, array('rows' => $rows)));
                    }
                    else{
                        $output = !empty($tplEmpty)
                            ? $pdoFetch->getChunk($tplEmpty, array_merge($scriptProperties, $productData))
                            : '';
                    }
                    
                    return $output;
                      Victor
                      12 февраля 2016, 09:01
                      0
                      [[!msProductOptions? &product=`[[+id]]`]]
        Станислав
        10 июля 2015, 20:37
        0
        Кстати, вывод параметров в превью с помощью msOptions жутко тормозит работу msFilter2.
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          14