Zend两个提交按钮同名

时间:2011-06-02 08:54:39

标签: php zend-framework forms

我构建了一个扩展zend_form的表单类。我有两个提交按钮:

$like=new Zend_Form_Element_Image('vote');
$like->setImage($config->path->images."up.png")
->setValue(2);

$dislike=new Zend_Form_Element_Image('vote');
$dislike->setImage($config->path->images."down.png")
->setValue(1);

我想要两个具有相同名称和不同值的提交按钮,以便稍后我可以通过控制器中的switch语句访问提交的按钮的值:

$submit = $this->_request->getPost('vote');

 switch($submit) {
 case 'one':
 // button one was pressed
 break;
 case 'two':
}

}

但是如果我设置了那些具有相同名称的那个,那么最后一个覆盖第一个,所以只输出一个按钮。

对于文件元素,有一个方法setMultifile()来完成这个技巧。

我该怎么办?

感谢

卢卡

4 个答案:

答案 0 :(得分:2)

您可以尝试使用array notation作为图片。

答案 1 :(得分:0)

为什么不这样做:

if( $this->_request->isPost() && $yourForm->isValid( $this->_request->getPost() ) ) {
    if($yourForm->one->isChecked())
       // button one was pressed
    elseif($yourForm->two->isChecked())
       // button two was pressed
}

答案 2 :(得分:0)

正如您所述,第二个具有相同名称的按钮将覆盖第一个按钮。我能想到的唯一解决方案是为表单使用viewScript并手动添加按钮HTML。

我希望这会有所帮助。

此致

加里

答案 3 :(得分:0)

这是可能的。你要做的是你需要每个提交按钮属于主窗体中的不同子窗体或字段集。

以这种方式,提交按钮将被命名空间,您将能够将它们添加到表单中。

每个提交按钮将具有相同的名称。但是,每个提交按钮的完全限定名称仍然不同。

E.g。

$likeSubform = new Zend_SubForm();
$dislikeSubform = new Zend_SubForm();

$like=new Zend_Form_Element_Image('vote');
$like->setImage($config->path->images."up.png")
     ->setValue(2);

$dislike=new Zend_Form_Element_Image('vote');
$dislike->setImage($config->path->images."down.png")
        ->setValue(1);

$likeSubform->addElement($like);
$dislikeSubform->addElement($dislike);

$form->addSubForm($likeSubform, 'like');
$form->addSubForm($dislikeSubform, 'dislike');

//===================================================

echo $form->getSubForm('like')->vote->getName();

//vote

echo $form->getSubForm('like')->vote->getFullyQualifiedName();

//like[vote]

不幸的是,稍后当您渲染表单时,ZF附带的ViewHelper装饰器将使用完全限定名称呈现提交按钮。 (假设你使用那个装饰器,大多数人都这样做)

但是,您可以创建自己的ViewHelper装饰器来覆盖默认值,从而使用非限定名称呈现表单元素:

class My_Form_Decorator_ViewHelper extends Zend_Form_Decorator_ViewHelper
{

    //override default render method
    public function render($content)
    {
        ...

        $name = $element->getName();
        $id   = $element->getName();

        ...
    }
}