[英]Set default value of an element in Zend_Form by reference from the controller
[英]passing value to Zend_Form through controller?
我有一個帶有選擇框的聯系表單,其中選擇框上的值取決於user_id。 因此,這些值是從數據庫中選擇的,我需要在表單中使用user_id。
我嘗試給表單提供一個public user_id;
數據成員,以便在創建表單時可以執行以下操作:
$form = new My_Form();
$form->user_id = $theUserId;
也許我缺少了一些東西,但是我無法使它正常工作。 $ theUserId確實在我的Controller中有一個值,但沒有在我的表單中(每當我在我的表單中執行$this->user_id
,我都會得到: Invalid parameter number: no parameters were bound
)
有什么想法我應該怎么做?
我認為Zend_Form是問題。 它具有設置和獲取(__set)的魔術方法。 嘗試在Form類中編寫一個簡單的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);
您是否正在將表單分配給視圖? 如果是這樣,則應為$this->form->user_id
。
您需要將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方法調用私有方法。 希望現在更清楚。 是嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.