在Magento中以编程方式确定是否在产品页面上

时间:2010-06-14 23:00:00

标签: php magento

我想在Magento网站的所有页面上插入跟踪代码,如果页面是CMS页面,类别浏览页面或产品视图页面,则需要使用不同的语法。我有一个自定义模块设置了一个块,现在在每个页面上插入一个通用的跟踪代码。在块内,如何区分CMS页面,类别页面和产品页面?

我开始时:

Mage::app()->getRequest();

我可以看到

Mage::app()->getRequest()->getParam('id');

返回产品和类别页面上的产品或类别ID,但不区分这些页面类型。

Mage::app()->getRequest()->getRouteName();

为CMS页面返回“cms”,但返回类别浏览和产品视图页面的“目录”,因此我无法使用它来区分类别和产品页面。

我可以安全使用请求中的某些指示符吗?或者是否有更好的方法来实现针对不同页面类型的不同跟踪代码的目标?

4 个答案:

答案 0 :(得分:32)

最简单的答案如下:

<?php
echo $this->getRequest()->getControllerName();
if($this->getRequest()->getControllerName()=='product') //do something
if($this->getRequest()->getControllerName()=='category') //do others
?>

这是100%根据MVC模型做的正确方法,请查看核心代码真正了解它,并且不要给方法加载或依赖于注册表方法。支持mytraining.net,即使我不在那里。

答案 1 :(得分:25)

使用路由器可能有更好的方法来做到这一点,但一种快速的方法是检查注册表,看看我们是否有一个我们正在查看的产品:

<?php

$onCatalog = false;
if(Mage::registry('current_product')) {
    $onCatalog = true;
}

希望有所帮助!

谢谢, 乔

答案 2 :(得分:16)

我认为值得一提的是检查

存在缺陷
Mage::registry('current_product')

这确实检查了产品是否存在,但是当在评论页面上时,例如,产品也已设置,因此您可能需要更具体地确定产品页面位置。

以下检查确保我们在产品页面上,通过检查它是否使用“目录”模块,并且控制器是“产品”请求。在查看产品评论列表时,它的值将是“评论”(模块)和“列表”(控制器)。

if($this->getRequest()->getModuleName()=='catalog' && 
$this->getRequest()->getControllerName()=='product'){
    Mage::registry('current_product');
}

我希望这会有所帮助。

答案 3 :(得分:4)

您可以使用该块的参数来指示需要哪种类型的跟踪代码。然后,您只需使用布局XML来解决问题。您可以使用以下布局句柄来使用适当的参数更新块: CMS Pages ='cms_page' 类别浏览='catalog_category_view' 产品查看='catalog_product_view'

这样的事情:

<layout>
    <default>
        <reference name="before_body_end">
            <block type="mymodule/myblock" name="myblock" />
        </reference>
    </default>
    <cms_page>
        <reference name="myblock">
            <action method="setTrackingType">
                <type>cms</type>
            </action>
        </reference>
    </cms_page>
    <catalog_category_view>
        <reference name="myblock">
            <action method="setTrackingType">
                <type>category</type>
            </action>
        </reference>
    </catalog_category_view>
    <catalog_product_view>
        <reference name="myblock">
            <action method="setTrackingType">
                <type>product</type>
            </action>
        </reference>
    </catalog_product_view>
</layout>