[РЕШЕНО] Переопределение процессора minishop2

Всем привет!

Понадобилось поправить в админке форму, выводящую заказы minishop2, добавить одно поле — joxi.ru/E2pJYQMCaadVPr

С extJs практически не знаком, пришлось рыть и рыть… в результате представление поля в форме добавил плагином (спасибо Павлу Гвоздю — modx.pro/howto/11306 ) и в процессоре core/components/minishop2/processors/mgr/orders/product/get.class.php добавил строку
$array['el_size_c'] = json_decode($array['options'])->el_size;

в методе cleanup().
Это правка исходников, это нехорошо, я понимаю. Но не смог найти как переопределить процессор, чтобы не затерся при обновлении. Попробовал плагин переделать на свой лад из статьи Павла — не прокатило. Подходящих материалов тоже не нашел((

Если не сложно, направьте, пожалуйста, в нужную сторону. Я не прошу решения — возможно, есть материал, который я пропустил. До sencha.com пока руки не дошли, в перспективе…

Заранее спасибо.
Alexey
20 февраля 2020, 20:31
modx.pro
1
902
0

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

Максим
21 февраля 2020, 13:23
+1
Данный процессор встречается в файле orders.grid.products.js в методах addOrderProduct и updateOrderProduct возможно стоит их переопределить с новым процессором.
Честно говоря сам не очень силен в ExtJS
    Николай
    21 февраля 2020, 15:31
    +2
    Да этот файл описывает класс miniShop2.grid.OrderProducts, в нём есть метод updateOrderProduct, который при открытии окна редактирования товара делает запрос в процессор mgr/orders/product/get. Можно расширить класс miniShop2.grid.OrderProducts, переписав в нём метод updateOrderProduct. Для этого создаём плагин на событие msOnManagerCustomCssJs, в плагине код:

    <?php
    
    if($modx->event->name == 'msOnManagerCustomCssJs') {
        $modx->controller->addLastJavascript(MODX_ASSETS_URL . 'mgr/js/orders.js');
    }
    Этот код подключает js-файл к админке для минишоповских страниц.

    Код orders.js:

    Ext.override(miniShop2.grid.OrderProducts, {
        // копируем целиком оригинальный метод, меняем путь к процессору в action на свой
        updateOrderProduct: function (btn, e, row) {
                .......
                MODx.Ajax.request({
                url: miniShop2.config['connector_url'],
                params: {
                    action: 'mgr/orders/product/customget',
                    id: id
                },
                .......
        },
    });

    Если раньше путь процессору был mgr/orders/product/get, то меняем, допустим, на mgr/orders/product/customget, а в папке с процессорами core/components/minishop2/processors/mgr/orders/product/ создаём копию оригинального процессора (get.class.php) с названием customget.class.php, и меняем там что нужно.
      Alexey
      21 февраля 2020, 19:28
      1
      0
      Николай, Сергей, спасибо огромное — всё получилось))

      Есть ещё небольшой вопрос, подскажите, пожалуйста, если знаете. Вот плагин, расширяющий представление формы в админке:
      <?php
      switch ($modx->event->name) {
          case 'msOnManagerCustomCssJs':
              if ($page != 'orders') return;
      		$modx->controller->addHtml("
                  <script type='text/javascript'>
                      Ext.ComponentMgr.onAvailable('minishop2-window-orderproduct-update', function() {
          				new_item ={
                                  layout: 'column',
                                  border: false,
                                  anchor: '100%',
                                  items: [{
                                      columnWidth: 1,
                                      layout: 'form',
                                      defaults: {msgTarget: 'under'},
                                      border: false,
                                      items: [{
                                          xtype: 'textfield',
                                          fieldLabel: 'Размер',
                                          name: 'el_size_c',
                                          anchor: '100%'
                                      }]
                                  }]
                              }
          				this.fields.push(new_item);
                      });                
                  </script>
              ");
          	break;
      }
      Получается, что методом push он добавляет поле в конец формы, после поля «Опции товара» — joxi.ru/YmEZ4vqUJMGZb2
      Есть какой-то метод, который позволяет добавлять поле после определенного поля, к примеру —
      joxi.ru/brRN3vdtYOBJqr

      Вот сама форма:
      miniShop2.window.OrderProduct = function (config) {
          config = config || {};
          //console.log(config.id);
          Ext.applyIf(config, {
              title: _('ms2_menu_update'),
              width: 600,
              baseParams: {
                  action: config.action || 'mgr/orders/product/update',
              },
              modal: true,
          });
          miniShop2.window.OrderProduct.superclass.constructor.call(this, config);
      };
      Ext.extend(miniShop2.window.OrderProduct, miniShop2.window.Default, {
      
          getFields: function () {
              return [
                  {xtype: 'hidden', name: 'id'},
                  {xtype: 'hidden', name: 'order_id'},
                  {
                      layout: 'column',
                      border: false,
                      anchor: '100%',
                      items: [{
                          columnWidth: .3,
                          layout: 'form',
                          defaults: {msgTarget: 'under'},
                          border: false,
                          items: [{
                              xtype: 'numberfield',
                              fieldLabel: _('ms2_product_count'),
                              name: 'count',
                              anchor: '100%',
                              allowNegative: false,
                              allowBlank: false
                          }]
                      }, {
                          columnWidth: .7,
                          layout: 'form',
                          defaults: {msgTarget: 'under'},
                          border: false,
                          items: [{
                              xtype: 'textfield',
                              fieldLabel: _('ms2_name'),
                              name: 'name',
                              anchor: '100%'
                          }]
                      }]
                  }, {
                      layout: 'column',
                      border: false,
                      anchor: '100%',
                      items: [{
                          columnWidth: .5,
                          layout: 'form',
                          defaults: {msgTarget: 'under'},
                          border: false,
                          items: [{
                              xtype: 'numberfield',
                              decimalPrecision: 2,
                              fieldLabel: _('ms2_product_price'),
                              name: 'price',
                              anchor: '100%'
                          }]
                      }, {
                          columnWidth: .5,
                          layout: 'form',
                          defaults: {msgTarget: 'under'},
                          border: false,
                          items: [{
                              xtype: 'numberfield',
                              decimalPrecision: 3,
                              fieldLabel: _('ms2_product_weight'),
                              name: 'weight',
                              anchor: '100%'
                          }]
                      }]
                  },/* {
                      //custom
                      layout: 'column',
                      border: false,
                      anchor: '100%',
                      items: [{
                          columnWidth: 1,
                          layout: 'form',
                          defaults: {msgTarget: 'under'},
                          border: false,
                          items: [{
                              xtype: 'textfield',
                              fieldLabel: 'Размер',
                              name: 'el_size_c',
                              anchor: '100%'
                          }]
                      }]
                      //custom
                  },*/
                  {xtype: 'textarea', fieldLabel: _('ms2_product_options'), name: 'options', height: 100, anchor: '100%'}
              ];
          },
      
          getKeys: function () {
              return [{
                  key: Ext.EventObject.ENTER,
                  shift: true,
                  fn: function () {
                      this.submit()
                  }, scope: this
              }];
          },
      
      });
      Ext.reg('minishop2-window-orderproduct-update', miniShop2.window.OrderProduct);
        Николай
        21 февраля 2020, 21:00
        1
        +1
        push это функция языка javascript. Для работы с массивами там есть несколько функций, например splice
          Alexey
          22 февраля 2020, 09:15
          0
          Благодарю, Николай — всё сделал)))
    Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
    5