Php 如何在使用component Creator构建的Joomla 3.x组件的一个视图中包含多个模型
Joomla组件使用MVC模型。Component Creator是一种广泛使用的工具,其付费级别支持使用SQL导入创建多表视图。此外,开发人员根据Joomla文档从头开始构建组件 我想构建一个高级组件,作为一个“仪表板”来显示来自多个数据库表的数据,具有Joomla的所有管理员后端和访问者前端CRUD(创建、读取、更新、删除)功能。这意味着我需要同时从屏幕上显示的多个数据库表中绘制多个模型(根据MVC原理) Joomla建议在“控制器任务方法”中插入以下代码,以使信息可用: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 = $
$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模板)
<?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-RayJModel
不起作用,但是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')代码>。您的建议不会起作用,因为它没有指定要使用的实际模型,这是在使用默认模型之外的模型时的必要步骤。在这两方面,你的建议都没有解决问题。我的工作是给你指明方向。我模模糊糊记得的是我提出的建议。而谷歌则负责处理剩下的事情。