Sale.basket.basket.line- добавление общего количества и стоимости.

Сегодня поговорим о кастомизации компонента Битрикса «ссылка на корзину» 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;?>

И не забываем применить новый шаблон к компоненту.

About the author: kissadm