ADOBE COMMERCE

Adressvalidierung mit Adobe Commerce

Oleg Blinnikov

customer_address_validation_in_adobe_commerce_cloud Customer Address validation in Adobe Commerce Cloud

Die Adressvalidierung ist ein wesentlicher Schritt in der Kundenmanagement-Verarbeitung. Adobe Commerce bietet standardmäßig eine Reihe von Validierungsregeln. Jedes Unternehmen hat jedoch seine eigenen Verarbeitungsregeln, die von vielen Faktoren abhängen können. Dazu können der Standort des Kunden/des Unternehmens, ERP-Einschränkungen, Regeln des Versandanbieters oder andere Faktoren gehören. Schauen wir uns also an, wie wir neue Regeln zum Standard-Workflow von Adobe Commerce hinzufügen können.

Wir können Magento einfach mit benutzerdefinierten Validatoren erweitern. Ohne die Notwendigkeit, Kernfunktionen zu überschreiben, Plugins, Beobachter usw. zu erstellen.

Der wichtigste Erweiterungspunkt ist diese Klasse:

Magento\Customer\Model\Address\CompositeValidator

Diese Klasse sammelt alle in di.xml definierten Validatoren. Die Methode validate(AbstractAddress $address) prüft dann Adressinstanzen anhand dieser Validatoren. Wenn eine Prüfung fehlschlägt, gibt die Methode ein Array von Fehlern zurück.

Um einen benutzerdefinierten Prüfer hinzuzufügen, müssen wir einige Schritte im benutzerdefinierten Modul durchführen:

Step 1: Create module registration.php

<?php
declare(strict_types=1);

use Magento\Framework\Component\ComponentRegistrar;

ComponentRegistrar::register(ComponentRegistrar::MODULE, 'Comwrap_AddressValidation', __DIR__);

Step 2: Create module.xml

<?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="Comwrap_AddressValidation">
        <sequence>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>

Step 3: Create composer.json

{
  "name": "comwrap/address-validation",
  "version": "1.0.0",
  "description": "Module implements bunch of requirements on address validation",
  "type": "magento2-module",
  "require": {
      "magento/framework": "*",
      "magento/module-customer": "*"
  },
  "license": [
    "Proprietary"
  ],
  "autoload": {
    "files": [
      "registration.php"
    ],
    "psr-4": {
      "Comwrap\\AddressValidation\\": ""
    }
  }
}

Step 4: Create etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Customer\Model\Address\CompositeValidator">
        <arguments>
            <argument name="validators" xsi:type="array">
                <item name="encoding" xsi:type="object">Comwrap\AddressValidation\Model\Address\Validator\Encoding</item>
            </argument>
        </arguments>
    </type>
</config>

Step 5: Adding custom validator class

Erstellen Sie die Klasse Comwrap\AddressValidation\Model\Address\Validator\Encoding.php. Die Klasse muss die Schnittstelle \Magento\Customer\Model\Address\ValidatorInterface implementieren und die Methode validate implementieren.

Hier ist ein Beispiel für die Validierungscode:

<?php
declare(strict_types=1);

namespace Comwrap\AddressValidation\Model\Address\Validator;

use Magento\Customer\Model\Address\AbstractAddress;
use Magento\Customer\Model\Address\ValidatorInterface;

class Encoding implements ValidatorInterface
{
    /**
     * Error Message
     */
    public const ERROR_MESSAGE = 'Sorry, please use "/standard/" Western European characters only. Field: %fieldName';

    /**
     * @inheritdoc
     */
    public function validate(AbstractAddress $address): array
    {
        $errors = [];
        foreach ($address->getData() as $key => $value) {
            if ($value && is_string($value) && !$this->isValid($value)) {
                $errors[] = __(self::ERROR_MESSAGE, ['fieldName' => $key]);
            }
        }

        return $errors;
    }

    /**
     *
     * Basically, this validator tries to convert a string to ISO-8859-15 using iconv()
     * If iconv() fails, we assume that the string includes characters that do not fit our encoding
     *
     * @param string $value
     * @return bool
     */
    public function isValid(string $value): bool
    {
        // convert the string, if iconv fails the string was not proper
        $convertedString = @iconv('UTF-8', 'ISO-8859-15', $value);

        return (bool)$convertedString;
    }
}

Installieren Sie nun das neue Modul wie folgt:

php bin/magento module:enable Comwrap_AddressValidation
php bin/magento setup:upgrade
php bin/magento cache:flush

Wie Sie sehen, können Sie auf diese Weise jede beliebige benutzerdefinierte Validierungsregel hinzufügen. Dazu gehören einfache Validierungen oder einige komplexere Validierungen gegen APIs.

Photo by Erol Ahmed on Unsplash