Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 09.05.2012, 16:21
Профессор
Отправить личное сообщение для potkin Посмотреть профиль Найти все сообщения от potkin
 
Регистрация: 23.08.2008
Сообщений: 162

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-а дня, много экспериментировал, да и там есть лишнее, поэтому не судите строго ...

Последний раз редактировалось potkin, 09.05.2012 в 17:23.
Ответить с цитированием
  #2 (permalink)  
Старый 09.05.2012, 21:26
Профессор
Отправить личное сообщение для DjDiablo Посмотреть профиль Найти все сообщения от DjDiablo
 
Регистрация: 04.02.2011
Сообщений: 1,815

_dc - передаётся в get, и используется при кешировании.
Я так понимаю вы ищете свои данные в get, вы их там конечно же не найдёте.
Для передачи данных на сервер используется либо PUT либо POST запрос.

Примеры на php
put
var_dump(file_get_contents('php://input'));
post
print_r($_POST);
__________________
Лучше калымить в гандурасе чем гандурасить на колыме

Последний раз редактировалось DjDiablo, 09.05.2012 в 22:19.
Ответить с цитированием
  #3 (permalink)  
Старый 09.05.2012, 23:12
Профессор
Отправить личное сообщение для potkin Посмотреть профиль Найти все сообщения от potkin
 
Регистрация: 23.08.2008
Сообщений: 162

DjDiablo,
Юзаю ASP.NET, который при приёмй данных, показывает метод:
context.Request.HttpMethod = POST
Принимаю на сервере так:
string upID = context.Request.QueryString["upID"]; //ID-пользователя.

Цитата:
Для передачи данных на сервер используется либо PUT либо POST запрос.
То есть я неправильно указал, что-то в Хранилище Грида ExtJS-а ???
Подскажите, пожалуйста как поменять в ExtJS метод передачи данных на Сервер, а то у меня только:
...
type: 'rest',
//или
type: 'ajax',


П.С. Кстати, смотрел на Сервере в параметрах "Request-а" есть ещё 63 параметра:
1) _dc
2) __utmz
3) __utma
4) ...
n) ALL_HTTP
...
Может какой-то из этих параметров содержит нужные данные ???
Ответить с цитированием
  #4 (permalink)  
Старый 10.05.2012, 12:06
Аватар для Ex_Soft
Профессор
Отправить личное сообщение для Ex_Soft Посмотреть профиль Найти все сообщения от Ex_Soft
 
Регистрация: 19.12.2009
Сообщений: 164

Сообщение от DjDiablo Посмотреть сообщение
Примеры на php
put
var_dump(file_get_contents('php://input'));
post
print_r($_POST);
Для ASP.NET
put
request.InputStream.Seek(0, SeekOrigin.Begin);
var streamReader = new StreamReader(request.InputStream, Encoding.UTF8);
result = streamReader.ReadToEnd().Trim();

post
context.Request.Form
__________________
"Helo, word!" - 17 errors 56 warnings
Ответить с цитированием
  #5 (permalink)  
Старый 10.05.2012, 15:33
Профессор
Отправить личное сообщение для potkin Посмотреть профиль Найти все сообщения от potkin
 
Регистрация: 23.08.2008
Сообщений: 162

DjDiablo,
Ex_Soft,
Цитата:
put
Спасибо большое !!
Всё работает
А такой вопросик:
на сервер приходят все отображённые в Гриде данные (все 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();
Ответить с цитированием
  #6 (permalink)  
Старый 10.05.2012, 16:35
Аватар для Ex_Soft
Профессор
Отправить личное сообщение для Ex_Soft Посмотреть профиль Найти все сообщения от Ex_Soft
 
Регистрация: 19.12.2009
Сообщений: 164

Сообщение от potkin Посмотреть сообщение
А такой вопросик:
на сервер приходят все отображённые в Гриде данные (все Rows), а не только та строка которую я изменил.
Так и должно быть ???
Или можно получить только изменённую строку ???
Странно это... У меня отправляются только измененные записи... Мало того: writeAllFields=false - передает только изменненные поля...
__________________
"Helo, word!" - 17 errors 56 warnings
Ответить с цитированием
  #7 (permalink)  
Старый 17.07.2012, 13:44
Новичок на форуме
Отправить личное сообщение для darrios Посмотреть профиль Найти все сообщения от darrios
 
Регистрация: 28.04.2011
Сообщений: 1

А как вы узнаете что сервер получает?
Как можно это вывести (например алертом)?
Не знаю в каком виде данные попадают на сервер...

$array = json_decode($_POST);
$id= $array['data']['id'];


Просьба помочь
Ответить с цитированием
  #8 (permalink)  
Старый 07.01.2013, 22:18
Новичок на форуме
Отправить личное сообщение для TinK Посмотреть профиль Найти все сообщения от TinK
 
Регистрация: 25.12.2012
Сообщений: 4

Сообщение от darrios Посмотреть сообщение
А как вы узнаете что сервер получает?
Как можно это вывести (например алертом)?
Не знаю в каком виде данные попадают на сервер...

$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 Method:POST
Status Code:200 OK
Query String Parameters:
 _dc:1357565811429
Request Payload:
 {"items":{"id":5}}

Request URL:http://localhost/service/update/news.php?_dc=1357566047052
Request Method:POST
Status Code:200 OK
Query String Parameters:
 _dc:1357566047052
Request Payload:
 {"items":{"datepubl":"2012-12-01T00:00:00","title":"the Update Plan","alias":"the-update-plan","new":"<p>small text new</p>","newfull":"<p>full text new</p>","id":4}}

Request URL:http://localhost/service/create/news.php?_dc=1357566179903
Request Method:POST
Status Code:200 OK
Query String Parameters:
 _dc:1357566179903
Request Payload:
 {"items":{"id":0,"datepubl":null,"dateclose":null,"title":"the NEW new","alias":"the-new-new","new":"text the NEW new","newfull":""}}

Но как принять данные которые браузер обзывает Request Payload не имею ни малейшего понятия...

Последний раз редактировалось TinK, 07.01.2013 в 22:22. Причина: разметка
Ответить с цитированием
  #9 (permalink)  
Старый 09.01.2013, 16:36
Аватар для Ex_Soft
Профессор
Отправить личное сообщение для Ex_Soft Посмотреть профиль Найти все сообщения от Ex_Soft
 
Регистрация: 19.12.2009
Сообщений: 164

Сообщение от TinK Посмотреть сообщение
Но как принять данные которые браузер обзывает Request Payload не имею ни малейшего понятия...
тынць?
__________________
"Helo, word!" - 17 errors 56 warnings
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
GridPanel с загрузкой данных из JsonStore lastalert ExtJS 1 08.06.2011 12:46
Сохранение данных для передачи с одной страницы в другую Andrey Freeman Общие вопросы Javascript 6 15.09.2008 22:32
Сохранение данных в файл Autosof Общие вопросы Javascript 1 28.08.2008 09:23
Сохранение данных на стороне клиента средствами Javascript baal1988 Events/DOM/Window 4 24.08.2008 21:32