Cakephp 1.2 Paginator和PassedArgs

时间:2009-11-16 17:29:53

标签: cakephp pagination cakephp-1.2

问题:当我有一个带分页的搜索结果集时,下一个链接,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] 

4 个答案:

答案 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) 希望这会有所帮助...