Как добавить поле заказа в MS2
Здравствуйте.
Хотел поделиться способом, как добавить новое поля заказа MS2. После чтения статьи от Николая (спасибо ему за статью) понял, что это мой путь и нужно сделать все по аналогии, так как задачи очень схожие.
Внимание! Если вы захотите попробовать решение. Сначала проверьте на тестовом проекте, а после тестирования делайте на боевом проекте. Помня что Бекап это наше все
Задачу поставим следующую. Давайте создадим поле «Адрес» как общее поле что бы клиент мог вписать весь адрес полностью (Улица, дом, подъезд этаж и т.д).
Что нужно для этого!
1. Создадим новое поле в БД в таблице modx_ms2_order_addresses после колонки room:
2. Добавим плагин в MS2 для того что бы наследовать файл msorderaddress.map.inc.php
Путь к файлу core/components/minishop2/model/minishop2/mysql/msorderaddress.map.inc.php
Для этого создадим в папке core/components/minishop2/custom/ новую папку order_address_table, а в ней два файла
index.php
msorderaddress.map.inc.php
3.Наследуем файл orders.window.js
Путь assets/components/minishop2/js/mgr/orders/orders.window.js
Для этого создадим JS файл в котором мы добавим на страницу Заказа MS2. Нам полностью подойлдет плагин написанный Николаем
И создадим файл JS путь components/minishop2/custom/addjsms2.js
Далее наследуем наш файл указав новое поле
4. Добавим новое поле в словарь
Заходим в словарь пространство имен MS2 и добавим записи в словарь
ms2_frontend_fulladds
ms2_fulladds
5 Зарегистрируем в сниппете msOrder новое поле и добавим поле в форму
Результат:
P.S. Плиз! Перенисите в раздел пашаговые инструкции.
Хотел поделиться способом, как добавить новое поля заказа MS2. После чтения статьи от Николая (спасибо ему за статью) понял, что это мой путь и нужно сделать все по аналогии, так как задачи очень схожие.
Внимание! Если вы захотите попробовать решение. Сначала проверьте на тестовом проекте, а после тестирования делайте на боевом проекте. Помня что Бекап это наше все
Задачу поставим следующую. Давайте создадим поле «Адрес» как общее поле что бы клиент мог вписать весь адрес полностью (Улица, дом, подъезд этаж и т.д).
Что нужно для этого!
1. Создадим новое поле в БД в таблице modx_ms2_order_addresses после колонки room:
ALTER TABLE `modx_ms2_order_addresses` ADD `fulladds` VARCHAR(255)
CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL AFTER `room`;
2. Добавим плагин в MS2 для того что бы наследовать файл msorderaddress.map.inc.php
Путь к файлу core/components/minishop2/model/minishop2/mysql/msorderaddress.map.inc.php
Для этого создадим в папке core/components/minishop2/custom/ новую папку order_address_table, а в ней два файла
index.php
<?php
return array(
'map' => array(
'msOrderAddress' => require_once 'msorderaddress.map.inc.php',
)
);
msorderaddress.map.inc.php
<?php
return array(
'fields' => array(
'fulladds' => NULL,
),
'fieldMeta' => array(
'fulladds' => array(
'dbtype' => 'varchar',
'precision' => '255',
'phptype' => 'string',
'null' => true,
),
),
);
Далее зарегистрируем наши файлы в системе. Водим данный код в консоль. if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('order_address_table', '{core_path}
components/minishop2/custom/order_address_table/index.php');
}
После того, как вы нажали кнопку выполнить, вы не получите результат выполнения. Для проверки небходимо зайти в раздел настройки MS2 и в параметре ms2_plugins вы увидете подключенный плагин.3.Наследуем файл orders.window.js
Путь assets/components/minishop2/js/mgr/orders/orders.window.js
Для этого создадим JS файл в котором мы добавим на страницу Заказа MS2. Нам полностью подойлдет плагин написанный Николаем
<?php
switch ($modx->event->name) {
case 'msOnManagerCustomCssJs':
if ($page != 'orders') return;
$modx->controller->addLastJavascript
(MODX_ASSETS_URL . 'components/minishop2/custom/addjsms2.js');
break;
}
И создадим файл JS путь components/minishop2/custom/addjsms2.js
Далее наследуем наш файл указав новое поле
Ext.override(miniShop2.window.UpdateOrder, {
getAddressFields: function (config) {
var all = {
receiver: {},
phone: {},
index: {},
country: {},
region: {},
metro: {},
building: {},
city: {},
street: {},
room: {},
fulladds:{}
};
var fields = [], tmp = [];
for (var i = 0; i < miniShop2.config['order_address_fields'].length; i++) {
var field = miniShop2.config['order_address_fields'][i];
if (all[field]) {
Ext.applyIf(all[field], {
xtype: 'textfield',
name: 'addr_' + field,
fieldLabel: _('ms2_' + field)
});
all[field].anchor = '100%';
tmp.push(all[field]);
}
}
var addx = function (w1, w2) {
if (!w1) {
w1 = .5;
}
if (!w2) {
w2 = .5;
}
return {
layout: 'column',
defaults: {msgTarget: 'under', border: false},
items: [
{columnWidth: w1, layout: 'form', items: []},
{columnWidth: w2, layout: 'form', items: []}
]
};
};
var n;
if (tmp.length > 0) {
for (i = 0; i < tmp.length; i++) {
if (i == 0) fields.push(addx(.5, .5));
else if (i == 2) fields.push(addx(.5, .5));
else if (i % 2 == 0) fields.push(addx());
if (i <= 1) {
n = 0;
}
else {
n = Math.floor(i / 2);
}
fields[n].items[i % 2].items.push(tmp[i]);
}
if (miniShop2.config['order_address_fields'].in_array('comment')) {
fields.push(
{
xtype: 'displayfield',
name: 'addr_comment',
fieldLabel: _('ms2_comment'),
anchor: '98%',
style: 'min-height: 50px;border:1px solid #efefef;width:95%;'
}
);
}
}
return fields;
}
})
4. Добавим новое поле в словарь
Заходим в словарь пространство имен MS2 и добавим записи в словарь
ms2_frontend_fulladds
ms2_fulladds
5 Зарегистрируем в сниппете msOrder новое поле и добавим поле в форму
$fields = array(
...
'fulladds' => 'fulladds',
...
);
В шаблоне формы заказа добавить в tpl.msOrder или ваш шаблон{foreach ['fulladds'] as $field}
<div class="form-group row input-parent">
<label class="col-md-4 col-form-label" for="{$field}">
{('ms2_frontend_' ~ $field) | lexicon} <span class="required-star">*</span>
</label>
<div class="col-md-8">
<input type="text" id="{$field}" placeholder="{('ms2_frontend_' ~ $field) | lexicon}"
name="{$field}" value="{$form[$field]}"
class="form-control{($field in list $errors) ? ' error' : ''}">
</div>
</div>
{/foreach}
Результат:
P.S. Плиз! Перенисите в раздел пашаговые инструкции.
Поблагодарить автора
Отправить деньги
Комментарии: 8
Круто! Теперь бы понять как это поле еще в order.grid.js вывести) понимаю вроде что там обращение к другим таблицам идет и что нужно джойнить ms2_order_addresses. Но вот как потом вывести — это вообще непонятно)
1) добавить еще один дополнительный JS файл, который будет расширять orders.grid.js (как это сделать написано выше в посте)
2) Добавить новый процессор, который наследует mgr/orders/getlist и в нем дополнить выборку таблицей адреса
3) В новом js файле указать запрос к вашему новому процессору и добавить новые колонки в методе getColumns
2) Добавить новый процессор, который наследует mgr/orders/getlist и в нем дополнить выборку таблицей адреса
3) В новом js файле указать запрос к вашему новому процессору и добавить новые колонки в методе getColumns
Вчера получилось сделать, спасибо)
Я в вас ничуть не сомневаюсь. Здесь написал ответ на вопрос, просто чтобы он был для будущих искателей ответов.
Понял)
Спасибо очень полезно, а как добавить например то же адресное поле не на вкладке «адрес», а на первую вкладку (заказ)? Ставлю, показывает название поля, но никаких данных о нем после нового заказа.
На первой вкладке отображаются данные из другой таблицы базы данных ms_orders. Соответственно желательно расширять эту таблицу, а не ms_order_address про которую речь в статье.
спасибо за быстрый ответ, да, я знаю, что только что добавил новый столбец в «modx_ms2_orders», добавленный также в (core/components/minishop2/model/minishop2/mysql/msorder.map.inc.php) в «fields» и « fieldMeta", затем в (assets/components/minishop2/js/mgr/orders/orders.window.js), но после заказа существует имя поля, но нет данных.
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.