如果访客位于类别列表页面或产品页面上,我正尝试将.phtml文件编入if语句。
例如这段代码:
<?= Mage::app()->getFrontController()->getRequest()->getRouteName(); ?>
每当我在CMS页面以外的页面上时,都会返回“目录”。
有没有办法可以使用类似的方法来了解用户是在查看根类别,子类别还是单个产品页面?
非常感谢任何帮助!
答案 0 :(得分: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来寻找上面的对象。
答案 1 :(得分:35)
虽然Alan的回答是有效的,但有一个更直接的选择,你实际上是在使用你的代码片段正确的轨道......你只需要检查控制器名称而不是模块名称:
<?php Mage::app()->getFrontController()->getRequest()->getControllerName(); ?>
这将基于他们的控制器category
和product
分别返回CategoryController.php
或ProductController.php
。
这确实假设您没有安装任何使用自己的控制器重写这些控制器的第三方模块。
答案 2 :(得分: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
}
区分主页面和子类别页面可能会更困难,首先想到的是对请求变量的分析,但这肯定不是最好的方法。
答案 3 :(得分:3)
我不是检查current_category注册表是否存在的忠实粉丝,因为基本上任何控制器都可以这样做,并不一定意味着它是一个类别。我这样做的方式更有力:
$fullActionName = Mage::app()->getFrontController()->getAction()->getFullActionName();
if ($fullActionName == 'catalog_category_view') {
... //Category
}
elseif ($fullActionName == 'catalog_product_view') {
... //Product
}