+7 495 008 8452 пн.-пт. 10:00 – 17:00
Если у вас возникли какие либо вопросы которые вы не смогли решить по нашим публикациям самостоятельно,
то ждем ваше обращение в нашей службе тех поддержки.


Выводим в корзине свойства элемента инфоблока

Добрый день.

В обращениях часто спрашивают, как вывести какие-либо свойства товара как элемента инфоблока в корзине. Стандартно этот функционал не реализован, поэтому предлагаю кастомизацию компонента sale.basket.basket и шаблона.

Для примера выведем в корзине текст анонса и картинку анонса (наиболее часто желаемые свойства в корзине).

Копируем стандартный компонент sale.basket.basket в свое пространство имен - demo. Также попутно отвечаем на довольно частый вопрос, ответ на который, хотя и не подробно, дан в документации по компонентам - как вывести свой компонент в панели Компонентов 2.0 в окне визуального редактора отдельной строкой. Для этого необходимо изменить файл компонента .description:
<?
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();

$arComponentDescription = array(
   "NAME" => GetMessage("SBB_DEFAULT_TEMPLATE_NAME"),
   "DESCRIPTION" => GetMessage("SBB_DEFAULT_TEMPLATE_DESCRIPTION"),
   "ICON" => "/images/sale_basket.gif",
   "PATH" => array(
      "ID" => "my_components",
      "NAME" => GetMessage("MY_COMPONENTS"),
      "SORT" => 2000      
   ),
);
?>


В результате, видим в панели компонентов (добавив соответствующие языковые фразы в файл /lang/ru/.description):



Далее изменяем файл .parameters, чтобы выводимыми данными можно было управлять через настройки компонентов:
"PROPS_LIST" => array(
         "NAME" => GetMessage('SBB_PROPS_LIST'),
         "TYPE" => "LIST",
         "MULTIPLE" => "Y",
         "VALUES"=>array(
            "PREVIEW_TEXT" => GetMessage("SBB_PREVIEW_TEXT"),
            "PREVIEW_PICTURE" => GetMessage("SBB_PREVIEW_PICTURE")),      
         "DEFAULT"=>array("PROPERTY_CML2_ARTICLE"),
         "COLS"=>25,         
         "ADDITIONAL_VALUES"=>"N",
         "PARENT" => "VISUAL",
      ),


Получаем такой вид настроек компонента, добавив соответствующие языковые фразы в файл /lang/ru/.parameters:



Самое простое позади, теперь очередь за кастомизацией файла компонента component.php, добавляем в него выборку соответствующих полей элемента:

if(CModule::IncludeModule ('iblock'))
   { 
   
      $arFilter=array ("ID"=>$arItems["PRODUCT_ID"]);   
      $arSelectedFields=$arParams["PROPS_LIST"];   
   
      $db_props = CIBlockElement::GetList(Array("ID" => "DESC"), $arFilter, false, false, $arSelectedFields);

      if ($ar_props=$db_props->Fetch())
      {   
         $ar_props["PREVIEW_PICTURE"] = CFile::GetFileArray($ar_props["PREVIEW_PICTURE"]);               
      }   
      
   }
   $arItems["NEW_PROPS"]=$ar_props;   

   $arBasketItems[] = $arItems;


Этот код вставляем в конец основного цикла while, где идет выборка свойств элемента как товара. Далее, компонент передает наши данные в шаблон. Так как на самом деле у компонента корзины три шаблона (вернее один шаблон состоит из 3 файлов, подключаются в зависимости от значения переменных CAN_BUY и DELAY), то придется повозиться, приведу пример только для одного файла basket_items.php, остальные по аналогии:

Задаем языковые файлы в /template/lang/ru/ и выводим их в заголовке таблицы, картинка анонса идет первой, затем имя, затем текст анонса, можно сделать по своему вкусу :)

<table class="sale_basket_basket data-table">
   <tr>
      <?if (in_array("PREVIEW_PICTURE", $arParams["PROPS_LIST"])):?>
         <th><?= GetMessage("SALE_PREVIEW_PICTURE")?></th>
      <?endif;?>
      <?if (in_array("NAME", $arParams["COLUMNS_LIST"])):?>
         <th><?= GetMessage("SALE_NAME")?></th>
      <?endif;?>      
      <?if (in_array("PREVIEW_TEXT", $arParams["PROPS_LIST"])):?>
         <th><?= GetMessage("SALE_PREVIEW_TEXT")?></th>
      <?endif;?>
      <?if (in_array("PROPS", $arParams["COLUMNS_LIST"])):?>
         <th><?= GetMessage("SALE_PROPS")?></th>
      <?endif;?>


Далее, основная строка вывода свойств:

foreach($arResult["ITEMS"]["AnDelCanBuy"] as $arBasketItems)
   { 
      ?>
      <tr>         
         <?if (in_array("PREVIEW_PICTURE", $arParams["PROPS_LIST"])):?>
            <td><?
            if (is_array($arBasketItems["NEW_PROPS"]["PREVIEW_PICTURE"])):
               ?><img border="0" src="<?=$arBasketItems["NEW_PROPS"]["PREVIEW_PICTURE"]["SRC"]?>" width="<?=$arBasketItems["NEW_PROPS"]["PREVIEW_PICTURE"]["WIDTH"]?>" height="<?=$arBasketItems["NEW_PROPS"]["PREVIEW_PICTURE"]["HEIGHT"]?>" alt="<?=$arBasketItems["NAME"]?>" title="<?=$arBasketItems["NAME"]?>"/><?
            endif;
            ?></td>
         <?endif;?>
         <?if (in_array("NAME", $arParams["COLUMNS_LIST"])):?>
         <td><?
            if (strlen($arBasketItems["DETAIL_PAGE_URL"])>0):
               ?><a href="<?=$arBasketItems["DETAIL_PAGE_URL"] ?>"><?
            endif;
            ?><b><?=$arBasketItems["NAME"] ?></b><?
            if (strlen($arBasketItems["DETAIL_PAGE_URL"])>0):
               ?></a><?
         endif;
         ?></td>
         <?endif;?>
         <?if (in_array("PREVIEW_TEXT", $arParams["PROPS_LIST"])):?>
         <td><?
            if (strlen($arBasketItems["NEW_PROPS"]["PREVIEW_TEXT"])>0):
               ?><i>"<?=$arBasketItems["NEW_PROPS"]["PREVIEW_TEXT"]?>"</i><?
            endif;
            ?></td>
         <?endif;?>

Здесь можно также добавить записи, на случай если отсутствует картинка у элемента, либо она по каким-то причинам недоступна, но это по желанию. Я всего лишь добавил курсив для текста анонса.
Дальше, чтобы не разрушить верстку таблицы, в последнюю строку вставляем пустые ячейки:

<tr>
      <?if (in_array("PREVIEW_PICTURE", $arParams["PROPS_LIST"])):?>
         <td>&nbsp;</td> // тут не забыть удалить пробел
      <?endif;?>


По аналогии правим оставшиеся два файла basket_items_delay.php и basket_items_notavail.php

Проверяем, что у нас получилось:



Теперь, отложим один товар, а второй сделаем через админку недоступным для покупки, чтобы проверить как отработают шаблоны basket_items_delay.php и basket_items_notavail.php, видим, что все корректно:



Теперь корзина у нас более функциональна :)

Для тех, кому лень править, ссылка на архив кастомизированного компонента:

https://dev.1c-bitrix.ru/upload/exampl...basket.zip

Назад в раздел

Подписаться на новые материалы раздела:












CAPTCHA