Создание плагина для Shop-script
- Подробности
- Категория: Webasyst
- Просмотров: 544
Иногда нужно понимать как и что устроено в твоем интернет-магазине, поэтому сегодня разберем создание плагина для Shop-script (Webasyst - в данный момент у меня версия 3.2.0.920), ведь так можно глубже понять как все происходит...
debug_mode
0 - для начала включим режим разработчика (debug_mode) можно в админке в настройках или в файле wa-config/config.php
'debug' => true
В этом режиме отключено кэширование.
1 - структура плагина.
Вначале нужно создать id нашего будущего плагина - тут можно включать английские буквы и символы подчеркивания и цифры. Мы назовем brands - на основе этого слова (внутри движка называют его id ) и будут создаваться названия файлов и php-классы.
Соответственно наш плагин будет хранится по этому пути:
wa-apps/[app_id]/plugins/
wa-apps/shop/plugins/brands/ - в нашем случае это! Ниже все пути будут указаны относительно этой папки.
Обязательные элементы в плагине
В нашем папке мы должны иметь обязательно:
- файл lib/config/plugin.php - тут находятся параметры конфигурации плагина, это могут быть: название, описание, идентификатор разработчика, номер версии и т. д.;
- папка (например, brands/img/) - тут поместим файл значка плагина.
Все остальные файлы уже создаются для функционала нашего plugin.
Конфигурация
В файле конфига - lib/config/plugin.php обязательно укажем:
<?php
return array(
'name' => 'Brands', // название плагина
'img' => 'img/brands.png' // иконка (16*16px), обычно находится в img/ подкатегории
);
Данные имя и иконку вы найдете в разделе плагины в админке Shop-Script .
Что еще тут можно настроить:
- description: описание плагина - также можно позже увидеть это внутри админки
- vendor: идентификатор разработчика
- version: номер версии плагина
- frontend: флаг (true/false), означающий, разрешено ли плагину обрабатывать запросы пользователей во внешнем интерфейсе (т. е. на общедоступной витрине)
Включаем плагин
Для того, чтобы включить "наше детище" мы в wa-config/apps/[app_id]/plugins.php пропишем следующее:
<?php
return array(
'import' => true,
);
Функциональность плагина в Shop-script
Планину можно добавить функциональности и обычно она 2-ух типов:
- Добавление нового (или изменение существующего) контента на странице сайта бэкенде или фронтенде.
- Обработка запросов пользователей (GET / POST / AJAX).
Предположим наш плагин Brands сможет отображать все бренды нашего магазина в виде ссылок, и любой может кликнуть и открыть товары этого бренда.
Пусть плагин Brands отображает список ссылок на доступные бренды, и онлайн-покупатели смогут нажимать на них, чтобы просмотреть все товары, связанные с выбранным брендом. Нам будет необходимы все 2 действия (вышеуказанных):
- добавление нового содержимого на страницу витрины ( это список брендов на панели навигации) и
- обрабатывать запросы пользователей (создавать страницы со списками товаров бренда).
Хуки
Для того, чтобы добавить контент на страницу бэкенда или фронтенда рекомендуется использовать хук frontend_nav. Хуки для Shop-Script - это специальные функциональные элементы, которые можно присоединять к коду и делается это в файле добавлением 'handlers' (обработчики событий) в lib/config/plugin.php . Давайте это сделаем:
'handlers' => array(
'frontend_nav' => 'frontendNav',
),
После корректировки handlers - всегда рекомендуется очищать кэш, чтобы они работали корректно.
Наш плагин для примера, мы подключим только к одному хуку - frontend_nav.
Имя хука - указывается в массиве в качестве ключа! Значение же содержит имя метода (в данном примере frontendNav) основного класса плагина, который должен быть создан по пути lib/[app_id][Plugin_id].plugin.php. Следовательно, для нашего плагина Brands основной файл класса должен быть создан по пути lib/shopBrands.plugin.php
Имена хуков должны быть указаны в ключах массива. Значение каждого элемента должно содержать имя метода (в данном примере frontendNav) основного класса плагина, который должен быть создан по пути lib/[app_id][Plugin_id].plugin.php. Следовательно, для нашего плагина Brands основной файл класса должен быть создан по пути lib/shopBrands.plugin.php. Он должен содержать класс с именем shopBrandsPlugin, расширяющий базовый класс shopPlugin.
Можно расширить и базовый системный класс waPlugin , но мы рекомендация использовать shopPlugin при разработке плагинов для Shop-Script, поскольку он добавляет некоторые полезные функции.
В основном классе плагина опишем метод с именем, указанным в точности как в файле конфигурации выше (frontendNav в этом примере). Напоминаю, что у нас этот метод подключен к хуку frontend_nav выше!
<?php
class shopBrandsPlugin extends shopPlugin {
public function frontendNav() {
$html = ...; //тут происходит генерация html кода для встраивания потом во фронтенд
return $html; }
}
Что возвращают методы плагина
В зависимости от типа хука, методы плагинов, подключённые к хукам Shop-Script, могут возвращать значения.
Методы плагинов, подключённые к хукам Shop-Script, могут возвращать значения по-разному в зависимости от типа конкретного хука:
- возвращаем одно значение (например, строка HTML-кода, в нашем примере выше)
- возвращаем массив значений (если хук позволяет добавлять различные значения в разные части веб-страницы с помощью одного метода плагина)
- без возврата значений (например, если для обработки хука требуется только выполнить запрос к базе данных или добавить запись в файл журнала без отображения чего-либо на сайте).
Рассмотрим все 3 примера:
<?php
class shopBrandsPlugin extends shopPlugin
{
//1) возвращается одно значение (при подключении к хуку frontend_nav) - это разбирали выше
public function frontendNav()
{
$html = ...; //сгенерированный HTML-код встраивается в веб-страницу
}
//2) возвращается массив значений (при подключении к hook frontend_product)
public function frontendProduct()
{
//в этом методе генерируется массив фрагментов HTML-кода, которые должны быть отображены на веб-странице
// каждый из этих нескольких фрагментов будет встроен в соответствующее место, выделенное в соответствующем шаблоне темы дизайна (если это хук интерфейса; например, frontend_product - это название базового хука Shop-script - обратите внимание на названия методов, они как раз образуются с этим хуков) или бэкэнд-шаблоне
$data = array(
'menu' => '...', //Фрагмент HTML-кода
'cart' => '...', //Фрагмент HTML-кода
'block' => '...', //Фрагмент HTML-кода
'block_aux' =>
'...',//фрагмент HTML-кода); возвращает $data;
}
//3) значение не возвращается (при подключении к хуку category_delete)
public function categoryDelete()
{
//если метод подключен к хуку category_delete, вы можете выполнять различные операции в этом методе при удалении категории товаров (например, выполнять запрос к базе данных) без возврата какого-либо значения, так как этот тип хуков просто игнорирует любые возвращаемые значения
}
}
Как добавить контент без хуков
Хуки (называются интерфейсными) позволяют добавлять контент в ограниченное количество мест (рекомендовано) на странице бэка и фрнта, но, если нужно добавить в другом рандомное место, то можно использовать статичные методы. Вышеописанный метод добавления пользовательского контента на веб-страницу с помощью (интерфейсных) хуков является рекомендуемым. В этом случае вы можете вызывать статические методы классов плагина (например, основного класса плагина) в теме дизайна. Например, вы можете захотеть отобразить информацию о бренде продукта на странице просмотра продукта, тогда вы можете создать для этого общедоступный статический метод, такой:
class shopBrandsPlugin extends shopPlugin
{
public function frontendNav()
{
...;
}
public static function getProductBrand($product_id)
{
$brand_name = ...; //получение названия бренда для продукта с указанным идентификатором
return $brand_name;
}
}
Для отображения значений данного метода на страницах магазина вставляем в тему дизайна следующий код:
{pluginShopBrands::getProductBrand($product_id)}
Применение таких статических методов не рекомендованы! Так как их вызов нужно делать через вставку такого кода в шаблоны и это не могут делать все владельцы сайтов, так как нет достаточной квалификации, поэтому рекомендуется работать через хуки.
Контроллеры
Обработкой запросов от пользователей занимаются контроллеры, один или несколько. Применение того или иного контроллера регламентируются правилами Webasyst Framework.
Обращение к серверной части плагинов
Если обращение идет к серверной части, то необходимо добавить plugin=[plugin_id] , то есть у нас будет примерно: https://yourdomain.ru/webasyst/shop/?plugin=brands&action=someaction
Обращение к внешней части плагина - в интернет-магазине
В этом случае прописывается маска url, какую вы хотите видеть в файле routing.php , например у нас это с брендами будет так https://my-store.ru/brand/<brand name>/:
<?php
return array(
'brand/<brand>/' => 'frontend/brand', //'URL маска для роутинга' => 'module/action комбинации'
'.../' => '.../...', //тут вы можете добавить еще правила
);
<brand> - это динамическая часть тут, и ее плагин будет использовать для извлечения имени брэнда из URL . Значение каждого элемента массива в файле конфигурации должно содержать комбинацию модуля и действия, которые должны будут использоваться для обработки запросов пользователей, отправленных на указанный URL-адрес.
Обратите внимание в ключе массиве 'brand/<brand>/' нет вначале слэша!!!
Action class
Далее нам нужно создать PHP-класс для действия, соответствующего комбинации frontend/brand (описанного выше в routing.php в качестве значения ключа массива) в соответствии с правилом lib/actions/[app_id][Plugin_id]Plugin[Module][Action].action.php. В нашем примере мы создадим файл lib/actions/shopBrandsPluginFrontendBrand.action.php. В нем мы объявим класс, расширяющий базовый класс shopFrontendAction (если вам нужно поддерживать общие функции, реализованные в других интерфейсных действиях Shop-Script; иначе вы можете захотеть, чтобы ваш класс действий наследовал системный класс waViewAction) с соответствующим именем shopBrandsPluginFrontendBrandAction, и опишем логику генерации списка товаров в его методе execute:
<?php
class shopBrandsPluginFrontendBrandAction extends shopFrontendAction
{
public function execute()
{
$brand = waRequest::param('brand'); //в классе действий вы можете получить динамическую часть URL (в данном примере <бренды>) с помощью вызова системного метода waRequest::param($param_name)
//другие динамические части URL, если они описаны в файле routing.php, можно получить таким же образом
...// затем можно сгенерировать товары, которые соответствует этому бренду }
}
Обработка запросов пользователей с помощью контроллеров
Можно обрабатывать и без action class, а с помощью контроллеров, например, в случае AJAX-запросов.
Если стоит задача "отобразить всплывающее окно со списком товаров вместо того, чтобы открывать страницу":
- для этого отправим запрос GET с помощью JavaScript на URL-адрес в форме https://my-store.ru/brand/<brand name>/ и используем полученный с сервера ответ для создания и отображения всплывающего окна со списком товаров.
- В этом случае нам нужно, чтобы такие запросы не обрабатывались классом действий, расширяющим базовый класс waViewAction (или shopFrontendAction), а передавались контроллеру, реализующему произвольную логику. Таким образом, вместо создания файла lib/actions/shopBrandsPluginFrontendBrand.action.php мы создадим файл lib/actions/shopBrandsPluginFrontendBrand.controller.php. В этом файле мы должны описать класс, расширяющий системный класс waJsonController и названный shopBrandsPluginFrontendBrandController. Его метод execute будет содержать логику обработки запросов AJAX, описанную в документации; например:
<?php
class shopBrandsPluginFrontendBrandController extends waJsonController
{
public function execute()
{
$brand = waRequest::param('brand'); //получение названия бренда из URL-адреса запроса
... //создание списка товаров, соответствующих полученному названию бренда
... //генерация HTML-кода или создание массива данных для использования в коде JavaScript для отображения товаров во всплывающем окне
$this->response = array(
'result' => ... //возвращение подготовленных данных в ответ на запрос AJAX );
}
}
Шаблоны
Плагин может использовать собственные файлы шаблонов для генерации HTML-кода, разные языковые настройки и может предлагать собственные методы командной строки для настройки заданий cron.
Более старые статьи:
- Создание своей темы на Shop-script
- При установке SS Premium - oшибка вида You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'TYPE=InnoDB' at line 1 SQL query : CREATE TABLE SS_system (varName VARCHAR(255) N
- SS Premium шаблоны корзины

