Отправка данных формы, получение в ответ данных в сторедж
ExtJS 4.0.x
Есть окно, в нем форма (несколько полей: два date и 8 checkbox-ов), докированная к гриду. Грид связан с стореджем (ajax/php/mysql). Форма по замыслу должна играть роль фильтра: модифицировать запрос к стореджу и загружать отобранные по условию данные в грид. Вопрос. Как это сделать ? Форма отправляет значения полей, но ее функция в success принимает только примитивные ответы от сценария и не дает возможность модифицировать запрос к стореджу. Сторедж умеет только загружать данные. Нечто похожее умеет делать компонент пейджинга для грида - он отправляет начальную позицию выборки и ее длину. Как быть ? |
Если корректно понял вопрос - то по сабмиту формы нужно будет обновлять грид...
Делается это так: //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??? |
Нет, к сожалению задача стоит немного не так.
Представьте, что грид отображает некоторые данные, в моем случае это логи системы одного вебприложения. Логи должны фильтроваться по дате и по коду. Дата указывается двумя дейтфилдами, код - набором чекбоксов. В зависимости от настроек должен формироваться соотв. запрос к стореджу, чтобы вытащить из таблицы БД нужную выборку. |
Если нужна фильтрация данных на сервере то задайте:
remoteFilter: trueзатем выполните store.filter("email", /\.com$/);Ну я думаю, что смысл параметров метода filter() Вы посмотрите в документации. Если, что не так написал, то извините. С 4-й версией еще не разбирался толком. Точнее мог бы описать для 3-й версии. |
Цитата:
А мне нужно, чтобы на сервер отправлялись настройки фильтра выборки и в ответ серверный сценарий возвращал нужный массив данных. В логах могут быть многие тысячи записей, а правильным образом настроив SQL запрос нужно вернуть всего лишь несколько десятков строк, неразумно тащить всю таблицу логов чтобы фильтровать ее на стороне клиента. Еще раз повторю задачу. Есть окно, в нем отображается грид. Грид отображает строки логов вебприложения. Вверху грида есть настройки фильтра: два дэйтбокса (позволяют выбрать временной интервал) и десяток чекбоксов фильтрации логов по типу события. При нажатии на кнопку обновления на сервер должен отсылаться запрос, параметрами которого будут настройки фильтра. В ответ серверный сценарий должен вернуть в сторедж грида выборку данных, сторедж должен сделать релоад. |
Цитата:
В любом случае, для выполнения вашей задачи необходимо подменять параметры которые передаются в метод load() класса store, а затем используя этот новый набор параметров модифицировать свой запрос на сервере, который и будет вам возвращать новый, отфильтрованный набора данных. В третьей версии я такую задачу выполняю меняя значения baseParams. В четвертой точно не знаю. Но судя по исходникам ExtJS, вариант, который я описал в предыдущем топике, должен работать. |
Извиняюсь за длительную задержку, отдыхал от трудов тяжких :-)
Да, действительно, при включении remoteFilter на сервер идет строка в JSON виде в поле filter (типа filter:[{"property":"log_type","value":"5"}]), которую затем нужно будет разбирать (в моем случае с PHP - json_decode в соотв. массив). А есть способ ЕЩЕ проще это делать ? Чтобы параметр передавался в сценарий простым полем "а-ля форма" в GET запросе по аналогии с параметрами page, start и limit, отсылаемыми гридом для пейджинга ? Чтобы не засорять код ненужными ф-циями декодирования параметров... Хотя конечно при множественном фильтре оно самое то - в одной строке передаются все флаги одним махом. |
Обнаружил не то баг, не то фичу удаленной фильтрации:
http://www.sencha.com/forum/showthre...765#post639765 Вкратце: если к созданному стореджу несколько раз применять вызов его метода filter(), то старый фильтр не затирается, а "добавляется" к новому. Метод clearFilter() лечит проблему, но порождает лишний нефильтрованный запрос, что вкупе с большим возможным количеством нефильтрованных данных может ввести в ступор приложение... |
Часовой пояс GMT +3, время: 21:32. |