dongzg2006 2012-12-01 19:53
浏览 80
已采纳

CakePHP分页问题显示结果

I´m struggling with the Pagination. I want to use the default functionality. The problem is that the links of the pagination-buttons (numbers, prev, next) doesn´t work. I don´t know how to pass the "page:2" in the URL back to the paginator for him to know that he must show/render the table with the next 5 results. E.g: I click on the "2" for page:2 and the site is going to be refreshed but no result-table is shown at all.

Other Info: The URL of the input-field is at cakephp/Posts/index. When I click a paginator-button (e.g. prev), the paginator goes to cakephp/Posts/index/page:2.

Here you get the PostsController-code:

class PostsController extends AppController {    
    var $name = 'Posts';
    public $helpers = array('Html', 'Form', 'Js', 'Paginator');
    public $components = array('RequestHandler');
    public $paginate = array(
    'limit' => 5,
    'maxLimit' => 50,
    'order' => array(
        'Post.INCOME' => 'asc',
    ),
);
function index() {
    //debug($this->request->data);
    //var_dump($this->params);
    if(!empty($this->request->data['ajaxSearchAll'])){
        if($this->RequestHandler->isAjax()){
            //$data = $this->Post->find('all', array('conditions' => array('ZIPCODE LIKE' => '%' . $this->data['ajaxSearchAll'] . '%')));
            $posts = $this->paginate('Post', array('ZIPCODE LIKE' => '%' . $this->data['ajaxSearchAll'] . '%')); 
            //$this->set('posts', $data);
            $this->set(compact('posts')); 
            $this->render('SearchAll', 'ajax');         
        }   
    } 
/// GOES ON WITH IRRELEVANT STUFF ///

The following shows the view-file-code of the "search_all.ctp" (The debug-dumps show a proper array how it should be):

<?php $this->paginator->settings = array(
    'limit' => 5,
    'maxLimit' => 25
); 
$this->Paginator->options(array('url' => array('controller' => 'Posts', 'action' => 'index')));
?>
<table>
    <tr>
        <th><?php echo $this->Paginator->sort('CITY', 'Stadt'); ?></th>

        <th><?php echo $this->Paginator->sort('DATE', 'Lieferdatum'); ?></th>
        <th><?php echo $this->Paginator->sort('TIME', 'Lieferzeit'); ?></th>        
    </tr>
    <!-- Hier iterieren wir in einer Schleife durch den $posts Array und geben die Daten des aktuellen Elements aus -->

    <?php foreach ($posts as $post): ?>
    <tr>
        <td><?php echo $this->Html->link($post['Post']['CITY'],"/Posts/view/".$post['Post']['id']); ?></td>
        <td><?php echo $post['Post']['DATE']; ?></td>
        <td><?php echo $post['Post']['TIME']; ?></td>
    </tr>
    <?php endforeach;} ?>
</table>
<?php 
if(!empty($posts)){ 
    echo $this->Paginator->first(__('Erste Seite', true), array('class' => 'disabled'));
    echo " ";
    echo $this->Paginator->prev('« Vorherige Seite', null, null, array('class' => 'disabled'));
    echo " ";
    echo $this->Paginator->numbers();
    echo " ";
    echo $this->Paginator->next('Nächste Seite »', null, null, array('class' => 'disabled'));
    echo " ";
    echo $this->Paginator->last(__('Letzte Seite', true), array('class' => 'disabled'));
} ?>
<?php debug($this->Paginator->params()); 
debug($this->request->params['paging']);
?>

I would be so thankful if anyone of you can solve my problem.

UPDATE 1: I give you the array of

debug($this->request->params['paging']);

It looks absolutely fine. Do I have to do something with the named parameters? I found nothing suitable in the cookbook :-(

array(
    'Post' => array(
        'page' => (int) 1,
        'current' => (int) 5,
        'count' => (int) 11,
        'prevPage' => false,
        'nextPage' => true,
        'pageCount' => (int) 3,
        'order' => array(
            'Post.INCOME' => 'asc'
        ),
        'limit' => (int) 5,
        'options' => array(
            'conditions' => array()
        ),
        'paramType' => 'named'
    )
)

UPDATE 2: The code of the index.ctp, where the ajax-search starts. The query and the first page of the paginator are working perfectly. But not the buttons of the paginator at all:

<div id="courierQuery">
    <?php echo $this->Form->create(false, array('type' => 'post', 'default' => false)); ?>
    <?php echo $this->Form->input('ajaxSearchAll', array('type' => 'text', 'id' => 'ajaxSearchAll', 'name' => 'ajaxSearchAll', 'label' => false, 'placeholder' => 'Bitte PLZ eingeben'))?>
    <?php $before = $this->Js->get('#loading')->effect('fadeIn', array('buffer' => False)); ?>
    <?php $success = $this->Js->get('#loading')->effect('fadeOut', array('buffer' => False)); ?>
    <?php echo $this->Js->get('#ajaxSearchAll')->event('keyup', $this->Js->request(
        array('controller'=>'Posts', 'action'=>'index'),
            array(
                'update'=>'#erfolgreich_ajax',
                'before' => $before,
                'success' => $success,
                'async' => true,
                'dataExpression' => true,
                'method' => 'post',
                'data'=>$this->Js->serializeForm(array('isForm'=>'false', 'inline'=>'true'))
            )   
        )
    ); ?>
    <?php echo $this->Form->end();?>        
</div>
/// IRRELEVANT STUFF ///
<div id="loading" style="display: none;">
    <div style="float:left;margin-top: 14px"><?php echo $this->Html->image('ajax-loader.gif', array('id' => 'busy-indicator')); ?></div>
    <div style="float:left;margin: 22px 0 0 10px;color: #fff"><p>Suche nach Inseraten l&auml;uft ...</p></div>
</div>

  • 写回答

2条回答 默认 最新

  • douyiqi9640 2012-12-05 13:28
    关注

    I found a solution that works fine :)

    That´s with saving session-parameters which are read on every page-click. Finally the hint of Daniel with the ajax-pagination-code in the view gave the ability to differentiate between a non-ajax-call and an ajax-call. So every search and pagination-link is processed in the ajax-path of the controller-code while deleting of the session-parameters can be processed outside (that was some of my main problems earlier).

    Controller Code:

       function index() {
        if(!$this->RequestHandler->isAjax()){
            $this->Session->delete('Ajax.searchA');
            $this->Session->delete('Ajax.searchS');
            $this->Session->delete('Ajax.searchB');
        }
        if($this->RequestHandler->isAjax()){
            if(!empty($this->request->data['ajaxSearchAll'])){
                $this->Session->write('Ajax.searchA', $this->request->data['ajaxSearchAll']);
                $this->Session->delete('Ajax.searchS');
                $this->Session->delete('Ajax.searchB');
                $posts = $this->paginate('Post', array('ZIPCODE LIKE' => '%' . $this->Session->read('Ajax.searchA') . '%')); 
                $this->set(compact('posts')); 
                $this->render('SearchAll', 'ajax');         
            } else{
                if($this->Session->read('Ajax.searchA') != null){
                    $posts = $this->paginate('Post', array('ZIPCODE LIKE' => '%' . $this->Session->read('Ajax.searchA') . '%')); 
                    $this->set(compact('posts'));   
                    $this->render('SearchAll', 'ajax'); 
                }
            }
        // OTHER 2 BLOCKS //
        }
    }
    

    In the view there had to be some adjustments too. First a div wrapping the whole page for the ajax-update to know what content to update (thanks Daniel for the hint). Second the echo $this->Js->writeBuffer(); at the bottom to get chained-links is vital for working properly. The view Code (search_all.ctp):

    <div id="searchAll">
    <?php if(empty($posts)){ ?>
            <p class="error">Leider keine Inserate gefunden :-(</p>
            <p>Sei der erste in Deinem PLZ-Bereich und erstelle ein Inserat:</p>
            <?php echo $this->Html->link('Inserat erstellen', array('controller' => 'Posts', 'action' => 'add')); ?>
        <?php } else { ?>
        <p class="message">Wir haben <?php echo $this->Paginator->counter('{:count}');?> Inserate gefunden :-)</p>
        <?php
        $this->Paginator->options(array(
                      'update'=>'#searchAll',
                      'evalScripts'=>true,
                      'before' => $this->Js->get('#loading')->effect('fadeIn', array('buffer' => false)),
                      'complete' => $this->Js->get('#loading')->effect('fadeOut', array('buffer' => false))
                      ));
        ?>
        <table>
            <tr>
                <th><?php echo $this->Paginator->sort('ZIPCODE', 'Postleitzahl'); ?></th>
            </tr>
            <!-- Hier iterieren wir in einer Schleife durch den $posts Array und geben die Daten des aktuellen Elements aus -->
    
            <?php foreach ($posts as $post): ?>
            <tr>
                <td><?php echo $post['Post']['ZIPCODE']; ?></td>
            </tr>
            <?php endforeach;} ?>
        </table>
        <?php 
        if(!empty($posts)){ 
            echo $this->Paginator->numbers();
        } ?>
    <?php 
    //debug($this->Paginator->params()); 
    //debug($this->request->params['paging']);
    debug($this->Session->read('Ajax.searchA'));
    echo $this->Js->writeBuffer();
    ?>
    

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥35 平滑拟合曲线该如何生成
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 自己瞎改改,结果现在又运行不了了
  • ¥15 链式存储应该如何解决
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站