PartialLoop с проблемой объекта Zend_Paginator - PullRequest
1 голос
/ 01 февраля 2010

Можно ли использовать метод findParentRow() из объекта Zend_Paginator? Я пытаюсь некоторый код, который работает нормально на объекте, возвращаемом fetchAll из набора результатов БД и работает нормально. С объектом 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, а другие значения, передаваемые из paginator, есть, но в $this->key, а не $this->paginator->key как и должно быть

Ответы [ 3 ]

3 голосов
/ 08 февраля 2010

A PartialLoop, по существу, запускает Partial для каждого элемента в массиве или Traversable переданного ему объекта. Так что к тому времени, когда он дойдет до вашего скрипта частичного просмотра, вы больше не будете работать с объектом Paginator, а с его разбитым на страницы содержимым.

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

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

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

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

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

1 голос
/ 21 октября 2011

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

1 голос
/ 03 февраля 2010

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

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

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

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

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