Генерация символьных кодов элементов или разделов в 1c-bitrix.

Генерация символьных кодов элементов или разделов в 1c-bitrix.

Записки программиста

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

ЧПУ - человеку понятный урл. Другими словами это транслитерированная латиницей часть урла. Мы уже разбирали транслитерацию русского алфавита на пхп. В битриксе есть такая функция, она используется, например, когда создается новый элемент или раздел инфоблока, символьный код этого элемента или раздела генерируется из его названия. Но что делать, если элементы уже созданы, а символьные коды не прописаны. Давайте рассмотрим решение для этого случая:


<?
		//генерация символьных кодов в битриксе        
                //https://dev.1c-bitrix.ru/community/webdev/user/30522/blog/6794/ - оригинальная статья

	if(!CModule::IncludeModule("iblock"))
	{
	   echo "Error with iblock module!";
	   die;
	}
	$arParams['IBLOCK_ID'] = 28; //id инфоблока
	$arParams['LIST_CNT'] = 50; //количество элементов для генерации
	$arParams['TYPE_WORK'] = 'element'; // {section | element}  указываем для кого генерировать код

	$arOrder = array(
	   "sort" => "inc",
	);

	$arFilter = array(
	   "IBLOCK_ID" => $arParams['IBLOCK_ID'],
	   "IBLOCK_LID" => "s1"		//имя сайта
	   //"CODE" => "",
	   //"CODE" => false
	);

	$arTransParams = array( //(максимальная длина кода,регистр(нижний,верхний,не менять),
			//заменять пробел на...,остальные символы менять на...,удалять лишние символы замены)
	   "max_len" => 100,
	   "change_case" => 'L', // 'L' - toLower, 'U' - toUpper, false - do not change
	   "replace_space" => '-',
	   "replace_other" => '-',
	   "delete_repeat_replace" => true
	);

	if($arParams['TYPE_WORK'] == 'section'){//для разделов
	   $db_elemens = CIBlockSection::GetList($arOrder, $arFilter, false);
	   $db_elemens->NavStart($arParams['LIST_CNT']);
	   echo '<pre>';
	   while($ar_res = $db_elemens->GetNext())
	   {
		  $transName = CUtil::translit($ar_res["NAME"], "ru", $arTransParams);
		  $arPropArray = Array( "CODE" => $transName );
		  
		  $el = new CIBlockSection;
		  $res = $el->Update($ar_res["ID"], $arPropArray);
		  echo "result for <b>".$ar_res["NAME"]."</b> is <b>".$transName.'</b>'.($res?" and OK":" and failed")."\r\n";
	   } 
	   echo '</pre>';
	}elseif($arParams['TYPE_WORK'] == 'element'){//для элементов
	   $db_elemens = CIBlockElement::GetList($arOrder, $arFilter, false, array("nTopCount" => $arParams['LIST_CNT']));
	   echo '<pre>';	//для форматированного вывода результата генерации
	   while($obElement = $db_elemens->GetNextElement())
	   {
			 $ar_res = $obElement->GetFields();
			  $transName = CUtil::translit(trim($ar_res["NAME"]), "ru", $arTransParams);//функция генерации сим. кода из имени
			  $arPropArray = Array( "CODE" => $transName."-".$ar_res["ID"], );//к готовому коду добавляем "префикс" - "-id"
			  
			  $el = new CIBlockElement;
			  $res = $el->Update($ar_res["ID"], $arPropArray);//записываем результат, перезаписываем код у данного элемента
			 echo $transName."-".$ar_res["ID"]."<br />";  //выводим результат
	   }
	   echo '</pre>';
	}
?>
				

Запускайте несколько раз пхп-скрипт в отдельном файле или в пхп-консоли в админке битрикса, пока не перестанут выходить сообщения об успешной генерации символьного кода. В итоге в поле "Символьный код" появится латинская строка в виде соответствующего чпу.

Лыжи детские: lyzhi-detskie
Игрушка LEGO: igrushka-lego