burgov / key-value-form-bundle
用于管理键值对的表单类型
1.6.1
2020-03-09 13:24 UTC
Requires
- php: >=5.3.3
- symfony/form: ^2.3|^3.0|^4.0|^5.0
Conflicts
- symfony/form: 2.8.1
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_options
在value_type
中定义的子元素的可选选项key_type
定义用于渲染键字段的表单类型(默认为text
字段)key_options
在key_type
中定义的子元素的可选选项allowed_keys
如果提供了此选项,则键字段(通常是一个简单的文本字段)将更改为choice
字段,并只允许您在此选项中提供的那些值。use_container_object
请参阅下文“键值集合”部分的说明
除此之外,该类型覆盖了集合类型的某些默认值,建议您不要更改它们:将type
设置为BurgovKeyValueRow::class
,并将allow_add
和allow_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))); } }