我创建了一个名为"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。这使您能够控制表单验证。