dobryprogramator/smartform-bundle

连接 Symfony 与 www.smartform.cz 的组件

安装数: 2,368

依赖项: 0

建议者: 0

安全: 0

星标: 0

关注者: 2

分支: 0

类型:symfony-bundle

v2.0.2 2021-08-23 13:39 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) }}