GridPanel и сохранение изменённых/добавленных данных в БД ???
Добрый День!
Я понимаю, что вопрос с бородой, но прогуглив 2-а дня, так и не смог сохранить изменённую строчку Ext.grid.GridPanel в БД. Поэтому пишу сюда ... Имею Модель, Хранилище и Грид (код ниже). Данные с сервера приходят и отображаются в гриде, а вот сохранить на Сервере в БД никак не получается. При нажатии в гриде на UPDATE - на Сервер в виде параметров приходит только какой-то _dc и всё. А, что бы записать данные в БД, на серваке мне надо получить: 1) id-записи 2) Names - изменённых полей и их новые Values, что бы занести их в БД. То есть что бы сформировать Скул-запрос: UPDATE MyTable SET Names=@Values WHERE id=@id Профи подскажите что надо убрать/добавить/переделать в моём коде: //Модель: Ext.require(['Ext.data.*', 'Ext.grid.*']); Ext.define('MyDoc', { extend: 'Ext.data.Model', fields: [{ name: 'MyDocID', type: 'int', useNull: true }, 'upID', 'ID_Red', 'MyDocTemaA'], validations: [{ type: 'length', field: 'upID', min: 1 }, { type: 'length', field: 'ID_Red', min: 1 }, { type: 'length', field: 'MyDocTemaA', min: 1 }] }); //Хранилище var storeMyDocs = Ext.create('Ext.data.JsonStore', { //JsonStore - определение хранилища для удаленного источника данных idProperty: 'MyDocID', loadMask: true, autoLoad: true, autoSync: true, // указание на автосохранения в хранилище, при каждом изменении одно записи pageSize: 12, // - количество считываемх за раз записей //fields: [{ name: "MyDocID" }, { name: "upID" }, { name: "ID_Red" }, { name: "MyDocTemaA"}], model: 'MyDoc', proxy: { type: 'rest', //ajax - тип прокси "Ajax" url: "MyDocs.ashx?upID=" + UserID, reader: { type: "json", root: "mydoc" }, writer: { restful: true, type: "json", root: "mydoc" }, timeout: 120000 //2 minutes }, listeners: { load: function (store, records, successful) { if (this.getCount() == 0) { this.sync(); } }, write: function (store, operation) { var record = operation.getRecords()[0], name = Ext.String.capitalize(operation.action), verb; if (name == 'Destroy') { record = operation.records[0]; verb = 'Destroyed'; } else { verb = name + 'd'; } Ext.example.msg(name, Ext.String.format("{0} user: {1}", verb, record.getId())); } } }); //Ну и сам Грид: var gridMyDocs = new Ext.grid.GridPanel({ //id: 'gridMyDocs', region: "center", autoScroll: true, loadMask: true, store: storeMyDocs, columns: [ { text: "№", dataIndex: "MyDocID", width: 100, hidden: true }, { text: "Пользователь", dataIndex: "upID", width: 100, hidden: true }, { text: "id_red", dataIndex: "ID_Red", width: 100, hidden: true }, { text: "Наименование", dataIndex: "MyDocTemaA", sortable: true, resizable: true, flex: 1, editor: { xtype: 'textfield'} }, ], plugins: [ Ext.create('Ext.grid.plugin.RowEditing', { clicksToEdit: 1 }) ], bbar: new Ext.PagingToolbar({ store: storeMyDocs, // указано хранилище displayInfo: true, // вывести инфо обо общем числе записей displayMsg: 'Showing {0} - {1} of {2}' // формат инфо }), listeners: { //Дабл Клик itemdblclick: function (dv, record, item, index, e) { FunPanelShow("-1", "Мои документы: " + record.get('MyDocTemaA'), record.get('ID_Red'), "0"); } } }); П.С. Над кодом, за 2-а дня, много экспериментировал, да и там есть лишнее, поэтому не судите строго ... |
_dc - передаётся в get, и используется при кешировании.
Я так понимаю вы ищете свои данные в get, вы их там конечно же не найдёте. Для передачи данных на сервер используется либо PUT либо POST запрос. Примеры на php put var_dump(file_get_contents('php://input')); post print_r($_POST); |
DjDiablo,
Юзаю ASP.NET, который при приёмй данных, показывает метод: context.Request.HttpMethod = POST Принимаю на сервере так: string upID = context.Request.QueryString["upID"]; //ID-пользователя. Цитата:
Подскажите, пожалуйста как поменять в ExtJS метод передачи данных на Сервер, а то у меня только: ... type: 'rest', //или type: 'ajax', П.С. Кстати, смотрел на Сервере в параметрах "Request-а" есть ещё 63 параметра: 1) _dc 2) __utmz 3) __utma 4) ... n) ALL_HTTP ... Может какой-то из этих параметров содержит нужные данные ??? |
Цитата:
put request.InputStream.Seek(0, SeekOrigin.Begin); var streamReader = new StreamReader(request.InputStream, Encoding.UTF8); result = streamReader.ReadToEnd().Trim(); post context.Request.Form |
DjDiablo,
Ex_Soft, Цитата:
Всё работает :dance: А такой вопросик: на сервер приходят все отображённые в Гриде данные (все Rows), а не только та строка которую я изменил. Так и должно быть ??? Или можно получить только изменённую строку ??? Код Хранилища: var storeMyDocs = Ext.create('Ext.data.JsonStore', { idProperty: 'MyDocID', loadMask: true, autoSync: true, // указание на авто сохранения в хранилище, при каждом изменении одно записи pageSize: 12, // - количество считываемых за раз записей model: 'MyDoc', restful: true, // Это наш волшебный флажок, который заставляет слать запросы на сервер при изменение данных в источнике proxy: { type: 'rest', //ajax - тип прокси "Ajax" url: "MyDocs.ashx?upID=" + UserID, method: 'post', reader: { type: "json", //json root: "mydoc" }, writer: { type: "json", //json encode: false, root: "mydoc" }, timeout: 120000 //2 minutes } }); storeMyDocs.load(); |
Цитата:
|
А как вы узнаете что сервер получает?
Как можно это вывести (например алертом)? Не знаю в каком виде данные попадают на сервер... $array = json_decode($_POST); $id= $array['data']['id']; Просьба помочь :( |
Цитата:
Код:
print_r($_POST); Мне другое интересно - как вообще принять данные на сервере, если Store такой: var storeNews = Ext.create('Ext.data.Store', { autoLoad: true, autoSync: true, idProperty: 'id', remoteFilter: true, fields: [ { name: 'id', type: 'int' }, { name: 'datepubl', type: 'date' }, { name: 'dateclose', type: 'date' }, { name: 'title', type: 'string' }, { name: 'alias', type: 'string' }, { name: 'new', type: 'string' }, { name: 'newtext', type: 'string' } ], proxy: { type: 'ajax', api: { read: 'service/view/news.php', create: 'service/create/news.php', update: 'service/update/news.php', destroy: 'service/destroy/news.php' }, reader: { type: 'json', successProperty: 'success', root: 'data', messageProperty: 'message' }, writer: { type: 'json', writeAllFields: false, root: 'data' }, listeners: { exception: function(proxy, response, operation){ Ext.MessageBox.show({ title: 'REMOTE EXCEPTION', msg: operation.getError(), icon: Ext.MessageBox.ERROR, buttons: Ext.Msg.OK }); } } } }); В браузере вижу что данные передаются: Код:
Request URL:http://localhost/service/destroy/news.php?_dc=1357565811429 Но как принять данные которые браузер обзывает Request Payload не имею ни малейшего понятия... |
Цитата:
|
Часовой пояс GMT +3, время: 22:05. |