Сортировка значений опций товара
Добрый день.
Ситуация такая — создал опции для товара:
Подскажите, как можно отсортировать опции в нужном порядке.
Пользователь Володя подсказал вариант с
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х откидываются в конец списка.
пишите в ТП с указанием доступов к админке и ссылкой на тестируемый товар, надо смотреть по месту.
Спасибо.
Спасибо.
мое решение справляется с этим, хотя оно и не такое изящное :)
А как выводить опции в том же порядке, в котором они лежат во вкладке Модификации?
Решили свою задачу? тоже актуально
так и не вышло…
Присоединюсь к вопросу — хотелось бы выводить опции в том порядки, в каком они в админке (благо там они драг н дропом отлично переставляются)
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.