Symfony2多项选择无法验证

时间:2013-11-06 17:20:31

标签: php forms symfony multiple-choice

我正在创建一个简单的商店购物车列表,其中包含分配给用户和产品的商品。 我的新购物车形式如下:

 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的“required”,但我不喜欢这样。有人可以向我解释为什么它不能正常工作吗? :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());
}

第二次编辑:

我找到了一个解决方案,(不知道是否最好,但有效):)所以如果有人遇到过:

您必须在YourBundle / Resources / config下创建验证文件(例如 validation.yml ),您必须在其中放置有关属性的信息。就我而言,它是:

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);
 }
}

1 个答案:

答案 0 :(得分:0)

@Mati,关于您关于所需选项如何工作的第一个问题,此选项仅在HTML5中设置所需属性,因此不会对服务器端执行任何操作。来自documentation

  

从HTML5开始,许多浏览器可以在本机上强制执行某些验证   客户端的限制。最常见的验证是   通过在字段上呈现必需属性来激活   需要。对于支持HTML5的浏览器,这将导致a   如果用户尝试提交,则显示本机浏览器消息   形式与该字段空白。

关于您的解决方案,虽然您可能需要考虑依赖内置validators,但这肯定会有效。我很确定产品计数约束可以使用内置的Count Collection约束。