Pré-charger une valeur dans select2 ou un attribut d'input
Bonjour à tous,
J'utilise le plugin javascript select2 dans symfony pour avoir un champ permettant de choisir une (ou plusieurs) villes.
Je me sers de l'autocomplétion de select2 pour proposer des villes.
Ca marche mais quand je veux afficher un formulaire rempli avec des données, je ne sais pas comment donner la valeur.
le twig :
Code:
1 2
| {{ form_row(form.address.street) }}
{{ form_row(form.address.city.id) }} |
La classe pour charger les données de l'adresse dans le formulaire :
Code:
1 2 3 4 5 6 7 8 9
| class AddressType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder
->add('street', TextType::class, ['label' => 'address.street'])
->add('city', CityType::class, ['data_class' => 'MyBundle\Entity\City'])
;
}
} |
Et celle pour la ville :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13
| class CityType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options) {
$builder->add('id', ChoiceType::class, [
'expanded' => false,
'multiple' => false,
'label' => 'address.citycode',
'attr' => ['data-city' => 'true']
//'choices' => [],
]);
}
} |
Et le javascript:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
| $(document).ready(function () {
$("[data-city]").each(function () {
initAutocompleteCity(this);
});
});
function initAutocompleteCity(selector) {
console.log($(selector).id);
$(selector).select2({
ajax: {
url: "ajax/cities",
dataType: 'json',
delay: 250,
cache: true,
processResults: function (data) {
return{results: data};
}
},
minimumInputLength: 3,
multiple: $(selector).attr('multiple'),
allowClear: $(selector).attr('multiple')
//placeholder: "Entrer un code postal"
});
} |
select2 a une propriété data qui permet d'initialiser avec les choix enregistrés en base, mais ma fonction est faite pour initialiser plusieurs champs dans une même page.
Code:
$('select').select2({ data: [ { id: 'value', text: 'Text to display' }, '... more data objects ...' ] });
Je ne sais donc pas comment faire pour que chaque champs soit initialisé avec sa (ses) ville(s) choisies précédemment.
J'imaginais utiliser 'attr' => ['data-city' => XXX] en remplaçant pas un objet JS comme celui requi par data et de récupérer la valeur lors de l'initialisation, mais comment dire au builder de récupérer une valeur construite pour chaque objet (une méthode de mon objet City) ?
Je peux peut-être utiliser aussi "choices" mais je crain que ce soit écrasé à la première requête ajax. Et la même question se pose : comment appeler la méthode de l'objet City qui pourrait créer l'information ?
Peut-être aurez-vous la réponse ou une autre solution,
Merci !!