Подтвердить что ты не робот

Magento: как узнать, находитесь ли вы на странице категории или странице продукта в файлах .phtml,

Я пытаюсь запрограммировать в мои .phtml файлы инструкцию if, если гость находится на странице списка категорий или на странице продукта.

Например, этот код:

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

Возвращает "каталог" всякий раз, когда на странице, отличной от страницы CMS.

Можно ли использовать аналогичный метод, чтобы узнать, смотрит ли пользователь на корневую категорию, подкатегорию или отдельную страницу продукта?

Любая помощь будет принята с благодарностью!

4b9b3361

Ответ 1

Прошло некоторое время с тех пор, как я просмотрел страницы каталога frontend, но попробую попробовать.

Текущие версии Magento регистрируют определенные глобальные переменные (а не глобальные глобальные переменные, но глобальные по отношению к системе Magento) на определенных страницах.

Вызов следующего

$category = Mage::registry('current_category');         
$product  = Mage::registry('current_product');
$product  = Mage::registry('product');

будет либо возвращать null, если объекты не были установлены (т.е. вы находитесь на странице без категории или продукта), либо возвращаете категорию и объекты продукта.

Если объект продукта возвращен, вы находитесь на странице продукта.

Если объект продукта не возвращается, а объект категории, вы находитесь на странице категории. У объектов категории есть способ получения родительского id

$category->getParentId()

Категория без родительского идентификатора должна быть категория верхнего уровня, категории с родительскими идентификаторами должны быть подкатегориями.

Это должно дать вам то, что вам нужно, чтобы определить, где находится текущий запрос.

Ответ 2

В то время как ответ Алана будет работать, есть более прямой вариант, и вы действительно на правильном пути со своим фрагментом кода... вам просто нужно проверить имя контроллера, а не имя модуля:

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

Это вернет category или product на основе их контроллеров, равных CategoryController.php и ProductController.php соответственно.

Это предполагает, что вы не установили сторонние модули, которые переписывают эти контроллеры своими собственными.

Ответ 3

Я боюсь, что вы пытаетесь сделать это неправильно. Возможно, я ошибаюсь, потому что вы не объяснили, что именно вы хотите достичь, но я бы использовал макет 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
}

Дифференциация между страницами главной и подкатегории может быть сложнее, первое, что приходит в голову, это анализ переменных запроса, но это, безусловно, не лучший подход.

Ответ 4

Я не являюсь большим поклонником проверки, существует ли существующий реестр current_category, потому что в принципе любой контроллер мог бы это сделать, и это не обязательно означало бы его категорию. Мой способ сделать это немного более прочный:

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