Как вручную настроить значение типа поля пользовательской формы в Symfony 4? - PullRequest
1 голос
/ 09 июня 2019

Я возился с пользовательскими типами полей формы в 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';
    }
}

Я не добавил шаблоны каждого из этих типов пользовательских полей для удобства чтения, но при необходимости могу предоставить их.

Спасибо за ваше время:)

...