171  /  381

Автоматическая генерация ORM-классов

Просмотров: 24857
Дата последнего изменения: 27.10.2020
Татьяна Старкова
Сложность урока:
4 уровень - сложно, требуется сосредоточится, внимание деталям и точному следованию инструкции.
1
2
3
4
5
Недоступно в редакциях:
Ограничений нет

Автоматическая генерация

Для использования генератора ORM классов перейдите на страницу Настройки > Настройки продукта > Настройки модулей > Монитор производительности (модуль Монитор производительности (perfmon) должен быть установлен) и на вкладке Генератор таблетов Вкладка доступна с версии 20.0.100 модуля Монитор производительности (perfmon).

отметьте поле Разрешить генерацию таблетов для ORM.

У генератора имеются следующие параметры:

ПараметрОписание
Использовать короткие алиасы классовПри включенной опции вызовы классов будут вида:
new IntegerField('ИМЯ_ПОЛЯ')
new LengthValidator(null, 255)
new Reference()

При выключенной:

new Fields\IntegerField('ИМЯ_ПОЛЯ')
new Fields\Validators\LengthValidator(null, 255)
new Fields\Relations\Reference()
Описание параметров полей таблета через методыПри включенной опции практически все параметры поля задаются через вызовы соответствующих методов:
(new StringField('API_CODE'))->configureSize(50)

При выключенной:

new StringField('API_CODE', ['size' => 50])
Имена полей в картеПри включенной опции метод getMap таблета будет возвращать массив, где индексами являются имена полей. При выключенной - нумерованный массив.

Использование генератора ORM классов до версии perfmon 20.0.100

После включения генератора таблетов на странице Настройки > Производительность > Таблицы в меню действий станет доступен пункт ORM.

Примечание: Имена файлов таблетов предлагаются с суффиксом table (Например: было product.php, стало - producttable.php).

Примечание: Описания полей создаются в виде создания объектов-наследников \Bitrix\Main\ORM\Data\Field (а не в виде ассоциативных массивов как было до версии 20.0.100 модуля perfmon )

Для полей типа timestamp / date / datetime анализируется дефолтное значение (sql). Если это функция, возвращающая текущее время, то в таблете создается функция для получения текущего времени/даты:

'default' => function()
{
   return new DateTime();
}

Другие особенности для полей:

  • Поле помечается как mandatory только в случае, когда поле является обязательным и не имеет значения по-умолчанию;
  • Поля типа text / mediumtext не помечаются как строка.

  Пример

Пример автоматического создания ORM-класса

Рассмотрим пример автоматического создания ORM-класса для штатной таблицы шаблонов сайта b_site_template. Воспользуемся пунктом ORM и получим следующий код:

<?php
namespace Bitrix\Site;

use Bitrix\Main\Localization\Loc,
	Bitrix\Main\ORM\Data\DataManager,
	Bitrix\Main\ORM\Fields\IntegerField,
	Bitrix\Main\ORM\Fields\StringField,
	Bitrix\Main\ORM\Fields\Validators\LengthValidator;

Loc::loadMessages(__FILE__);

/**
 * Class TemplateTable
 * 
 * Fields:
 * <ul>
 * <li> ID int mandatory
 * <li> SITE_ID string(2) mandatory
 * <li> CONDITION string(255) optional
 * <li> SORT int optional default 500
 * <li> TEMPLATE string(255) mandatory
 * </ul>
 *
 * @package Bitrix\Site
 **/

class TemplateTable extends DataManager
{
	/**
	 * Returns DB table name for entity.
	 *
	 * @return string
	 */
	public static function getTableName()
	{
		return 'b_site_template';
	}

	/**
	 * Returns entity map definition.
	 *
	 * @return array
	 */
	public static function getMap()
	{
		return [
			new IntegerField(
				'ID',
				[
					'primary' => true,
					'autocomplete' => true,
					'title' => Loc::getMessage('TEMPLATE_ENTITY_ID_FIELD')
				]
			),
			new StringField(
				'SITE_ID',
				[
					'required' => true,
					'validation' => [__CLASS__, 'validateSiteId'],
					'title' => Loc::getMessage('TEMPLATE_ENTITY_SITE_ID_FIELD')
				]
			),
			new StringField(
				'CONDITION',
				[
					'validation' => [__CLASS__, 'validateCondition'],
					'title' => Loc::getMessage('TEMPLATE_ENTITY_CONDITION_FIELD')
				]
			),
			new IntegerField(
				'SORT',
				[
					'default' => 500,
					'title' => Loc::getMessage('TEMPLATE_ENTITY_SORT_FIELD')
				]
			),
			new StringField(
				'TEMPLATE',
				[
					'required' => true,
					'validation' => [__CLASS__, 'validateTemplate'],
					'title' => Loc::getMessage('TEMPLATE_ENTITY_TEMPLATE_FIELD')
				]
			),
		];
	}

	/**
	 * Returns validators for SITE_ID field.
	 *
	 * @return array
	 */
	public static function validateSiteId()
	{
		return [
			new LengthValidator(null, 2),
		];
	}

	/**
	 * Returns validators for CONDITION field.
	 *
	 * @return array
	 */
	public static function validateCondition()
	{
		return [
			new LengthValidator(null, 255),
		];
	}

	/**
	 * Returns validators for TEMPLATE field.
	 *
	 * @return array
	 */
	public static function validateTemplate()
	{
		return [
			new LengthValidator(null, 255),
		];
	}
}
File: /bitrix/modules/site/lang/ru/lib/templatetable.php
<?
$MESS["TEMPLATE_ENTITY_ID_FIELD"] = "";
$MESS["TEMPLATE_ENTITY_SITE_ID_FIELD"] = "";
$MESS["TEMPLATE_ENTITY_CONDITION_FIELD"] = "";
$MESS["TEMPLATE_ENTITY_SORT_FIELD"] = "";
$MESS["TEMPLATE_ENTITY_TEMPLATE_FIELD"] = "";
?>
Таблицы базы данных

Преобразовав этот результат нужным образом получим настоящий класс для работы с шаблонами, расположенный по пути /bitrix/modules/site/lib/templatetable.php.


18
Курсы разработаны в компании «1С-Битрикс»

Если вы нашли неточность в тексте, непонятное объяснение, пожалуйста, сообщите нам об этом в комментариях.
Развернуть комментарии