#forms #validation #symfony #constraints #formbuilder
#формы #проверка #symfony #ограничения #formbuilder
Вопрос:
У меня есть такая форма в моем проекте symfony, обратите внимание, что соответствующее поле не является отображенным:
<?php
namespace MyAppMyBundleForm;
use SymfonyComponentFormAbstractType;
use SymfonyComponentFormFormBuilderInterface;
use SymfonyComponentOptionsResolverOptionsResolverInterface;
// validators and constraints
use SymfonyComponentValidatorConstraintsLength;
class ArtistWithConstraintType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$artist = $options['data'];
$builder
->add('professional', 'choice', array(
'expanded' => true,
'multiple' => false,
'choices' => array(false => 'You are a self-educated', true => 'You are a professional'),
'required' => true,
))
;
if ($artist amp;amp; $artist->getProfessional()) {
$builder->add('artistNumber', 'text', array(
'constraints' => array(
new Length(array(
'max' => 14,
'min' => 14))),
'required' => true,
))
;
} else {
$artist->setArtistNumber(null);
$builder->remove('artistNumber')
;
}
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'MyAppMyBundleEntityArtist',
'csrf_protection' => true,
'csrf_field_name' => '_token_artist',
// a unique key to help generate the secret token
'intention' => 'artist_item',
));
}
/**
* @return string
*/
public function getName()
{
return 'app_artist';
}
}
Фактически, в этой форме я спрашиваю исполнителя, является ли он профессиональным или нет. Если нет, никаких действий не требуется. Если true, методом ajax я отображаю поле с именем artistNumber
.
На данный момент все работает хорошо. За исключением ограничения проверки:
'constraints' => array(
new Length(array(
'max' => 14,
'min' => 14))),
Действительно, поле artistNumber должно быть строкой всего из 14 символов, не больше и не меньше. Но когда я проверяю свою форму, это ограничение проверки не принимается во внимание.
У меня нет проблем с отображением формы в представлении, нет проблем с ajax или нет проблем с восстановлением записи пользователя в artistNumber
поле. Но если пользователь вводит строку длиной менее или более 14 символов, проверка также не работает, и я восстанавливаюсь после ввода пользователем, даже если она меньше или больше 14 символов.
Где я здесь не прав?
Комментарии:
1. В вашем коде нет ничего плохого. Ограничение проверки должно работать нормально. Используете ли вы какие-либо группы проверки?
2. @MikhailProsalov спасибо за ваш комментарий, нет, я здесь не использую группу проверки.
3. Пожалуйста, попробуйте добавить ‘mapped’ => false в массив параметров поля artistNumber.
Ответ №1:
У вас есть условие перед добавлением ограничения. Проверьте, выполняется ли условие
$artist amp;amp; $artist->getProfessional()
верно, как вы предполагаете
Комментарии:
1. действительно, это хорошее предложение, но я проверяю,
$artist amp;amp; $artist->getProfessional()
верно ли значение, как я предполагал, и да, это так, поэтому я не думаю, что проблема в условии.