Override existing OXID eShop functionality¶
This page describes how to override default OXID eShop functionality.
Extending ‘add to basket’ functionality¶
In this section the existing “loggerdemo” module will be used which logs a product’s id when it is added to the basket.
Override functionality¶
To override functionality there is a need to create a module class. Here, the “loggerdemo” module will be used as an example.
There is a need to create a child class - OxidEsales\LoggerDemo\Model\Basket
- which should override OXID eShop class
OxidEsales\EshopCommunity\Application\Model\Basket
method addToBasket
:
.
└── source
└── modules
└── oe
└──loggerdemo
└── Model
└── Basket.php
Note
oe
- module developer vendor name
loggerdemo
- module name.
Note
You can also extend module classes, just like shop classes:
\OxidEsales\PayPalModule\Controller\OrderController::class => \ExampleVendor\ExampleModule\Controller\OrderController::class
The class OxidEsales\LoggerDemo\Model\Basket
could have contents like this:
namespace OxidEsales\LoggerDemo\Model;
use OxidEsales\EventLoggerDemo\BasketItemLogger;
class Basket extends Basket_parent
{
public function addToBasket(
$productID,
$amount,
$sel = null,
$persParam = null,
$override = false,
$bundle = false,
$oldBasketItemId = null
) {
$basketItemLogger = new BasketItemLogger($this->getConfig()->getLogsDir());
$basketItemLogger->logItemToBasket($productID);
return parent::addToBasket($productID, $amount, $sel, $persParam, $override, $bundle, $oldBasketItemId);
}
}
In this example method addToBasket
is overridden and it adds logging functionality.
To override the method one needs to:
Extend a Unified Namespace class -
<className>_parent
, in this case it isBasket_parent
.Call parent method, so the chain would not be broken.
Autoload module classes¶
The file composer.json in module root directory must be created, the modules namespace and autoloading must be defined.
The composer.json file in module root directory could look like this:
{
"name": "oxid-esales/logger-demo-module",
"description": "This package contains demo module for OXID eShop.",
"type": "oxideshop-module",
"keywords": ["oxid", "modules", "eShop", "demo"],
"homepage": "https://www.oxid-esales.com/en/home.html",
"license": [
"GPL-3.0-only",
"proprietary"
],
"require": {
"oxid-esales/event_logger_demo": "dev-master"
},
"autoload": {
"psr-4": {
"OxidEsales\\LoggerDemo\\": "../../../source/modules/oe/loggerdemo"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"extra": {
"oxideshop": {
"target-directory": "oe/loggerdemo"
}
}
}
The project composer.json file should have entries looking like this:
"repositories": {
"oxid-esales/logger-demo-module": {
"type": "path",
"url": "source/modules/oe/loggerdemo"
}
},
"require": {
"oxid-esales/logger-demo-module": "dev-master"
}
To register a namespace and download dependencies there is a need to run composer update command in project root directory:
composer update
Composer will generate the PSR-4 autoload file with included module. So at this point OXID eShop will be able to autoload classes.
Add entry to module metadata file¶
OXID eShop needs to know which class should be extended, to do this there is a need to add a record in metadata.php file:
'extend' => [
\OxidEsales\Eshop\Application\Model\Basket::class => \OxidEsales\LoggerDemo\Model\Basket::class,
],