Symfony делает часть формы необязательной при отправке

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

Моя форма содержит две встроенные формы адреса, которые в точности совпадают с адресом одного счета и одним адресом доставки. Если выбран альтернативный вариант, я хочу сделать форму адреса доставки обязательной для проверки. Если альтернативный вариант не выбран, форма адреса доставки не требует проверки и должна быть оставлена ​​в покое.

CustomerCheckoutForm

class CustomerCheckoutForm extends AbstractType
{

public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('id', 'hidden')
->add('firstName', 'text')
->add('nameAdditions', 'text')
->add('lastName', 'text')
->add('gender', 'choice', array('expanded' => true, 'choices' => array('m' => 'M', 'f' => 'F')))
->add('birthDate', 'date', array(
'required' => true,
'input' => 'string',
'widget' => 'choice',
'years' => range(DATE_CURRENT_YEAR - 80, DATE_CURRENT_YEAR - 18),
'empty_value' => array('year' => 'Year', 'month' => 'Month', 'day' => 'Day')
))
->add('invoiceAddress', new AddressForm($options['countryMapper']), array(
'label' => false,
'required' => true,
))
->add('alternative_shipment_address', 'choice', array(
'expanded' => true,
'choices' => array(0 => 'Delivery on the current address', 1 => 'Alternative shipping address'),
'mapped' => false,
'required' => true,
'label' => 'Delivery address',
'data' => 0,
))
->add('shipmentAddress', new AddressForm($options['countryMapper']), array(
'label' => false,
'required' => false,
))
->add('Continue', 'submit');

$this->registerListeners($builder);
}

private function registerListeners(FormBuilderInterface $builder)
{
$builder->addEventListener(FormEvents::PRE_SET_DATA, function(FormEvent $event) {
$customer = $event->getData();
$form = $event->getForm();

if (!$customer || $customer->getId() === null) {
$form->add('password', 'password');
}
});
}

/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'EHV\SharedBundle\Model\Customer',
'countryMapper' => null,
'validation_groups' => array(
'Default',
'checkout',
),
));
}

public function getName()
{
return 'customerCheckout';
}

}

AddressForm

class AddressForm extends AbstractType
{

private $countryMapper;

public function __construct(CountryMapper $countryMapper)
{
$this->countryMapper = $countryMapper;
}

public function buildForm(FormBuilderInterface $builder, array $options)
{
$transformer = new CountryToIdTransformer($this->countryMapper);
$countries = $this->countryMapper->getAll();
$data[''] = 'Make a choice...';

/** @var Country $country */
foreach ($countries as $country) {
$data[$country->getId()] = $country->getName();
}

$builder
->add('id', 'hidden')
->add('streetName', 'text')
->add('streetNumber', 'text')
->add('streetNumberAddition', 'text')
->add('postalCode', 'text')
->add('city', 'text')
->add(
$builder->create('country', 'choice', array('choices' => $data))
->addModelTransformer($transformer)
);
}

/**
* {@inheritdoc}
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'EHV\SharedBundle\Model\Address',
));
}

public function getName()
{
return 'address';
}

}

Обе модели имеют свои собственные ограничения, установленные через функцию:

public static function loadValidatorMetadata(ClassMetaData $metadata) {}

2

Решение

Ограничения обратного вызова Checkout http://symfony.com/doc/current/reference/constraints/Callback.html

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

1

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

Мне удалось использовать Form event listener с Constraint Callback ответил Hpatoio, подробности ниже.

CustomerCheckoutForm

    $builder->addEventListener(FormEvents::SUBMIT, function(FormEvent $event) {
$form = $event->getForm();
$customer = $event->getData();

if ($form->get('alternative_shipment_address')->getData() === 0) {
$customer->setShipmentAddress(null);
}
});

CustomerConstraint

    $callback = function($customer) use ($metadata) {
$metadata->addPropertyConstraint('invoiceAddress', new Valid());

/** @var Customer $customer */
if ($customer->getShipmentAddress() !== null) {
$metadata->addPropertyConstraint('shipmentAddress', new Valid());
}
};

$metadata->addConstraint(new Callback($callback));

Кредиты для Hpatoio для указания правильного направления.

0

По вопросам рекламы [email protected]