Сортировка значений опций товара
        Добрый день.
Ситуация такая — создал опции для товара:
Подскажите, как можно отсортировать опции в нужном порядке.
Пользователь Володя подсказал вариант с
github.com/vgrish/miniShop2/blob/7d60279388e7301b31fd9ad5f9862881d7ec7721/core/components/minishop2/elements/snippets/snippet.ms_options.php
и с github.com/bezumkin/miniShop2/pull/248#issuecomment-252066243
Но смешанные данные у меня не отсортировались — там где и строка и числа…
    
    
                                                                                
            Ситуация такая — создал опции для товара:
Лента 1250х50 ммНо после сохранения товара они изменили порядок и стало так
Лента 1250х75 мм
Лента 1250х100 мм
Лента 1250х75 ммА это не правильно с той точки зрения, что опции нужно выводить в порядке возрастания их цены. Есть конечно вариант сделать только цифры, например 50, 75, 100, но так не всем покупателям понятно и лучше выводить полное название.
Лента 1250х50 мм
Лента 1250х100 мм
Подскажите, как можно отсортировать опции в нужном порядке.
Пользователь Володя подсказал вариант с
github.com/vgrish/miniShop2/blob/7d60279388e7301b31fd9ad5f9862881d7ec7721/core/components/minishop2/elements/snippets/snippet.ms_options.php
и с github.com/bezumkin/miniShop2/pull/248#issuecomment-252066243
Но смешанные данные у меня не отсортировались — там где и строка и числа…
Комментарии: 14
                Решил подобную проблему путем прикручивания костылей создания нового модификатора. сам вид размеров у меня 450*1800*115 или 450x1800x115.
в итоге чанк вызова опций tpl.msOptions:
                    в итоге чанк вызова опций 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;            
                а в каком файле модификатор sort менять?            
                    
                модификатор 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;я с того времени его переписал немного… это сниппет с рабочего сайта            
                Спасибо
Решил таким макаром
[[!msOptionsPrice.option?
&options=`color,size`
&sortOptions=`
size:SORT_ASC:SORT_NUMERIC`
]]
                    Решил таким макаром
[[!msOptionsPrice.option?
&options=`color,size`
&sortOptions=`
size:SORT_ASC:SORT_NUMERIC`
]]
                можно еще используя феном
                    {foreach $options as $name => $values}
    {do $values|sort}
	...
{/foreach}настройка pdotools_fenom_php должна быть Да            
                По идее в настройках msoptionprice «нет» в строке msoptionsprice_sort_modification_option_values должно решать данную проблему, или нет?
Можно ли в карточке товара в вкладке «модификация» при редактировании модификации оставить поля цена и старая цена? И можно ли в выпадающем меню «Значение» сделать пагинацию на 15 позиций а не 10?
                    Можно ли в карточке товара в вкладке «модификация» при редактировании модификации оставить поля цена и старая цена? И можно ли в выпадающем меню «Значение» сделать пагинацию на 15 позиций а не 10?
По идее в настройках msoptionprice «нет» в строке msoptionsprice_sort_modification_option_values должно решать данную проблему, или нет?о какой проблеме речь?
Я говорю о простой сортировке опций, вы о сортировке опций у учетом стоимости.
Никакой проблемы это не решает.
Если вам нужно выводит опции с учетом цены в частном случае возможно использовать для этого сниппет вывода модификаций.
Можно ли в карточке товара в вкладке «модификация» при редактировании модификации оставить поля цена и старая цена?
да, в новой версии вышла сегодня есть настройка для этого, обновитесь и настройте.
И можно ли в выпадающем меню «Значение» сделать пагинацию на 15 позиций а не 10?нет
                Ситуация следующая.
Ввожу свойство тавара «размер» 80х190,195,200. 90х190,195,200. 100х190,195,200… 190х190,195,200
Сохраняю, всё ок, порядок не меняется.
Как только начинаю вводить модификации 80х и 90х откидываются в конец списка.
                    Ввожу свойство тавара «размер» 80х190,195,200. 90х190,195,200. 100х190,195,200… 190х190,195,200
Сохраняю, всё ок, порядок не меняется.
Как только начинаю вводить модификации 80х и 90х откидываются в конец списка.
                пишите в ТП с указанием доступов к админке и ссылкой на тестируемый товар, надо смотреть по месту.
Спасибо.
                    Спасибо.
                мое решение справляется с этим, хотя оно и не такое изящное :)            
                    
                А как выводить опции в том же порядке, в котором они лежат во вкладке Модификации?            
                    
                Решили свою задачу? тоже актуально            
                    
                так и не вышло…            
                    
                Присоединюсь к вопросу — хотелось бы выводить опции в том порядки, в каком они в админке (благо там они драг н дропом отлично переставляются)            
                    
                            Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.