在 prestashop 中创建 url 重写模块
Creating a url rewrite module in prestashop
我正在尝试构建自己的自定义 prestashop 模块。该模块非常简单。它需要读取 url,如果访问者的 url 等于产品代码,它需要将用户重定向到该特定产品页面。为此,我使用以下 url:
www.example.com/ean13/{ean13}
例如,当访问者尝试访问页面时:
www.example.com/ean13/1121312341
查询必须开始 运行 并且必须搜索该 'ean13' 产品代码。如果产品代码存在,则需要将用户重定向到特定产品页面。
所以我已经构建了我的模块的基础知识,目前的设置如下图所示:
如您所见,该模块仅包含两个文件。主模块配置文件"customRoute.php"和控制器"controllers/front/routeController.php"
以下两个文件的代码:
customRoute.php
if (!defined('_PS_VERSION_'))
{
exit;
}
class customRoute extends Module {
public function __construct()
{
$this->name = 'customRoute';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Niels van Enckevort';
$this->need_instance = 0;
$this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('custom routes');
$this->description = $this->l('Custom routes.');
$this->confirmUninstall = $this->l('Are you sure you want to uninstall?');
if (!Configuration::get('customRoute'))
$this->warning = $this->l('No name provided');
}
public function install()
{
if (Shop::isFeatureActive())
Shop::setContext(Shop::CONTEXT_ALL);
if (!parent::install() ||
!$this->registerHook('ModuleRoutes') ||
!$this->registerHook('header') ||
!Configuration::updateValue('customRoute', 'my test')
)
return false;
return true;
}
public function uninstall()
{
if (!parent::uninstall() ||
!Configuration::deleteByName('customRoute')
)
return false;
return true;
}
public function hookDisplayHeader()
{
$this->context->controller->addCSS($this->_path.'css/mymodule.css', 'all');
}
public function hookModuleRoutes($params)
{
return [
'customRoute-customRouteRouteControllerModuleFrontController-root' => [
'rule' => 'ean13/{:ean13}/{rewrite}.html',
'controller' => 'routeController',
'keywords' => [
'ean13' => ['regexp' => '[0-9]+', 'param' => 'ean13']
],
'params' => [
'fc' => 'module',
'module' => 'customRoute'
]
]
];
}
}
routeController.php
class CustomRouteRouteControllerModuleFrontController extends moduleFrontController {
public function postProcess()
{
$query = new DbQuery();
$query->select('id_product')
->from('product_attribute', 'pa')
->where('pa.ean13 = ' . (int)Tools::getValue('ean13'));
$productId = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
if ($productId) {
Tools::redirect($this->context->link->getProductLink($productId));
} else {
Tools::redirect('pagenotfound');
}
}
}
我需要说明一下,我确实在一些帮助下获得了这段代码,因为这是我正在编写的第一个自定义模块。我想我缺少一个或多个关键项目,希望有人能帮助我解决这些问题。
模块在前面安装和加载,所以它与安装无关,但与我正在使用的功能构建有关。
如有任何问题请在评论区提问
一如既往,提前致谢!
嗯,你的模块 class 没问题,但你的控制器不行。
我之前已经回答过这个问题,但是模块前端控制器 class 必须声明如下:
class MyModuleNameControllerNameModuleFrontController extends ModuleFrontController
所以你的控制器应该是
class CustomRouteRouteControllerModuleFrontController extends ModuleFrontController
编辑
问题是控制器名称和控制器文件名中包含 Controller
。
将 routeController.php
重命名为 route.php
,将 CustomRouteRouteControllerModuleFrontController
重命名为 CustomRouteRouteModuleFrontController
,并将 hookModuleRoutes
更改为
return [
'customroute-route-root' => [
'rule' => 'ean13/{:ean13}.html',
'controller' => 'route',
'keywords' => [
'ean13' => ['regexp' => '[0-9]+', 'param' => 'ean13']
],
'params' => [
'fc' => 'module',
'module' => 'customroute'
]
]
];
已解决,路由正常。
我正在尝试构建自己的自定义 prestashop 模块。该模块非常简单。它需要读取 url,如果访问者的 url 等于产品代码,它需要将用户重定向到该特定产品页面。为此,我使用以下 url:
www.example.com/ean13/{ean13}
例如,当访问者尝试访问页面时:
www.example.com/ean13/1121312341
查询必须开始 运行 并且必须搜索该 'ean13' 产品代码。如果产品代码存在,则需要将用户重定向到特定产品页面。
所以我已经构建了我的模块的基础知识,目前的设置如下图所示:
如您所见,该模块仅包含两个文件。主模块配置文件"customRoute.php"和控制器"controllers/front/routeController.php"
以下两个文件的代码:
customRoute.php
if (!defined('_PS_VERSION_'))
{
exit;
}
class customRoute extends Module {
public function __construct()
{
$this->name = 'customRoute';
$this->tab = 'front_office_features';
$this->version = '1.0.0';
$this->author = 'Niels van Enckevort';
$this->need_instance = 0;
$this->ps_versions_compliancy = array('min' => '1.6', 'max' => _PS_VERSION_);
$this->bootstrap = true;
parent::__construct();
$this->displayName = $this->l('custom routes');
$this->description = $this->l('Custom routes.');
$this->confirmUninstall = $this->l('Are you sure you want to uninstall?');
if (!Configuration::get('customRoute'))
$this->warning = $this->l('No name provided');
}
public function install()
{
if (Shop::isFeatureActive())
Shop::setContext(Shop::CONTEXT_ALL);
if (!parent::install() ||
!$this->registerHook('ModuleRoutes') ||
!$this->registerHook('header') ||
!Configuration::updateValue('customRoute', 'my test')
)
return false;
return true;
}
public function uninstall()
{
if (!parent::uninstall() ||
!Configuration::deleteByName('customRoute')
)
return false;
return true;
}
public function hookDisplayHeader()
{
$this->context->controller->addCSS($this->_path.'css/mymodule.css', 'all');
}
public function hookModuleRoutes($params)
{
return [
'customRoute-customRouteRouteControllerModuleFrontController-root' => [
'rule' => 'ean13/{:ean13}/{rewrite}.html',
'controller' => 'routeController',
'keywords' => [
'ean13' => ['regexp' => '[0-9]+', 'param' => 'ean13']
],
'params' => [
'fc' => 'module',
'module' => 'customRoute'
]
]
];
}
}
routeController.php
class CustomRouteRouteControllerModuleFrontController extends moduleFrontController {
public function postProcess()
{
$query = new DbQuery();
$query->select('id_product')
->from('product_attribute', 'pa')
->where('pa.ean13 = ' . (int)Tools::getValue('ean13'));
$productId = Db::getInstance(_PS_USE_SQL_SLAVE_)->getValue($query);
if ($productId) {
Tools::redirect($this->context->link->getProductLink($productId));
} else {
Tools::redirect('pagenotfound');
}
}
}
我需要说明一下,我确实在一些帮助下获得了这段代码,因为这是我正在编写的第一个自定义模块。我想我缺少一个或多个关键项目,希望有人能帮助我解决这些问题。
模块在前面安装和加载,所以它与安装无关,但与我正在使用的功能构建有关。
如有任何问题请在评论区提问 一如既往,提前致谢!
嗯,你的模块 class 没问题,但你的控制器不行。
我之前已经回答过这个问题,但是模块前端控制器 class 必须声明如下:
class MyModuleNameControllerNameModuleFrontController extends ModuleFrontController
所以你的控制器应该是
class CustomRouteRouteControllerModuleFrontController extends ModuleFrontController
编辑
问题是控制器名称和控制器文件名中包含 Controller
。
将 routeController.php
重命名为 route.php
,将 CustomRouteRouteControllerModuleFrontController
重命名为 CustomRouteRouteModuleFrontController
,并将 hookModuleRoutes
更改为
return [
'customroute-route-root' => [
'rule' => 'ean13/{:ean13}.html',
'controller' => 'route',
'keywords' => [
'ean13' => ['regexp' => '[0-9]+', 'param' => 'ean13']
],
'params' => [
'fc' => 'module',
'module' => 'customroute'
]
]
];
已解决,路由正常。