Я пытаюсь запрограммировать в свои .phtml-файлы инструкцию if, если гость находится на странице списка категорий или на странице продукта.
Например, этот код:
<?= Mage::app()->getFrontController()->getRequest()->getRouteName(); ?>
Возвращает «каталог» всякий раз, когда вы находитесь на странице, отличной от страницы CMS.
Есть ли способ, которым я могу использовать аналогичный метод, чтобы узнать, смотрит ли пользователь на категорию корней, подкатегорию или отдельную страницу продукта?
Любая помощь будет принята с благодарностью!
Прошло некоторое время с тех пор, как я рассмотрел страницы каталога frontend, но попробуйте.
Текущие версии Magento регистрируют на определенных страницах определенные глобальные переменные (а не глобальные глобальные, но глобальные по отношению к системе Magento).
Вызов следующего
$category = Mage::registry('current_category'); $product = Mage::registry('current_product'); $product = Mage::registry('product');
либо вернет null, если объекты не были установлены (т.е. вы находитесь на странице без категории или продукта), или возвращаете категорию и объекты продукта.
Если объект продукта возвращается, вы попадаете на страницу продукта.
Если объект продукта не возвращается, а объект категории, вы находитесь на странице категории. Объекты категории имеют способ получения родительского идентификатора
$category->getParentId()
Категорией без родительского идентификатора должна быть категория верхнего уровня, категории с родительскими идентификаторами должны быть подкатегориями.
Это должно дать вам то, что вам нужно, чтобы определить, где находится текущий запрос.
Хотя ответ Алана будет работать, есть более прямой вариант, и вы действительно на правильном пути со своим фрагментом кода … вам просто нужно проверить имя контроллера, а не имя модуля:
<?php Mage::app()->getFrontController()->getRequest()->getControllerName(); ?>
Это приведет к возврату category
или product
на основе их контроллеров, которые являются CategoryController.php
и ProductController.php
соответственно.
Это предполагает, что вы не установили сторонние модули, которые переписывают эти контроллеры своими собственными.
Боюсь, вы пытаетесь сделать это неправильно. Возможно, я ошибаюсь, потому что вы не объяснили, что именно вы хотите достичь, но я бы использовал макет 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 }
Дифференциация между страницами главной и подкатегории может быть сложнее, первое, что приходит в голову, это анализ переменных запроса, но это, безусловно, не самый лучший подход.
Я не большой поклонник проверки, существует ли текущий каталог текущей версии, потому что в принципе любой контроллер может это сделать, и это не обязательно означает, что это категория. Мой способ сделать это немного более прочный:
$fullActionName = Mage::app()->getFrontController()->getAction()->getFullActionName(); if ($fullActionName == 'catalog_category_view') { ... //Category } elseif ($fullActionName == 'catalog_product_view') { ... //Product }