Как создать пользовательский тип формы в Symfony 4?

Я пытался создать собственный тип формы с собственным представлением шаблона через Symfony 4 Документация но я получил много ошибок при поиске и попытке его создать.

Вот мой пользовательский тип файла постов — 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 %}

Интересно, если я переопределю один из встроенных типов Symfony через этот шаблон, изменив первую строку на {% block entity_widget %} и использовать EntityType в моем конструкторе форм это работает хорошо. Но когда я начал заполнять это своим собственным типом, он разозлился и показал много несвязанных ошибок!

Любая помощь или инструкция?

2

Решение

ОК, я узнал, как его создать!
Это было так просто, документация показала, что это так сложно, но на самом деле это не так.

Это файл пользовательского типа, 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
])
...

и шаблон, который я предоставил в вопросе, именно то, что генерирует картинки!

2

Другие решения

Других решений пока нет …