Один простой способ сделать это (также зависит от вашей модели) - настроить каждый элемент как обнуляемый, а затем использовать параметры формы для отображения / скрытия определенных виджетов. например, если ваша схема выглядит как этот ленивый пример:
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) для динамического добавления подформ. По вашему примеру трудно понять, как далеко вы хотите зайти. :)