| 
	| 
	
	| 
		
	| 
			
			 
			
				05.07.2012, 23:05
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.08.2008 
						Сообщений: 162
					 
		
 |  |  
	| 
				submit textfield + grid in ExtJS
			 Имеется на одной форме: 
1) текстовые поля (textfield), чекбоксы, ... 
2) Ext.grid.Panel 
3) Ну и кнопочка "submit", её код:
 
buttons: [
 {
  text: "Save",
  handler:
  function () {
   PanelData.submit({
    waitMsg: lanLoading,
    url: "Handlers/...",
    success: function (form, action) { ... },
    failure: function (form, action) { ... }
   });
  }
 }
]
Задача: отправить все данные одним потоком на сервак и с текстовых полей и с Грида. 
На сервере получаю данные только с тектовых полей, а вот данные Грида не приходят ...  
Прошу Вашей помощи! |  |  
	| 
		
	| 
			
			 
			
				05.07.2012, 23:51
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 19.12.2009 
						Сообщений: 164
					 
		
 |  |  
	| 
	
 
	| Сообщение от potkin   |  
	| На сервере получаю данные только с тектовых полей, а вот данные Грида не приходят ... |  
	
 А с какой-такой тихой радости они должны приходить? Грид просто тупо визуализирует то, что хранится в Store. В Вашем варианте перед submit'ом формы получайте Ext.data.Store.getNewRecords() /Ext.data.Store.getUpdatedRecords() /Ext.data.Store.getRemovedRecords()  и отправляйте полученное. Ессесно с последующим анализом выхлопа серванта. По сути - Вам необходимо залисапетить Ext.data.Store.sync() . Дабы избежать всего этого гемора, я бы "вывернул" передачу данных: по кнопоцке "Саве" дергал бы Ext.data.Store.sync() , а в beforesync  запихивал бы в extraParams данные с формы.
				__________________"Helo, word!" - 17 errors 56 warnings
 |  |  
	| 
		
	| 
			
			 
			
				06.07.2012, 00:20
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.08.2008 
						Сообщений: 162
					 
		
 |  |  
	| Первый Вариант (похожий на него) практически реализовал ...Но вот второй - мне больше по душе ... )))
 
 А, разве, нет более легкого решения, что бы одной кнопочкой 2-х или более зайцев ... ???
 |  |  
	| 
		
	| 
			
			 
			
				06.07.2012, 07:39
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 19.12.2009 
						Сообщений: 164
					 
		
 |  |  
	| 
	
 
	| Сообщение от potkin   |  
	| Но вот второй - мне больше по душе ... ))) |  
	
 /me вспоминает грузинский дорожный знак "Не тарапися!"    В случае одновременного insert/update/delete sync() сделает три запроса, а Вы же хотите один...
 
	
 
	| Сообщение от potkin   |  
	| А, разве, нет более легкого решения, что бы одной кнопочкой 2-х или более зайцев ... |  
	
 Ну сами подумайте: что делает submit? Отправляет данные из input'ов form'ы. А что такое грид? Средство визуализации/отображения (специально для застройщиков/дельфинов   ). И откель форма знает что с ним делать? Хотя... Кто ж мешает ее научить этому? Вот этим Вы и займетесь, реализуя первый вариант    ...
				__________________"Helo, word!" - 17 errors 56 warnings
 			 Последний раз редактировалось Ex_Soft, 06.07.2012 в 09:59.
 |  |  
	| 
		
	| 
			
			 
			
				06.07.2012, 19:54
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.08.2008 
						Сообщений: 162
					 
		
 |  |  
	| Подскажите, пожалуйста, уважаемый Ex_Soft  !!! 
Возможно ли сохраненить данных грида и получить ответ от сервера, типа такого:
 
store.sync({
 success: function (form, action) {
  //...
 },
 failure: function (form, action) {
  //...
 }
});
Возможно лди такое ??? 
Тут пишут, что НЕТ:
http://www.sencha.com/forum/archive/...t-149887.html? 
Может за пол года что-то поменялось ??? |  |  
	| 
		
	| 
			
			 
			
				06.07.2012, 21:15
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 19.12.2009 
						Сообщений: 164
					 
		
 |  |  
	| 
	
 
	| Сообщение от potkin   |  
	| Может за пол года что-то поменялось ??? |  
	
 /me вспоминает:  
	
 
	| Сообщение от http://sp.sz.ru/nast_progr_.html |  
	| лучшая литература для хакера - распечатка программы |  
	
  
Все ж доступно: Ext.data.AbstractStore.sync() 
if (needsSync && me.fireEvent('beforesync', operations) !== false) {
            options = options || {};
            *!* me.proxy.batch */!* (Ext.apply(options, {
                operations: operations,
                listeners: me.getBatchListeners()
            }));
        }
Ext.data.proxy.Proxy.batch() "...i так далi..." Посмотрев по диагонали, соглашусь с
 
	
 
	| Сообщение от gevik |  
	| unfortunately the functionality does not exist yet |  
	
				__________________"Helo, word!" - 17 errors 56 warnings
 			 Последний раз редактировалось Ex_Soft, 07.07.2012 в 11:14.
				Причина: [ code ] -> [ js ]
 |  |  
	| 
		
	| 
			
			 
			
				07.07.2012, 01:37
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.08.2008 
						Сообщений: 162
					 
		
 |  |  
	| Ex_Soft,
ext-4.1  уже умеет принимать ответ с сервера.
 
store.sync({
 success: function () {
  Ext.Msg.alert("Сообщение", "Сохранено !!!");
 },
 failure: function () {
  Ext.Msg.alert("Сообщение", "Ошибка !!!");
 }
});
Вот только записи передаются при одном условии - если были какие-то изменения, да и в придачу асинхронно: 
1) Новые 
2) Удалённые 
3) Изменённые 
В отличии от 4.0.7 - там всё передавал одним запросом и пофигу, были изменения или нет.
 
Одно добавили а 10 убрали ... |  |  
	| 
		
	| 
			
			 
			
				07.07.2012, 11:13
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 19.12.2009 
						Сообщений: 164
					 
		
 |  |  
	| 
	
 
	| Сообщение от potkin   |  
	| ext-4.1 уже умеет принимать ответ с сервера |  
	
 Угу... Только, вот, Ext.data.proxy.Proxy.onBatchComplete 
onBatchComplete: function(batchOptions, batch) {
        var scope = batchOptions.scope || this;
        if (batch.hasException) {
            if (Ext.isFunction(batchOptions.failure)) {
                Ext.callback(batchOptions.failure, scope, [ *!* batch, batchOptions */!* ]);
            }
        } else if (Ext.isFunction(batchOptions.success)) {
            Ext.callback(batchOptions.success, scope, [ *!* batch, batchOptions */!* ]);
        }
        if (Ext.isFunction(batchOptions.callback)) {
            Ext.callback(batchOptions.callback, scope, [ *!* batch, batchOptions */!* ]);
        }
    }
и Ваша хотелка:
 
	
 
	| Сообщение от potkin   |  
	| 
store.sync({
 success: function ( *!* form, action */!*) {
  //...
 },
 failure: function ( *!* form, action */!*) {
  //...
 }
});
 |  
	
 как-то не стыкуются (ведь, насколько я понял, вы хотите скрестить ужа и ежа, сиречь - Ext.form.Panel и Ext.grid.Panel)...
 
Ext.data.AbstractStore.sync()
	
 
	| Сообщение от potkin   |  
	| Вот только записи передаются при одном условии - если были какие-то изменения |  
	
 
sync: function(options) {
        var me = this,
            operations = {},
            toCreate = me.getNewRecords(),
            toUpdate = me.getUpdatedRecords(),
            toDestroy = me.getRemovedRecords(),
            needsSync = false;
        if (toCreate.length > 0) {
            operations.create = toCreate;
            needsSync = true;
        }
        if (toUpdate.length > 0) {
            operations.update = toUpdate;
            needsSync = true;
        }
        if (toDestroy.length > 0) {
            operations.destroy = toDestroy;
            needsSync = true;
        }
        if ( *!* needsSync */!* && me.fireEvent('beforesync', operations) !== false) {
            options = options || {};
            me.proxy.batch(Ext.apply(options, {
                operations: operations,
                listeners: me.getBatchListeners()
            }));
        }
        
        return me;
    },
	
 
	| Сообщение от potkin   |  
	| да и в придачу асинхронно: 1) Новые
 2) Удалённые
 3) Изменённые
 |  
	
 Так было всегда. В 3-ке Ext.data.Store.save()  передавался xaction , а в 4-ке - REST 
	
 
	| Сообщение от potkin   |  
	| В отличии от 4.0.7 - там всё передавал одним запросом и пофигу, были изменения или нет. |  
	
 "Не верю" (c) См. выше + Ext.data.AbstractStore.sync()  - там тот же  if ( needsSync ...
				__________________"Helo, word!" - 17 errors 56 warnings
 |  |  
	| 
		
	| 
			
			 
			
				07.07.2012, 16:54
			
			
			
		 |  
	| 
		
			
			| Профессор       |  | 
					Регистрация: 23.08.2008 
						Сообщений: 162
					 
		
 |  |  
	| 
	
 
	| Цитата: |  
	| как-то не стыкуются (ведь, насколько я понял, вы хотите скрестить ужа и ежа, сиречь - Ext.form.Panel и Ext.grid.Panel)... |  
	
 Сохраняя грид, передаю "за компанию" и параметры:
 
store.proxy.extraParams.ParamTextField01 = "XXX01";
store.proxy.extraParams.ParamTextField02 = "XXX02";
store.save({
 //Надо обязательно получить ответ: сохранило или же нет.
 });
Параметры - это Шапка: ТекстФилд, ЧексБоксы, КомбоБоксы, ..., их определённое количество (оно не меняется). 
Грид - табличная часть, количество меняется.
 
	
 
	| Цитата: |  
	| "Не верю" (c) См. выше + Ext.data.AbstractStore.sync() - там тот же if ( needsSync ... |  
	
 Зачем мне обманывать?  
Могу видео на ЮТуб закинуть ... 
 
Код такой:
 
<script type="text/javascript" src='http://dev.sencha.com/deploy/ext-4.0.7-gpl/ext-all.js'></script>
<link rel="stylesheet" href="http://dev.sencha.com/deploy/ext-4.0.7-gpl/resources/css/ext-all.css" />
....
// *** *** *** МОДЕЛЬ *** *** *** 
Ext.define('BarCode', { extend: 'Ext.data.Model', fields: ...
// *** *** *** ХРАНИЛИЩЕ *** *** *** 
var storeGridBarCode = Ext.create('Ext.data.JsonStore', {
 restful: true,
 pageSize: 40,
 model: 'BarCode',
 proxy: {
  type: 'rest', //'ajax',
  batchActions: true,
  url: "Handlers/DirGrid.ashx?pID=BarCode",
  reader: { type: "json", successProperty: 'success', root: "BarCode",  messageProperty: 'message' },
  writer: { type: "json", encode: false, root: "BarCode" }
 }
}); storeGridBarCode.load();
var rowEditing = Ext.create('Ext.grid.plugin.RowEditing');
// *** *** *** П-Е *** *** *** 
var PanelGridBarCode = Ext.create("Ext.grid.Panel", {
 autoScroll: true,
 store: storeGridBarCode,
 columns: [{...} ],
 plugins: [rowEditing],
 bbar: new Ext.PagingToolbar({ store: storeGridBarCode, displayInfo: true, displayMsg: 'Showing  {0} - {1} of {2}'}),
 dockedItems: [ 
  { xtype: 'toolbar', items: [ 
   { text: 'Add', handler: function () { storeGridBarCode.insert(0, new BarCode()); rowEditing.startEdit(0, 0);  }},
  '-',
   { itemId: 'delete', text: 'Delete', disabled: true, handler: function () { var selection = PanelGridBarCode.getView().getSelectionModel().getSelection()[0]; if (selection) { storeGridBarCode.remove(selection); } } }
  ]
 }
 ]
});
PanelGridBarCode.getSelectionModel().on('selectionchange', function (selModel, selections) { PanelGridBarCode.down('#delete').setDisabled(selections.length === 0); });
//Сохранение:
storeGridBarCode.getProxy().url = "Handlers/..."; //Меняем УРЛ
//Параметры Шапки
store.proxy.extraParams.ParamTextField01 = "XXX01";
store.proxy.extraParams.ParamTextField02 = "XXX02";
storeGridBarCode.sync({ ... });
Под 4.0.7 - отсылаются на Сервер все данные сразу, кроме приёма клиентом ответа с сервера ((( 
Под 4.1.0 - есть приём клиентом ответа с сервера, но отсылаются на Сервер данные по частям (((
 
4.1.0:
 
<script type="text/javascript" src='http://dev.sencha.com/deploy/ext-4.1.0-gpl/ext-all.js'></script>
<link rel="stylesheet" href="http://dev.sencha.com/deploy/ext-4.1.0-gpl/resources/css/ext-all.css" />
			 Последний раз редактировалось potkin, 07.07.2012 в 17:40.
 |  |  
	| 
		
	| 
			
			 
			
				08.07.2012, 00:43
			
			
			
		 |  
	| 
		
			|  | Профессор       |  | 
					Регистрация: 19.12.2009 
						Сообщений: 164
					 
		
 |  |  
	| 
	
 
	| Сообщение от potkin   |  
	| 
Сохраняя грид, передаю "за компанию" и параметры
	
 
	| Сообщение от Ex_Soft   |  
	| как-то не стыкуются (ведь, насколько я понял, вы хотите скрестить ужа и ежа, сиречь - Ext.form.Panel и Ext.grid.Panel)... |  
	
 |  
	
 Я так подозреваю - имеет место ошибка коммуникации. Подразумевалось, что Ext.form.Panel должна знать о Ext.grid.Panel (или наоборот) и, соответственно, взаимодействовать с ней со всеми вытекающими...
 
	
 
	| Сообщение от potkin   |  
	| Под 4.0.7 - отсылаются на Сервер все данные сразу |  
	
 Вот Вам дрозофила 
Ext.onReady(function() {
	if(window.console && console.clear)
		console.clear();
	if(window.console && console.log)
		console.log("core: %s, extjs: %s", Ext.versions.core.version, Ext.versions.extjs.version);
	var
		extraParamField = Ext.create("Ext.form.field.Text", {
			value: "extraParamValue"
		}),
		store = Ext.create("Ext.data.Store", {
			fields: [
				{ name: "id", type: "int" },
				"name"
			],
			proxy: {
				type: "ajax",
				url: "handler.ashx"
			},
			listeners: {
				beforesync: function(options, eOpts) {
					this.getProxy().extraParams = {
						extraParamValue: extraParamField.getValue()
					};
				}
			},
			data: [
				{ id: 1, name: "Record# 1" },
				{ id: 2, name: "Record# 2" },
				{ id: 3, name: "Record# 3" },
				{ id: 4, name: "Record# 4" }
			]
		}),
		grid = Ext.create("Ext.grid.Panel", {
			store: store,
			columns: [
				{ dataIndex: "id", header: "id", editor: { xtype: "numberfield" }, flex: 1 },
				{ dataIndex: "name", header: "name", editor: { xtype: "textfield" }, flex: 1 }
			],
			plugins: [
				Ext.create("Ext.grid.plugin.CellEditing", {
					clicksToEdit: 2
				})
			],
			tbar: [{
				text: "Add",
				handler: function(btn, e) {
					store.add(Ext.create(store.getProxy().getModel(), { name: "blah-blah-blah" }));
				}
			}, {
				text: "Del",
				handler: function(btn, e) {
					var
						grid,
						sm,
						sel;
					if(!(grid=btn.up("grid"))
						|| !(sm=grid.getSelectionModel())
						|| !(sel=sm.selected)
						|| !sm.hasSelection())
						return;
					store.remove(sel.items);
				}
			}, {
				text: "Save",
				handler: function(btn, t) {
					store.sync();
				}
			},
				extraParamField
			],
			renderTo: Ext.getBody()
		});
});
Удаляем + редактируем + добавляем, а затем - сохраняем. В Firebug'е видим - 3 (три) запроса. Что я делаю не так?
				__________________"Helo, word!" - 17 errors 56 warnings
 			 Последний раз редактировалось Ex_Soft, 08.07.2012 в 00:54.
 |  |  |  |