burgov/key-value-form-bundle

用于管理键值对的表单类型

安装量: 537,846

依赖: 17

建议者: 3

安全: 0

星标: 44

关注者: 5

分支: 32

开放问题: 9

类型:bundle

1.6.1 2020-03-09 13:24 UTC

README

用于管理键值对的表单类型。

安装

$ composer require burgov/key-value-form-bundle:@stable

然后添加该bundle到您的应用中

<?php
// app/AppKernel.php

public function registerBundles()
{
    $bundles = array(
        // ...
        new Burgov\Bundle\KeyValueFormBundle\BurgovKeyValueFormBundle(),
        // ...
    );
}

用法

要添加到您的表单中,请使用KeyValueType类型

use Burgov\Bundle\KeyValueFormBundle\Form\Type\KeyValueType;
use Symfony\Component\Form\Extension\Core\Type\TextType;

$builder->add('parameters', KeyValueType::class, array('value_type' => TextType::class));

// or

$formFactory->create(KeyValueType::class, $data, array('value_type' => TextType::class));

该类型扩展了集合类型,因此用于在浏览器中渲染时使用相同的逻辑。有关如何在客户端渲染的示例,请参阅Symfony关于集合类型的文档

该类型向集合类型选项添加了四个选项,其中一个是必需的

  • value_type(必需)定义用于渲染值字段的表单类型
  • value_optionsvalue_type中定义的子元素的可选选项
  • key_type定义用于渲染键字段的表单类型(默认为text字段)
  • key_optionskey_type中定义的子元素的可选选项
  • allowed_keys如果提供了此选项,则键字段(通常是一个简单的文本字段)将更改为choice字段,并只允许您在此选项中提供的那些值。
  • use_container_object请参阅下文“键值集合”部分的说明

除此之外,该类型覆盖了集合类型的某些默认值,建议您不要更改它们:将type设置为BurgovKeyValueRow::class,并将allow_addallow_delete始终设置为true

与SonataAdminBundle一起工作

为了使用添加/删除按钮渲染您的表单,您需要扩展模板SonataAdminBundle:Form:form_admin_fields.html.twig并添加以下小段代码

{% block burgov_key_value_widget %}
    {{- block('sonata_type_native_collection_widget') -}}
{% endblock %}

键值集合

要使用集合和Symfony2表单层,您可以提供添加器和移除方法。但是,这仅在添加器方法只期望一个参数时才有效。此bundle提供组合键值对。

您的模型类通常将提供类似于以下方法的方法

class Model
{
    public function addOption($key, $value)
    {
        $this->options[$key] = $value;
    }
}

这将导致表单层找不到添加方法。为了解决这个问题,此bundle提供键值集合对象。要使用它,您需要在表单类型上设置use_container_object选项为true。一个灵活的实现可能如下所示

/** @var $builder Symfony\Component\Form\FormBuilderInterface */
$builder->add('options', 'burgov_key_value', array(
    'required' => false,
    'value_type' => TextType::class,
    'use_container_object' => true,
));

您的模型类需要提供一个接受Burgov\Bundle\KeyValueFormBundle\KeyValueContainer参数的setOptions方法。一个灵活的实现可能如下所示

class Model
{
    /**
     * Set the options.
     *
     * @param array|KeyValueContainer|\Traversable $data Something that can be converted to an array.
     */
    public function setOptions($options)
    {
        $this->options = $this->convertToArray($options);
    }

    /**
     * Extract an array out of $data or throw an exception if not possible.
     *
     * @param array|KeyValueContainer|\Traversable $data Something that can be converted to an array.
     *
     * @return array Native array representation of $data
     *
     * @throws InvalidArgumentException If $data can not be converted to an array.
     */
    private function convertToArray($data)
    {
        if (is_array($data)) {
            return $data;
        }

        if ($data instanceof KeyValueContainer) {
            return $data->toArray();
        }

        if ($data instanceof \Traversable) {
            return iterator_to_array($data);
        }

        throw new InvalidArgumentException(sprintf('Expected array, Traversable or KeyValueContainer, got "%s"', is_object($data) ? getclass($data) : get_type($data)));
    }
}