Как добавить поле заказа в MS2

Здравствуйте.

Хотел поделиться способом, как добавить новое поля заказа 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. Плиз! Перенисите в раздел пашаговые инструкции.
Олег Щавелев
17 ноября 2019, 01:01
modx.pro
5
1 788
+1
Поблагодарить автора Отправить деньги

Комментарии: 8

Lori
23 октября 2021, 16:09
0
Круто! Теперь бы понять как это поле еще в order.grid.js вывести) понимаю вроде что там обращение к другим таблицам идет и что нужно джойнить ms2_order_addresses. Но вот как потом вывести — это вообще непонятно)
    Николай Савин
    24 октября 2021, 10:56
    0
    1) добавить еще один дополнительный JS файл, который будет расширять orders.grid.js (как это сделать написано выше в посте)
    2) Добавить новый процессор, который наследует mgr/orders/getlist и в нем дополнить выборку таблицей адреса
    3) В новом js файле указать запрос к вашему новому процессору и добавить новые колонки в методе getColumns
      Lori
      24 октября 2021, 10:58
      0
      Вчера получилось сделать, спасибо)
        Николай Савин
        24 октября 2021, 11:00
        +1
        Я в вас ничуть не сомневаюсь. Здесь написал ответ на вопрос, просто чтобы он был для будущих искателей ответов.
          Lori
          24 октября 2021, 11:01
          0
          Понял)
    Pakos Fakos
    21 апреля 2022, 10:19
    0
    Спасибо очень полезно, а как добавить например то же адресное поле не на вкладке «адрес», а на первую вкладку (заказ)? Ставлю, показывает название поля, но никаких данных о нем после нового заказа.
      Николай Савин
      21 апреля 2022, 10:56
      0
      На первой вкладке отображаются данные из другой таблицы базы данных ms_orders. Соответственно желательно расширять эту таблицу, а не ms_order_address про которую речь в статье.
        Pakos Fakos
        21 апреля 2022, 11:05
        0
        спасибо за быстрый ответ, да, я знаю, что только что добавил новый столбец в «modx_ms2_orders», добавленный также в (core/components/minishop2/model/minishop2/mysql/msorder.map.inc.php) в «fields» и « fieldMeta", затем в (assets/components/minishop2/js/mgr/orders/orders.window.js), но после заказа существует имя поля, но нет данных.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      8