如何后处理<jdoc:include type="head"/比;在PHP中


How to post-process <jdoc:include type="head" /> in PHP

初始问题:

我正在使用一个特殊的Joomla插件,它在很多方面都很好。然而,它添加了一堆Javascript到我的<head>元素,我不希望。(我绝不是从哲学上反对使用Javascript插件。只是插件的Javascript输出很糟糕。也许在一般情况下还不错,但它破坏了我试图用我的网站做的事情。不管怎样,我要跑题了。我会控制它的

所以我的解决方案是,我想控制什么<jdoc:include type="head" />包含在我的页面。我想去掉Javascript中不好的部分。但如何?

我的第一次尝试:

如果不了解Joomla,我对PHP相当了解,我最初的想法是…"啊哈!输出缓冲!"

我在<jdoc:include type="head" />之前添加了<?php ob_start(); ?>到我的模板,然后做了一点ob_get_contents()的东西。当然,这只是捕获字符串'<jdoc:include type="head" />'。这只是后来的事;在模板完成运行之后,jdoc包含将被处理。愚蠢的我。

那么我该怎么把这些垃圾去掉呢?

为了防止javascript-Tags的输出,您必须在<jdoc:incldue type="head" />之前取消模板中$this->_scripts的正确成员。例如,如果Joomla头添加了<script type="text/javascript" src="/media/jui/js/jquery.min.js"></script>,那么在它之前添加以下php代码:

unset($this->_scripts['/media/jui/js/jquery.min.js']);

Try var_dump($this->_scripts;查看其中的所有成员

回答自己的问题;

首先,复制/libraries/joomla/document/html/renderer/head.php/templates/MYTEMPLATE/renderer_head.php

然后改变/templates/MYTEMPLATE/renderer_head.php中的fetchHead方法来抑制我不想要的部分。

最后,在/templates/MYTEMPLATE/index.php中,在顶部附近添加以下行:

require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'renderer_head.php';

考虑到你"对PHP很了解",我建议不要使用这样的hack,因为它很可能在Joomla的未来更新中被破坏。

所有的插件都是php,你可以编辑它,而不是创建一个覆盖来取代一个相当核心的文件。

如果你不想编辑原始插件,创建一个捕获各种系统触发器/事件的插件也很容易。Joomla Doc's有一个完整的插件开发类别。

我会想象一个System插件,处理渲染或头部事件将是陷阱的地方,即onAfterRender, onBeforeRenderonBeforeCompileHead

或者你可以尝试这样一个插件"Skyline Script Remover"从Joomla扩展目录,在这个搜索中找到。