О web-разработке
и даже немного больше...

Создание инфоблока при установке модуля

Если некоторый код используется довольно часто и на разных проектах, имеет смысл его вынести в отдельный модуль. Не редко для работы модуля используются инфоблоки, которые существенно упрощают работу с данными. Чтобы установка модуля была довольно простой, удобно создавать инфоблоки в момент установки модуля. Для этого создаётся полная сборка модуля, которая может программно выполнять нужные операции с данными в момент установки.

Основной файл с описанием установки модуля находится в папке install модуля:
/install/index.php

Файл содержит класс, в котором есть методы DoInstall() а так же DoUninstall(). Каждый из этих методов вызывается в свою очередь когда производится установка либо удаление модуля. Таким образом, мы можем создать дополнительные методы, которые будут выполнять создание инфоблока, и других данных, и вызываться этот метод будет в DoInstall(). Аналогично и с удалением данных, через метод DoUninstall().

Создание нового типа инфоблока

Для примера, создадим инфоблок с кодом custom_iblock_type.

public function AddIblockType(){

	global $DB;
	CModule::IncludeModule("iblock");

	// код для типа инфоблоков
	$iblockTypeCode = 'custom_iblock_type';

	// проверяем на уникальность
	$db_iblock_type = CIBlockType::GetList(
						Array("SORT" => "ASC"),
						Array("ID" => $iblockTypeCode)
					);
	// если его нет - создаём
	if (!$ar_iblock_type = $db_iblock_type->Fetch()){
		$obBlocktype = new CIBlockType;
		$DB->StartTransaction();

		// массив полей для нового типа инфоблоков
		$arIBType = Array(
						'ID' => $iblockTypeCode,
						'SECTIONS' => 'Y',
						'IN_RSS' => 'N',
						'SORT' => 500,
						'LANG' => Array(
							'en' => Array(
								'NAME' => GetMessage("IB_TYPE_NAME"),
							),
							'ru' => Array(
								'NAME' => GetMessage("IB_TYPE_NAME"),
							)
						)
					);

		// создаём новый тип для инфоблоков
		$resIBT = $obBlocktype->Add($arIBType);
		if (!$resIBT){
			$DB->Rollback();
			echo 'Error: '.$obBlocktype->LAST_ERROR;
			die();
		} else {
			$DB->Commit();
		}
	} else {
		return false;
	}

	return $iblockType;
}

Вызов метода addIblockType() следует выполнить в методе DoInstall().

$this->AddIblockType();

Таким образом, будет произведено создание нового типа инфоблоков.

Создание инфоблока

Вызов этого метода так же следует прописать в методе DoInstall(), и стоит обратить внимание что эта операция должна идти уже после того, как был создан новый тип инфоблока с кодом custom_iblock_type.

<?

// функция для создания инфоблока
public function AddIblock(){
	CModule::IncludeModule("iblock");

	$iblockCode = 'my_custom_ib_code'; // символьный код для инфоблока
	$iblockType = 'custom_iblock_type'; // код типа инфоблоков

	$ib = new CIBlock;

	// проверка на уникальность
	$resIBE = CIBlock::GetList(
							Array(),
							Array(
								'TYPE' => $iblockType,
								"CODE" => $iblockCode
							)
						);
	if ($ar_resIBE = $resIBE->Fetch()){
		return false;
	} else {
		
		$arFieldsIB = Array(
				"ACTIVE" => "Y",
				"NAME" => 'Название инфоблока',
				"CODE" => $iblockCode,
				"IBLOCK_TYPE_ID" => $iblockType,
				"SITE_ID" => "s1",
				"GROUP_ID" => Array("2" => "R"),
				"FIELDS" => Array(
					"CODE" => Array(
						"IS_REQUIRED" => "Y",
						"DEFAULT_VALUE" => Array(
							"TRANS_CASE" => "L",
							"UNIQUE" => "Y",
							"TRANSLITERATION" => "Y",
							"TRANS_SPACE" => "-",
							"TRANS_OTHER" => "-"
						)
					)
				)
			);
		
		
		return $ib->Add($arFieldsIB);
	}
}

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

Создание свойства инфоблока

При создании свойства необходимо передать IBLOCK_ID инфоблока, который был недавно создан. Так программно свойство будет привязано к конкретному информационному блоку.

public function AddProp($IBLOCK_ID){
	CModule::IncludeModule("iblock");
	
	// массив полей для нового свойства
	$arFieldsProp = Array(
					"NAME" => GetMessage("MY_IBLOCK_PROP"),
					"ACTIVE" => "Y",
					"SORT" => "100",
					"MULTIPLE" => "Y",
					"CODE" => "PROP",
					"PROPERTY_TYPE" => "S",
					"USER_TYPE" => "UserID",
					"IBLOCK_ID" => $IBLOCK_ID
				);

	$ibp = new CIBlockProperty;
	
	// создаём свойство
	$propID = $ibp->Add($arFieldsProp);

	return $propID;
}

В DoInstall() вызов метода будет выглядеть следующим образом:

public function DoInstall(){
	global $APPLICATION;
	$this->AddIblockType();
	$IBLOCK_ID = $this->AddIblock();
	$this->AddProp($IBLOCK_ID);
}

Разумеется, вы можете оформить функции по-своему, так, чтобы вам было более удобно создавать множество свойств и инфоблоков. Здесь код указан исключительно для примера. Как мы знаем, модуль должен уметь как создавать инфоблоки, так и удалять все данные за собой.

Удаление данных инфоблоков

В этом случае достаточно удалить тип информационного блока, при удалении которого, автоматом удалятся так же всё содержимое этого типа инфоблоков. Вызывать этот метод следует в методе DoUninstall().

// удаление данных инфоблоков
public function DelIblocks(){
	global $DB;
	CModule::IncludeModule("iblock");

	$DB->StartTransaction();
	if (!CIBlockType::Delete($this->IBLOCK_TYPE)){
		$DB->Rollback();
		
		CAdminMessage::ShowMessage(Array(
			"TYPE" => "ERROR",
			"MESSAGE" => GetMessage("VTEST_IBLOCK_TYPE_DELETE_ERROR"),
			"DETAILS" => "",
			"HTML" => true
		));
	}
	$DB->Commit();
}

Когда мы производим удаление модуля из админ-части, автоматом будет вызван метод DoUninstall(), в котором и следует обратиться к методу DelIblocks().

public function DoUninstall(){
	$this->DelIblocks();
}

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

Опубликован: 25.06.2020 г.

См. также:

«Не удалось установить соединение с сервером. Проверьте …».
Получение Email-адреса покупателя в заказе (Bitrix D7)
Работа с URL-адресами в Bitrix D7
Работа с купонами в Bitrix API
Добавляем пункт меню для списков в админке Битрикс
Диалоговые окна в Bitrix API
Создание копии корзины из заказа на Bitrix D7
Создание копии заказа в Bitrix D7

Комментарии

  1. Дмитрий пишет:

    Ты где-то $arFieldsIB потерял в создании инфоблока

  2. htmaker пишет:

    Точно, спасибо, исправил.

Добавить комментарий для htmaker Отменить ответ

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

Комментарии
  • Загрузка...
Друзья сайта