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

partial/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 は、コントローラーにパラメーターを渡して、対応するページ全体を取得するリンクを表示します。今のところ問題なく動作しています

しかし、私はこれを変更して、返された結果を ajax 化できるようにします (つまり、ページ全体をリロードするのではなく、単一のページ付けされた値のみ)。

** 編集: 可能であれば、javascript を無効にしたブラウザ (ユーザー) がページをリロードして同じことを表示できるようにする (つまり、if(javascript_not_enabled) の現在のステータスを維持する)**

4

2 に答える 2

3

これは私が過去にしたことです。

まず、AjaxContextアクションヘルパーをセットアップしhtmlて、コントローラーアクションのコンテキストを有効にします。

.ajax.phtmlAJAXを介して置き換えることができるマークアップのセクションとページネーション制御リンクのみを含むビューを追加します。おそらく、これを通常のビューからコピーすることができます。通常のビューのそのセクションを次のようなものに置き換えます

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

これにより、最初のリクエストとAJAX以外のリクエストに適切なコンテンツが含まれるようになります。<div>IDは、JavaScriptでロード可能なブロックを参照するためだけのものです。

また、JSファイル(を使用headScript)を通常のビューにのみ含めるようにしてください。

ここで、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履歴プラグインのようなものを使用できますが、クライアント側での作業がさらに必要になります。

もう1つの注意点は、上記はページ付けリンクでのみ機能することです。ドロップダウンページ選択のあるフォームを使用する場合は、送信用に別のイベントハンドラーを追加する必要があります。

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

}

ページネーションコントローラーのビューの1つ(おそらく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 関数を追加して、id = 'div_id' の div を json データで変更します。

  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 に答える