[Решено] Как добавить новое поле в таблицу заказов?
Возникла необходимость добавления нового поля в таблицу заказов.
В документации не нашёл ничего по этому вопросу. Также как и в поиске ничего дельного.
В документации сказано, что есть 4 вида служб — cart, order, delivery, payment
А order как я понял отвечает за процесс оформления заказа, а не за таблицу.
Если создать новый столбец в таблице modx_ms2_orders, а потом произвести изменения в файлах:
А как можно кастомизировать таблицу, чтобы не трогать родные файлы?
РЕШЕНИЕ (25.03.2019)
Создаём плагин по принципу, описанному в статье Плагины товаров. Сначала вручную добавляем новое поле в БД (таблица modx_ms2_orders). Затем в произвольном месте каталога core/components создаём папку, где будет лежать плагин.
В ней будет 2 файла: index.php и msorder.inc.php, например:
index.php
msorder.inc.php
Название поля, тип, и т.д., по вашему усмотрению.
Далее как описано в статье подключаем плагин:
Название плагина произвольное, в пути нужно указать путь к файлу index.php. Просмотреть список подключённых плагинов можно в консоли (возможно, потребуется очистить кеш):
После этого minishop2 видит это поле, к нему можно обращаться по API.
Далее нужно вывести поле в таблице заказов.
Создаём плагин на событие msOnManagerCustomCssJs:
В скрипте default.js мы переопределяем метод getColumns и добавляем в него поле products_custom:
Оригинал метода, который переопределяем лежит тут: assets/components/minishop2/js/mgr/orders/orders.grid.js
Далее в Системных настройках (minishop2-Заказы) нужно добавить в ms2_order_grid_fields новое поле products_custom, а потом добавить запись в словаре: minishop2-ru-manager. Возможно, потребуется обновить кеш браузера, чтобы его увидеть в таблице заказов.
В документации не нашёл ничего по этому вопросу. Также как и в поиске ничего дельного.
В документации сказано, что есть 4 вида служб — cart, order, delivery, payment
А order как я понял отвечает за процесс оформления заказа, а не за таблицу.
Если создать новый столбец в таблице modx_ms2_orders, а потом произвести изменения в файлах:
/assets/components/minishop2/js/mgr/orders/orders.grid.js
/core/components/minishop2/model/minishop2/mysql/msorder.map.inc.php
/core/components/minishop2/model/schema/minishop2.mysql.schema.xmlТо всё ок, поле появится. Но ведь при обновлении минишопа изменения потрутся…А как можно кастомизировать таблицу, чтобы не трогать родные файлы?
РЕШЕНИЕ (25.03.2019)
Создаём плагин по принципу, описанному в статье Плагины товаров. Сначала вручную добавляем новое поле в БД (таблица modx_ms2_orders). Затем в произвольном месте каталога core/components создаём папку, где будет лежать плагин.
В ней будет 2 файла: index.php и msorder.inc.php, например:
index.php
<?php
return array(
'map' => array(
'msOrder' => require_once 'msorder.inc.php',
)
);msorder.inc.php
<?php
return array(
'fields' => array(
'products_custom' => 0.0,
),
'fieldMeta' => array(
'products_custom' => array(
'dbtype' => 'decimal',
'precision' => '12,2',
'phptype' => 'float',
'null' => true,
'default' => 0.0,
),
),
);Название поля, тип, и т.д., по вашему усмотрению.
Далее как описано в статье подключаем плагин:
if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('order_table', '{core_path}components/minishop2/custom/order_table/index.php');
}Название плагина произвольное, в пути нужно указать путь к файлу index.php. Просмотреть список подключённых плагинов можно в консоли (возможно, потребуется очистить кеш):
echo print_r(json_decode($modx->getOption('ms2_plugins')), 1);После этого minishop2 видит это поле, к нему можно обращаться по API.
Далее нужно вывести поле в таблице заказов.
Создаём плагин на событие msOnManagerCustomCssJs:
<?php
switch ($modx->event->name) {
case 'msOnManagerCustomCssJs':
if ($page != 'orders') return;
$modx->controller->addLastJavascript(MODX_ASSETS_URL . 'components/minishop2/custom/default.js');
break;
}В скрипте default.js мы переопределяем метод getColumns и добавляем в него поле products_custom:
Ext.override(miniShop2.grid.Orders, {
getColumns: function() {
var all = {
id: {width: 35},
customer: {width: 100, renderer: function(val, cell, row) {
return miniShop2.utils.userLink(val, row.data['user_id'], true);
}},
num: {width: 50},
receiver: {width: 100},
createdon: {width: 75, renderer: miniShop2.utils.formatDate},
updatedon: {width: 75, renderer: miniShop2.utils.formatDate},
cost: {width: 50, renderer: this._renderCost},
cart_cost: {width: 50},
delivery_cost: {width: 75},
products_custom: {width: 75},
weight: {width: 50},
status: {width: 75},
delivery: {width: 75},
payment: {width: 75},
//address: {width: 50},
context: {width: 50},
actions: {width: 75, id: 'actions', renderer: miniShop2.utils.renderActions, sortable: false},
};
var fields = this.getFields();
var columns = [];
for (var i = 0; i < fields.length; i++) {
var field = fields[i];
if (all[field]) {
Ext.applyIf(all[field], {
header: _('ms2_' + field),
dataIndex: field,
sortable: true,
});
columns.push(all[field]);
}
}
return columns;
}
})Оригинал метода, который переопределяем лежит тут: assets/components/minishop2/js/mgr/orders/orders.grid.js
Далее в Системных настройках (minishop2-Заказы) нужно добавить в ms2_order_grid_fields новое поле products_custom, а потом добавить запись в словаре: minishop2-ru-manager. Возможно, потребуется обновить кеш браузера, чтобы его увидеть в таблице заказов.
Комментарии: 25
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Самый простой способ — прочитать документацию к минишопу. Конкретно вот это:
docs.modx.pro/components/minishop2/development/plug-ins-products
Единственное, нужно передавать в массиве не«msProductData», а «msOrder».
Плюс не уверен, что прокатит как указано в расширении админки, поэтому может потребоваться альтернативный вариант. Если нужно будет, то потом могу подсказать как.
Нужно, до сих пор актуально :)
У меня в базу данные заливаются, в админку не могу вывести
«Далее как описано в статье подключаем плагин:if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('order_table', '{core_path}components/minishop2/custom/order_table/index.php');
}», а в статье это не описано. От сюда и всё запара с этим мануалом…
Точнее это: https://modx.pro/solutions/7037.
Берите на вооружение.
Там прописывается путь к файлу, он может быть произвольным, код этого файла в разделе Принцип работы:
Этот же файл как видно ссылается ещё на 2 других. msproductdata.inc.php лежит рядом с текущим, а js в папке assets.
В общем, пути могут быть разные. Можно расширить модель через плагин OnMODXInit, но это чисто для БД сработает. В смысле что в скриптах из БД можно будет вытащить значения, а в админке они нигде фигурировать не будут.