在 Prestashop 中重写重定向到产品的模块路由

Module route with rewrite redirect to product on Prestahop

我为艺术家页面创建了自定义路由:

public function hookModuleRoutes($params)
{
    return [
        'module-artists-artist' => [
            'controller' => 'artist',
            'rule' => 'artists/{id_artist}',
            'keywords' => [
                'id_artist' => ['regexp' => '[0-9]+', 'param' => 'id_artist'],
            ],
            'params' => [
                'fc' => 'module',
                'module' => 'artists',
                'controller' => 'artist'
            ],
        ],
    ];
}

如果我使用 /artists/1 进行测试,这会起作用。但是我想添加 link_rewrite 属性。所以我修改了这样的配置:

public function hookModuleRoutes($params)
{
    return [
        'module-artists-artist' => [
            'controller' => 'artist',
            'rule' => 'artists/{id_artist}-{rewrite}',
            'keywords' => [
                'id_artist' => ['regexp' => '[0-9]+', 'param' => 'id_artist'],
                'rewrite' => ['regexp' => '[_a-zA-Z0-9\pL\pS-]*'],
            ],
            'params' => [
                'fc' => 'module',
                'module' => 'artists',
                'controller' => 'artist'
            ],
        ],
    ];
}

但是当我尝试 /artists/1-baxter 时,我被重定向到 ID 为 1 的产品的产品页面。我的艺术家控制器从未被调用。

[Debug] This page has moved
Please use the following URL instead: http://localhost:8000/fr/estampes/1-est-ce-que-etre

我该如何解决?

这是因为您的模式生成的 URLs 也匹配产品 URL 模式,后者具有更高的优先级。 PrestaShop 不检查产品是否存在,它只是直接重定向到 ProductController。 PrestaShop 中的页面模式彼此不同,因此可以快速识别 URLs 与 X 控制器相关联。您可以通过检查默认模式来确认这一点。

您可以在后台查看产品 URL 模式:SEO & URLs 或 DispatcherCore class。无论如何,如果你想要一个简单的修复,我建议制作这个模式:

artists/{id_artist}/{rewrite}