したがって、私の問題の複雑さは、マルチページフォームのどのページを知っているかということになります。配列と上記のaddElements()を使用すると役に立ちました。
簡単な答え
私の問題に対する答えは、フォームがいわば「構築」された後、レンダリングされる前に、addElements()を使用してフォームに追加できるように操作できる配列でした。
長い答え
全体像を把握するために、次または前のボタンを押すたびに、サブフォームの配列をトラバースしていると想像してください。この場合、ボタンのレンダリングを処理する関数が必要になります。結局、caseステートメントを使用しましたが、これは世界で最高の実装ではありません(親クラスForm_MultiPageで再利用できません)が、機能しました。
私が持っているマルチページフォームクラスの私の拡張で
public function setSubmitControls()
{
$previous = new Zend_Form_Element_Submit('previous',array(
'label'=>'previous',
'required'=>false,
'ignore'=>false,
'order'=>9000
));
$cancel = new Zend_Form_Element_Submit('cancel',array(
'label'=>'Cancel',
'required'=>false,
'ignore'=>false,
'order'=>9003
));
$next = new Zend_Form_Element_Submit('next',array(
'label'=>'Next',
'required'=>false,
'ignore'=>false,
'order'=>9002
));
$finished = new Zend_Form_Element_submit('finish',array(
'label'=>'Finish',
'required'=>false,
'ignore'=>false,
'order'=>9004
));
$submitControls = array();
echo var_dump($this->getCurrentSubForm()->getName());
switch($this->getCurrentSubForm()->getName())
{
case 'billInfo':
$submitControls = array(
$next,
$cancel
);
break;
case 'payerInfo':
$submitControls = array(
$previous,
$next,
$cancel
);
break;
//So on for other subforms
}
$this->setSubmitButtonGroup($submitControls);
}
親クラスのForm_Multipageには、
public function setSubmitButtonGroup(array $elements)
{
$this->_submitButton = $elements;
}
と
public function addSubmitButtonGroupToSubForm(Zend_Form_SubForm $subForm)
{
$subForm->addElements($this->_submitButton);
return $subForm;
}
この関数でフォームの「ページ」をレンダリングすると呼び出されます
public function prepareSubForm($spec)
{
if (is_string($spec)) {
$subForm = $this->{$spec};
} elseif ($spec instanceof Zend_Form_SubForm) {
$subForm = $spec;
} else {
throw new Exception('Invalid argument passed to ' .
__FUNCTION__ . '()');
}
$subform = $this->setSubFormDecorators($subForm);
$subform = $this->addSubmitButtonGroupToSubForm($subForm);
$subform = $this->addSubFormActions($subForm);
$subform->setMethod($this->getMethod());
return $subForm;
}