【问题标题】:Determine if on product page programmatically in Magento在 Magento 中以编程方式确定是否在产品页面上
【发布时间】:2013-07-23 18:03:01
【问题描述】:

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

我开始:

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

我看出来了

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

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

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

为 CMS 页面返回“cms”,但为类别浏览和产品视图页面返回“目录”,所以我不能用它来区分类别和产品页面。

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

【问题讨论】:

    标签: php magento


    【解决方案1】:

    最简单的答案如下:

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

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

    【讨论】:

    • 在某些情况下,getRequest 或 getControllerName 可能不可用。您可以直接调用底层函数。 Mage::app()-&gt;getFrontController()-&gt;getRequest()-&gt;getControllerName()
    【解决方案2】:

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

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

    希望有帮助!

    谢谢, 乔

    【讨论】:

    • 当您在自定义页面或自定义功能上拥有该注册表项时,可能会出现这种情况。这就是为什么我不建议使用注册表项来确定它的原因。控制器名称的方式更好。
    • 控制器和注册表的方式是最好的。如果您正在使用控制器,并且此块存在于您的 head.phtml 中,您可能会在标签页面上遇到问题(刚刚遇到此问题) - 标签页面使用产品控制器,但无法提取产品数据。所以我同时使用这两个条件。
    【解决方案3】:

    我认为值得一提的是有一个缺陷需要检查

    Mage::registry('current_product')
    

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

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

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

    我希望这会有所帮助。

    【讨论】:

      【解决方案4】:

      您可以为用于指示需要哪种类型的跟踪代码的块设置一个参数。然后您只需使用布局 XML 来解决问题。您可以使用以下布局句柄来使用适当的参数更新您的块: CMS 页面 = '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>
      

      【讨论】:

      • 请问我该如何使用这些?
      猜你喜欢
      • 2012-12-29
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多