2015-04-08 1 views
2

У меня есть проект с использованием некоторых компонентов Symfony. А именно Twig, Doctrine и Form.Компонент формы Symfony Formal Single Form Type Extension

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

Любая помощь будет замечательной, спасибо!

ответ

2

Хорошо, если я правильно понял ваш вопрос, что вы в основном хотите сделать, это добавить новый вариант для вашего построителя форм для заданного типа.

index.php - В принципе здесь мы просто создадим экземпляр FormBuilder и добавим одно поле для целей тестирования.

<?php 

use Symfony\Component\Form\Forms; 
use Symfony\Component\Form\Extension\HttpFoundation\HttpFoundationExtension; 


$formFactory = Forms::createFormFactoryBuilder() 
    ->getFormFactory() 
    ->createBuilder() 
    ->add('test', 'text', array('customAttribute' => true)) 
    ->getForm() 
    ->createView(); 

Если мы открываем браузер прямо сейчас, мы получим хорошую и большую ошибку, говорят нам, что «CustomAttribute» неизвестно вариант.

Итак, давайте создадим пользовательский тип формы! Как вы видели, я назвал его TextCustomType, так как я продлеваю тип формы «текст».

Тип класса:

<?php 

use Symfony\Component\Form\AbstractTypeExtension; 
use Symfony\Component\OptionsResolver\OptionsResolverInterface; 
use Symfony\Component\Form\FormView; 
use Symfony\Component\Form\FormInterface; 

class TextCustomType extends AbstractTypeExtension { 

public function getName() { 
    return "text"; 
} 

public function getExtendedType() { 
    return "text"; 
} 

public function setDefaultOptions(OptionsResolverInterface $resolver) { 
    $resolver->setOptional(array('customAttribute')); 

    $resolver->setDefaults(array('customAttribute' => true)); 
} 

public function buildView(FormView $view, FormInterface $form, array $options) { 
    $view->vars['customAttribute'] = $options['customAttribute']; 
} 

} 

Теперь мы создали наш собственный тип, так что позволяет добавить его в виде завода:

$formFactory = Forms::createFormFactoryBuilder() 
    ->addTypeExtension(new TextCustomType()) // once the class is loaded simply pass fresh instance to ->addTypeExtension() method. 
    ->getFormFactory() 
    ->createBuilder() 
    ->add('test', 'text', array('customAttribute' => true)) 
    ->getForm() 
    ->createView(); 

Обновите браузер, и вы должны быть хорошо идти ! Надеюсь, у вас есть идея.

Обновлено согласно предложению ОП.

+0

Это гораздо более полный, чем мой ответ. Может быть яснее, если вы удалите заметку о требованиях, и просто удалите их самостоятельно. Кроме того, как-то вызывать конкретную строку кода, которая выполняет решение, тоже будет здорово. Потребовал мне секунду, чтобы понять, где в вашем посте расширение будет добавлено в FormFactory. –

1

Ответ довольно прост! Это просто вопрос поиска в нужном месте. FormFactoryBuilder ключ:

use Symfony\Form\Component\Form\Forms; 

$form = Forms::createFormFactoryBuilder() 
    ->addTypeExtension(new MyExtension()) 
    ->getFormFactory() 
    ->create(); 

Это $form переменная теперь знает о моем новом свойстве «суффикс».