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');
}
}
Есть ли лучший способ сделать это? Позвольте мне знайте, если вам нужна дополнительная информация.
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
Страница продукта: url: magen2.loc/catalog/view/45555
Примечание: мы поймаем URL-адрес продукта с форматом: {base url}/catalog/product/view/{....}
И еще одна вещь в дополнение к ответу Хоа. Чтобы избежать возможных проблем, вы должны вернуть true
из своего метода обработки в пользовательском обработчике noRoute в случае, если вы соответствуете запросу.
Это приведет к прерыванию дальнейшей обработки обработчиков маршрутов, которая выполняется в приведенном ниже методе.
\Magento\Framework\App\Router\DefaultRouter::match
Создайте плагин для проверки статуса продукта методом "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;
}
}