Добавить поле в опции MS вкладка "Производитель товара" msVendor .

У меня задача добавить два поля в форму в настройках MS2, вкладка «Производитель»

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');
            break;
        }
        break;
}
На событие msOnManagerCustomCssJs

2. Создал директорию core/components/minishop2/custom/vendor_table/

И создал два файла

index.php

<?php
return array(
    'map' => array(
        'msVendor' => require_once 'msvendor.map.inc.php',
    ),
);
msvendor.map.inc.php

<?php
return array(
    'fields' => array(
        'dtls_introtext' => NULL,
        'dtls_active' => 1,
    ),
    'fieldMeta' => array(
        'dtls_introtext' => array(
          'dbtype' => 'text',
          'phptype' => 'string',
          'null' => NULL,
        ),
        'dtls_active' => array(
          'dbtype' => 'tinyint',
          'precision' => '1',
          'attributes' => 'unsigned',
          'phptype' => 'integer',
          'null' => true,
          'default' => 1,
        ),
    ),
);
Наследовал ExtJS формы

Ext.override(miniShop2.grid.Vendor, {
    getFields: function () {
        return [
            'id', 'name', 'resource', 'country', 'email', 'logo', 'pagetitle',
            'address', 'phone', 'fax', 'dtls_introtext', 'dtls_active', 'description', 'actions'
        ];
    },
});
Ext.override (miniShop2.window.CreateVendor, {
    getFields: function (config) {
        return [
            {xtype: 'hidden', name: 'id', id: config.id + '-id'},
            {
                layout: 'column',
                items: [{
                    columnWidth: .6,
                    layout: 'form',
                    defaults: {msgTarget: 'under'},
                    items: [{
                        xtype: 'textfield',
                        fieldLabel: _('ms2_name'),
                        name: 'name',
                        anchor: '99%',
                        id: config.id + '-name'
                    }],
                }, {
                    columnWidth: .4,
                    layout: 'form',
                    items: [{
                        xtype: 'textfield',
                        fieldLabel: _('ms2_country'),
                        name: 'country',
                        anchor: '99%',
                        id: config.id + '-country'
                    }],
                }]
            }, {
                layout: 'column',
                items: [{
                    columnWidth: .4,
                    layout: 'form',
                    items: [{
                        xtype: 'textfield',
                        fieldLabel: _('ms2_email'),
                        name: 'email',
                        anchor: '99%',
                        id: config.id + '-email'
                    }],
                }, {
                    columnWidth: .6,
                    layout: 'form',
                    items: [{
                        xtype: 'minishop2-combo-resource',
                        fieldLabel: _('ms2_resource'),
                        name: 'resource',
                        anchor: '99%',
                        id: config.id + '-resource'
                    }],
                }]
            }, {
                xtype: 'minishop2-combo-browser',
                fieldLabel: _('ms2_logo'),
                name: 'logo',
                anchor: '99%',
                id: config.id + '-logo'
            }, {
                xtype: 'textarea',
                fieldLabel: _('ms2_address'),
                name: 'address',
                anchor: '99%',
                id: config.id + '-address'
            }, {
                layout: 'column',
                items: [{
                    columnWidth: .5,
                    layout: 'form',
                    items: [{
                        xtype: 'textfield',
                        fieldLabel: _('ms2_phone'),
                        name: 'phone',
                        anchor: '99%',
                        id: config.id + '-phone'
                    }],
                }, {
                    columnWidth: .5,
                    layout: 'form',
                    items: [{
                        xtype: 'textfield',
                        fieldLabel: _('ms2_fax'),
                        name: 'fax',
                        anchor: '99%',
                        id: config.id + '-fax'
                    }],
                }]
            }
            
            , {
                xtype: 'textarea',
                fieldLabel: _('ms2_dtls_introtext'),
                name: 'dtls_introtext',
                anchor: '99%',
                id: config.id + '-dtls_introtext'
            }
            
            , {
                xtype: 'textarea',
                fieldLabel: _('ms2_description'),
                name: 'description',
                anchor: '99%',
                id: config.id + '-description'
            }
            
            ,
            
            {
                xtype: 'xcheckbox',
                boxLabel: _('ms2_dtls_active'),
                name: 'dtls_active',
                anchor: '99%',
                id: config.id + '-dtls_active',
                
            }
        ];
    }
});
Добавляем новые поля в БД



Регистрируем плагин в системе MS2

<?php
if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('vendor_table', '{core_path}components/minishop2/custom/vendor_table/index.php');
}
Ну и последнем шагом добавляем в словарь Minishop2 тема manager

ms2_dtls_introtext
ms2_dtls_active

Кейс: Для поисковой оптимизации мы делаем состовной заголовок товара который мы настраиваем для каждого бренда отдельно. В результате мы получили удобную форму.

https://i.imgur.com/MUcQA84.png
Олег Щавелев
19 ноября 2019, 05:41
modx.pro
4
1 535
0
Поблагодарить автора Отправить деньги

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

Олег Щавелев
20 ноября 2019, 20:27
0
Я изучал данный вопрос по двум статьям masterdench.ru/dobavit-polya-v-opczii-minishop2.html но и документации docs.modx.pro/komponentyi/minishop2/razrabotka/plaginyi-tovarov, конечно хочется больше информации по данному вопросу.
    Олег Щавелев
    20 ноября 2019, 23:06
    0
    Так же создал issue где написал порядок написание поля взятых не статей а из логике и в чем уверен что это правильно. Ссылка на issue
      Артём Зернов
      21 ноября 2019, 16:37
      +1
      То есть если я все правильно понимаю, поля отображаются, все ок. При сохранении формы первый раз все отправляется и сохраняется, а при редактировании уже нет? При редактировании в кастомных полях есть данные или они пустые?
        Олег Щавелев
        21 ноября 2019, 21:09
        0
        @Артём Зернов

        Cпасибо за вопросы.

        Добавление
        1. При добавление товара данные передаются в массив все данные в БД есть.

        Редактирование
        1. При открытие в кастомных полях поля пустые.
        2. Если мы напишум другую информацию (редактирование) в кастомных полях она обновиться (поля остануться пустых а массиве появиться обновленная информация)
        3. Если мы езменим другие поля, а кастомные при изменение оставим без изменение то данные кастомных полей сотруться и кастомные поля перезапишуться на пустоту.

        Надеюсь я перечислил все сценирии поведения данной формы.
          Артём Зернов
          22 ноября 2019, 07:08
          +1
          Определенно, это указывает на то, что данные, получаемые из процессора при открытии формы на редактирование, либо не поступают от процессора, либо просто не подставляются в поля. Мне что-то подсказывает, что коннектор возвращает только стандартные поля, а про доп. поля ему ничего не известно.
          Чтобы это понять, открывайте консоль браузера и в момент открытия формы на редактирование посмотрите, какие данные возвращает коннектор. Если в них нет ваших доп. полей, значит нужно копать серверную часть и смотреть, где вы что-то упустили, что коннектор не возвращает нужные данные.
          Если же данные поступают, но не подставляются в поля, то нужно копать клиентскую часть, то есть javascript, и смотреть, почему эти данные не подставляются в соответствующие поля формы.

          Понимаю, что вы надеялись скорее всего получить конкретный ответ, но, к сожалению, у меня сейчас не так много времени, чтобы воспроизвести у себя данный кейс и указать на конкретную причину :)
            Олег Щавелев
            22 ноября 2019, 08:41
            0
            @Артём Зернов

            Cпасибо за ответ. Я уже начал копать в данном направление и даже создал вопрос в ветки баг MS2 в GitHub.

            Почему я это сделал?.. Вы очень правильно сформулировали, как нужно разбираться в данной проблеме. Я создал вопрос в issue Если будет интересно разобраться в данном вопросе. Я написал мануал уже более обдуманно.

            Там же я прикрепил скриншот данных connector. Данные в файле присутствуют. Все таки это баг, так как в соседней вкладке выше описанные действия срабатывают и все работает на ура.

            Спасибо Вам за внимание к этой проблеме. Буду так же копать в сторону Ext JS и разбираться более детально как это работает и что содержиться в классах и как они наследуются. Чувствую проблема именно в этом.

            Для удобства переношу скриншот коннекторами в комментарий.

        Володя
        22 ноября 2019, 09:52
        0
        смотрим тут github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L119
        видим что запись идет из грида, доступны там поля заданные тут github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L18

        надо править метод github.com/bezumkin/miniShop2/blob/master/assets/components/minishop2/js/mgr/settings/vendor/grid.js#L117

        чтобы был запрос перед выводом окна, примерно так
        updateVendor: function (btn, e, row) {
            if (typeof(row) != 'undefined') {
                this.menu.record = row.data;
            }
            var id = this.menu.record.id;
        
            MODx.Ajax.request({
                url: this.config.url,
                params: {
                    action: 'mgr/settings/vendor/get',
                    id: id
                },
                listeners: {
                    success: {
                        fn: function ( r ) {
                            var w = Ext.getCmp('minishop2-window-vendor-update');
                            if (w) {
                                w.close();
                            }
        
                            w = MODx.load({
                                xtype: 'minishop2-window-vendor-update',
                                id: 'minishop2-window-vendor-update',
                                title: this.menu.record['name'],
                                record: r.object,
                                listeners: {
                                    success: {
                                        fn: function () {
                                            this.refresh();
                                        }, scope: this
                                    },
                                }
                            });
                            w.fp.getForm().reset();
                            w.fp.getForm().setValues(r.object);
                            w.show(e.target);
                        }, scope: this
                    }
                }
            });
        },
          Олег Щавелев
          22 ноября 2019, 10:26
          0
          @Володя

          Cпасибо за разъяснение, я понял как это работает. Я внес измнение все заработало.

          Ну я не уверен что я прав в логике. Но работает.

          Ext.override(miniShop2.grid.Vendor, {
              getFields: function () {
                  return [
                      'id', 'name', 'resource', 'country', 'email', 'logo', 'pagetitle',
                      'address', 'phone', 'fax', 'dtls_introtext', 'dtls_active', 'description', 'actions'
                  ];
              },
          });
          Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
          8