Продолжаем тему . На сей раз опишу потенциальную проблему, с которой можно столкнуться при написании своих компонент. В качестве примера берем типовой bitrix:news.list.
[spoiler]
Создаем инфоблок с несколькими свойствами, у которых не указываем символьный код (не обязаны):

Кидаем на страницу компонент bitrix:news.list и начинаем настраивать. Выбираем инфоблок, переходим к выбору свойств, которые надо показывать. Упс:

Для выбора доступно только последнее
Лезем в настройки инфоблока, прописываем символьные коды для пары свойств, одно оставляем пустым (бедна фантазия на символьные коды под вечер
):

Смотрим настройки компонента - отлично, все свойства есть:

Все окей, настроили компонент, смотрим публичку (пардон, набивать элементы было лень, придется поверить
). Все выводится, вот только свойство с пустым символьным кодом не показывается, хоть ты тресни. Вместо того, чтобы истерить на форуме и мотать нервы саппорту, лезем в код и начинаем разбираться.
Как получается перечень значений для параметра "Свойства" (PROPERTY_CODE) (.parameters.php компонента):
Нас интересует массив $arProperty_LNS. Ключами массива как раз и являются символьные коды свойств инфоблока. Натурально, если у нескольких свойств код пустой, остаться должен только один - последний
Это ответ на первую пару скриншотов. Вторая пара скринов требует залезть уже в component.php:
В переводе на русский - пустые ключи выбрасываются. Причем самое грустное то, что в методе _CIBElement::GetProperties() проблема пустых символьных кодов решена - если их нет, ставятся ID свойств.
Вывод - в своих компонентах в качестве ключей лучше использовать ID свойств:
и
Преимущества - избавлены от проблем, описанных выше, легкость валидации в component.php
Недостатки - неудобно переносить страницы с тестовой машины на боевую, если, к примеру, не совпадают ID инфоблоков.
Продолжение следует...
[spoiler]
Создаем инфоблок с несколькими свойствами, у которых не указываем символьный код (не обязаны):

Кидаем на страницу компонент bitrix:news.list и начинаем настраивать. Выбираем инфоблок, переходим к выбору свойств, которые надо показывать. Упс:

Для выбора доступно только последнее
Лезем в настройки инфоблока, прописываем символьные коды для пары свойств, одно оставляем пустым (бедна фантазия на символьные коды под вечер
):
Смотрим настройки компонента - отлично, все свойства есть:

Все окей, настроили компонент, смотрим публичку (пардон, набивать элементы было лень, придется поверить
). Все выводится, вот только свойство с пустым символьным кодом не показывается, хоть ты тресни. Вместо того, чтобы истерить на форуме и мотать нервы саппорту, лезем в код и начинаем разбираться.Как получается перечень значений для параметра "Свойства" (PROPERTY_CODE) (.parameters.php компонента):
$arProperty_LNS = array();
$rsProp = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>(isset($arCurrentValues["IBLOCK_ID"])?$arCurrentValues["IBLOCK_ID"]:$arCurrentValues["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"];
}
}
|
Нас интересует массив $arProperty_LNS. Ключами массива как раз и являются символьные коды свойств инфоблока. Натурально, если у нескольких свойств код пустой, остаться должен только один - последний
Это ответ на первую пару скриншотов. Вторая пара скринов требует залезть уже в component.php:if(!is_array($arParams["PROPERTY_CODE"])) $arParams["PROPERTY_CODE"] = array(); foreach($arParams["PROPERTY_CODE"] as $key=>$val) if($val==="") unset($arParams["PROPERTY_CODE"][$key]); |
В переводе на русский - пустые ключи выбрасываются. Причем самое грустное то, что в методе _CIBElement::GetProperties() проблема пустых символьных кодов решена - если их нет, ставятся ID свойств.
Вывод - в своих компонентах в качестве ключей лучше использовать ID свойств:
$rsProps = CIBlockProperty::GetList(Array("sort"=>"asc", "name"=>"asc"), Array("ACTIVE"=>"Y", "IBLOCK_ID"=>$arCurrentValues["IBLOCK_ID"]));
while ($arProp = $rsProps->Fetch())
{
$arPropList[$arProp["ID"]] = "[".$arProp["CODE"]."] ".$arProp["NAME"];
}
|
и
if (false == is_array($arParams['PROPERTY_CODE']))
$arParams['PROPERTY_CODE'] = array($arParams['PROPERTY_CODE']);
foreach ($arParams['PROPERTY_CODE'] as $key => $value)
{
if (0 >= intval($value))
unset($arParams['PROPERTY_CODE'][$key]);
}
|
Преимущества - избавлены от проблем, описанных выше, легкость валидации в component.php
Недостатки - неудобно переносить страницы с тестовой машины на боевую, если, к примеру, не совпадают ID инфоблоков.
Продолжение следует...