我是新人,我需要一些帮助。
当我尝试验证表单时遇到问题。
在我的不同文件下面:
AmiAttrbType.php
<?php
namespace Site\TestBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class AmiAttrbType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email','text', array(
'required' => true,
'attr' => array(
'placeholder' => 'Adresse Mail'
)))
->add('produitsAttrb','collection', array(
'type' => new ProduitAttrbType()
));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Site\TestBundle\Entity\Ami'
));
}
/**
* @return string
*/
public function getName()
{
return 'site_testbundle_amiAttrb';
}
}
ProduitAttrbType.php
<?php
namespace Site\TestBundle\Form;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolverInterface;
class ProduitAttrbType extends AbstractType
{
/**
* @param FormBuilderInterface $builder
* @param array $options
*/
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('nom', 'hidden')
->add('qte','integer', array(
'required' => true
));
}
/**
* @param OptionsResolverInterface $resolver
*/
public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Site\TestBundle\Entity\ProduitAttrb'
));
}
/**
* @return string
*/
public function getName()
{
return 'site_testbundle_produitAttrb';
}
}
Controller.php这样
public function attrbAction(Event $commande)
{
$ami = new Ami;
foreach($commande->getProduits() as $produit)
{
$ami->addProduitsAttrb(new ProduitAttrb($produit->getNom(),0));
}
$form = $this->createForm(new AmiAttrbType(),$ami);
$request = $this->get('request');
if( $this->get('request')->getMethod() == 'POST' )
{
$form->bind($request);
if ($form->isValid())
{
$commande->addAmi($ami);
$em = $this->getDoctrine()->getManager();
$em->merge($commande);
$em->flush();
return $this->render('SiteTestBundle:Test:attrb.html.twig', array('commande' =>$commande, 'form' => $form->createView()));
}
}
return $this->render('SiteTestBundle:Test:attrb.html.twig', array('commande' =>$commande, 'form' => $form->createView()));
}
attrb.html.twig:
<tr>
<td class="attrb-new">
<div class="row">
<div class="col-xs-12">
{{ form_widget(form.email) }}
</div>
</div>
</td>
{% for produit in form.produitsAttrb %}
<td class="attrb-newQte">
{{ form_widget(produit.qte) }}
</td>
{% endfor %}
{{ form_rest(form) }}
</tr>
我有两个案例: 如果在控制器中我使用bind($ request),我有两个错误:
- Email empty (email has been entered)
- Token invalid (token exist in my source code)
我不明白为什么会出现这种错误。
如果我使用handleRequest($request)
,则不会发生任何事情。
我的symfony版本更高,但是bindhas总是有效。
当我在我的树枝代码中删除此部分时,我有bind($request)
:
{% for produit in form.produitsAttrb %}
<td class="attrb-newQte">
{{ form_widget(produit.qte) }}
</td>
{% endfor %}
这是有效的。
请你能帮助我。
提前谢谢。
问候
答案 0 :(得分:0)
您应该将Request对象传递给action而不是从服务中获取它。像这样:
public function testAction(Request $request, $myOtherArgs)
{
....
$form->handleRequest($request);
...
}
另外,如果您想查看导致错误的原因,可以在调用handleRequest
后对表单进行var_dump:
var_dump($form->getErrors(true));