Zend модели для переднего конца сайта - PullRequest
0 голосов
/ 20 февраля 2012

Я использую модели таблиц Zend DB для операций с бэкэндом CruD.Однако я думаю, что подобная модель не имеет смысла для отображения моего внешнего интерфейса, например новостей по категориям, виджетов новостей и блогов, и т. Д. Из разных таблиц или из разных таблиц.*

  protected $_name = 'bugs';   }

Модель идеально подходит для моей работы с бэкэнд-админ-панелью. Как бы я создал модель для работы с интерфейсом, любой пример был бы очень кстати.Спасибо

Ответы [ 2 ]

2 голосов
/ 20 февраля 2012

Вы можете присоединиться к другим столам даже с моделью Zend_Db_Table.Просто обязательно отключите проверку целостности.

Код (не проверенный) может выглядеть примерно так:

class My_Model_News extends Zend_Db_Table
{
    // Hate the 'tbl_' prefix. Just being explicit that this is a 
    // table name.
    protected $_name = 'tbl_news';  

    public function fetchNewsByAuthor($authorId)
    {
        $select = $this->select();
        $select->setIntegrityCheck(false)
               ->from(array('n' => 'tbl_news'), array('*'))
               ->join(array('a' => 'tbl_author'), array('n.author_id = a.id'), array('author_name' => 'a.name'))
               ->order('n.date_posted DESC');
        return $this->fetchAll($select);
    }
}

Тогда в вашем контроллере:

$authorId = $this->_getParam('authorId');
$newsModel = new My_Model_News();
$this->view->articles = $newsModel->fetchNewsByAuthor($authorId);

Правдаскажу вам, это одна из вещей, которая не дает мне покоя в отношении большинства подходов к TableGateway, например Zend_Db_Table.Я считаю, что TableGateway отлично подходит для запросов с одной таблицей, но я считаю, что в большинстве моих реальных ситуаций требуются несколько таблиц.В результате я в конечном итоге создаю модели, которые не привязаны к одной таблице, а скорее принимают экземпляр Zend_Db_Adapter, а затем запрашивают / объединяют любые таблицы, в которых они нуждаются.Или я выталкиваю на более сложные ORM, такие как Doctrine.

1 голос
/ 20 февраля 2012

Я думаю, что вы спрашиваете в ZF: View Helper , помощник вида берет данные из ваших моделей и позволяет вывести их в представление без необходимости обрабатывать их в контроллере.Вот простой пример:

<?php

class Zend_View_Helper_Track extends Zend_View_Helper_Abstract
{
    /**
     *
     * @param type $trackId
     * @return type object
     */
    public function Track($trackId) {
        //this model just aggregates data from several DbTable models
        $track = new Application_Model_TrackInfo();
        $data = $track->getByTrackId($trackId);

        return $data;
    }

}

помощники представления характеризуются возвратом некоторых данных (объект, строка, массив, логическое значение) и могут использоваться для предоставления данных представлениям и частям.Ниже приведен пример частичного , который использует несколько помощников представления для представления данных в представлении.

<fieldset><legend>Dates and Qualifications</legend>
    <table>
        <tr>
            <td>Birth Date: </td><td><?php echo $this->escape($this->FormatDate($this->bdate)) ?></td>
        </tr>
        <tr>
            <td>Seniority Date: </td><td><?php echo $this->escape($this->FormatDate($this->sendate)) ?></td>
        </tr>
    </table>
    <table>
        <tr>
            <td>I'm a Lead:</td><td><?php echo $this->escape(ucfirst($this->ToBool($this->lead))) ?></td>
        </tr>
        <tr>
            <td>Lead Date:</td><td><?php echo $this->escape($this->FormatDate($this->ldate)) ?></td>
        </tr>
        <tr>
            <td>I'm an Inspector:</td><td><?php echo $this->escape(ucfirst($this->toBool($this->inspector))) ?></td>
        </tr>
        <tr>
            <td>Admin Login:</td><td><?php echo $this->escape(ucfirst($this->toBool($this->admin))) ?></td>
        </tr>
    </table>
</fieldset>

и, наконец, я вызываю этот частичный элемент в представлении с помощью:

<?php echo $this->partial('_dates.phtml', $this->memberData) ?>

Насколько модели DbTable бесполезны для внешнего интерфейса, вы можете быть удивлены.После того, как вы правильно установили отношения между вашими таблицами в ваших классах DbTable, функциональность того, что они могут сделать, значительно возрастет.Однако если вы похожи на большинство людей, у вас, скорее всего, будет по крайней мере один уровень моделей доменов ( mappers , service , repository ) между вашими классами DbTable и вашим приложением,

Это модель со связями, единственной целью которой является предоставление данных для построения навигации.

<?php

class Application_Model_DbTable_Menu extends Zend_Db_Table_Abstract {

    protected $_name            = 'menus';
    protected $_dependentTables = array('Application_Model_DbTable_MenuItem');
    protected $_referenceMap    = array(
        'Menu' => array(
            'columns'       => array('parent_id'),
            'refTableClass' => 'Application_Model_DbTable_Menu',
            'refColumns'    => array('id'),
            'onDelete'      => self::CASCADE,
            'onUpdate'      => self::RESTRICT
        )
    );

    public function createMenu($name) {

        $row = $this->createRow();
        $row->name = $name;

        return $row->save();
    }

    public function getMenus() {

        $select = $this->select();
        $select->order('name');

        $menus = $this->fetchAll($select);
        if ($menus->count() > 0) {
            return $menus;
        } else {
            return NULL;
        }
    }

    public function updateMenu($id, $name) {

        $currentMenu = $this->find($id)->current();

        if ($currentMenu) {
            //clear the cache entry for this menu
            $cache = Zend_Registry::get('cache');
            $id = 'menu_' . $id;
            $cache->remove($id);
            $currentMenu->name = $name;
            return $currentMenu->save();
        } else {
            return FALSE;
        }
    }

    public function deleteMenu($menuId) {

        $row = $this->find($menuId)->current();

        if ($row) {
            return $row->delete();
        } else {
            throw new Zend_Exception("Error loading menu...");
        }
    }

}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...