Вопрос по superboxselect
Добрый день.
Продолжаю изучать написание компонентов c использованием modExtra. В своем компоненте хочу использовать выпадающий список со множественным выбором superboxselect.
Пытаюсь разобраться c его работой на примере minishop2.
Итак, изменил схему БД modExtra.
Две таблицы, в первой таблице добавил поле 'tags':
Вторая таблица 'testOption' список этих опций:
Пока только на примере одной опции 'tags'. Её для теста через PhpMyAdmin заполнил произвольными значениями.
Далее в файле items.windows.js для методов Create и Update добавил поле:
Создал файл mgr/item/getoptions.class.php
Проблема в том, что когда открываю добавленную запись на редактирование, поле множественного выбора не заполняется, оно пустое. Понимаю что проблема где то в процессоре get.class.php, видимо нужно Json данные подменить массивом, но как это сделать не понимаю. В minishop2 тоже не могу найти где это осуществляется. Или быть может проблема в другом? Подскажите?
P. S. Сорри, что так много писанины, просто хотелось сразу описать проблему.
Продолжаю изучать написание компонентов c использованием modExtra. В своем компоненте хочу использовать выпадающий список со множественным выбором superboxselect.
Пытаюсь разобраться c его работой на примере minishop2.
Итак, изменил схему БД modExtra.
Две таблицы, в первой таблице добавил поле 'tags':
<field key="tags" dbtype="text" phptype="json" null="true" />для хранения выбранных значений опции 'tags'. Вторая таблица 'testOption' список этих опций:
<object class="testOption" table="test_options" extends="xPDOObject">
<field key="test_id" dbtype="int" precision="10" attributes="unsigned" phptype="integer" null="false" />
<field key="key" dbtype="varchar" precision="255" phptype="string" null="false" />
<field key="value" dbtype="text" phptype="string" null="true" default="" />
<index alias="option" name="option" primary="false" unique="false" type="BTREE" >
<column key="test_id" length="" collation="A" null="false" />
<column key="key" length="" collation="A" null="false" />
</index>
<aggregate alias="Item" class="testItem" local="test_id" foreign="id" cardinality="one" owner="foreign" />
</object> Пока только на примере одной опции 'tags'. Её для теста через PhpMyAdmin заполнил произвольными значениями.
Далее в файле items.windows.js для методов Create и Update добавил поле:
{
xtype: 'test-combo-options',
name: 'tags',
fieldLabel: _('test_multi_select'),
}и описал xtype: 'test-combo-options':test.combo.Options = function(config) {
config = config || {};
Ext.applyIf(config,{
xtype:'superboxselect'
,allowBlank: true
,msgTarget: 'under'
,allowAddNewData: true
,addNewDataOnBlur : true
,resizable: true
,name: config.name || 'tags'
,anchor:'100%'
,minChars: 2
,store:new Ext.data.JsonStore({
id: (config.name || 'tags') + '-store'
,root:'results'
,autoLoad: true
,autoSave: false
,totalProperty:'total'
,fields:['value']
,url:test.config.connector_url
,baseParams: {
action: 'mgr/item/getoptions'
,key: config.name
}
})
,mode: 'remote'
,displayField: 'value'
,valueField: 'value'
,triggerAction: 'all'
,extraItemCls: 'x-tag'
,expandBtnCls: 'x-form-trigger'
,clearBtnCls: 'x-form-trigger'
,renderTo: Ext.getBody()
,listeners: {
newitem: function(bs,v, f) {bs.addItem({tag: v});},
}
});
config.name += '[]';
test.combo.Options.superclass.constructor.call(this,config);
};
Ext.extend(test.combo.Options,Ext.ux.form.SuperBoxSelect);
Ext.reg('test-combo-options',test.combo.Options);Создал файл mgr/item/getoptions.class.php
class testGetOptionsProcessor extends modObjectProcessor {
public $classKey = 'testOption';
/** {@inheritDoc} */
public function process() {
$query = trim($this->getProperty('query'));
$limit = trim($this->getProperty('limit', 10));
$key = $this->getProperty('key');
$c = $this->modx->newQuery('testOption');
$c->sortby('value','ASC');
$c->select('value');
$c->groupby('value');
$c->where(array('key' => $key));
$c->limit($limit);
if (!empty($query)) {
$c->where(array('value:LIKE' => "%{$query}%"));
}
$found = false;
if ($c->prepare() && $c->stmt->execute()) {
$res = $c->stmt->fetchAll(PDO::FETCH_ASSOC);
foreach ($res as $v) {
if ($v['value'] == $query) {
$found = true;
}
}
}
else {$res = array();}
if (!$found && !empty($query)) {
$res = array_merge_recursive(array(array('value' => $query)), $res);
}
return $this->outputArray($res);
}
}
return 'testGetOptionsProcessor';В результате, при создании нового элемента в списке выбора отображаются записи из таблицы 'testOption', а также можно дописать свои. Сохраняем новый элемент, в БД у него значение поля 'tags' становиться [«test1»,«test2»], то есть все вроде бы хорошо, все сохраняется.Проблема в том, что когда открываю добавленную запись на редактирование, поле множественного выбора не заполняется, оно пустое. Понимаю что проблема где то в процессоре get.class.php, видимо нужно Json данные подменить массивом, но как это сделать не понимаю. В minishop2 тоже не могу найти где это осуществляется. Или быть может проблема в другом? Подскажите?
P. S. Сорри, что так много писанины, просто хотелось сразу описать проблему.
Комментарии: 27
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
Например, создал новый элемент, вписал три значения опции 'tags': «test1», «test2», «test3» сохранил, смотрю в базе добавилась запись, поле 'tags' имеет значение [«test 1»,«test 2»,«test 3»], то есть данные успешно добавлены.
По вашему совету, посмотрел какие идут запросы и ответы при нажатии кнопки Изменить.Посылается два POST запроса json типа. Первый возвращает:
второй:
Получается первый запрос возвращает массив 'tags', не понимаю почему тогда не отображается в поле выбора?
Второй запрос честно говоря вообще не знаю что возвращает и почему их выполняется два.
Значения возвращаемого массива, являются объектами, а у меня строки. Каким образом мне можно изменить возвращаемый ответ на массив объектов?
В результате при открытии окна редактирования получаю следующий ответ:
Но поле все равно пустое. Кто нибудь может подсказать что не так?
1. Из minishop2 взял элемент списка со множественным выбором:
События select, beforeadditem, beforeremoveitem, clear закккоментировал, иначе выдает ошибку, они вроде бы не принимают участи при выводе.
2. На форму окна пометил элементы списка:
3. Из из minishop2 добавил процессор получения выпадающего списка getoptions.class.php:
4. Выпадающий список выводиться из таблицы 'testOption', для теста заполнил её вручную.
5. После создания элементы попадают в таблицу 'testItem':
Поле 'tags' успешно заполнено. В таблицу 'testOption' пока не добавляю.
6. Открываю окно для редактирования, выпадающий список из 'testOption' выводиться, а сохраненные данные [«test1»,«test2»] из 'testItem' нет:
Очередность запросов тут мне кажется не при чем, тот запрос который в предыдущем примере пустой выводился, это вывод выпадающего списка:
видимо в предыдущем примере у меня таблица 'testOption' просто была пустая.
Более того в minishop2 на запрос касаемо вывода опций tags, ответ только такого типа и выводиться.
Где передаются уже выбранные опции я не нашел.
можно сделать получение в get процессоре например так — github.com/vgrish/modForms/blob/master/core/components/modforms/processors/mgr/form/get.class.php#L30-L46
Пробовал добавлять в свой getlist.class.php в метод prepareRow(xPDOObject $object) следующий код:
Вместо массива стала выводится json строка, но толку это не дало, при открытии окна редактирования поле superboxselect все равно пустое.
Уже наверное все варианты перепробовал…
и мало того у вас вообще в tags строка
1. У тебя есть некая таблица ExtJs с кнопкой добавления записей
2. Ты нажимаешь на кнопку и в некоем поле открывшегося окна ты добавляешь запись, эта запись добавляется в таблицу БД.
3. Затем в таблице из пункта 1 ты нажимаешь на некую запись-строку (уже другой таблицы, и не известно как туда попала эта запись, но это не важно) и у тебя открывается окно редактирования записи.
4. При открытии это окно автоматически заполняется данными и скорее всего поле tag тоже заполняется.
5. Ты нажимаешь на выпадающий список Tag у тебя идет запрос на сервер, в котором он получает ответ, для примера содержащий 1,2,3,4 а в выпадающем списке у тебя отображается только 1,2
6. И чтобы ты не делал ты всегда видишь 1,2. Имею ввиду обновлял грид, перезагруж страницу, добавлял новые данные напрямую итд.
Я правильно понял проблему?
2. Да.
3. Не совсем, открываю на редактирование запись из первой таблицы, открывается окно редактирования.
4. Да, все поля заполнены кроме поля tags из 1 пункта.
5. Нет, выпадающий список формируется полностью на основе таблицы testOption из пункта 1. С этим проблем нет.
6. Чтобы я не делал я не вижу сохраненные значения tags из таблицы testItem.
2. Ничего, просто открывается окно как в первый раз
3. В том что если я открываю окно редактирования, я не вижу в нем сохраненые значения superboxselect.
4. Id окон разные, я в чистой modExtra экспериментирую, соответственно 'test-item-window-create' и 'test-item-window-update'
5. superboxselect встроенный в MODX версии 2.3.5-pl. По крайней мере в minishop2 установленном на этом же хосте, этот механизм работает.
6. По полям, можно выше взглянуть, я куски кода приводил которые брал из minishop2. Эти поля не трогал.
У меня:
1) Поле выводитсся так же в окне редактирования.
2) Процессор, при открытии окна редактирования возвращает json вида:
{«success»:true,«message»:"",«total»:0,«data»:[],«object»:{«id»:155,«code»:«iii»,«type»:1,«products»:«1,2,3,4,5,6,7,8»}}
Где «products» поле которое нужно отрендерить в superboxselect.
Остальное все так же как и в описаной Вами проблеме.
В get процессор
Чтобы вернулось из процессора поле с [] и массивом для поля valueField в компоненте superboxselect
Это сообщество единоличников, или всё же разработчиков? Как у человека проблема — он пишет каждые пять минут, а как решение найдено — идите все нахер? :)
Опишите решение, коллеги.
Параметр , или как в моем случае , где 'specialties' это массив переданный из процессора.
Вы не поможете? Не могу понять что не так?! =(
Например, у ресурса уже есть в бд значения ["тег 1","тег 2","тег 3"], но в супер-селекте они не выводятся и не вводятся. Есть у кого подсказка или решение?
В таблице modx_site_content добавлена структура tags_cloud
Плагин: