Дмитрий Репин: Подмена параметров компонента прямо из шаблона

Дата : 5 Сентябрь, 2017
Опубликовал bi3ks
1 Star2 Stars3 Stars4 Stars5 Stars (1 проголосовало, оценка: 5,00 из 5)
Загрузка...
Web 1920 _ 1.png

Добрый день!

Бывают ситуации когда в каком-либо компоненте не хватает какого то параметра. Например, мне, не хватает параметра очередности столбцов в стандартном копоненте

«корзина» (bitrix:sale.basket.basket). То есть я хочу чтобы первым столбцом в корзине было не наименование, а артикул, или любой другой столбец.

Для этого я ничего не придумал лучше как добавить в настройках компонента дополнительные параметры вида «Номер столбца => Название столбца». Но проблема в том что я не знаю заранее количество столбцов, которые будут использованы в корзине, поэтому этот параметр должен быть динамически, то есть для параметра «COLUMNS_LIST» у компонента, мы должны добавить ‘REFRESH’ => ‘Y’ и в зависимости от количества выбранных столбцов выводить то же количество необходимых нам параметров.

Вариант «скопировать компонент в своё пространство имён» — оставим на потом, а я предлагаю прямо в шаблоне влезть в настройки параметров и поправить всё что нам нужно.

Итак. Копируем шаблон корзины в свой шаблон и добавляем (если отсутствует) файл .parameters.php прямо в вашей папке шаблона корзины.

Далее добавляем в этот файл параметр, полностью соответствующий параметру в папке .parameters.php компонента.

====code====

$arColumns = array(
   "NAME" => GetMessage("SBB_BNAME"),
   "DISCOUNT" => GetMessage("SBB_BDISCOUNT"),
   "WEIGHT" => GetMessage("SBB_BWEIGHT"),
   "PROPS" => GetMessage("SBB_BPROPS"),
   "DELETE" => GetMessage("SBB_BDELETE"),
   "DELAY" => GetMessage("SBB_BDELAY"),
   "TYPE" => GetMessage("SBB_BTYPE"),
   "PRICE" => GetMessage("SBB_BPRICE"),
   "QUANTITY" => GetMessage("SBB_BQUANTITY"),
   "SUM" => GetMessage("SBB_BSUM")
);
if (Loader::includeModule('catalog'))
{
   $arIblockIDs = array();
   $arIblockNames = array();
   $catalogIterator = CatalogCatalogIblockTable::getList(array(
      'select' => array('IBLOCK_ID', 'NAME' => 'IBLOCK.NAME'),
      'order' => array('IBLOCK_ID' => 'ASC')
   ));
   while ($catalog = $catalogIterator->fetch())
   {
      $catalog['IBLOCK_ID'] = (int)$catalog['IBLOCK_ID'];
      $arIblockIDs[] = $catalog['IBLOCK_ID'];
      $arIblockNames[$catalog['IBLOCK_ID']] = $catalog['NAME'];
   }
   unset($catalog, $catalogIterator);


   if (!empty($arIblockIDs))
   {
      $arProps = array();
      $propertyIterator = IblockPropertyTable::getList(array(
         'select' => array('ID', 'CODE', 'NAME', 'IBLOCK_ID'),
         'filter' => array('@IBLOCK_ID' => $arIblockIDs, '=ACTIVE' => 'Y', '!=XML_ID' => CIBlockPropertyTools::XML_SKU_LINK),
         'order' => array('IBLOCK_ID' => 'ASC', 'SORT' => 'ASC', 'ID' => 'ASC')
      ));
      while ($property = $propertyIterator->fetch())
      {
         $property['ID'] = (int)$property['ID'];
         $property['IBLOCK_ID'] = (int)$property['IBLOCK_ID'];
         $property['CODE'] = (string)$property['CODE'];
         if ($property['CODE'] == '')
            $property['CODE'] = $property['ID'];
         if (!isset($arProps[$property['CODE']]))
         {
            $arProps[$property['CODE']] = array(
               'CODE' => $property['CODE'],
               'TITLE' => $property['NAME'].' ['.$property['CODE'].']',
               'ID' => array($property['ID']),
               'IBLOCK_ID' => array($property['IBLOCK_ID'] => $property['IBLOCK_ID']),
               'IBLOCK_TITLE' => array($property['IBLOCK_ID'] => $arIblockNames[$property['IBLOCK_ID']]),
               'COUNT' => 1
            );
         }
         else
         {
            $arProps[$property['CODE']]['ID'][] = $property['ID'];
            $arProps[$property['CODE']]['IBLOCK_ID'][$property['IBLOCK_ID']] = $property['IBLOCK_ID'];
            if ($arProps[$property['CODE']]['COUNT'] < 2)
               $arProps[$property['CODE']]['IBLOCK_TITLE'][$property['IBLOCK_ID']] = $arIblockNames[$property['IBLOCK_ID']];
            $arProps[$property['CODE']]['COUNT']++;
         }
      }
      unset($property, $propertyIterator, $arIblockNames, $arIblockIDs);


      $propList = array();
      foreach ($arProps as &$property)
      {
         $iblockList = '';
         if ($property['COUNT'] > 1)
         {
            $iblockList = ($property['COUNT'] > 2 ? ' ( ... )' : ' ('.implode(', ', $property['IBLOCK_TITLE']).')');
         }
         $propList['PROPERTY_'.$property['CODE']] = $property['TITLE'].$iblockList;
      }
      unset($property, $arProps);


      if (!empty($propList))
         $arColumns = array_merge($arColumns, $propList);
      unset($propList);
   }
}
$arTemplateParameters["COLUMNS_LIST"] = array(
   "NAME"=>GetMessage("SBB_COLUMNS_LIST"),
   "TYPE"=>"LIST",
   "MULTIPLE"=>"Y",
   "VALUES"=>$arColumns,
   "DEFAULT"=>array("NAME", "PRICE", "TYPE", "DISCOUNT", "QUANTITY", "DELETE", "DELAY", "WEIGHT"),
   "COLS"=>25,
   "SIZE"=>7,
   "ADDITIONAL_VALUES"=>"N",
   "PARENT" => "VISUAL",
   'REFRESH' => 'Y',
);

=============

Единственное что я добавил это ‘REFRESH’ => ‘Y’.

И теперь если посмотрим уже визуальные настройки компонента, то параметр «Выводимые колонки» поменяется на наш. Таким образом можно менять логику, значения любого параметра прямо из шаблона.

Далее просто получаем значения, создаём массив и выводим новые параметры для выбора.

====code====

$arrColumn = array();
foreach($arCurrentValues["COLUMNS_LIST"] as $id=>$code){
   $arrColumn[$code] = $arColumns[$code];
}
foreach($arCurrentValues["COLUMNS_LIST"] as $id=>$val){
   $arTemplateParameters['COLUMN_SORT'.$id] = array(
      'NAME' => GetMessage('COLUMN_NAME').($id+1),
      'TYPE' => 'LIST',
      'VALUES' => $arrColumn,
      "PARENT" => "VISUAL",
   );
}

=============

У меня получилось в итоге так:

Далее просто в result_modifier.php получаем наши параметры и меняем массив $arResult[«GRID»][«HEADERS»] в зависимости от параметров.

====code====

$newArrHeaders = array();
foreach($arResult["GRID"]["HEADERS"] as $k=>$arHeader){
   $new_id = array_search ($arParams["COLUMN_SORT".$k], $arParams["COLUMNS_LIST"]);
   $newArrHeaders[] = $arResult["GRID"]["HEADERS"][$new_id];
}
ksort($newArrHeaders);
$arResult["GRID"]["HEADERS"] = $newArrHeaders;

=============

PS. Не забываем про языковой файл lang/[язык]/.parameters.php