Я хотел бы применить валидатор для ActiveRecord, но не для определенного поля, я имею в виду, я хотел бы видеть валидатор в сводке ошибок формы, но не связанных с определенным полем.Yii2 - Генерировать общую ошибку при проверке (не связанную с определенным атрибутом)
ответ
При написании пользовательской проверки вам необходимо использовать метод addError
yii\base\Model
(если вы пишете его в модели) или yii\validators\Validator
(если вы пишете отдельный валидатор).
Оба метода требуют $attribute
параметра (имя атрибута), который будет передан, и, как вы можете видеть из источников, вы не можете оставить это поле пустым:
addError
из yii\base\Model
:
/**
* Adds a new error to the specified attribute.
* @param string $attribute attribute name
* @param string $error new error message
*/
public function addError($attribute, $error = '')
{
$this->_errors[$attribute][] = $error;
}
addError
из yii\validators\Validator
:
/**
* Adds an error about the specified attribute to the model object.
* This is a helper method that performs message selection and internationalization.
* @param \yii\base\Model $model the data model being validated
* @param string $attribute the attribute being validated
* @param string $message the error message
* @param array $params values for the placeholders in the error message
*/
public function addError($model, $attribute, $message, $params = [])
{
$params['attribute'] = $model->getAttributeLabel($attribute);
if (!isset($params['value'])) {
$value = $model->$attribute;
if (is_array($value)) {
$params['value'] = 'array()';
} elseif (is_object($value) && !method_exists($value, '__toString')) {
$params['value'] = '(object)';
} else {
$params['value'] = $value;
}
}
$model->addError($attribute, Yii::$app->getI18n()->format($message, $params, Yii::$app->language));
}
Возможные варианты:
1) Выберите наиболее важное поле и добавьте дополнительную информацию.
2) Выберите несколько важных релевантных полей и добавьте к ним одно и то же сообщение об ошибке (вы можете сохранить и передать сообщение в отдельной переменной, прежде чем передавать код DRY).
3) Вы можете использовать не существующее имя атрибута для добавления ошибки, допустим, all
, поскольку в этой точке не проверяется существование атрибута.
class YourForm extends \yii\base\Model
{
/**
* @inheritdoc
*/
public function rules()
{
return [
['name', 'yourCustomValidationMethod'],
];
}
/**
* @return boolean
*/
public function yourCustomValidationMethod()
{
// Perform your custom validation here regardless of "name" attribute value and add error when needed
if (...) {
$this->addError('all', 'Your error message');
}
}
}
Обратите внимание, что вам все равно необходимо подключить валидатор к существующим атрибутам (иначе будет выбрано исключение). Используйте наиболее подходящий атрибут.
В результате вы увидите ошибку только в сводке ошибок. Вы можете отобразить сводные сведения об ошибке в форме, как, что:
<?= $form->errorSummary($model) ?>
Но в большинстве случаев всегда есть один или несколько атрибутов, связанных с ошибкой, поэтому я рекомендую использовать опцию или . Вариант - вид взлома, но я думаю, все еще довольно элегантное решение для вашей проблемы.
Большое спасибо. Моя цель - проверять улицы и города, и я хочу подтвердить, что одна улица не существует в том же городе, поскольку я ищу в базе данных по улице и городу, если эта запись существует, я хочу вернуться: «Улица существует в этом город". Я не хотел ассоциировать ошибку с именем, например, потому что это может быть смущено для пользователя. – Fdezdam
@Fdezdam Лучше упомянуть такие детали изначально при написании вопроса. Если ответ решит вашу проблему, примите его. Дополнительную информацию см. В разделе [раздел справки] (http://stackoverflow.com/help/someone-answers). – arogachev
- 1. Rails Simple Form - Добавить ошибку, не связанную с атрибутом
- 2. Yii2 При проверке
- 3. Матч элемента с определенным атрибутом, НО НЕ со вторым атрибутом
- 4. Просмотр элементов с определенным атрибутом
- 5. PHP getElementsByTagName с определенным атрибутом
- 6. JQuery селектор с определенным атрибутом
- 7. Продолжайте генерировать значения при проверке на ArrayList
- 8. Как получить книгу, связанную с определенным тегом
- 9. Найти элемент с определенным атрибутом с определенным значением
- 10. selenium найти все элементы с определенным атрибутом
- 11. Ошибка синтаксиса при выборе строки таблицы jquery с определенным атрибутом
- 12. Извлечение элемента предка с определенным атрибутом данных
- 13. JQuery Выбор первого ребенка с определенным атрибутом
- 14. JQuery - Перебор элементов с определенным атрибутом
- 15. переключение строки с определенным атрибутом в jquery datatable при нажатии
- 16. Ошибка при использовании JDOM, чтобы удалить элемент с определенным атрибутом
- 17. Diff XML, сопоставляемый определенным атрибутом
- 18. Yii2, Model find() с пользовательским атрибутом
- 19. как фильтровать элементы с определенным атрибутом пустым
- 20. jQuery найти неспецифические элементы с определенным атрибутом
- 21. Получить текст XML-с определенным атрибутом
- 22. Для каждого элемента с определенным атрибутом - Javascript
- 23. Выделяют к гнезду с определенным атрибутом объекта
- 24. Поиск всех классов с определенным атрибутом
- 25. Rails найти записи с определенным атрибутом
- 26. Вхождение элемента ограничения XSD с определенным атрибутом
- 27. Оператор LINQ, выберите поле с определенным атрибутом
- 28. jQuery: найдите элемент с определенным пользовательским атрибутом
- 29. JQuery показать/скрыть элементы с определенным атрибутом
- 30. Python: поиск всех классов с определенным атрибутом
Вы можете быть более конкретным и привести пример? Я предполагаю, что то, что вы ищете, переопределяет метод проверки, но трудно сказать без дополнительной информации. –