Voici un exemple de travail complet et réel pour ajouter une règle personnalisée au champ de saisie de paiement pour vérifier l'âge minimum:
Créez un requirejs-config.js dans votre module pour ajouter un mixage à l' validator
objet Namespace/Modulename/view/frontend/requirejs-config.js
avec le contenu suivant:
var config = {
config: {
mixins: {
'Magento_Ui/js/lib/validation/validator': {
'Namespace_Modulename/js/validator-mixin': true
}
}
}
};
Créez un script js dans votre dossier de module Namespace/Modulename/view/frontend/web/js/validator-mixin.js
avec le contenu suivant:
define([
'jquery',
'moment'
], function ($, moment) {
'use strict';
return function (validator) {
validator.addRule(
'validate-minimum-age',
function (value, params, additionalParams) {
return $.mage.isEmptyNoTrim(value) || moment(value, additionalParams.dateFormat).isBefore(moment().subtract(params.minimum_age, 'y'));
},
$.mage.__("Sorry, you don't have the age to purchase the current articles.")
);
return validator;
};
});
USAGE
Si vous souhaitez utiliser un plugin PHP Magento pour insérer un champ de saisie dans votre adresse de livraison et valider le contenu de ce champ avec la règle personnalisée que vous avez ajoutée précédemment, voici un exemple de code:
Créez un di.xml
fichier dans le etc/frontend
dossier de votre module avec le contenu suivant:
<?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\Checkout\Block\Checkout\LayoutProcessor">
<plugin name="CheckoutLayoutProcessor" type="Namespace\Modulename\Plugin\Block\Checkout\LayoutProcessor" />
</type>
</config>
Créez ensuite le LayoutProcessor.php
fichier app/code/Namespace/Modulename/Plugin/Block/Checkout/LayoutProcessor.php
avec le contenu suivant, veuillez le mettre à jour selon vos besoins:
<?php
/**
* diglin GmbH - Switzerland
*
* @author Sylvain Rayé <support **at** diglin.com>
* @category diglin
* @package diglin
* @copyright Copyright (c) diglin (http://www.diglin.com)
*/
namespace MyNamespace\Modulename\Plugin\Block\Checkout;
use MyNamespace\Modulename\Helper\AgeValidation;
/**
* Class LayoutProcessor
* @package MyNamespace\Modulename\Plugin\Block\Checkout
*/
class LayoutProcessor
{
/**
* @var \MyNamespace\Checkout\Helper\AgeValidation
*/
private $ageValidation;
/**
* @var \Magento\Framework\Stdlib\DateTime\TimezoneInterface
*/
private $timezone;
/**
* @var \Magento\Framework\App\Config\ScopeConfigInterface
*/
private $scopeConfig;
/**
* LayoutProcessor constructor.
*
* @param \MyNamespace\Checkout\Helper\AgeValidation $ageValidation
* @param \Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone
* @param \Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
*/
public function __construct(
AgeValidation $ageValidation,
\Magento\Framework\Stdlib\DateTime\TimezoneInterface $timezone,
\Magento\Framework\App\Config\ScopeConfigInterface $scopeConfig
)
{
$this->ageValidation = $ageValidation;
$this->timezone = $timezone;
$this->scopeConfig = $scopeConfig;
}
/**
* Checkout LayoutProcessor after process plugin.
*
* @param \Magento\Checkout\Block\Checkout\LayoutProcessor $processor
* @param array $jsLayout
*
* @return array
*/
public function afterProcess(\Magento\Checkout\Block\Checkout\LayoutProcessor $processor, $jsLayout)
{
$shippingConfiguration = &$jsLayout['components']['checkout']['children']['steps']['children']['shipping-step']
['children']['shippingAddress']['children']['shipping-address-fieldset']['children'];
// Checks if shipping step available.
if (isset($shippingConfiguration)) {
$shippingConfiguration = $this->processAddress(
$shippingConfiguration
);
}
return $jsLayout;
}
/**
* Process provided address to contains checkbox and have trackable address fields.
*
* @param $addressFieldset - Address fieldset config.
*
* @return array
*/
private function processAddress($addressFieldset)
{
$minimumAge = $this->ageValidation->getMinimumAge();
if ($minimumAge === null) {
unset($addressFieldset['my_dob']);
} else {
$addressFieldset['my_dob'] = array_merge(
$addressFieldset['my_dob'],
[
'component' => 'Magento_Ui/js/form/element/date',
'config' => array_merge(
$addressFieldset['my_dob']['config'],
[
'elementTmpl' => 'ui/form/element/date',
// options of datepicker - see http://api.jqueryui.com/datepicker/
'options' => [
'dateFormat' => $this->timezone->getDateFormatWithLongYear(),
'yearRange' => '-120y:c+nn',
'maxDate' => '-1d',
'changeMonth' => 'true',
'changeYear' => 'true',
'showOn' => 'both',
'firstDay' => $this->getFirstDay(),
],
]
),
'validation' => array_merge($addressFieldset['my_dob']['validation'],
[
'required-entry' => true,
'validate-date' => true,
'validate-minimum-age' => $minimumAge, // custom value in year - array('minimum_age' => 16)
]
),
]
);
}
return $addressFieldset;
}
/**
* Return first day of the week
*
* @return int
*/
public function getFirstDay()
{
return (int)$this->scopeConfig->getValue(
'general/locale/firstday',
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
);
}
}
ÉDITER
Merci @ alan-storm pour votre explication ici https://alanstorm.com/the-curious-case-of-magento-2-mixins/ et @ jisse-reitsma apporter dans la direction
Plus Magento 2 doc http://devdocs.magento.com/guides/v2.2/javascript-dev-guide/javascript/js_mixins.html
Loading failed for the <script> with source “.../validator-mixin.js"
etScript error for: Namespace_Modulename/js/validator-mixin
.validator-mixin.js
l'emplacement devrait être:/view/frontend/web/js/validator-mixin.js
L'original
rules.js
renvoie un objet littéral, contenant toutes les règles. Vous pouvez modifier cet objet littéral en ajoutant un mixin à ce fichier. Les documents Magento donnent quelques conseils sur la façon de procéder: Magento Javascript Mixinsla source
Le même problème a été répondu ici: Magento 2 ajoute une règle de validation personnalisée
Une très bonne source pour comprendre ce système est ici: https://alanstorm.com/the-curious-case-of-magento-2-mixins/
Et pas exactement ce que vous essayez de faire, mais une très bonne source ici: https://www.youtube.com/watch?v=0fguDL5iEd0&t=540s
la source
Cela fonctionne pour moi:
Créez un requirejs-config.js dans votre module pour ajouter un mélange à l'objet validateur dans app / design / frontend / Vendor / Theme / Magento_Ui / requirejs-config.js avec le contenu suivant:
Créez un script js dans votre dossier de module dans app / design / frontend / Vendor / Theme / Magento_Ui / web / js / lib / validation / rules-mixin.js avec le contenu suivant:
la source