Подскажите, пожалуйста, как установить значение поля, сделав запрос на сервер?
Есть поле в админке на странице компонента:
Есть процессор, который получает данные из базы. Как из ExtJS обратиться к этому процессору и результат запроса вставить в value этого поля?
ModXSaver.panel.CodeEditor = function(config) {
config = config || {};
Ext.apply(config,{
id: 'modxsaver-texteditor'
,border: false
,baseCls: 'modx-formpanel'
,cls: 'container'
,items: [{
html: '<p>'+_('xsaver_desc')+'</p>'
,border: false
,bodyCssClass: 'panel-desc'
},{
id: 'mod-xsaver-texteditor'
,xtype: 'modx-texteditor'
,height: 300
,width: '99%'
,value: _('xsaver_default_value')
}]
});
ModXSaver.panel.CodeEditor.superclass.constructor.call(this,config);
};
Есть процессор, который получает данные из базы. Как из ExtJS обратиться к этому процессору и результат запроса вставить в value этого поля?
Комментарии: 9
MODx.Ajax.request({
url: '/assets/connector.php'
,params: {
action: 'mgr/my/processor'
}
,listeners: {
success: {fn: function(response) {
console.log(response);
}, scope: this}
}
})
Почему-то если вместо console.log указать return, никакое значение не возвращается.
...
{
id: 'mod-xsaver-codeeditor'
,xtype: 'modx-texteditor'
,height: 300
,width: '99%'
,value: this.getCodeEditorValue()
}
...
getCodeEditorValue:function(){
MODx.Ajax.request({
url: '/assets/connector.php'
,params: {
action: 'getcode'
}
,listeners: {
success: {fn: function(response) {
return response;
}, scope: this}
}
});
}
Боюсь, я что-то не так делаю…
Это асинхронный запрос. Твой скрипт заканчивает работать раньше, чем придет ответ от сервера, поэтому никакой return работать не будет.
В методе success ты можешь получить нужный объект и сделать с ним что-то, а return работает только в синхронных запросах.
В методе success ты можешь получить нужный объект и сделать с ним что-то, а return работает только в синхронных запросах.
Должно работать примерно так:
Можно указать и id всей формы, чтобы выставить значения сразу для всех полей:
MODx.Ajax.request({
url: '/assets/connector.php'
,params: {
action: 'mgr/my/processor'
}
,listeners: {
success: {fn: function(response) {
var el = Ext.getCmp('mod-xsaver-codeeditor');
el.setValue(response.value);
}, scope: this}
}
});
После успешного ajax запроса будет получен инпут страницы по id и выставлено значение для него.Можно указать и id всей формы, чтобы выставить значения сразу для всех полей:
var form = Ext.getCmp('mod-xsaver-form');
el.setValues(response.values);
Спасибо большое! Так работает) Я пытался получить инпут с помощью getElementByID, поэтому не получалось)
Так ты получишь элемент DOM, а не компонент Ext JS.
Для получения DOM у Ext есть Ext.get(), а Ext.getCmp() получает именно объект, у которого есть всякие полезные методы, типа setValue().
Для получения DOM у Ext есть Ext.get(), а Ext.getCmp() получает именно объект, у которого есть всякие полезные методы, типа setValue().
подскажите пожалуйста:
суть: Создание textfield на лету при создание(редактирование) записи, т.е. При нажатии Добавить, всплывает окно в котором на лету созданные textfield, к примеру 3 штуки, а если это UPDATE то и их значение соответственно, помимо этого есть поля не созданные на лету.
При сохранение отправляется в процессор, в котором поля созданные на лету колбасятся в JSON и записыватся в 1 колонку БД.
Вот столкнулся сразу же с проблемой
Есть процессор, в нем получаю массив полей
Подскажите как быть с запросом к процессору, может в плагине раньше получать, но тогда я не смогу получить текущее value при апдейте.
суть: Создание textfield на лету при создание(редактирование) записи, т.е. При нажатии Добавить, всплывает окно в котором на лету созданные textfield, к примеру 3 штуки, а если это UPDATE то и их значение соответственно, помимо этого есть поля не созданные на лету.
При сохранение отправляется в процессор, в котором поля созданные на лету колбасятся в JSON и записыватся в 1 колонку БД.
Вот столкнулся сразу же с проблемой
Есть процессор, в нем получаю массив полей
foreach ($arr as $value) {
$fields[] = array(
'xtype' => 'textfield',
'fieldLabel' => $value['code'],
'name' => $value['code'],
'id' => "config.id + '-".$value['code']."'",
'anchor' => "99%",
'allowBlank' => "false",
'value' => ''
);
}
return $this->success('ok',$fields);
Обращаюсь к этому процессору и хочу вставить в функцию определения полей getFields:Ext.extend(Trans.window.CreateItem, MODx.Window, {
getFields: function (config) {
var fieldsArr = '';
MODx.Ajax.request({
url: Trans.config.connectorUrl
,params: {
action: "mgr/tr_data/get_fields",
id_res: MODx.request.id,
createAction: true
}
,listeners: {
success: {fn: function(response) {
//console.log(response);
fieldsArr = response['object'];
console.log(fieldsArr+ 'success');
}, scope: this}
}
});
console.log(fieldsArr + ' - массив полей');
return [{
xtype: 'textfield',
fieldLabel: _('trans_lang_name'),
name: 'name',
id: config.id + '-name',
anchor: '99%',
allowBlank: false,
}, {
xtype: 'textfield',
fieldLabel: _('trans_lang_code'),
name: 'code',
id: config.id + '-code',
allowBlank: false,
anchor: '99%'
}, {
xtype: 'xcheckbox',
boxLabel: _('trans_lang_active'),
name: 'active',
id: config.id + '-active',
checked: true,
}];
},
loadDropZones: function () {
}
});
Ext.reg('trans-item-window-create', Trans.window.CreateItem);
Ajax запрос отрабатывает позже чем весь код, поэтому console.log(fieldsArr + ' — массив полей'), не выводит массив. Если получить массив полей, то наверно лучше его обработать в js, а не выдавать id: config.id + '-name', в php?Подскажите как быть с запросом к процессору, может в плагине раньше получать, но тогда я не смогу получить текущее value при апдейте.
Та же самая фигня, что и в моём коде.
JavaScript делает ассинхронный запрос и то, что указано внутри success выполняется после всего остального кода. Вот внутри этого success вам нужно заново найти окно (которое в этот момент уже будет открыто) и модифицировать его.
К сожалению, конкретных методов ExtJS для этого подсказать не смогу. Создайте отдельный вопрос конкретно под эту задачу — как в ExtJS обратиться к окну по его id и добавить в него полей. Надеюсь, вам помогут.
JavaScript делает ассинхронный запрос и то, что указано внутри success выполняется после всего остального кода. Вот внутри этого success вам нужно заново найти окно (которое в этот момент уже будет открыто) и модифицировать его.
К сожалению, конкретных методов ExtJS для этого подсказать не смогу. Создайте отдельный вопрос конкретно под эту задачу — как в ExtJS обратиться к окну по его id и добавить в него полей. Надеюсь, вам помогут.
Все же хотелось бы получить массив и передать его функцию для создания полей, но похоже придется делать как ты говоришь и тут еще заний extJs придется набрать)
Тему создал modx.pro/help/9977/
Тему создал modx.pro/help/9977/
Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.