Подскажите, пожалуйста, как установить значение поля, сделав запрос на сервер?

Есть поле в админке на странице компонента:

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 этого поля?
Илья Уткин
27 мая 2014, 16:55
modx.pro
1
2 755
0

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

Василий Наумкин
27 мая 2014, 21:09
0
MODx.Ajax.request({
	url: '/assets/connector.php'
	,params: {
		action: 'mgr/my/processor'
	}
	,listeners: {
		success: {fn: function(response) {
			console.log(response);
		}, scope: this}
	}
})
    Илья Уткин
    27 мая 2014, 22:26
    0
    Почему-то если вместо 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}
        	}
        });
    }
    Боюсь, я что-то не так делаю…
      Василий Наумкин
      28 мая 2014, 01:22
      0
      Это асинхронный запрос. Твой скрипт заканчивает работать раньше, чем придет ответ от сервера, поэтому никакой return работать не будет.

      В методе success ты можешь получить нужный объект и сделать с ним что-то, а return работает только в синхронных запросах.
    Василий Наумкин
    28 мая 2014, 08:07
    0
    Должно работать примерно так:
    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);
      Илья Уткин
      28 мая 2014, 19:20
      0
      Спасибо большое! Так работает) Я пытался получить инпут с помощью getElementByID, поэтому не получалось)
        Василий Наумкин
        28 мая 2014, 19:24
        0
        Так ты получишь элемент DOM, а не компонент Ext JS.

        Для получения DOM у Ext есть Ext.get(), а Ext.getCmp() получает именно объект, у которого есть всякие полезные методы, типа setValue().
      Константин Ильин
      02 октября 2016, 15:48
      0
      подскажите пожалуйста:
      суть: Создание 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 при апдейте.
        Илья Уткин
        04 октября 2016, 08:41
        0
        Та же самая фигня, что и в моём коде.

        JavaScript делает ассинхронный запрос и то, что указано внутри success выполняется после всего остального кода. Вот внутри этого success вам нужно заново найти окно (которое в этот момент уже будет открыто) и модифицировать его.

        К сожалению, конкретных методов ExtJS для этого подсказать не смогу. Создайте отдельный вопрос конкретно под эту задачу — как в ExtJS обратиться к окну по его id и добавить в него полей. Надеюсь, вам помогут.
          Константин Ильин
          04 октября 2016, 14:20
          0
          Все же хотелось бы получить массив и передать его функцию для создания полей, но похоже придется делать как ты говоришь и тут еще заний extJs придется набрать)
          Тему создал modx.pro/help/9977/
        Авторизуйтесь или зарегистрируйтесь, чтобы оставлять комментарии.
        9