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

Posted

技术标签:

【中文标题】将 Joomla 模块转换为在现有组件中查看【英文标题】:Converting a Joomla module to view in existing component 【发布时间】:2017-06-04 20:32:45 【问题描述】:

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

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

据我所知,前端视图应该先加载view.html.phpmetadata.xml。但是,view.html.php 上的代码似乎没有执行(正如在每行之前和之后使用 print 语句测试的那样)。下面是该文件的净化版本,它是 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>

【问题讨论】:

【参考方案1】:

您在视图文件中的类名错误。应该是

class YOUR_COMPONENT_NAMEViewDashboard extends JViewLegacy
       

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


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

查看此链接https://docs.joomla.org/J3.x:Developing_an_MVC_Component/Adding_a_view_to_the_site_part

【讨论】:

它实际上在文件中。我在发帖时忘记把那一点括号括起来。将更新原件以反映。【参考方案2】:

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

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

【讨论】:

以上是关于将 Joomla 模块转换为在现有组件中查看的主要内容,如果未能解决你的问题,请参考以下文章

Joomla 模块定位

如何将 Joomla 组件调用到模块中?

将对象从组件发送到模块 - Joomla

将 PHP 网站转换为 Joomla

如何在 Joomla 中将组件放入模块中!地点?

Joomla:一次安装组件和模块