| Hook | moduleRoutes |
|---|---|
| Locations | FO |
| Type | |
| Origin | core |
| Aliases | |
| Description | This hook allows your module to extend default PrestaShop routes with custom ones and map them to your module front controllers. |
This hook has an $array_return parameter set to true (module output will be set by name in an array, see explaination here).
| Origin | File |
|---|---|
| core | classes/Dispatcher.php |
Hook::exec('moduleRoutes', ['id_shop' => $id_shop], null, true, false)
This hook must return an array of routes, keyed by the names of the routes, and each route structured by:
array(
'rule' => string,
'keywords' => array(),
'controller' => string,
'params' => array(
'fc' => string,
'module' => string
)
)
rule and keywords parametersrule is the URL that will be matched by the router. rule can contain parameters, enclosed with {}.
For example, to add an id parameter in your route, use the following rule:
myrule/{id}
Multiple parameters can be used, for example:
myrule/{id}/{slug}
Each parameter in your rule must be declared in the keywords array.
In our example, id must be an integer and slug a string, and will be forwarded to the controller with id and slug parameter names:
[
'rule' => 'myrule/{id}/{slug}',
'keywords' => [
'id' => [
'regexp' => '[0-9]*',
'param' => 'id'
],
'slug' => [
'regexp' => '.*',
'param' => 'slug'
]
],
'controller' => 'myrulecontroller',
'params' => [
'fc' => 'module',
'module' => 'mymodulename'
]
]
This example creates two ModuleFrontController controllers, and extends PrestaShop routes to map 2 routes to those controllers: one for listing items, the other one for showing one specific item.
Create a list.php ModuleFrontController in mymoduleaddingroutes/controllers/front/:
class MyModuleAddingRoutesListModuleFrontController extends ModuleFrontController
{
public function initContent()
{
$this->setTemplate('module:mymoduleaddingroutes/views/templates/front/list.tpl');
}
}
and a show.php ModuleFrontController in mymoduleaddingroutes/controllers/front/:
class MyModuleAddingRoutesShowModuleFrontController extends ModuleFrontController
{
public function initContent()
{
// It is just an example. Remember to always validate the input data!
$this->context->smarty->assign(
[
'id' => Tools::getValue('id'),
'slug' => Tools::getValue('slug')
]
);
$this->setTemplate('module:mymoduleaddingroutes/views/templates/front/show.tpl');
}
}
Now, create two templates in mymoduleaddingroutes/views/templates/front/:
list.tpl:
<h1>List template</h1>
show.tpl:
<h1>Show template</h1>
Id: {$id}
Slug: {$slug}
Now we have 2 controllers, rendering 2 templates, we can create our routes with moduleRoutes hook, in mymoduleaddingroutes/mymoduleaddingroutes.php:
<?php
class MyModuleAddingRoutes extends Module
{
public function install()
{
return parent::install() && $this->registerHook('moduleRoutes');
}
public function hookModuleRoutes()
{
return [
'module-mymoduleaddingroutes-list' => [
'rule' => 'mymoduleaddingroutes/list',
'keywords' => [],
'controller' => 'list',
'params' => [
'fc' => 'module',
'module' => 'mymoduleaddingroutes'
]
],
'module-mymoduleaddingroutes-show' => [
'rule' => 'mymoduleaddingroutes/show/{id}/{slug}',
'keywords' => [
'id' => [
'regexp' => '[0-9]*',
'param' => 'id'
],
'slug' => [
'regexp' => '.*',
'param' => 'slug'
]
],
'controller' => 'show',
'params' => [
'fc' => 'module',
'module' => 'mymoduleaddingroutes'
]
]
];
}
}
The complete implementation example is available in our example modules repository.