Я создал новый тип поля формы, называемый «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()
];
}