Задать вопрос

Битрикс. Как вывести пользовательское свойство в хлебных крошках?

Добрый день!

Необходимо значение текстового пользовательского свойства раздела вывести названием пункта меню и хлебной крошки. Если подскажете по хлебной крошке, этого будет достаточно, надеюсь, чтобы реализовать и меню.

Блуждания по материалам привели к задаче вывода значения пользоват. св-ва в массив $arResult. Возможно ли это? Прошу ответ максимально конкретизировать, ибо Битрикс - зверь дикий для меня.
Заранее благодарю!
  • Вопрос задан
  • 12981 просмотр
Подписаться 4 Оценить Комментировать
Решения вопроса 2
vasilyev
@vasilyev
php, 1c-bitrix
Ну вот, пусть знатоки меня пинают теперь.

//$arResult - массив на входе в result_modifier.php
$iblock_id = 0; //мы должны знать ID инфоблока каталога
$custom_name = 'CUSTOM_TITLE'; //символьный код свойства для кастомного тайтла

if(CModule::IncludeModule("iblock")){ 
	foreach ($arResult['ITEMS'] as $key => $value) {
		$link = $value['LINK']; //Допустим, что у нас ЧПУ вида /catalog/section_code
		$section_code = str_replace('/catalog/', '', $link); //можно придумать что-то поизящнее, наверное

		$dbSection = CIBlockSection::GetList(
			array("SORT"=>"ASC"),
			array(
				"IBLOCK_ID" => $iblock_id,
				"CODE" => $section_code
				),
			false,
			array('PROPERTY_'.$custom_name)
			);

		if ($arSection = $dbSection->GetNext()){
			$new_name = $arSection['PROPERTY_'.$custom_name.'_VALUE'];
			$arResult['ITEMS'][$key]['NAME'] = $new_name;
		}
	}
}


Только делать это нужно не в result_modifier.php (бредкрамбс его не поддерживает), а прямо в коде template.php видимо.
Ответ написан
Комментировать
@krang13 Автор вопроса
Ну все, решил. Спасибо тебе, добрый человек! Без твоей помощи б никуда не ушел.
Выкладываю готовый код шаблона хлебных крошек с решенной задачей для следующего поколения чайников. При этом не трогал сам компонент, только шаблон!
$strReturn = '<ul class="breadcrumb-navigation" xmlns:v="http://rdf.data-vocabulary.org/#">';

for($index = 0, $itemSize = count($arResult); $index < $itemSize; $index++)
{
	if($index > 0) {
		$strReturn .= '<li><span>&nbsp;&gt;&nbsp;</span></li>';
		$cutLink=explode("/", $arResult[$index]["LINK"]);//разбиваем путь на SECTION_CODE
		$cnt=count($cutLink);//считаем количество элементов массива
		$numSecNow=$cnt-2;//номер текущего (чпу со "/" на конце, поэтому -2)
		$secNow=$cutLink["$numSecNow"];//нужный нам SECTION_CODE
	}
	else $secNow="first";//не обязательно ваще
	//тут чудо-код нашего друга. спс за него!
	$iblock_id = 1; //мы должны знать ID инфоблока каталога
	$custom_name = 'UF_ALT_NAME'; //символьный код свойства для кастомного тайтла
	if(CModule::IncludeModule("iblock")){
		$dbSection = CIBlockSection::GetList(
			array("SORT"=>"ASC"),//сортировка по возрастанию. нам все равно
			array(
				"IBLOCK_ID" => $iblock_id,//ищем наше свойство по ID инфоблока
				"CODE" => $secNow//и по найденному SECTION_CODE
				),
			false,//хз че
			array($custom_name)//тут собсно то, что нам нужно достать
		);
		if ($arSection = $dbSection->GetNext()){
			$new_name = $arSection["$custom_name"];
		}
	}
	$title = htmlspecialcharsex($arResult[$index]["TITLE"]);//из стандартного шаблона
	if ($new_name) {//если нашли, что нам нужно, присваиваем его
		$name=$new_name;
	}
	else {//если нет - оставляем стандартный
		$name=$title;
	}
	
	if($arResult[$index]["LINK"] <> ""&&$index<(count($arResult)-1))//уже попсовый костыль, чтоб последняя крошка была без ссылки
		$strReturn .= '<li><span typeof="v:Breadcrumb"><a href="'.$arResult[$index]["LINK"].'" title="'.$title.'" rel="v:url" property="v:title">'.$name.'</a><span></li>';
	else
		$strReturn .= '<li>'.$name.'</li>';
}
$strReturn .= "</ul> ";//$str
return $strReturn;

Рабочий код! Еще раз спасибо, Васильев!
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
vasilyev
@vasilyev
php, 1c-bitrix
Если компонент, в arResult которого вам нужно вывести пользовательское свойство, это Каталог, то там в редакторе можно выбрать, какие свойства выводить, они и будут в массиве PROPERTIES лежать. Например, если у вас catalog.section, то свойство SOMETHING будет лежать примерно тут:$arResult['ITEMS'][$i]['PROPERTIES']['SOMETHING']; и значение его будет лежать тут:
$arResult['ITEMS'][$i]['PROPERTIES']['SOMETHING']['VALUE'];


Если же у вас какой-то другой компонент, то в шаблоне компонента в файле result_modifier.php можно добавлять в arResult что вам нужно, например методом CIBlockSection::GetList.

Если вставлять что-то нужно в конец цепочки, то есть метод CMain::AddChainItem.

Вставить в меню, если честно, не очень представляю как правильно. И не очень представляю, зачем.
Ответ написан
@krang13 Автор вопроса
Спасибо за ответ!
С каталогом все более менее ясно. там задаются параметры вручную. А в тех же крошках непонятен (мне по крайней мере) алгоритм формирования массива $arResult. В выдаче параметры NAME да LINK. И на выходе название раздела берется автоматически и названием пункта меню и хлебной крошки, а их нужно настраивать вручную. Такая вот нужда для СЕО.
Не могли бы направить по этому классу CIBlockSection::GetList по компоненту breadcrumbs. Какие параметры передавать, если в arParams только ID инфоблока.. Пробовал уже что-то прописать там, но не вышло..
Да, стоит уточнить, что в компоненте хлебных крошек нужно вывести свойства компонента каталог.. :/
Ответ написан
@krang13 Автор вопроса
Спасибо еще раз!
Но, видимо, так не получится. Не затирается arResult старый. что тогда в компоненте должно быть? ничего? Тоже не выходит.
Еще момент. Свойство используется то, которое дополнительное UF_. тогда вместо
array('PROPERTY_'.$custom_name)
//будет так? 
array('UF_ALT_NAME')
//а вместо 
$new_name = $arSection['PROPERTY_'.$custom_name.'_VALUE'];
//сработает? 
$new_name = $arSection['UF_ALT_NAME'];

вот тут я не уверен..где же те самые знатоки, чтоб попинали..
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы