[РЕШЕНО] Пытаюсь создать плагин в miniShop2
Борюсь с плагином. Решил попаразитировать на поле popular.
Делаю по инструкции. Однако, хочу, чтобы это поле управлялось комбобоксом, потому как значений 3.
Создал необходимые файлы, разложил по папкам. В форме появился комбобокс с нужными значениями. Выбираю, сохраняю, всё вроде нормально. Перезагружаю форму редактирования и упс — значение этого комбобокса всегда становится равным 1. Такое ощущение, что это true, но почему, блин, тру-то? Что ж не так?! Прямо в расстройстве сижу.
Привожу содержимое файлов:
index.php
UPD:
Итак, очередная победа разума над обстоятельствами. Комбобокс с нужными мне параметрами заработал.
Сделал так:
1. Создал отдельное поле position — tinyint(1). Добавил его в индексы.
2. Создал новый тип комбобокса и вложил его прямо в msproductdata.js своего плагина. Получилось вот что:
Делаю по инструкции. Однако, хочу, чтобы это поле управлялось комбобоксом, потому как значений 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.jsminiShop2.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. Комментарии: 14
Проверь в базе данных, значение-то меняется, при сохранении? Может, проблема в Ext виджете?
Значение меняется всегда на 1. Тоже вот лежу и думаю — это виджет. Но ведь пробовал и просто modx-combo. Та же фигня. А другие комбы явно специализированные. Буду спать и думать.
Наверное, MODX все равно считает, что это boolean поле. Или БД так считает.
Попробуй сделать его INT(10) и в модели и в БД.
Попробуй сделать его INT(10) и в модели и в БД.
таже самая беда что и у меня, вася так и непоправил в мануале это
может причмина и не в этом но так работать небудет
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 должнобыть заменено на имя плагина читайте коменты у статей есть много людей которые ходили по вашим граблям и оставили решения для васможет причмина и не в этом но так работать небудет
1. в тексте и не должно быть исправлено, там плагин называется pluginname.
2. в плагине color ошибка исправлена, и даже переделана установка\удаление на сниппеты
3. у Виталия выводится нормально этот xtype, оно не сохраняется как надо.
2. в плагине color ошибка исправлена, и даже переделана установка\удаление на сниппеты
3. у Виталия выводится нормально этот xtype, оно не сохраняется как надо.
я скачивал видел ) изменения
объяснение ведется на примере color плагина и народ путается сверху стоит кусок кода pluginname и сразу следом идет
объяснение ведется на примере 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 следует заменить на имя вашего плагина.
Николай, указанную ошибку исправил, но ситуация не изменилась. Прям не мог уснуть вчера, но жена цепко держала за руку и убежать колотить по клавишам не мог :) Буду сегодня ковырять.
P.S.
Вот интересное нашел. Файл /www/core/components/minishop2/processors/mgr/product/update.class.php
22 строка:
В общем, надо спрыгивать с этого поля.
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. Что и наблюдаем.В общем, надо спрыгивать с этого поля.
Точно, я и забыл про отдельную обработку чекбоксов.
Сделай отдельное поле, это же не долго.
Сделай отдельное поле, это же не долго.
Сделал поле position: int(10). Поменял в map-файле dbtype на int и precision на 10.
Итоги:
Комбобокс (modx-combo-tv-widget) работает, но значения в базе не сохраняет.
Комбобокс (modx-combo) работает, но все время переключается на дефолтное значение (0).
Ип-патьевская летопись… Буду дальше совком ковырять.
Итоги:
Комбобокс (modx-combo-tv-widget) работает, но значения в базе не сохраняет.
Комбобокс (modx-combo) работает, но все время переключается на дефолтное значение (0).
Ип-патьевская летопись… Буду дальше совком ковырять.
Надо свой комбобокс, видимо, написать.
Или посмотри, может у MS2 есть что подходящее, чтобы унаследовать и расширить.
Или посмотри, может у MS2 есть что подходящее, чтобы унаследовать и расширить.
Приветствую. Не могли бы вы выложить содержимое всех 3х файлов нового плагина (msproductdata.js, msproductdata.map.inc.php и index.php). Попытался собрать плагин из того что в тексте и коментах упоминается — как ни стараюсь — все время «ошибка сервера»(
А вот интересно, как вытащить данные из одной таблицы и вложить эти данные в комбо в выпадающий список например
Пишите процессор, и вызываете его в store для комбобокса.
var storeusers = new Ext.data.JsonStore({
autoLoad: true,
url: '/servicesection/componentsajax.html?action=contragents',
fields: [{name:'id', type: 'int'}, 'fullname'],
storeId: 'storeusers'
});
У меня примерно так было давно, на вызываемой странице сниппет.
По данному топику делал, все получилось.
Плейсходлер [[+position]] работает.
Есть вот такой вопрос: как вывести кроме «0»,«1»,«2» еще и значение «Нет», «Первый уровень», «Второй уровень»?
Плейсходлер [[+position]] работает.
Есть вот такой вопрос: как вывести кроме «0»,«1»,«2» еще и значение «Нет», «Первый уровень», «Второй уровень»?
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.