Блог специалистов
14.12.2010

Добавить и вывести значение свойства раздела (пользовательского поля) в Битриксе

И снова свойства, но уже разделов. 

Очень часто, делая каталог на 1С-Битриксе, требуется задать свойства и разделам, не только элементам. В стандартном функционале у нас есть только изображение и описание. 

Чтобы вывести изображение раздела, нужно в шаблоне catalog.section прописать следующий код: 

Код <?php if ($arResult["PICTURE"]["SRC"]) {?> 
<a class="highslide1" onclick="return hs.expand(this)" title="<?=$arResult["NAME"]?>" href="<?=$arResult["PICTURE"]["SRC"]?>"> 
<img style="width:300px" src="<?=$arResult["PICTURE"]["SRC"]?>" title="<?=$arResult["NAME"]?>" /> 
<?php } else { ?><?php }?>


Чтобы было яснее, у меня идет сначала проверка, есть ли фотография, а потом идет вывод фотографии, там class и onclick - это остатки от галереи, не обращайте на них внимания. Если фотографии нет, то ничего и не выводится. 

Чтобы вывести описание раздела, в шаблоне catalog.section прописываем код: 

Код <?=$arResult["DESCRIPTION"]?>


Или для раздела news.list, если параметр выдается в виде массива Array: 

Код <?foreach($arResult["SECTION"]["PATH"] as $arSection):?> 
<?=$arSection["DESCRIPTION"]?> 
<?endforeach;?>


Теперь самая соль. 

Чтобы задать дополнительное свойство раздела, нужно использовать Пользовательские поля. 
Заходим в свойства раздела, выбираем вкладку "Доп. свойства" и нажимаем на "Добавить пользовательское поле". 
Создаете нужное поле требуемого типа и сохраняете. Потом в Свойствах раздела вы заполняете ваше созданное свойство раздела. 
Теперь, самое главное, чтобы вывести свойство раздела (пользовательское поле) нужно, всё в том же шаблоне catalog.section прописать следующий код: 

Для НЕ МНОЖЕСТВЕННОГО свойства раздела (пользовательского поля): 

Код <? 
$db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter = Array("IBLOCK_ID"=>$arResult["IBLOCK_ID"], "ID"=>$arResult["ID"]), true,$arSelect=Array("UF_DOC")); 
while($ar_result = $db_list->GetNext()):   
?> 
<?=CFile::GetPath($ar_result["UF_DOC"]); ?> 
<?endwhile?>


Для МНОЖЕСТВЕННОГО свойства раздела (пользовательского поля): 

Код <? 
$db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter = Array("IBLOCK_ID"=>$arResult["IBLOCK_ID"], "ID"=>$arResult["ID"]), true,$arSelect=Array("UF_FILE")); 
while($ar_result = $db_list->GetNext()):   
?> 
<?foreach($ar_result["UF_FILE"] as $PHOTO):?> 
<?=CFile::GetPath($PHOTO); ?> 
<?endforeach?> 
<?endwhile?>


В данном случае код используется CFile::GetPath, чтобы вывести ссылку на файл, дальше обработать ее, думаю, не составит труда. 

Таким образом для значения типа данных "Файл" используем: 

Код <?=CFile::GetPath($PHOTO); ?>


а, чтобы вывести текстовое значение поля типа данных "Строка": 

Код <?=$ar_result["UF_TEXT"] ?>


Для вывода пользовательского поля в шаблоне catalog.section.list я использовал следующий кода: 

Код <? 
$db_list = CIBlockSection::GetList(Array($by=>$order), $arFilter = Array("IBLOCK_ID"=>$arSection["IBLOCK_ID"], "ID"=>$arSection["ID"]), true,$arSelect=Array("UF_ACT")); 
while($ar_result = $db_list->GetNext()):   
?> 
<? if ($ar_result["UF_ACT"]):?> 
<font color="red">Акция!</font> 
<? endif ?> 
<?endwhile?>

8. Вывод пользовательского свойства типа "Привязка к элементам инф.блока" в разделе инфоблока catalog.section.list. Напрмер нужно выводить свзанные позиции другого каталога или связанные новости и т.п.

Для этого испольузуется следующий код:

<!-- Код отвечет вывод пользовательского свойства типа "Привязка к элементам инф.блока" в разделе инфоблока и размещенн в template.php, который лежит в шаблоне catalog.section.list -->

<?
//Сначала мы получаем ID привязанных элементов к нашему разделу по нужному нам свойству UF_NOV (можно написать UF_*, тогда будут получены все свойства вида UF_), т.е. ID инфоблока, у которого в разделе выводим свойство равен 3. Т.к. значение множественное, то его выводим циклом. Там еще стоит условие, что если заначения нашего свойства пустое, но чтобы ничего не выводил

$rsResult = CIBlockSection::GetList(array("SORT" => "ASC"), array("IBLOCK_ID" => "3", 'ID' => $arResult["SECTION"]["ID"]), true, Array("UF_NOV"));
while ($arResult = $rsResult -> GetNext())
{
if (!empty($arResult["UF_NOV"])) // условие, что пустые занчения не выводим
{
$iter = $arResult["UF_NOV"]; //получили наши ID элементов из ИБ id 8, которые привязаны к разделу ИБ id 3
}
}

//Здесь мы начинаем выводить элементы другого инфоблока с ID 8, к которым привязан наш раздел свойством UF_NOV

$arFilter = array('IBLOCK_ID' => 8,'ID' => $iter);//задаем в фильтр чтобы выводил тольк из ИБ id 8 и только нужные нам элемены по ID, которые мы получили выше
$rsItems = CIBlockElement::GetList(array(),$arFilter);
while ($arItem = $rsItems->GetNext())
{
if (!empty($iter)) // условие, что пустые занчения не выводим
{
$resizer = $arItem['PREVIEW_PICTURE']; //функция ресайза картинки, если нужно
$file = CFile::ResizeImageGet($resizer, array('width'=>1000, 'height'=>290), BX_RESIZE_IMAGE_PROPORTIONAL , true); //функция ресайза картинки, если нужно
$img = $file['src']; //функция ресайза картинки, если нужно
echo '<img src="'.$img.'" /><br><a href="'.$arItem["DETAIL_PAGE_URL"].'">'.$arItem["NAME"].'</a>';
}
}
?>

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

<!-- Код отвечет за формирование цепочки навигации. Он взят из файла component.php без изменений -->
<?
if($arParams["ADD_SECTIONS_CHAIN"] && isset($arResult["SECTION"]) && is_array($arResult["SECTION"]["PATH"]))
{
foreach($arResult["SECTION"]["PATH"] as $arPath)
{
$APPLICATION->AddChainItem($arPath["NAME"], $arPath["~SECTION_PAGE_URL"]);
}
}

?>


Количество показов: 39684




Возврат к списку