Доброго времени суток, дорогие друзья! Сегодня мы с вами будем расширять дефолтную модель товара miniShop2 с помощью плагинов. Данный функционал бывает просто необходим, если стандартных полей товара нам не хватает. Чаще всего мы добавляем параметр “Наличие” со значениями да или нет, в данном же мануале мы добавим с вами два поля:
- Наличие (Да/Нет)
- Цена в евро
Что ж приступаем! Наверняка, вы знаете, что для того, чтобы расширить стандартную модель товара miniShop2 или изменить ее необходимо написать плагин (плагин имеется ввиду в контексте miniShop2, а не в контексте MODx). Итак, для начала нам необходимо создать 3 файла:
- core/components/minishop2/plugins/myplugin/index.php
- core/components/minishop2/plugins/myplugin/msproductdata.map.inc.php
- assets/components/minishop2/plugins/myplugin/msproductdata.js
Что значит тот или иной файл мы расскажем вам ниже подробнее. Здесь myplugin – это название нашего плагина, вы можете поменять его на свое.
Также нам необходимо создать столбцы в базе данных в таблице [prefix]ms2_products. Сделать вы это можете либо с помощью SQL запросов, либо с помощью phpMyAdmin. Итак, создадим 2 столбца:
- avaible
- europrice
Вот так это получилось у меня (скриншот из phpMyAdmin):
index.php
Это основной файл конфигурации нашего плагина. В нем мы прописываем пути до наших остальных двух файлов (обязательно проверьте, чтобы они были верные).
<?php return array( 'map' => array( 'msProductData' => require_once 'msproductdata.map.inc.php', ), 'manager' => array( 'msProductData' => MODX_ASSETS_URL . 'components/minishop2/plugins/myplugin/msproductdata.js', ), );
Массив ‘map’ – это указатель на файл с картой наших полей, а ‘manager’ – это указатель на JS файл для рендеринга полей в панели администратора.
msproductdata.map.inc.php
Это файл с нашей картой. Она у меня получилась следующая:
<?php return array( 'fields' => array ( 'avaible' => 1, 'europrice' => 0.0 ), 'fieldMeta' => array ( 'avaible' => array ( 'dbtype' => 'varchar', 'precision' => '50', 'phptype' => 'integer', 'null' => true, ), 'europrice' => array ( 'dbtype' => 'decimal', 'precision' => '12,2', 'phptype' => 'float', 'null' => true, 'default' => 0.0, ), ) ,'indexes' => array( 'avaible' => array ( 'alias' => 'avaible', 'primary' => false, 'unique' => false, 'type' => 'BTREE', 'columns' => array ( 'avaible' => array ( 'length' => '', 'collation' => 'A', 'null' => false, ), ), ), 'europrice' => array ( 'alias' => 'europrice', 'primary' => false, 'unique' => false, 'type' => 'BTREE', 'columns' => array ( 'europrice' => array ( 'length' => '', 'collation' => 'A', 'null' => false, ), ), ), ) );
Здесь мы описываем базовые настройки наших новых полей. При составлении данного файла можно ориентироваться на стандартный файл miniShop2 с настройками полей core/components/minishop2/model/minishop2/mysql/msproductdata.map.inc.php. Здесь:
- fields — значение по-умолчанию для поля
- fieldMeta — Meta-описание поля. Будьте внимательны.
- indexes — Индексы. Если поле не является индексным, то здесь его можно не указывать.
msproductdata.js
Этот файлик для многих будет наиболее интересным, так как он отвечает за отображения полей в админке. Если с полем europrice нам все понятно, то с полем доступности товара – не совсем. По моей задумке – это должен быть выпадающий список с опциями.
Параметр xtype у полей отвечает за тип отображения (их вы можете посмотреть здесь), поэтому вам нужно просто выбрать тот или иной xtype.
Файл у нас получился следующий:
miniShop2.plugin.pluginname = { //pluginname не изменяем. getFields: function(config) { return { avaible: { xtype: 'combo-avaible' ,name: 'avaible' ,hiddenName: 'avaible' ,description: '<b>[[+avaible]]</b><br />' + _('ms2_product_avaible_help') }, europrice: { xtype: 'numberfield', decimalPrecision: 2, description: '<b>[[+europrice]]</b><br />' + _('ms2_product_europrice_help') }, } } ,getColumns: function() { return { avaible: {width:50, sortable:false, editor: {xtype:'combo-avaible', renderer: 'true'}}, europrice: {width:50, sortable:false, editor: {xtype: 'numberfield'}}, } } };
Если вы внимательно посмотрите на доступные xtype, то нигде не найдете выпадающего списка, его нам нужно будет определить самостоятельно. Внимательный читатель заметит, что в xtype у поля avaible стоит значение 'combo-avaible' – это как раз тот выпадающий список, который нам необходимо определить. Для того, чтобы это сделать, необходимо дописать в конец файла следующий код:
miniShop2.combo.avaible = function(config) { config = config || {}; Ext.applyIf(config,{ store: new Ext.data.ArrayStore({ id: 0 ,fields: ['avaible','display'] ,data: [ ['1','В наличии'] ,['2','Под заказ'] ,['99','Нет в наличии'] ] }) ,mode: 'local' ,displayField: 'display' ,valueField: 'avaible' }); miniShop2.combo.avaible.superclass.constructor.call(this,config); }; Ext.extend(miniShop2.combo.avaible,MODx.combo.ComboBox); Ext.reg('combo-avaible',miniShop2.combo.avaible);
Видите, все достаточно просто. Про определение своего выпадающего списка можно почитать в официальной документации к MODx.
Подведем промежуточные итоги:
- Мы создали столбцы в БД.
- Создали 3 файла, необходимые для работы.
Но поля у нас так и не отображаются! Для того, чтобы они появились необходимо сделать еще 2 шага.
Перевод в словарях.
Для создания переводов перейдем в Управление словарями -> minishop2 -> ru и создадим 2 ключа по шаблону ms2_product_FIELDNAME и 2 ключа по шаблону ms2_product_FIELDNAME_help. Первые 2 это заголовки полей, а другие строки описания.
Вывод полей в товаре
Последний шаг, для которого все это затевалось, это вывести поля в карточке товара. Сделать это можно перейдя в Настройки системы -> minisop2 -> Товар -> Дополнительные поля товара (ms2_product_extra_fields) и добавив в конец через запятую имена наших полей. После этого вы можете открыть карточку товара (возможно, потребуется сброс кеша ctrl+F5) и вы увидите только сделанные поля.
Надеемся данный мануал поможет всем начинающим, спасибо за внимание!