Я бы использовал другой метод для реализации многочастных форм в Symfony.Надеемся, что для запуска вам достаточно следующей оболочки.
Шаг 1: добавьте виджет сцены в вашу форму
public function configure()
{
$this->setWidget('stage', new sfWidgetFormInputHidden(array('default' => 1));
$this->setValidator('stage', new sfValidatorFormInteger(array('min' => 1, 'max' => $maxStages, 'required' => true));
}
Шаг 2: Добавитьнекоторая информация о этапах в вашей форме
protected $stages = array(
1 => array('stage1field1', 'stage1field2',
2 => array('stage2field1', ... //etc for as many stages you have
);
Шаг 3: Добавьте метод настройки как этап в вашу форму
public function configureAsStage($currentStage)
{
foreach($this->stages as $stage => $field)
{
if ($currentStage > $stage)
{
$this->setWidget($stage, new sfWidgetFormInputHidden()); //so these values carry through
}
if ($stage > $currentStage)
{
unset($this[$stage]); //we don't want this stage here yet
}
}
}
Шаг 4: Переопределить doBind
Возможно, вам придется переопределить bind()
напрямую, я забыл.
public function doBind(array $taintedValues)
{
$cleanStage = $this->getValidator('stage')->clean($taintedValues['stage']);
$this->configureAsStage($cleanStage);
parent::doBind($taintedValues);
}
Шаг 5: Добавьте некоторые вспомогательные методы в форму
public function advanceStage()
{
if ($this->isValid())
{
$this->values['stage'] += 1;
$this->taintedValues['stage'] += 1;
$this->resetFormFields();
}
}
public function isLastStage()
{
return $this->getValue('stage') == count($this->stages);
}
Шаг 6. Вызовите configureAsStage / advanceStage по мере необходимости в вашем действии
public function executeNew(sfWebRequest $request)
{
$form = new MultiStageForm($record);
$form->configureAsStep(1);
}
public function executeCreate(sfWebRequest $request)
{
$record = new Record();
$form = new MultiStageForm($record);
$form->bind($request[$form->getName()]);
if ($form->isValid())
{
if ($form->isLastStage())
{
$form->save();
//redirect or whatever you do here
}
$form->advanceStage();
}
//render form
}
Я сделал это полностью на лету.Я думаю, что это должно работать, но я не проверял это, поэтому могут быть некоторые ошибки!