我尝试使用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'));
}
过滤器按我的意思工作,但问题是当我选择空值('按类别过滤)时,它仍记得上次类别会话,所以我无法回到默认列表(没有过滤器的所有记录列表)。
我试图做出一些条件,但仍然没有成功。还有另外一种方法吗?我感谢你的帮助。感谢
埃尔马瓦恩
答案 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。我希望这对任何人都有用