Magento 2 Создайте пользовательскую страницу 404 для не найденных продуктов


В Magento 2 я хочу создать модуль, который добавляет пользовательскую страницу 404 специально для не найденных товаров в каталоге, однако сохраняйте страницу 404 по умолчанию для всех остальных страниц.

Мои первоначальные мысли состоят в том, чтобы создать контроллер с di на \Magento\Catalog\Controller\Product\View, который проверяет, не существует ли продукта, и изменяет шаблон на пользовательский ответ 404, если возвращено значение true.

Что-то вроде (не настоящий код)

public function execute()
{
    if (!$this->productExists()) {
        $this->setTemplate('custom-404');
    }
}

Есть ли лучший способ сделать это? Позвольте мне знайте, если вам нужна дополнительная информация.

Author: Shashank Kumrawat, 2016-05-23

3 answers

Magento 2 предоставляет некоторые классы для обработки без маршрутизатора: vendor/magento/framework/App/Router/NoRouteHandler.php vendor/magento/framework/App/Router/NoRouteHandlerInterface.php vendor/magento/framework/App/Router/NoRouteHandlerList.php

Создайте пример мы можем попробовать:

Другие страницы: url: magen2.loc/dddddd

enter image description here

Страница продукта: url: magen2.loc/catalog/view/45555

enter image description here

Примечание: мы поймаем URL-адрес продукта с форматом: {base url}/catalog/product/view/{....}

 5
Author: Khoa TruongDinh, 2020-06-15 08:30:17

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

\Magento\Framework\App\Router\DefaultRouter::match
 0
Author: user61787, 2018-10-23 19:07:22

Создайте плагин для проверки статуса продукта методом "Aftergetstatus" для класса \Magento\Каталог\Модель\Продукт, если статус продукта отключен, затем создайте пользовательскую страницу 404 и перенаправьте контроллер на нее. Найдите ниже код для этого, я проверил его, и он работает.

Di.xml

 <type name="Magento\Catalog\Model\Product">
    <plugin name="change_product" type="Rahul\Disabledproductredirect\Plugin\Product" sortOrder="1" />
  </type>

Plugin/Product.php

 namespace Rahul\Disabledproductredirect\Plugin;
use Magento\Framework\Controller\Result\Forward; use Magento\Framework\App\Request\Http;

class Product {

private $forward;
private $request;


public function __construct(Forward $forward,Http $request)
{

    $this->forward = $forward;
    $this->request  = $request;
}

public function afterGetStatus(\Magento\Catalog\Model\Product $subject, $result)
{
    //return $result;
    if($result == \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED && $this->request->getControllerName()=='product' && $this->request->getActionName() == 'view')
    {

       $this->forward->forward('noroute');

    }

    return $result;
}
}
 0
Author: Rahul Anand, 2019-10-25 12:27:57