2015-09-07 58 views
0

我試圖在使用實體的ID時自定義選擇列表的文本。這是因爲我希望列表選項是特定於已驗證用戶的。數據庫文本值是全名,按城市和州和匿名,但我希望它實際顯示用戶的全名(John Smith),丹佛,CO和匿名用戶。我試圖使用視圖數據轉換器來實現這一點,但沒有運氣。如果可能,我寧願不使用Javascript來實現這一點。Symfony2(2.7)表單實體數據轉換器

這是我的主要形式類型:

<?php 

namespace Members\MessagesBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Security\Core\SecurityContext; 


class MessageType extends AbstractType 
{ 
    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('viewability', 'viewability_entity', array(
       'class' => 'MessagesBundle:Viewability', 
       'property' => 'name', 
       'required' => true, 
      )) 
      ->add('body', new MessageBodyType()) 
     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Members\MessagesBundle\Entity\Message', 
     )); 
    } 

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

下面是能見度(我想改變的實體)我的自定義表單類型:

<?php 

namespace Members\MessagesBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 
use Symfony\Component\Security\Core\SecurityContext; 
use Members\MessagesBundle\Form\DataTransformer\MessageNameTransformer; 


class ViewabilityType extends AbstractType 
{ 
    private $context; 

    /** 
    * @param SecurityContext $context 
    */ 
    public function __construct(SecurityContext $context) 
    { 
     $this->context = $context; 
    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array    $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $transformer = new MessageNameTransformer($this->context); 
     $builder->addViewTransformer($transformer); 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'invalid_message' => 'The selected issue does not exist', 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getParent() 
    { 
     return 'entity'; 
    } 

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

這裏是我的服務,它定義了能見度類型:

members.messages.form.type.viewability_entity: 
     class: Members\MessagesBundle\Form\ViewabilityType 
     tags: 
      - { name: form.type, alias: viewability_entity } 
     arguments: [@security.context] 

這裏是我的能見度實體:

<?php 

namespace Members\MessagesBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* @ORM\Entity() 
*/ 
class Viewability 
{ 
    /** 
    * @ORM\Column(type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    protected $id; 

    /** 
    * @ORM\Column(type="string", length=255) 
    */ 
    private $name; 

    public function __construct() 
    { 
    } 

    /** 
    * @return mixed 
    */ 
    public function getName() 
    { 
     return $this->name; 
    } 

    /** 
    * @param mixed $name 
    */ 
    public function setName($name) 
    { 
     $this->name = $name; 
    } 

    /** 
    * @return mixed 
    */ 
    public function getId() 
    { 
     return $this->id; 
    } 

    /** 
    * @param mixed $id 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 
    } 
} 

最後,這是我的數據轉換:

<?php 

namespace Members\MessagesBundle\Form\DataTransformer; 

use Symfony\Component\Form\DataTransformerInterface; 
use Members\MessagesBundle\Entity\Viewability; 
use Symfony\Component\Security\Core\SecurityContext; 

class MessageNameTransformer implements DataTransformerInterface 
{ 
    private $user; 

    /** 
    * @param SecurityContext $context 
    */ 
    public function __construct(SecurityContext $context) 
    { 
     $this->user = $context->getToken()->getUser(); 
    } 

    /** 
    * @param Viewability|null $viewability 
    * @return string 
    */ 
    public function transform($viewability) 
    { 
     if (null === $viewability) { 
      return ''; 
     } 

     if($viewability === 'Full Name') 
      return sprintf('%s %s', $this->user->getInfo()->getFirstName(), $this->user->getInfo()->getLastName()); 
     if($viewability === 2) 
      return sprintf('Lawyer in %s, %s', $this->user->getInfo()->getAddress()->getCity(), $this->user->getInfo()->getAddress()->getState()); 
     if($viewability === 3) 
      return 'Anonymous'; 
    } 

    /** 
    * @param Viewability $viewability 
    * @return Viewability 
    */ 
    public function reverseTransform($viewability) 
    { 
     return $viewability; 
    } 
} 

傳遞到變換的數據()似乎總是空或 「」(空字符串)。

感謝您的任何幫助。

+0

我仍然有興趣在原有問題的答案,因爲我還沒有找到如何爲下降變換實體領域的顯示文本的任何實例下拉列表。 – Dbl0McJim

回答

0

所以我最終採取了不同的方法來解決這個問題。最初我試圖轉換來自實體的數據。幸運的是,這個實體並不是真的需要成爲一個數據庫實體,並且一個簡單的選擇類型就足夠了。這並不能解決轉換實體列表的具體問題,但它允許我自定義下拉列表值。

可見性實體已刪除,消息實體中的關係已更改爲整數字段。

現在我的主要類型如下:

class MessageType extends AbstractType 
{ 
    private $user; 

    public function __construct($user) 
    { 
     $this->user = $user; 
    } 

    /** 
    * @param FormBuilderInterface $builder 
    * @param array $options 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('body', new MessageBodyType()) 
      ->add('viewability', 'choice', array(
       'choices' => array(
        1 => $user->getFirstName(), 
        2 => $user->getAddress()->getCity(), 
        3 => 'Anonymous', 
       ), 
       'multiple' => false, 
       'label'  => 'Send Message As', 
       'data'  => 0, 
      )) 
     ; 
    } 

    /** 
    * @param OptionsResolver $resolver 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'Members\MessagesBundle\Entity\Message', 
     )); 
    } 

    /** 
    * @return string 
    */ 
    public function getName() 
    { 
     return 'members_messages_message'; 
    } 
} 
相關問題