Extension de formulaire non chargée

Pourtant le service est bien défini

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous !

Aujourd'hui, j'ai besoin de vos yeux, ça fait deux jours que je bute sur un truc qui m'échappe, et je ne vois pas quoi.

Dans l'idée d'ajouter une prévisualisation de l'image dans mes formulaires Symfony, là où il y a un champ de type 'file' (je n'ai que des images à gérer), je suis parti sur l'extension de formulaires. J'ai défini ma classe, ai adapté le code, déclaré le service qui est correctement listé avec debug:container, mais la classe n'est jamais construite. Je n'ai aucune autre erreur que Twig qui me dit qu'une des variables que devrait créer cette extension n'existe pas, ce qui est en soi logique.

Est-ce que quelqu'un verrait ce que je loupe depuis hier ?

Merci  :)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
<?php

namespace YSoft\MediaBundle\Form;

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;

class MediaType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('type', 'hidden')
            ->add('path', 'hidden')
            ->add('name', 'hidden')
            ->add('file', 'file', array(
                'required' => false,
                'attr'     => array(
                    'accept' => 'image/*',
                    'class'  => 'filestyle'
                )
            ))
        ;
    }

    /**
     * @param OptionsResolverInterface $resolver
     */
    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'data_class' => 'YSoft\MediaBundle\Entity\Media'
        ));
    }

    /**
     * @return string
     */
    public function getName()
    {
        return 'ysoft_mediabundle_media';
    }
}

YSoft\MediaBundle\Form\MediaType.php

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
namespace YSoft\MediaBundle\Form\Extension;

use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\FormView;
use Symfony\Component\Form\FormInterface;

class MediaTypeExtension extends AbstractTypeExtension
{
    public function getExtendedType()
    {
        return 'ysoft_mediabundle_media';
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setOptional(array('image_options'));
    }

    public function buildView(
        FormView $view,
        FormInterface $form,
        array $options
    ) {
        if (array_key_exists('image_options', $options)) {
            $view->vars['image_options'] = $options['image_options'];
        } else {
            $view->vars['image_options'] = array();
        }
        $view->vars['file'] = &$form->getParent()->getData();
    }
}

YSoft\MediaBundle\Form\Extension\MediaTypeExtension.php

1
2
3
4
5
services:
    ysoft_media_bundle.media_type_extension:
      class: YSoft\MediaBundle\Form\Extension\MediaTypeExtension
      tags:
        - { name: form.type_extension, alias: ysoft_mediabundle_media }

Déclaration du service

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
{% block ysoft_mediabundle_media_widget %}
    {% spaceless %}

    {% if file is not null %}
        {{ file|image(image_options) }}
    {% endif %}
    {{ block('form_widget') }}

    {% endspaceless %}
{% endblock %}

Le bloc Twig redéfini. L'erreur survient parce que file n'existe pas

Edit

En fait, je remarque que l'alias devrait normalement apparaître listé aussi, mais ce n'est étrangement pas le cas. Peut-être que justement c'est là le souci…

+0 -0

Je vais glisser la réponse ainsi, ce sera plus simple.

Pour qu'une extension de type formulaire fonctionne, il faut que le type lui aussi soit déclaré comme un service, et utilisé comme tel. Donc pas new MediaType() en second argument de FormBuilder::add ni en paramètre du champ de type collection ('type' => new MediaType()).

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte