2011-06-22 19 views
5

Tak, próbuję osadzić jedną postać w drugiej bez tworzenia klasy dla formularzy. Herezje co ive gotSymfony2 Subformy

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

jednak na funkcji getForm(), jego powiedzenie

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

ktoś ma jakiś pomysł, jak im podobno dostać to do pracy za pomocą rzeczy quickloading?

herezje 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

Czy ten kod kontrolera? Lub niestandardowy kod typu formularza? –

+0

jego w kontrolerze, przepraszam – Ascherer

+0

A gdzie jest określona metoda 'buildForm'? Czy mógłbyś opublikować swój kod źródłowy? –

Odpowiedz

4

skończył tworzenie interfejsu dla podformularzu i dodanie go jak ten

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

jeśli ktoś może znaleźć łatwiejszy sposób bez tworzenia interfejsów, daj mi znać

+0

Powiedziałbym, że nie powinno być potrzeby' getForm() '' jako $ form' już jest Twoim formularzem. 'getForm()' jest używany z 'FormBuilder' czyż nie? –

+0

'buildForm' zwraca formularz' FormBuilder' – Ascherer

0

Spróbuj

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

Jeśli przekazać obiekt FormBuilder do metody add bez określania nazwy właściwości, używa nazwy obiektu FormBuilder (co jest 'form') jako nazwę właściwości. W elemencie UserAlert nie ma żadnej własności o nazwie form.

+0

w porządku, to nie działało, ale kiedy go odwracam, '$ form-> add ($ subform, 'userAlertConfig');' to przybliża mnie trochę. teraz im problem z proxy lol 'Oczekiwany argument typu "\ Neokeo \ MgmtBundle \ Entity \ UserAlert", "proxy \ NeokeoMgmtBundleEntityUserAlertConfigProxy" given' – Ascherer