Как добавить поле заказа в 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
3
137
+1

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

Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
0