2014-12-05 61 views
0

我有兩個實體發票和客戶。我也有兩種形式InvoiceForm和CustomerForm。 當我創建一個新的發票(包含InvoiceForm)時,我希望能夠創建一個新的客戶(只有一個)。因此,這裏是我如何做到這一點(和它的作品):symfony2呈現窗體類型爲

<?php 
namespace Acme\DemoBundle\Form; 

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

class CustomerForm extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('firstname') 
      ->add('lastname') 
      ->add('phone'); 
    } 

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

<?php 
namespace Acme\DemoBundle\Form; 

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

class InvoiceForm extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('title') 
      ->add('date') 
      ->add('customer', new CustomerForm()); 
    } 

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

所以,在我看來(發票/ new.html.twig)我可以輕鬆地定製我顯示我的InvoiceForm的屬性的方式(名稱和日期),我的意思是我可以將我的form_row(invoiceForm.title)放在我想要的任何地方,我真的可以做任何事情。但對於我的「子表單」invoiceForm.customer的屬性,我不能,它會自動完成(名字,姓氏,電話),因爲我只能使用invoiceForm.customer。你明白我的意思嗎?如果在我的Controller中創建一個「新的CustomerForm()」,然後渲染這個表單,我可以做我想做的事情,但是因爲我正在製作一個「新的InvoiceForm()」,所以我可以「T。我不知道如果我解釋正確^^

感謝您的幫助:)

+0

這似乎有點倒退。應該有從客戶到發票的OneToMany關係。然後,從新客戶可以嵌套發票表單。對於現有客戶,請在選擇客戶後創建發票。 – geoB 2014-12-05 21:55:42

+0

是的,我已經完成了所有這些工作:我有一個與我的CustomerForm分開的頁面(/ customer/new),並且從我的客戶視圖中,我可以創建一個新的發票。但客戶(不是實體^^)也希望能夠從發票創建視圖創建新客戶(實體) – Igoooor 2014-12-05 22:00:56

回答

0

好了,所以我發現我自己的答案,其實我可以訪問我的子窗體屬性:

{{ form_row(form.customer.firstname }} 
{{ form_row(form.customer.lastname }} 
{{ form_row(form.customer.phone }} 

所以我可以根據需要進行定製。而且,有一種方法來測試在視圖中的表單類型:

{{ form.customer.vars.block_prefixes.2 }} 

這在我的情況下,將返回customer_create我的子窗體的名字(是的,我知道我沒有問了,只我也需要它^^所以也許它會幫助別人;))

謝謝!