fjogeleit/dynamic-form-bundle

此包已被废弃,不再维护。未建议替代包。

DynamicForm创建数据库驱动的表单并持久化结果

安装: 991

依赖: 0

建议者: 0

安全: 0

星标: 6

关注者: 2

分支: 1

开放问题: 0

类型:symfony-bundle

0.9.1 2016-11-15 00:00 UTC

README

Latest Stable Version Build Status License

一个用于创建数据库驱动的动态表单并将其保存的Symfony包。

  • 使用如SonataAdmin Bundle之类的后端创建表单
  • 使用动态文本元素(如标题或文本)提高表单易用性
  • 支持不同的表单字段,如输入、文本区域、复选框组、单选按钮组、文件输入
  • 灵活可扩展,可通过自定义FormTypes和FormType配置进行扩展
  • 可以集成子表单并将值保存为自定义ORM实体

需求

  • PHP >= 5.6
  • Composer

通过Composer安装

composer require fjogeleit/dynamic-form-bundle

配置

dynamic_form:
    file_upload_dir: 'uploads'  # upload directory for FileValues with web/ as root-dir
    form_field:                 # disable field options to configure
        disable_options:
          - 'disabled'
          - 'label'
          - 'placeholder'
          - 'required'

后端路由

在您的项目路由中激活dynamic-form-bundle路由。

dynamic_form:
  resource: "@DynamicFormBundle/Controller/"
  type:     annotation
  prefix:   "dynamic-form"

安装SonataAdminBundle

请参阅Sonata Project

不同的ValueType支持

示例

  • 字符串
  • 日期时间
  • 实体
  • 简单的数组
  • 选项
  • 浮点数
  • ...

集成自定义子表单

创建Symfony FormType

class ContactType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', TextType::class);
        $builder->add('email', TextType::class);
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults([
            'data_class' => Contact::class,
            'label' => false
        ]);
    }
}

为新的子表单创建ConfigurationObject

此对象必须实现DynamicFormType "ConfigurationInterface"。

use AppBundle\FormType\ContactType;
use DynamicFormBundle\Entity\DynamicResult\ResultValue\EntityValue;
use DynamicFormBundle\Services\FormType\ConfigurationInterface;
use DynamicFormBundle\Statics\FormFieldOptions\BaseOptions;

class ContactConfiguration implements ConfigurationInterface
{
    /**
     * @return string
     */
    public function getName()
    {
        return 'contact';
    }

    /**
     * @return string
     */
    public function getFormTypeClass()
    {
        return ContactType::class;
    }

    /**
     * @return string
     */
    public function getValueClass()
    {
        return EntityValue::class;
    }

    /**
     * @return array
     */
    public function getAvailableOptions()
    {
        return BaseOptions::all();
    }
}

它定义了

  • 字段的后端命名
  • 应在前端渲染的新FormType
  • 将保存哪种类型的值
    • 我们的ContactType将其值保存为Contact-Entity(data_class),因此其值类型是EntityValue
  • 可以为此字段配置的选项数组,如必填。

至少配置ContactConfiguration为服务,使用TagName: "form.type_configuration"

services:
  app.dynamic_form_type.contact.configuration:
    class: 'AppBundle\Services\DynamicFormType\Configuration\ContactConfiguration'
    tags:
      - { name: 'form.type_configuration' }

现在新的Contact子表单作为新的FormField在后台可用。

EntityValue

为了将自定义实体作为DynamicForm子表单的"data_class",必须扩展DynamicForm:AbstractEntity类。

use Doctrine\ORM\Mapping as ORM;
use DynamicFormBundle\Entity\AbstractEntity;

/**
 * @ORM\Entity
 * @ORM\Table(name="contact")
 *
 * @package DynamicFormBundle\Tests\Functional\Fixtures\Entity
 */
class Contact extends AbstractEntity
{
    /**
     * @var string
     *
     * @ORM\Column(type="string")
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(type="string")
     */
    private $email;

    /**
     * @param string  $name
     * @param string  $email
     */
    public function __construct($name = null, $email = null)
    {
        $this->name = $name;
        $this->email = $email;
    }

    /**
     * @return string
     */
    public function getName()
    {
        return $this->name;
    }

    /**
     * @param string $name
     *
     * @return $this
     */
    public function setName($name)
    {
        $this->name = $name;

        return $this;
    }

    /**
     * @return string
     */
    public function getEmail()
    {
        return $this->email;
    }

    /**
     * @param string $email
     *
     * @return $this
     */
    public function setEmail($email)
    {
        $this->email = $email;

        return $this;
    }
}