imatic/form-bundle

Symfony表单工作包

安装数: 6,484

依赖项: 3

建议者: 0

安全: 0

星标: 1

关注者: 7

分支: 0

开放问题: 0

类型:symfony-bundle

v5.2.1 2023-04-03 07:08 UTC

README

Build Status License: MIT

ImaticFormBundle

表单类型

Ajax实体选择

使用XHR实现单个实体或实体集合的选择。

依赖项:jQuery, Select2

<?php

use Imatic\Bundle\FormBundle\Form\Type\AjaxEntityChoiceType;

class ExampleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('author', AjaxEntityChoiceType::class, [
            'class' => 'MyExampleBundle:User',
            'route' => 'app_example_example_autocomplete',
        ]);
    }
}

小部件将向指定的路由发送带有输入搜索词的GET请求。请求格式取决于 request_type 选项

  • filter - ?filter[search][value]=term
  • simple - ?search=term

应用程序应返回JSON响应,例如

[
    {"id": 1, "text": "First Item"},
    {"id": 2, "text": "Second Item"}
]

其他选项

  • multiple - 允许多个项目被选中
  • placeholder - 如果没有项目被选中,则显示的文本
  • query_builder - QueryBuilder实例或 Closure(EntityManager $em, $class): QueryBuilder
  • id_provider - callable(object $entity): scalar (应返回实体的ID)
  • text_provider - callable(object $item): string (应返回实体的文本表示形式)
  • request_type - 过滤(默认)或简单
  • route_attrs - 自定义路由属性
  • entity_manager - 要使用的实体管理器名称

日期选择器

此示例显示如何通过表单扩展更改默认日期类型格式和修改moment配置。

<?php

namespace App\Form\Extension;

use Imatic\Bundle\FormBundle\Form\Extension\DatepickerExtension;
use Symfony\Component\OptionsResolver\OptionsResolver;

class DateTypeExtension extends DatepickerExtension
{
    public function configureOptions(OptionsResolver $resolver)
    {
        parent::configureOptions($resolver);

        $resolver->setDefaults([
            'format' => 'dd.MM.yyyy',
            'date_format' => 'DD.MM.YYYY',
            'config_locale' => [
                'en' => [
                    'week' => ['dow' => 1],
                ],
            ],
        ]);
    }

    public static function getExtendedTypes(): iterable
    {
        return [DateType::class];
    }
}

集合

此包提供添加、编辑和删除集合元素所需的JS功能。默认情况下,新添加的项目将带有前缀 new_ 和随机数字,例如 new_16782845986841。但这也可能导致服务器端验证错误。

从版本 5.2. 开始,可以在集合定义中使用 data_index 定义为 truenumeric 值,以从0...N计数集合中的项目。如果集合可以加载现有数据,则应在 data_index 值中指定项目数量。

<?php

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->add('collection', CollectionType::class, [
        'data_index' => $entity->getCollection()->count()
    ]);
}

表单扩展

表单主题

此扩展允许您通过类型选项设置表单主题。

<?php

class ExampleType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        // example: setting template of child form (field)
        $builder->add('example', null, [
            // override form theme template
            'template' => 'MyBundle:Form:example_theme.html.twig',

            // pass extra variables to the theme templates when this field is rendered
            'template_parameters' => [
                'foo' => 'bar',
            ],
        ]);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        // example: setting template of the form type itself
        $resolver->setDefaults([
            'template' => 'MyBundle:Form:example_theme.html.twig',
            'template_parameters' => ['foo' => 'bar'],
        ]);
    }
}

验证约束

数字

  • 确保数字具有正确的精度和小数位数

选项

  • 精度
  • 小数位数

纬度

经度

NotNullGroup

此类级别约束确保所有给定属性都已设置或为null。

有效状态:所有属性为null,所有属性均不为null。

NotNullOneOf

此类级别约束确保至少有一个给定属性不为null。

有效状态:至少有一个属性不为null

示例

<?php

use Imatic\Bundle\FormBundle\Validator\Constraints as ImaticAssert;

/**
 * Evidence
 *
 * @ORM\Entity
 * @ImaticAssert\NotNullGroup(properties={"sitterFirstName", "sitterLastName", "sitterId", "sitterPhone", "sitterRelation"})
 * @ImaticAssert\NotNullOneOf(properties={"mother", "father"}, message="Either the mother or the father information must be specified.")
 */
class Evidence
{
    // ...
}

数据转换器

EmptyEntityToNullTransformer

此转换器将实体对象转换为null,如果它被认为是空的。检查基于要验证的属性列表进行。

如果禁用了严格模式(默认),则null和空字符串都被视为空。

如果启用了严格模式,则仅null被视为空。

<?php

use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Imatic\Bundle\FormBundle\Form\DataTransformer\EmptyEntityToNullTransformer;

/**
 * Address type
 */
class AddressType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('street')
            ->add('number')
            ->add('city')
            ->add('postalCode', 'text')
        ;

        $builder->addModelTransformer(new EmptyEntityToNullTransformer(
            array_keys($builder->all())
        ));
    }

    // ...
}