通过控制器将值传递给Zend_Form?

时间:2011-01-20 12:56:06

标签: php zend-framework parameters zend-form

我有一个带有选择框的联系表单,其中选择框上的值取决于user_id。所以这些值是从DB中选择的,我需要在表单中使用user_id。

我尝试的是给我的表单public user_id;数据库,这样当我创建表单时,我可以这样做:

 $form = new My_Form();
 $form->user_id = $theUserId;

也许我错过了一些东西,但我无法让它发挥作用。 $ theUserId在我的控制器中有一个值,但不在我的表单中(每当我在表单中$this->user_id时,我得到:Invalid parameter number: no parameters were bound

我应该如何做到这一点?

3 个答案:

答案 0 :(得分:1)

我认为Zend_Form是个问题。它有set和get(__set)的神奇方法。尝试在Form Class中编写一个简单的setter / getter。

<?php

protected $userId = null;

public function setUserId($id) {
   $this->_userId = $id;
}

public function getUserid() {
   return $this->userId;
}

并在您的控制器中:

<?php

$form = new My_Form();
$form->setUserid($id);

答案 1 :(得分:0)

您是否将表单分配给视图?如果是,那么它应该是$this->form->user_id

答案 2 :(得分:0)

您需要将sql查询移出构造函数调用的表单init()方法(并且在您有机会设置用户ID之前)。如果只在渲染时(而不是在验证时)需要sql查询的结果,那么你可以覆盖表单render()方法,在那里执行你的sql查询然后调用parent :: render()


/* My Form */

public function render($view = null)
{
    /* SQL here */

    return parent::render($view);
}

编辑:

好的,这就是我要做的事情:


class My_Form extends Zend_Form
{
    private $_userId = null;

    /* Getter and Setter for user id here */

    public function init()
    {
        ...
        $this->createElement('Select', 'nameOfTheSelectElem',
            array(
                /* Don't add the multiOptions here */
            )
        );
    }

    private function _addMultiOptionsForMySelectElem()
    {
        /* SQL Query here */
        $this->nameOfTheSelectElem->setMultiOptions($resultsOfTheSQLQuery);
    }

    public function render($view = null)
    {
        $this->_addMultiOptionsForMySelectElem();

        return parent::render($view);
    }

    public function isValid($data)
    {
        $this->_addMultiOptionsForMySelectElem();

        return parent::isValid($data);
    }
}

因此,在init方法中,您可以创建元素,但此时不要将选项添加到元素中。创建一个私有方法来执行sql查询并将选项添加到select元素,然后从render方法和isValid方法调用private方法。 希望现在更清楚了。是吗?