Le module est un élément structurel de Commerce - l’ensemble du système repose sur des modules. En règle générale, la première étape de la création d’une personnalisation est la création d’un module.
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
<module name="Training_Sales">
<sequence>
<module name="Magento_Sales"/>
</sequence>
</module>
</config>
<?php
use Magento\Framework\Component\ComponentRegistrar;
ComponentRegistrar::register(
ComponentRegistrar::MODULE,
'Training_Sales',
__DIR__);
L’étape suivante consiste à ajouter des fonctionnalités à notre module de base. Un module externe est un outil essentiel que tous les développeurs Adobe Commerce utilisent. Cette vidéo et ce tutoriel vous aident à créer un module externe.
di.xml
.around
modules externes. Ils sont tentants d’utiliser, mais sont souvent le mauvais choix et entraîneront des problèmes de performances.Voici les classes XML et PHP utilisées dans le tutoriel pour ajouter un module externe au premier module.
<?xml version="1.0" ?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<!-- A Plugin that executes when the admin user places an order -->
<type name="Magento\Sales\Model\Order">
<plugin name="admin-training-sales-add-logging" type="Training\Sales\Plugin\AdminAddLoggingAfterOrderPlacePlugin" disabled="false" sortOrder="0"/>
</type>
</config>
<?xml version="1.0" ?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<!-- A plugin that executes when a customer uses the LoginPost controller from the Luma frontend -->
<type name="Magento\Customer\Controller\Account\LoginPost">
<plugin name="training-customer-loginpost-plugin"
type="Training\Sales\Plugin\CustomerLoginPostPlugin" sortOrder="20"/>
</type>
</config>
<?xml version="1.0" ?>
<!--
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
-->
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<!-- A plugin that executes when the REST API is used OR when the Luma frontend places an order -->
<type name="Magento\Sales\Model\Order">
<plugin name="rest-training-sales-add-logging" type="Training\Sales\Plugin\RestAddLoggingAfterOrderPlacePlugin"/>
</type>
</config>
<?php
declare(strict_types=1);
namespace Training\Sales\Plugin;
use Magento\Sales\Model\Order;
use Psr\Log\LoggerInterface;
/**
*
*/
class AdminAddLoggingAfterOrderPlacePlugin
{
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @param LoggerInterface $logger
*/
public function __construct(
LoggerInterface $logger
) {
$this->logger = $logger;
}
/**
* Add log after an order is placed
*
* @param Order $subject
* @param Order $result
* @return Order
*/
public function afterPlace(Order $subject, Order $result): Order
{
// Log this admin area order
$this->logger->notice('An ADMIN User placed an Order - $' . $subject->getBaseTotalDue());
return $result;
}
}
<?php
declare(strict_types=1);
namespace Training\Sales\Plugin;
use Psr\Log\LoggerInterface;
use Magento\Framework\App\RequestInterface;
/**
* Introduces Context information for ActionInterface of Customer Action
*/
class CustomerLoginPostPlugin
{
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @var RequestInterface
*/
private RequestInterface $request;
/**
* @param LoggerInterface $logger
* @param RequestInterface $request
*/
public function __construct(LoggerInterface $logger, RequestInterface $request)
{
$this->logger = $logger;
$this->request = $request;
}
/**
* Simple example of a before Plugin on a public method in a Controller
*/
public function beforeExecute()
{
$login = $this->request->getParam('login');
$username = $login['username'];
$this->logger->notice( "Login Post controller was used for " . $username );
}
}
<?php
declare(strict_types=1);
namespace Training\Sales\Plugin;
use Magento\Sales\Model\Order;
use Psr\Log\LoggerInterface;
/**
*
*/
class RestAddLoggingAfterOrderPlacePlugin
{
/**
* @var LoggerInterface
*/
private LoggerInterface $logger;
/**
* @param LoggerInterface $logger
*/
public function __construct(
LoggerInterface $logger
) {
$this->logger = $logger;
}
/**
* Add log after an order is placed
*
* @param Order $subject
* @param Order $result
* @return Order
*/
public function afterPlace(Order $subject, Order $result): Order
{
// Log this customer driven order
$this->logger->notice('A Customer placed an Order for $' . $subject->getBaseTotalDue());
return $result;
}
}