2012-10-16 20 views
4

編輯 - 重新定義的問題,其中包括額外的特定代碼在Symfony2中填充複選框基於ArrayCollection的()

在我的Symfony2項目,我有一個包括與另一個實體的一對多關係(一個實體(配置配置特徵)。我試圖構建一個表單,允許用戶更改配置實體中的值,並選擇要保存到配置實體的值。有兩種使用表單的方案:

1)創建一個新配置 - >呈現一個空白表單,其中包含Configurations中值的字段以及ConfigurationsFeatures中潛在值的複選框的集合;潛在價值的來源實際上是第三個實體,CoreCodes。驗證後,表單的Configurations-values將持久保存到Configurations實體,並將選中的複選框保存到ConfigurationsFeatures。

2)更新現有的配置 - >渲染配置的現有值的形式顯示在字段和渲染複選框的集合的所有可能的值ConfigurationsFeatures BUT已經選擇的現有值。

我已經爲場景#1構建了窗體類型和控制器操作,並對其進行了測試,並且所有工作都正常。但是,我似乎無法解決表單的複選框部分中的「已有值已選擇」。我意識到,因爲我目前已經設置了我的控制器,所以我基本上將蘋果與桔子進行比較,因爲$ entity-> getFeatures()返回ConfigurationsFeatures實體的ArrayCollection,並且沒有任何可映射的形式,因爲表單使用CoreCodes實體的集合。

那麼我該如何填補這個空白?


實體\配置(存儲個別配置)

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* Lynux\AssetBundle\Entity\Core\Configurations 
* ... ORM declarations ... 
*/ 
class Configurations 
{ 
    // ... plain old properties, nothing fancy here... 

    /** 
    * @ORM\OneToMany(targetEntity="Lynux\AssetBundle\Entity\Core\ConfigurationsFeatures", mappedBy="configurationFk") 
    */ 
    private $features; 

    public function __construct() 
    { 
     $this->features = new ArrayCollection(); 
    } 

    // getters and setters 

    /** 
    * Set features 
    */ 
    public function setFeatures(ArrayCollection $features) 
    { 
     $this->features = $features; 
    } 

    /** 
    * Get features 
    */ 
    public function getFeatures() 
    { 
     return $this->features; 
    } 
} 

實體\ ConfigurationsFeatures(存儲選擇每配置功能)

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; 

/** 
* Lynux\AssetBundle\Entity\Core\ConfigurationsFeatures 
* ... ORM declarations ... 
*/ 
class ConfigurationsFeatures 
{ 
    /** 
    * @var Codes 
    * 
    * @ORM\ManyToOne(targetEntity="Lynux\AssetBundle\Entity\Core\Codes") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="feature_fk", referencedColumnName="id") 
    * }) 
    */ 
    private $featureFk; 

    /** 
    * @var Configurations 
    * 
    * @ORM\ManyToOne(targetEntity="Lynux\AssetBundle\Entity\Core\Configurations", inversedBy="features") 
    * @ORM\JoinColumns({ 
    * @ORM\JoinColumn(name="configuration_fk", referencedColumnName="id") 
    * }) 
    */ 
    private $configurationFk; 

    /** 
    * Set featureFk 
    * 
    * @param Lynux\AssetBundle\Entity\Core\Codes $featureFk 
    * @return ConfigurationsFeatures 
    */ 
    public function setFeatureFk(\Lynux\AssetBundle\Entity\Core\Codes $featureFk = null) 
    { 
     $this->featureFk = $featureFk; 

     return $this; 
    } 

    /** 
    * Get featureFk 
    * 
    * @return Lynux\AssetBundle\Entity\Core\Codes 
    */ 
    public function getFeatureFk() 
    { 
     return $this->featureFk; 
    } 

    /** 
    * Set configurationFk 
    * 
    * @param Lynux\AssetBundle\Entity\Core\Configurations $configurationFk 
    * @return ConfigurationsFeatures 
    */ 
    public function setConfigurationFk(\Lynux\AssetBundle\Entity\Core\Configurations $configurationFk = null) 
    { 
     $this->configurationFk = $configurationFk; 

     return $this; 
    } 

    /** 
    * Get configurationFk 
    * 
    * @return Lynux\AssetBundle\Entity\Core\Configurations 
    */ 
    public function getConfigurationFk() 
    { 
     return $this->configurationFk; 
    } 
} 

實體\ CoreCodes(對於ConfigurationsFeatures-> featureFk電勢值的源)

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 
use Symfony\Component\Validator\Constraints as Assert; 

/** 
* Lynux\AssetBundle\Entity\Core\Codes 
* 
* @ORM\Table(name="core_codes") 
*/ 
class Codes 
{ 
    /** 
    * @var integer $id 
    * 
    * @ORM\Column(name="id", type="integer", nullable=false, unique=true) 
    * @ORM\Id 
    * @Assert\NotBlank(message="ID cannot be blank!") 
    * @Assert\Regex(pattern="/^\d+$/", match=true, message="ID must be an integer!") 
    * @Assert\MinLength(limit=8, message="ID must be 8 digits in length!") 
    * @Assert\MaxLength(limit=8, message="ID must be 8 digits in length!") 
    */ 
    private $id; 

    // ... various properties, not applicable to question ... 

    /** 
    * Set id 
    * 
    * @param integer $id 
    * @return Codes 
    */ 
    public function setId($id) 
    { 
     $this->id = $id; 

     return $this; 
    } 

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

    // ... getters and setters for other properties ... 
} 

類型\ FormConfigurations

use Doctrine\ORM\EntityRepository; 
use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 

class FormConfigurations extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $features = $this->features; 

     // ... builders for other properties ... 

     $builder->add(
      'features', 
      'entity', 
      array(
       'class'   => 'LynuxAssetBundle:Core\Codes', 
       'property_path' => false, 
       'query_builder' => function(EntityRepository $er) use ($features) 
        { 
         return $er->createQueryBuilder('u') 
          ->where('u.submodule = :submodule') 
          ->setParameter('submodule', 'feature'); 
        }, 
       'expanded' => true, 
       'multiple' => true, 
       'property' => 'title',)); 
    } 

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

    public function setDefaultOptions(OptionsResolverInterface $resolver) 
    { 
     $resolver->setDefaults(
      array(
       'data_class' => 'Lynux\AssetBundle\Entity\Core\Configurations',)); 
    } 
} 

控制器\ ConfigurationsController :: C reateAction()

public function createAction(Request $request) 
{ 
    $config = $request->getSession()->get('configuration'); 
    $manage = $this->getDoctrine()->getEntityManager(); 

    $entity = new Configurations(); 
    $form = $this->createForm(new FormConfigurations($features), $entity); 
    $failed = null; 

    $features = $manage 
     ->getRepository('LynuxAssetBundle:Core\Codes') 
     ->findBySubmodule('feature'); 

    if ('POST' == $request->getMethod()) { 
     $form->bind($request); 

     if ($form->isValid()) { 
      $status = $manage 
       ->getRepository('LynuxAssetBundle:Core\Codes') 
       ->findOneById(10103022); 

      $entity->setToken($entity->getName()); 
      $entity->setStatusFk($status); 
      $entity->setCreateAccountFk($this->getUser()); 

      $features = $form->get('features')->getData(); 
      foreach($features as $feature) { 
       $addFeature = new ConfigurationsFeatures(); 
       $addFeature->setConfigurationFk($entity); 
       $addFeature->setFeatureFk($feature); 
       $manage->persist($addFeature); 
      } 
      $manage->persist($entity); 
      $manage->flush(); 

      return $this->redirect($this->generateUrl(
       'CoreConfigurationsConfirm', 
       array(
        'code' => 'create', 
        'token' => $entity->getToken(),))); 
     } else { 
      $failed = true; 
     } 
    } 

控制器\ ConfigurationsController :: updateAction()

public function updateAction(Request $request, $token) 
{ 
    $manage = $this->getDoctrine()->getEntityManager(); 
    $entity = $manage 
     ->getRepository('LynuxAssetBundle:Core\Configurations') 
     ->findOneByToken($token); 

    $form = $this->createForm(new FormConfigurations($features), $entity); 

    if ('POST' == $request->getMethod()) { 
     $form->bind($request); 

     if ($form->isValid()) { 
      $currentFeatures = $manage 
       ->getRepository('LynuxAssetBundle:Core\ConfigurationsFeatures') 
       ->findByConfigurationFk($entity); 
      foreach($currentFeatures as $currentFeature) { 
       $manage->remove($currentFeature); 
      } 

      $features = $form->get('features')->getData(); 
      foreach($features as $feature) { 
       $addFeature = new ConfigurationsFeatures(); 
       $addFeature->setConfigurationFk($entity); 
       $addFeature->setFeatureFk($feature); 
       $manage->persist($addFeature); 
      } 

      $manage->flush(); 
     } 
    } 

回答

4

啊耐心和毅力......它發生,我認爲我是轉換CoreCodes集合在持久保存到數據庫時保存到ConfigurationsFeatures集合。同樣,在顯示錶單時從ConfigurationsFeatures轉換爲CoreCodes也是有意義的。

// ConfigurationsController::updateAction() 

$formFeatures = new ArrayCollection(); 
$currentFeatures = $entity->getFeatures(); 
foreach($currentFeatures as $feature) { 
    $formFeatures->add($feature->getFeatureFk()); 
} 

if ('POST' != $request->getMethod()) { // first time the form is loaded 
    $form->get('features')->setData($formFeatures); 
}