管理员覆盖Joomla 3

时间:2014-04-02 13:35:44

标签: joomla joomla3.0

我试图覆盖

/administrator/components/com_media/views/imageslist 

进行更加用户的显示,因为当文件夹中有大量大图像时,列表加载速度非常慢。但是,我无法使覆盖工作: 我复制了文件

/administrator/components/com_media/views/imageslist/tmpl/default.php and 
/administrator/components/com_media/views/imageslist/tmpl/default_image.php 

/administrator/templates/isis/html/com_media/imageslist

isis已设置为安装中的默认管理模板。在管理员(在iframe中)显示com_media时,使用以下URL:

/administrator/index.php?option=com_media&view=imagesList&tmpl=component&folder=

但它总是直接从com_media使用文件加载,而不是从模板覆盖加载。 (我注意到视图显示imagesList,而文件夹名称是imageslist)。它可能只是joomla中的一个错误。有什么想法吗?

尊重Jonas

编辑:试图深入挖掘这一点。似乎当JViewLegacy调用loadtemplate时,路径看起来像这样:

Array ( 
[0] => /home/XXX/www/administrator/components/com_media/views/imageslist/tmpl/ 
[1] => /home/XXX/www/administrator/templates/isis/html/com_media/imageslist/ 
[2] => /home/XXX/www/administrator/components/com_media/views/imageslist/tmpl/ )

所以即使认为覆盖的路径在路径中,它也不会作为第一个被命中,而是原始组件中的文件被加载而不是覆盖。但是,我仍然不知道为什么会这样。任何帮助赞赏。

3 个答案:

答案 0 :(得分:3)

帖子是9个月大,但我有同样的奇怪行为......麻烦在于com_media控制器...具体来说,组件将模板路径添加到第68行的路径列表中......

https://github.com/joomla/joomla-cms/blob/master/administrator/components/com_media/controller.php#L68

我删除了核心组件中的覆盖层。

答案 1 :(得分:1)

这非常有趣,我认为它与使用组件格式而不是html格式有关...如果你看一下插件,你会看到链接看起来像这样:

$link = 'index.php?option=com_media&view=images&tmpl=component&e_name=' . $name . '&asset=' . $asset . '&author=' . $author;

事实上,tmpl = component意味着它不会使用index.php,它将使用component.php。

我没有进一步挖掘代码,但我认为覆盖不会因此而起作用。

答案 2 :(得分:0)

对于com_media覆盖,我解决此问题的一种方法是创建一个带有onAfterRoute()事件处理程序的系统插件,以捕获和评估请求URL参数。然后我可以设置模板覆盖路径并为我的视图和模板使用include。我在/plugins/system/mycommedia/mycommedia.php中的示例系统插件代码,

// no direct access
defined ( '_JEXEC' ) or die ( 'Restricted access' );

jimport('joomla.plugin.plugin');

class plgSystemMyComMedia extends JPlugin { 

    public function onAfterRoute() {

        if('com_media' == JRequest::getCMD('option')) {

            $view = JRequest::getCMD('view');

            if (('images' == $view) || ('imageslist' == $view)) {

                $overridePath = FOFPlatform::getInstance()->getTemplateOverridePath('com_media', true) . '/' . $view;

                require_once $overridePath . '/view.html.php';
            }
        }
    }
}

此版本的onAfterRoute()函数显示了如何仅对后端(admin)视图和模板应用覆盖。

public function onAfterRoute() {

    $app = JFactory::getApplication();

    if ($app->isAdmin()) {

        if('com_media' == JRequest::getCMD('option')) {

            $view = JRequest::getCMD('view');

            if (('images' == $view) || ('imageslist' == $view)) {

                $overridePath = FOFPlatform::getInstance()->getTemplateOverridePath('com_media', true) . '/' . $view;

                require_once $overridePath . '/view.html.php';
            }
        }
    }
}

通过将com_media组件复制到模板文件夹中来创建新的自定义模板和视图。例如,如果要为管理员isis模板自定义媒体管理器:

拷贝 /管理员/组件/ com_media /视图/图像 至 /管理员/模板/ ISIS / HTML / com_media /图像

拷贝 /管理员/组件/ com_media /视图/ imageslist 至 /管理员/模板/ ISIS / HTML / com_media / imageslist

然后修改view.html.php的两个副本以包含其各自的默认模板副本。

在显示功能结束时,注释或替换,

parent::display($tpl);

使用模板副本的include指令

include( dirname(__FILE__) . '/tmpl/default.php');

同时在imageslist默认模板中注释或替换loadTemplate('folder')和loadTemplate('image')函数调用,以包含其各自的文件和文件夹默认模板副本。

例如,在/administrator/templates/isis/html/com_media/imageslist/tmpl/default.php

<?php for ($i = 0, $n = count($this->folders); $i < $n; $i++) :
    $this->setFolder($i);
    //echo $this->loadTemplate('folder');
    include( dirname(__FILE__) . '/default_folder.php');
endfor; ?>

<?php for ($i = 0, $n = count($this->images); $i < $n; $i++) :
    $this->setImage($i);
    //echo $this->loadTemplate('image');
    include( dirname(__FILE__) . '/default_image.php');
endfor; ?>

现在将加载com_media视图和模板而不是核心对应项,并且可以自定义而不会破解任何核心Joomla文件。

更多信息@ http://jimfrenette.com/joomla/customizing-joomla-media-manager/