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, но това не ми харесва. Може ли някой да ми обясни защо не работи правилно? :P

РЕДАКТИРАНЕ: Ето кода от контролера:

/**
 * @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, това ще доведе до показване на съобщение за собствен браузър, ако потребителят се опита да изпрати формуляра с това поле празно.

По отношение на вашето решение, това със сигурност ще работи, въпреки че може да обмислите да разчитате на вградения валидатори. Почти съм сигурен, че ограничението за броя на продуктите може да използва вградената Колекция за броене ограничение.

person Johnny    schedule 29.12.2013