Конфигурирование компонента (config)

При разработке компонента желательно все конфигурационные настройки хранить в одном месте. Для этого в файловой структуре компонента существует папка /config/. В стандартной реализации CMS.Component (от которого и наследуется компонент) есть метод config($name) для считывания конфигурации компонента, с помощью которого можно организовать доступ к списку конфигурационных настроек в любом месте кода.

Что желательно выносить в конфиги:

  • настройки, которые не требуется выносить в CMS.Vars;
  • набор стандартных конфигов компонента fields, schema, table, tabs;
  • настройки администратора сайта;
  • любые другие настройки компонента.

Файл настройки представляет собой обычный php-файл, в котором необходимо вернуть ассоциативный массив.

/components/News/config/component.php

return array(
	'orm' => array(
		'news' => 'Component.News.DB',
	),
	'admin_menu' => array(
		'caption' => 'Компонент Новости',
		'path' => '/admin/news/',
	),
);

Стандартные настройки необходимо размещать в специальных зарезервированных файлах:

  • component.php
  • services.php
  • tabs.php
  • fields.php
  • schema.php
  • table.php

Кроме стандартных настроек в файлах можно описывать любые необходимые настройки компонента.

component.php - отвечает за общие настройки компонента. Стандартные настройки:

  • admin_menu - настройка вывода в админке (добавление пунктов меню). Кроме заголовка, ссылки, можно установить иконку напротив пункта меню (icon). Список подпунктов необходимо описывать в массиве свойства items.
// components/Nodus/config.php
return array(
	'admin_menu' => array(
		'caption' => 'Содержимое сайта',
		'path' => CMS::admin_path('nodus/structure'),
		'icon' => 'blogs.png',
		'items' => array(
			'Структура' => CMS::admin_path('nodus/structure'),
			'Материалы' => CMS::admin_path('nodus/items'),
			'Словари' => CMS::admin_path('nodus/taxonomy'),
		),
	),
);
  • commands - регистрация дополнительных методов, которые будут отрабатываться в определенный момент, и должны выполнять какие-то действия над объектом.
// components/Nodus/component.php
return array(
	'commands' => array(
		'indexer' => array(
			'name' => 'reindex',
			'callback' => array('Component_Nodus', 'reindex'),
		),
		'sitemap' => array(
			'name' => 'add_urls',
			'callback' => array('Component_Nodus', 'add_urls_to_sitemap'),
			'args' => array('nodus')
		),
	),
);
  • field_types - настройки для регистрации новых типов полей, если набор стандартных по каким-то причинам не удовлетворяет текущего спроса. Если новых типов больше одного, они перечисляются в массиве: имя типа данных => имя класса, описывающего новый тип данных.
// components/Nodus/config.php
return array(
	'field_types' => array(
		'nodus_link_to_item' => 'Component.Nodus.Fields.ItemLink',
		'nodus_taxonomy_tags' => 'Component.Nodus.Fields.TaxonomyTags.Type',
	),
);
  • insertions - регистрация механизмов вставок.
// components/Nodus/config.php
return array(
	'insertions' => array(
		array(
			'class' => 'Component.Nodus.App.Insertions',
			'names' => array('TAXONOMY', 'CLOUD', 'ITEMLINK', 'ITEMURL', 'ITEMTITLE'),
		),
	),
);
// components/Nodus/config.php
return array(
	'templates' => array(
		'helpers' => array(
			'nodus' => 'Component.Nodus.App.Helper',
		),
	),
);
  • events - регистрация событий.
// components/Nodus/config.php
return array(
	'events' => array(
		'cms.run' => 'Component.Nodus::datatypes',
	),
	// перехват админского метода нодуса on_row($row) для замены своим
	'nodus.admin.items.on_row' => array(
			Component_Nodus::datatype('mydatatype'), 'on_row'
	),
);
  • orm - регистрация orm-мапперов.
// components/Nodus/config.php
return array(
	'orm' => array(
		'nodus_items'     => 'Component.Nodus.App.DB.Items',
		'nodus_structure' => 'Component.Nodus.App.DB.Structure',
		'nodus_taxonomy'  => 'Component.Nodus.App.DB.Taxonomy',
	),
);
  • services - отвечает за регистрацию сервисов компонента.
// components/Nodus/service.php
return array(
	'datatype'  => 'Component.Nodus.App.Services.Datatype',
	'templates' => 'Component.Nodus.App.Services.Templates',
	'selector'  => 'Component.Nodus.App.Services.Selector',
	'taxonomy'  => 'Component.Nodus.App.Services.Taxonomy',
	'urls'      => 'Component.Nodus.App.Services.Urls',
);

schema.php - содержит непосредственно описание схемы таблиц БД.

// components/Delivery/config/schema.php
return array(
	'subscribers' => array(
		'mysql_engine' => 'MyISAM',
		'columns' => array(
			'id' => array('type' => 'serial'),
			'email' => array('type' => 'varchar', 'length' => 255, 'default' => '', 'not null' => true),
			'idate_off' => array('type' => 'int', 'default' => '0', 'not null' => true),
		),
		'indexes' => array(
			array('type' => 'primary key', 'columns' => array('id')),
			array('name' => 'idx_idate_confirm_off', 'columns' => array('idate_confirm', 'idate_off')),
		),
	),
);

fields.php - файл, отвечающий за описание полей таблицы БД.

// components/Rates/config/fields.php
return array(
	'rates' => array(
		'id' => array (
			'caption' => 'ID',
			'type' => 'hidden',
			'sqltype' => 'serial'
		),
		'code' => array(
			'caption' => 'Код',
			'sqltype' => 'VARCHAR(3)',
		),
		'value' => array(
			'caption' => 'Значение',
			'sqltype' => 'VARCHAR(50)',
		),
	),
);

tabs.php - файл, отвечающий за описание вкладок на страницах редактирования в админке.

// components/NodusDicts/config/tabs.php
return array(
	'nodus_dicts' => array(
		'main' => 'Параметры словаря',
		'fields' => 'Поля',
		'misc' => 'Прочее',
	),
);

table.php - в файл можно вынести список свойств админского контроллера Admin.php (orm_name, title_list, title_edit, title_add, norows, др.).

// components/Notes/config/table.php
return array(
	'notes' => array(
		'title_list' => 'Тестовые записи',
	),
);
12.01.2016
Все статьи