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


Даём возможность покупателю выбрать свойства товара и переносим их в корзину

Привет!

Часто возникает задача дать возможность покупателю указать свойства товара перед покупкой: например, позволить выбрать размер, цвет или производителя товара и с этими свойствами положить товар в корзину. Это удобно для покупателя и менеджеры магазина будут точно знать, что покупатель хочет "зелёные носки, а не синие".

В этой статье я продолжу "издеваться" над компонентом bitrix:catalog.element :)

Для начала для каталога нужно создать свойства типа "список", именно значения этих свойств покупатель будет выбирать при покупке товара. Я создал два свойства, "Цвет" и "Надпись":


Обязательным условием является задание символьных кодов создаваемых свойств. После создания свойств нужно задать варианты значений этих свойств(кнопка "..."), например, для свойства "Цвет" это сделано так:




Далее решения задачи требуется кастомизация компонента и самого шаблона. Опустим скучную часть, описывающую копирование компонента в свою папку и перейдём непосредственно к кастомизации.

1. Поправим файл .parametrs.php скопированного компонента. Нужно добавить параметр компонента - набор свойств типа "Список", значения которых сможет выбрать покупатель.

Добавим:

"PROPERTY_CODE_MOD" => array(
         "PARENT" => "VISUAL",
         "NAME" => 'Свойства для выбора',
         "TYPE" => "LIST",
         "MULTIPLE" => "Y",
         "VALUES" => $arProperty_L,
         "ADDITIONAL_VALUES" => "Y",
      ),


Затем в заменим

$arProperty_LNS = array();
$arProperty_N = array();
$rsProp = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arCurrentValues["IBLOCK_ID"]));
while ($arr=$rsProp->Fetch())
{
   $arProperty[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
   if(in_array($arr["PROPERTY_TYPE"], array("L", "N", "S")))
   {
      $arProperty_LNS[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
   }
   if($arr["PROPERTY_TYPE"]=="N")
   {
      $arProperty_N[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
   }   
}



на это:

$arProperty_LNS = array();
$arProperty_N = array();
$arProperty_L = array();
$rsProp = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arCurrentValues["IBLOCK_ID"]));
while ($arr=$rsProp->Fetch())
{
   $arProperty[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
   if(in_array($arr["PROPERTY_TYPE"], array("L", "N", "S")))
   {
      $arProperty_LNS[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
   }
   if($arr["PROPERTY_TYPE"]=="N")
   {
      $arProperty_N[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
   }
   if($arr["PROPERTY_TYPE"]=="L")
   {
      $arProperty_L[$arr["CODE"]] = "[".$arr["CODE"]."] ".$arr["NAME"];
   }
}


Теперь в настройках параметров компонента, появится параметр "Свойства для выбора".

2. Теперь правим component.php. В компоненте нужно сформировать массивы значений, которые будут представлены в виде списка для каждого из свойств. После формирования массива $arResult["MORE_PHOTO"] (используйте поиск по файлу) добавляем код:


$arResult["PROPERTIES_FOR_USER"]=Array();
         foreach ($arParams['PROPERTY_CODE_MOD'] as $LCODE):
         if ($LCODE)
               {
                  $property_enums = CIBlockPropertyEnum::GetList(Array("DEF"=>"DESC", "SORT"=>"ASC"), Array("IBLOCK_ID"=>$arParams['IBLOCK_ID'], "CODE"=>$LCODE));
                  $PROPS_VALUES=Array();
                  $Prop=Array();
                  while($enum_fields = $property_enums->GetNext())
                           {
                            $Prop['NAME']=$enum_fields['PROPERTY_NAME'];                  
                            $PROPS_VALUES[]=$enum_fields["VALUE"];
                           }
                  $Prop['VALUES']=$PROPS_VALUES;
                  $arResult["PROPERTIES_FOR_USER"][$LCODE]=$Prop;
               }
            endforeach;


Теперь у нас есть, что показать покупателю в шаблоне.
Далее после условия:

if (($action == "ADD2BASKET" || $action == "BUY") && $productID > 0)


Вставляем следующий код:

$arProductParams=Array();
      foreach($arParams['PROPERTY_CODE_MOD'] as $PropCode):
         $SaleParams=Array();
                  if ($_REQUEST[$PropCode]&&$_REQUEST[$PropCode.'_NAME'])
                        {
                           $SaleParams['NAME']=$_REQUEST[$PropCode.'_NAME'];
                           $SaleParams['VALUE']=$_REQUEST[$PropCode];
                           $SaleParams['CODE']=$PropCode;
                           $SaleParams['SORT']=100;
                           $arProductParams[]=$SaleParams;
                        }
                  endforeach;


Здесь мы формируем массив переданных свойств товара после нажатия кнопки "купить", чтобы использовать его для добавления товара в корзину.

И наконец заменяем:

Add2BasketByProductID($productID)


на

Add2BasketByProductID($productID,null,$arProductParams)



3. Последний штрих - правка шаблона, файла template.php. Организовываем форму для выбора свойств. Код формы:
<form action='' method='POST'>
         <table style='border:1px dotted black'>
         <?foreach ($arResult['PROPERTIES_FOR_USER'] as $key=>$SALE_PROPERTY):?>
            <tr>
               <td>
                  <?=$SALE_PROPERTY['NAME'];?>
               </td>
               <td>
                  <select name="<?=$key?>">
                     <?foreach($SALE_PROPERTY['VALUES'] as $PropValue):?>
                        <option selected value='<?=$PropValue?>'><?=$PropValue?></option>
                     <?endforeach;?>
                  </select>
               </td>
            </tr>
            <input type=hidden value='<?=$SALE_PROPERTY['NAME']?>' name='<?=$key."_NAME"?>'>
         <?endforeach;?>
         </table>
               <input type=hidden value='<?=$arResult['ID']?>' name='<?=$arParams["PRODUCT_ID_VARIABLE"]?>'>
               <input type=hidden value='BUY' name='action'>
               <input type=submit name=buy value='<?=GetMessage("CATALOG_BUY")?>'>
         </form>


Мелких модификаций шаблона больше, но они все косметические, поэтому код приводить не буду, тем более компонент можно скачать.

Теперь получившийся компонент с помощью визуального редактора размещаем на станице. И настраиваем, в частности указываем параметр "Свойства для выбора":


Результат примерно такой:


Выберем нужные свойства и кликнем "купить". Переходим в корзину  - в корзине отображаются те свойства, которые были выбраны:



Задача решена.
Решение, естественно, не идеальное, но решение.
Скачать компонент можно здесь:
http://dev.1c-bitrix.ru/upload/exampl...ent.ex.zip

Это для тех, кому не терпиться.


Аналогичный функционал уже внесён в стандартные компоненты(естетсвенно, в ином виде).


 

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

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












CAPTCHA