Вот полный и реальный рабочий пример добавления пользовательского правила в поле ввода контроля для проверки минимального возраста:
Создайте requirejs-config.js в своем модуле, чтобы добавить микширование к validator
объекту Namespace/Modulename/view/frontend/requirejs-config.js
со следующим содержимым:
var config = {
config: {
mixins: {
'Magento_Ui/js/lib/validation/validator': {
'Namespace_Modulename/js/validator-mixin': true
}
}
}
};
Создайте js-скрипт в папке вашего модуля Namespace/Modulename/view/frontend/web/js/validator-mixin.js
со следующим содержимым:
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;
};
});
ПРИМЕНЕНИЕ
Если вы хотите использовать плагин Magento PHP для вставки поля ввода в адрес доставки вашего заказа и проверки содержимого этого поля с помощью пользовательского правила, которое вы ранее добавили, вот пример кода:
Создайте di.xml
файл в etc/frontend
папке вашего модуля со следующим содержимым:
<?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>
Затем создайте LayoutProcessor.php
файл app/code/Namespace/Modulename/Plugin/Block/Checkout/LayoutProcessor.php
со следующим содержимым, обновите его для своих нужд:
<?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
);
}
}
РЕДАКТИРОВАТЬ
Спасибо @ alan-storm за ваше объяснение здесь https://alanstorm.com/the-curious-case-of-magento-2-mixins/ и @ jisse-reitsma приводят в направлении
Плюс документ Magento 2 http://devdocs.magento.com/guides/v2.2/javascript-dev-guide/javascript/js_mixins.html
Loading failed for the <script> with source “.../validator-mixin.js"
иScript error for: Namespace_Modulename/js/validator-mixin
.validator-mixin.js
место должно быть:/view/frontend/web/js/validator-mixin.js
Оригинал
rules.js
возвращает литерал объекта, содержащий все правила. Вы можете изменить этот литерал объекта, добавив миксин в этот файл. Документы Magento дают некоторые рекомендации о том, как это сделать: Magento Javascript Mixinsисточник
Здесь ответили на ту же проблему: Magento 2 добавить пользовательское правило проверки
Действительно хороший источник для понимания этой системы здесь: https://alanstorm.com/the-curious-case-of-magento-2-mixins/
И не совсем то, что вы пытаетесь сделать, но очень хороший источник здесь: https://www.youtube.com/watch?v=0fguDL5iEd0&t=540s
источник
Это работает для меня:
Создайте requirejs-config.js в своем модуле, чтобы добавить микширование к объекту валидатора в app / design / frontend / Vendor / Theme / Magento_Ui / requirejs-config.js со следующим содержимым:
Создайте js-скрипт в папке вашего модуля в app / design / frontend / Vendor / Theme / Magento_Ui / web / js / lib / validation / rules-mixin.js со следующим содержимым:
источник