2010-02-01 1 views
1

Возможно ли использовать метод findParentRow() из объекта Zend_Paginator? Я пытаюсь использовать код, который отлично работает на объекте, возвращаемом fetchAll, из набора результатов DB и отлично работает. Однако с объектом Zend_Paginator он не работает.PartialLoop с Zend_Paginator Object Issue

В моем контроллере я есть:

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 по существу запускает Partial для каждого элемента в массиве или Traversable объекта, переданного ему. Поэтому к тому моменту, когда вы дойдете до своего сценария частичного просмотра, вы больше не работаете с объектом Paginator, но с его разбитым на страницы содержимым.

В частичном цикле setObjectKey() работает на частичном уровне. Вы можете передать массив объектов Traversable (или объект Traversable, который итерации над объектами Traversable) в частичный цикл, и в частичном результате каждый объект будет доступен через ключ объекта.

DbSelect Paginator адаптер вы используете, тем не менее, возвращает массив строк для каждой страницы, так что нет какой-либо объект, чтобы положить в ключ paginator объекта и остается неиспользованным.

Вместо этого вы должны использовать адаптер DbTableSelect, который вернет набор строк.

Если вам нужен доступ к самому Paginator, вы должны использовать частично. Таким образом, вы можете использовать setObjectKey() для перебора страниц в paginator самостоятельно.

Я предлагаю вам сохранить исходный код Zend Framework под рукой, если что-то не работает так, как вы ожидаете. К сожалению, у меня было больше возможностей понять, как использовать его, прочитав код, а не прочитав документацию.

+0

Я не знаю, есть это было раньше, но partialLoop * может * быть setObjectKey (). И модель должна реализовать «Итератор», а не «Траверсируемый». – nevvermind

+0

@nevvermind, 'PartialLoop' расширяет' Partial', так что да, у него есть 'setObjectKey()'. Но когда вы передаете объект 'partialLoop()', он сначала перебирает это, и только * then * использует 'setObjectKey()' для установки элемента в каждом частичном в цикле. Поскольку он использовал адаптор paginator 'DbSelect', результирующий элемент был * массивом * строк базы данных для этой страницы, а не объектом, поэтому' setObjectKey() 'не работал. – mercator

+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

1

На самом деле пример кода, который вы указали, совершенно правильный, у меня очень похожая настройка, хотя я использовал Zend_Paginator_Adapter_DbTableSelect в качестве адаптера. Таким образом, в принципе это возможно.

Стоит проверить, что возвращается из fetchPaginated(), в действие вашего контроллера.

Возможно, стоит проверить, не переписывается ли $ view-> paginator в сценарий просмотра (что плохо по разным причинам). Кроме того, на самом деле вы можете играть с именем объекта объекта, например, вместо «paginator» в вашем setObjectKey() использовать «модель».

P.S. Не уверен, является ли это отношение или нет, но я установка ключевой объект в контроллере:

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

Метод Zend_Paginator_Adapter_DbSelect возвращает массив и getItems() методом Zend_Paginator_Adapter_DbTableSelect строк getItems(), просто использовать Zend_Paginator_Adapter_DbTableSelect, не Zend_Paginator_Adapter_DbSelect ...

 Смежные вопросы

  • Нет связанных вопросов^_^