Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2 Subforms

Tags:

php

symfony

So, im trying to embed one form in another without creating a class for the forms. Heres what ive got

    $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();

however, on the getForm() function, its saying

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

anyone have any idea how im supposed to get this to work using the quickloading stuff?

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    
like image 859
Ascherer Avatar asked Oct 11 '22 16:10

Ascherer


1 Answers

Ended up creating an interface for the subform and adding it like this

    $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();

if anyone can find an easier way without creating interfaces, let me know

like image 98
Ascherer Avatar answered Oct 18 '22 11:10

Ascherer