djvirus

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
Рис 1. Обработка данных в CakePHP

Рис 2. Обработка данных в ETU Framework
Рис 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 сообщений
  • авторизацию на основе пользователей-ролей-привилегий-уровней
  • баннерный модуль

и многое другое.

Рис 3. Скриншот админки
Рис 3. Скриншот админки

Резюме

На сегодняшний день на движке ETU Framework уже работают 9 сайтов и 2 закрытые многопользовательские системы, и ещё несколько находятся в стадии разработки. Статистика показывает, что он позволил нам уменьшить сроки разработки панели администратора в три, а фронтэнда сайта - в два раза, на нём легко реализуются интерфейсы управление базами данных с довольно сложной структурой. Несколько разработчиков уже успели оценить все прелести движка и дают ему высокие оценки. Конечно-же нужно отдать должное CakePHP, частично, добится таких результатов нам удалось за счёт него.

Comments are closed.