Полевые специфические ошибки на повторном поле

Я обязан отображать ошибки в определенных полях в зависимости от ситуации. В моем случае их может быть два. Которые Password is empty а также Passwords do not match, В настоящее время все сообщения отображаются под password.second поле.

Мне нужно отобразить Password is empty ошибка под password.first поле и Passwords don not match под password.second поле.

Я пытался генерировать ошибки отдельно через {% for error in form.password.first.vars.errors %} а также {% for error in form.password.second.vars.errors %} но не удалось, так как два требуемых сообщения об ошибках отображаются только при использовании {% for error in form.password.vars.errors %}, Я был в этом в течение довольно долгого времени и вернулся с пустыми руками. Реализация заключается в следующем,

Я использую repeated поле для реализации password а также confirm password следующее,

$builder->add( 'password', 'repeated', array( 'type' => 'password','required' => true,  'invalid_message' => ErrorMessages::PASSWORDS_DO_NOT_MATCH, 'options' => array('attr' => array('class' => 'password-field form-control')),'first_options'  => array('label' => false,'error_bubbling' => true,'label_attr'=>array('class'=>'col-sm-4 control-label')),'second_options' => array('label' => false,'label_attr'=>array('class'=>'col-sm-4 control-label'))));

И password entity проверка заключается в следующем,

class User implements UserInterface, \Serializable {

/**
* @Assert\Email(message=ErrorMessages::EMAIL_ADDRESS_INVALID)
* @Assert\NotBlank(message=ErrorMessages::EMAIL_ADDRESS_EMPTY)
*/
private $email;

/**
* @Assert\NotBlank(message=ErrorMessages::PASSWORD_EMPTY, groups={"full"})
*/
private $password;
....

Я рендерил эти два поля в twig следующим образом,

<div class="form-group {% if form.password.vars.errors|length > 0 %}has-error{% endif %} {% if form.password.vars.required == 'true' %}required{% endif %}">
{{ form_label(form.password.first, "Password") }}
<div class="col-sm-8">
{{ form_row(form.password.first) }}
</div>
</div>
<div class="form-group {% if form.password.vars.errors|length > 0 %}has-error{% endif %} {% if form.password.vars.required == 'true' %}required{% endif %}">
{{ form_label(form.password.second, "Confirm password") }}
<div class="col-sm-8">
{{ form_row(form.password.second) }}
<span class="help-block">
{% for error in form.password.vars.errors %}
{{ error.messageTemplate|trans(error.messageParameters, 'validators')~'' }}
{% endfor %}
</span>
</div>
</div>

1

Решение

Если вы хотите использовать удобный repeated поле, то вы, вероятно, застряли — путь repeated работает, чтобы дублировать, используя ValueToDuplicatesTransformer, поле, которое вы добавляете в два поля, содержащие одинаковые данные, и это гарантирует, что они совпадают в той точке, где Transformer превращает отправленные значения формы обратно в данные модели (без использования нормальных ограничений). Из проверочного PoV есть только одно поле, поэтому вы не можете выбрать, против какого текстового поля будет идти ошибка.

Но могут быть и другие варианты, если вы хотите разобраться сами!

Вы могли бы сделать Пользовательское ограничение проверки. Чтобы добиться того поведения, за которым вы, я думаю, вам нужно, чтобы оно было Валидатор класса, так что он имеет доступ к обоим полям одновременно и может сравнивать их. Однако это снова будет означать, что ошибка применяется на более высоком уровне, чем вы хотите, поэтому, вероятно, не будет работать.

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

контроллер

// ...

$password1 = $form->get('password1');
$password2 = $form->get('password2');
if ($password1->getData() != $password2->getData() )
{
$password2->addError(new FormError("Passwords do not match!") );
}

// ...
1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector