2011-01-24 76 views
6

到ajaxify zend_pagination結果(已經與partialoop工作),我有:如何在控制器中使用jQuery

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

分/職務:

$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;   
在視圖中的我有一些這樣的事

-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採取的pagination_cont.phtml(http://framework.zend.com/manual/en/zend.paginator.usage.html) 將表明,將通過PARAMS控制器,以獲取相應的整個頁這是工作好了,現在

聯繫,但我想改變這種做法,我將能夠ajaxify返回的(即只有一個分頁價值,而不是重新加載整個頁面)結果我該怎麼做,使用jQuery和我應該改變什麼..

**編輯:如果可能的話,瀏覽器(用戶)將很高興有失敗 - 通過重新加載頁面來禁用JavaScript以查看相同的內容(即,保持當前狀態爲if(javascript_not_enabled))**

回答

1

得到它,非常感謝@Phil布朗:

控制器INT

()改變響應類型的pagination_cont.phtml以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;  

} 

在一個視圖(最有可能)分頁控制器上添加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的JavaScript函數(json_data)來修改使用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); 
    } 
3

這就是我過去所做的。

首先,設置AjaxContext操作幫助程序,以便在您的控制器操作上啓用html上下文。

添加.ajax.phtml視圖,該視圖僅包含可通過AJAX替換的標記部分以及分頁控制鏈接。你大概可以把它從你的正常視圖中複製出來。用普通視圖替換該部分,類似

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

這將確保您的初始和任何非AJAX請求仍將包含正確的內容。 <div> id純粹是用於引用JavaScript中的可加載塊。

此外,請確保您僅在正常視圖中包含您的JS文件(使用headScript)。

現在,在您的JS文件中,不顯眼地將適當的事件綁定添加到分頁程序鏈接。由於您將替換分頁控制部分以反映正確的當前頁面和其他鏈接,因此最好使用jQuery live綁定來完成此操作。我也假設你換分頁控制與某種識別元素(<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 history plugin的東西,但這需要更多的客戶端工作。

另一個需要注意的是,上述內容僅適用於分頁鏈接。如果您想使用帶下拉頁面選擇的表單,則需要爲提交添加另一個事件處理程序。

相關問題