转换 Joomla 模块以在现有组件中查看

Converting a Joomla module to view in existing component

我们有一个自定义的 Joomla!我们开发的组件,用于向我们的客户显示各种类型的报告。在管理后端,您将在所述组件中配置服务和报告。然后我们添加一个为每个客户量身定制的自定义模块,该模块指向报告并将其加载到其他空白页面中。

这对于必须根据客户偏好定制和几乎完全重新设计每个报告来说效果很好,但我们希望可以选择使用没有模块的视图来实现任何标准化。我已经开始将一种特定类型的报告转换为它自己的视图,并且管理员端设置没有问题。我 运行 遇到的问题是前端显示。

据我所知,前端视图应该先加载 view.html.phpmetadata.xml。但是,view.html.php 上的代码似乎没有执行(通过每行前后的打印语句进行测试)。下面是文件的净化版本,它是 XML。作为参考,我们是 运行 Joomla! 3.6.5.

PHP:

<?php
// No direct access to this file
defined('_JEXEC') or die;

// import Joomla view library
jimport('joomla.application.component.view');

class [ComponentName]ViewDashboard extends JViewLegacy
{       

    public function display($tpl = null)
    {
        /*[Large code block here, removed for sanitization]*/
        parent::display($tpl);
    }

}
?>

XML:

<?xml version="1.0" encoding="utf-8"?>
<metadata>
    <!-- View definition -->
    <view title="Dashboard">
        <!-- Layout options -->
        <options>
            <!-- Default layout's name -->
            <default name="Dashboard" />
        </options>
    </view>
</metadata>

您在视图文件中的 class 名称有误。应该是

class YOUR_COMPONENT_NAMEViewDashboard extends JViewLegacy
{       

    public function display($tpl = null)
    {
        /*[Large code block here, removed for sanitization]*/
        parent::display($tpl);
    }

}

将 YOUR_COMPONENT_NAME 替换为您的组件名称。

勾选这个linkhttps://docs.joomla.org/J3.x:Developing_an_MVC_Component/Adding_a_view_to_the_site_part

成功了。尽管存在其他逻辑,但我必须在前端添加一个模型才能显示。清理后的文件如下,在 root\components\com_ComponentName\models\modelName.php 中,其中模型名称与视图匹配。

<?php
// No direct access to this file
defined('_JEXEC') or die('Restricted access');
ini_set('memory_limit','1024M');

// import Joomla modelitem library
jimport('joomla.application.component.modelitem');


class ComponentNameModelDashboard extends JModelItem
{

    protected function populateState()
    {
        // Load the parameters.
        //print_r(JFactory::getApplication()->getParams());
        $this->setState('params', JFactory::getApplication()->getParams());
        parent::populateState();
    }

    public function getItem()
    {
        if (!isset($this->item)) 
        {
            $params    = clone $this->getState('params');
            $params->merge($this->item->params);
            $this->item->params=$params;
            $params = new JRegistry;
            $params->loadString($this->item->params,'JSON');
            $report=$params['report'];
            $db    = JFactory::getDbo();
            $query = $db->getQuery(true);
            $query->select('*')
                  ->from('#__DBTABLEHERE')
                  ->where('dashboard_name=\'' . (string)$report.'\'');
            $db->setQuery((string)$query);
        }
        return $this->item;
    }
}