6

在控制器中我有:

  $paginator = Zend_Paginator::factory($mdlPost->getPosts($this->moduleData->accordion, 'name ASC'));
   if(isset($params['cities'])) {  
          $paginator->setCurrentPageNumber(intval($params['cities']));
            }
$paginator->setItemCountPerPage(4);
$this->view->posts = $paginator;         

在视图中我有这样的事情:

if ($this->posts != null) {?>
  <div id="cities_accord" class="news">
   <?php   echo $this->partialLoop('partials/post-min.phtml', $this->posts); ?>
  </div>   
  <?php   echo $this->paginationControl($this->posts,
                                'Sliding',
                                'public/pagination_cont.phtml'); 
}

部分/post-min.phtml

<?php 
$color = array(1=>'spring',2=>'summer',3=>'autumn',4=>'winter');
?>

<div id='<?php echo $color[$this->partialCounter] ?>' class="accordion_post">
<?php
$link = Digitalus_Uri::get(false, false, array('openCity' =>      
  $this->id));//$color[$this->partialCounter]));
?>

<h1 class="accordion_post_title"><?php echo $this->title ?></h1>

<p><?php echo $this->teaser ?> <a href="<?php echo $link;?>"><i>read more</i></a></p>
</div>

从这个链接 zend ( http://framework.zend.com/manual/en/zend.paginator.usage.html ) 获取的 pagination_cont.phtml 将显示将参数传递给控制器​​以获取相应的整个页面的链接现在工作正常

但我想改变这一点,以便我能够对返回的结果进行 ajaxify(即只有一个分页值而不是重新加载整个页面)结果我如何使用 jquery 来做到这一点以及我应该改变什么..

** 编辑:如果可能的话,如果浏览器(用户)禁用 javascript 以通过重新加载页面来查看相同的内容(即保持 if(javascript_not_enabled ) 的当前状态),那么最好有一个失败保存功能**

4

2 回答 2

3

这是我过去所做的。

首先,设置AjaxContext动作助手以启用html控制器动作的上下文。

添加一个.ajax.phtml仅包含可以通过 AJAX 替换的标记部分以及分页控制链接的视图。您可能可以将其复制到您的正常视图之外。用类似的东西替换你正常视图中的那个部分

<div id="reloadable-content">
    <?php echo $this->render('controller/action.ajax.phtml') ?>
</div>

这将确保您的初始请求和任何非 AJAX 请求仍将包含正确的内容。id 纯粹用于引用 JavaScript 中的<div>可加载块。

还要确保headScript仅在普通视图中包含 JS 文件(使用 )。

现在,在您的 JS 文件中,不显眼地将适当的事件绑定添加到分页器链接。由于您将替换分页控制部分以反映正确的当前页面和其他链接,因此最好使用 jQuerylive绑定来执行此操作。我还假设您将使用某种可识别的元素(<div class="pagination-control">例如)包装分页控件

$('.pagination-control').find('a').live('click', function(e) {
    var link = $(this);
    $('#reloadable-content').load(link.attr('href'), { format: 'html' });
    return false;
});

请记住,在使用此方法时,您将无法使用普通的后退/前进浏览器按钮导航分页请求。您还将失去直接为页面添加书签的能力(尽管您始终可以提供指向当前页面的永久链接作为 AJAX 加载内容的一部分)。

如果你真的很担心,你可以使用jQuery 历史插件之类的东西,但这需要更多的客户端工作。

另一个需要注意的是,上述内容仅适用于分页链接。如果要使用带有下拉页面选择的表单,则需要为提交添加另一个事件处理程序。

于 2011-01-25T02:58:27.340 回答
1

明白了,非常感谢@Phil Brown:

在控制器 int() 中将响应类型更改为 json

  class NewsController extends Zend_Controller_Action

  {

      public function init()

      {

          $contextSwitch = $this->_helper->getHelper('contextSwitch');

          $contextSwitch->addActionContext('list', 'JSON')

                        ->initContext();

      }



      // ...

  }


public listAtcion() {

  //  .............

  $paginator = Zend_Paginator::factory($mdlPost->getPosts($this->moduleData->accordion, 'name ASC'));
   if(isset($params['cities'])) {  
         $paginator->setCurrentPageNumber(intval($params['cities']));
         }
  $paginator->setItemCountPerPage(4);

  $post = array();
  foreach($paginator as $post ) {
      $post[] = $post;
  }

  $this->view->post = $paginator; 

  #TODO //add a check here for non-ajax requests (#improvment)
    $this->view->posts = $paginator;     

}

在分页控制器上的一个视图中(很可能在 pagination_cont.phtml 中)添加 ajax 链接

 <?= $this->ajaxLink (
                 $this->url('cities'=>$this->page_num),array('id'=>'div_id','complete'=>'js_method(json_data)','method'=>post) ,array('format'=>'JSON'));

并添加 js_method(json_data) 的 JavaScript 函数以使用 json 数据修改 id = 'div_id' 的 div

  function js_method(json_data) { 
    var content = parse.JSON(json_data);
     $('#div_id').html(''); 
    //fill it with the reposnse content  some thing like  $('#div_id').append(content); 
  }
于 2011-01-25T12:43:53.243 回答