Более раннее решение, которое я использовал, было передать массив, определяющий конфигурацию формы, в метод конструктора типа формы и построить эти поля формы во время метода buildForm.
Я не знаю, как вынастройте своих пользователей таким образом, чтобы было несколько пробелов, которые вам необходимо заполнить.
Для начала я думаю, что это произойдет в контроллере, но лучше было бы перенести столько же логики в обработчик форм, какПакет пользователя FOS делает: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Form/Handler/RegistrationFormHandler.php
Вам нужно будет получить все поля вашего профиля пользователя и подготовить их в массив, готовый для добавления в конструктор типа формы (см. пример для ProfileType).
$form_config = array(
'fields' => array()
);
// get all user_profile_field entities add them to $form_config['fields']
// foreach $user_profile_fields as $user_profile_field...
// $form_config['fields'][] = $user_profile_field;
Затем вам нужно создать представление массива вашего пользователя на основе собранных вами user_profile_data.Эти данные затем будут связаны с формой позже.
Я не уверен, что вы можете передать эту версию массива прямо в форму.Если форма ожидает Entity, вам, возможно, потребуется сначала передать базовый пользовательский объект в форму, а затем связать версию массива (содержащую динамические данные), чтобы установить значения динамического поля.
Вот класс формы Profile.что вы будете использовать:
class ProfileType extends AbstractType
{
// stores the forms configuration
// preferably map defaults here or in a getDefaultConfig method
private $formConfig = array();
// new constructor method to accept a form configuration
public function __construct($form_config = array())
{
// merge the incoming config with the defaults
// set the merged array to $this->formConfig
$this->formConfig = $form_config;
}
public function buildForm(FormBuilder $builder, array $options)
{
// add any compulsory member fields here
// $builder->add( ... );
// iterate over the form fields that were passed to the constructor
// assuming that fields are an array of user_profile_field entities
foreach ($this->formConfig['fields'] as $field) {
// as form is not a straight entity form we need to set this
// otherwise validation might have problems
$options = array('property_path' => false);
// if its a choice fields add some extra settings to the $options
$builder->add($field->getField(), $field->getCategory(), $options);
}
}
Это охватывает выходные данные формы.
В контроллере создайте форму.
$profileForm = $this->createForm(new ProfileType($form_config), $user);
В итоге метод контроллерадолжно быть структурировано примерно так (заполняя пробелы):
// get the user
// get user data
// create array version of user with its data as a copy
// get profile fields
// add them to the form config
// create form and pass form config to constructor and the user entity to createForm
// bind the array version of user data to form to fill in dynamic field's values
// check if form is valid
// do what is needed to set the posted form data to the user's data
// update user and redirect
Я чувствую, что Form Form, вероятно, является лучшим подходом Symfony2, но, надеюсь, это поможет вам начать.Затем вы можете рассмотреть события формы на этапе рефакторинга.