Cacher un input dans un template

Ce sujet est résolu
Default
,

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éponse

Default
,

Bonjour

Test ceci

{% if editMode %}
   <div style='display: none' >
          {{ form_row(photo.file) }}
   </div>
{% else %}
      {{ form_row(photo.file) }}
{% endif %}
87112
,

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).

44227
,

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

{% if editMode != 1 %}
  {{ form_row(photo.file) }}
{% else %}
Default
,

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,
        ]);
    }
}