Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   editorGridPanel, метод save() и ответ с сервера (https://javascript.ru/forum/extjs/49476-editorgridpanel-metod-save-i-otvet-s-servera.html)

maksimka2112 14.08.2014 18:34

editorGridPanel, метод save() и ответ с сервера
 
ИСПОЛЬЗУЮ EXT 3

Задаю ридер:
var leftReader = new Ext.data.JsonReader({
    root: 'dan',
    totalProperty: 'total'
	}, [
            {name: 'x80402'},
            {name: 'x375'},
	    {name: 'p70402'},
            {name: 'ch23'}
	]
);


Задаю сторе:
var wr=new Ext.data.JsonWriter
({
    encode: true,
    writeAllFields: true
});

var lStore = new Ext.data.Store({
    autoDestroy: true,
    autoSave: false,
    successProperty: true,
    proxy: new Ext.data.HttpProxy({url: 'phps/mm160c07_t.php'}),
    baseParams: {c155: c155, priznak: 'left'},
    reader: leftReader,
    writer: wr,
    sortInfo:{field: 'x80402', direction: "ASC"},
    autoLoad: true,
    batchSave: true // ДЛЯ ЧЕГО ЭТА КОМАНДА????
});


Задаю чекбоксы:

var checkboxLeft = new Ext.grid.CheckboxSelectionModel({
    singleSelect: false
});


Далее модель колонок, многие из которых можно редактировать:
var leftCm = new Ext.grid.ColumnModel({
    defaults: {
        sortable: true, menuDisabled: false,
	align: 'center'
    },
    columns: [
        checkboxLeft,
        {header: "№ п/п ",  dataIndex: 'x80402', sortable: true, width: 45},
	{header: "Должность", dataIndex: 'ch23', sortable: true, width: 200},
	{header: "Фамилия И.О.", dataIndex: 'p70402', sortable: true, width: 200,
        editor:  new fm.ComboBox({
                name: 'c07p70402',
                fieldLabel: 'ФИО',
                store: mainStorec07,
                displayField: 'p70402',
                typeAhead: false,
                loadingText: 'Поиск...',
                emptyText: 'Введите ФИО',
                minChars: 3,
                anchor: '95%',
                pageSize: 5,
                triggerAction: 'all',
                hideTrigger: true,
                tpl: movieTpl,
                itemSelector: 'div.movie-item',
                onSelect: function(record){
                    this.setValue(record.data.getFio);

                    var zam=Ext.getCmp('id_leftgrid').selModel.getSelections()

                    var myst = Ext.getCmp('id_leftgrid').getStore();
                        var zzz=myst.getCount();
                        for (var zil=0; zil<zzz; zil++){
                            zInd=myst.find('ch23',myst.data.items[zil].data.ch23,0,false,false);
                            row = myst.getAt(zInd).data;
                            row.ch23=record.data.x745;
                        }

                    this.collapse();
                }
                })
        },
	{header: "Дата подписи", dataIndex: 'x375', sortable: true, width: 100,
        renderer: getDateFont,
        editor: new fm.DateField({
                allowBlank: true, type: 'date',format: 'd.m.Y'
                })
        }
    ]
});


Непосредственно сам грид:
var leftGrid = new Ext.grid.EditorGridPanel({
    id: 'id_leftgrid',
    store: lStore,
    enableHdMenu: false,
    height: 190,
    autoWidth: true,
    cm: leftCm,
    sm: checkboxLeft,
    clicksToEdit: '1'
});


И привожу код кнопки, по клику на которую сохраняю:
id: 'c07Save',
            xtype: 'tbbutton',
            text: '<b>Cохранить</b>',
            handler: function(sm){
                leftGrid.store.save({
                    listeners: { beforesave: {fn: function(){
                        alert(9999);
			var success=Ext.util.JSON.decode(resp.responseText).success;
			var message=Ext.util.JSON.decode(resp.responseText).message;
			if (success){
			    Ext.Msg.alert('С О О Б Щ Е Н И Е ',message);
			    }else Ext.Msg.alert('О Ш И Б К А',message);
		    }
                    }}
                    }); 
            }

С сервера приходит ответ - success и message - я их сам формирую. Вопрос в том - как мне ответ поймать?? listeners не работает! Как же получить ответ с сервера об удачном сохранении?

И второй вопрос - как передать для сохранения строки ТОЛЬКО отмеченные чекбоксами? При этом используя leftGrid.store.save() ????

maksimka2112 22.08.2014 20:37

Может не стоило так подробно расписывать?

siber-biber 26.08.2014 14:58

Цитата:

Сообщение от maksimka2112 (Сообщение 327142)
Может не стоило так подробно расписывать?

тут дело не в этом.. концентрация "нечитания" доки у вас запредельная. ))
в метод save параметры не передаются: http://docs.sencha.com/extjs/3.4.0/#...re-method-save, а вы туда лиснеры какието суёте.
в доке по методу еще и написано какие ивенты он поднимает.
например этот перед сохранением данных: http://docs.sencha.com/extjs/3.4.0/#...ent-beforesave

хотите лиснеры установите их на стор:
var lStore = new Ext.data.Store({
    ...
    listeners : {
        beforesave: function (store, data) {
            ...
        }
    }
})
и делайте с данными перед отправкой что хотите

maksimka2112 26.08.2014 19:34

Цитата:

Сообщение от siber-biber (Сообщение 327572)
и делайте с данными перед отправкой что хотите

Спасибо! Доку читаю, стараюсь читать. Просто на эксте у меня можно сказать первый проект.

Так мне надо ни перед отправкой! А после отправки получить ответ, что данные успешно сохранились! А почему листенерс пытался засунуть ни в сторе, так всё потому, что есть стандартная возможность у editorGridPanel - grid.store.save() - отправляет отредактированные данные на сервер,указанный в прокси... Мне ли вам объяснять - вы наверняка лучше меня про это знаете. Так потому и спрашиваю, что сам я не знаю как распознать в ексте ответ, после вызова grid.store.save(). Объект данных отправляется отлично, а вот в ответ ничего не приходит, поэтому не могу понять, когда на сервере insert закончился. Да и как назло ассинхронность в false в ext 3 поставить нельзя....в общем беда, очень жду помощи!

siber-biber 27.08.2014 10:20

Цитата:

Сообщение от maksimka2112
Так мне надо ни перед отправкой

это я к тому что вы хотели не все данные на сервер отправлять..

есть еще события на сторе которые поднимаются при ответе сервера (все они есть в доке):
http://docs.sencha.com/extjs/3.4.0/#...ore-event-save
http://docs.sencha.com/extjs/3.4.0/#...re-event-write
поставьте на них лиснеры, в них пропишите debugger, посмотрите в отладчике что приходит в аргументах и выберите какое из них вам подходит лучше.

maksimka2112 27.08.2014 20:10

Цитата:

Сообщение от siber-biber (Сообщение 327690)
это я к тому что вы хотели не все данные на сервер отправлять..

есть еще события на сторе которые поднимаются при ответе сервера (все они есть в доке):
http://docs.sencha.com/extjs/3.4.0/#...ore-event-save
http://docs.sencha.com/extjs/3.4.0/#...re-event-write
поставьте на них лиснеры, в них пропишите debugger, посмотрите в отладчике что приходит в аргументах и выберите какое из них вам подходит лучше.

Спасибо, что-то наподобие я и ищу. Что-то вроде:
Fires if the server returns 200 after an Ext.data.Api.actions CRUD action. ...
Fires if the server returns 200 after an Ext.data.Api.actions CRUD action. Success of the action is determined in the result['successProperty']property (NOTE for RESTful stores, a simple 20x response is sufficient for the actions "destroy" and "update". The "create" action should should return 200 along with a database pk).

Вот этот ответ 200 - как бы его вытащить? Может из rs - типа response. Хм...завтра будет над чем подумать. Вечером завтра отпишусь о результатах.

Ну не хочется мне отказываться от такой классной вещи как save() !!! Удобно приходят данные и возиться с отправкой не надо

maksimka2112 28.08.2014 18:29

Сделал примерно так:

Ext.getCmp('id_leftgrid').store.save();
		    Ext.getCmp('id_leftgrid').store.commitChanges();
		    lStore.on('save', function(){
		    my_after_function();
		    })


Если нужен ответ с сервера, то можно вот так:

Ext.getCmp('id_leftgrid').store.save();
		    Ext.getCmp('id_leftgrid').store.commitChanges();
		    lStore.on('exception', function(response){
		        alert(response.responseText);
		    })

Может кому и пригодится :) Спасибо за помощь!


Часовой пояс GMT +3, время: 06:33.