【问题标题】:Symfony2 form entity class parametersSymfony2表单实体类参数
【发布时间】:2014-05-26 15:01:47
【问题描述】:

我的表单实体中需要一个 id 值,但我找不到从控制器获取它的方法。 我尝试了许多没有成功的选项,也到处搜索。 这是控制器代码:

    public function addClientAction(Request $request, $idSocietate)
 {

    $societate = $this->getSocietate($idSocietate);
    //$locatii = $this->getLocatii();

    $client = new Clienti();
    $dateClienti = new DateClienti();
    $client->getDateClienti()->add($dateClienti);

    $form = $this->createForm(new FormClientiType($idSocietate), $client);
    $request = $this->get('request');



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

        if ($form->isValid()) {
            // Persist objects to database
            $usr = $this->get('security.context')->getToken()->getUser();

            $em = $this->getDoctrine()
                    ->getManager();
            $client->setAdaugatDe($usr->getUsername());
            $client->setSocietati($societate);
            $em->persist($client);
            $em->flush();
            $this->get('session')->getFlashBag()->set('form-notice', 'Client adaugata cu succes.');

            // Redirect - This is important to prevent users re-posting
            // the form if they refresh the page
            return $this->redirect($this->generateUrl('clienti_adauga',        array('idSocietate' => $idSocietate)));
        }
    }

这里是表单实体类:

<?php
 // src/Blogger/BlogBundle/Form/EnquiryType.php

 namespace Mnv\CoreBundle\Form;

 use Symfony\Component\Form\AbstractType;
 use Symfony\Component\Form\FormBuilderInterface;
 use Symfony\Component\OptionsResolver\OptionsResolverInterface;


class FormClientiType extends AbstractType
{
private $idSocietate;

public function __construct($idSocietate) {
    $this->idSocietate = $idSocietate;
    var_dump($idSocietate); exit;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => 'Mnv\CoreBundle\Entity\Clienti',
        'cascade_validation' => true,
        'idSocietate' => $this->idSocietate,
    ));
}

public function buildForm(FormBuilderInterface $builder, array $options)
{

    $builder->add('cod','text', array('required' => false));
    $builder->add('denumire','text', array('required' => true));
    $builder->add('cod_fiscal','text', array('required' => true));
    $builder->add('cont_analitic','text', array('required' => false));
    $builder->add('telefon','text', array('required' => false));
    $builder->add('email','email', array('required' => false));
    $builder->add('judet','text', array('required' => false));
    $builder->add('adresa','text', array('required' => false));
    $builder->add('nr_reg_comertului','text', array('required' => false));
    $builder->add('cont','text', array('required' => false));
    $builder->add('banca','text', array('required' => false));
    $builder->add('delegat','text',array('required' => false));
    $builder->add('delegat_serie_ci','text',array('required' => false));
    $builder->add('delegat_nr_ci','text',array('required' => false));
    $builder->add('delegat_ci_eliberat','text',array('required' => false));
    $builder->add('delegat_mij_transport','text',array('required' => false));
    $builder->add('agent','text',array('required' => false));
    $builder->add('discount','text',array('required' => false));

    $builder->add('date_clienti', 'collection', array(
        'type' => new FormDateClientiType($options['idSocietate']),
        'cascade_validation' => true,
        'prototype' => true,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
        'required' => false,
        ));

    $builder->add('adauga','submit');



}




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

}

我得到这个错误:

ContextErrorException: Warning: Missing argument 1 for       Mnv\CoreBundle\Form\FormClientiType::__construct(), called in C:\wamp\www\mnvproject\src\Mnv\CoreBundle\Controller\FormController.php on line 156 and defined in C:\wamp\www\mnvproject\src\Mnv\CoreBundle\Form\FormClientiType.php line 15

已编辑:解决方案:

 public function buildForm(FormBuilderInterface $builder, array $options)
{
   // this was it :) 
    $idSocietate = $options['data']->getSocietati()->getIdSocietate();

    $builder->add('cod','text', array('required' => false));
    $builder->add('denumire','text', array('required' => true));
    $builder->add('cod_fiscal','text', array('required' => true));
    $builder->add('cont_analitic','text', array('required' => false));
    $builder->add('telefon','text', array('required' => false));
    $builder->add('email','email', array('required' => false));
    $builder->add('judet','text', array('required' => false));
    $builder->add('adresa','text', array('required' => false));
    $builder->add('nr_reg_comertului','text', array('required' => false));
    $builder->add('cont','text', array('required' => false));
    $builder->add('banca','text', array('required' => false));
    $builder->add('delegat','text',array('required' => false));
    $builder->add('delegat_serie_ci','text',array('required' => false));
    $builder->add('delegat_nr_ci','text',array('required' => false));
    $builder->add('delegat_ci_eliberat','text',array('required' => false));
    $builder->add('delegat_mij_transport','text',array('required' => false));
    $builder->add('agent','text',array('required' => false));
    $builder->add('discount','text',array('required' => false));

    $builder->add('date_clienti', 'collection', array(
        'type' => new FormDateClientiType($idSocietate),
        'cascade_validation' => true,
        'prototype' => true,
        'allow_add' => true,
        'allow_delete' => true,
        'by_reference' => false,
        'required' => false,
        ));

    $builder->add('adauga','submit');



 }


}

【问题讨论】:

    标签: forms symfony parameters controller entity


    【解决方案1】:

    也许您正在尝试将 null 传递给构造方法?

    我还建议您通过选项数组传递 $idSocietate,而不是通过构造函数。 options 数组是 createForm 方法的第三个参数。您可以使用 $resolver 将选项设置为所需选项。

    【讨论】:

    • 我试过了,没能成功。你能给我举个例子吗?
    • 首先谢谢您!我找到了解决方案,它是如此简单。我不知道有时我是愚蠢还是懒惰:)) 我需要的东西已经在那里了。您的回答非常有帮助,在我 var_dumped $options 数组后,我看到了它:) 这里是: $idSocietate = $options['data']->getSocietati()->getIdSocietate();
    • 很高兴我能帮上忙。请记住使用表单选项而不是通过构造函数传递变量 - 它有时会阻止您将表单作为服务提供,并且您不需要表单类中的额外属性。如果它有效,好的,但我仍然发现你的解决方案有点奇怪。我从未使用过 $options['data'],如果对象具有您需要的 id,请尝试使用 $builder->getData() 实现有效的解决方案。
    猜你喜欢
    • 2016-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-07
    • 2015-08-15
    • 1970-01-01
    相关资源
    最近更新 更多