我有一个带有选择框的联系表单,其中选择框上的值取决于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
)
我应该如何做到这一点?
答案 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方法。 希望现在更清楚了。是吗?