使用ajax observefield过滤数据

时间:2010-10-30 12:05:29

标签: cakephp cakephp-1.2

我尝试使用observefield和ajax分页下拉列表来实现过滤数据(基于所选类别的列表)。我使用session来记住所选类别以保持分页。

这是我的代码(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'));
}

过滤器按我的意思工作,但问题是当我选择空值('按类别过滤)时,它仍记得上次类别会话,所以我无法回到默认列表(没有过滤器的所有记录列表)。

我试图做出一些条件,但仍然没有成功。还有另外一种方法吗?我感谢你的帮助。感谢

埃尔马瓦恩

2 个答案:

答案 0 :(得分:0)

也许我不明白这个问题,但在我看来它可能值得改变:

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

为:

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

实际上,您的代码似乎仍在执行此操作。返回后,检查浏览器窗口顶部的URL。它是否仍包含上一个查询的分页指令?

您可能需要查看http://book.cakephp.org/view/167/AJAX-Pagination,并确保已勾选所有方框。

答案 1 :(得分:0)

我明白了,它现在正如我所希望的那样。我自己解释条件和解决方案。 当我从组合框中选择类别时,它会呈现代码为的页面:

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'));
  }
}

从这种情况来看,我认为observefield不会发送passArg,因为我们从url链接或html->链接获取url。我希望这对任何人都有用