题
如何为所有类别页面创建默认类别元标题?
我希望它是这样的:
<title>{{category name}} - blah blah blah blah</title>
我希望它是仅用于类别页面的默认值。
这可能吗?
解决方案
在head.phtml
if (Mage::registry(current_category)) {
echo '<title> Categoryname- keyword1 keyword2 keyword3"';
}
.
编辑
据我所知,Mage::registry('current_category')
可用于检查我们是否在类别中。请参阅 Alanstorm的答案 。该答案的重要部分是在下面添加参考文献
Magento的当前版本在某些页面上注册了某些全局变量(不是PHP全局,而是全局到Magento System的东西)。
调用以下
$category = Mage::registry('current_category');
$product = Mage::registry('current_product');
$product = Mage::registry('product');
.
如果尚未设置对象(即,您在没有类别或产品的页面上,则将返回null,或者返回类别和产品对象。
如果将产品对象返回,则在产品页面上。
如果没有返回产品对象,但类别对象是,您在类别页面上。
然后您可以打印您想要的内容。
其他提示
执行此操作的最干净的方法是观察事件 controller_action_layout_generate_blocks_after
.所以你的模块的重要部分(Namespace_Module
)将是
档案 : app\code\local\Namespace\Module\etc\config.xml
<config>
<frontend>
<events>
<controller_action_layout_generate_blocks_after>
<observers>
<change_category_page_title>
<class>namespace_module/observer</class>
<method>setCategoryPageTitle</method>
</change_category_page_title>
</observers>
</controller_action_layout_generate_blocks_after>
</events>
</frontend>
</config>
在这里,我们正在注册事件的观察者 controller_action_layout_generate_blocks_after
.在布局生成每个块后,此特定事件将被触发。所以在这个特定的时间,我们可以访问布局中的每个块。我们在这里感兴趣的区块是 head
块(即 Mage_Page_Block_Html_Head
).这个街区保存着 title
元素。
档案 : app\code\local\Namespace\Module\Model\Observer.php
<?php
class Namespace_Module_Model_Observer
{
const CATEGORY_TITLE_CONSTANT = 'blah blah blah blah';
public function setCategoryPageTitle(Varien_Event_Observer $observer)
{
//ensure modification applies only for category page.
if (Mage::registry('current_category')) {
//get head block
$head = $observer->getLayout()->getBlock('head');
$title = $this->_prepareCategoryTitle();
//set new title
$head->setTitle($title);
}
}
protected function _prepareCategoryTitle()
{
return Mage::registry('current_category')->getName()
. '-'
. self::CATEGORY_TITLE_CONSTANT;
}
}
这是我们的观察者类。将改变类别标题的方法是 setCategoryPageTitle()
.这个函数的作用很简单。它确保我们在一个类别页面。然后它会抓住 head
块并设置新标题。要设置一个新的标题,我们正在使用一个受保护的函数 _prepareCategoryTitle()
.我根据这个问题的需要定义了这个函数。目前它将返回 category name + blah blah blah
.因此,您可以根据需要更改此方法并更改标题。
注:这里没有核心编辑,没有默认模板的交替.那就是 为什么这是更清洁的方法。
基本上,来自类别的元标题字段的页面标题。
为了您的要求,您需要重写类 Mage_Catalog_Block_Category_View
在那里,您需要使用检查头块检查当前标题 getTitle() value
和 reset it value to default
当它有任何价值的时候。
重写类:
<?php
class Dev_AmitCatalog_Block_Catalog_Category_View extends Mage_Catalog_Block_Category_View
{
protected function _prepareLayout()
{
parent::_prepareLayout();
$this->getLayout()->createBlock('catalog/breadcrumbs');
if ($headBlock = $this->getLayout()->getBlock('head')) {
$category = $this->getCurrentCategory();
if (!$headBlock->getTitle()) {
$headBlock->setTitle($category->getName().' - blah blah blah blah');
}
}
}
配置。xml:
<global>
....
<blocks>
<amitcatalog>
<class>Dev_AmitCatalog_Block</class>
</amitcatalog>
<catalog>
<rewrite>
<category_view>Dev_AmitCatalog_Block_Catalog_Category_View</category_view>
</rewrite>
</catalog>
</blocks>
.....
</global>