Структура компонентов
Библиотечные компоненты платформы ТАО имеют единую структуру, основанную на концепции MVC. При разработке собственного компонента желательно придерживаться данной архитектуры.
Файловая структура компонента
При создании модулей компонента нельзя забывать про систему загрузки, требующую специального именования файлов.
Минимальная структура компонента представляет собой папку, названную по имени компонента, с одним единственным файлом, описывающим его класс.
// components/Test/Test.php Core::load('Component.Test.Router'); class Component_Test extends CMS_Component implements Core_ModuleInterface { }
При объявлении класса компонента необходимо реализовывать интерфейс Core_ModuleInterface. Даже при условии, что класс CMS.Component, от которого происходит наследование, уже реализует данный интерфейс.
Максимальная структура компонента может быть ограничена лишь фантазией разработчика.
Базовая файловая архитектура компонента
Состав папок/файлов может быть изменен в зависимости от задач, решаемых в компоненте, нет жесткого требования заводить все папки.
Важно! Все файлы для переопределения должны быть скопированы в папку app с сохранением полного пути (т.е. с копируем все папки, в которых хранится файл). И только в папке app можно производить какие-либо изменения с файлами. Особенно это касается конфигурационных настроек, файлов стилей, скриптов или шаблонов (папки: config, scripts, styles, views).
app
Папка предназначена для переопределения библиотечных классов, методов, или любых иных сторонних классов, которые не относятся к библиотечным, но требуются для организации дополнительной функциональности компонента. Обычно эта папка требуется в библиотечных компонентах, т.к. любые изменения в библиотеке классов не допустимы.
config
Папка для хранения различных конфигурационных настроек компонента. Подробно об организации и структуре настроек в статье.
lib
Папка, где будет храниться весь php-код. Т.е. здесь будут храниться модули, описывающие основной функционал компонента (контроллеры, роутер, различные утилиты или хелперы и многое другое) и любой дополнительный, который требуется для решения различных задач компонента. Все модули необходимо изначально размещать в папках, подразумевая, что модулей одной функциональной направленности может быть больше одного (например, несколько контроллеров, мапперов). Если точно известно, что модуль будет один, этим правилом можно пренебречь.
Номенклатура подразделов (папок/файлов) в структуре lib
- Router.php - модуль, отвечающий за маршрутизацию и генерацию урлов компонента.
// components/Test/lib/Router.php class Component_Test_Router extends CMS_Router { protected $controllers = array(); // массив контроллеров, которые будут срабатывать по определенным урлам }
- Controller - папка содержит модули контроллеров. Основным назначением которых является реализация различных действий с данными, подгрузки других модулей (например, шаблонов).
// Если контроллер один // components/Test/lib/Controller.php Core::load('CMS.Controller'); class Component_Test_Controller extends CMS_Controller implements Core_ModuleInterface { }
// Если их больше одного, то храним все модули в отдельной папке // components/Test/lib/Controller/FullPageController.php Core::load('CMS.Controller'); class Component_Test_Controller_FullPageController extends CMS_Controller implements Core_ModuleInterface { }
- DB - папка содержит модули описания бизнес-логики доступа к данным и методов их обработки. Здесь следует хранить модули с описанием ORM-мапперов и классы, которыми оперирует ORM-маппер (ORM.Entity).
// components/Test/lib/DB/Tests.php class Component_Test_DB_Tests extends CMS_ORM_Mapper implements Core_ModuleInterface { public function setup() { return parent::setup() ->table('tests') ->classname('Component.Test.DB.Test'); } } class Component_Test_DB_Test extends CMS_ORM_Entity implements Core_ModuleInterface { public function setup() { return parent::setup(); } }
- Services - папка для хранения различных сервисов компонента.
// components/Test/lib/Services/TestService.php class Component_Test_Services_TestService implements Core_ModuleInterface { }
В системе будет доступен через вызов метода:
CMS::component('NameComponent')->service('имя_сервиса')
- Admin - папка для хранения пользовательских контроллеров табличного администрирования.
//Если админский контроллер только один // components/Test/lib/Admin.php Core::load('CMS.Controller.Table'); class Component_Test_Admin extends CMS_Controller_Table implements Core_ModuleInterface { protected $orm_name = 'test'; }
//Если админских котроллеров больше одного, то храним их в отдельной папке // components/Test/lib/Admin/Test.php Core::load('CMS.Controller.Table'); class Component_Test_Admin_Test extends CMS_Controller_Table implements Core_ModuleInterface { protected $orm_name = 'test_1'; }
- Helper - папка предназначена для хранения модулей, призванных упростить генерацию кода в шаблонах, путем выноса необходимой логики в хелперы. О хелперах подробнее.
// components/Test/lib/Helper/TestHelper.php class Component_Test_Helper_TestHelper implements Templates_HelperInterface, Core_ModuleInterface { }
- CLI.php - Модуль для реализации сценариев запуска PHP-кода из командной строки. Подробнее о в статье.
// components/Test/lib/CLI.php Core::load('CMS.CLI'); class Component_Test_CLI extends CMS_CLI_Handler implements Core_ModuleInterface { }
scripts
Файл для хранения различных js-скриптов.
styles
Файлы стилей компонента.
views
Папка для хранения шаблонов компонента.