27.07.2011, 17:37
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Отправка данных формы, получение в ответ данных в сторедж
ExtJS 4.0.x
Есть окно, в нем форма (несколько полей: два date и 8 checkbox-ов), докированная к гриду.
Грид связан с стореджем (ajax/php/mysql).
Форма по замыслу должна играть роль фильтра: модифицировать запрос к стореджу и загружать отобранные по условию данные в грид.
Вопрос. Как это сделать ?
Форма отправляет значения полей, но ее функция в success принимает только примитивные ответы от сценария и не дает возможность модифицировать запрос к стореджу.
Сторедж умеет только загружать данные.
Нечто похожее умеет делать компонент пейджинга для грида - он отправляет начальную позицию выборки и ее длину.
Как быть ?
Последний раз редактировалось Allan Stark, 27.07.2011 в 17:40.
|
|
28.07.2011, 10:33
|
Аспирант
|
|
Регистрация: 11.07.2011
Сообщений: 64
|
|
Если корректно понял вопрос - то по сабмиту формы нужно будет обновлять грид...
Делается это так:
//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???
|
|
29.07.2011, 13:29
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Нет, к сожалению задача стоит немного не так.
Представьте, что грид отображает некоторые данные, в моем случае это логи системы одного вебприложения.
Логи должны фильтроваться по дате и по коду. Дата указывается двумя дейтфилдами, код - набором чекбоксов.
В зависимости от настроек должен формироваться соотв. запрос к стореджу, чтобы вытащить из таблицы БД нужную выборку.
|
|
29.07.2011, 20:42
|
Аспирант
|
|
Регистрация: 16.03.2009
Сообщений: 33
|
|
Если нужна фильтрация данных на сервере то задайте:
remoteFilter: true
затем выполните
store.filter("email", /\.com$/);
Ну я думаю, что смысл параметров метода filter() Вы посмотрите в документации.
Если, что не так написал, то извините. С 4-й версией еще не разбирался толком.
Точнее мог бы описать для 3-й версии.
|
|
01.08.2011, 23:08
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Сообщение от nikolaich
|
Если нужна фильтрация данных на сервере то задайте:
remoteFilter: true
затем выполните
store.filter("email", /\.com$/);
Ну я думаю, что смысл параметров метода filter() Вы посмотрите в документации.
Если, что не так написал, то извините. С 4-й версией еще не разбирался толком.
Точнее мог бы описать для 3-й версии.
|
Я рассматривал эту возможность, но к сожалению данный метод работает только для уже загруженной в сторедж выборки. Т.е. оперирует уже с массивом в памяти.
А мне нужно, чтобы на сервер отправлялись настройки фильтра выборки и в ответ серверный сценарий возвращал нужный массив данных.
В логах могут быть многие тысячи записей, а правильным образом настроив SQL запрос нужно вернуть всего лишь несколько десятков строк, неразумно тащить всю таблицу логов чтобы фильтровать ее на стороне клиента.
Еще раз повторю задачу.
Есть окно, в нем отображается грид. Грид отображает строки логов вебприложения.
Вверху грида есть настройки фильтра: два дэйтбокса (позволяют выбрать временной интервал) и десяток чекбоксов фильтрации логов по типу события.
При нажатии на кнопку обновления на сервер должен отсылаться запрос, параметрами которого будут настройки фильтра. В ответ серверный сценарий должен вернуть в сторедж грида выборку данных, сторедж должен сделать релоад.
Последний раз редактировалось Allan Stark, 01.08.2011 в 23:12.
|
|
02.08.2011, 10:21
|
Аспирант
|
|
Регистрация: 16.03.2009
Сообщений: 33
|
|
Сообщение от Allan Stark
|
Я рассматривал эту возможность, но к сожалению данный метод работает только для уже загруженной в сторедж выборки. Т.е. оперирует уже с массивом в памяти.
А мне нужно, чтобы на сервер отправлялись настройки фильтра выборки и в ответ серверный сценарий возвращал нужный массив данных.
|
И что с remoteFilter: true, тоже не работает? Я смотрел исходники ExtJS, должно работать.
В любом случае, для выполнения вашей задачи необходимо подменять параметры которые передаются в метод load() класса store, а затем используя этот новый набор параметров модифицировать свой запрос на сервере, который и будет вам возвращать новый, отфильтрованный набора данных. В третьей версии я такую задачу выполняю меняя значения baseParams. В четвертой точно не знаю. Но судя по исходникам ExtJS, вариант, который я описал в предыдущем топике, должен работать.
|
|
22.08.2011, 13:59
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Извиняюсь за длительную задержку, отдыхал от трудов тяжких :-)
Да, действительно, при включении remoteFilter на сервер идет строка в JSON виде в поле filter (типа filter:[{"property":"log_type","value":"5"}]), которую затем нужно будет разбирать (в моем случае с PHP - json_decode в соотв. массив).
А есть способ ЕЩЕ проще это делать ? Чтобы параметр передавался в сценарий простым полем "а-ля форма" в GET запросе по аналогии с параметрами page, start и limit, отсылаемыми гридом для пейджинга ?
Чтобы не засорять код ненужными ф-циями декодирования параметров...
Хотя конечно при множественном фильтре оно самое то - в одной строке передаются все флаги одним махом.
Последний раз редактировалось Allan Stark, 22.08.2011 в 14:01.
|
|
22.08.2011, 16:08
|
Аспирант
|
|
Регистрация: 24.04.2010
Сообщений: 87
|
|
Обнаружил не то баг, не то фичу удаленной фильтрации:
http://www.sencha.com/forum/showthre...765#post639765
Вкратце: если к созданному стореджу несколько раз применять вызов его метода filter(), то старый фильтр не затирается, а "добавляется" к новому. Метод clearFilter() лечит проблему, но порождает лишний нефильтрованный запрос, что вкупе с большим возможным количеством нефильтрованных данных может ввести в ступор приложение...
|
|
|
|