[miniShop2] Добавляем свои поля в заказ в админке

Бывает необходимость расширить таблицу заказов miniShop2. Можно легко это сделать с помощью несложных действий.


Появилась необходимость добавить поле, куда менеджер будет вписывать трек-номер для отслеживания заказа в транспортной компании.

1. Добавляем поле в БД.
ALTER TABLE `modx_ms2_order_addresses` ADD `tracknum` VARCHAR(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL`;

2. Создаём плагин и отмечаем галочкой события OnMODXInit и msOnManagerCustomCssJs.
<?php
switch($modx->event->name){
    case 'OnMODXInit':
	$map = array(
            'msOrderAddress' => array(
                'fields' => array(
                    'tracknum' => ''
                ),
                'fieldMeta' => array(
                    'tracknum' => array(
                        'dbtype' => 'varchar',
                        'precision' => '255',
                        'phptype' => 'string',
                        'null' => true,
                    ),
                ),
            ),
        );
        foreach ($map as $class => $data) {
            $modx->loadClass($class);

            foreach ($data as $tmp => $fields) {
                if ($tmp == 'fields') {
                    foreach ($fields as $field => $value) {
                        foreach (array('fields', 'fieldMeta', 'indexes') as $key) {
                            if (isset($data[$key][$field])) {
                                $modx->map[$class][$key][$field] = $data[$key][$field];
                            }
                        }
                    }
                } elseif ($tmp == 'composites' || $tmp == 'aggregates') {
                    foreach ($fields as $alias => $relation) {
                        if (!isset($modx->map[$class][$tmp][$alias])) {
                            $modx->map[$class][$tmp][$alias] = $relation;
                        }
                    }
                }
            }
        }
        break;
    
    case 'msOnManagerCustomCssJs':
        if ($page != 'orders') return;
	    $modx->controller->addHtml("
            <script>
                Ext.ComponentMgr.onAvailable('minishop2-window-order-update', function(){
                    let orderTab = this.fields.items[2].items
                    let obj = {
                        layout: 'column',
                        defaults: {
                            msgTarget: 'under',
                            border: false
                        },
                        anchor: '100%',
                        items: [
                            { 
                                columnWidth: 1,
                                layout: 'form',
                                items:[
                                    {
                                        title: 'ТК',
                                        xtype: 'fieldset',
                                        id: 'minishop2-fieldset-tc',
                                        labelAlign: 'top',
                                        autoHeight: true,
                                        border: false,
                                        items: [
                                            {
                                                xtype: 'textfield',
                                                name: 'addr_tracknum',
                                                fieldLabel: 'Трек-номер',
                                                anchor: '100%',
                                                value: this.record.addr_tracknum
                                            }
                                        ]
                                    }
                                ]
                            }
                        ]
                    }
                    orderTab.push(obj)
                });                
            </script>");
    break;
}

3. В заказах в админке появилось поле Трек-номер, куда можем вписывать собственно сам трек-номер, полученный у ТК.


4. Данное поле tracknum легко добавить в шаблон писем, например так:
{$address.tracknum}

Всё! Легко и просто. По аналогии можно добавить любое количество полей, выводя их в любую вкладку в Заказах miniShop2.
Klike
24 января 2022, 14:59
modx.pro
5
1 651
+8

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

Роман
25 января 2022, 09:11
0
Что-то попробовал, не завелось. Ладно, чуть позже посмотрю, что не так.
    Klike
    25 января 2022, 11:00
    0
    Если префикс таблицы стандартный, и делать всё по заметке – должно получиться.
    Rootiys
    04 февраля 2022, 15:40
    0
    Не добавляется поле в админку. Префикс бд modx_
      R2m0x94 (Vasily)
      05 февраля 2022, 02:11
      0
      Кэш браузера чистили?
        Rootiys
        05 февраля 2022, 12:22
        0
        Конечно
          R2m0x94 (Vasily)
          05 февраля 2022, 12:28
          +1
          В любом случае должно получится, а иначе попробовать можно msOrderFields (490 р)
      Антон
      25 марта 2022, 15:49
      0
      Не очень работает.
      В первой строчке ошибка $modx->events->name — должно быть так $modx->event->name
      В остальном код полностью скопировал.
      Все отображается в админке. Поле в базу добавлено. Но поле не сохраняется в админке, не понял в чем проблема.
        Klike
        25 марта 2022, 21:14
        0
        Спасибо, поправил. По поводу сохранения, может где-то всё таки не так, потому что код скопирован с рабочего проекта. Когда убирал лишнее, допустил ошибку в $modx->events->name, в остальном всё должно работать.
        Pakos Fakos
        03 мая 2022, 14:23
        0
        спасибо за статью, но у меня другой вопрос, а что если вы хотите, чтобы это новое поле (трек-номер) брало данные из другой таблицы с уже вставленными номерами?
        Я имею в виду вместо текстового поля выпадающее меню для выбора числа из определенной таблицы -> столбца. Как в этом случае добавить связь между выпадающим меню, конкретным столбцом из другой таблицы и Order?
          Николай Савин
          03 мая 2022, 16:53
          0
          В этом случае в процессоре нужно добавить выборку данных из дополнительной таблицы. Тогда они будут доступны как родные в JS
            Pakos Fakos
            03 мая 2022, 16:59
            0
            спасибо, я попробую
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          11