Матвей Земсков

Заметки веб-мастера

Четверг, 08 ноября 2018 20:43

Переносим настройки полей инфоблоков при импорте из XML файла

Оцените материал
(0 голосов)

Как известно в полях инфоблоков Битрикс хранятся различные настройки для элементов. В частности настройки изображения для анонса и детального изображения: возможность уменьшения изображения при добавлении его к элементу а также размеры до которых оно может быть уменьшено.

Все бы хорошо, но при экспорте инфоблока в формат XML, эти настройки не сохраняются в файле. Получается, что при импорте их нужно устанавливать вручную. Хорошо, если вы помните их значения и сможете внести их в настройки полей, но большинство их не запоминает. К тому же кто-то может просто не обратить на них внимание, понадеявшись, что они загрузятся из файла импорта. В итоге изображения на сайте выведутся некорректно.

Что же делать, чтобы эти настройки инфоблоков переносились при импорте XML-файла? Нужно написать обработчик события создания инфоблока. Это событие называется “OnAfterIBlockAdd”.

Данные о размерах изображения для анонса и детального изображения сохраним в отдельном файле в виде массива. Файл с настройками полей инфоблоков будет иметь следующий вид.

PHP

	<?
	return array(
		"employees" => Array(
				"IBLOCK_ID" => "2",
				"IBLOCK_CODE" => "employees",
				"NAME"=> "Команда",
				"PREVIEW_PICTURE_WIDTH"=>"340",
				"PREVIEW_PICTURE_HEIGHT"=>"340",
				"DETAIL_PICTURE_WIDTH"=>"600",
				"DETAIL_PICTURE_HEIGHT"=>"600",	
			)
	 );
	?>

Здесь я привел описание одного инфоблока bitrix, в реальности этих элементов в массиве может быть много – вернее столько, сколько у вас инфоблоков.

Поясню, что означают элементы массива:

  • IBLOCK_ID – ИД инфоблока;
  • IBLOCK_CODE – символьный код инфоблока;
  • NAME – название инфоблока;
  • PREVIEW_PICTURE_WIDTH – максимальная ширина изображения для анонса;
  • PREVIEW_PICTURE_HEIGHT – максимальная высота изображения для анонса;
  • DETAIL_PICTURE_WIDTH – максимальная ширина детального изображения;
  • DETAIL_PICTURE_HEIGHT - максимальная высота детального изображения;

В файле /bitrix/php_interface/init.php (или /local/php_interface/init.php) разместим код регистрации обработчика события “OnAfterIBlockAdd”.

PHP

	AddEventHandler("iblock", "OnAfterIBlockAdd", Array("MyClass", "OnAfterIBlockAddHandler"));

Далее размещаем код самого обработчика события.

PHP

<?
	class MyClass
	{
	   // создаем обработчик события "OnAfterIBlockAdd"
		function OnAfterIBlockAddHandler(&$arFields){
			// подключим файл с массивом данных об инфоблоке
			if(file_exists($_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/include/sett_flds.php"))
			$arSettFlds = include $_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/include/sett_flds.php";
			
				if($arFields["ID"] > 0 && array_key_exists($arFields["CODE"], $arSettFlds)){
				if(CModule::IncludeModule('iblock')){
					$arFlds = Array();
					$curIBId = $arFields["ID"];
					$arFlds = CIBlock::GetFields($curIBId);
					
					if(!empty($arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_WIDTH"]) || !empty($arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_HEIGHT"])){
						$arFlds["PREVIEW_PICTURE"]["DEFAULT_VALUE"]["SCALE"] = "Y";
						$arFlds["PREVIEW_PICTURE"]["DEFAULT_VALUE"]["WIDTH"] = $arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_WIDTH"];
						$arFlds["PREVIEW_PICTURE"]["DEFAULT_VALUE"]["HEIGHT"] = $arSettFlds[$arFields["CODE"]]["PREVIEW_PICTURE_HEIGHT"];
					}
					
					if(!empty($arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_WIDTH"]) || !empty($arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_HEIGHT"])){
						$arFlds["DETAIL_PICTURE"]["DEFAULT_VALUE"]["SCALE"] = "Y";
						$arFlds["DETAIL_PICTURE"]["DEFAULT_VALUE"]["WIDTH"] = $arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_WIDTH"];
						$arFlds["DETAIL_PICTURE"]["DEFAULT_VALUE"]["HEIGHT"] = $arSettFlds[$arFields["CODE"]]["DETAIL_PICTURE_HEIGHT"];
					}
					
					CIBlock::SetFields($curIBId, $arFlds);				
				}
				else{
					AddMessage2Log('Не установлен модуль «Информационные блоки» (iblock)');
				}
			}
			else
				AddMessage2Log("Ошибка добавления записи (".$arFields["RESULT_MESSAGE"].").");
		}
	}
?>

В нем мы сначала подключаем файл sett_flds.php, в котором хранятся настройки полей инфоблоков. Далее проверяем значение аргументов, которые переданы в обработчик события. В первую очередь нас интересует ID созданного инфоблока и существует ли массив с настройками этого инфоблока в нашем массиве настроек. Если эти условия выполнены, то далее подключаем модуль «Информационные блоки» (iblock) и получаем параметры только что созданного инфоблока. Сохраняем их в переменной $arFlds. Если в нашем массиве существуют настройки для этого инфоблока, мы помещаем их значения в соответствующие элементы массива $arFlds. Делаем это 2 раза – для изображения для анонса и для детального изображения. Далее сохраняем настройки инфоблока в строке с кодом CIBlock::SetFields($curIBId, $arFlds);

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

Прочитано 6010 раз
Мои услуги

Предлагаю следующие услуги:

  • Верстка шаблона сайта из дизайн-макета для CMS «1С-Битрикс Управление сайтом» и CMS “Joomla”
  • Создание форм различной сложности (обратная связь, анкеты и тп) для указанных CMS
  • Настройка и кастомизация компонентов и модулей для указанных CMS
  • Доработка модулей и компонентов для указанных CMS, добавление нестандартного функционала
  • Разработка лендингов (landing-pages)

По все вопросам обращайтесь через форму обратной связи

Скачать

Предлагаю вашему вниманию:

Наверх