Magento:如何判断你是否';re位于.phtml文件中的类别页或产品页上

Magento:如何判断你是否';re位于.phtml文件中的类别页或产品页上,magento,themes,php,Magento,Themes,Php,如果客户位于类别列表页面或产品页面上,我试图在我的.phtml文件中编程一个if语句 例如,此代码: <?= Mage::app()->getFrontController()->getRequest()->getRouteName(); ?> 当我在CMS页面以外的页面上时返回“catalog” 我有没有办法使用类似的方法来知道用户是在查看根类别、子类别还是单个产品页面 任何帮助都将不胜感激 恐怕你想用错误的方法做这件事。我可能错了,因为您没有解释您想要实现

如果客户位于类别列表页面或产品页面上,我试图在我的.phtml文件中编程一个if语句

例如,此代码:

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

当我在CMS页面以外的页面上时返回“catalog”

我有没有办法使用类似的方法来知道用户是在查看根类别、子类别还是单个产品页面


任何帮助都将不胜感激

恐怕你想用错误的方法做这件事。我可能错了,因为您没有解释您想要实现什么,但我会使用布局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
}

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

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

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

调用以下命令

$category = Mage::registry('current_category');         
$product  = Mage::registry('current_product');
$product  = Mage::registry('product');
如果尚未设置对象(即,您在没有类别或产品的页面上),则返回null,或者返回类别和产品对象

如果返回一个产品对象,您就在产品页面上

如果未返回任何产品对象,但返回了类别对象,则显示在类别页面上。类别对象具有获取父id的方法

$category->getParentId()
没有父id的类别应为顶级类别,具有父id的类别应为子类别

这将为您提供识别当前请求所在位置所需的信息


更新:大约十年后再回到这个问题上——我可能不会仅仅依靠注册表的内容来确定我所在的页面。相反,我会结合查找上述对象使用。

虽然Alan的答案可行,但有一个更直接的选项,而且您的代码片段实际上走在了正确的轨道上。。。您只需要检查控制器名称而不是模块名称:

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

这将返回
category
product
,因为它们的控制器分别是
CategoryController.php
ProductController.php


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

我不太喜欢检查当前的_类别注册表是否存在,因为基本上任何控制器都可以这样做,这并不一定意味着它是一个类别。我的做法更为稳健:

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

在管理中,当您尝试编辑类别时,
Mage::registry('current_category')
存在。。。所以可能需要额外的检查。@FlorinelChis,关于检测管理页面,还有什么建议吗?我还试图找到一个干净的解决方案来检测产品页面何时加载小心,在Magento Enterprise上,Magento还在产品页面上设置“当前类别”!(这发生在PageCache observer的updateProductInfo()方法中)谢谢@BogdanTomi——我更新了答案,以更好地反映我们现在关于Magento的内容。2010年是很久以前的事了:)我最近发现(
..->getControllerName()
)也会返回
产品
作为“标记”页面(
../tag/product/list/…
)。结合Alan的回答(
!is_null(Mage::registry('product'))
),如果您只想区分产品视图页面,那么这似乎是可行的。