PHPShop Modules
Материал из PHPShop CMS
Содержание |
Введение
Новая модульная архитектура позволяет создавать независимые модули, работающие в связке с основной логикой. Новый стандарт модулей реализует возможность расширения функционала системы CMS Free без каких-либо ограничений для сторонних разработчиков и поставлять дополнительные модули, как независимые продукты.
Принцип работы
Логика подключения модулей базируется на принципе независимости кода модуля от общего кода системы, тем самым обеспечивая стабильность работы модуля в отдельности и в связке с общей логикой.
Основные принципы модульности:
- Независимость кода от общей логики
- Перехват глобальных переменных
- Перехват и создание нового ЧПУ
- Легкая установка и удаление
- Подключение персонального меню управления
- Добавления новых возможностей в стандартные графические интерфейсы управления
Образно говоря, создав модуль, можно перехватывать общие глобальные переменные для главных шаблонов index.tpl и shop.tpl, создавать новые виртуальные категории или менять существующие (/page/, /catalog/ и т.д.), и внедрять интерфейсы управления модулем в общий стиль административной панели через простой стандрат подключения модуля, описанный на языке XML.
Описание файловой системы модуля
Все модули находятся в папке phpshop/modules/имя модуля.
- templates - шаблоны
- core - файлы для создания ЧПУ( site.ru/catalog/ и т.д.)
- install - установочные файлы
- install/module.sql - SQL файл для установки таблиц
- install/module.xml - описание модуля и меню навигации управления для администрирования
- install/icon.gif - иконка модуля
- inc - файлы основной логики
- inc/config.ini - файл конфигурации
- class - файлы с классами основной логики
- admpanel - файлы административных интерфейсов
Подключение ЧПУ
Для создания нового виртуального раздела ( site.ru/catalog/ и т.д.) требуется внести в конфигуратор модуля config.ini запись о новом разделе формата уникальное имя нового раздела = "путь до файла логики", пример:
[core] catalog="./phpshop/modules/catalog/core/catalog.php"; ......
Если уникальное имя нового раздела совпадает с уже существующим разделом, то главным считается файл модуля, а основная логика из папки phpshop/core/ не учитывается. Данный способ позволяет полностью заменять основную логику платформы. Для облегчения и сокращения кода можно создавать core-файлы модуля, поддерживаемое наследие от основной логики phpshop/core/, внося только точечные изменения в файл, не затрагивая другие стороны работы раздела.
Виртуальный раздел использует функции основного ядра системы PHPShopCore.
Изменить и дописать логику уже существующего раздела можно через Хуки (Hook).
Подключение таблиц БД
Если модуль использует таблицы БД, то требуется внести в конфигуратор модуля запись о таблицах формата уникальное имя сокращенного названия = "имя таблицы", пример:
[base] catalog_load="phpshop_modules_catalog_loads"; catalog_system="phpshop_modules_catalog_system"; ......
При установки модуля таблицы модулей будет созданы из образа БД module.sql и удалены при удалении модуля из списка модулей. Для доступа к именам БД можно воспользоваться классом PHPShopModules:
$PHPShopModules = new PHPShopModules(); $PHPShopModules->getParam("base.catalog.catalog_load");
или
$GLOBALS['SysValue']['base']['catalog']['catalog_system'];
Автозагрузка
Для включения логики в автозагрузку требуется внести в конфигуратор модуля запись папка модуля = "путь до файла загрузки", пример:
[autoload] catalog="./phpshop/modules/catalog/inc/catalog.inc.php"; ......
Указанный файл phpshop/modules/catalog/inc/catalog.inc.php должен существовать. Т.к. блок активной логики модулей находится ниже оновного блока, то этим приемом можно перехватывать и переписывать глобальные переменные.
Доступные для перехвата переменные:
- @leftMenu@
- @rightMenu@
- @banersDisp@
- @miniNews@
- @oprosDisp@
- @topMenu@
- @mainMenuPage@
- @mainMenuPhoto@
- @mainContent@
- @mainContentTitle@
Шаблоны
Если модуль использует шаблоны дизайна, то требуется внести в конфигуратор модуля запись о шаблонах формата уникальное сокращенное имя шаблона = "путь до файла шаблона", пример:
[templates] catalog_menu_forma="./phpshop/modules/catalog/templates/catalog_menu_forma.tpl"; catalog_page_forma="./phpshop/modules/catalog/templates/catalog_page_forma.tpl"; catalog_page_list="./phpshop/modules/catalog/templates/catalog_page_list.tpl"; ......
Для доступа к шаблонам можно воспользоваться классом PHPShopModules:
$PHPShopModules = new PHPShopModules(); $PHPShopModules->getParam("templates.catalog_page_list");
или
$GLOBALS['SysValue']['templates']['catalog']['catalog_page_list'];
Конфигурация установки
Конфигурация установки модуля описана в файле install/module.xml
<?xml version="1.0" encoding="windows-1251"?> <module> <version>1.1</version> <name>SoftСatalog</name> <description>Модуль каталога для размещения и загрузки программ.</description> <base>15</base> <icon>icon.gif</icon> <adminmenu> <title>SoftСatalog</title> <podmenu> <podmenu_name>Настройка SoftСatalog</podmenu_name> <podmenu_icon>option.gif</podmenu_icon> <podmenu_action>javascript:miniWin('../modules/catalog/admpanel/adm_module.php',510,450);</podmenu_action> </podmenu> <podmenu> <podmenu_name>Обзор загрузок</podmenu_name> <podmenu_icon>icon.gif</podmenu_icon> <podmenu_action>javascript:window.location.replace('?plugin=catalog')</podmenu_action> </podmenu> <menu> <menu_name>Обзор загрузок SoftСatalog</menu_name> <menu_icon>icon.gif</menu_icon> <menu_action>window.location.replace('?plugin=catalog')</menu_action> </menu> </adminmenu> </module>
- Опция podmenu описывает выпадающее java-script меню в административной панели. При такой конфигурации меню будет доступна из раздела "Модули" -> "SoftСatalog"
- Опция menu описывает иконку быстрого запуска в административной панели. Ссылка ?plugin=catalog должна совпадать с именем папки размещения модуля phpshop/modules/catalog
- Опция _action описывает java-script код действия
- Опция _icon описывает изображение иконки для меню.
Кол-во вложенных блоков podmenu и menu не ограничивается, что даем возможность создания большого кол-во административных интерфейсов для настройки и управления модулем. Блоки podmenu выводятся в меню "Модули". Блоки menu выводятся в виде иконок быстрой навигации на основную панель.
- Опция base указывает на ID регистрации модуля в Базе модулей
Административные интерфейсы
Если модуль добавляет новые возможности (новые поля и функции) в штатные административные интерфейсы платформы, то требуется внести в конфигуратор модуля запись формата имя перехватываемого файлы административного интерфейса = "путь до файла дабавляемых функций", пример:
[admpanel] adm_catalogID="seourl/admpanel/adm_catalogID.php"; adm_catalog_new="seourl/admpanel/adm_catalog_new.php"; ......
Интерфейс настройки модуля
Если модуль содержит опции настройки или параметры регистрации то обязательно наличие интерфейса, записываемый в phpshop/modules/имя модуля/admpanel/adm_module.php. Для этих целей используется административный интерфейс модуля.
Для активации настройки модуля в общем меню и ссылки на дополнительные опции служит файл настроек
module.xml
Формат вывода меню ссылку настроек модуля в общее меню в раздел "Модули":
<podmenu> <podmenu_name>Заголовок окна</podmenu_name> <podmenu_icon>иконка</podmenu_icon> <podmenu_action>javascript:miniWin('../modules/имя модуля/admpanel/adm_module.php',510,450);</podmenu_action> </podmenu>
Дополнения административных интерфейсов (Hook)
Для добавления новых полей служит опция field конфигурации модуля. Файл обработчика должен находится в папке phpshop/modules/имя модуля/admpanel и иметь тоже название, что и файл для перехвата, пример файла seourl/admpanel/adm_catalogID.php:
// Добавляем значения в функцию actionStart function addTab(){ global $PHPShopGUI; return $PHPShopGUI->setField("SEO ссылка:",$PHPShopGUI->setInput("text","seoname_new","catalog","left",300),"none"); } $addHandler=array( 'actionStart'=>'addTab', 'actionDelete'=>false, 'actionUpdate'=>false );
Данный пример рисует новое поле SEO в карточке генерации каталога. Массив addHandler описывает в какие функции исходного файла будет внедрен код модуля. В нашем примере в функцию actionStart добавляется логика вывода новой закладки SEO.
Перехват административных интерфейсов (Hook)
Для перехвата логики (обновление, удаление) используется параметр actionUpdate и actionDelete массива addHandler. Для примера перехватим выполнение функции обновления карточки каталога из файла adm_catalogID.php
// Добавляем значения в функцию actionUpdate function writeContent(){ $_POST['content_new'] = $_POST['name_new'].' Дефолтный контент для описания каталога'; } $addHandler=array( 'actionStart'=>false, 'actionDelete'=>false, 'actionUpdate'=>'writeContent' );
Перехват внешних функций (Hook)
Поддерживает внедрение хуков (hook) в основную логику внешней части (пользовательская часть сайта) API для перехвата с последующими изменениями результата выполнения методов классов PHPShopCore, PHPShopElements и всех наследуемых от них классов.
Вызов хука происходит через использование блока, проставленного во всех значимых местах, теоретически возможных к перехвату и изменения на лету.
$PHPShopModules->setHookHandler(__CLASS__,__FUNCTION__, $this, $row);
В новую функцию передается ссылка на объект (родительский класс) и переменная row - в основном содержащая выборку из БД основной функции. Данная запись позволяет использовать методы исходного класса (set, add ...) и массив данных из БД (повторная выборка не требуется).
Для использования хука требуется внести в конфигуратор модуля config.ini запись о перехвате метода в классе имя класса = "путь до файла логики", пример:
[hook] phpshoppage="./phpshop/modules/users/core/page.core.php"; ......
Файл описания логики, указанный в конфиге, должен содержать список функций к перехвату и сами функции, меняющие стандартное выполнение кода. Пример:
function index_security_hook($obj,$row) { if(!empty($row['user_security']) and empty($_SESSION['userName'])) { $obj->set('pageContent',ParseTemplateReturn($GLOBALS['SysValue']['templates']['users']['users_forma'],true)); $obj->set('pageTitle','Только для авторизованных пользователей'); } } $addHandler=array( 'index'=>'index_security_hook' );
Формат описания $addHandler следующий: имя функции для перехвата = "новая функция в этом файле". Результатом выполнения этого хука будет перехват результата выполнения $PHPShopPage->index();
Отладка
Отладка происходит через отладочную панель, реализуемую через PHPShopDebug, выполняющая роль вывода системной информации, полезной для разработчика и используемая при отладке скрипта. Отладочная панель включается в конфигурационном файле в опции [my].
Советы разработчика
В разделе "Спотыкашки", выложены наиболее типичные "гвозди", которые могут вылезти при создании первых модулей.