Bonjour,

Je souhaite pouvoir afficher le chemin et la photo d'un article quand j'édite ce dernier. Je me suis donc inspiré de la doc symfony "Form Type Extension" https://symfony.com/doc/3.4/form/create_form_type_extension.html

Ce que je fais

J'ai un form ArticlesType (lié a l'entité article) qui utilise la classe MediaType::class pour definir le formulaire Mediatype.php specifique aux photos

//dans ArticlesType.php
->add('image', MediaType::class)

//dans Mediatype.php
->add('image', FileType::class, array('data_class' => null,
                                                  'required' => false,
                                                  'label' => 'Illustration de l\'article',
                                                  'image_property' => 'AssetPath')

image_property' => 'AssetPath' me permet de "lier" mon formulaire media à ImageTypeExtension où je fais un buildView afin de retrouver l'URL des photos

 public function buildView(FormView $view, FormInterface $form, array $options)
    {   
// this will be whatever class/entity is bound to the form (e.g. Media)
            $parentData = $form->getParent()->getData();
            $imageUrl = null;
            if (null !== $parentData) {
                $accessor = PropertyAccess::createPropertyAccessor();

                $imageUrl = $accessor->getValue($parentData, 'AssetPath');
                //dump($imageUrl);
                die(var_dump($imageUrl));
            }
            // sets an "image_url" variable that will be available when rendering this field
            $view->vars['image_url'] = $imageUrl;

Ce que je veux

$imageUrl renvoie bien l'URL, mais du fait de l'imbrication de Mediatype dans ArticlesType, $view->vars['image_url'] n'envoie pas cette variable à la vue.

Ce que j'obtiens

dans la vue,

{% if image_url is not null %}
        <img src="{{ asset(image_url) }}"/>
    {% endif %}

renvoie une erreur puisque twig ne trouve pas image_url.

Comment faire passer $imageUrl à la vue ?

5 réponses


Hello,

Tu y es presque :D
Tout est dans la doc à cet endroit.

Il faut que tu créer un form_theme personnaliser pour ton champs.
Dans ta vue twig actuelle hors des blocks et tout en haut tu ajoutes une ligne de ce genre :

`{% form_theme form _self %}

{% block file_widget %}
{% spaceless %}

{{ block('form_widget') }}
{% if image_url is not null %}
    <img src="{{ asset(image_url) }}"/>
{% endif %}

{% endspaceless %}

{% endblock %}`

Et maintenant cela devrait afficher l'image ;)

Merci beaucoup.
J'ai bien retrouvé dans la doc ce que tu me dis : https://symfony.com/doc/3.4/form/form_themes.html...
Par contre, ca ne marche pas pour moi. Si j'écris en debut de vue :
{% extends '::layout/layoutAdmin.html.twig' %} {% form_theme form _self %}
Symfony me repond < Variable "form" does not exist. >

Pour le coup, dans ton controller, tu affectes bien une variable à la vue comme ceci : 'form' => $form->createView() ? (Je pars du principe que tu as instancié ton formulaire)

{% form_theme form _self %} form étant le nom de ton formulaire

Juste pour info, dans la doc Symfony, il est préconnisé d'utiliser le bundle tiers VichUploaderBundle (https://symfony.com/doc/current/controller/upload_file.html) qui propose les fonctionnalités dont tu as besoin...

Merci Digivia. J'ai bien ce Bundle en effet.
Elyanor... bon, ca avance : grace à {% form_theme edit_form _self %} en debut de vue (je n'avais absolument pas compri ce qu'ils voulaient dire dans la cod), j'obtiens bien les variables de l'image... (je les visualise avec un {{ dump() }} ).
Par contre, je n'arrive pas a exploiter la variable :
{% block file_widget %}

{% spaceless %}
    {{ block('form_widget') }}
            `<img src="{{ asset(image_url) }}"/>`
    {% endspaceless %}
{% endblock %}

me renvoi une erreur twig : Variable "image_url" does not exist.