我会保持这个简单....在我的产品页面上我需要删除prototype.js文件并将其替换为最新版本的原型。到目前为止,使用local.xml我已成功使用它替换它:
<action method="removeItem"><type>js</type><name>prototype/prototype.js</name></action>
<action method="addJs"><script>prototype/prototype-new.js</script></action>
问题是现在原型被加载到其他所有阻止它工作的包含之下。
有没有办法设置JavaScript的顺序包括使用local.xml而不必再删除和添加每个文件?
答案 0 :(得分:44)
你可以使用params元素,其中包含“data-group”HTML属性,Magento会在没有设置“params”的任何项目之后设置带有“params”的项目。您可以在主题中使用local.xml来确保这些元素的顺序(我建议让Magento首先添加其标准文件):
<action method="addJs">
<script>prototype/javascript0.js</script>
<params><![CDATA[data-group="js002"]]></params>
<!-- creates first group js002 -->
</action>
<action method="addJs">
<script>prototype/javascript1.js</script>
<params><![CDATA[data-group="js002"]]></params>
<!-- appends to created group js002, after javascript0 -->
</action>
<action method="addJs">
<script>prototype/javascript2.js</script>
<params><![CDATA[data-group="js001"]]></params>
<!-- creates first group js001 -->
</action>
<action method="addJs">
<script>prototype/javascript3.js</script>
<params><![CDATA[data-group="js001"]]></params>
<!-- appends to created group js001, after javascript2 -->
</action>
<action method="addJs">
<script>prototype/javascript4.js</script>
<params><![CDATA[data-group="js002"]]></params>
<!-- appends to created group js002, after javascript1 -->
</action>
<action method="addJs">
<script>prototype/javascript5.js</script>
<!-- no params supplied, will be rendered before any groups -->
</action>
设置“params”的元素的顺序仅由执行操作的顺序决定。项目按“params”的值进行分组,因此一旦组“js001”由第一个动作(javascript2.js)定义,具有相同组名的连续动作将附加到该组,等等。
在上面的示例中,渲染顺序为:
使用addItem addJs,addCss等添加的项目以相同的方式进行威胁,但它们的类型不同(并且将相应地进行超级分组)类型(请参阅下面的顺序),超级组中的每个组在内部排序为上面解释过:
答案 1 :(得分:1)
Mage_Page_Block_Html_Head $ _data;保存这些项目的数组,所以我猜你可以为自己的利益过滤它。默认方法不允许定义添加项的顺序。
答案 2 :(得分:1)
我意识到这篇文章很老了,但我在研究这个问题时偶然发现了它,所以我想为什么不这样做。
不确定这是否是最优雅的解决方案,但它对我们来说效果非常好。
我基本上在我的local.xml
中创建了一个新块,如下所示:
<block type="core/template" name="prehead" template="page/html/prehead/main.phtml" />
然后修改我的主要布局(1column.phtml和朋友)来包含这个:
<head>
<?php echo $this->getBlockHtml('prehead') ?>
<?php echo $this->getChildHtml('head') ?>
</head>
在main.phtml
中,我添加了我想首先加载的JS
<script type='text/javascript' src='<?php echo $this->getSkinUrl('js/require.js', array('_secure'=>true)); ?>'></script>
<script type='text/javascript' src='<?php echo $this->getSkinUrl('js/main.js', array('_secure'=>true)); ?>'></script>
这对我们来说也很方便,因为它仍然允许我们通过在local.xml
中执行类似的操作来改变main.js,具体取决于我们所在的页面:
<checkout_onestep_index translate="label">
<label>One Step Checkout</label>
<block type="core/template" name="prehead" template="page/html/prehead/checkout.phtml" />
</checkout_onestep_index>
希望它可以帮助碰巧偶然发现的人。
-Ken
答案 3 :(得分:0)
由于magento系统最后加载了 local.xml ,所以最后提到的xml被合并了。这可能是您的新原型加载到其他脚本之下的原因。
或者,您可以覆盖 Mage_Page_Block_Html_Head :: getCssJsHtml()方法并使用它。
感谢
答案 4 :(得分:0)
好的,这是我的解决方案。 首先将app \ code \ core \ Mage \ Page \ Block \ Html \ head.php复制到app \ code \ local \ Mage \ Page \ Block \ Html \ head.php
然后将此函数添加到文件中:
public function replaceItem($type, $name, $replace)
{
$newArray = array();
foreach($this->_data['items'] as $key => $value) {
if($key == $type.'/'.$name) {
$newArray[$type . '/'. $replace] = array(
'type' => $type,
'name' => $replace,
'params' => $value['params'],
'if' => $value['if'],
'cond' => $value['cond']);
} else {
$newArray[$key] = $value;
}
}
$this->_data['items'] = $newArray;
return $this;
}
现在,您的.XML布局文件中包含如下所示的行:
<action method="replaceItem"><type>js</type><name>prototype/prototype.js</name><replace>onestepcheckout/prototype/prototype.js</replace></action>
参数与removeItem完全相同但现在替换文件将被注入到与原始文件相同位置的列表中。它还将继承相同的参数,if和cond值。请仔细使用此代码,因为我刚刚编写并完成了基本测试!
答案 5 :(得分:0)
我认为Barny Shergold的解决方案是最正确的,但关于避免更改核心文件的评论是正确的。为了充分利用这两个方面,您可以在扩展Mage_Page_Block_Html_Head类的模块中实现Barny的解决方案,如下所示:
Yourcompany / Layouthelper的/ etc / config.xml中
<?xml version="1.0"?>
<config>
<modules>
<Yourcompany_Layouthelper>
<version>0.0.1</version>
</Yourcompany_Layouthelper>
</modules>
<global>
<blocks>
<page>
<rewrite>
<html_head>Yourcompany_Layouthelper_Block_Html_Head</html_head>
</rewrite>
</page>
</blocks>
</global>
</config>
Yourcompany / Layouthelper /砌块/ HTML / Head.php
class Yourcompany_Layouthelper_Block_Html_Head extends Mage_Page_Block_Html_Head {
public function replaceItem($type, $name, $replace) {
$newArray = array();
foreach($this->_data['items'] as $key => $value) {
if($key == $type.'/'.$name) {
$newArray[$type . '/'. $replace] = array(
'type' => $type,
'name' => $replace,
'params' => $value['params'],
'if' => $value['if'],
'cond' => $value['cond']);
} else {
$newArray[$key] = $value;
}
}
$this->_data['items'] = $newArray;
return $this;
}
}
答案 6 :(得分:0)
jquery与magento中的Prototype冲突:
最简单的解决方案是在主jquery文件的末尾添加。
jQuery.noConflict();
或者创建自定义js文件并添加此行,并在主js之后包含此文件。