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

Jef*_*eff 20 php themes magento

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

例如这段代码:

<?= Mage::app()->getFrontController()->getRequest()->getRouteName(); ?>
Run Code Online (Sandbox Code Playgroud)

每当我在CMS页面以外的页面上时返回"目录".

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

任何帮助将不胜感激!

Ala*_*orm 41

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

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

打电话给以下

$category = Mage::registry('current_category');         
$product  = Mage::registry('current_product');
$product  = Mage::registry('product');
Run Code Online (Sandbox Code Playgroud)

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

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

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

$category->getParentId()
Run Code Online (Sandbox Code Playgroud)

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

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

  • 在admin中,当您尝试编辑类别时,`Mage :: registry('current_category')`存在......因此可能需要进行额外的检查. (2认同)

Jon*_*Day 35

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

<?php Mage::app()->getFrontController()->getRequest()->getControllerName(); ?>
Run Code Online (Sandbox Code Playgroud)

这将返回categoryproduct根据自己的控制器是CategoryController.phpProductController.php分别.

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

  • 我最近发现(`...-> getControllerName()`)也会返回`product`作为"tag"页面(`.../tag/product/list/...`).将此与Alan的答案(`!is_null(Mage :: registry('product'))`)相结合,如果您只想区分产品视图页面似乎有效. (2认同)

小智 5

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

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