PHPackages                             eckinox/address-bundle - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. eckinox/address-bundle

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

eckinox/address-bundle
======================

Provides a form type to autocomplete addresses

v5.1.0(1y ago)25.5k↓66.7%1proprietaryPHPPHP &gt;=8.1.10

Since Dec 2Pushed 1y ago1 watchersCompare

[ Source](https://github.com/eckinox/address-bundle)[ Packagist](https://packagist.org/packages/eckinox/address-bundle)[ RSS](/packages/eckinox-address-bundle/feed)WikiDiscussions master Synced 1mo ago

READMEChangelog (10)Dependencies (9)Versions (13)Used By (0)

AddressBundle
=============

[](#addressbundle)

Le AddressBundle offre la possibilité d'avoir des champs d'auto-complétion utilisant différentes API pour les formulaires contenant des adresses.

[![Exemple d'utilisation](demo/example.gif)](demo/example.gif)

---

Installation du bundle
----------------------

[](#installation-du-bundle)

1. Installez le bundle via Composer:

```
composer require eckinox/address-bundle
```

2. Ajoutez le secret:

```
bin/console secrets:set INSERT_CHOSEN_API_NAME_HERE_API_KEY
```

Remplacez `INSERT_CHOSEN_API_NAME` pour l'API choisi. Les API disponibles sont les suivantes: `GOOGLE_PLACES`, `ADDRESS_COMPLETE`.

Pour générer votre clé d'API, veuillez vous référer aux articles ci-dessous:

- [How to install | AddressComplete | Canada Post](https://www.canadapost-postescanada.ca/ac/support/setup-guides/#create-an-api-key)
- [Use API Keys with Places API | Google Developers](https://developers.google.com/maps/documentation/places/web-service/get-api-key)

3. Ajouter les routes:
    Créer un fichier `eckinox_address.yaml` dans le dossier `config/routes` contenant les lignes suivantes:

```
eckinox_address:
    resource: "@EckinoxAddressBundle/config/routes.yaml"

```

---

Comment utiliser *Address Bundle*
---------------------------------

[](#comment-utiliser-address-bundle)

### Créer l'entité

[](#créer-lentité)

Tout d'abord, créer l'entité qui sera utilisée pour enregistrer les adresses. Pour ce faire, vous n'avez qu'à extend la classe abstraite fournie par le bundle comme suis:

```
use Eckinox\AddressBundle\Entity\AbstractAddress;

class MyAddressClass extends AbstractAddress
{
    // Just add other needed fields like usual
}
```

Voici la liste des propriétés définies dans `AbstractAddress`:

```
	protected int $id;
	protected string $name;
	protected string $address;
	protected string $city;
	protected string $province;
	protected string $postalCode;
```

### Utiliser l'auto-complete dans les formulaires

[](#utiliser-lauto-complete-dans-les-formulaires)

Il y a deux manières d'utiliser les adresses dans vos formulaires:

- AddressType: Génère un formulaire complet avec les champs de base de l'entité abstraite `AbstractAddress`. (*Fonctionne bien pour une liste d'adresses de base avec le `CollectionListType` fourni par [eckinox/admin-ui-bundle](https://github.com/eckinox/admin-ui-bundle)*).
- AddressAutocompleteType: Génère un champ de type input, utilisé pour lancer la recherche via l'API choisi et afficher la liste de possibilitées.

Voici comment les utiliser:

#### **AddressType**

[](#addresstype)

Pour utiliser le formulaire `AddressAutocompleteType` dans vos `FormType`, vous devez:

1. Ajouter `Eckinox\AddressBundle\Form\Type\AddressType;` dans les use de votre formulaire où vous désirez l'afficher.
2. Puis, utiliser `AddressType` et passer l'entité d'`address` désiré à l'aide du paramètre `entry_options` puis lui passer `'data_class' => MyAddressClass::class,` (voir l'exemple ci-dessous).
3. Ajouter, au besoin, l'API désiré avec l'option `api`, l'API de Poste Canada "Address Complete" sera utilisé par défaut.

```
use Eckinox\AddressBundle\Form\Type\AddressType;
use Symfony\Component\Form\FormBuilderInterface;
use App\Entity\Address;

class MyFormType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options): void
    {
        $builder
			// Add fields like you usually would.
			->add('addresses', CollectionListType::class, [
				'entry_type' => AddressType::class,
				'entry_options' => [
					'data_class' => Address::class,
					'api' => 'addressComplete',
				],
				'by_reference' => false,
			])
        ;
    }
}
```

#### **AddressAutocompleteType**

[](#addressautocompletetype)

Pour utiliser le champ `AddressAutocompleteType` dans vos `FormType`, vous devez:

1. Ajouter `Eckinox\AddressBundle\Form\Type\AddressAutocompleteType` dans vos use.
2. Ajouter votre champ `AddressAutocompleteType` comme vous le feriez avec n'importe quel autre champ.
3. Ajouter les paramètres désirés:
    1. Il est recommandé de désactiver l'autocomplete du champ pour éviter que les propositions du navigateur passent par-dessus les propositions d'autocomplete. Vous n'avez qu'à ajouter l'attribut suivant au champ: `'autocomplete' => uniqid('noautocomplete')`.
    2. Il est possible de passer un paramètre `api` pour choisir l'API à utiliser. Les choix disponibles sont: `addressComplete` ou `googlePlaces`. Si aucun API est spécifié, l'api de Poste Canada "Address Complete" sera utilisé par défaut.
    3. Ajouter, au besoin l'option `parent` qui sert à définir un sélecteur JS valide qui sera utilisé à la place du `parentNode`. Utile si vous voulez remplir les informations de l'autocomplete sur des champs qui ne sont pas à l'intérieur du parent immédiat. Exemple: `.section-wrapper.geo.card`

Voici un exemple:

```
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Eckinox\AddressBundle\Form\Type\AddressAutocompleteType;

class AddressType extends AbstractType
{
	public function buildForm(FormBuilderInterface $builder, array $options): void
	{
		$builder
			->add('name', TextType::class)
			->add('address', AddressAutocompleteType::class, [
				'attr' => [
					'autocomplete' => uniqid('noautocomplete'),
				],
				'api' => 'addressComplete', // addressComplete || googlePlaces
				'parent' => '.section-wrapper.geo.card', // Optionnel, par défaut le parent immédiat

			])
			->add('city', TextType::class)
			->add('province', TextType::class)
			->add('postalCode', TextType::class)
		;
	}
```

4. Une fois l'auto-complete ajouté au formulaire, il est possible d'utiliser l'event javascript `populate-address` pour remplir les champs avec les détails de l'adresse (qui se retrouvent dans `event.detail`). L'event est déclenché sur l'élément de row du formulaire, donc dans ce cas-ci, sur ``. Voici l'event listener utilisé par la liste par défaut qui peut être redéfini et ajusté pour vos besoins spécifiques:

```
this.row.addEventListener('populate-address', (event) => {
	const addressInput = this.input;
	let cityInput = this.row.querySelector('*[data-field-name="city"] input');
	let provinceInput = this.row.querySelector('*[data-field-name="province"] input');
	let postalCodeInput = this.row.querySelector('*[data-field-name="postalCode"] input');

	// in the case where the form would be displayed in a modal
	if (cityInput == null || provinceInput == null || postalCodeInput == null) {
		cityInput = this.row.querySelector('*.city input');
		provinceInput = this.row.querySelector('*.province input');
		postalCodeInput = this.row.querySelector('*.postal-code input');
	}

	addressInput.value = event.detail.address;
	cityInput.value = event.detail.city;
	provinceInput.value = event.detail.province;
	postalCodeInput.value = event.detail.postalCode;
});
```

---

Fonctionnement
--------------

[](#fonctionnement)

Lorsqu'un champ de type `AddressAutocompleteType` est utilisé dans un formulaire, l'input classique est remplacé par un webcomponent d'autocomplete qui contient le champ utilisé pour la rechercher et la liste qui receveras les résultats de l'API.

Une fois qu'un choix est sélectionné, une autre requête à l'API est lancée et les détails de l'adresse sont retournés. Un event javascript est déclenché et les autres champs d'adresse sont alors remplis.

###  Health Score

36

—

LowBetter than 82% of packages

Maintenance34

Infrequent updates — may be unmaintained

Popularity23

Limited adoption so far

Community14

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor2

2 contributors hold 50%+ of commits

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~54 days

Recently: every ~81 days

Total

12

Last Release

653d ago

Major Versions

v1.0.0-beta.4 → v2.0.02023-06-12

v2.2.0 → v5.0.02024-04-25

PHP version history (2 changes)v1.0.0-beta.1PHP &gt;=8.0

v5.0.0PHP &gt;=8.1.10

### Community

Maintainers

![](https://www.gravatar.com/avatar/ca11aff13a18ad8ee04469ec53cb79bf2c10dd95ea73d77f84e2582fa67efbf8?d=identicon)[eckinox](/maintainers/eckinox)

---

Top Contributors

[![VincentGrenon](https://avatars.githubusercontent.com/u/84418961?v=4)](https://github.com/VincentGrenon "VincentGrenon (14 commits)")[![Emma1987](https://avatars.githubusercontent.com/u/28593632?v=4)](https://github.com/Emma1987 "Emma1987 (10 commits)")[![joshmenard](https://avatars.githubusercontent.com/u/43248805?v=4)](https://github.com/joshmenard "joshmenard (7 commits)")[![jeandanyel](https://avatars.githubusercontent.com/u/15878787?v=4)](https://github.com/jeandanyel "jeandanyel (5 commits)")[![Raphael-H-M](https://avatars.githubusercontent.com/u/88846100?v=4)](https://github.com/Raphael-H-M "Raphael-H-M (5 commits)")[![hadjerguechi](https://avatars.githubusercontent.com/u/65762366?v=4)](https://github.com/hadjerguechi "hadjerguechi (2 commits)")

---

Tags

addresscompletecanadapostgoogle-placessymfony-bundle

### Embed Badge

![Health badge](/badges/eckinox-address-bundle/health.svg)

```
[![Health](https://phpackages.com/badges/eckinox-address-bundle/health.svg)](https://phpackages.com/packages/eckinox-address-bundle)
```

###  Alternatives

[sylius/sylius

E-Commerce platform for PHP, based on Symfony framework.

8.4k5.6M648](/packages/sylius-sylius)[prestashop/prestashop

PrestaShop is an Open Source e-commerce platform, committed to providing the best shopping cart experience for both merchants and customers.

9.0k15.4k](/packages/prestashop-prestashop)[sulu/sulu

Core framework that implements the functionality of the Sulu content management system

1.3k1.3M152](/packages/sulu-sulu)[kimai/kimai

Kimai - Time Tracking

4.6k7.4k1](/packages/kimai-kimai)[netgen/layouts-core

Netgen Layouts enables you to build and manage complex web pages in a simpler way and with less coding. This is the core of Netgen Layouts, its heart and soul.

3689.4k10](/packages/netgen-layouts-core)[contao/core-bundle

Contao Open Source CMS

1231.6M2.3k](/packages/contao-core-bundle)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
