Сегодня поговорим о кастомизации компонента Битрикса «ссылка на корзину» sale.basket.basket.line. В техзадании Клиента поставлено условие, чтобы в строке выводилось общее количество товара и общая сумма.
К сожалению, штатный функционал данное пожелание выполнить не позволяет, поэтому придётся править шаблон. Для этого, как обычно, нужно его скопировать. В скопированном шаблоне, в файле result_modifier.php, получаем количество и цену товара:
<?if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true)die();?> <?if (IntVal($arResult["NUM_PRODUCTS"])>0){ if (CModule::IncludeModule("sale")){ $arBasketItems = array(); $dbBasketItems = CSaleBasket::GetList( array ( "NAME" => "ASC", "ID" => "ASC" ), array ( "FUSER_ID" => CSaleBasket::GetBasketUserID(), "LID" => SITE_ID, "ORDER_ID" => "NULL" ), false, false, array("ID", "QUANTITY", "PRICE") ); while ($arItems = $dbBasketItems->Fetch()){ if (strlen($arItems["CALLBACK_FUNC"]) > 0){ CSaleBasket::UpdatePrice($arItems["ID"], $arItems["QUANTITY"]); $arItems = CSaleBasket::GetByID($arItems["ID"]); } $arBasketItems[] = $arItems; } ?>
Затем перебираем в цикле массив товаров в корзине и подсчитываем общие количество и стоимость.
<? $summ = 0; $quantity = 0; for ($i=0;$i<=$arResult["NUM_PRODUCTS"];$i++){ $summ = $summ + $arBasketItems[$i]["PRICE"]*$arBasketItems[$i]["QUANTITY"]; $quantity = $quantity + $arBasketItems[$i]["QUANTITY"]; } } ?>
Далее, реализуем автоподстановку окончания слова «товар» в зависимости от количества товара. Например: 1 товар, 14 товаров и т.п. Это делать необязательно и зависит от пожеланий заказчика. В данном случае требовалось на выхлопе получить нечто подобное:»В корзине 23 товара на сумму 450 руб.».
Если количество больше нуля, подготовим массивы для определения окончания слова:
<? if ($quantity>0){ $arrayA = array(2,3,4); $arrayOv = array(5,6,7,8,9,0);
если количество равно 1, или оканчивается на единицу, но не равно 11, тогда оставляем «товар» без окончания:
if($quantity==1 || (($quantity%10)==1 && $quantity<>11)) $endQuantity="";
если количество- число из массива $arrayA, или оканчивается на число из массива $arrayA и при этом не равно 14 или 12, тогда окончание = «а». И так далее:
elseif((in_array($quantity,$arrayA) || in_array(($quantity%10),$arrayA)) && $quantity<>14 && $quantity<>12) $endQuantity="а"; elseif(in_array($quantity,$arrayOv) || in_array(($quantity%10),$arrayOv) || $quantity ==11 || $quantity ==14 || $quantity ==12) $endQuantity="ов"; else $endQuantity=""; } ?>
Формируем требуемую строку:
<?$arResult["FIN_TEXT"] = $finText;?>
А если товаров нет, то строка вывода будет содержать сообщение о том, что корзина пуста.(Я перенес условие проверки количества из template.php, чтобы передать туда уже готовую строку либо с количеством и ценой, либо с сообщением об отсутствии)
<? } else { $finText = $arResult["ERROR_MESSAGE"]; } ?>
И наконец, добавляем полученную строку в массив $arResult
<?$arResult["FIN_TEXT"] = $finText;?>
А в файле template.php уже добываем из $arResult нашу строку и выводим там, где нам необходимо.
Например:
<?$arResult["FIN_TEXT"] = $finText;?>
И не забываем применить новый шаблон к компоненту.