问题:当我有一个带分页的搜索结果集时,下一个链接,prev和数字不会保留搜索参数。似乎是一个常见的问题。
我在互联网上到处搜索,最后我发现我应该放这个 视图中的陈述:
$paginator->options(array('url' => $this->passedArgs));
但是,我不能让它工作,我应该在$ this->控制器中的passedArgs上做些什么吗?
请帮忙
谢谢
控制器代码:
function search($category=null)
{
$this->paginate['Cat'] = array(
'limit' => 10,
'order' => array ('Cat.id' => 'desc')
);
$conditions = array('Cat.category' => $this->data['Cat']
['category']);
$this->set( 'data', $this->paginate('Cat', $conditions ) );
$this->render( 'index_ar' );
return;
}
查看代码:
<?php
$paginator->options(array('url' => $this->passedArgs));
echo $paginator->numbers( );
?>
<table class='grid'>
<tr>
<th><?php echo $paginator->sort('ID', 'id'); ?></th>
<th><?php echo $paginator->sort('Nome', 'name'); ?></th>
<th><?php echo $paginator->sort('Categoria', 'category'); ?></th>
<th>Foto</th>
<th><?php echo $paginator->sort('Stato', 'status'); ?></th>
<th width='25%'></th>
</tr>
<?php $i = '0'; $count = '1';?>
<?php foreach ($data as $cats): ?>
<?php $class = (is_int($i/2)) ? 'data-grid-row-1' : 'data-grid-
row-2';?>
<tr class="<?php echo $class?>">
<td><?php echo $cats['Cat']['id'] ?></td>
<td><?php echo $cats['Cat']['name'] ?></td>
<td><?php echo $cats['Cat']['category'] ?></td>
<td style='width:25px'>
[cut]
答案 0 :(得分:1)
$ this-&gt;如果您使用passArgs来包含您要搜索的类别和搜索词,即“/ category:XXXX / term:YYYY”等形式的url params,则应使用passedArgs。
如果您只使用没有'category:'或'term:'前缀的普通参数,那么您需要使用$ this-&gt; params ['pass']
如果您没有在网址中传递类别和字词,那么您应该是。
每当我有一个结果集,用户可以按搜索词或类别或任何内容进行筛选时,我总是将发布的表单数据传输到url params并将用户重定向到该url,然后从url中获取params以填充条件分页。
这是一种常用的设计模式,被认为是最佳做法,因为它允许用户深入链接到搜索结果而无需填写表单。
如果您正在实现网站搜索功能,我的github上有一个相当完整的cakephp search plugin,但还没有文档,但请查看搜索控制器,了解我的意思。
答案 1 :(得分:0)
似乎是对的。确保passArgs不为空。 你总是可以将一个测试数组传递给url,以确保它正常工作。
$paginator->options(array('url' => array('a','b')));
答案 2 :(得分:0)
您好我通过正确设置passedArgs解决了这个问题。发布工作代码:
<强>控制器:强>
function search()
{
$category = 'All';
//debug( $this->passedArgs );
//debug( $this->params);
//debug( "form categ: " . $this->data['Cat']['category']) ;
$conditions = array();
// if category is passed with a submit...
if ( isset( $this->data['Cat']['category'] ) )
$category = $this->data['Cat']['category'];
// if category is passed through paginating urls...
if ( isset( $this->passedArgs['category'] ) )
$category = $this->passedArgs['category'];
// build conditions
if ( $category != 'All')
$conditions = array ( 'Cat.category' => $category );
//set passedArgs for building paginating url in a correct way
if ( !isset( $this->passedArgs['category'] ) )
$this->passedArgs['category'] = $category ;
$this->set( 'data', $this->paginate('Cat', $conditions ) );
$this->render( 'index_ar' );
return;
}
查看:强>
<center>
<h2>heading</h2>
<?php echo $form->create( 'Cat', array('action' => 'search')) ?>
<table border="0">
<td>Category</td>
<td valign="top">
<?php echo $form->input('category',
array(
'label' => false,
'options' =>
array(
'all' => 'All',
'cat1' => 'Category1'
)
) ); ?>
</td>
</tr>
-->
<tr><td colspan="2" valign="top"><?php echo $form->end('Search'); ?></td></tr>
</tr>
</table>
<hr />
<?php $paginator->options(array('url' => $this->passedArgs ));?>
<?php echo $paginator->counter( array('format' => 'Page %page% of %pages%, record %current% on %count%'));?>
<br/>
Pages: <?php echo $paginator->numbers( ); ?>
<br/>
<?php
if ( count($data) == 0 )
echo "<p style='text-align:center'>No record found.</p>";
else
{
?>
<table class='grid'>
<tr>
<th align="left"><?php echo $paginator->sort('ID', 'id'); ?></th>
<th align="left"><?php echo $paginator->sort('Name', 'name'); ?></th>
<th align="left"><?php echo $paginator->sort('Category', 'category'); ?></th>
<th align="left">Foto</th>
<th align="left"><?php echo $paginator->sort('Status', 'status'); ?></th>
<th width='17%'></th>
</tr>
[...]
答案 3 :(得分:0)
经过一段时间的演奏后,我遇到了同样的问题...
<?php $paginator->options(array('url' => $this->params['named'])); ?>
为我工作。 (我正在使用CakePHP 1.2) 希望这会有所帮助...