[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
1
1 568
+13

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

Антон
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',
    ]}
    Если что то не получается и есть вопросы по функционалу — пишите пожалуйста в ТП дополнения.
    Спасибо!