Множественный выбор Symfony2 не проверяется

Я создаю простой список корзин с назначенными пользователями и продуктами. Моя форма для новой корзины выглядит так:

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('cartName', 'text', array('label' =>'Nazwa koszyka:'))
        ->add('user', new UserForm(), array('data_class' => 'Zadanie\Bundle\Entity\User', 'label' => false))
        ->add('products','entity', array('label' => 'Wybierz produkty:', 'class' =>'Zadanie\Bundle\Entity\Product' , 'multiple' => true, 'required' => true))
        ->add('Zapisz', 'submit');
}

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

Пока я просто добавил «требуется» jquery, но мне это не нравится. Может кто-нибудь объяснить мне, почему он не работает должным образом? :П

EDIT: Вот код контроллера:

/**
 * @Route("/cart/edit/{id}",name="_edit_cart")
 * @Template()
 */
public function editAction($id, Request $request)
{  
    $cart = $this->getDoctrine()->getRepository('ZadanieBundle:Cart')->find($id);

    if($cart == null)
    {
        throw $this->createNotFoundException('Nie znaleziono rekordu');
    }

    $form = $this->createForm(new CartForm(), $cart);

    $form->handleRequest($request);

    if($form->isValid())
    {
        $em = $this->getDoctrine()->getManager();   
        $data = $form->getData();
        $em->persist($data);
        $em->flush();

        $this->get('session')->getFlashBag()->set('message', 'Koszyk zaktualizowano.');
        return $this->redirect($this->generateUrl('_main_carts'));

    }

    return array('form' => $form->createView());
}

ВТОРОЕ ИЗМЕНЕНИЕ:

я нашел РЕШЕНИЕ (не знаю, лучшее ли, но работает :)), поэтому, если кто-нибудь столкнется с этим:

Вы должны создать свой файл проверки (например, validation.yml) в YourBundle/Resources/config, в который вы должны поместить информацию о свойствах. В моем случае это было:

Zadanie\Bundle\Entity\Cart:
properties:
    cartname:
        - NotBlank: ~
    user:
          - NotBlank: ~
constraints:
    - Callback:
        methods:
            -    [Zadanie\Bundle\Form\MyValidator, isUserValid]

а затем я создал MyValidator:

namespace Zadanie\Bundle\Form;
use Symfony\Component\Validator\ExecutionContextInterface;
use Zadanie\Bundle\Entity\Cart;

class MyValidator {

  public static function isUserValid(Cart $cart, ExecutionContextInterface $context)
  {
    if(!$cart->getUser()->getName())
        $context->addViolationAt('name', 'Proszę podać imię.', array(), null);
    if(!$cart->getUser()->getSurname())
        $context->addViolationAt('surname', 'Proszę podać nazwisko.', array(), null);
    if(count($cart->getProducts()) == 0)
        $context->addViolationAt('products', 'Proszę wybrać produkt.', array(), null);
 }
}

person mmmm    schedule 06.11.2013    source источник
comment
Предоставьте некоторый код (вероятно, из вашего контроллера), который показывает, где вы реализуете эту форму/обрабатываете отправку формы. Это поможет нам помочь вам.   -  person Peter Bailey    schedule 06.11.2013
comment
Кроме того, покажите нам сущность своей корзины...   -  person Jovan Perovic    schedule 07.11.2013


Ответы (1)


@Mati, что касается вашего первого вопроса о том, как работает требуемый параметр, этот параметр устанавливает только обязательный атрибут в HTML5, поэтому ничего не делает на стороне сервера. Из документации

Начиная с HTML5, многие браузеры могут изначально применять определенные ограничения проверки на стороне клиента. Наиболее распространенная проверка активируется путем отображения обязательного атрибута в обязательных полях. Для браузеров, поддерживающих HTML5, это приведет к отображению собственного сообщения браузера, если пользователь попытается отправить форму с пустым полем.

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

person Johnny    schedule 29.12.2013