其他信息: 输入字段的URL位于cakephp / Posts / index。当我点击一个paginator-button(例如prev)时,paginator会转到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”的视图文件代码(调试转储显示了一个正确的数组应该如何):
<?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']);
?>
如果你们中的任何一个人能解决我的问题,我会非常感激。
更新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的代码,其中ajax-search开始。查询和分页器的第一页工作正常。但根本不是分页器的按钮:
<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äuft ...</p></div>
</div>
答案 0 :(得分:1)
我找到了一个可行的解决方案:)
这就是保存会话参数,每次点击都会读取这些参数。最后,Daniel在视图中使用ajax-pagination-code提示能够区分非ajax-call和ajax-call。因此,每个搜索和分页链接都在控制器代码的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包装整个页面以进行ajax-update以了解要更新的内容(感谢Daniel提示)。其次是echo $ this-&gt; Js-&gt; 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();
?>
答案 1 :(得分: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
是我的默认布局,无论如何它只围绕着视图。