2011-06-22 12 views
5

Por lo tanto, estoy tratando de insertar un formulario en otro sin crear una clase para los formularios. Esto es lo que he conseguidoSubformularios Symfony2

$form = $this 
     ->buildForm('UserAlert', $alert) 
     ->add('Alert', 'entity', array('class' => 'Blah\MgmtBundle\Entity\Alert', 'property' => 'name', 'required' => true)) 
     ->add('Site', 'entity', array('class' => 'Blah\MgmtBundle\Entity\Site', 'property' => 'name', 'required' => false)) 
     ->add('Keyword', 'entity', array('class' => 'Blah\MgmtBundle\Entity\Keyword', 'property' => 'name', 'required' => false)) 
     ->add('Variant', 'entity', array('class' => 'Blah\MgmtBundle\Entity\Variant', 'property' => 'name', 'required' => false)) 
     ->add('Name', 'text'); 


    $uac = $alert->getUserAlertConfig(); 
    $subform = $this 
     ->buildForm('UserAlertConfig', $uac) 
     ->add('EmailAlert', 'choice', array('choices' => array('1' => 'Yes', '0' => 'No'), 'required' => true, 'label' => 'Email Alerts')) 
     ->add('EmailHours', 'text', array('required' => false, 'label' => 'Email Alert Hours')) 
     ->add('TextAlert', 'choice', array('choices' => array('1' => 'Yes', '0' => 'No'), 'required' => true, 'label' => 'Text Alerts')) 
     ->add('TextHours', 'text', array('required' => false, 'label' => 'Text Alert Hours')); 

    $form->add($subform); 
    $form = $form->getForm(); 

sin embargo, en la función getForm(), diciendo su

Neither property "form" nor method "getForm()" nor method "isForm()" exists in class "Blah\MgmtBundle\Entity\UserAlert" 

Alguien tiene alguna idea de cómo supone im a conseguir que esto funcione utilizando la materia quickloading?

heres buildForm

public function buildForm($model = '', $data) 
{ 
    if (empty($model)) { 
     throw new \Exception("Must define a model"); 
    } 
    return $this->get('form.factory')->createBuilder('form', $data, array('data_class' => "\\Blah\\MgmtBundle\\Entity\\$model")); 
} 


    Stack Trace 
in /mnt/www/reporting/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php at line 314  
at PropertyPath ->readProperty (object(UserAlert), '0') 
in /mnt/www/reporting/vendor/symfony/src/Symfony/Component/Form/Util/PropertyPath.php at line 191  
at PropertyPath ->getValue (object(UserAlert)) 
in /mnt/www/reporting/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php at line 64 
at PropertyPathMapper ->mapDataToForm (object(UserAlert), object(Form)) 
in /mnt/www/reporting/vendor/symfony/src/Symfony/Component/Form/Extension/Core/DataMapper/PropertyPathMapper.php at line 55 
at PropertyPathMapper ->mapDataToForms (object(UserAlert), array('_token' => object(Form), 'Alert' => object(Form), 'Site' => object(Form), 'Keyword' => object(Form), 'Variant' => object(Form), 'Name' => object(Form), 'form' => object(Form))) 
in /mnt/www/reporting/vendor/symfony/src/Symfony/Component/Form/Form.php at line 404  
at Form ->setData (object(UserAlert)) 
in /mnt/www/reporting/vendor/symfony/src/Symfony/Component/Form/FormBuilder.php at line 659  
at FormBuilder ->getForm() 
in /mnt/www/reporting/src/Blah/MgmtBundle/Controller/AlertController.php at line 96  
at AlertController ->editAction ('1') 
in at line  
at call_user_func_array (array(object(AlertController), 'editAction'), array('1')) 
in kernel.root_dir/bootstrap.php.cache at line 438  
at HttpKernel ->handleRaw (object(Request), '1') 
in kernel.root_dir/bootstrap.php.cache at line 416  
at HttpKernel ->handle (object(Request), '1', true) 
in /mnt/www/reporting/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/HttpKernel.php at line 44  
at HttpKernel ->handle (object(Request), '1', true) 
in kernel.root_dir/bootstrap.php.cache at line 612  
at Kernel ->handle (object(Request)) 
in /mnt/www/reporting/web/app_dev.php at line 12  
+0

¿Este código del controlador? ¿O código de tipo de formulario personalizado? –

+0

está en el controlador, lo siento – Ascherer

+0

Y el método 'buildForm' se define donde? ¿Podría publicar su código fuente? –

Respuesta

4

terminó creando una interfaz para el subformulario y agregándolo como esto

$form = $this 
     ->buildForm('UserAlert', $alert) 
     ->add('Alert', 'entity', array('class' => 'Neokeo\MgmtBundle\Entity\Alert', 'property' => 'name', 'required' => true)) 
     ->add('Site', 'entity', array('class' => 'Neokeo\MgmtBundle\Entity\Site', 'property' => 'name', 'required' => false)) 
     ->add('Keyword', 'entity', array('class' => 'Neokeo\MgmtBundle\Entity\Keyword', 'property' => 'name', 'required' => false)) 
     ->add('Variant', 'entity', array('class' => 'Neokeo\MgmtBundle\Entity\Variant', 'property' => 'name', 'required' => false)) 
     ->add('Name', 'text'); 

    $uac = $alert->getUserAlertConfig(); 



    $subform = $this->buildForm('UserAlertConfig', $uac, new \Neokeo\MgmtBundle\Form\UserAlertConfig) 
     ->add('EmailAlert', 'choice', array('choices' => array('0' => 'No', '1' => 'Yes'), 'required' => true, 'label' => 'Email Alerts')) 
     ->add('TextAlert', 'choice', array('choices' => array('0' => 'No', '1' => 'Yes'), 'required' => true, 'label' => 'Text Alerts')); 

    $form->add($subform, '', array('label' => '')); 
    $form = $form->getForm(); 

si alguien puede encontrar una manera más fácil y sin la creación de interfaces, que me haga saber

+0

yo diría que no es necesario' getForm() '' como $ form' ya ES tu formulario. 'getForm()' se usa con 'FormBuilder', ¿no es así? –

+0

'buildForm' está devolviendo un' FormBuilder' – Ascherer

0

Trate

$form->add('The name of the UserAlertConfig property in the UserAlert entity', $subform); 

Si pasa un objeto FormBuilder al método add sin especificar el nombre de la propiedad, se utiliza el nombre del objeto FormBuilder (que es 'form') como el nombre de la propiedad. No hay una propiedad llamada form en la entidad UserAlert.

+0

bien, eso no funcionaba, pero cuando lo giro, '$ form-> add ($ subform, 'userAlertConfig');' me acerca un poco. Ahora estoy teniendo un problema con los proxies lol 'argumento esperado de tipo "\ Neokeo \ MgmtBundle \ Entidad \ UserAlert", "La representación \ NeokeoMgmtBundleEntityUserAlertConfigProxy" given' – Ascherer