Zend_Form - 同一页面上的多个表单

时间:2009-07-23 10:20:27

标签: zend-framework zend-form

在一个页面中有多个表单,当我提交其中一个表格时,如何判断一个表单是否已提交?

我考虑为每个人生成uniqe id,并将它们保存为隐藏字段和用户会话 - 虽然这是一个解决方案,但它的问题在于没有从会话中删除旧ID的好地方

有什么更好的想法如何解决这个问题?

提前致谢!

2 个答案:

答案 0 :(得分:3)

首先:你考虑过将两个表格发送到两个不同的行动吗?这样,您可以在每个动作中分别处理每个表单。如果您使用的是Zend MVC组件,这应该是“最佳实践”。

另一个选项是检查将包含在请求中的提交按钮的值,例如

<input type="submit" name="save" value="form1" />
// in PHP:
// $_POST["save"] will contain "form1"

<input type="submit" name="save" value="form2" />
// in PHP:
// $_POST["save"] will contain "form2"

小心,因为value - 属性将呈现为按钮的标签。

所以也许你想通过不同的提交按钮名称来删除表单:

<input type="submit" name="save-form1" value="Submit" />
// in PHP:
// $_POST["save-form1"] will contain "Submit"

<input type="submit" name="save-form2" value="Submit" />
// in PHP:
// $_POST["save-form2"] will contain "Submit"

修改

在OP和我之间的评论对话期间,以下似乎是一个可能的解决方案:

class My_Form_Base extends Zend_Form
{
    private static $_instanceCounter = 0;

    public function __construct($options = null)
    {
        parent:: __construct($options);

        self::$_instanceCounter++;
        $this->addElement('hidden', 'form-id', 
            sprintf('form-%s-instance-%d', $this->_getFormType(), self::$_instanceCounter);
    }

    protected _getFormType()
    {
        return get_class($this);
    }
}

class My_Form_Type1 extends My_Form_Base
{
    public function init()
    {
        // more form initialization
    }
}

class My_Form_Type2 extends My_Form_Base
{
    public function init()
    {
        // more form initialization
    }
}

答案 1 :(得分:0)

代码中的一些错误应该是这样的:

class Application_Form_Idee_Base extends Zend_Form
{
    private static $_instanceCounter = 0;

    public function __construct($options = null)
    {
        parent::__construct($options);

        self::$_instanceCounter++;
        $this->addElement('hidden', 'form-id', array(
            'value' => sprintf('form-%s-instance-%s', $this->_getFormType(), self::$_instanceCounter))
        );
    }

    protected function _getFormType()
    {
        return get_class($this);
    }

}