Magento:如何判断您是在.phtml文件中的类别页面还是产品页面

问题描述 投票:20回答:4

我试图在我的.phtml文件中编写if语句,如果guest是在类别列表页面上,或在产品页面上。

例如这段代码:

<?= Mage::app()->getFrontController()->getRequest()->getRouteName(); ?>

每当我在CMS页面以外的页面上时返回“目录”。

有没有办法可以使用类似的方法来了解用户是在查看根类别,子类别还是单个产品页面?

任何帮助将不胜感激!

magento themes php
4个回答
41
投票

我已经处理了前端目录页面已经有一段时间了,但试一试。

当前版本的Magento在某些页面上注册了某些全局变量(不是PHP全局变量,而是Magento系统的全局变量)。

打电话给以下

$category = Mage::registry('current_category');         
$product  = Mage::registry('current_product');
$product  = Mage::registry('product');

如果尚未设置对象,则返回null(即,您在没有类别或产品的页面上),或返回类别和产品对象。

如果返回产品对象,则表示您位于产品页面上。

如果没有返回产品对象但类别对象是,则表示您位于类别页面上。类别对象有一个获取父ID的方法

$category->getParentId()

没有父ID的类别应该是顶级类别,具有父ID的类别应该是子类别。

这应该可以为您提供识别当前请求所需的内容。

更新:回到这个差不多十年之后 - 我可能不会单独依赖注册表的内容来确定我所在的页面。相反,我会使用the full action name结合寻找上面的对象。


35
投票

虽然Alan的回答是有效的,但有一个更直接的选择,你实际上是在使用你的代码片段正确的轨道......你只需要检查控制器名称而不是模块名称:

<?php Mage::app()->getFrontController()->getRequest()->getControllerName(); ?>

这将返回categoryproduct基于他们的控制器分别是CategoryController.phpProductController.php

这确实假设您没有安装任何使用自己的控制器重写这些控制器的第三方模块。


4
投票

我不是检查current_category注册表是否存在的忠实粉丝,因为基本上任何控制器都可以这样做,并不一定意味着它是一个类别。我这样做的方式更健壮:

$fullActionName = Mage::app()->getFrontController()->getAction()->getFullActionName();
if ($fullActionName == 'catalog_category_view') { 
    ...  //Category
}
elseif ($fullActionName == 'catalog_product_view') {
    ...  //Product
}

3
投票

我担心你试图以错误的方式去做。我可能错了,因为你还没有解释你想要实现什么,但是我会使用layout xml将你的块包含在带有参数的产品页面上(比如product-page =“1”)并且类似在类别页面上(category-page =“1”)。

然后,您可以通过检查块内的参数来判断您是否在产品页面或类别页面上:

if($this->getProductPage()) {
  //this is a product page, do some stuff
}
elseif($this->getCategoryPage()) {
  //this is a category page, do some stuff
}

区分主页面和子类别页面可能更困难,首先想到的是对请求变量的分析,但这肯定不是最好的方法。

© www.soinside.com 2019 - 2024. All rights reserved.