Пользовательский поставщик Sonata Media Bundle не отображает данные запроса - PullRequest
1 голос
/ 15 октября 2019

У меня есть пользовательский ImageProvider для использования с комплектом мультимедиа Sonata.

К сожалению, когда я нажимаю кнопку отправить, поля формы помещаются в extra_data, а не в объект формы, что приводит к сообщению об ошибке This form should not contain extra fields..

Моя функция buildCreateForm выглядит следующим образом:

    public function buildCreateForm(FormMapper $formMapper)
    {
        $formMapper
            ->with('Media Details', ['class' => 'panel-media-details'])
                ->add('binaryContent', 'file', [
                    'label' => 'Upload an Image File',
                    'help'  => AdminUtils::helpPopover(
                        'The uploaded image file should be in one of the following types: <strong>png, gif, jpg, jpeg</strong>',
                        ['placement' => 'right']
                    ),
                    'constraints' => [
                        new NotBlank(),
                        new NotNull(),
                        new File([
                            'mimeTypes' => ['image/png', 'image/gif', 'image/jpeg', 'image/pjpeg'],
                            'mimeTypesMessage' => 'This file is not an image (should be a PNG, a GIF or a JPEG, but is a {{ type }})',
                        ])
                    ],
                ])
                ->add('name', 'text', [
                    'label' => 'Title',
                    'help'  => AdminUtils::helpPopover(
                        'The title for the image. It will be displayed as the image caption when embedding the image in text or when rendering it as part of a gallery. It will also be displayed as the title on the individual media item page, and in search results.',
                        ['placement' => 'right']
                    ),
                    'required' => true,
                ])
                ->add('alt_tag', 'text', [
                    'label' => 'Alternative Text',
                    'help'  => AdminUtils::helpPopover(
                        'The text that will be used by screen readers, search engines, and when the image cannot be loaded. If not provided, the title will be used.',
                        ['placement' => 'right']
                    ),
                    'mapped'   => false,
                    'required' => true,
                ])
                ->add('description', CKEditorType::class, [
                    'help'     => AdminUtils::helpPopover('The description will be displayed on the media item page, in search results, and possibly when the image is displayed in a popup (lightbox) by itself or as part of a media gallery.', ['placement' => 'right']),
                    'required' => false,
                ])
            ->end()

            ->with('Notes', ['class' => 'panelr-notes'])
                ->add('notes', CKEditorType::class, [
                    'label'    => 'Notes',
                    'help'     => AdminUtils::helpPopover('Notes for administrative purposes; these are visible to Editors only and they will never be displayed on the frontend site.'),
                    'required' => false,
                ])
            ->end()

        ;
    }

Моя $mediaAdmin->configureFormFields() выглядит следующим образом:

    protected function configureFormFields(FormMapper $formMapper)
    {
        $formMapper
            ->with('Publishing', ['class' => 'panelr-publishing'])
                ->add('enabled', null, [
                    'label'    => 'Published',
                    'help'     => AdminUtils::helpPopover('Media items that are unpublished will not be displayed anywhere on the frontend site, even when they are attached to content or embedded into text. They will still be visible in the backend CMS site.'),
                    'required' => false,
                ])
            ->end()
        ;

        $media = $this->getSubject();

        if (!$media) {
            $media = $this->getNewInstance();
        }

        if (!$media || !$media->getProviderName()) {
            return;
        }

        $formMapper->getFormBuilder()->addModelTransformer(
            new ProviderDataTransformer($this->pool, $this->getClass()), true
        );

        $provider = $this->pool->getProvider($media->getProviderName());

        if ($media->getId()) {
            $provider->buildEditForm($formMapper);
        } else {
            $provider->buildCreateForm($formMapper);
        }

        // Put any hidden fields at the bottom of the form so that they don't
        // break :first-child css rules used. Also, wrap them in a closed form
        // group so that it doesn't break form groups loaded through
        // buildEditForms or configureFormFields defined in child Admin classes.
        $formMapper
            ->with('Provider', ['class' => 'hidden-provider'])
                ->add('providerName', 'hidden')
            ->end()
        ;
    }

и отладка объекта формыпосле сбоя проверки:

enter image description here

Я переопределяю sonata.media.provider.iamge, следовательно, он отображается как поставщик.

1 Ответ

1 голос
/ 17 октября 2019

Для тех, кто найдет здесь путь ...

Во-первых, чтобы пропустить нарушение дополнительных полей

public function getFormBuilder()
{
    $this->formOptions['allow_extra_fields'] = true;
    return parent::getFormBuilder();
}

рядом с вручную сопоставить поля

public function prePersist($media)
{
    // This is a bit messy, but get the extra_data array and manually map it
    $extraData = $this->getForm()->getExtraData();
    $media->setProviderName($extraData['providerName']);

    $media->setName($extraData['name']);
    $media->setDescription($extraData['description']);
    $media->setBinaryContent($extraData['binaryContent']);
    $media->setNotes($extraData['notes']);

   parent::prePersist($media);
}

...