Zend Framework Data Mappers + Пагинатор - PullRequest
3 голосов
/ 14 июля 2011

Я в основном использую zend_db_table с paginator, проблема в том, что он вернет zend_db_rows вместо объектов домена из моего datamapper.

Допустим,

class Content_Model_ArticleMapper {
/*
 * @param Zend_Db_Select $select
 * @return Zend_Paginator
 */
    public function getPaginator($select = null){}
}

Я могу взломать его, переопределив метод _loadAndReturnRow в пользовательском наборе строк. Однако это довольно уродливо, так как у меня больше нет Zend_Db_Row, когда я запрашиваю таблицу. И потерять методы, такие как save, которые я не хочу копировать на объекте домена. :

class Content_Model_DbTable_Rowset_Articles extends Zend_Db_Table_Rowset {
        protected function _loadAndReturnRow($position)
    {
    if (!isset($this->_data[$position])) {
        require_once 'Zend/Db/Table/Rowset/Exception.php';
        throw new Zend_Db_Table_Rowset_Exception("Data for provided position does not exist");
    }

    // do we already have a row object for this position?
    if (empty($this->_rows[$position])) {

        $this->_rows[$position] = new Content_Model_Article($this->_data[$position]);
    }

    // return the row object
    return $this->_rows[$position];
    }
}

Итак, мой вопрос, как ты делаешь это красиво? :) Ты пишешь нестандартные адаптеры Paginator?

1 Ответ

1 голос
/ 05 января 2012

Вы можете установить rowClass в вашей DbTable как

DbTable

class Content_Model_DbTable_Article extends Zend_Db_Table_Abstract {

    protected $_name = 'article';

    public function init() {
        $this->setRowClass('Content_Model_Article');
    }

}

Модель домена

class Content_Model_Article extends Zend_Db_Table_Row {

    //for example
    public function getAuthorFullName() {
        return $this->author_firstname . ' ' . $this->author_lastname;
    }

}

Теперь строки в вашем наборе строк являются экземплярами Content_Model_Article, и вы можете использовать Zend_Paginator_Adapter_Iterator.

Использование Paginator

$articleTable = new Content_Model_DbTable_Article();
$articleRowset = $articleTable->fetchAll();
$paginator = new Zend_Paginator(Zend_Paginator_Adapter_Iterator($articleRowset));
//now you can loop through the paginator
foreach($paginator as $article) {
    echo $article->getAuthorFullName();
}
...