Zend framework 网站前端的zend模型

Zend framework 网站前端的zend模型,zend-framework,Zend Framework,我使用zend db表模型进行后端crud操作。然而,我认为这样的模型对于我的前端数据显示是没有意义的,比如来自不同表或加入不同表的按类别的新闻、新闻和博客小部件等 类bug扩展了Zend_Db_Table_抽象{ protected $_name = 'bugs'; } 建模这种方式非常适合我的后端管理面板crud操作,我如何为前端操作创建模型,任何示例都会受到高度赞赏。感谢我认为您在ZF中询问的是一个视图助手,它从您的模型中获取数据,并允许您将其转储到视图中,而无需在con中进行处

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

类bug扩展了Zend_Db_Table_抽象{

  protected $_name = 'bugs';   }

建模这种方式非常适合我的后端管理面板crud操作,我如何为前端操作创建模型,任何示例都会受到高度赞赏。感谢

我认为您在ZF中询问的是一个视图助手,它从您的模型中获取数据,并允许您将其转储到视图中,而无需在con中进行处理特罗勒。下面是一个简单的例子:

<?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;
    }

}

资历日期:
我是一个领导者:
交付日期:
我是检查员:
管理员登录:
最后,我称之为“局部视图”:

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

至于DbTable模型对前端没有用处,您可能会感到惊讶。一旦您在DbTable类中正确地建立了表之间的关系,它们所能做的功能就会提升。但是,如果您像大多数人一样,您可能至少会有一层域模型(,)在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...");
        }
    }

}

我认为在ZF中,您需要的是一个视图助手,它从您的模型中获取数据,并允许您将数据转储到视图中,而无需在控制器中进行处理。下面是一个简单的示例:

<?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;
    }

}

资历日期:
我是一个领导者:
交付日期:
我是检查员:
管理员登录:
最后,我称之为“局部视图”:

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

至于DbTable模型对前端没有用处,您可能会感到惊讶。一旦您在DbTable类中正确地建立了表之间的关系,它们所能做的功能就会提升。但是,如果您像大多数人一样,您可能至少会有一层域模型(,)在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_表
派生的模型,您也可以加入其他表。只需确保关闭完整性检查

代码(未测试)可能如下所示:

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\u Db\u适配器
实例,然后查询/连接他们需要的任何表。或者,我推出更复杂的ORM,如条令。

即使使用
Zend\u Db\u表
派生模型,也可以连接其他表。只需确保关闭完整性检查

代码(未测试)可能如下所示:

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\u Db\u适配器
实例,然后查询/连接他们需要的任何表。或者,我推出更复杂的ORM,比如条令。

我的意思是我仍然使用相同的DBTable类(用于后端)对于前端数据操作和显示?@Rajendra我想我们正在进行循环讨论。我发布了一个带有dbTable的编辑,该dbTable向控制器和视图提供数据。我的意思是,我是否仍然使用相同的dbTable类(用于后端)对于前端数据操作和显示?@Rajendra,我想我们正在进行循环讨论。我发布了一个带有dbTable的编辑,该dbTable向控制器和视图提供数据。我发现,根据定义的关系,Db_Table在没有大量连接的情况下做了合理的工作。而且Zend_Db从来就不是信条。两个完全不同的动物h不同的目的和范围。@RockyFord:Right on.
Zend_Db
并不声称是一个完整的ORM。它的功能很好:TableGateway;-)我承认我从未完全研究过关系功能。我得到的印象是,通过关系获取依赖行集会生成一个单独的查询。因此,获取和n呈现10篇文章(例如作者姓名),然后我会查看一个关于文章的查询,以及另外10个关于相关作者信息的查询。出于这个原因,我经常选择加入。但是如果我都很傻-很有可能!;-),那么我会再给ZDT看一眼。老实说,我还没有分析一个关系电话,所以我不确定。它确实感觉有点重,所以你可能会被拒绝ect关于它的作用。我发现在定义关系的情况下,Db_表在没有大量连接的情况下做了合理的工作。而且Zend_Db从来没有打算成为教义。两种完全不同的动物有着不同的目的和范围。@RockyFord:Right on.
Zend_Db
并不声称是一个完整的形式。它的作用很好:TableGatew是的。-)我承认我从来没有完全研究过关系功能。我得到的印象是,通过关系获取依赖行集会生成一个单独的查询。因此,获取并呈现10篇文章(使用作者姓名)