网站前端的zend模型

时间:2012-02-20 03:17:24

标签: zend-framework

我使用zend db表模型进行后端crud操作。但是我认为像这样的模型对于我的前端数据显示来说没有意义,比如类别新闻,新闻和博客小部件等来自各种表格或加入各种表格。

  

类错误扩展了Zend_Db_Table_Abstract {

  protected $_name = 'bugs';   }

这种方式的模型非常适合我的后端管理面板crud操作,我将如何为前端操作创建模型,任何一个例子都会被高度推崇。感谢

2 个答案:

答案 0 :(得分:2)

即使使用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 :(得分:1)

我认为您在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;
    }

}

视图助手的特点是返回一些数据(对象,字符串,数组,布尔值),可用于向视图和部分提供数据。
以下是使用多个视图助手在视图中显示数据的partial示例。

<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类中正确建立了表之间的relationships,他们可以做的功能就会越来越多。但是,如果您和大多数人一样,您的DbTable类和应用程序之间可能至少有一层域模型(mappersservicerepository)。 / p>

这是一个有关系的模型,它的唯一目的是提供数据来构建导航。

<?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提供了几种数据访问模式的接口,您只需提供业务逻辑和您想要的任何抽象级别。