通过上一节,我们知道了如何去找到需要修改、编辑的页面的相关模板文件;同样,在第二节中,我们知道Magento网页页面是通过block(区块)来输出内容的,其中结构区块(Structural Block)描绘了整天页面的布局,而内容区块(Content Blocks)则是决定了各个结构区块里的具体内容。这里可以简单的认为结构区块由.xml文件决定,而内容区块由.phtml文件来决定。
这里同样用header.phtml讲解,通过后台设置查看页面文件路径(见下图),可以看出,被header.phtml包围的有:form.mini.phtml、links.phtml、languages.phtml等文件。
打开对应路径的header.phtml文件,可以看到如<?php echo $this->getChildHtml(‘topSearch’) ?>这样的代码行,想要知道这行代码有什么作用,把它删了刷新页面就可以知道,很明显,原来在网页头部的搜索栏不见了,也就是说刚刚删除的代码,就是控制搜索栏输出的作用。对应上图4-1中的文件就知道是form.mini.phtml了,要修改搜索栏,修改这个文件即可。
然而,<?php echo $this->getChildHtml(‘topSearch’) ?>这行代码是怎么与form.mini.phtml这个文件对应起来的呢?上边说过,.phtml文件决定网页输出的内容,那么.xml件就是决定.phtml文件在哪里输出。我们新建的模板里,没有.xml文件,那么系统调用的当然就是base目录里头的文件了,…\app\design\frontend\base\default\layout 目录里,就是我们的内容区块配置文件。
要在那么多.xml文件里找到有关form.mini.phtml、topSearch的文件,对在不了解相关文件的基础上来说很难,于是之前说过的用Dreamweaver的好处就显现出来了,Ctrl+F打开Dreamweaver的搜索功能框查找:topSearch,选择搜索范围搜索源代码,并点击”查找全部“。
在搜索结果里,由于新建模板(imweb模板)里没有.xml文件,所以我们要找的应该是base目录里的.xml文件。于是可以看到如下图,就有我们要找的文件catalogsearch.xml。
打开catalogsearch.xml文件可以看到:
<reference name="header">
<block type="core/template" name="top.search" as="topSearch" template="catalogsearch/form.mini.phtml"/>
</reference>
没错,就是这一句把.xml和.phtml文件联系起来的。
在一个.phtml里包含另一个.phtml,除了在.xml里声明外,其实也可以直接在第一个.phtml里边调用另一个.phtml,方法如下:
一般的方法是直接用require_once或者include_once()包含引用phtml文件:
<?php require_once “html/page.phtml”; ?>
还可以用如以下代码调用:
<?php echo $this->getLayout()->createBlock('catalog/navigation')->setTemplate('catalog/navigation/catalog.phtml')->toHtml();?>
除了以上的block还有一种静态区块(static block),也就是在后台CMS->Static Blocks,点击Add New Block按钮添加一个静态区块:Block Title:static-blocks01、Identifier:static-blocks01、Store View :All Store Views、Status:enabled…(如下图)。
新建完静态block,接下来就是在.phtml中调用了,有以下方法:
1.如果要在.phtml文件中直接调用这个静态块,那可以采用以下方法
<?php $block = Mage::getModel(‘cms/block’)->setStoreId(Mage::app()->getStore()->getId())->load(‘static-blocks01′);
$content = $block->getContent(); // Block的原始内容已经获得
$processor = Mage::getModel(‘core/email_template_filter’);
echo $html = $processor->filter($content);
?>
Mage::getModel(‘core/email_template_filter’)->filter()是必须的,因为Static Block里可能包含Magento的模板语言(如:{{store url=””}}),fiter将翻译成实际的值
Magento中调用静态Block主要有两个地方。
是否感觉这代码太长了呢,那你还可以这么写
<?php echo $this->getLayout()->createBlock(‘cms/block’)->setBlockId(‘order_form’)->toHtml() ?>
2.在CMS页面的Content中调用这个静态块呢?你可以采用以下方法
{{block type=”cms/block” name=”cms_ static-blocks01 _block” block_id=” static-blocks01 ″ }}
3.在layout中调用静态块
<reference name=”footer”>
<block type=”cms/block” name=” static-blocks01 ″ before=”-”>
<action method=”setBlockId”><block_id> static-blocks01 </block_id></action>
</block>
</reference>