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.
Bonjour
Test ceci
{% if editMode %}
<div style='display: none' >
{{ form_row(photo.file) }}
</div>
{% else %}
{{ form_row(photo.file) }}
{% endif %}
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 %}
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,
]);
}
}