如何在magento中重写head.phtml

时间:2014-06-23 19:18:42

标签: php magento templates

我想在magento中更改页面标题。 在我的app/design/frontend/default/customPackage/template/page/html/head.phtml中,有一些行控制所有页面标题(我想要修改目录页面的标题)

<title>
<?php 
     if ($current_product = Mage::registry('current_product')) { 
        echo substr($current_product->getName() . " - " . Mage::helper('core')->currency($current_product->getFinalPrice(), true, false),0,69);
    } else {

        echo substr(str_replace("- Products","",$this->getTitle()),0,100);
    }
     ?></title>

但我不想直接从app/design/frontend/default/customPackage/template/page/html中的head.phtml进行修改,相反,我想在我自己的模块tempate文件中将此head.phtml替换为另一个head.phtml 。让我们说,改为app/design/frontend/default/customPackage/template/catalog/html/head.phtml

1 个答案:

答案 0 :(得分:2)

要回答您的问题,我们基本上需要找到page/html/head.phtml文件的定义位置。答案是布局文件,更具体地说是page.xml。位置是:app/design/frontend/<your_package>/<your_theme>/layout/page.xml。在该文件中,在句柄<default>下,您可以看到

<default translate="label" module="page">
    <label>All Pages</label>
    <block type="page/html" name="root" output="toHtml" template="page/3columns.phtml">

        <block type="page/html_head" name="head" as="head">
            <action method="addJs"><script>prototype/prototype.js</script></action>
            <action method="addJs"><script>lib/ccard.js</script></action>
            <action method="addJs"><script>prototype/validation.js</script></action>
            <action method="addJs"><script>scriptaculous/builder.js</script></action>
            -------
        </block>
         ---------
    </block>
</default>

其中

  • <default>称为布局处理程序。这块之下的块 处理程序将在magento的每个页面中显示。

  • page/html是您的根块。它是所有其他块的父块。每页只应有一个根块。您可以在自定义布局文件中使用其名称root引用此块,以便更改此块中的任何内容。

  • page/html_head是您问题中引用的块。此块用于保存页面的<head />部分(就html树而言)。您可以看到magento在此块中加载了一些核心javascripts和css。

page/html_head未使用您已经看到的任何模板设置。那么page/html/head.phtml如何来看?它应该设置在magento的某个地方。因此,让我们进入该块的后端,其中定义了所有块方法。文件位置为app/code/core/Mage/Page/Block/Html/Head.php。是的,我们发现了它。

class Mage_Page_Block_Html_Head extends Mage_Core_Block_Template
{
/**
 * Initialize template
 *
 */
protected function _construct()
{
    $this->setTemplate('page/html/head.phtml');
}
 ------
}

所以Magento通过page/html_head方法在此设置了_construct()块的模板。将其更改为您的模板位置

 protected function _construct()
 {
    $this->setTemplate('app/design/frontend/default/customPackage/template/catalog/html/head.phtml');
 }

现在,它会将page/html_head块的位置设置为您的自定义模板文件。

如果您希望块文件也不受影响,可以使用自己的模块重写此块文件。在config.xml文件中,您应该使用此

<config>
    <global>
        <blocks>
            <page>
                <rewrite>
                    <html_head>Namespace_Modulename_Block_Html_Head</html_head>
                </rewrite>
            </page>
        </blocks>
    </global>
</config>

您应该在app/code/local/Namespace/Moduleame/Block/Html/Head.php

中定义一个块文件
<?php
class Namespace_Modulename_Block_Html_Head extends Mage_Page_Block_Html_Head 
{
     protected function _construct()
     {
        $this->setTemplate('app/design/frontend/default/customPackage/template/catalog/html/head.phtml');
     }
}

这样核心文件就不会受到影响,你仍然可以改变模板路径。