如何在一个视图中包含多个模型,以便在使用组件创建器构建的Joomla 3.x组件中


How can I include multiple models in one view for in a Joomla 3.x component built with Component Creator

Joomla组件使用MVC模型。组件创建器是一种广泛使用的工具,其付费级别支持使用SQL导入创建多表视图。此外,开发人员根据Joomla文档从头开始构建组件。

我想构建一个高级组件,它充当"仪表板",显示来自多个数据库表的数据,具有Joomla的所有管理员后端和访问者前端CRUD(创建,读取,更新,删除(功能。这意味着我需要从屏幕上同时显示的多个数据库表中绘制多个模型(来自 MVC 哲学(。

Joomla文档建议将以下代码插入到"控制器任务方法"中以使信息可用:

$view = $this->getView( 'model-a', 'html' );
$view->setModel( $this->getModel( 'model-a' ), true );
$view->setModel( $this->getModel( 'model-b' ) );
$view->display();

然后使用视图中显示方法调用这些模型:

$item1 = $this->get( 'data1' );
$item2 = $this->get( 'data2', 'model-b' );

但是,Joomla文档中提供的这些说明不足或与遵循提供的Joomla Hello World教程或从广泛使用和流行的组件创建工具构建的组件时构建的组件不兼容。组件在调用时将无法加载页面,或者不会通过简单的复制将数据传递到视图,并将其粘贴到组件创建者或Joomla hello world教程创建的多个控制器中的任何一个中。

如何在同一视图中为 Joomla 3.X 组件调用多个模型?

通过在两个视图文件中直接调用正确形成的模型,我能够成功地使用同一视图中的多个模型。我没有遵循Joomla文档,因为我没有修改任何可能的控制器(一个是整个组件的控制器,另一个是特定于视图的控制器(。我也没有使用Joomla文档中提供的函数,因为这些函数会产生错误。

根据正确的Joomla MVC约定,视图由相关视图目录和子文件夹中的两个文件创建:

    /
  • site/views/multiviewname/view.html.php(将模型传递给视图(
  • /
  • site/views/multiviewname/tmpl/default.php(包含 HTML 模板(

这两者都需要更改才能同时查看来自多个模型的数据。假设所有其他视图、控制器和模型都已正确构建,就像使用"组件创建器"工具时自动完成的那样,这是有效的。我的组件有数百个文件,包括 css、后端管理、安装、语言等。所有这些都是使用组件创建器工具在瞬间构建的。

精简但仍然功能齐全的代码如下:

/

site/views/multiviewname/view.html.php

<?php
jimport('joomla.application.component.view');
class ComponentnameViewMultiviewname extends JViewLegacy
{
//  $items is for the default model
    protected $items;
//  $ItemsOtherModel is for second model. Notice the '$' used here but not elsewhere   
    protected $ItemsOtherModel;
    public function display($tpl = null)
    {
        $app = JFactory::getApplication();
        $this->state = $this->get('State');
        $this->items = $this->get('Items');
        $this->pagination = $this->get('Pagination');
        $this->params     = $app->getParams('com_componentname');
//  sets default model
        $this->setModel( $this->getModel( 'model-a' ), true );
//  sets second model & uses 'JModelLegacy,' contrary to documentation
        $this->setModel(JModelLegacy::getInstance('model-b', 'componentnameModel'));
//  assigns array from the second model to 'ItemsOtherModel.' there is no '$' sign used.
        $this->ItemsOtherModel = $this->get('Items','model-b');
        parent::display($tpl);
    }
}
/

site/views/multiviewname/tmpl/default.php

<?php
echo "<h3>Items from default model</h3> ";
echo var_dump($this->items);
echo "<h3>items from secondary model</h3> ";
//  notice that the '$' is absent from 'ItemsOtherModel'
echo var_dump($this->ItemsOtherModel);

这一突破只有在经过几天的研究之后才有可能。付费的组件创建器工具非常宝贵,可以让我开始使用符合Joomla MVC组件标准的格式良好的代码。在处理和检查所有文件数天后,我在这个 google groups 线程中找到了我需要的提示,引起了我对 JModelLegacy 类的注意,该类是在搜索 google 搜索 PHP 错误消息中的术语时发现的,PHP Notice: Undefined index:尝试使用官方记录的方法时留在我的服务器上。

在浏览器中呈现的此页面只是将所有信息从数据库表转储到页面中,但进一步的开发可以创建我最终需要的格式化和功能仪表板。

此代码用于显示信息列表,而不是多个单个项目。用于将多个模型添加到一个视图的 Joomla 文档是为多个单个项设置的,而不是此处显示的项数组。