Javascript-форум (https://javascript.ru/forum/)
-   ExtJS (https://javascript.ru/forum/extjs/)
-   -   Отправка данных формы, получение в ответ данных в сторедж (https://javascript.ru/forum/extjs/19158-otpravka-dannykh-formy-poluchenie-v-otvet-dannykh-v-storedzh.html)

Allan Stark 27.07.2011 17:37

Отправка данных формы, получение в ответ данных в сторедж
 
ExtJS 4.0.x

Есть окно, в нем форма (несколько полей: два date и 8 checkbox-ов), докированная к гриду.
Грид связан с стореджем (ajax/php/mysql).
Форма по замыслу должна играть роль фильтра: модифицировать запрос к стореджу и загружать отобранные по условию данные в грид.

Вопрос. Как это сделать ?
Форма отправляет значения полей, но ее функция в success принимает только примитивные ответы от сценария и не дает возможность модифицировать запрос к стореджу.
Сторедж умеет только загружать данные.
Нечто похожее умеет делать компонент пейджинга для грида - он отправляет начальную позицию выборки и ее длину.
Как быть ?

Black_Prince 28.07.2011 10:33

Если корректно понял вопрос - то по сабмиту формы нужно будет обновлять грид...

Делается это так:
//form ajax submit
                form.getForm().submit(
                {
                    //function to be executed on answer receipt
                    success: function(f,a)
                    {
                        //reconfiguring grid store
                        store = Ext.create('Ext.data.ArrayStore',
                        {
                            data: a.result.rows,
                            model: 'Calls'
                        });
                        //reconfigurinf grid
                        grid.reconfigure(store);
                    },
                    failure: function(f,a)
                    {
                    }
                })


Ограничение - приходимый ответ должен быть в json формате под соответствующую модель

echo '{success: true, rows:'.$call_info.", total: ".$total[0]['cnt']."}";

Пример модели и приходимого ответа от сервера представлять не буду, по скольку там более 20 колонок получается.

Возможно я не правильно понял вопрос, и надо просто применять фильтры. Тогда может стоит сохранить дату для стореджа, и переконфигурировать сторедж применяя к нему filters???

Allan Stark 29.07.2011 13:29

Нет, к сожалению задача стоит немного не так.

Представьте, что грид отображает некоторые данные, в моем случае это логи системы одного вебприложения.
Логи должны фильтроваться по дате и по коду. Дата указывается двумя дейтфилдами, код - набором чекбоксов.

В зависимости от настроек должен формироваться соотв. запрос к стореджу, чтобы вытащить из таблицы БД нужную выборку.

nikolaich 29.07.2011 20:42

Если нужна фильтрация данных на сервере то задайте:
remoteFilter: true
затем выполните
store.filter("email", /\.com$/);
Ну я думаю, что смысл параметров метода filter() Вы посмотрите в документации.

Если, что не так написал, то извините. С 4-й версией еще не разбирался толком.
Точнее мог бы описать для 3-й версии.

Allan Stark 01.08.2011 23:08

Цитата:

Сообщение от nikolaich (Сообщение 116183)
Если нужна фильтрация данных на сервере то задайте:
remoteFilter: true
затем выполните
store.filter("email", /\.com$/);
Ну я думаю, что смысл параметров метода filter() Вы посмотрите в документации.

Если, что не так написал, то извините. С 4-й версией еще не разбирался толком.
Точнее мог бы описать для 3-й версии.

Я рассматривал эту возможность, но к сожалению данный метод работает только для уже загруженной в сторедж выборки. Т.е. оперирует уже с массивом в памяти.
А мне нужно, чтобы на сервер отправлялись настройки фильтра выборки и в ответ серверный сценарий возвращал нужный массив данных.
В логах могут быть многие тысячи записей, а правильным образом настроив SQL запрос нужно вернуть всего лишь несколько десятков строк, неразумно тащить всю таблицу логов чтобы фильтровать ее на стороне клиента.

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

nikolaich 02.08.2011 10:21

Цитата:

Сообщение от Allan Stark (Сообщение 116708)
Я рассматривал эту возможность, но к сожалению данный метод работает только для уже загруженной в сторедж выборки. Т.е. оперирует уже с массивом в памяти.
А мне нужно, чтобы на сервер отправлялись настройки фильтра выборки и в ответ серверный сценарий возвращал нужный массив данных.

И что с remoteFilter: true, тоже не работает? Я смотрел исходники ExtJS, должно работать.

В любом случае, для выполнения вашей задачи необходимо подменять параметры которые передаются в метод load() класса store, а затем используя этот новый набор параметров модифицировать свой запрос на сервере, который и будет вам возвращать новый, отфильтрованный набора данных. В третьей версии я такую задачу выполняю меняя значения baseParams. В четвертой точно не знаю. Но судя по исходникам ExtJS, вариант, который я описал в предыдущем топике, должен работать.

Allan Stark 22.08.2011 13:59

Извиняюсь за длительную задержку, отдыхал от трудов тяжких :-)

Да, действительно, при включении remoteFilter на сервер идет строка в JSON виде в поле filter (типа filter:[{"property":"log_type","value":"5"}]), которую затем нужно будет разбирать (в моем случае с PHP - json_decode в соотв. массив).

А есть способ ЕЩЕ проще это делать ? Чтобы параметр передавался в сценарий простым полем "а-ля форма" в GET запросе по аналогии с параметрами page, start и limit, отсылаемыми гридом для пейджинга ?

Чтобы не засорять код ненужными ф-циями декодирования параметров...

Хотя конечно при множественном фильтре оно самое то - в одной строке передаются все флаги одним махом.

Allan Stark 22.08.2011 16:08

Обнаружил не то баг, не то фичу удаленной фильтрации:
http://www.sencha.com/forum/showthre...765#post639765

Вкратце: если к созданному стореджу несколько раз применять вызов его метода filter(), то старый фильтр не затирается, а "добавляется" к новому. Метод clearFilter() лечит проблему, но порождает лишний нефильтрованный запрос, что вкупе с большим возможным количеством нефильтрованных данных может ввести в ступор приложение...


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