Сортировка значений опций товара

Добрый день.
Ситуация такая — создал опции для товара:
Лента 1250х50 мм
Лента 1250х75 мм
Лента 1250х100 мм
Но после сохранения товара они изменили порядок и стало так
Лента 1250х75 мм
Лента 1250х50 мм
Лента 1250х100 мм
А это не правильно с той точки зрения, что опции нужно выводить в порядке возрастания их цены. Есть конечно вариант сделать только цифры, например 50, 75, 100, но так не всем покупателям понятно и лучше выводить полное название.
Подскажите, как можно отсортировать опции в нужном порядке.
Пользователь Володя подсказал вариант с
github.com/vgrish/miniShop2/blob/7d60279388e7301b31fd9ad5f9862881d7ec7721/core/components/minishop2/elements/snippets/snippet.ms_options.php
и с github.com/bezumkin/miniShop2/pull/248#issuecomment-252066243
Но смешанные данные у меня не отсортировались — там где и строка и числа…
Андрей
11 декабря 2016, 16:01
modx.pro
7
7 234
0

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

Александр
16 января 2017, 15:00
1
+1
Решил подобную проблему путем прикручивания костылей создания нового модификатора. сам вид размеров у меня 450*1800*115 или 450x1800x115.
в итоге чанк вызова опций tpl.msOptions:
{foreach $options as $name => $values}
    <div class="rowform">
        <span class="levoin" for="option_{$name}">{('ms2_product_' ~ $name) | lexicon}</span>
        <select name="options[{$name}]" class="in1" id="option_{$name}">
            {$values | sort : $name}
        </select>
    </div>
{/foreach}
модификатор sort:
<?php
if (!function_exists('first_num')) {
    function first_num(&$item) {		//функции получения первого и второго размера (ширины и высоты)
        if ( strpos($item,'*') )
            $item = substr($item,0,strpos($item,'*'));
        else
            $item = substr($item,0,strpos($item,'x'));
    };
    function second_num(&$item) {
        if ( strpos($item,'*') )
            $item = substr($item,strpos($item,'*'),3);
        else
            $item = substr($item,strpos($item,'x'),3);
    }
}
$output = '';
switch ($options) {		//ищем только поле размера, остальные выводятся без сортировки
    case 'size' :
        $vals = $input;		//$vals и $vals2 будущие массивы ключей
        $vals2 = $input;
        array_walk($vals, 'first_num');		//тут собственно обрезаются элементы исходного массива
        array_walk($vals2, 'second_num');
        $arr = ( count(array_unique($vals)) == 1 ) ? array_combine($vals2, $input) : array_combine($vals, $input);  // выбираем в первом случае массив с разной шириной, во втором с разной высотой
        ksort($arr);  //непосредственно сортировка по ключам
        foreach ($arr as $val)
            $output .= '<option value="'.$val.'">'.$val.'</option>';
        break;
    default :
        foreach ($input as $val)
            $output .= '<option value="'.$val.'">'.$val.'</option>';
        break;
}
return $output;
    Андрей
    16 июня 2017, 15:19
    0
    а в каком файле модификатор sort менять?
      Александр
      21 июня 2017, 15:43
      0
      модификатор sort = сниппет sort
      т.е. просто создать сниппет и скопировать код.
      <?php
      if (!function_exists('first_num')) {
          function first_num(&$item) {
              preg_match_all("/\d+/", $item, $output_array); //создается массив из всех групп чисел строки
              $output_array = array_slice($output_array[0],0,2); //оставляется только первых 2 (ширина и высота)
              $item = implode('',$output_array);
          }
      }
      $output = '';
      switch ($options) {
          case 'size' :         //ищем только поле размера, остальные выводятся без сортировки
              $vals = $input;     //в $vals копируется исходный массив
              array_walk($vals, 'first_num');     //создаются ключи      
              $ind = [];
              for ($i = 0; $i < count($vals); $i++) {
                  $ind[$i] = $vals[$i] + $i;  //придается уникальность каждому ключу            
              }
              $arr = array_combine($ind, $input); //объединяются ключи и значения.
              ksort($arr);        //непосредственно сортировка по ключам
              foreach ($arr as $val)
                  $output .= '<option value="'.$val.'">'.$val.'</option>';
              break;
          default :
              foreach ($input as $val)
                  $output .= '<option value="'.$val.'">'.$val.'</option>';
              break;
      }
      return $output;
      я с того времени его переписал немного… это сниппет с рабочего сайта
        Андрей
        21 июня 2017, 16:23
        0
        Спасибо

        Решил таким макаром

        [[!msOptionsPrice.option?
        &options=`color,size`
        &sortOptions=`
        size:SORT_ASC:SORT_NUMERIC`
        ]]
    Володя
    21 июня 2017, 16:18
    3
    0
    можно еще используя феном
    {foreach $options as $name => $values}
        {do $values|sort}
    	...
    {/foreach}
    настройка pdotools_fenom_php должна быть Да
      Андрей
      21 июня 2017, 16:32
      0
      По идее в настройках msoptionprice «нет» в строке msoptionsprice_sort_modification_option_values должно решать данную проблему, или нет?
      Можно ли в карточке товара в вкладке «модификация» при редактировании модификации оставить поля цена и старая цена? И можно ли в выпадающем меню «Значение» сделать пагинацию на 15 позиций а не 10?
        Володя
        21 июня 2017, 16:38
        0
        По идее в настройках msoptionprice «нет» в строке msoptionsprice_sort_modification_option_values должно решать данную проблему, или нет?
        о какой проблеме речь?
        Я говорю о простой сортировке опций, вы о сортировке опций у учетом стоимости.
        Никакой проблемы это не решает.
        Если вам нужно выводит опции с учетом цены в частном случае возможно использовать для этого сниппет вывода модификаций.

        Можно ли в карточке товара в вкладке «модификация» при редактировании модификации оставить поля цена и старая цена?
        да, в новой версии вышла сегодня есть настройка для этого, обновитесь и настройте.

        И можно ли в выпадающем меню «Значение» сделать пагинацию на 15 позиций а не 10?
        нет
          Андрей
          21 июня 2017, 16:58
          0
          Ситуация следующая.

          Ввожу свойство тавара «размер» 80х190,195,200. 90х190,195,200. 100х190,195,200… 190х190,195,200

          Сохраняю, всё ок, порядок не меняется.

          Как только начинаю вводить модификации 80х и 90х откидываются в конец списка.
            Володя
            21 июня 2017, 17:04
            0
            пишите в ТП с указанием доступов к админке и ссылкой на тестируемый товар, надо смотреть по месту.
            Спасибо.
              Александр
              21 июня 2017, 17:38
              0
              мое решение справляется с этим, хотя оно и не такое изящное :)
        Andrey
        04 января 2018, 13:07
        0
        А как выводить опции в том же порядке, в котором они лежат во вкладке Модификации?
          Александр
          29 января 2018, 12:40
          0
          Решили свою задачу? тоже актуально
            Andrey
            29 января 2018, 14:25
            0
            так и не вышло…
              Евгений
              22 августа 2020, 12:49
              0
              Присоединюсь к вопросу — хотелось бы выводить опции в том порядки, в каком они в админке (благо там они драг н дропом отлично переставляются)
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          14