[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
2 025
+13
Поблагодарить автора Отправить деньги

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

Антон
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);
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.