2010-02-01 29 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 ...