Вывод опций minishop2 в выпадающем списке на главной странице запросом к базе

Всем привет, всех с праздниками!!! Подскажите пожалуйста, возможно ли и как подтянуть опции minishop2 в выпадающем списке не на странице товара, а на главной. Так понимаю, нужно делать запросы к базе, но в этом деле я новичёк.

Задача дать возможность предварительного выбора опций для передачи их в get-параметры для поиска по сайту по данным опциям.

Как реализовать поиск, мне помогли и подсказали в этой заметке: modx.pro/help/22865

Так что дело вроде как за малым. Осталось как-то подтянуть опции.

Заранее спасибо!
Константин
04 мая 2022, 09:13
modx.pro
688
0

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

Артур Шевченко
06 мая 2022, 11:35
+1
Код ниже вернёт массив с данными всех опций. Его можно феномом разобрать или дописать этот код и возвращать уже готовый hml.
$options = $modx->getIterator('msOption');
$output = array();
foreach($options as $option){
    $output[] = $option->toArray();
}
return $output;
    Константин
    06 мая 2022, 12:12
    0
    Спасибо!
    1. Создал сниппет с этим кодом prnt.sc/ZuVvCHGba7Ny
    2. Вывел сниппет в шаблоне prnt.sc/szcJrmnmSQ2O
    3. Вот что получилось: ARRAY prnt.sc/vVOULK-zDUZh
      Артур Шевченко
      06 мая 2022, 12:32
      +1
      Всё правильно, я так и написал
      Код ниже вернёт массив с данными всех опций.
      Массив надо разобрать. Вот ссылка на документацию по foreach в fenom. Либо можно сделать это в сниппите тем же foreach, только в php.
        Константин
        11 мая 2022, 08:50
        0
        То есть, в сниппете мы сделали массив с опциями под названием option: prnt.sc/2KP4LPH3PSi6
        А в шаблоне феном разбираем этот массив так? prnt.sc/n_EJth9nw9pr
        Тогда на странице пустое поле: prnt.sc/iUZ68adwGFtX
          Константин
          11 мая 2022, 09:06
          0
          Нашел такой вариант вывода опций, но выводятся только названия опций, а не значения: prnt.sc/EmEinITQ3NQt

          <?php
          $options = $modx->getIterator('msOption');
          $output = '';
          foreach ($options as $opt){
          $values[] = $opt->get('caption').'=='.$opt->get('key');
          }
          $output = implode('||',$values);

          return $output;
            Константин
            11 мая 2022, 09:43
            0
            Ведь задача вывести значения списком, например МаркиL mazda, kia, bmw… Модели: CX-7, Rio, X6

            Пробую написать сниппет такого плана.

            <?php
            $options = $modx->getIterator('msOption');
            $output = array();
            $onlyoptions = marka, model;
            foreach($options as $onlyoptions ){
            $output[] = $onlyoptions ->get('key').'=='.$option->get('value');
            }
            return $output;

            Не работает…
              Артур Шевченко
              11 мая 2022, 13:46
              +1
              Константин, я же дал работающий код, а вы даже не смогли найти информацию о том, как сохранить результат работы сниппета в переменную.
              {set $options = 'SnippetName' | snippet:[]}
              {foreach $options as $option}
              чтобы увидеть все поля в массиве.
              {$option | print} 
              {/foreach}
                Константин
                11 мая 2022, 14:22
                0
                Спасибо, я просто очень новичок в программировании, почти ноль в php по этому так туплю.
                Понял, как вывести название полей.
                Но не могу понять, как вывести именно значения конкретного поля: prnt.sc/2FKOYRKsdTPl
                То есть не МОДЕЛЬ, а его значения: RIO, SOLARIS.
                Может не правильно изначально сформулировал.
                  Артур Шевченко
                  11 мая 2022, 14:50
                  +1
                  Ок, тогда, наверное, можно использовать стандартный сниппет в свойстве product укажи id любого товара у которого есть нужная опция
                    Константин
                    11 мая 2022, 14:55
                    0
                    То есть создать технический товар, который будет содержать все существующие значения опций, указать его в product, но скрыть от индексации и публикации? Спасибо за идею. Точно же.
                      Константин
                      11 мая 2022, 16:24
                      0
                      Получилось вывести, но почему-то значения опций идут через запятую: prnt.sc/tttKEXSIDpZU

                      Есть ли возможность каждое значение опции отдельным полем в выпадающем списке выводить?
                        Артур Шевченко
                        11 мая 2022, 16:39
                        +1
                        Загляни в чанк посмотри, что там если там join убери, если нет, то используй модификатор split для разбиения строки в массив.
                          Константин
                          11 мая 2022, 20:02
                          0
                          Join убрал, заменил на split
                          Теперь чанк такой:
                          <select name="marka" class="no-border jsSelect">
                          {foreach $options as $option}
                          
                                      {if $option.value is array}
                                         <option value="{$option.value | split : ', '}">{$option.value | split  : ', '}</option>
                                      {else}
                                          <option value="{$option.value}">{$option.value}</option>
                                      {/if}
                                      
                          {/foreach}
                          </select>

                          И выводит, как я уже понял, массив Array: prntscr.com/bBdan3Y7zv1y

                          Выходит его теперь как-то разобрать foreach menom?
                            Артур Шевченко
                            11 мая 2022, 20:17
                            +1
                            Я сейчас тебя удивлю, но в родном чанке от minishop2 уже всё за тебя написали.
                            {foreach $options as $name => $values}
                                <div class="form-group row align-items-center">
                                    <label class="col-6 col-md-3 text-right text-md-left col-form-label" for="option_{$name}">{('ms2_product_' ~ $name) | lexicon}:</label>
                                    <div class="col-6 col-md-9">
                                        <select name="options[{$name}]" class="form-control col-md-6" id="option_{$name}">
                                            {foreach $values as $value}
                                                <option value="{$value}">{$value}</option>
                                            {/foreach}
                                        </select>
                                    </div>
                                </div>
                            {/foreach}
                            Константин
                            12 мая 2022, 17:23
                            0
                            Блин, туплю капец.

                            Вот вызов сниппета:
                            {$_modx->runSnippet('msProductOptions', [
                            'product' => 8875,
                            'tpl' => 'msProductOptionsSearchTpl'
                            'onlyOptions' => 'marka'
                            ])}
                            Вот вместо прошлого кода вставил это и что получилось:

                            <select name="marka" class="no-border jsSelect">
                            {foreach $options as $name => $values}
                                <div class="form-group row align-items-center">
                                    <label class="col-6 col-md-3 text-right text-md-left col-form-label" for="option_{$name}">{('ms2_product_' ~ $name) | lexicon}:</label>
                                    <div class="col-6 col-md-9">
                                        <select name="options[{$name}]" class="form-control col-md-6" id="option_{$name}">
                                            {foreach $values as $value}
                                                <option value="{$value}">{$value}</option>
                                            {/foreach}
                                        </select>
                                    </div>
                                </div>
                            {/foreach}
                            
                            </select>
                            И выводит кракозяблу prntscr.com/W-SvGf1Es-rQ
                            Артур Шевченко
                            12 мая 2022, 18:23
                            +1
                            Ты похоже и html недавно увидел, да? Ты в select запихнул div внутри которого другой select браузер в шоке.
                            Константин
                            12 мая 2022, 18:27
                            0
                            Да, походу)
                            Но когда такой код чанка

                            {foreach $options as $name => $values}
                                <div class="form-group row align-items-center">
                                    <label class="col-6 col-md-3 text-right text-md-left col-form-label" for="option_{$name}">{('ms2_product_' ~ $name) | lexicon}:</label>
                                    <div class="col-6 col-md-9">
                                        <select name="options[{$name}]" class="form-control col-md-6" id="option_{$name}">
                                            {foreach $values as $value}
                                                <option value="{$value}">{$value}</option>
                                            {/foreach}
                                        </select>
                                    </div>
                                </div>
                            {/foreach}
                            Вот что выводит: prntscr.com/ujPFA_6LX2nQ

                            Опять кракозябла
                            Артур Шевченко
                            12 мая 2022, 18:44
                            +2
                            А я ссылку на msProductOptions давал разве? Ты хоть описания сниппетов читай.
                            Константин
                            12 мая 2022, 18:52
                            0
                            Заработало!!! Спасибо!!!
                            Артур Шевченко
                            12 мая 2022, 22:12
                            +1
                            Пожалуйста, поставь хоть один плюсик что ли…
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        20