Symfony 2自己的字段类型-总是“;该值无效“;错误


Symfony 2 own Field Type - always "This value is not valid" error

我创建了一个名为"gamesetting"的新表单字段类型。此类型应根据数据数组的值处理文本输入和复选框。表单构建正确,但当我提交表单时,如果输入的值不为空,我总是会收到错误"This value is not valid"。如果复选框未选中或文本字段为空,则表单有效。

表单仅使用键值数组作为数据输入,而不使用模型/实体对象。

<?php
namespace asdf'WebinterfaceBundle'Form'Type;
use Symfony'Component'Form'AbstractType;
use Symfony'Component'Form'FormView;
use Symfony'Component'Form'FormInterface;
use Symfony'Component'OptionsResolver'OptionsResolverInterface;

class GamesettingType extends AbstractType {
    function setDefaultOptions(OptionsResolverInterface $resolver) {
        $resolver->setRequired([ 'field_type' ]);
        $resolver->setDefaults([
            'label' => false,
            'field_type' => 'text',
            'required' => false
        ]);
    }
    function getName() {
        return 'gamesetting';
    }
    function getParent() {
        return 'form';
    }
    function buildView(FormView $view, FormInterface $form, array $options) {
        $view->vars['field_type'] = $options['field_type'];
    }
}

动作方法看起来像:

public function settingsAction(Request $request) {
    $user = $this->get('security.context')->getToken()->getUser();
    $game = GameFactory::factory(PortlistFactory::byUserAndActive($user->getUsername()));
    // Generate the settings form. Each setting has a internal identifier,
    // a type (which form element) and a label. The label is equal to the
    // identifier and will be translated with the corresponding i18n key.
    $form = $this->createFormBuilder();
    foreach ($game->getSettings()->read('config') as $key => $value) {
        $sanitized_key = str_replace('.', '_', $key);
        $sanitized_value = in_array($value, ['true', 'false']) ? !!($value == 'true') : $value;
        $type = (in_array($value, ['true', 'false'])) ? 'checkbox' : 'text';
        if ($type == "text") {
            $form->add($sanitized_key, 'gamesetting', [
                'field_type' => 'text',
                'data' => $sanitized_value,
            ]);
        } elseif ($type == "checkbox") {
            $form->add($sanitized_key, 'gamesetting', [
                'field_type' => 'checkbox',
                'data' => $sanitized_value,
            ]);
        }
    }
    $form = $form->getForm();
    $form->handleRequest($request);
    if ($form->isValid()) {
        var_dump($form->getData());
        exit;
    }
    return [
        'game' => $game,
        'form' => $form->createView()
    ];
}

创建Symfony表单元素时,它们具有各种默认值的属性。其中一个是"必需",默认为true。

http://symfony.com/doc/2.7/reference/forms/types/text.html#required

如果您使用的浏览器支持HTML5表单验证,那么如果您尝试提交required=true的任何Symfony表单元素的空值,它将显示一个错误。因此,在构造表单字段时,I总是设置required=false。这使您能够控制表单验证。