其他分享
首页 > 其他分享> > 如何在Symfony 4中创建自定义表单类型?

如何在Symfony 4中创建自定义表单类型?

作者:互联网

我试图通过Symfony 4 Documentation创建具有其自己的模板视图的自定义表单类型,但是通过搜索并尝试创建一个自定义表单类型却出现了很多错误.

这是我的自定义表单类型文件ImageChoiceType.php:

<?php

namespace App\Form\Type;

use App\Entity\Media;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ImageChoiceType extends AbstractType
{

    private $entityManager;

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


    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
//            'data_class' => Media::class,
            'class' => Media::class,
            'choices' => $this->entityManager->getRepository(Media::class)
                            ->findAll(),
        ));
    }

    public function getParent()
    {
       return EntityType::class;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'image_choice';
    }

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

这是我的字段模板:

{% block image_choice_widget %}
    <div class="image_widget">
        <div class="radio">
            <label for="post_image_placeholder" class="">
                <input type="radio" id="post_image_placeholder" name="post[image]" value=""
                        {{ form.vars.value == "" ? "checked='checked'" : ""}}> None
            </label>
        </div>
        <div class="image-container">
            {% for key,choice in form.vars.choices %}
                <div class="radio col-xs-2">
                    <label for="post_image_{{ key }}" class="">
                        <input class="image-radio-buttons" type="radio" id="post_image_{{ key }}" name="post[image]"
                               value="{{ key }}" {{ form.vars.value == key ? "checked='checked'" : ""}}>
                        <img src="{{ asset(constant('App\\Constants::UPLOAD_MEDIA')~choice.label) }}" class="image-thumbs img-responsive"/>
                    </label>
                </div>
            {% endfor %}
            <div class="clearfix"></div>
        </div>
    </div>
{% endblock %}

有趣的部分是,如果我通过此模板通过将第一行更改为{%blockEntity_widget%}并在我的表单构建器中使用EntityType来覆盖Symfony的一种内置类型,则效果很好.但是当我开始用自己的自定义类型填充它时,它很生气并显示了许多不相关的错误!

有帮助或指示吗?

解决方法:

好的,我知道了如何创建它!
那太简单了.文档显示它是如此复杂,但实际上并非如此.

这是自定义表单类型文件ImageChoiceType.php:

<?php

namespace App\Form\Type;

use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\OptionsResolver\OptionsResolver;

class ImageChoiceType extends AbstractType
{
    public function configureOptions(OptionsResolver $resolver)
    {
    }

    public function getParent()
    {
        return EntityType::class;
    }

    /**
     * {@inheritdoc}
     */
    public function getName()
    {
        return 'image_choice';
    }

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

这就是我在表单生成器中使用此字段的方式:

...
  ->add('image',ImageChoiceType::class , [
       'label' => 'Choose an Image',
       'class' => Media::class
  ])
...

我在问题中提供的模板正是生成图片的原因!

标签:symfony4,symfony,custom-field-type,php
来源: https://codeday.me/bug/20191109/2011785.html