Последние два дня ловил баг в корзине (bitrix:sale.basket.basket) с кастомизированным шаблоном, решил поделиться находкой.
Кастомизация была минимальной - это не с нуля написанный шаблон, а небольшие косметические изменения существующего шаблона. Как оказалось, они были критичны для стандартного script.js.
В чем суть бага - изменения кол-ва товаров не сохранялись. То есть нажимаете на "+" или "-" ничего не происходило и при обновлении корзины значения оставались прежними.
Стал копать в сторону js функции recalcBasketAjax() и выяснилось, что вот эти изменения шаблона (basket_items.php) были критичны:
Вот как раз дополнительные tr на каждый товар и сбивали работу JavaScript, а именно, этот участок функции recalcBasketAjax():
Здесь в переменной items находится вся таблица с товарами (вместе с thead). Не очень понимаю, как из всего куска DOM этим js выдергивается информация о товарах, но факт таков, что лишних <tr> он не приемлет, ругается на ".value".
Поэтому проблем решил переверстав таблицу что бы избавиться от лишних <tr>.
Остается один момент, после обновления количества товара меняется и сумма, только вместо символа рубля (перечеркнутая "Р") появляется "руб.". Что с этим делать, пока не придумал.
Кастомизация была минимальной - это не с нуля написанный шаблон, а небольшие косметические изменения существующего шаблона. Как оказалось, они были критичны для стандартного script.js.
В чем суть бага - изменения кол-ва товаров не сохранялись. То есть нажимаете на "+" или "-" ничего не происходило и при обновлении корзины значения оставались прежними.
Стал копать в сторону js функции recalcBasketAjax() и выяснилось, что вот эти изменения шаблона (basket_items.php) были критичны:
<tbody> <?foreach($arResult["GRID"]["ROWS"] as $k => $arItem):?> <tr id="<?=$arItem["ID"]?>" class="prod-line"> // Здесь идут данные о товаре - картинка, название и т.д. всё стандартно </tr> <?if($arItem["DESCRIPTION"]):?> <tr><td colspan="5"><?=$arItem["DESCRIPTION"];?></td></tr> <?endif;?> <tr class="line"><td colspan="6"></td></tr> <?endforeach;?> |
Вот как раз дополнительные tr на каждый товар и сбивали работу JavaScript, а именно, этот участок функции recalcBasketAjax():
if (!!items && items.rows.length > 0) { for (var i = 1; items.rows.length > i; i++) postData['QUANTITY_' + items.rows[i].id] = BX('QUANTITY_' + items.rows[i].id).value; } |
Здесь в переменной items находится вся таблица с товарами (вместе с thead). Не очень понимаю, как из всего куска DOM этим js выдергивается информация о товарах, но факт таков, что лишних <tr> он не приемлет, ругается на ".value".
Поэтому проблем решил переверстав таблицу что бы избавиться от лишних <tr>.
Остается один момент, после обновления количества товара меняется и сумма, только вместо символа рубля (перечеркнутая "Р") появляется "руб.". Что с этим делать, пока не придумал.