2010-02-01 30 views
1

是否有可能從Zend_Paginator的對象內使用findParentRow()方法?我正在嘗試一些在fetchAll從數據庫結果集返回的對象上正常工作的代碼,並且工作正常。使用Zend_Paginator對象,它不起作用。PartialLoop與Zend_Paginator的對象問題

以我控制器我有:

public function downloadedAction() 
{ 
    $images = new Model_ApplicationImages(); 
    $paginator = $images->fetchPaginated(); 
    $paginator->setCurrentPageNumber($this->_getParam('page')); 
    $this->view->paginator = $paginator; 
} 

在我的模型我有:

public function fetchPaginated() 
{ 
    $select = $this->select() 
        ->from($this->_name) 
        ->where('status = ?','approved') 
        ->where('downloaded = ?','0'); 
    $adapter = new Zend_Paginator_Adapter_DbSelect($select); 
    $paginator = new Zend_Paginator($adapter); 
    $paginator->setItemCountPerPage(10); 
    return $paginator; 
} 

我認爲我有:

$this->partialLoop()->setObjectKey('paginator'); 
    echo $this->partialLoop('admin/list-downloaded.phtml', $this->paginator); 

和在部分:

$this->paginator->findParentRow('Model_Application')->name 

看來雖然該對象鍵不被使用或沒有被正確設定爲內部分var_dump($this->paginator)NULL並從分頁程序傳遞的其他值存在,但下$this->key和不$this->paginator->key,因爲它們應該是

回答

3

一個PartialLoop基本上運行在陣列中的每個元素或Traversable對象傳遞給它一個Partial。因此,當它到達您的部分視圖腳本時,您不再使用Paginator對象,而是使用其分頁內容。

在部分循環中,setObjectKey()作品在部分水平。可以傳遞Traversable對象(或對象Traversable,超過Traversable對象迭代),以部分迴路和在部分每個物體於是將通過對象鍵可訪問的陣列。

您正在使用的DbSelect分頁程序適配器,然而,返回行的每個頁面的陣列,所以沒有被放在paginator對象密鑰的任何對象,並處於閒置狀態。

您應該使用DbTableSelect適配器代替,這將返回一個行集。

如果您需要訪問Paginator本身,則應該使用partial。這樣,您可以使用setObjectKey()來自行遍歷頁面中的頁面。

我建議你保持Zend框架得心應手的源代碼時,一些不工作,你所期望的方式。可悲的是,我通過閱讀代碼比通過閱讀文檔來更清楚地瞭解如何使用代碼。

+0

我不知道有從前那樣,但是partialLoop *可以*有setObjectKey( ) 方法。模型必須實現'Iterator',而不是Traversable。 – nevvermind 2011-10-22 05:36:19

+0

@nevvermind,'PartialLoop'擴展'Partial',所以是的,它確實有'setObjectKey()'。但是,當你傳遞一個對象,以'partialLoop()'它會首先遍歷的是,只有* *然後使用'setObjectKey()'在環路設置每個部分的項目。因爲他用'DbSelect'分頁程序適配器,產生的項目是一個*數組*該頁面,而不是對象的數據庫行,所以'setObjectKey()'沒有工作。 – mercator 2011-10-22 16:01:07

+0

@nevvermind,模型必須是'Traversable',[這就是ZF檢查(http://framework.zend.com/svn/framework/standard/trunk/library/Zend/View/Helper/PartialLoop。 PHP),但['Traversable'](http://www.php.net/manual/en/class.traversable.php)本身不具有接口,需要使用任一'Iterator'或'IteratorAggregate'來實現。 – mercator 2011-10-22 16:02:19

1

其實你提供的示例代碼是非常正確的,我有非常類似的設置,儘管我使用Zend_Paginator_Adapter_DbTableSelect作爲適配器。所以,原則上絕對有可能。

這是值得一試取之於fetchPaginated()返回時,在你的控制器動作。

其他的事情可能值得一試,就是分頁程序是否$視圖 - >沒有得到您的視圖腳本(這是不同的原因是壞事)覆蓋。另外,你實際上可以使用對象鍵名來玩,例如在你的setObjectKey()中使用「model」來代替「paginator」。

P.S.不知道是否是相關或沒有,但我設置在控制器中的對象鍵:

$this->view->partialLoop()->setObjectKey('model'); 
$this->view->partial()->setObjectKey('model'); 
1

Zend_Paginator_Adapter_DbSelect返回數組和Zend_Paginator_Adapter_DbTableSelect行集的getItems()方法的getItems()方法,只要使用Zend_Paginator_Adapter_DbTableSelect,不Zend_Paginator_Adapter_DbSelect ...