2013-11-23 1 views
4

Я создал новый тип поля формы, называемый «gamesetting». Этот тип должен обрабатывать текстовые входы и флажки, основываясь на значении массива данных. Форма построена правильно, но когда я отправляю форму, я всегда получаю сообщение об ошибке «Это значение недопустимо», если значение ввода не пусто. Если флажок снят или текстовое поле пуст, форма действительна.Symfony 2 own Тип поля - всегда «Это значение недействительно» error

Форма использует только массив значений ключа в качестве ввода данных, а не объект Model/Entity.

<?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() 
    ]; 
} 

ответ

0

При создании Symfony элементов формы они имеют различные свойства со значениями по умолчанию. Один из них «требуется», который по умолчанию соответствует true.

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

Если браузер поддерживает HTML5 форма проверки, он будет отображать сообщение об ошибке, если вы пытаетесь отправить пустое значение для любого элемента формы Symfony с = требуется верно. По этой причине I всегда set required = false при построении полей формы. Это позволит вам контролировать вашу проверку формы.

 Смежные вопросы

  • Нет связанных вопросов^_^