Фильтрация данных с помощью ajaxObservefield

Я пытался реализовать фильтрацию данных (список основан на выбранной категории), используя раскрывающийся список с полем наблюдения и разбиением на страницы ajax. Я использую сеанс, чтобы запомнить выбранную категорию, чтобы сохранить нумерацию страниц.

Вот мой код (Cakephp 1.2)

С учетом :

echo $form->select('Category.id', $categories, null, array('id' => 'categories'),'Filter by Categories')
echo $ajax->observeField('categories' ,array('url' =>'update_category','update' => 'collectionDiv'));

В контроллере:

if(!empty($this->data['Category']['id'])) 
{ 
    $cat_id=$this->data['Category']['id'];
    $filters=array('Collection.category_id' => $cat_id); 
    $this->set('collections', $this->paginate('Collection', $filters));
    $this->Session->write($this->name.'.$cat_id', $category_id);
}
else
{
    $cat_id=$this->Session->read($this->name.'.cat_id');
    $filters=array('Collection.category_id' => $cat_id);
    $this->set('collections', $this->paginate('Collection'));
}

Фильтр работает так, как я хотел, но проблема в том, что когда я выбираю пустое значение («Фильтровать по категории»), он все еще помнит последний сеанс категории, поэтому я не могу вернуться к списку по умолчанию (все записи без фильтра).

Я пытался сделать некоторые условия, но до сих пор не удалось. Есть ли другой способ? Пожалуйста, я ценю вашу помощь. благодарить

гермаван


person hermawan    schedule 30.10.2010    source источник


Ответы (2)


Возможно, я не понимаю вопроса, но мне кажется, что его стоит изменить:

else
{
    $cat_id=$this->Session->read($this->name.'.cat_id');
    $filters=array('Collection.category_id' => $cat_id);
    $this->set('collections', $this->paginate('Collection'));
}

to:

else
{
    $this->set('collections', $this->paginate('Collection',array()));
}

По сути, ваш код все равно делает это. Проверьте, какой URL-адрес находится в верхней части окна браузера после его возврата. Содержит ли он все еще директивы разбиения на страницы из предыдущего запроса?

Вы можете просмотреть http://book.cakephp.org/view/167/AJAX-Pagination и убедитесь, что вы «отметили все поля».

person Leo    schedule 31.10.2010
comment
спасибо за ответ. Я пробовал ваш совет, но все еще не работает. Допустим, я выбираю «Категорию живописи», затем DIV меняет содержимое по своему усмотрению, но если щелкнуть номер страницы, DIV будет содержать все данные, а не только «Категорию живописи». - person hermawan; 31.10.2010
comment
Мне кажется, что нумерация страниц ajax настроена неправильно, хотя я начинаю думать, что это может быть ограничением нумерации страниц. Я помню, что у меня была аналогичная проблема, когда я изменил исходный запрос таким образом - он не выполняется на последующих страницах. Я решил это, написав собственный метод разбиения на страницы для соответствующей модели. Пагинация хороша для обработки запроса, разбиения на страницы и сортировки результатов по столбцам. Помимо этого, ему нужна помощь. - person Leo; 31.10.2010
comment
Спасибо Лео, нумерация страниц настроена правильно. Проблема в том, что мы должны различать, откуда находится запрос? Когда поле наблюдения ajax проверяет идентификатор категории, но при разбиении на страницы Ajax он должен помнить категорию. Я наблюдаю, когда ajax приходит из разбивки на страницы, $this-›passedArgs возвращает номер страницы, но пустой, когда запускается AjaxObservedFiled. Я объясняю свое решение. Спасибо, что поделились - person hermawan; 01.11.2010

Я получил это, теперь это работает, как я надеюсь. Я сам объясняю условие и решение. Когда я выбираю категорию из поля со списком, она отображает страницу с кодом:

If ($this->data['Category']['id']) {
  $cat_id=$this->data['Category']['id'];
  $this->Session->write($this->name.'.category_id', $category_id);
  // I will use this session next when I click page number
  $filters=array('Collection.art_type_id' => $category_id); 
  $this->set('collections', $this->paginate('Collection', $filters));

}else{
//if clik page number, next or whatever, $this->data['Category']['id'] will empty so 
// use session to remember the category so the page will display next page or prev 
// page with the proper category, But the problem is, when I set category fillter to
// "All Category" it will dislpay last category taked from the session. To prevent it 
// I used $this->passedArgs['page']. When I clik the page paginator it will return 
// current number page, but it will be empty if we click dropdown. 

    if (!empty($this->passedArgs['page']) {
       $cat_id=$this->Session->read($this->name.'.category_id');
       $filters=array('Collection.category_id' => $cat_id);
       $this->set('collections', $this->paginate('Collection',$filters));
    }else{
       $this->set('collections', $this->paginate('Collection'));
  }
}

В этом случае я думаю, что поле наблюдения не будет отправлять переданный аргумент, поскольку мы получаем из URL-адреса, такого как ссылка ajax или ссылка html->. Я надеюсь, что это будет полезно для всех

person hermawan    schedule 01.11.2010