Как добавить поле в настройках MS2 вкладка "Доставка" при добавлении пункта доставки
Внимание! При реконструкции полей используется метод
Ext.override, это не идеально так как он перезаписывает весь массив, а не добавляет массив необходимые данные. При обновление набора полей MS2 массив данных не изменится. Внизу @Pavel Zarubin предложил альтернативное решение с которым я полностью согласен но не знал до написании статьи. Скоро обновление.
Ну вот! теперь не хватает поля в пунктах доставках, но так как я изучил принцип добавление полей в MS2 все очень просто.
Делаем по аналогии со статьей Добавить поле в опции MS вкладка «Производитель товара» msVendor . Многие активно пользуются поиском поэтому каждому отдельному случаю посвещаю отдельную статью. Плюсом пригодиться для референса в новых статьях.
1. Шаг добавляем JS файл на страницу настроек, я сделал плагин
Событие устанавливаем msOnManagerCustomCssJs
2. Создал директорию core/components/minishop2/custom/vendor_table/
index.php
msdelivery.map.inc.php
В данном случае я добавил галочку. Но мы можем расширять маппинг любыми полями смотрим оригинал и делаем по-аналогии.
Регистрируем в MS2 новый плагин через консоль
Далее добавим наше поле в БД таблица ms2_deliveries
Ну и внесем изменение форму assets/components/minishop2/custom/addjsms2vdevelop.js
Но вот и результат
Ext.override, это не идеально так как он перезаписывает весь массив, а не добавляет массив необходимые данные. При обновление набора полей MS2 массив данных не изменится. Внизу @Pavel Zarubin предложил альтернативное решение с которым я полностью согласен но не знал до написании статьи. Скоро обновление.
Ну вот! теперь не хватает поля в пунктах доставках, но так как я изучил принцип добавление полей в MS2 все очень просто.
Делаем по аналогии со статьей Добавить поле в опции MS вкладка «Производитель товара» msVendor . Многие активно пользуются поиском поэтому каждому отдельному случаю посвещаю отдельную статью. Плюсом пригодиться для референса в новых статьях.
1. Шаг добавляем JS файл на страницу настроек, я сделал плагин
<?php
switch ($modx->event->name) {
case 'msOnManagerCustomCssJs':
switch ($page) {
case 'orders':
$modx->controller->addLastJavascript(MODX_ASSETS_URL . 'components/minishop2/custom/addjsms2.js');
break;
case 'settings':
$modx->controller->addLastJavascript(MODX_ASSETS_URL . 'components/minishop2/custom/addjsms2vendor.js');
$modx->controller->addLastJavascript(MODX_ASSETS_URL . 'components/minishop2/custom/addjsms2vdevelop.js');
break;
}
break;
}
У меня много кастомных полей. Завожу на каждую страницу отдельный JS мне так удобней для версий вы можете делать как вам удобней я показываю лишь подход.Событие устанавливаем msOnManagerCustomCssJs
2. Создал директорию core/components/minishop2/custom/vendor_table/
index.php
<?php
return array(
'map' => array(
'msDelivery' => require_once 'msdelivery.map.inc.php',
)
);
msdelivery.map.inc.php
<?php
return array(
'fields' => array(
'dev_manager_cost' => 0,
),
'fieldMeta' => array(
'dev_manager_cost' => array(
'dbtype' => 'tinyint',
'precision' => '1',
'phptype' => 'integer',
'null' => true,
'default' => 0,
),
),
);
В данном случае я добавил галочку. Но мы можем расширять маппинг любыми полями смотрим оригинал и делаем по-аналогии.
Регистрируем в MS2 новый плагин через консоль
<?php
if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('deliveries_table', '{core_path}components/minishop2/custom/deliveries_table/index.php');
}
Далее добавим наше поле в БД таблица ms2_deliveries
Ну и внесем изменение форму assets/components/minishop2/custom/addjsms2vdevelop.js
Ext.override(miniShop2.grid.Delivery, {
getFields: function () {
return [
'id', 'name', 'price', 'weight_price', 'distance_price', 'rank', 'payments',
'logo', 'active', 'class', 'description', 'dev_manager_cost', 'requires', 'actions'
];
},
});
Ext.override(miniShop2.window.CreateDelivery, {
getFields: function (config) {
return [{
xtype: 'hidden',
name: 'id',
id: config.id + '-id'
}, {
layout: 'column',
items: [{
columnWidth: .7,
layout: 'form',
defaults: {msgTarget: 'under'},
items: [{
xtype: 'textfield',
fieldLabel: _('ms2_name'),
name: 'name',
anchor: '99%',
id: config.id + '-name'
}]
}, {
columnWidth: .3,
layout: 'form',
defaults: {msgTarget: 'under'},
items: [{
xtype: 'textfield',
fieldLabel: _('ms2_add_cost'),
name: 'price',
description: _('ms2_add_cost_help'),
anchor: '99%',
id: config.id + '-price'
}],
}]
}, {
layout: 'column',
items: [{
columnWidth: .5,
layout: 'form',
defaults: {msgTarget: 'under'},
items: [{
xtype: 'numberfield',
fieldLabel: _('ms2_weight_price'),
description: _('ms2_weight_price_help'),
name: 'weight_price',
decimalPrecision: 2,
anchor: '99%',
id: config.id + '-weight-price'
}, {
xtype: 'textfield',
fieldLabel: _('ms2_order_requires'),
description: _('ms2_order_requires_help'),
name: 'requires',
anchor: '99%',
id: config.id + '-requires'
}]
}, {
columnWidth: .5,
layout: 'form',
defaults: {msgTarget: 'under'},
items: [{
xtype: 'numberfield',
fieldLabel: _('ms2_distance_price'),
description: _('ms2_distance_price_help'),
name: 'distance_price',
decimalPrecision: 2,
anchor: '99%',
id: config.id + '-distance-price'
}, {
xtype: 'minishop2-combo-classes',
type: 'delivery',
fieldLabel: _('ms2_class'),
name: 'class',
anchor: '99%',
id: config.id + '-class'
}],
}]
}, {
xtype: 'minishop2-combo-browser',
fieldLabel: _('ms2_logo'),
name: 'logo',
anchor: '99%',
id: config.id + '-logo'
}, {
xtype: 'textarea',
fieldLabel: _('ms2_description'),
name: 'description',
anchor: '99%',
id: config.id + '-description'
}, {
xtype: 'xcheckbox',
boxLabel: _('ms2_active'),
hideLabel: true,
name: 'active',
id: config.id + '-active'
},
{
xtype: 'xcheckbox',
boxLabel: _('ms2_dev_manager_cost'),
hideLabel: true,
name: 'dev_manager_cost',
id: config.id + '-dev_manager_cost'
}
];
},
});
Но вот и результат
Поблагодарить автора
Отправить деньги
Комментарии: 3
Хреново так делать, во первых ты перезаписываешь метод полностью, а если обновится минишоп и добавятся новые поля что делать будешь? Во вторых зачем прописывать одни и те же поля если у родителя они уже прописаны? В общем сначала всегда вызывается родительский метод getFields а уже потом производится работы с массивов который вернул этот метод
Логичное замечание. Спасибо за критику она для меня очень важна. В свою очередь делал по другой статье где этот метод использовался.
Через недельку я обновлю статью где уже внесу изменение согласно твоему предложению. А сейчас в шапку внесу данную информацию.
Спасибо.
Через недельку я обновлю статью где уже внесу изменение согласно твоему предложению. А сейчас в шапку внесу данную информацию.
Спасибо.
И еще, все таки динамические компоненты лучше изменять через метод onAvalible (как я описывал тут: modx.pro/howto/15248) т.к. это позволяет работать например с пришедшими данными (record). Взять твою же галку «индивидуальный расчет» она действительно нужна на всех типах доставки? Все таки подозреваю что нужна она только на доставке с определенными классом обработчиком, что собственно и позволяет реализовать onAvalible
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.