Я возился с пользовательскими типами полей формы в Symfony 4, чтобы сделать форму способной обрезать изображение (используя cropper.js ) и получить некоторый JSON, сгенерированный WYSIWYG (используя Quill.js ).
Мне удалось создать собственное поле формы, используя документацию , и все работает правильно, когда дело доходит до сохранения данных.
Я хочу пойти дальше и отредактировать некоторые данные, ранее сохраненные в сущности (называемой здесь «Статья»), я передаю свою сущность как параметр формы под ключом «edit», чтобы вручную позаботиться об этом в моем классе формы ("BackendNewsAddForm.php").
К сожалению, обычная функция $builder->setData()
может устанавливать только данные предварительно созданных типов полей.Поэтому я ищу способ «Best Practice», чтобы получить значение, которое я хочу установить для шаблона соответствующего типа поля формы.
Решение, которое я решил:
Поскольку функция $builder->setData()
может задавать данные предварительно созданных типов полей внутри пользовательских типов полей, я добавил к каждому из моих пользовательских типов полей скрытый виджет со значением, которое нужно установить для редактирования, и связал это значение, используяJavaScript внутри шаблона.Но это не звучит по-настоящему оптимизированно, и это определенно не тот метод, который я ищу.
Вот код, над которым я работаю:
BackendNewsAddForm.php (класс формы)
class BackendNewsAddForm extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('title', TextType::class, array("label" => "Titre de l'article"))
->add('description', TextareaType::class, array("label" => "Description de l'article pour la page d'accueil"))
->add('thumbnail', CroppedPictureInput::class, array("label" => "Miniature de l'article"))
->add('content', QuillTextArea::class, array("label" => "Contenu de l'article"));
if(isset($options['data']['edit'])){
$article = $options['data']['edit'];
$builder->add('id', HiddenType::class, array("data" => $article->getId()));
//I tried the solution I though of here, it looks weird
$builder->setData(array(
'title' => $article->getTitle(),
'description' => $article->getDescription(),
'thumbnail' => array(
'cropped_picture_img' => array(
"picture_input" => $article->getThumbnail()
),
'cropped_picture' => $article->getThumbnail()
),
'content' => array(
'quill_textarea_value' => $article->getContent()
)
));
}
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => null,
]);
}
}
CroppedPictureInput.php (тип поля обрезанного изображения)
class CroppedPictureInput extends AbstractType
{
public $test = false;
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'compound' => true
]);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('cropped_picture_file', FileType::class, array('label' => false, "attr" => array("accept" => "image/jpeg, image/jpg, image/png")))
->add('cropped_picture_img', PictureType::class)
->add('cropped_picture', HiddenType::class);
s('buildForm');
s($builder->getData());
die();
}
public function getBlockPrefix()
{
return 'cropped_picture';
}
public function getName()
{
return 'cropped_picture';
}
}
PictureType.php (тип изображения, используемый в CroppedPictureInput)
class PictureType extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'compound' => true,
'img_src' => "",
'img_alt' => ""
]);
}
public function buildForm(FormBuilderInterface $builder, array $options){
$builder->add('picture_input', HiddenType::class);
}
public function buildView(FormView $view, FormInterface $form, array $options)
{
$view->vars['img_src'] = $options['img_src'];
$view->vars['img_alt'] = $options['img_alt'];
}
public function getBlockPrefix()
{
return 'picture_type';
}
public function getName()
{
return 'picture_type';
}
}
QuillTextArea.php (пользовательский тип textarea)
class QuillTextArea extends AbstractType
{
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'compound' => true
]);
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder->add('quill_textarea', TextareaType::class, array('label' => false))
->add('quill_textarea_value', HiddenType::class);
}
public function getBlockPrefix()
{
return 'quill_textarea';
}
public function getName(){
return 'quill_textarea';
}
}
Я не добавил шаблоны каждого из этих типов пользовательских полей для удобства чтения, но при необходимости могу предоставить их.
Спасибо за ваше время:)