Как добавить поле в настройках MS2 вкладка "Доставка" при добавлении пункта доставки

Внимание! При реконструкции полей используется метод
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'
        }
        ];
    },
});

Но вот и результат

Олег Щавелев
08 декабря 2019, 23:18
modx.pro
2
1 357
+9
Поблагодарить автора Отправить деньги

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

Pavel Zarubin
24 декабря 2019, 03:49
+1
Хреново так делать, во первых ты перезаписываешь метод полностью, а если обновится минишоп и добавятся новые поля что делать будешь? Во вторых зачем прописывать одни и те же поля если у родителя они уже прописаны? В общем сначала всегда вызывается родительский метод getFields а уже потом производится работы с массивов который вернул этот метод
    Олег Щавелев
    24 декабря 2019, 04:15
    0
    Логичное замечание. Спасибо за критику она для меня очень важна. В свою очередь делал по другой статье где этот метод использовался.

    Через недельку я обновлю статью где уже внесу изменение согласно твоему предложению. А сейчас в шапку внесу данную информацию.

    Спасибо.
    Pavel Zarubin
    24 декабря 2019, 03:54
    +1
    И еще, все таки динамические компоненты лучше изменять через метод onAvalible (как я описывал тут: modx.pro/howto/15248) т.к. это позволяет работать например с пришедшими данными (record). Взять твою же галку «индивидуальный расчет» она действительно нужна на всех типах доставки? Все таки подозреваю что нужна она только на доставке с определенными классом обработчиком, что собственно и позволяет реализовать onAvalible
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      3