eckinox/address-bundle 问题修复 & 功能扩展

解决BUG、新增功能、兼容多环境部署,快速响应你的开发需求

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

eckinox/address-bundle

Composer 安装命令:

composer require eckinox/address-bundle

包简介

Provides a form type to autocomplete addresses

README 文档

README

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

Installation du bundle

  1. Installez le bundle via Composer:
composer require eckinox/address-bundle
  1. 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:

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

Créer l'entité

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

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

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

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)
		;
	}
  1. 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 <tr>. 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

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.

eckinox/address-bundle 适用场景与选型建议

eckinox/address-bundle 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 5.54k 次下载、GitHub Stars 达 1, 最近一次更新时间为 2022 年 12 月 02 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 eckinox/address-bundle 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 eckinox/address-bundle 我们能提供哪些服务?
定制开发 / 二次开发

基于 eckinox/address-bundle 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 5.54k
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 2
  • 点击次数: 12
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 1
  • Watchers: 1
  • Forks: 1
  • 开发语言: PHP

其他信息

  • 授权协议: proprietary
  • 更新时间: 2022-12-02