Cacher un input dans un template

Par dubitoph, il y a 7 ans


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, il y a 7 ans

Bonjour

Test ceci

{% if editMode %} <div style='display: none' > {{ form_row(photo.file) }} </div> {% else %} {{ form_row(photo.file) }} {% endif %}
TheTakylo, il y a 7 ans

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

{% if editMode != 1 %} {{ form_row(photo.file) }} {% else %}
Digivia, il y a 7 ans

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

dubitoph, il y a 7 ans

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