【问题标题】:How to generate form classes according to relational models with Symfony 2.8?Symfony 2.8 如何根据关系模型生成表单类?
【发布时间】:2017-09-18 00:41:40
【问题描述】:

我正在 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

我希望此表单生成器根据数据库上的语言计数创建翻译输入。

【问题讨论】:

  • 您希望在添加类别时能够选择多个翻译吗?
  • 我想根据我有多少语言来查看输入。我也想自动做。@MuzafarAli

标签: php forms symfony


【解决方案1】:

我仍然不确定您真正需要什么,如果您需要在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-21
    • 1970-01-01
    • 2023-03-06
    • 2016-03-11
    相关资源
    最近更新 更多