Bonjour,

Dans un template, je cherche à cacher des champs de type file au cas où on est en mode édition du formulaire. Pour ce faire j'ai procédé comme suit :

    <h4>Photos</h4>

    <ul class= "photos" data-prototype= " {{ form_widget ( form.photos.vars.prototype )| e ( 'html_attr' ) }} " >
        {# iterate over each existing photo and render its only field: name #}

        {% set i = 0 %}

        {% for photo in form.photos %}

            <li id="li_photo_{{ i }}"> 

                {% if editMode == 1 %}

                    {{ form_row ( photo.file, { 'attr': {'class': 'hidden-row'} }) }}

                {% else %}

                {{ form_row ( photo.file ) }}

                {% endif %}

                {{ form_row ( photo.mainPhoto ) }}
                {{ form_row ( photo.name ) }}

                {% if editMode and form.photos %}

                    <img id="photo_{{ i }}"  src="{{ asset('uploads/photos/') }}{{ recordedPhotosNames[i] }}" width="100" alt="Photo{{ i + 1 }}">
                    {% set i = i + 1 %}

                {% endif %}

            </li>

        {% endfor %}

    </ul>

Lorsque je suis en mode édition (editMode == 1), les inputs de type file sont tout de même affichés malgré que, dans mes sources, ce soit ceci qui est généré :

<input type="file" id="photos_advert_photos_1_file" name="photos_advert[photos][1][file]" class="hidden-row custom-file-input" />

Quelqu'un aurait une idée sur la manière de procéder?

Merci d'avance pour votre aide.

4 réponses


Balbert
Réponse acceptée

Bonjour

Test ceci

{% if editMode %}
   <div style='display: none' >
          {{ form_row(photo.file) }}
   </div>
{% else %}
      {{ form_row(photo.file) }}
{% endif %}
Digivia
Réponse acceptée

Hello,

A voir s'il n'y a pas d'effet de bord lorsque tu n'affiches pas le champ, il reste construit par le builder... Surtout s'il y a des contraintes définies dessus. Perso, je modifierais directement le form en fonction du mode (dans ton formType, rajoutes une option).

Tu devrais simplement ne pas l'ajouter lorsque tu est en mode edit

{% if editMode != 1 %}
  {{ form_row(photo.file) }}
{% else %}
dubitoph
Auteur

Un tout grand merci à vous tous pour votre aide.

Je suis donc passé par une condition dans le buildForm.

Dans mon controller :

 $form = $this->createForm(PhotosAdvertType::class, $advert, array('editMode' => $numberOldPhotos,));

Dans mon formulaire principal :

class PhotosAdvertType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        $builder
            ->add('photos', CollectionType::class, array(
                                                      'entry_type' => PhotoType::class,  
                                                      'prototype' => true,
                                                      'allow_add' => true,
                                                      'allow_delete' => true,
                                                      'by_reference' => false,
                                                      'required' => false,
                                                      'label' => false,
                                                      'entry_options' => array('editMode' => $options['editMode'],), 
                  ))
            ->add('deletedPhotos', HiddenType::class, array('mapped' => false,))
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Advert::class, 
            'editMode' => 0,
        ]);
    }
}

Dans mon sous-formulaire :

class PhotoType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {

        if ($options['editMode'] == 0) {

            $builder ->add('file', FileType::class, array( 
                                                        'label' => false, 
                                                        'required' => true, 
                                                        'constraints' => array(new File(),),
                                                         )
                          );

        }
        else {

            $builder ->add('file', HiddenType::class);

        }

        $builder 
                    ->add('mainPhoto')
                    ->add('name', HiddenType::class)  
        ;
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Photo::class,
            'editMode' => 0,
        ]);
    }
}