Php 如何在使用component Creator构建的Joomla 3.x组件的一个视图中包含多个模型

Php 如何在使用component Creator构建的Joomla 3.x组件的一个视图中包含多个模型,php,model-view-controller,joomla,components,dashboard,Php,Model View Controller,Joomla,Components,Dashboard,Joomla组件使用MVC模型。Component Creator是一种广泛使用的工具,其付费级别支持使用SQL导入创建多表视图。此外,开发人员根据Joomla文档从头开始构建组件 我想构建一个高级组件,作为一个“仪表板”来显示来自多个数据库表的数据,具有Joomla的所有管理员后端和访问者前端CRUD(创建、读取、更新、删除)功能。这意味着我需要同时从屏幕上显示的多个数据库表中绘制多个模型(根据MVC原理) Joomla建议在“控制器任务方法”中插入以下代码,以使信息可用: $view = $

Joomla组件使用MVC模型。Component Creator是一种广泛使用的工具,其付费级别支持使用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教程或从广泛使用和流行的component Creator工具构建的组件不兼容。组件调用时将无法加载页面,或者不会通过简单的复制将数据传递到视图,并粘贴到由组件创建者或Joomla hello world教程创建的多个控制器中的任何一个


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

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

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

  • /site/views/multiviewname/view.html.php(将模型传递给视图)
  • /site/views/multiviewname/tmpl/default.php(具有HTML模板)
这两者都需要更改,以便同时查看多个模型中的数据。假设您的所有其他视图、控制器和模型都已正确构建,并且在使用“Component Creator”工具时会自动构建,则此功能将正常工作。我的组件有数百个文件,包括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);
    }

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

您可以使用这个$model=JModel::getInstance('model_NAME','COMPONENT_NAME')调用任何模型内部视图$items=$model->getItems();使用->get('items')语法仅在视图中有效(因为get()是视图类的一个方法)@Amit-Ray
JModel
不起作用,但是
JModelLegacy
对Joomla 3.5.1起作用。当我使用
JModel
时,我在服务器日志中得到以下错误:
PHP致命错误:调用/var/www/html/components/com_componentname/views/multiviewname/view.html.PHP中未定义的方法JModel::getInstance()。JModelLegacy不会抛出错误,页面加载良好。对不起,我的错误,我忘记了遗留部分。但是这解决了问题吗?@Amit-Ray,
JModelLegacy
是正确的函数,而不是您建议的
JModel
。另外,我使用的不是您建议的
$items=$model->getItems()
,而是
$this->ItemsOtherModel=$this->get('items','model-b')。您的建议不会起作用,因为它没有指定要使用的实际模型,这是在使用默认模型之外的模型时的必要步骤。在这两方面,你的建议都没有解决问题。我的工作是给你指明方向。我模模糊糊记得的是我提出的建议。而谷歌则负责处理剩下的事情。