Feb 16th, 2007
Framework
ETU Framework - это движок компании E-telegence Ukraine предназначенный пока только для внутреннего использования, так что можете не искать исходников и какой-либо информации на офсайте, хотя в перспективе возможно он станет opensource. Я являюсь руководителем данного проекта и мне хотелось бы поделиться идеями с народом, выслушать мнения и советы.
Проект представляет из себя фреймворк на фреймворке (за основу взят CakePHP 1.1). Состоит он из трёх отдельных частей:
- CakePHP 1.1 - постоянно обновляется до самой свежей версии. Для расширения функциональности я сделал в нём около пяти маленьких патчей, так как некоторые части CakePHP нельзя внедриться простым наследованием.
- ETU Framework - объектно-ориентированный движок, набор самых необходимых библиотек реализующих основные сущности веб-программирования (списки, формы, контролы, таблицы, …), а так же основную структуру сайта.
- ETU CMS - минимальная функциональность - основа для создания практически любого сайта.
Коротко о ETU Framework
Основная цель фреймворка - обеспечить разработчика всем необходимым фаршем для упрощения создания стандартных вещей - списков и форм. Через наследование базовые модель и контроллер CakePHP дополняются новыми возможностями. Например модели умеют работать с древовидными каталогами, обрабатывать и сохранять загружаемые файлы, пересчитывать поле “order” для записей (поле для ручного задания порядка сортировки, например в категориях товаров). Контроллер имеет базовые action-ы для создания полноценного редактирования списка в админке, загружает language-файлы и делает прочую мелкую работу характерную для любого сайта.
Для тех кто первый раз слышит про CakePHP, его основу составляют три группы классов:
- контроллер (Controller) обрабатывает запросы, его методы (action) вызываются специальным диспечером на основе url, обработанного router-ом
- модель (Model) работает с базой данных
- шаблон страницы (View) рисует страницу, каждый шаблон ассоциируется со своим action-ом контроллера
и ещё несколько важных терминов:
- компонент (Component) - модуль контроллера, например авторизация может быть реализована в виде компонента и подключаться в каждом контроллере
- хелпер (Helper) - модуль шаблона, помогают рисовать html, например, предоставляют средства для создания элементов форм, таблицы формы, мета-тегов и т.п.
- елемент (element), это не объект, а просто подщаблон, для вынесения повторяющихся частей кода
- лайауты (layout), шаблоны страниц (хеадер и футер)
Более детальную информацию вы можете получить на сайте cakephp.org и в группе Google.
Основой движка является компонент “Editor”, на основе xml-схемы он создаёт объектную модель, которая обрабатывает данные (готовит к выводу или сохранению) и рисует интерфейсы. Вместо стандартной схемы обработки данных CakePHP (где данные приходят из формы в массив, а затем, при успешной валидации, этот массив уходит на сохранение в модель, иначе обратно в форму, (Рис 1) я использовал пятиуровневую систему преобразования данных (Рис 2). Здесь данные приходят из формы и каждое поле преобразуется специальным объектом контролом (Control) в свой собственный внутренний формат в соответствии с типом данных. Как видно из схемы всего у контрола пять основных методов преобразования данных, назначение которых понятно из названия:
- model2Control
- form2Control
- control2Model
- control2View
- render (control2Form)

Рис 1. Обработка данных в CakePHP

Рис 2. Обработка данных в ETU Framework
С помощью такой системы можно создавать интерфейсы для редактирования типов данных любой сложности! В фреймворке заложены около десяти стандартных типов контролов (text, select, file, date и т.п.). Гибкая реализация контролов позволяет им обрабатывать несколько полей таблицы, или рисовать несколько элементов в форме. Кроме обработки данных и отрисовки себя в форме контрол ещё отвечает за части SQL, связанные с полями таблицы которые он обрабатывает, а также валидацию.
Для полноценной генерации интерфейсов кроме контролов Editor имеет ещё несколько важных групп объектов из которых и строится объектная модель:
- EditorList - создаёт список, содержит форму поиска (EditorFilter), список колонок (ListColumn), Pagination и Ordering
- EditorForm - создаёт форму, содержит список полей (EditField) и объект Form
- EditorFilter - наследуется от формы и выполняет функции связанные с поиском
- Form - отвечает за тег <form>
- ListColumn - создаёт колонку таблицы (рисует ячейку в заголовке и ячейки с даннными). Колонка, в зависимости от типа, может содержать текст, контролы, объекты Action
- Pagination - отвечает за разбиение списка на страницы, рисует соответствующие элементы управления
- Ordering - отвечает за сортировку колонок, рисует соответствующие элементы управления
- EditField - создаёт поле формы (обычно это название поля и контрол-элемент формы), похож на ListColumn, учавствует в валидации
- Action - создаёт активные элементы управления (кнопки, линки), как правило состоит из объекта URL и контрола
- URL - генерит все url-ы Editor-а, этой группе выделяется особое значение - связывать интерфейс, который не обходится без переходов по страницам, в одно целое, запоминать состояние. Также эта группа отвечает за SEF (красивые url-ы)
- Tag - html-тег, эта группа лежит в основе всех остальных групп, практически все html-теги Editor-a рисуются именно средствами TagObject и TagContainer, за таблицы отвечает TagTable. Задача этих объектов - рисовать валидный html на основе xml-шаблона
Про каждую из этих групп можно написать целую статью, каждая имеет свою иерархию классов, а Editor всем этим управляет. Система позволяет в вашем приложении на основе этих объектов создавать любые свои и реализовывать любые взаимодействия между ними. Как я уже говорил, объектная модель создаётся рекурсивно на основе xml-схемы, понять как объекты разных групп взаимодействуют друг с другом можно из следующего примера users_editor.admin.xml. Это упрощённая xml-схема для создания секции редактирования пользователей в админке. Теперь вкратце о том, как это работает, ниже приведу последовательность создания интерфейса:
- Контроллер подключает компонент Editor
- Editor загружает xml-схему и на её основе создаёт объектную модель списка, или формы
- Контроллер получает объектную модель и инициализирует её данными прочитанными из формы, или из базы данных
- Контроллер передаёт проинициализированную объектную модель шаблону страницы (метод set() контроллера)
- Шаблон страницы получает объектную модель и вызывает её render
- Объекты рекурсивно отрисовывают себя (каждый объект вызывает render своих вложенных объектов)
В стандартных задачах все эти действия выполняют средства фреймворка. При необходимости логику можно изменять переопределяя методы контроллера, action-ы, а также создавая свои шаблоны страниц. В логику работы объектов Editor-а можно внедриться тремя способами (используя каждый следующий, если не хватает предыдущего):
- через xml-схему, передавая параметры объекту через атрибуты и вложенные теги
- через создание специальных объектов классов EditorHandler и их событий
- посредством создания собственных классов Editor-а (наследуясь от стандартных)
Почему ETU Framefork лучше, чем просто CakePHP
Структура проекта на движке ETU Framework от обычного CakePHP отличается главным образом полным отказом от хелперов и заменой его более продвинутым компонентом Editor. Модели, view-ы и контроллеры работают как и раньше, более того, никто не запрещает писать на чистом кейке и при этом использовать средства фреймворка. Из большого числа возможностей фреймворка отмечу основные:
- Многие стандартные действия выполняются автоматически средствами фреймворка, шаблоны для view-ов в стандартных action-ах (особенно в админке) стали не обязательными
- Во view-ах появились language-файлы, которые могут рулить не только надписи и заголовки, а также мета-теги layout-а
- Заменился стандартный router на более простой и гибкий, точнее роутеров стало два, сначала срабатывает фреймворковский, а затем уже КейкПХП-шный, который уже получает на вход преобразованный url в понятном ему формате
- Появились секции (sections), для разделения разных частей проекта
- Появился компонент авторизации, простой и понятный, т.к. так до сих пор никто и не видел как работает родной кейковский ACL
ETU CMS
Система управления сайтом разработанная на базе ETU Framework также активно развивается. На данный момент она уже включает модули (включая полноценное управление и отображение на сайте):
- элементов контента (страниц)
- многоуровневых меню
- блоков
- каталоги в различных модификациях
- Shopping cart c онлайн платежами
- шаблонов и системы нотификационных e-mail сообщений
- авторизацию на основе пользователей-ролей-привилегий-уровней
- баннерный модуль
и многое другое.
Резюме
На сегодняшний день на движке ETU Framework уже работают 9 сайтов и 2 закрытые многопользовательские системы, и ещё несколько находятся в стадии разработки. Статистика показывает, что он позволил нам уменьшить сроки разработки панели администратора в три, а фронтэнда сайта - в два раза, на нём легко реализуются интерфейсы управление базами данных с довольно сложной структурой. Несколько разработчиков уже успели оценить все прелести движка и дают ему высокие оценки. Конечно-же нужно отдать должное CakePHP, частично, добится таких результатов нам удалось за счёт него.