2015-06-19 39 views
0

形式是實體服務顯示名稱,但插入ID絲毫實體字段類型

namespace Main\HomeBundle\Form; 

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

    class ServicesType extends AbstractType 
    { 
      /** 
     * @param FormBuilderInterface $builder 
     * @param array $options 
     */ 
     public function buildForm(FormBuilderInterface $builder, array $options) 
     { 
      $builder 
       ->add('techId', 'entity', array(
        'class' => 'MainHomeBundle:Technical', 
        'property' => 'id', 
       )) 
       ->add('status', 'choice', array(
         'choices' => array(
         'pending' => 'Pending', 
         'finished' => 'Finished', 
        ), 'multiple' => false), array('required'=>true)) 
       ->add('payment', 'text', array('required'=>true)) 
       ->add('endtime', 'datetime', array('required'=>true)) 
       ->add('send', 'submit') 
      ; 
     } 

     /** 
     * @param OptionsResolverInterface $resolver 
     */ 
     public function setDefaultOptions(OptionsResolverInterface $resolver) 
     { 
      $resolver->setDefaults(array(
       'data_class' => 'Main\HomeBundle\Entity\Services' 
      )); 
     } 

     /** 
     * @return string 
     */ 
     public function getName() 
     { 
      return 'main_homebundle_services'; 
     } 
    } 

使用此方法在一個更新的形式來顯示選擇的用戶。問題是當數據發送時,發送名稱並希望在選擇中顯示名稱時發送該ID。

不使用數據庫或關係的實體

實體服務技術ID想在techId要插入的服務

class Services 
{ 
    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="customer_id", type="integer", nullable=false) 
    */ 
    private $customerId; 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="tech_id", type="integer", nullable=true) 
    */ 
    private $techId; 

techId與另一個實體鏈接

class Technical 
{ 

    /** 
    * @var integer 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false) 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    private $id; 

    /** 
    * @var string 
    * 
    * @Assert\NotBlank() 
    * @Assert\Length(
    * min = 8, 
    * max = 55, 
    * minMessage = "{{ limit }}", 
    * maxMessage = "{{ limit }}" 
    *) 
    * 
    * @ORM\Column(name="name", type="string", length=55, nullable=false) 
    */ 
    private $name; 

    public function __toString() 
    { 
     return $this->nombre; 
    } 

只有翔實的方式,因爲在數據庫或實體沒有任何關係

+0

請出示您的完整FormType和用戶實體 – DerStoffel

+0

爲什麼你需要發送的ID? – DonCallisto

+0

添加更多信息 – Eguiarte

回答

0

一個實體領域是在這種情況下使用了錯誤的事情 - 的形式將嘗試技術類的實例映射到服務的整數$ techId字段,這是行不通的。

您需要使用標準選擇字段並將(技術實體)ID選項列表作爲選項傳遞給buildForm()。

形式:

public function buildForm(FormBuilderInterface $builder, array $options) 
{ 
    $builder 
      ->add('techId', 'choice', array(
       'choices' => $options['techChoices'], 
      )) 
    ... 
} 

public function configureOptions(OptionsResolver $resolver) 
{ 
    $resolver->setDefaults(array(
     'techChoices' => array(), 
    )); 
} 

在控制器:

$repository = $this->getDoctrine()->getRepository('MainHomeBundle:Technical'); 
$technicals = $repository->findAll(); 
$techChoices = array(); 
foreach($technicals as $t) { $techChoices[$t->getId()] = $t->getName(); } 

$formOptions = array('techChoices' => $techChoices); 
$form = $this->createForm(new ServicesType(), $aServices, $formOptions); 
+0

如何推薦在控制器中獲取數值和空數組? – Eguiarte

+0

@Eguiarte我不明白你的評論,但我編輯了我的答案,提供了在控制器中填充$ techChoices數組的代碼。您可以在這裏找到如何在自定義存儲庫類中執行此操作:http://symfony.com/doc/current/book/doctrine.html#custom-repository-classes。如果你想這樣做,不能解決問題,你需要發佈一個單獨的問題。 – redbirdo

+0

@Eguiarte注 - 我不主張使用像'$ t'這樣的縮寫變量名,但它使得這篇文章的代碼更具可讀性。 – redbirdo