Описание PHP-фреймворка Pagen

Для своей работы я использую PHP-фреймворк Pagen, которым решил поделиться с другими разработчиками. В этой статье я кратко опишу возможности фреймворка.

Устанавливаем

Сначала скачает архив с gitHub. В папке www лежат рабочие файлы фреймворка. В файле pagen_mysql.sql находится дамп базы данных (MySQL).

Устанавливать нужно в ручном режиме: вставили файлы фреймворка в рабочую папку, импортировать дамп в только что созданную базу данных и настроить параметры подключения к MySQL в файле pagen_config.php

#. Конфигурация

В файле конфигурации прописана автоматическая подгрузка классов. Также есть 2 закомментированных метода: checkIP (проверка наличия IP посетителя в списке заблокированных IP — system/ban.txt) и toLog (запись данных посетителя в лог-файл). Оба метода вызываются в файле index.php (вызов закомментирован).

Таким образом, классы с папки packages подключаются автоматически при обращении к ним.

Список настроек:

  • LANG — язык сайта по-умолчанию. Значение параметра определяется со списка используемых языков
  • TITLE— заголовок сайта
  • PREFIX— префикс таблиц в БД
  • DB_SERVER— сервер MySQL
  • DB_USER— пользователь MySQL
  • DB_PASS— пароль пользователя MySQL
  • DB_NAME— название базы данных
  • ADMIN_EMAIL— e-mail админа, в отключеном режиме CONFIG_ADMIN_ACCESS используется как логин
  • PASS— закодированный пароль админа, в включеном режиме CONFIG_ADMIN_ACCESS используется как логин. Установлен как "111111", можно сгенерировать новый вызовом метода \Pagen\PassMask::mask('mypass')
  • CONFIG_ADMIN_ACCESS— режим использования пользователей. Если установлен как true, для входа используются данные файла конфигурации (рекомендуется устанавливать, если нет необходимости реализации функционала пользователей, но нужно реализовать администрирование ресурса). Если установлен как false, для входа используется БД, то есть можно использовать регистрацию и реализовывать взаимодействие пользователей.
  • TEMPLATE— используемый сайтом шаблон
  • CHECK_STATIC_PAGE— проверяет наличие статических страниц в базе данных. Рекомендуется использовать, если необходимо создать систему с возможностью модерирования страниц.
  • CHECK_FILES_IN_TEPLATE— если запрашиваемых файлов не существует, то фреймворк ищет их в папке шаблона. Полезно, когда используется несколько шаблонов, но при этом есть желание сохранить краткий URL. К примеру, не //mysite.com/templates/pagen/js/script.js, а //mysite.com/js/script.js
  • GET_USER_DATA— при загрузке страницы получать данные пользователя с базы данных
  • FLY_MODE— активирует режим fly mode, при котором фреймворк не выполняет поиск контроллера, а использует параметры маршрутизации с файла fly_mode_bootstrap.php
  • $langHash— список используемых языков на сайте. Если сайт не предусматривает мультиязычность, установите только один язык.
  • $userRights— инициализация списка прав пользователей. Ключи отвечают за название группы, значения — за соответствующее число в таблице пользователей. Ключ используется в классе \Pagen\User:: для проверки группы юзера (например ::is_v_user ()).
  • $Lang— системная переменная — не обращайте внимания :)

Описание

1. Точки входа. Контроллеры

Фреймворк имеет 2 точки входа: одна запускается, когда пользователь обращается к сайту, а другая — когда javascript [посредством jQuery] делает ajax-запрос. Это сделано для минимизации нагрузки во время ajax-запроса.

Скачанный Pagen предоставляется с демонстрационным приложением: статическими страницами, системой пользователей, блогом и его админкой.

Схема работа php-фреймворка Pagen

2 .Модель представлена двумя компонентами: разделенной моделью данных и логикой приложения

Точка входа для AJAX, как и ядро сайта, вызывает нужный контроллер (но не выполняет поиск необходимого контроллера по каталогу файлов). Контроллер должен записать данные вида. Для получения каких-либо данных он обращается сначала к модели логики приложения, которая получает, обрабатывает и возвращает полученные данные.

3. HMVC-архитектура

Pagen предусматривает возможность вложенных отображений. Для того, чтобы описать иерархическую структуру, нужно в списке подключаемых отображений в контроллере указать отображение, расположенное по уровню ниже, написать перед отображением, в котором оно подключается. Далее в месте, где должен подключаться контроллер, нужно вывести значение переменной $file_{key}, где {key} — ключ отображения, установленный в контроллере.

Пример иерархической структуры можно увидеть в блоге. Главный файл шаблона печатает переменную $file_content, в которую контроллер блога заносит отображение для блога, который, в свою очередь, подключает вид для определенного типа содержимого (список заметок, страница заметки, добавление/редактирование заметки).

4. Кеширование вида

В фреймворке предусмотрена возможность кеширования отображений. К примеру, Интернет-магазин часто имеет на Главной странице блок спецпредложений. Не имеет смысла доставать эти данные с базы данных при каждой загрузке страницы. В Pagen можно закешировать этот блок в HTML-файл, к примеру, на 12 часов.

Для того, чтобы закешировать отображение, необходимо вручную создать каталоги в папке templates/pagen/_cache, в которых расположены файлы отображения.

Пример кеширования вы можете посмотреть в контроллере Главной страницы (index) — кешируется подвал сайта на 30 секунд. Для демонстрации, в футере рандомно выводится какое-то число. На Главной оно в течении 30-ти секунд не будет меняться. Еще одно демо присутствует в методе ctrl_action_pagination контроллера blog, где на одну минуту кешируется пагинация (наглядно можно проверить, удаляя или добавляя новые заметки).

5. Кодирование паролей

За работу с паролями отвечает класс \Pagen\PassMask::. Для кодирования паролей он использует MCrypt с предусмотренной возможностью восстановления пароля. Можно изменить класс на «классический» вариант без возможности восстановления — MD5, однако данный вариант для меня предпочтительнее с точки зрения возможностей для юзабилити.

6. Режим подгрузки файла с шаблона

При включенном CHECK_FILES_IN_TEPLATE если запрашиваемых файлов не существует, то Pagen ищет их в папке шаблона. Полезно, когда используется несколько шаблонов, но при этом есть желание сохранить краткий URL и скрыть название шаблона. К примеру, писать не //mysite.com/templates/pagen/js/script.js, а //mysite.com/js/script.js

7. Маршрутизация и fly mode

При отключенном fly mode точка входа, анализируя URL, ищет контроллер в папке packages/Controllers/. Для примера возьмем запрос //mysite.com/section/blog/category1/2015/.

Если будет файл section.php, он откроется и запустится метод run () контроллера section и параметрами $ctrl->args == ['blog', 'category1', '2015'], а если не будет такого файла и если существует папка section/, поиск будет продолжаться в ней. Иначе мы получим ошибку 404

Если существует файл section/index.php, будет запущен метод run () контроллера section. Кстати, если у класса section будет метод action_blog (), будет запущен именно он, а не run ().

По такой схеме поиск контроллера будет производится в папке section/blog и в папке section/blog/category1. Поиск останавливается на первом найденном в соответствии с URL контроллере.

В конфигурационном файле можно установить режим fly mode. Особенность режима в том, что описанный выше поиск контроллера не воспроизводится, а сразу запускается указанный в файле fly_mode_bootstrap.php контроллер, где ключом служит параметр URL, обрезанный до первого слеша. К примеру, если в конфигурационном файле fly mode прописано 'blog' => '\\Controllers\\blog', то при обращении к //mysite.com/blog/category1/note1 будет вызван контроллер \Controllers\blog.

8. Статические страницы

Если установлена конфигурация CHECK_STATIC_PAGE, перед поиском контроллера Pagen ищет страницу, указанную в URL, в базе данных. Если страница найдена, то производится выборка заголовка, содержимого и мета-тегов страницы с БД и вызывается контроллер IndexController, который получает данные статической страницы и выводит их в установленный шаблон.

9. Система шаблонов

Фреймворк предоставляет возможность использования шаблонов. Это удобно при разработке CMS для определенных задач, когда есть необходимость «подгонять» под один функционал различные шаблоны.

10. Контроллеры вида

Контроллер вида — это система, которая [в отображении] вызывает метод контроллера, получает данные и в ответ возвращает сгенерированный вид. Данная схема позволяет подгружать дополнения, не загромождая метод основного контроллера, и позволяет избегать дублирования кусков кода. Демонстрацию использования можно посмотреть в файле /templates/pagen/blog/list.php — к списку статей блога подгружается пагинация. Этот механизм удобно использовать для генерации отображения через AJAX-контроллеры (пример: .../users/show_more.php).

11. ORM

В качестве конструктора запросов используется класс \Pagen\eModel. Для использования нужно расширить рабочий класс \Pagen\eModel. Примеры кода вы можете найти среди классов пространства имен \Data, где производятся работы с базой данных. Добавлю, что фреймворка отлично работает без «родной» ORM, так как фреймворк не привязывает жесткий формат к логике данных.

В этой статье не буду детально описывать данный класс (как и все остальные — опишу позже). Но добавлю таблицу методов класса, которую составил еще для старой версии класса:

Метод

Описание

1. 

setDefault()

Устанавливает все поля по-умолчанию. Используется, если дополнительно необходимо выполнить еще один запрос, не создавая новый экземпляр модели. Метод не обнуляет таблицу и буфер объекта.

2. 

bufferQuery($isBuffered = true)

Устанавливает буферизацию запросов. То есть запросы сохраняются в свойстве объекта для последующего выполнения буфера

3. 

clearBuffer()

Очищает буфер запросов

4. 

renderBuffer($transaction = true, $union = false)

TEST

Выполняет буферизированные запросы. Первый параметр отвечает за выполнение запросов в трансакции, а второй – за объединение результатов выборки

5. 

setFields(array $myFields)

Устанавливает массив полей для выборки результата. Если для поля нужно задать таблицу, она задается в ключе элемента массива

6. 

addJoin($table1, $id1, $table2, $id2)

TEST

Объединяет таблицы конструкцией INNER JOIN. Например,

$this->addJoin (‘users’, ‘id’, ‘users_info’, ‘user_id’)

Эквивалентно конструкции 

INNER JOIN ‘users_info’ ON ‘users’.’id’ = ‘users_info’. ‘user_id’

7. 

addCond($field, $value, ...)

Добавляет условие выборки. Первый параметр – поле для условия, второй – его значение, третий – условие (=, >, <, >=, <=), четвертый – привязка поля к таблице. Устаревшее описание.

8. 

setUnion($myUnion)

Тип объединения условий выборки. По-умолчанию стоит AND.

9. 

setData($myData)

Устанавливает массив данных

10. 

getData()

Извлекает массив данных

11. 

setTable($myTable)

Устанавливает таблицу, с которой будет работать конструктор. Можно задать массив таблиц. Если массив ассоциативный, то ключ устанавливается как as.

К примеру, код $thid->setTable([‘a’ => ‘table1’, ‘b’ => ‘table2’]); будет устанавливать FROM `table1` as `a`, `table2` as `b`.

12. 

setOrder($myField, $myType = 0)

Устанавливает порядок сортировки. Первый параметр устанавливает поле, по которому будет производиться сортировка, а второй – тип сортировки (по-умолчанию используются параметры БД, вызов метода без второго параметра устанавливает сортировку с конца). Значение 0 или ‘DESC’ устанавливает сортировку с конца, 1 или ‘ASC’ – с начала.

13. 

setLimits($myFrom, $myLimit = '')

Устанавливает LIMIT OFFSET, ROWS

14. 

setSQL($sql)

Устанавливает SQL-код для WHERE. Не экранируется.

15. 

setResultType($myAssoc)

Если установлено true, результат будет выводиться в ассоциативном массиве (значение по-умолчанию)

16. 

getCount()

 Получить количество записей

17. 

create()

Добавляет запись в базу данных

18. 

readById($id)

Извлекает запись с указанным идентификатором в виде одномерного массива. Получить извлеченные данные можно методом getData()

19. 

readFirst($order = 'id')

Извлекает первую запись в виде одномерного массива, сортируя записи по идентификатору.

20. 

readLast($order = 'id')

Извлекает последнюю запись в виде одномерного массива, сортируя записи по идентификатору.

21. 

readBy($field, $value)

Извлекает запись, соответствующую параметру, в виде одномерного массива.

22. 

read($poly = false)

Прочитать запись с указанными параметрами. Аргумент отвечает за тип возвращаемого массива. Если значение аргумента истинно, возвращается двухмерный массив со списком записей, иначе – одномерный.

23. 

update()

Обновляет записи

24. 

deleteById($id)

Удаляет запись с указанным идентификатором.

25. 

deleteBy($field, $value)

Удаляет запись с соответствующим значением указанного параметра.

26. 

delete()

Удаляет записи с указанными условиями.

27. 

search($field = '', $request = '')

Осуществляет поиск по полю

28. 

eSearch($titles = array(), $metas = array(), $content = array())

Интеллектуальный поиск. Пока что отсутствует.

29. 

debug ()

Печать SQL-запроса

12. Мультиязычность

Если есть необходимость реализации сайта на нескольких языках, то Pagen имеет функционал для работы с многоязычностью. Чтобы реализовать мультиязычность, необхомо установить их список в конфигурационном файле. При получении данных с БД, можно определять установленный у пользователя язык с помощью свойства \config::$Lang. Используемые слова можно получать командой eController::getWords($filename), где $filename содержит имя файла нужного языка в папке templates/languages. Сам файл возвращает массив используемых фраз. Пример использования можете посмотреть в классе \Data\Design.

P. S.: В этой статье я кратко описал возможности PHP-фреймворка Pagen. Документации как таковой еще нету, но я буду над этим работать. Ваши комментарии и пожелания, пожалуйста, присылайте на почтовый ящик denlux-blog.org

Поделиться в соцсетях: Вконтакте Facebook Twitter Mail.ru Google plus
Комментарии:
Подождите, пожалуйста. Загружаются комментарии...