【问题标题】:Magento: How to tell if you're on a category page, or product page in .phtml file(s)Magento:如何判断您是在类别页面上,还是在 .phtml 文件中的产品页面上
【发布时间】:2023-03-25 12:34:01
【问题描述】:

如果客人在类别列表页面或产品页面上,我正在尝试将 if 语句编程到我的 .phtml 文件中。

例如这段代码:

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

只要我在 CMS 页面以外的页面上,就会返回“目录”。

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

任何帮助将不胜感激!

【问题讨论】:

    标签: magento themes php


    【解决方案1】:

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

    当前版本的 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 来查找上述对象。

    【讨论】:

    • 在管理员中,当您尝试编辑类别时,Mage::registry('current_category') 存在...因此可能需要进行额外检查。
    • @FlorinelChis,关于检测管理页面的主题还有什么建议吗?我也在尝试找到一个干净的解决方案来检测何时加载产品页面
    • 小心,在 Magento Enterprise 上,Magento 还在产品页面上设置了 'current_category'! (这发生在 PageCache 观察者的 updateProductInfo() 方法中)
    • 感谢@BogdanTomi -- 我已经更新了答案,以更好地反映我们现在关于 Magento 的事情。 2010 年是很久以前的事了 :)
    【解决方案2】:

    虽然 Alan 的回答会起作用,但还有一个更直接的选择,而且您的代码 sn-p 实际上走在了正确的轨道上……您只需要检查控制器名称而不是模块名称:

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

    这将根据它们的控制器分别为 CategoryController.phpProductController.php 返回 categoryproduct

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

    【讨论】:

    • 我最近发现 (...-&gt;getControllerName()) 也会为“标签”页面 (.../tag/product/list/...) 返回 product。如果您只想区分产品视图页面,将其与 Alan 的回答 (!is_null(Mage::registry('product'))) 结合起来似乎可行。
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      恐怕你正试图以错误的方式做这件事。我可能是错的,因为您没有解释您想要实现的确切目标,但我会使用布局 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
      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2016-06-30
        • 2012-03-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多