2014-12-29 87 views
5

在同一頁面多次相同的形式類型我試圖產生特別是「ProductLanguageType」表單類型。生成的Symfony2

我想產生的ProductLanguageType多次在語言表中現有語言的當前號碼。

例如,如果我有(英語,法語,俄語,中國)在語言表,它會產生在同一頁上4 ProductLanguageType形式。

我想知道我怎麼查詢語言表,並生成在同一頁面上相同類型的多個形式,表單生成器能夠做的或者是有另一種解決方法嗎?這段時間以來一直有一些麻煩,並很樂意爲此找到一個好的解決方案。

ProductLanguageType:

class ProductLanguageType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options){ 

    $builder->add('id_language', 'entity', array(
        'class' => 'AdminBundle:Language', 
        'data_class' => 'Main\AdminBundle\Entity\Language', 
        'property' => 'language' 
       ) 
       ) 
      ->add('name', 'text') 
      ->add('description', 'ckeditor', array(
        'config_name' => 'admin', 
        'config' => array(
         'filebrowser_image_browse_url' => array(
          'route'   => 'elfinder', 
          'route_parameters' => array('instance' => 'default'), 
         ), 
        ) 
       )) 
      ->add('short_description', 'text'); 

} 

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

ProductType(ProductLanguageType在這裏包埋):

class ProductType extends AbstractType 
{ 
public function buildForm(FormBuilderInterface $builder, array $options){ 

    $builder->addEventListener(FormEvents::PRE_SET_DATA, array($this, 'onPreSetData')); 
    $builder->add('productLanguage', new ProductLanguageType()) 
      ->add('id_seller','text') 
      ->add('price','text') 
      ->add('cost_price','text') 
      ->add('retail_price','text') 
      ->add('hot', 'checkbox') 
      ->add('featured', 'checkbox') 
      ->add('new', 'checkbox') 
      ->add('free_shipping', 'checkbox') 
      ->add('status','text') //active or inactive, to be decided if hidden or visible 
      ->add('Add', 'submit'); 

} 
} 
+0

什麼關於使用集合? HTTP:// symfony的。com/doc/current/cookbook/form/form_collections.html –

+0

我嘗試多次生成表單,但似乎沒有出現。 –

回答

4

希望這會幫助別人。

正確的方法是使用Symfony的form.factory服務來創建一個指定的構建器,並依次創建一個表單。我建議創建表單創建過程作爲一個函數(我的理解,糾正我,如果我」,錯的)每個FormBuilder實例必須是不同的,以創建一個不同的形式。

正如對代碼用途的解釋: 我需要在幫助系統中顯示打開故障單的列表,以便根據用戶的登錄令牌將其分配給故障單(未經登錄授權)。這需要在單個頁面上顯示N個表格,這些表格將是唯一的,但是如果您願意,可以從單個「模板」或類型生成。

此代碼實現,沒有任何黑客。沒有簡單的方法來創建具有來自控制器AFAIK的特定ID(名稱)的FormForm。

ex。

public function generateFormForTicketAssignment(Ticket $ticket) { 

    $ticketAssignType = new TicketAssignInvokeType(); 
    $ticketAssignType->setNameSuffix($ticket->getId()); 

    /** 
    * @var Symfony\Component\Form\FormBuilderInterface 
    */ 
    $builder = $this->get('form.factory')->createNamedBuilder($ticketAssignType->getName(), $ticketAssignType); 
    $builder->setAutoinitialize(true); 
    $formTicket = $builder->getForm(); 

    $formTicket->get('ticket')->setData($ticket); 


    return $formTicket; 
} 

AND(這是重要組成部分)的ticketAssignInvokeType看起來是這樣的:

class TicketAssignInvokeType extends AbstractType { 

private $nameSuffix = null; 
private $name = 'ticket_assign_invoke'; 

public function __constructor(string $suffix = null) { 
    //parent::__construct(); 

    $this->nameSuffix = $this->generateNameSuffix(); 
} 

private function generateNameSuffix() { 
    if ($this->nameSuffix == null || $this->nameSuffix == '') { 
     $generator = new SecureRandom(); 
     //change data to alphanumeric string 
     return bin2hex($generator->nextBytes(10)); 
    } 

    return $this->nameSuffix; 
} 

/** 
* 
* @param string $suffix When set suffix added to form will use selected 
* string (note it should be unique for all forms on a page). 
*/ 
public function setNameSuffix($suffix){ 
    $this->nameSuffix = $suffix; 
} 

public function buildForm(FormBuilderInterface $builder, array $options) { 
    $builder 
     ->add('loginToken',new AuthenticateTokenType()) 
     ->add('ticket',new TicketIDType()) 
     ->add('save', 'submit', array('label' => 'form.button.assign')) 
    ; 

} 

public function getName() { 
    if ($this->nameSuffix == null || $this->nameSuffix == "") { 
     $this->nameSuffix = $this->generateNameSuffix(); 
    } 
    return $this->name .'_'. $this->nameSuffix; 
} 

public function configureOptions(OptionsResolver $resolver) { 
    // ... 
} 
} 

這是後綴名有點過於複雜的邏輯和測試,但在某些時候,我無法弄清楚爲什麼所有的我去沒有後綴的表單名稱因此是複雜的。

PS。我已經創建了表單作爲服務,稍後會測試是否可以使用服務,這是我的第一個意圖。

PS2。我不確定setAutoinitialize的方法,但也會測試它更好。

+0

它的確如此,謝謝!我已經刪除了setAutoinitialize,因爲它默認情況下處於打開狀態。也從__construct()中刪除未使用的參數。 –

3

現在Symfony的3.0他們改變了createNamedBuilder,因此它可能只打電話來解決這個問題:

use AppBundle\Form\ShippingTrackCodeReturnType; 

$uniqueForm = $this->get('form.factory')->createNamedBuilder('ship_form_'.$orderRecord->getId(), ShippingTrackCodeReturnType::class, $orderRecord)->getForm(); 

所以,你只需要循環顯示和保存:

foreach ($invoice->getOrderRecords() as $key => $orderRecord) 
{ 
    // creates the forms with different names 
    $returnShipTrackCodeForm = $this->get('form.factory')->createNamedBuilder('ship_form_'.$orderRecord->getId(), ShippingTrackCodeReturnType::class, $orderRecord)->getForm(); 

    $returnShipTrackCodeForm->handleRequest($request); 
    if ($returnShipTrackCodeForm->isSubmitted() && $returnShipTrackCodeForm->isValid()) 
    { 
     // flush object 
    } 

    $returnForms[$orderRecord->getId()] = $returnShipTrackCodeForm; 
}