2012-06-07 30 views
3

我需要有關驗證表單的幫助,而不需要實體,但需要表單類。我的問題是在覆蓋方法getDefaultOoptions中,我的表單類中的集合約束。當我在我的控制器中綁定表單時,它不考慮這個集合。驗證表單沒有實體與表單類別

這是我的課的形式

namespace Projet\TicketBundle\Form; 

use Symfony\Component\Validator\Constraints\NotBlank; 
use Symfony\Component\Validator\Constraints\Collection; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilder; 

class TicketPackAndAppType extends AbstractType 
{ 
    public function buildForm(FormBuilder $builder, array $options) 
    { 
     $builder 
      ->add('total', 'text' ,array('label' => 'Total de la commande ',  'read_only' => true)) 


      ->add('address_delivery', 'entity' , array('class' => 'TacTill\CustomerBundle\Entity\Address', 
        'property' => 'address', 
        'required' => false, 
        'label' => 'Adresse de livraison ', 
        'required' => false 
       )) 
      ->add('address_invoice', 'entity' , array('class' => 'TacTill\CustomerBundle\Entity\Address', 
        'property' => 'address', 
        'required' => false, 
        'label' => 'Adresse de facturaton ', 
        'required' => false 
       )) 


      ->add('color', 'choice', array(
       'choices' => array(
        'B' => 'Noir', 
        'W' => 'Blanc'), 
       'required' => true, 
       "property_path" => false, 
       'expanded' => true, 
       'multiple' => false 
      )) 

      ->add('model', 'choice', array(
       'choices' => array(
        'iPadDeux16Gowifi' => '16 Go Wifi', 
        'iPadDeux16Gowifi3G' => '16 Go Wifi et 3G', 
        'iPadNew16Gowifi' => '16GoWifi', 
        'iPadNew32Gowifi' => '32 Go Wifi', 
        'iPadNew64Gowifi' => '64 Go Wifi', 
        'iPadNew16Gowifi4G' => '16 Go Wifi et 4G', 
        'iPadNew32Gowifi4G' => '32 Go Wifi et 4G', 
        'iPadNew64Gowifi4G' => '64 Go Wifi et 4G' 
        ), 
       'required' => true, 
       "property_path" => false, 
       'expanded' => true, 
       'multiple' => false 
      ))  

      ->add('stand', 'choice', array(
       'choices' => array(
        'standsecurity' => 'Sécurité', 
        'standdesign' => 'Design', 
        'standmobility' => 'Mobilité' 
        ), 
       'required' => true, 
       "property_path" => false, 
       'expanded' => true, 
       'multiple' => false 
      )) 

      ->add('printer', 'choice', array(
       'choices' => array(
        'printerB' => 'Noire', 
        'printerW' => 'Blanche' 
        ), 
       'required' => true, 
       "property_path" => false, 
       'expanded' => true, 
       'multiple' => false 
      )) 

      ->add('cashDrawer', 'choice', array(
       'choices' => array(
        'cashDrawerG' => 'Graphite', 
        'cashDrawerP' => 'Perle' 
        ), 
       'required' => true, 
       "property_path" => false, 
       'expanded' => true, 
       'multiple' => false 
      )) 

      ->add('app', 'choice', array(
       'choices' => array(
        'appSmall' => 'S\'abonner à TacTill', 
        'noApp' => 'Télécharger l\'application plus tard' 
        ), 
       'required' => true, 
       "property_path" => false, 
       'expanded' => true, 
       'multiple' => false 
      ))     
     ;      

    } 


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

    public function getDefaultOptions(array $options) 
    { 
     $collectionConstraint = new Collection(array(
       'color' => new NotBlank(array('message' => 'Champ vide')), 
       'model' => new NotBlank(array('message' => 'Champ vide')), 
       'stand' => new NotBlank(array('message' => 'Champ vide')), 
       'printer' => new NotBlank(array('message' => 'Champ vide')), 
       'cashDrawer' => new NotBlank(array('message' => 'Champ vide')), 
       'app' => new NotBlank(array('message' => 'Champ vide')), 
     )); 

     return array('validation_constraint' => $collectionConstraint); 
    } 
} 

在我的控制器

public function createOrderAction() 
{ 

    $em = $this->getDoctrine()->getEntityManager(); 

    $requestInArray = $this->getRequest()->request->get('ticket_packandapptype'); 

    $request = $this->getRequest(); 
    $form = $this->createForm(new TicketPackAndAppType()); 

    if ($request->getMethod() == 'POST') { 

     $form->bind($requestInArray); 



     $stand = $requestInArray['stand']; 
     $printer = $requestInArray['printer']; 
     $cashDrawer = $requestInArray['cashDrawer']; 
     $app = $requestInArray['app']; 
    } 
} 

我也有bindRequest測試,這是同樣的問題。

我按照Validation without class但我不知道錯在哪裏。 當我完成無形式類時,集合約束效果很好。

如果您有任何想法,請向我解釋。謝謝

回答

1

你應該做的水木清華這樣的:

if ($request->getMethod() == 'POST') { 

    $form->bindRequest($request); 
    if ($form->isValid()) { 
     //do your actions with form values 
    } else { 
     //return form with error messages 
     //or do smth else... 
    } 

}

當你調用isValid()的Symfony的嘗試你與你的約束達亞檢查...

另外,應通過形式讓您的數據:

$data = $form->get('your_field_name')->getData(); 

當然,你應該b之後做請求的形式...