Magento: как определить, находитесь ли вы на странице категории или странице продукта в файлах .phtml - PullRequest
20 голосов
/ 17 августа 2010

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

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

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

Возвращает «каталог» всякий раз, когда я нахожусь на странице, отличной от страницы CMS.

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

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

Ответы [ 4 ]

41 голосов
/ 18 августа 2010

Прошло много времени с тех пор, как я имел дело со страницами каталога внешнего интерфейса, но попробуйте.

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

Позвонив по следующему

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

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

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

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

$category->getParentId()

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

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

ОБНОВЛЕНИЕ: Возвращаясь к этому почти десятилетие спустя - скорее всего, не будет полагаться только на содержимое реестра, чтобы определить страницу, на которой я нахожусь. Вместо этого я бы использовал полное имя действия в сочетании с поиском вышеуказанных объектов.

35 голосов
/ 16 декабря 2010

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

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

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

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

4 голосов
/ 21 октября 2016

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

$fullActionName = Mage::app()->getFrontController()->getAction()->getFullActionName();
if ($fullActionName == 'catalog_category_view') { 
    ...  //Category
}
elseif ($fullActionName == 'catalog_product_view') {
    ...  //Product
}
3 голосов
/ 17 августа 2010

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

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

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