[РЕШЕНО] Пытаюсь создать плагин в miniShop2

Борюсь с плагином. Решил попаразитировать на поле popular.
Делаю по инструкции. Однако, хочу, чтобы это поле управлялось комбобоксом, потому как значений 3.
Создал необходимые файлы, разложил по папкам. В форме появился комбобокс с нужными значениями. Выбираю, сохраняю, всё вроде нормально. Перезагружаю форму редактирования и упс — значение этого комбобокса всегда становится равным 1. Такое ощущение, что это true, но почему, блин, тру-то? Что ж не так?! Прямо в расстройстве сижу.

Привожу содержимое файлов:
index.php
<?php
/* Index file for miniShop2 position plugin */

return array(
	'xpdo_meta_map' => array(
		'msProductData' => require_once dirname(__FILE__) .'/model/msproductdata.map.inc.php'
	)
	,'manager' => array(
		'msProductData' => MODX_ASSETS_URL . 'components/minishop2/plugins/position/msproductdata.js'
	)
);
msproductdata.js
miniShop2.plugin.pluginname = {
	getFields: function(config) {
		return {
			popular: {
				 xtype: 'modx-combo-tv-widget'
				,store:[[0, 'Нет'],[1, 'Первый уровень'],[2, 'Второй уровень']]
				,description: '<b></b>'+_('ms2_product_popular_help')
			}
			
		}
	}
	,getColumns: function() {
		return {
			popular: {
				width:50
				,sortable:false
				,editor: {
					xtype:'modx-combo-tv-widget'
					, name: 'popular'
				}
			}
		}
	}
};
msproductdata.map.inc.php
<?php
return array(
	'fields' => array(
		'popular' => NULL
	)
	,'fieldMeta' => array(
		'popular' => array(
			'dbtype' => 'tinyint'
			,'precision' => '1'
			,'attributes' => 'unsigned'
			,'phptype' => 'integer'
			,'null' => false
			,'default' => 0
		)
	)
	,'indexes' => array(
		'popular' => array (
			'alias' => 'popular'
			,'primary' => false
			,'unique' => false
			,'type' => 'BTREE'
			,'columns' => array (
				'popular' => array (
					'length' => ''
					,'collation' => 'A'
					,'null' => false
				)
			)
		)
	)
);

UPD:
Итак, очередная победа разума над обстоятельствами. Комбобокс с нужными мне параметрами заработал.
Сделал так:
1. Создал отдельное поле position — tinyint(1). Добавил его в индексы.
2. Создал новый тип комбобокса и вложил его прямо в msproductdata.js своего плагина. Получилось вот что:
Ext.namespace('miniShop2.combo');

miniShop2.combo.Position = function(config) {
	config = config || {};

	Ext.applyIf(config,{
		name: config.name || 'position'
		,fieldLabel: _('ms2_product_' + config.name || 'position')
		,hiddenName: config.name || 'position'
		,description: '<b></b>'+_('ms2_product_position_help')
		,displayField: 'position'
		,valueField: 'id'
		,anchor: '99%'
		,fields: ['id', 'name']
		,pageSize: 20
		,url: miniShop2.config.connector_url
		,typeAhead: false
		,editable: false
		,allowBlank: false
		,store: [[0, 'Нет'],[1, 'Первый уровень'],[2, 'Второй уровень']]
	});
	miniShop2.combo.Vendor.superclass.constructor.call(this,config);
};
Ext.extend(miniShop2.combo.Position,MODx.combo.ComboBox);
Ext.reg('minishop2-combo-position',miniShop2.combo.Position);

miniShop2.plugin.position = {
	getFields: function(config) {
		return {
			position: {
				 xtype: 'minishop2-combo-position'
				,description: '<b></b>'+_('ms2_product_position_help')
			}
			
		}
	}
	,getColumns: function() {
		return {
			position: {
				width:50
				,sortable:false
				,editor: {
					xtype:'minishop2-combo-position'
					, name: 'position'
				}
			}
		}
	}
};
На выходе имеем работающий комбобокс, прописывающий нужные нам значения в поле position.
Виталий Батушев
07 мая 2013, 02:44
modx.pro
4
4 553
0

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

Василий Наумкин
07 мая 2013, 07:49
0
А колонку в таблице БД ты изменил? Там же TINYINT(1). Туплю.

Проверь в базе данных, значение-то меняется, при сохранении? Может, проблема в Ext виджете?
    Виталий Батушев
    07 мая 2013, 08:37
    0
    Значение меняется всегда на 1. Тоже вот лежу и думаю — это виджет. Но ведь пробовал и просто modx-combo. Та же фигня. А другие комбы явно специализированные. Буду спать и думать.
      Василий Наумкин
      07 мая 2013, 08:39
      0
      Наверное, MODX все равно считает, что это boolean поле. Или БД так считает.

      Попробуй сделать его INT(10) и в модели и в БД.

    Мордынский Николай
    07 мая 2013, 09:27
    0
    таже самая беда что и у меня, вася так и непоправил в мануале это

    miniShop2.plugin.pluginname = {
    	getFields: function(config) {
    		return {
    			popular: {
    				 xtype: 'modx-combo-tv-widget'
    				,store:[[0, 'Нет'],[1, 'Первый уровень'],[2, 'Второй уровень']]
    				,description: '<b></b>'+_('ms2_product_popular_help')
    			}
    			
    		}
    	}
    	,getColumns: function() {
    		return {
    			popular: {
    				width:50
    				,sortable:false
    				,editor: {
    					xtype:'modx-combo-tv-widget'
    					, name: 'popular'
    				}
    			}
    		}
    	}
    };
    в первой строке pluginname должнобыть заменено на имя плагина читайте коменты у статей есть много людей которые ходили по вашим граблям и оставили решения для вас

    может причмина и не в этом но так работать небудет
      Василий Наумкин
      07 мая 2013, 10:25
      0
      1. в тексте и не должно быть исправлено, там плагин называется pluginname.
      2. в плагине color ошибка исправлена, и даже переделана установка\удаление на сниппеты
      3. у Виталия выводится нормально этот xtype, оно не сохраняется как надо.
        Мордынский Николай
        07 мая 2013, 23:42
        0
        я скачивал видел ) изменения

        объяснение ведется на примере color плагина и народ путается сверху стоит кусок кода pluginname и сразу следом идет
        // Файл /core/components/minishop2/plugins/pluginname/model/msproductdata.map.inc.php
        
        <?php
        return array(
        	'fields' => array(
        		'color' => NULL
        	)
        	,'fieldMeta' => array(
        		'color' => array(
        			'dbtype' => 'varchar'
        			,'precision' => '255'
        			,'phptype' => 'string'
        			,'null' => true
        			,'default' => NULL
        		)
        	)
        	,'indexes' => array(
        		'color' => array (
        			'alias' => 'color'
        			,'primary' => false
        			,'unique' => false
        			,'type' => 'BTREE'
        			,'columns' => array (
        				'action' => array (
        					'length' => ''
        					,'collation' => 'A'
        					,'null' => false
        				)
        			)
        		)
        	)
        );
        Надо сверху 30 шрифтом написать внимание внимание)) все pluginname следует заменить на имя вашего плагина.
        Виталий Батушев
        07 мая 2013, 18:39
        0
        Николай, указанную ошибку исправил, но ситуация не изменилась. Прям не мог уснуть вчера, но жена цепко держала за руку и убежать колотить по клавишам не мог :) Буду сегодня ковырять.
        P.S.
        Вот интересное нашел. Файл /www/core/components/minishop2/processors/mgr/product/update.class.php
        22 строка:
        $this->setCheckbox('popular');
        А функция setCheckbox у нас в MODX такая:
        public function setCheckbox($k,$force = false) {
                $v = null;
                if ($force || isset($this->properties[$k])) {
                    $v = empty($this->properties[$k]) || $this->properties[$k] === 'false' ? 0 : 1;
                    $this->setProperty($k,$v);
                }
                return $v;
            }
        То есть она возвращает 1, если только значение а) не пусто, б) не равно абсолютно false. Что и наблюдаем.
        В общем, надо спрыгивать с этого поля.
          Василий Наумкин
          08 мая 2013, 05:47
          0
          Точно, я и забыл про отдельную обработку чекбоксов.

          Сделай отдельное поле, это же не долго.
        Виталий Батушев
        08 мая 2013, 08:08
        0
        Сделал поле position: int(10). Поменял в map-файле dbtype на int и precision на 10.
        Итоги:
        Комбобокс (modx-combo-tv-widget) работает, но значения в базе не сохраняет.
        Комбобокс (modx-combo) работает, но все время переключается на дефолтное значение (0).

        Ип-патьевская летопись… Буду дальше совком ковырять.
          Василий Наумкин
          08 мая 2013, 14:08
          0
          Надо свой комбобокс, видимо, написать.

          Или посмотри, может у MS2 есть что подходящее, чтобы унаследовать и расширить.
            Александр Котлов
            24 июля 2013, 17:12
            0
            Приветствую. Не могли бы вы выложить содержимое всех 3х файлов нового плагина (msproductdata.js, msproductdata.map.inc.php и index.php). Попытался собрать плагин из того что в тексте и коментах упоминается — как ни стараюсь — все время «ошибка сервера»(
            Михаил
            17 октября 2014, 09:52
            0
            А вот интересно, как вытащить данные из одной таблицы и вложить эти данные в комбо в выпадающий список например
              Алексей Ерохин
              17 октября 2014, 10:31
              1
              0
              Пишите процессор, и вызываете его в store для комбобокса.
              var storeusers = new Ext.data.JsonStore({
                  autoLoad: true,
                  url: '/servicesection/componentsajax.html?action=contragents',
                  fields: [{name:'id', type: 'int'}, 'fullname'],
                  storeId: 'storeusers'
              });
              У меня примерно так было давно, на вызываемой странице сниппет.
              Павлик Мышкин
              06 марта 2015, 19:45
              0
              По данному топику делал, все получилось.
              Плейсходлер [[+position]] работает.
              Есть вот такой вопрос: как вывести кроме «0»,«1»,«2» еще и значение «Нет», «Первый уровень», «Второй уровень»?
                Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
                14