因此,我的问题的复杂性在于知道多页表单的哪一页。使用数组和上面提到的 addElements() 有所帮助。
简单的答案
我的问题的答案是一个数组,可以说是在“构建”表单之后但在渲染之前可以操作的数组,以便我可以使用 addElements() 添加到表单中。
长答案
为了获得全貌,想象每次您点击下一个或上一个按钮时,您都在遍历一组子表单。在这种情况下,需要一个函数来处理按钮渲染。我最终使用了一个案例陈述,虽然它不是世界上最好的实现(在父类 Form_MultiPage 中不可重用),但它确实有效:
在我的 mulipage 表单类的扩展中,我有
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;
}