2016-09-27 1 views
0

Я хотел бы применить валидатор для ActiveRecord, но не для определенного поля, я имею в виду, я хотел бы видеть валидатор в сводке ошибок формы, но не связанных с определенным полем.Yii2 - Генерировать общую ошибку при проверке (не связанную с определенным атрибутом)

+0

Вы можете быть более конкретным и привести пример? Я предполагаю, что то, что вы ищете, переопределяет метод проверки, но трудно сказать без дополнительной информации. –

ответ

0

При написании пользовательской проверки вам необходимо использовать метод addErroryii\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) ?> 

Но в большинстве случаев всегда есть один или несколько атрибутов, связанных с ошибкой, поэтому я рекомендую использовать опцию или . Вариант - вид взлома, но я думаю, все еще довольно элегантное решение для вашей проблемы.

+1

Большое спасибо. Моя цель - проверять улицы и города, и я хочу подтвердить, что одна улица не существует в том же городе, поскольку я ищу в базе данных по улице и городу, если эта запись существует, я хочу вернуться: «Улица существует в этом город". Я не хотел ассоциировать ошибку с именем, например, потому что это может быть смущено для пользователя. – Fdezdam

+0

@Fdezdam Лучше упомянуть такие детали изначально при написании вопроса. Если ответ решит вашу проблему, примите его. Дополнительную информацию см. В разделе [раздел справки] (http://stackoverflow.com/help/someone-answers). – arogachev

Смежные вопросы