Доброго времени суток, дорогие друзья! Сегодня мы с вами будем расширять дефолтную модель товара 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) и вы увидите только сделанные поля.
Надеемся данный мануал поможет всем начинающим, спасибо за внимание!
{$avaible}выводит значение «1», а нужно название, name не помогает{if $avaible==1?} В наличии {/if} {if $avaible==2?} Под заказ {/if} {if $avaible==99?} Нет в наличии {/if}{$avaible}europrice: { xtype: 'minishop2-combo-options', name: 'europrice', description: '<b>[[+europrice]]</b><br />' + _('ms2_product_europrice_help') },оно в базу несохраняетНаличие: {if $_modx->resource.availability}под заказ{else}в наличии{/if}. Стоит чекбокс на против «под заказ», выводиться в карточке «под заказ», не стоит значит выводиться «в наличии».Либо создать опцию с типом Выпадающий список или Список с авто дополнением, в бить в нее значения, а потом ее вывести:{'msProductOptions' | snippet : [ 'tpl' => 'чанк оформления вывода', 'onlyOptions' => 'name_options' ]}Или я что-то не догоняю)