2017-09-17 7 views
0

私はSymfony 2.8でプロジェクトを開発しています。また、フォームクラスを使いたいと思います。しかし、私はまだできませんでした。Symfony 2.8でリレーショナルモデルに従ってフォームクラスを生成する方法は?

このカテゴリのエンティティである:

<?php 

namespace ApiBundle\Entity; 

use Doctrine\Common\Collections\ArrayCollection; 
use Doctrine\ORM\Mapping as ORM; 

/** 
* Category 
* 
* @ORM\Table(name="category") 
* @ORM\Entity(repositoryClass="ApiBundle\Repository\CategoryRepository") 
*/ 
class Category 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

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

    /** 
    * @var CategoryTranslation 
    * @ORM\OneToMany(targetEntity="CategoryTranslation", mappedBy="category", fetch="EAGER") 
    */ 
    private $translations; 

    /** 
    * @var Recipe 
    * @ORM\OneToMany(targetEntity="Recipe", mappedBy="category") 
    */ 
    private $recipes; 

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="created", type="datetime") 
    */ 
    private $created; 

    public function __construct() 
    { 
     $this->translations = new ArrayCollection(); 
     $this->recipes = new ArrayCollection(); 
     $this->created = new \DateTime(); 
    } 

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

    /** 
    * @return string 
    */ 
    public function getImage() 
    { 
     return $this->image; 
    } 

    /** 
    * @param string $image 
    * @return Category 
    */ 
    public function setName($image) 
    { 
     $this->image = $image; 
     return $this; 
    } 

    /** 
    * @return CategoryTranslation 
    */ 
    public function getTranslations() 
    { 
     return $this->translations; 
    } 

    /** 
    * @param CategoryTranslation $translations 
    * @return Category 
    */ 
    public function setTranslations($translations) 
    { 
     $this->translations = $translations; 
     return $this; 
    } 

    /** 
    * @return Recipe 
    */ 
    public function getRecipes() 
    { 
     return $this->recipes; 
    } 

    /** 
    * @param Recipe $recipes 
    * @return Category 
    */ 
    public function setRecipes($recipes) 
    { 
     $this->recipes = $recipes; 
     return $this; 
    } 

    /** 
    * @return \DateTime 
    */ 
    public function getCreated() 
    { 
     return $this->created; 
    } 
} 

このカテゴリ翻訳エンティティです:

<?php 

namespace ApiBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* CategoryTranslation 
* 
* @ORM\Table(name="category_translation") 
* @ORM\Entity(repositoryClass="ApiBundle\Repository\CategoryTranslationRepository") 
*/ 
class CategoryTranslation 
{ 
    /** 
    * @var int 
    * 
    * @ORM\Column(name="id", type="integer") 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="AUTO") 
    */ 
    private $id; 

    /** 
    * @ORM\ManyToOne(targetEntity="Language", inversedBy="CategoryTranslation") 
    * @ORM\JoinColumn(name="language_id", referencedColumnName="id") 
    */ 
    private $language; 

    /** 
    * @ORM\ManyToOne(targetEntity="Category", inversedBy="CategoryTranslation") 
    * @ORM\JoinColumn(name="category_id", referencedColumnName="id") 
    */ 
    private $category; 

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

    /** 
    * @var \DateTime 
    * 
    * @ORM\Column(name="created", type="datetime") 
    */ 
    private $created; 

    public function __construct() 
    { 
     $this->created = new \DateTime(); 
    } 

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

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

    /** 
    * @param mixed $language 
    * @return CategoryTranslation 
    */ 
    public function setLanguage($language) 
    { 
     $this->language = $language; 
     return $this; 
    } 

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

    /** 
    * @param mixed $category 
    * @return CategoryTranslation 
    */ 
    public function setCategory($category) 
    { 
     $this->category = $category; 
     return $this; 
    } 

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

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

    /** 
    * @return \DateTime 
    */ 
    public function getCreated() 
    { 
     return $this->created; 
    } 

} 

これは、カテゴリーフォームクラスである:

<?php 

namespace ApiBundle\Form; 

use Symfony\Component\Form\AbstractType; 
use Symfony\Component\Form\Extension\Core\Type\CollectionType; 
use Symfony\Component\Form\Extension\Core\Type\SubmitType; 
use Symfony\Component\Form\FormBuilderInterface; 
use Symfony\Component\OptionsResolver\OptionsResolver; 

class CategoryType extends AbstractType 
{ 
    /** 
    * {@inheritdoc} 
    */ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('image') 
      ->add('translations', CollectionType::class, [ 
       'type' => CategoryTranslationType::class, 
       'allow_add' => true, 
       'allow_delete' => true, 
       'prototype' => true, 
       'by_reference' => false 
      ]) 
      ->add('save',SubmitType::class); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'ApiBundle\Entity\Category' 
     )); 
    } 

    /** 
    * {@inheritdoc} 
    */ 
    public function getBlockPrefix() 
    { 
     return 'apibundle_category'; 
    } 


} 

これは、私は、フォームを追加したコントローラである:ここでは

public function addAction() 
{ 
    $category = new Category(); 
    $trans = new CategoryTranslation(); 
    $category->getTranslations()->add($trans); 
    $form = $this->createForm(CategoryType::class, $category)->createView(); 

    return $this->render('PanelCategoryBundle:Default:add.html.twig', [ 
     'form' => $form 
    ]); 
} 

は、フォームのスクリーンショットです:

https://imgur.com/a/EysgN

私はこのフォームビルダーは、言語の数に応じて、翻訳の入力を作成したいですデータベース上で。

+0

カテゴリを追加しているときに複数の翻訳を選択できるようにしたいですか? –

+0

言語の数に応じて入力を確認したいと思います。また、私は自動的にしたい。@ MuzafarAli –

答えて

0

私はまだあなたが本当に必要なのかわからないんだけど、あなたはCategoryTypeフォームにしながら、翻訳を選択できるようにする必要がある場合は、以下のようなあなたのCategoryTypeを変更できます。

<?php 

//... 

use Symfony\Bridge\Doctrine\Form\Type\EntityType; 

class CategoryType extends AbstractType 
{ 
    //... 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('image') 
      ->add('translations', EntityType::class, [ 
       'class' => 'ApiBundle:CategoryTranslation', 
       'choice_label' => 'name', 
       // used to render a select box, check boxes or radios 
       // 'multiple' => true, 
       // 'expanded' => true, 
      ]) 
      ->add('save',SubmitType::class) // this btn can be added in twig template directly. 
     ; 
    } 
    //........ 
} 

それともあなたが追加する必要がある場合を動的に翻訳するには、this documentationに従ってください。

関連する問題