2012-12-01 67 views
2

我正在为分页而苦苦挣扎。 我想使用默认功能。 问题是,分页按钮(数字,上一页,下一页)的链接不起作用。 我不知道如何将URL中的“page:2”传递给paginator,让他知道他必须显示/呈现下一个5结果的表格。 例如:我点击页面2上的“2”,网站将被刷新,但根本没有显示结果表。CakePHP分页显示结果问题

其他信息: 输入字段的URL位于cakephp/Posts/index。当我点击一个分页按钮(例如prev)时,分页程序会转到cakephp/Posts/index/page:2。

在这里,你得到PostsController代码:

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 /// 

下图显示了“search_all.ctp”的视图文件代码(调试转储显示了恰当的阵列应该如何):

如果你们中的任何人都能解决我的问题,我会非常感激。

更新1: 我给你的

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

它看起来精美绝伦的阵列。我必须用命名参数做些什么吗?我什么也没找到合适的食谱:-(

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

更新2:在index.ctp,阿贾克斯搜索开始的地方的代码查询和分页程序的第一页是完美的工作,但没有。该分页程序的按钮在所有:

<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> 

+0

一开始,你不需要用分页助手类禁用选项,只生成并输出环节适当。 – Daniel

+0

谢谢丹尼尔,我改变了这一点。但行为没有改变。 – Karl

+0

我可以看到的另一件事 - 如果你在ajax更新之后,你必须在$ this中设置'update'=>'#content''(或类似的)和'evalscripts => true' - > Paginator-> options',然后在所述#content div中包围search_all.ctp。 – Daniel

回答

0

我发现,工作正常的解决方案:)

That's拯救其在每一页上点击阅读会话参数。最后,在视图中带有ajax分页代码的Daniel提示能够区分非ajax调用和ajax调用。因此,每个搜索和分页链接都在控制器代码的ajax路径中处理,而删除会话参数可以在外部处理(这是我之前的一些主要问题)。

控制器代码:

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 // 
    } 
} 

在视图中必须有一些调整了。首先是包装整个页面的div,以便了解更新哪些内容(感谢Daniel的提示)。第二个echo $ this-> Js-> writeBuffer();在底部获得链接链接对于正常工作至关重要。查看代码(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(); 
?> 

0

的方法,我使用的,节省具有两个不同的观点:

// UsersController.php 
public function admin_index() { 
    $this->User->recursive = 0; 
    $this->set('users', $this->paginate()); 
} 

// admin_index.ctp 
<h1>Users</h1> 
<?php 
$this->Paginator->options(array(
        'update'=>'#content', 
        'evalScripts'=>true 
       )); 
?> 

<table id="content-table"> 
<tr> 
    <th><?php echo $this->Paginator->sort('username', 'Username', array('escape'=> false)); ?></th> 
    <th><?php echo $this->Paginator->sort('created', 'Created', array('escape'=> false)); ?></th> 
</tr> 

<?php 
foreach ($users as $user) { 
    echo "<tr>"; 
    echo "<td>"; 
    echo $user['User']['username']; 
    echo "</td><td>"; 
    echo $user['User']['created']; 
    echo "</td>"; 
    echo "</tr>"; 
} 
?> 
</table> 

<div id="leftcontrols" class="left"> 
    <?php echo $this->Paginator->first(' <<'); ?> 
    <?php echo $this->Paginator->prev(' <'); ?> 
</div> 
<div id="rightcontrols" class="right"> 
    <?php echo $this->Paginator->next(' >'); ?> 
    <?php echo $this->Paginator->last(' >>'); ?> 
</div> 
<br/> 

<div id="controls" style="text-align:center;"> 
    <?php echo $this->Paginator->counter(); ?> 
</div> 

#content是我的默认布局,它只是环绕视图。

+0

感谢您的提示。我会按照自己的方式尝试,也许添加会话参数以通过搜索条件很重要?! ... – Karl