[msOptionsPrice2] - Связанные опции модификаций

[msOptionsPrice2] — В новой версии добавлен функционал связанных опций.
Довольно часто встает вопрос о отображении тех или иных опций в зависимости от другой(их), теперь данный функционал есть из коробки.

под катом подробности


Данный функционал реализует сниппет msOptionsPrice.option, он аналогичен сниппету msOptions и служит для вывода опций модификаций продукта.
Добавлен параметр constraintOptions — служит для задания ограничений опций, указывается в формате json, либо сразу в виде массива.

Пример вызова
{'msOptionsPrice.option' | snippet : [
'options' => 'phytomodule_color,equipment,frame_color',
'tpl' => 'phytomodule.option',
'processColors' => 1,
'constraintOptions' => [
    'phytomodule_color' => ['sizes'],
    'equipment' => ['sizes','phytomodule_color'],
    'frame_color' => ['sizes','phytomodule_color','equipment']
]
]}

В данном случае мы указываем что:
— опция phytomodule_color зависит от опции sizes
— опция equipment зависит от опции sizes и phytomodule_color
— опция frame_color зависит от опции sizes и phytomodule_color и equipment

Пример чанка опций
{foreach $options as $name => $values}
    <div class="sm-text"><b>{('ms2_product_' ~ $name) | lexicon}</b></div>
    <div
        {if $constraints[$name]}
            data-constraints="{$constraints[$name]| json_encode: 256 | htmlentities}"
        {/if}
        >
        {foreach $values as $value index=$index}
         
        <label class="input-parent">
        <input type="radio" value="{$values[$index]}" name="options[{$name}]" 
            {if $index == 0}checked="checked"{/if}
            
            {if $constraints[$name]}
                data-relations="{$relations[$name][$value]| json_encode: 256 | htmlentities}"
            {/if}
                    
            />
            {$values[$index]}
        </label>
    
        {/foreach}
    </div>
{/foreach}

data-constraints — задаем ограничения опции
data-relations — задаем связи опций
input-parent — класс, необходим для скрытия/ отображения контейнера с опцией

аналогично задается и вывод селектами
{foreach $options as $name => $values}
    <div class="form-group">
        <label class="col-md-2 control-label" for="option_{$name}">{('ms2_product_' ~ $name) | lexicon}:</label>
        <div class="col-md-10">
              
            <select name="options[{$name}]" class="input-sm form-control" id="option_{$name}"
                {if $constraints[$name]}
                    data-constraints="{$constraints[$name]| json_encode: 256 | htmlentities}"
                {/if}
                >
                {foreach $values as $value index=$index }
                    <option value="{$value}"
                     
                    {if $constraints[$name]}
                        data-relations="{$relations[$name][$value]| json_encode: 256 | htmlentities}"
                    {/if}
                         
                    >{$value}</option>
                {/foreach}
            </select>
        </div>
    </div>
{/foreach}
пример s6200.h3.modhost.pro/6/12010.html

ps. Всем спасибо за внимание, компонент уже в репозитории modstore.pro/packages/ecommerce/msoptionsprice2
Володя
24 июня 2017, 10:18
modx.pro
2
3 435
+13
Поблагодарить автора Отправить деньги

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

Антон
24 июня 2017, 18:18
+1
В данном случае мы указываем что:
— опция phytomodule_color зависит от опции sizes
— опция equipment зависит от опции sizes и phytomodule_color
— опция frame_color зависит от опции sizes и phytomodule_color и equipment
А и снизу-вверх можно указать зависимости?
Например, чтобы sizes зависел от phytomodule_color.
Может человек захочет подобрать стакан под цвет туфель, а размер его мало волнует.
    Володя
    24 июня 2017, 18:22
    1
    -2
    да вообще порядок не должен иметь никакого значения, просто описал по порядку и все…
    главное указать у опции связь/зависимость.
      Антон
      24 июня 2017, 18:32
      0
      т.е. никаких «циклических ссылок» не возникнет если одновременно phytomodule_color будет зависеть от sizes и sizes будет зависеть от phytomodule_color.
        Володя
        24 июня 2017, 18:39
        +3
        зачем вы подменяете понятия?
        вы спросили про порядок —
        А и снизу-вверх можно указать зависимости?
        Например, чтобы sizes зависел от phytomodule_color.
        про него я вам и ответил.
        теперь вы спрашиваете
        сли одновременно phytomodule_color будет зависеть от sizes и sizes будет зависеть от phytomodule_color.
        это уже иная ситуация. И честно говоря не тестировал такое…

        Пакет доступен для теста на modhost.pro/
        создавайте тестовый сайт, моделируйте нужную вам ситуацию и уже по факту задавайте вопросы.
        У меня не семь пядей во лбу чтоб все ситуации предугадать…

        Спасибо!

          Антон
          24 июня 2017, 23:48
          0
          Видите там букву — «И». «И» — означает одновременное выполнение обоих условий.
          У меня сразу был вопрос именно про одновременное указание нескольких зависимостей, в разных направлениях.
        Володя
        24 июня 2017, 19:01
        0
        вообще предполагаемо так делать нельзя, так как несуществующие комбинации становятся неактивными. По факту получится активный «срез» опций. Если опций пара, то разблокировать данный срез станет невозможно, если опций более возможно другие варианты событий.

          Роман
          13 января 2019, 00:45
          0
          Здравствуйте, а можно эти неактивные, несуществующие комбинации не показывать?
            Роман
            13 января 2019, 00:53
            0
            Здравствуйте, а можно эти неактивные, несуществующие комбинации не показывать?
              Роман
              13 января 2019, 01:28
              0
              Разобрался, случайно класс input-parent удалил.
              Возник другой вопрос: Как изменить порядок значений опций?
              В свойствах товара порядок, как надо:
              ,
              а при выводе все значения опций выстраиваются в алфавитном порядке:
      Сергей
      Сергей
      04 августа 2017, 18:03
      0
      1. Можно будет сменить домен?
      2. Как храниться все это дело в БД? Смогу ли я выгрузить в 1С остатки адекватно, т.е. товар с определенной опцией как отдельный товар?
        Володя
        04 августа 2017, 18:09
        0
        1. Можно будет сменить домен?
        modstore.pro/help#help/3/2
        2. Как храниться все это дело в БД? Смогу ли я выгрузить в 1С остатки адекватно, т.е. товар с определенной опцией как отдельный товар?
        модификации в виде отдельной таблицы, это не товар
          Сергей
          Сергей
          04 августа 2017, 19:51
          0
          Угу, спасибо! В доках не нашел — сколько картинок можно приклеить к модификации?
      Виктор
      29 января 2018, 21:11
      0
      Приветствую! Обкатываю сейчас дополнение — замечательная вещь!

      Со связанными опциями никак не разберусь…
      Завис уже тут — куда этот пример вызова поставить?

      {'msOptionsPrice.option' | snippet : [
      'options' => 'phytomodule_color,equipment,frame_color',
      'tpl' => 'phytomodule.option',
      'processColors' => 1,
      'constraintOptions' => [
          'phytomodule_color' => ['sizes'],
          'equipment' => ['sizes','phytomodule_color'],
          'frame_color' => ['sizes','phytomodule_color','equipment']
      ]
      ]}
      Я так понял, этот пример показан в связке с дополнением msOptionsColor и с нестандартными опциями?
      Тоже немного запутали незнакомые обозначения)
        Володя
        29 января 2018, 21:31
        0
        Добрый вечер.
        Завис уже тут — куда этот пример вызова поставить?
        сниппет msOptionsPrice.option служит для вывода опций модификаций.
        Поставить туда где необходим вывод опций.

        Я так понял, этот пример показан в связке с дополнением msOptionsColor и с нестандартными опциями?
        да, но он так же работает и с обычными опциями товара, такими как size и color.
        {'msOptionsPrice.option' | snippet : [
        'options' => 'size,color',
        ]}
        Если что то не получается и есть вопросы по функционалу — пишите пожалуйста в ТП дополнения.
        Спасибо!
        Ilya Ev
        05 марта 2019, 13:44
        0
        Добрый день, а можно как то вывести картинки прикрепленные к опциям в фильтре?
        Т.е. вывести фильтр mFilter2 с картинками модификаций?
          Ilya Ev
          05 марта 2019, 14:58
          0
          Покапавшись. с классом msopFilters msop|name выводит имя опции а как к ней путь до картинки добавить.
            Ilya Ev
            07 марта 2019, 11:28
            0
            Может кому пригодиться как вариант решения, но думаю не самый оптимальный.
            заполняем артикул у модификации именем файла по типу (white_color).

            вызываем mfilter2 с параметрами:
            ...
            'filters'=>'msop|article'
            'tplFilter.row.msop|article'=>'@INLINE <label for="mse2_{$table}{$delimeter}{$filter}_{$idx}" class="{$disabled} {$checked}">
            	<input type="checkbox" name="{$filter_key}" id="mse2_{$table}{$delimeter}{$filter}_{$idx}" value="{$value}" {$checked} {$disabled}/> <img alt="{$title}" src="/img/colors/{$title}.jpg" class="img-circle" /> {$_modx->lexicon("mse2_filter_colors_" ~ $title)} <sup>{$num}</sup>
            </label>',
            ...
            картинки с цветом кладем в указанную папку (/img/colors/white_color.jpg)
            в словарях создаем запись mse2_filter_colors_white_color = Белый цвет.

            В итоге получаем фильтрацию по цветам всех модификаций с картинкой и русским названием фильтра).

            Если кто-то подскажет как вывести все уникальные значения этого поля буду признателен. Код ниже выводит без уникальности все подряд, как его поправить?
            {$_modx->runSnippet('msProducts', [
            	'parents'=>$_modx->config.catalog,'limit'=>30,
            	'innerJoin'=>'{
            		"msopModification":{"alias":"msopModification","on":"msopModification.rid = msProduct.id"}
            	}',
            	'select'=>'{"msopModification":"article"}',
            	'groupby'=>'msopModification.article',
            	'tpl'=>'@INLINE <p>{$article}</p>'
            		
            ])}
              Ilya Ev
              07 марта 2019, 15:21
              0
              на феном не осилил, накидал снипет на чистом sql может нужно кому:
              $sql ='SELECT DISTINCT article FROM modx_msop_modifications WHERE article!="" AND rid IN (SELECT id FROM modx_site_content WHERE parent='.$products.')';
              $q = $modx->prepare($sql);
              $q->execute();
              $result = $q->fetchAll(PDO::FETCH_ASSOC);
          Дарья Сизова
          13 апреля 2020, 19:14
          0
          Не могли бы вы подсказать, как при вызове сниппета msOptionsPrice.option в стандартном синтаксисе написать эти зависимости?
          'constraintOptions' => [
              'phytomodule_color' => ['sizes'],
              'equipment' => ['sizes','phytomodule_color'],
              'frame_color' => ['sizes','phytomodule_color','equipment']
          ]
          у меня вот так:
          [[!msOptionsPrice.option?
             &options=`shirinadivana,shirinaspalnogo,obivka`
             &tpl=`tpl.msOptionsPrice.unify`
             &processColors=`1`
             &constraintOptions=`....?`
          ]]
            Артем
            13 апреля 2020, 19:42
            0
            Вероятно, в JSON
            {"phytomodule_color":["sizes"],"equipment":["sizes","phytomodule_color"],"frame_color":["sizes","phytomodule_color","equipment"]}
              Дарья Сизова
              13 апреля 2020, 20:00
              0
              Благодарю Вас! Помогло!

              Артем, а можете еще подсказать, как адекватно вывести название опции?
              {('ms2_product_' ~ $name) | lexicon} выводит «ms2_product_size» вместо «Размер». Такой вопрос я уже находила тут, ответ на него дали, что нужно подгрузить лексиконы в чанке корзины
              {$_modx->lexicon->load('minishop2:product')}
              Но я не очень сильна во всем этом и не поняла, как же это сделать… А может быть есть и более простое решение?
                Артем
                13 апреля 2020, 20:13
                0
                Лексиконы подгружает сам минишоп, если вызываются его сниппеты. В вашем случае, видимо, они не вызываются, поэтому и лексиконы не работают. Соответственно, вам нужно подгрузить их самостоятельно, как посоветовали в том топике.

                {$_modx->lexicon->load('minishop2:product')}
                вот это нужно вставить в тот же чанк, где у вас не работают лексиконы, в самое начало
                  Дарья Сизова
                  13 апреля 2020, 20:22
                  0
                  У меня установлено два дополнения: miniShop2 и msOptionsPrice2. Лексикон не работает при вызове сниппета msOptionsPrice.option. Простите меня за тупость мою, но все равно не пойму, куда вставить указанную строку… Вставила в чанк шаблона для сниппета tpl.msOptionsPrice.unify, но это не сработало.
                  [[!msOptionsPrice.option?
                      &options=`shirinadivana,shirinaspalnogo,obivka`
                      &tpl=`tpl.msOptionsPrice.unify`
                      &processColors=`1`
                      &constraintOptions=`{"obivka":["shirinadivana"],"shirinaspalnogo":["shirinadivana","obivka"]}`
                  ]]
                  код tpl.msOptionsPrice.unify
                  {foreach $options as $name => $values}
                      <div class="sm-text"><b>{('ms2_product_' ~ $name) | lexicon}</b></div>
                      <div
                          {if $constraints[$name]}
                              data-constraints="{$constraints[$name]| json_encode: 256 | htmlentities}"
                          {/if}
                          >
                          {foreach $values as $value index=$index}
                           
                          <label class="input-parent">
                          <input type="radio" value="{$values[$index]}" name="options[{$name}]" 
                              {if $index == 0}checked="checked"{/if}
                              
                              {if $constraints[$name]}
                                  data-relations="{$relations[$name][$value]| json_encode: 256 | htmlentities}"
                              {/if}
                                      
                              />
                              {$values[$index]}
                          </label>
                      
                          {/foreach}
                      </div>
                  {/foreach}
                    Артем
                    13 апреля 2020, 20:29
                    0
                    должно быть вот так

                    {$_modx->lexicon->load('minishop2:product')}
                    
                    {foreach $options as $name => $values}
                        <div class="sm-text"><b>{('ms2_product_' ~ $name) | lexicon}</b></div>
                        <div
                            {if $constraints[$name]}
                                data-constraints="{$constraints[$name]| json_encode: 256 | htmlentities}"
                            {/if}
                            >
                            {foreach $values as $value index=$index}
                             
                            <label class="input-parent">
                            <input type="radio" value="{$values[$index]}" name="options[{$name}]" 
                                {if $index == 0}checked="checked"{/if}
                                
                                {if $constraints[$name]}
                                    data-relations="{$relations[$name][$value]| json_encode: 256 | htmlentities}"
                                {/if}
                                        
                                />
                                {$values[$index]}
                            </label>
                        
                            {/foreach}
                        </div>
                    {/foreach}
                      Дарья Сизова
                      13 апреля 2020, 20:32
                      0
                      Да, именно так и не работает… (((
                        Дарья Сизова
                        13 апреля 2020, 20:41
                        0
                        Все, разобралась! У меня же кастомные опции не хотели отображаться. Я создала для них записи в словаре miniShop — и все заработало.
                        Спасибо Вам за участие!
              Игорь
              28 сентября 2020, 20:01
              0
              Здравствуйте! Никак не могу понять:
              {'msOptionsPrice.option' | snippet : [
              'options' => 'size,height_',
               'processColors' => 1,
              'tpl' => 'tpl.myMsoptions2', 'sortOptions' => 'size:SORT_DESC:SORT_STRING:r', 
              'constraintOptions' => [
               'size' => ['height_']
              ]
              ]}
              — этот код работает, а если наоборот (height_ от size):
              {'msOptionsPrice.option' | snippet : [
              'options' => 'size,height_',
               'processColors' => 1,
              'tpl' => 'tpl.myMsoptions2', 'sortOptions' => 'size:SORT_DESC:SORT_STRING:r', 
              'constraintOptions' => [
                  'height_' => ['size']
              ]
              ]}
              — то нет…
              p/s height_ — это опция, а size — стандартное свойство minishop, версия модуля — последняя
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                29