Определите, есть ли на странице продукта программно в Magento
Я хочу вставить коды отслеживания на всех страницах сайта Magento и использовать другой синтаксис, если страница является страницей CMS, страницей просмотра категорий или страницей просмотра продукта. У меня есть настраиваемый модуль, настроенный с блоком, который в настоящее время добавляет общий код отслеживания на каждую страницу. Изнутри блока, как я могу различать страницы CMS, страницы категорий и страницы продукта?
Я начал с:
Mage::app()->getRequest();
Я вижу, что
Mage::app()->getRequest()->getParam('id');
возвращает идентификатор продукта или категории на страницах продукта и категории, но не различает эти типы страниц.
Mage::app()->getRequest()->getRouteName();
вернуть "cms" для страниц CMS, но возвращает "каталог" для страниц просмотра категорий и просмотра продукта, поэтому я не могу использовать это, чтобы разделить категории и страницы продукта.
Есть ли какой-нибудь индикатор в запросе, который я могу использовать безопасно? Или есть лучший способ достичь моей цели разных кодов отслеживания для разных типов страниц?
Ответы
Ответ 1
Возможно, существует еще лучший способ сделать это с помощью маршрутизаторов, но один быстрый способ - проверить реестр, чтобы увидеть, есть ли у нас один продукт, на который мы смотрим:
<?php
$onCatalog = false;
if(Mage::registry('current_product')) {
$onCatalog = true;
}
Надеюсь, что это поможет!
Спасибо,
Джо
Ответ 2
Самый легкий ответ:
<?php
echo $this->getRequest()->getControllerName();
if($this->getRequest()->getControllerName()=='product') //do something
if($this->getRequest()->getControllerName()=='category') //do others
?>
Это 100% правильный способ сделать в соответствии с моделью MVC, пожалуйста, ознакомьтесь с основным кодом, который действительно это понимает, и не давайте метод с загрузкой или зависит от метода реестра. Поддержите mytraining.net, хотя меня там нет.
Ответ 3
Я думал, что стоит отметить, что есть недостаток в проверке
Mage::registry('current_product')
Это действительно проверяет, существует ли продукт, но, например, на странице обзора продукт также установлен, поэтому вам может потребоваться более конкретное определение местоположения страницы.
Следующая проверка гарантирует, что мы находимся на странице продукта, проверяя, что она использует модуль "каталог", а контроллер - это "продукт". При просмотре списка обзоров продуктов значениями будут "обзор" (модуль) и "список" (контроллер).
if($this->getRequest()->getModuleName()=='catalog' &&
$this->getRequest()->getControllerName()=='product'){
Mage::registry('current_product');
}
Надеюсь, это поможет.
Ответ 4
У вас может быть параметр для блока, который используется для указания того, какой тип кода отслеживания необходим. Затем вы просто используете XML-макет для решения проблемы. Вы можете использовать следующие макеты компоновки, чтобы обновить ваш блок с помощью соответствующего параметра:
CMS Pages = 'cms_page'
Категория просмотра = 'catalog_category_view'
Просмотр продукта = 'catalog_product_view'
Что-то вроде этого:
<layout>
<default>
<reference name="before_body_end">
<block type="mymodule/myblock" name="myblock" />
</reference>
</default>
<cms_page>
<reference name="myblock">
<action method="setTrackingType">
<type>cms</type>
</action>
</reference>
</cms_page>
<catalog_category_view>
<reference name="myblock">
<action method="setTrackingType">
<type>category</type>
</action>
</reference>
</catalog_category_view>
<catalog_product_view>
<reference name="myblock">
<action method="setTrackingType">
<type>product</type>
</action>
</reference>
</catalog_product_view>
</layout>