我试图覆盖
/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/ )
所以即使认为覆盖的路径在路径中,它也不会作为第一个被命中,而是原始组件中的文件被加载而不是覆盖。但是,我仍然不知道为什么会这样。任何帮助赞赏。
答案 0 :(得分:3)
帖子是9个月大,但我有同样的奇怪行为......麻烦在于com_media控制器...具体来说,组件将模板路径添加到第68行的路径列表中......
我删除了核心组件中的覆盖层。
答案 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/