controllers
- Description
At this place, you can define which controllers should be able to be called directly, e.g. from templates. You can define a routing of
controller keys
to module classes.- Type
Associative array
- Mandatory
No
- Example
'controllers' => [ 'myvendor_mytestmodule_mymodulecontroller' => MyVendor\mytestmodule\MyModuleController::class, 'myvendor_mytestmodule_myothermodulecontroller' => MyVendor\mytestmodule\MyOtherModuleController::class, ],
The key of this array * is a identifier (
controller key
) which should be unique over all OXID eShop modules. Use vendor id and module id for prefixing. * Take care you declare the keys always in lower case!The value is the assigned class which should also be unique.
Now you can route requests to the module controller e.g. in a template:
<form action="{{ oViewConf.getSelfActionLink() }}" name="MyModuleControllerAction" method="post" role="form"> <div> {{ oViewConf.getHiddenSid()|raw() }} <input type="hidden" name="cl" value="myvendor_mytestmodule_mymodulecontroller"> <input type="hidden" name="fnc" value="displayMessage"> <input type="text" size="10" maxlength="200" name="mymodule_message" value="{{ the_module_message }}"> <button type="submit" id="MyModuleControllerActionButton" class="submitButton">{{ translate({ ident: "SUBMIT" }) }}</button> </div> </form>
If the controller key is not found within the shop or modules, it is assumed that the controller key is a class with this name. If there is no class with this name present, the OXID eShop will redirect to the shop front page.
Important
If you want to have an endpoint in your module that can be accessed directly, You must use controllers to do it.
For example, in GraphQL module, we have GraphQL endpoint which has been created in src/Component/Widget, and also has been defined in the controller section in metadata.php as following:
'controllers' => [
// Widget Controller
'graphql' => OxidEsales\GraphQL\Base\Component\Widget\GraphQL::class,
]
Now we can access it via the following URL:
http://<shopurl>/widget.php?cl=graphql
Defining a template file in the render method
Make sure you shop behaves in the same way for both smarty and twig templates.
Rendering Smarty templates
To render a smarty template via a frontend controller, in metadata.php
define the template file in the templates section.
Example
.
.
'templates' => array(
'template-name.tpl' => '.../template-name.tpl'
),
.
.
The render method in your controller returns the template.
Rendering Twig templates
To render Twig templates, with the render method only return the template name without extension.
Example
class MyController extends \OxidEsales\Eshop\Application\Controller\FrontendController
{
public function render()
{
.
.
return 'template-name';
}
.
.
Important
Twig templates are not defined in in the templates section of the metadata.php
file.
For more information about registering and accessing Twig templates, see Registering a new module’s template.