Несколько форм в Symfony - PullRequest
       363

Несколько форм в Symfony

2 голосов
/ 30 января 2012

У меня есть форма. Эта форма представляет, например, 3 слова (пиво, кокс, вино). В следующем действии я хочу иметь три варианта виджетов с одним или несколькими вариантами:

-beer:                //first choice field
  * buddy lighty      //choice one
  * busch             //choice two
  * miler             //choice three

-coke:                //second choice field
  * coke diet
  * coke
  * coke vanilla

-wine:                //third choice field
  * bordeaux
  * suave
  * champange

<submit-button>

Я хочу каждый выбор в одном действии. Так что если кто-то сделает выбор буш, кокс, учтивый будет подан. Как я могу это понять?

Обновление:

Спасибо за комментарий. Я могу забыть сказать, что я не знаю, сколько выпадающих меню мне нужно. Там может быть только пиво и кокс или пиво, кокс, вино и сок. Это зависит от того, что пользователь заполнил количество форм действия до! Я попытался сделать это с помощью цикла foreach в forms.class.php. Но это не помогает.

Я использую Doctrine.

1 Ответ

0 голосов
/ 17 февраля 2012

Один простой способ сделать это (также зависит от вашей модели) - настроить каждый элемент как обнуляемый, а затем использовать параметры формы для отображения / скрытия определенных виджетов. например, если ваша схема выглядит как этот ленивый пример:

DrinkOrder:
  columns:

    # ...

    beer:
      type: enum
      values: [Old Peculier,Tribute,Deuchars]
      notnull: false

     wine:
         type: enum
         values: [Bordeaux,Suave,Champagne]
         notnull: false

    # ...etc

Настройте свою форму следующим образом:

class DrinkOrderForm extends BaseDrinkOrderForm
{
    public function configure()
    {
        if ($this->getOption('hide_wine'))
        {
            $this->widgetSchema['wine'] = new sfWidgetFormInputHidden;
        }

        // … etc
    }
}

И затем, когда действие предыдущей формы отправляется, вы можете передать в форму параметры, например:

$this->form = new DrinkOrderForm($drink_order, array(
    'hide_wine' => true,
    'hide_beer' => false,
));

Это только краткий пример - вместо типа ENUM вы можете использовать отношения с другой таблицей (например, wine_id и виджетом и валидатором sfWidgetFormDoctrineChoice).

Одна вещь, которую вы не можете сделать, это иметь 3-4 отдельные формы, потому что веб-браузеры будут отправлять только одну из них. Вы должны либо встраивать формы друг в друга, либо использовать более простой метод, описанный выше, в зависимости от того, как настроена ваша модель.

Если число выбранных типов не является фиксированным, вы можете захотеть использовать что-то вроде метода embedRelation системы форм (или ahDoctrineEasyEmbeddedRelationsPlugin) для динамического добавления подформ. По вашему примеру трудно понять, как далеко вы хотите зайти. :)

...