Symfony 表单集合自定义原型

Symfony form collection custom prototype

我在 symfony 上收集表单时遇到问题。 我有 3 个实体 Article、AdditionnalFile、AdditionnalInformation

文章实体

/**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Category", inversedBy="articles")
 * @ORM\JoinColumn(nullable=false)
 * @Gedmo\Versioned
 */
private $category;

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\AdditionnalInformation", mappedBy="article", cascade={"persist", "remove"})
 * @ORM\JoinColumn(nullable=true)
 */
private $additionnalInformations;

/**
 * @ORM\OneToMany(targetEntity="AppBundle\Entity\AdditionnalFile", mappedBy="article", cascade={"persist", "remove"})
 * @ORM\JoinColumn(nullable=true)
 */
private $additionnalFiles;

AdditionnalInformation 实体

    /**
 * @ORM\ManyToOne(targetEntity="AppBundle\Entity\Article", inversedBy="additionnalInformations")
 */
private $article;

/**
 * @ORM\ManyToMany(targetEntity="UserLdapBundle\Entity\Group", inversedBy="additionnalInformations")
 * @ORM\JoinColumn(nullable=false)
 *
 * @Assert\Count(
 *      min = 1,
 *      max = 5,
 *      minMessage = "Il faut au minimum 1 groupe autorisé",
 *      maxMessage = "Il faut au maximum {{ limit }} groupe autorisé"
 * )
 */
private $groups;

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

/**
 * @var string
 *
 * @ORM\Column(name="title", type="string", length=255)
 * @Gedmo\Versioned
 * @Assert\Type(type="string")
 * @Assert\NotBlank()
 */
private $title;


/**
 * @var string
 *
 * @ORM\Column(name="text", type="text")
 * @Gedmo\Versioned
 * @Assert\Type(type="string")
 * @Assert\NotBlank()
 */
private $text;

我不给出最后一个实体,因为它不重要 我已经为 AdditionnalFile

创建了一个表单类型
    /**
 * @param FormBuilderInterface $builder
 * @param array                $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'title',
            TextType::class,
            array(
                'attr'  => array(
                    'placeholder' => 'Titre'
                ),
                'label' => 'Titre :'
            )
        )
        ->add(
            'text',
            TextareaType::class,
            array(
                'attr' => array(
                    'placeholder' => 'Texte'
                ),
                'label'        => 'Texte :'
            )
        )
        ->add(
            'groups',
            EntityType::class,
            array(
                'attr'         => array(
                    'placeholder' => 'Droits'
                ),
                'class'        => 'UserLdapBundle:Group',
                'choice_label' => 'name',
                'expanded'     => true,
                'multiple'     => true,
                'label'        => 'Accessible pour :'
            )
        );
}

/**
 * @param OptionsResolver $resolver
 */
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'data_class' => AdditionnalInformation::class,
    ));
}

并且我已经创建了我的文章表单类型 "embed" 我的 additionnalInformationType

    /**
 * @param FormBuilderInterface $builder
 * @param array                $options
 */
public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add(
            'title',
            TextType::class,
            array(
                'attr'  => array(
                    'placeholder' => 'Titre'
                ),
                'label' => 'Titre :'
            )
        )
        ->add(
            'category',
            EntityType::class,
            array(
                'attr'         => array(
                    'placeholder' => 'Catégorie'
                ),
                'class'        => 'AppBundle\Entity\Category',
                'choice_value' => 'id',
                'choice_label' => 'name',
                'multiple'     => false,
                'label'        => 'Catégorie :'
            )
        )
        ->add(
            'text',
            TextareaType::class,
            array(
                'attr'     => array(
                    'placeholder' => 'Texte',
                    'class'       => 'tinymce'
                ),
                'label'    => 'Texte :',
                'required' => false
            )
        )
        ->add(
            'tags',
            TextType::class,
            array(
                'attr'  => array(
                    'placeholder' => 'Tags'
                ),
                'label' => 'Tags :'
            )
        )
        ->add(
            'ticketNumber',
            TextType::class,
            array(
                'attr'     => array(
                    'placeholder' => 'Numéro de ticket, 301, 302,'
                ),
                'label'    => 'Numéro(s) de ticket :',
                'required' => false
            )
        )
        ->add(
            'groups',
            EntityType::class,
            array(
                'attr'         => array(
                    'placeholder' => 'Droits'
                ),
                'class'        => 'UserLdapBundle:Group',
                'choice_label' => 'name',
                'expanded'     => true,
                'multiple'     => true,
                'label'        => 'Accessible pour :'
            )
        )
        ->add(
            'additionnalInformations',
            CollectionType::class,
            array(
                'entry_type' => AdditionnalInformationType::class,
                'allow_add'    => true,
                'label' => 'Information(s) additionnel(s) :',
                'prototype' => true
            )
        )
        ->add(
            'additionnalFiles',
            CollectionType::class,
            array(
                'entry_type' => AdditionnalFileType::class,
                'allow_add'    => true,
                'label' => 'Fichier(s) :',
                'prototype' => true
            )
        )
        ->add(
            'save',
            SubmitType::class,
            array(
                'label' => 'Sauvegarder',
                'attr'  => array(
                    'class' => 'btn-primary'
                )
            )
        );

但现在我有一些问题... :) 我怎样才能定制原型?我想使用 bootstrap 面板并将 additionnalInformation 表单放入其中。 并复制此以添加其他 AdditionnalInformation 这可能吗?

你应该尝试写一个自定义的树枝主题。您可以在 this page.

上找到更多信息

例如,您可以尝试将此代码放入您的模板(呈现表单的位置):

{% form_theme form _self %}

{% block _additionnalFiles_entry_widget %}
    <tr>
        <td>{{ form_widget(form.task) }}</td>
        <td>{{ form_widget(form.dueDate) }}</td>
    </tr>
{% endblock %}

只要确保使用正确的块名称即可。您可以通过了解 how form fragment are named 或检查模板中的 {{ dump(form) }} 来做到这一点。

这是我使用过的一个工作示例:

{%  block _article_additionnalInformations_entry_row %}
<br>
<div class="panel panel-primary">
    <div class="panel-heading">Information supplémentaire 
        <a href="#" class="btn btn-xs btn-danger pull-right">
            <span class="glyphicon glyphicon-remove confirmation-suppression"></span>
        </a>
    </div>
    <div class="panel-body">
        <div class="row">
            <div class="col-lg-8">
                {{ form_row(form.title) }}
                {{ form_row(form.text) }}
            </div>
            <div class="col-lg-4">
                {{ form_row(form.groups) }}
            </div>
        </div>
    </div>
</div>
{% endblock %}