Symfony2 динамическая генерация форм - PullRequest
3 голосов
/ 16 марта 2012

У меня есть таблицы MySQL 2: user_profile_field и user_profile_data со следующими столбцами:

user_profile_field:

-id (integer)
-field (string)
-category(string) 

user_profile_data:

-id (integer)
-user_id (integer)
-field_id (integer) references user_profile_field(id)
-data (string)

Я также определил 2 сущности Доктрины, которые отображают это отношение. Мне нужно динамически создать форму для обновления user_profile_data. Тип ввода формы для каждой строки user_profile_field зависит от user_profile_field: столбец категории (3 возможных значения соответствуют различным типам ввода: текст, текстовое поле и поле выбора) ...

Я не уверен, как создать форму и сущность типа формы способом 'Symfony2'?

Любая помощь или предложение приветствуется ...

Ответы [ 2 ]

7 голосов
/ 17 марта 2012

Более раннее решение, которое я использовал, было передать массив, определяющий конфигурацию формы, в метод конструктора типа формы и построить эти поля формы во время метода 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, но, надеюсь, это поможет вам начать.Затем вы можете рассмотреть события формы на этапе рефакторинга.

3 голосов
/ 17 марта 2012

В пользовательской документации Symfony 2 предлагается использовать события формы для создания динамической формы: http://symfony.com/doc/current/cookbook/form/dynamic_form_generation.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...