Как проверить IsHomePage в Magento 2? Мы на главной странице?

9

Я хочу проверить, что текущая страница - это домашняя страница, страница категории, страница продукта и страница cms в magento 2

MagikVishal
источник
в каком контексте вы хотите это проверить? контроллер? блок?
Мариус
В версии Magento 1 мы используем функцию Mage :: getBlockSingleton ('page / html_header') -> getIsHomePage (); я хочу показать данные постранично, такие как домашняя страница, страница категории, страница продукта и страница cms и т. д.
MagikVishal
1
Я знаю это, но чтобы ответить на этот вопрос, я хочу знать, где вы хотите использовать это в magento2. В м2 нет глобального класса мага.
Мариус

Ответы:

20

Вы можете попробовать это: внедрить экземпляр \Magento\Framework\App\Request\Httpвашего конструктора класса. Если вы находитесь в контроллере, вам не нужно это делать. Вы уже можете получить к нему доступ, как это$request = $this->getRequest()

public function __construct(
    ...
    \Magento\Framework\App\Request\Http $request
) {
    ...
    $this->_request = $request;
}

Тогда вы можете проверить, является ли домашняя страница такой:

if ($this->_request->getFullActionName() == 'cms_index_index') {
    //you are on the homepage
}
if ($this->_request->getFullActionName() == 'catalog_product_view') {
    //you are on the product page
}
if ($this->_request->getFullActionName() == 'catalog_category_view') {
    //you are on the category page
}
Мариус
источник
@marius - как я могу проверить то же самое в файле phtml?
Манашви Бирла
2
написать метод в блоке, который возвращает $this->_request->getFullActionName()объявление, использовать его в файле phtml.
Мариус
Не могли бы вы уточнить? Как это сделать?
Макс
@ Макс, что тебе еще нужно? Я думаю, что ответ ясен? скажи мне, что ты хочешь знать
Мариус
Извините, я перечитал и все ясно. Спасибо.
Макс
7

Внутри phtml файла это работает для меня:

if ($this->getRequest()->getFullActionName() == 'cms_index_index') {
    //you are on the homepage
}
if ($this->getRequest()->getFullActionName() == 'catalog_product_view') {
    //you are on the product page
}
if ($this->getRequest()->getFullActionName() == 'catalog_category_view') {
    //you are on the category page
}
Карпа
источник
у меня это работает
sandip
3

Попробуй это:

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$request = $objectManager->get('Magento\Framework\App\Action\Context')->getRequest();
if ($request->getFullActionName() == 'cms_index_index') {
    // is homepage
}
MagePsycho
источник
2
не используйте диспетчер объектов
Marius
Это сработало для меня. Почему бы не использовать диспетчер объектов?
TheBlackBenzKid
Это плохая практика, чтобы использовать диспетчер объектов напрямую. Официальный разработчик Magento говорит: «Magento запрещает прямое использование ObjectManager в вашем коде, потому что оно скрывает реальные зависимости класса».
Маквана Кетан
0

Из-за шаблона проектирования Dependency Injection. Вы создаете модуль для запроса ресурса по запросу. Менеджер объектов идет против этой парадигмы. Тем не менее, он отлично работает, но все равно, что использовать Mage снова и снова - медленно.

Крис Андерсон
источник
упс, должен комментировать выше, мой б.
Крис Андерсон
0

Попробуйте код ниже:

protected $_logo;   

public function __construct(
    \Magento\Backend\Block\Template\Context $context,
    \Magento\Theme\Block\Html\Header\Logo $logo,
    array $data = []
)
{       
    $this->_logo = $logo;
    parent::__construct($context, $data);
}

public function isHomePage()
{   
    return $this->_logo->isHomePage();
}

Использование диспетчера объектов

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$logo = $objectManager->get('Magento\Theme\Block\Html\Header\Logo');
var_dump($logo->isHomePage());

источник