エンティティはないがフォームクラスがある検証フォームについてサポートが必要です。私の問題は、オーバーライドメソッド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でテストしましたが、それは同じ問題です。
私はクラスなしで検証に従いますが、どこに間違いがあるのかわかりません。フォームなしのクラスを実行すると、コレクションの制約が適切に機能します。
何かアイデアがあれば、私に説明してください。ありがとうございました