我在模板文件的顶部使用$doc->addScript
来添加我的脚本(和jquery
),但之前会添加组件。
我可以控制此输出队列吗?
答案 0 :(得分:1)
我正在为Joomla 3.3.x
写这篇文章不幸的是,如果没有黑客攻击核心文件(不要这样做!!)或者使用自己的实现进行javascript添加,这是不可能的。
如果你看一下[joomlaroot] \ libraries \ joomla \ document \ document.php - >第446行,其中定义了函数addScript,您将看到,JDocument中的_scripts-Array是一个assoc。数组,其中键是脚本的URL。
如果您不想重写在系统中添加脚本和每个已安装扩展程序的joomla方法,则应在<<>之后在模板中添加javascripts。 jdoc:include type =" head" >
You could write a system-plugin,使用事件" onBeforeCompileHead"重新排序文档脚本,但我认为这太多了。
我不知道,为什么joomla不会简单地在addScript()中使用sort-attribute,这是非常需要的。还可以实现脚本依赖性。即使是Wordpress也可以做到这一点。
编辑:您可以做的是使用JDocument::addCustomTag()在joomla脚本之后添加脚本。因为自定义标记是在所有脚本之后呈现的。虽然这不会影响其他组件已经加载的脚本的顺序。
答案 1 :(得分:1)
您不需要使用foreach循环。
对于Joomla 2.5:在你的模板中index.php如果你想要添加一个脚本,请添加以下内容,例子显示包含jquery:
$headData = $this->getHeadData();
reset($headData['scripts']);
$newHeadData = $headData['scripts'];
$jquery = array('http://code.jquery.com/jquery-1.9.1.min.js' => array('mime' => 'text/javascript', 'defer' => FALSE, 'async' => FALSE));
$newHeadData = $jquery + $newHeadData;
//$some_other_script = array("path-to-your-script" => array('mime' => 'text/javascript', 'defer' => FALSE, 'async' => FALSE));
//$newHeadData = $some_other_script + $newHeadData;
$headData['scripts'] = $newHeadData;
$this->setHeadData($headData);
对于Joomla 3.3:这可能与Joomla 2.5的工作方式相同,因为函数getHeadData()和setHeadData()仍然存在。请参阅API文档:http://api.joomla.org/cms-3/classes/JDocumentHTML.html
答案 2 :(得分:0)
您需要修改模板的index.php
文件。以下内容包括Joomla's head section:
<jdoc:include type="head"/>
只需在此之后(或之前)移动$doc->addScript
即可先设置哪些加载。文件从上到下加载,因此顶部的任何内容都将首先加载。
答案 3 :(得分:0)
这可以做到,但有点棘手。以下代码基于https://gist.github.com/AmyStephen/5971447
$head = JFactory::getDocument()->getHeadData();
$scripts = $head['scripts'];
$newScripts = array();
foreach ($scripts as $key => $value)
{
if (/** test to reorder the scripts */)
{
$newScripts[$key] = $value;
}
}
$head['scripts'] = $newScripts;
JFactory::getDocument()->setHeadData($head);
换句话说,脚本存储为数组,您需要重新排序。