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

Итак после не удачного опыта во вкладке «Производитель товаров» решил попробовать разобраться во вкладке «Опции» и как говориться первый блин комом.

1. Добавим плагин для того что бы подключить наш файлик ExtJS (у меня их много поэтому я предлагаю такую схему.

<?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/addms2option.js');
            break;
        }
        break;
}
Далее создадим данную дирректорию и наследуем нашу форму

Ext.override (miniShop2.window.CreateOption, {
  getForm: function (config) {
      return [
          {xtype: 'hidden', name: 'id', id: config.id + '-id'},
          {xtype: 'hidden', name: 'categories', id: config.id + '-categories'},
          {
              layout: 'column',
              items: [{
                  columnWidth: .5,
                  layout: 'form',
                  defaults: {msgTarget: 'under'},
                  items: [{
                      xtype: 'textfield',
                      fieldLabel: _('ms2_ft_name'),
                      name: 'key',
                      //allowBlank: false,
                      anchor: '99%',
                      id: config.id + '-name'
                  }]
              }, {
                  columnWidth: .5,
                  layout: 'form',
                  defaults: {msgTarget: 'under'},
                  items: [{
                      xtype: 'textfield',
                      fieldLabel: _('ms2_ft_caption'),
                      name: 'caption',
                      //allowBlank: false,
                      anchor: '99%',
                      id: config.id + '-caption'
                  }]
              }]
          }, {
              xtype: 'minishop2-combo-option-types',
              anchor: '99%',
              id: config.id + '-types',
              listeners: {
                  select: {fn: this.onSelectType, scope: this},
              }
          }, {
              xtype: 'panel',
              anchor: '99%',
              id: config.id + '-properties-panel',
          }, {
              layout: 'column',
              items: [{
                  columnWidth: .5,
                  layout: 'form',
                  defaults: {msgTarget: 'under'},
                  items: [{
                      xtype: 'textfield',
                      fieldLabel: _('ms2_ft_measure_unit'),
                      name: 'measure_unit',
                      allowBlank: true,
                      anchor: '99%',
                      id: config.id + '-measure-unit',
                  }]
              }, {
                  columnWidth: .5,
                  layout: 'form',
                  defaults: {msgTarget: 'under'},
                  items: [{
                      xtype: 'modx-combo-category',
                      fieldLabel: _('ms2_ft_group'),
                      name: 'category',
                      anchor: '99%',
                      id: config.id + '-category',
                  }]
              }]
          },
           {
              xtype: 'textarea',
              fieldLabel: _('ms2_ft_description'),
              name: 'description',
              anchor: '99%',
              id: config.id + '-description'
          },

          {
              layout: 'column',
              title: _('ms2_ft_title_sf_dtls'),
              style: 'color: #555555;padding: 20px 0 0;',
              items: [{
                  columnWidth: .5,
                  layout: 'form',
                  defaults: {msgTarget: 'under'},
                  items: [{
                        xtype: 'textfield',
                        fieldLabel: _('ms2_ft_dtls_rules'),
                        name: 'dtls_rules',
                        anchor: '99%',
                        id: config.id + '-dtls_rules'
                    }]
              }, {
                  columnWidth: .5,
                  layout: 'form',
                  defaults: {msgTarget: 'under'},
                  items: [{
                        xtype: 'textfield',
                        fieldLabel: _('ms2_ft_dtls_page'),
                        name: 'dtls_page',
                        anchor: '99%',
                        id: config.id + '-dtls_page'
                    }]
              }]
          },
          {
                        xtype: 'xcheckbox',
                        boxLabel: _('ms2_ft_dtls_url'),
                        name: 'dtls_url',
                        anchor: '99%',
                        id: config.id + '-dtls_url'
                    }
      ];
  },

  onSelectType: function (combo, row) {
      var panel = Ext.getCmp(this.config.id + '-properties-panel');
      if (panel) {
          panel.getEl().update('');
      }
      if (!row.data || !row.data['xtype']) {
          return;
      }

      MODx.load({
          xtype: row.data['xtype'],
          renderTo: this.config.id + '-properties-panel',
          record: this.record,
          name: 'properties',
      });
  },
});
3. Добавим плагин в систему MS2 указав ссылку на маппинг распалагать мы можем в любой папке

<?php
return array(
    'map' => array(
        'msOption' => require_once 'msoptionsdata.map.inc.php',
    )
);
Далее добавляем плагин в систему MS2 открываем консоль и добавляем

<?php
if ($miniShop2 = $modx->getService('miniShop2')) {
$miniShop2->addPlugin('option_table', '{core_path}components/minishop2/custom/option_table/index.php');
}
Создаем дирректорию и создадим файлик с маппингом

<?php
return array(
    'fields' => array(
        'dtls_url' => 0,
        'dtls_rules' => NULL,
        'dtls_page' => NULL,
    ),
    'fieldMeta' => array(
        'dtls_url' => array(
          'dbtype' => 'tinyint',
				  'precision' => '1',
				  'attributes' => 'unsigned',
				  'phptype' => 'boolean',
				  'default' => 0,
        ),
        'dtls_rules' => array(
          'dbtype' => 'int',
          'precision' => '10',
          'attributes' => 'unsigned',
          'phptype' => 'integer',
          'null' => false,
        ),
        'dtls_page' => array(
          'dbtype' => 'int',
          'precision' => '10',
          'attributes' => 'unsigned',
          'phptype' => 'integer',
          'null' => false,
        ),
    ),
);
4. Добавим в словарь наши новые label и почистим кэш и добавим поля из маппинга в БД в таблицу ms2_options

Скриншот БД ms2_options



Воля и получается следующая история. Зачем обязательно расскажу если история будет удобная. Моя задача рассказать как просто расширять поля через сервис MS2



Ура все просто и удобно. Осталось разобраться как добавить поля в другие вкладки ну это иная история.
Олег Щавелев
21 ноября 2019, 06:06
modx.pro
9
309
+12

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

Это сообщение было удалено
    Vladimir
    21 ноября 2019, 07:25
    0
    Боже какая подробная инструкция!
      Александр Мельник
      21 ноября 2019, 09:09
      +1
      Можно взглянуть на написанные вами инструкции? Человек старался и поделился с другими.
      Фарит
      23 ноября 2019, 21:40
      +1
      Как победить глюк с произвольным перемешиванием опции товара?
      Например, я вставляю опции в заданном порядке 1, 10, 100, 1000.
      Сохраняю, и все перемешивается, алгоритм перемешивания не ясен, никакой сортировки нет.
      Хотелось бы чтобы опции не перемешивались и на сайте показывались именно в том порядке в котором записывались.
        Олег Щавелев
        24 ноября 2019, 08:33
        0
        Хороший вопрос. Но я думаю это к сниппету который выводит опции на фронт. Здесь много вопросов. Сортировка, Группировка по категориям, Подсказки и возможно что-то еще)
      Павел Бигель
      23 ноября 2019, 23:00
      +1
      Скажу так. Я немного не согласен с парочкой решений, да и гайдов по этому поводу было достаточно много.

      Но! Это единственный который прям step-by-step что будет полезно новичкам в разработке. Поэтому лайк, советую автору не останавливаться и делать такие же гайды для всего с чем он сталкивался :)
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9