簡體   English   中英

通過控制器將值傳遞給Zend_Form嗎?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM