PHPShop Modules

Материал из PHPShop CMS

(Перенаправлено с PHPShop Mudules)
Перейти к: навигация, поиск

Содержание

Введение

Новая модульная архитектура позволяет создавать независимые модули, работающие в связке с основной логикой. Новый стандарт модулей реализует возможность расширения функционала системы 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/, внося только точечные изменения в файл, не затрагивая другие стороны работы раздела.

Lifebelt.png Виртуальный раздел использует функции основного ядра системы  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 выводятся в виде иконок быстрой навигации на основную панель.

Административные интерфейсы

Если модуль добавляет новые возможности (новые поля и функции) в штатные административные интерфейсы платформы, то требуется внести в конфигуратор модуля запись формата имя перехватываемого файлы административного интерфейса = "путь до файла дабавляемых функций", пример:

[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].

Советы разработчика

В разделе "Спотыкашки", выложены наиболее типичные "гвозди", которые могут вылезти при создании первых модулей.