dobryprogramator / smartform-bundle
连接 Symfony 与 www.smartform.cz 的组件
v2.0.2
2021-08-23 13:39 UTC
Requires
- php: ^7.4
- holicz/simple-exception: ^2.0
- symfony/form: ^3.4|^4.4|^5.0
- symfony/validator: ^3.4|^4.4|^5.0
- thecodingmachine/safe: ^1.1
- twig/twig: ^2.0|^3.0
Requires (Dev)
- doctrine/doctrine-bundle: ^2.0
- phpstan/extension-installer: ^1.0
- phpstan/phpstan: ^0.12.18
- thecodingmachine/phpstan-safe-rule: ^1.0
This package is auto-updated.
Last update: 2024-09-23 20:11:27 UTC
README
请确保已全局安装 Composer,如 Composer 文档的 安装章节 所述。
要求
- PHP 7.4
- Symfony 5
- Twig 3
使用 Symfony Flex 的应用程序
打开命令行,进入您的项目目录并执行以下命令
$ composer require dobryprogramator/smartform-bundle
现在继续到 Configuration
章节。
不使用 Symfony Flex 的应用程序
步骤 1: 下载组件
打开命令行,进入您的项目目录并执行以下命令以下载此组件的最新稳定版本
$ composer require dobryprogramator/smartform-bundle
步骤 2: 启用组件
然后,通过将其添加到项目 config/bundles.php
文件中注册的组件列表中来启用组件
// config/bundles.php return [ // ... DobryProgramator\SmartformBundle\DobryProgramatorSmartformBundle::class => ['all' => true], ];
现在继续到 Configuration
章节。
配置
将以下内容添加到 .env
文件中,并用您的 client_id
替换 FILL_IN
。
SMARTFORM_CLIENT_ID=FILL_IN
创建文件 config/packages/dobry_programator_smartform.yaml
,并添加以下内容
dobry_programator_smartform:
client_id: '%env(SMARTFORM_CLIENT_ID)%'
用法
有关组件的更多详细信息,请访问 演示仓库。
此组件仅支持使用 DTO 的表单,如 此处 所述。
实体
<?php namespace App\Entity; use DobryProgramator\SmartformBundle\Entity\AbstractSmartformAddress; use Doctrine\ORM\Mapping as ORM; /** * @ORM\Entity(repositoryClass="App\Repository\AddressRepository") */ class Address extends AbstractSmartformAddress { /** * @ORM\Id() * @ORM\GeneratedValue() * @ORM\Column(type="integer") */ private $id; public function getId(): ?int { return $this->id; } }
模型
<?php declare(strict_types=1); namespace App\Form\Model; use DobryProgramator\SmartformBundle\Form\Model\SmartformAddressModel; use Symfony\Component\Validator\Constraints as Assert; final class AddressModel { /** * @Assert\Valid * * @var SmartformAddressModel */ public $address; }
表单
<?php declare(strict_types=1); namespace App\Form\Type; use App\Form\Model\AddressModel; use DobryProgramator\SmartformBundle\Form\Type\SmartformWholeAddressType; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\OptionsResolver\OptionsResolver; final class AddressType extends AbstractType { public function buildForm(FormBuilderInterface $builder, array $options): void { $builder ->add( 'address', SmartformWholeAddressType::class, [ 'label' => 'Address' ] ) ; } public function configureOptions(OptionsResolver $resolver): void { $resolver->setDefaults( [ 'data_class' => AddressModel::class ] ); } public function getBlockPrefix(): string { return 'app_address_'; } }
数据映射器
在 DTO 和实体之间传输数据
<?php declare(strict_types=1); namespace App\Form\DataMapper; use App\Entity\Address; use App\Form\Model\AddressModel; use DobryProgramator\SmartformBundle\Exception\SmartformFieldNotFilledException; use DobryProgramator\SmartformBundle\Form\DataMapper\SmartformAddressMapper; final class AddressDataMapper { private SmartformAddressMapper $smartformAddressMapper; public function __construct(SmartformAddressMapper $smartformAddressMapper) { $this->smartformAddressMapper = $smartformAddressMapper; } /** * @throws SmartformFieldNotFilledException */ public function mapEntityFromModel(Address $entity, AddressModel $model): void { $this->smartformAddressMapper->mapEntityFromModel($entity, $model->address); } public function mapModelFromEntity(Address $entity, AddressModel $model): void { $this->smartformAddressMapper->mapModelFromEntity($entity, $model->address); } }
控制器
... $addressModel = new AddressModel(); $addressForm = $this->createForm(AddressType::class, $addressModel); $addressForm->handleRequest($request); if($addressForm->isSubmitted() && $addressForm->isValid()) { $address = new Address(); $this->addressDataMapper->mapEntityFromModel($address, $addressModel); // Do whatever you need with the entity, for example persist to the databas } ...
模板
{{ smartform_init() }} {{ form_start(address_form) }} {% if address_form.address.vars.errors.count %} <small class="form-text text-danger"> Address is not valid </small> {% endif %} Address {{ form_widget(address_form.address) }} <button type="submit" class="btn btn-primary">Submit</button> {{ form_end(address_form) }}