daften / addressing-bundle
提供 commerceguys 地址包和 Symfony 之间的集成。
Requires
- php: ^7.4 | ^8.0
- commerceguys/addressing: ^2
- doctrine/orm: ^2.6
- symfony/form: ^4.4 | ^5.3 | ^6.0
- symfony/framework-bundle: ^4.4 | ^5.3 | ^6.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^3.0
- symfony/phpunit-bridge: ^4.0
This package is auto-updated.
Last update: 2024-09-02 09:20:46 UTC
README
需求
- jQuery 作为 $ 加载
- jQuery 一次性正确加载。
安装
将映射添加到您的 doctrine.yaml 文件中
doctrine: ... orm: ... entity_managers: default: ... mappings: AddressingBundle: is_bundle: true
待办事项:解释为什么需要此映射。
您还需要根据使用的地址信息表单添加一些配置或 JavaScript。为此,您需要运行 bin/console assets:install
将包资源复制到公共文件夹。
AddressEmbeddableType
您还需要添加一些 JavaScript 代码,以确保国家代码更改时表单可以更新。
下面的脚本提供了一个示例。您只需要初始化 JavaScript 功能。所有地址字段将自动覆盖。此功能仅在使用 Symfony 4 和 Webpack Encore 时有效。
var countryCodeChange = require('../../public/bundles/addressing/js/countryCodeChange'); countryCodeChange.initialize();
AddressEmbeddableGmapsAutocompleteType
您还需要添加一些 JavaScript 代码,以确保自动完成功能可以工作。
下面的脚本提供了一个示例。您只需要初始化 JavaScript 功能。所有自动完成地址字段将自动覆盖。此功能仅在使用 Symfony 4 和 Webpack Encore 时有效。
var addressGmapsAutocomplete = require('../../public/bundles/addressing/js/addressGmapsAutocomplete'); addressGmapsAutocomplete.initialize();
您还需要将 Google API 密钥添加到 .env 文件中,属性名为 GMAPS_API_KEY。您可以通过覆盖 daften.service.gmaps_autocomplete_service 服务的定义来替换此设置。
用法
实体属性
您需要将地址字段添加为 ORM 内嵌属性。
<?php namespace App\Entity; use App\Repository\InstallationAddressRepository; use Daften\Bundle\AddressingBundle\Entity\AddressEmbeddable; use Daften\Bundle\AddressingBundle\Validator\Constraints as AddressingBundleAssert; use Doctrine\ORM\Mapping as ORM; #[ORM\Entity(repositoryClass: InstallationAddressRepository::class)] class AddressExample { #[ORM\Embedded(class: AddressEmbeddable::class)] #[AddressingBundleAssert\EmbeddedAddressFormatConstraint(fieldOverrides: [ 'addressLine1' => 'required', 'postalCode' => 'required', 'locality' => 'required', 'organization' => 'required', 'givenName' => 'required', 'familyName' => 'required', 'addressLine2' => 'optional', 'additionalName' => 'hidden', 'administrativeArea' => 'hidden', 'dependentLocality' => 'hidden', 'sortingCode' => 'hidden', ])] private AddressEmbeddable $address; /** * AddressExample constructor. */ public function __construct() { $this->address = new AddressEmbeddable(); } /** * @return AddressEmbeddable */ public function getAddress() { return $this->address; } /** * @param AddressEmbeddable $address */ public function setAddress($address): void { $this->address = $address; } }
实体表单
AddressEmbeddableType
此表单类型可以使用 3 个额外的选项
- allowed_countries: 允许在国家下拉菜单中选择的国家。这是一个数组,其中键应该是国家名称,值应该是两位国家代码。
- preferred_countries: 偏好的国家数组,使用两位国家代码。
- default_country: 在国家下拉菜单中显示的默认国家。
以下是一个示例表单,对于上述 AddressExample 类,使用默认的 AddressEmbeddableType 和单独的表单字段。
<?php namespace App\Form; use App\Entity\AddressExample; use Daften\Bundle\AddressingBundle\Form\Type\AddressEmbeddableType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; /** * Class AddressExampleType */ class AddressExampleType extends AbstractType { /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('address', AddressEmbeddableType::class, [ 'allowed_countries' => [ 'United States' => 'US', 'United Kingdom' => 'UK', 'Belgium' => 'BE', ], 'preferred_countries' => ['BE', 'US'], 'default_country' => 'US', ]); } /** * {@inheritdoc} */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => AddressExample::class, ]); } }
AddressEmbeddableGmapsAutocompleteType
此表单类型可以使用 1 个额外的选项
- allowed_countries: 允许自动完成的国家的数组。这是一个数组,其中值应该是两位国家代码。
以下是一个示例表单,对于上述 AddressExample 类,使用 AddressEmbeddableGmapsAutocompleteType 和一个自动完成字段。
<?php namespace App\Form; use App\Entity\AddressExample; use Daften\Bundle\AddressingBundle\Form\Type\AddressEmbeddableGmapsAutocompleteType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; /** * Class AddressExampleType2 */ class AddressExampleType2 extends AbstractType { /** * {@inheritdoc} */ public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('address', AddressEmbeddableGmapsAutocompleteType::class, [ 'label' => 'address', 'translation_domain' => 'address', 'allowed_countries' => [ 'BE', 'NL', ], ]); } /** * {@inheritdoc} */ public function configureOptions(OptionsResolver $resolver) { $resolver->setDefaults([ 'data_class' => AddressExample::class, ]); } }