MS2: Vendor всегда 0, как добавлять Производителя?

Я добавляю производителя, но он всегда выставляется в 0, то есть невозможно добавить производителя…
Peter Zenin
01 июня 2013, 02:47
modx.pro
2 419
0

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

Peter Zenin
01 июня 2013, 07:32
1
0
Извиняюсь, я туплю, нашел где их добавлять, производителей.

Просто я пытаюсь дополнительное поле сделать с выпадающим списком как vendor
Мне надо чтоб искал из поля в таблице msProducts и подставлял, а если поля нет, то текущий оставлял, чтоб можно было сохранить и добавить.

Оказывается vendor нее очень удачный пример для копирования, т.к. там автоматом выставляется ноль, если ничего не выбрано…

Даже не представляю по какому примеру сделать автозаполняемое поле из уже существующих значений (чтоб подбирал только разные), а если ничего не выбрано то оставлял текущее.

Подскажите с чего можно подсмотреть подобный функционал?

Заранее благодарю!
    Василий Наумкин
    01 июня 2013, 09:20
    0
    Если не ошибаюсь, у поля vendor в модели прописано default = 0. А можно прописать deault = '', тогда не будет 0 подставлять, если ничего не прислано.
      Peter Zenin
      01 июня 2013, 09:30
      0
      Все равно насильно подставляет значение, надо читать маны по ExtJs либо другой тип юзать…
        Василий Наумкин
        01 июня 2013, 09:44
        0
        Так ты еще и этот же xtype используешь?

        Не пойдет, нужно делать свой xtype и к нему процессор, который будет отдавать подходящие значения.
          Peter Zenin
          01 июня 2013, 10:09
          0
          Нет я сделал наподобие:
          miniShop2.combo.Unit = function(config) {
              config = config || {};
          
              Ext.applyIf(config,{
                  name: config.name || 'unit'
                  ,fieldLabel: _('ms2_product_' + config.name || 'unit')
                  ,hiddenName: config.name || 'unit'
                  ,displayField: 'name'
                  ,valueField: 'id'
                  ,anchor: '99%'
                  ,fields: ['name','id']
                  ,pageSize: 20
                  ,url: miniShop2.config.connector_url
                  ,typeAhead: true
                  ,editable: true
                  ,allowBlank: true
                  //,emptyText: _('no')
                  ,baseParams: {
                      //action: 'mgr/settings/vendor/getlist'
                      action: 'mgr/settings/unit/getlist'
                      ,combo: 1
                      ,id: config.value
                      //,limit: 0
                  }
              });
              miniShop2.combo.Unit.superclass.constructor.call(this,config);
          };
          Ext.extend(miniShop2.combo.Unit,MODx.combo.ComboBox);
          Ext.reg('minishop2-combo-unit',miniShop2.combo.Unit);
          
          miniShop2.plugin.unit = {
              getFields: function(config) {
                  return {
                      unit: {xtype: 'minishop2-combo-unit', description: '<b></b><br />'+_('ms2_product_unit_help')}
                  }
              }
              ,getColumns: function() {
                  return {
                      unit: {width:50, sortable:false, editor: {xtype:'minishop2-combo-unit', name: 'unit'}}
                  }
              }
          };
          Все как следует, сделал файл пока просто для тестирования:
          /core/components/minishop2/processors/mgr/settings/unit/getlist.class.php
          <?php
          
          class msUnitGetListProcessor extends modObjectGetListProcessor {
          
          	public function process() {
          
                  $arrRet = array(
                      'total' => 1,
                      'results' => array(
                          'id' => 77,
                          'name' => 'test'
                      )
                  );
                  return json_encode($arrRet);
          
          	}
          
          }
          
          return 'msUnitGetListProcessor';
          Я не совсем идиот. :) Просто я набираю сейчас в поле что-то, а он test подставляет насильно, хотя emptyText убрал.
            Василий Наумкин
            01 июня 2013, 11:17
            0
            В results вроде должен быть массив массивов.

            То есть
            $arrRet = array(
            	'total' => 1,
            	'results' => array(
            		array(
            			'id' => 77,
            			'name' => 'test'
            		)
            	)
            );

            Ну и смотри, что именно отправляется в консоли браузера. И еще можно убрать у комбобокса typeAhead — это он включает автоподстановку.
              Peter Zenin
              01 июня 2013, 12:10
              0
              Все, разобрался, надо было добавить ,forceSelection: false

              Наверное в мод екс оно переопределяется в true

              PS: Про массив массивов — да, когда много, а когда один — он такой. я его из фаербага взял.

              Остался вопрос, как построить запрос в xpdo чтоб взять все разные значения из одного поля таблицы. Если кто на вскидку знает, подскажите, или хотя бы где покопать. Еще не смог приучиться к xpdo.
                Peter Zenin
                01 июня 2013, 12:34
                0
                Мало было ,forceSelection: false — перестал сразу автоматом заменять,
                но он все равно заменял вводимое после 3 символа, пришлось откатить символы вот так:
                ,minChars: 100
                Теперь можно вводить новое значение спокойно, а если надо выбрать из существующих — то просто раскрыть список и выбрать.
                  Peter Zenin
                  01 июня 2013, 12:37
                  0
                  Вот тут про xpdo — я зря спросил, (тут group by), надо было просто сначала подумать прежде чем спрашивать… Все вопросы отменяются…
                  Благодарю!
                    Саша Иващенко
                    12 июня 2013, 05:05
                    0
                    Ну вы выложите маленькую инструкцию как это реализовали, интересно же )
                      Peter Zenin
                      12 июня 2013, 23:34
                      0
                      Один такой параметр с всплывающими подсказками — материал.
                      /assets/components/minishop2/plugins/material/msproductdata.js:
                      miniShop2.combo.Material = function(config) {
                          config = config || {};
                      
                          Ext.applyIf(config,{
                              name: config.name || 'material'
                              ,fieldLabel: _('ms2_product_' + config.name || 'material')
                              ,hiddenName: config.name || 'material'
                              ,displayField: 'name'
                              ,valueField: 'name'
                              ,url: miniShop2.config.connector_url
                              ,typeAhead: true
                              ,editable: true
                              ,allowBlank: true
                              ,forceSelection: false
                              ,minChars: 100
                              ,baseParams: {
                                  action: 'mgr/settings/material/getlist'
                              }
                          });
                          miniShop2.combo.Material.superclass.constructor.call(this,config);
                      };
                      Ext.extend(miniShop2.combo.Material,MODx.combo.ComboBox);
                      Ext.reg('minishop2-combo-material',miniShop2.combo.Material);
                      
                      miniShop2.plugin.material = {
                          getFields: function(config) {
                              return {
                                  material: {xtype: 'minishop2-combo-material', description: '<b></b><br />'+_('ms2_product_material_help')}
                              }
                          }
                          ,getColumns: function() {
                              return {
                                  material: {width:50, sortable:false, editor: {xtype:'minishop2-combo-material', name: 'material'}}
                              }
                          }
                      };
                      И процессор, чтобы выдавать всплывающие подсказки,
                      /core/components/minishop2/processors/mgr/settings/material/getlist.class.php:
                      <?php
                      
                      class msMaterialGetListProcessor extends modObjectGetListProcessor {
                      
                      	public function process() {
                      
                              $q = $this->modx->newQuery('msProductData');
                              $q->select('material');
                              $q->groupby('material');
                              if ($q->prepare() && $q->stmt->execute()) {
                                  while ($row = $q->stmt->fetch(PDO::FETCH_ASSOC)) {
                                      $materials[]['name'] = $row['material'];
                                  }
                              }
                      
                              $arrRet = array(
                                  'total' => (string)count($materials),
                                  'results' => $materials
                              );
                      
                              return json_encode($arrRet);
                      
                      	}
                      
                      }
                      
                      return 'msMaterialGetListProcessor';
                      Ну а в php плагина там вроде все стандартно по примеру.
      Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
      11