Очень часто некоторые новые действия мы делаем "на ощупь" пытаясь сделать по аналогии со знакомым функционалом.
Так было со мной когда мне потребовалось вывести значения атрибутов min и max в полях ActiveForm фреймворка YII2.
Первая мысль сделать по аналогии с maxlength
'maxlength' => true ,
то есть
'min'=> true , 'max'=> true ,
Но не тут то было, в коде значения из валидатора не подставлялись. Как оказалось в функционале фреймворка такой "фишки" нет.
Решение:
1. Открываем файл /vendor/yiisoft/yii2/helpers/BaseHtml.php
2. Находим функцию
private static function normalizeMaxLength($model, $attribute, &$options) { if (isset($options['maxlength']) && $options['maxlength'] === true) { unset($options['maxlength']); $attrName = static::getAttributeName($attribute); foreach ($model->getActiveValidators($attrName) as $validator) { if ($validator instanceof StringValidator && $validator->max !== null) { $options['maxlength'] = $validator->max; break; } } } }
и ниже вставляем аналогичную ей функцию на наши атрибуты:
private static function normalizeMinMaxValue($model, $attribute, &$options) { if (isset($options['min']) && $options['min'] === true) { unset($options['min']); $attrName = static::getAttributeName($attribute); foreach ($model->getActiveValidators($attrName) as $validator) { if ($validator instanceof NumberValidator && $validator->min !== null) { $options['min'] = $validator->min; break; } } } if (isset($options['max']) && $options['max'] === true) { unset($options['max']); $attrName = static::getAttributeName($attribute); foreach ($model->getActiveValidators($attrName) as $validator) { if ($validator instanceof NumberValidator && $validator->max !== null) { $options['max'] = $validator->max; break; } } } }
3. Прописываем вызов её... в этом же файле находим
return static::input($type, $name, $value, $options);
и выше вставляем следующий код:
self::normalizeMinMaxValue($model, $attribute, $options);
4. Остаётся только подключить нужное пространство имён в этом же файле...:
use yii\validators\NumberValidator;
Готово! Теперь не надо дублировать числовые значения данных атрибутов из валидатора в форму.