Неверные позиции в пикере списка товаров (если использовать position)

Где возникла проблема:
cs-cart v 4.16 RUS. Тест на обычной сборке

Суть проблемы:
При выводе пикера товаров с параметром position Скриншот 12-04-2023 13:57:10.jpg
показать сохраненные позиции нет возможности из-за логике в шаблоне.

Как воспроизвести проблему:
Создайте обычный пикер товаров

В $products у нас массив вида

[
‘позиция’ => id_товара,
12 =>122,
13 => 44

]

{include file=“pickers/products/picker.tpl”
input_name=“products_list[product_ids]”
data_id=“added_products”
item_ids=$products
type=“links”
positions=true
dialog_opener_meta=“cm-dialog-destroy-nested-on-close”
}

После сохранения, в базу данных можно принять указанные позиции и id товаров. Ту все хорошо.

Но показать сохраненные позиции нельзя из-за логики в шаблонах

А именно из-за конструкций
js.tpl
<input type="text" name="{$input_name}[{$delete_id}]" value="{math equation="a*b" a=$position b=10}" size="3" class="input-micro" {if $clone}disabled="disabled"{/if} />

picker.tpl
{include file="pickers/products/js.tpl" product_id=$product product=$product|fn_get_product_name|default:__("deleted_product") root_id=$data_id delete_id=$product|escape:javascript type="product" first_item=$smarty.foreach.items.first position_field=$positions position=$smarty.foreach.items.iteration+$start_pos}

Где значения позиций строго по итерации.

Чтобы подтвердить и решить проблему, нам сначала нужно повторить её на своём магазине или демо (без любых сторонних модулей и тем). Если это не получится, мы попросим вас обратиться в Help Desk для дальнейшего изучения.

Тест проводился на чистой сборке.

9883aaee2b060028a99cb6761c61bc22.zip (5,2 КБ)

Во вложении файлы для замены (вдруг кому полезно будет)
js.tpl
picker.tpl

В этом случае можно использовать конструкцию с доп. параметром use_key_pos=true

{include file="pickers/products/picker.tpl"
    input_name="product_list[product_ids]"
    data_id="added_products"
    item_ids=$products
    type="links"
    positions=true
    use_key_pos=true
    dialog_opener_meta="cm-dialog-destroy-nested-on-close"
}
2 лайка

В догонку. Теперь понятно почему так сделано. Если у позиций будут все 0 или одинаковые значения позиций, останется только 1 товар.

Решили так: при сохранении данных из пикера доп. проверкой позиции. Если повторялась, то + 1

function fn_position_checker(&$position_check, $pos){
    if(!isset($position_check[$pos])){
        $position_check[$pos] = $pos;
    }else{
        $pos = fn_sw_simular_products_position_checker($position_check, $pos + 1);
    }
    
    return $pos;
}

В функции такой вид:

$position_check = [];

$position = fn_position_checker($position_check, $position);