Php 通过控制器将值传递给Zend_表单?

Php 通过控制器将值传递给Zend_表单?,php,zend-framework,parameters,zend-form,Php,Zend Framework,Parameters,Zend Form,我有一个带有选择框的联系人表单,其中选择框上的值取决于用户id。因此,这些值是从DB中选择的,我需要表单中的用户id 我尝试的是给我的表单一个公共用户iddatamember,以便在创建表单时可以执行以下操作: $form = new My_Form(); $form->user_id = $theUserId; 也许我错过了什么,但我就是不能让它发挥作用$userid在我的控制器中确实有一个值,但在我的表单中没有(每当我在表单中执行$this->user\u id时,我会得到:无效

我有一个带有选择框的联系人表单,其中选择框上的值取决于用户id。因此,这些值是从DB中选择的,我需要表单中的用户id

我尝试的是给我的表单一个
公共用户id
datamember,以便在创建表单时可以执行以下操作:

 $form = new My_Form();
 $form->user_id = $theUserId;
也许我错过了什么,但我就是不能让它发挥作用$userid在我的控制器中确实有一个值,但在我的表单中没有(每当我在表单中执行
$this->user\u id
时,我会得到:
无效的参数号:没有绑定任何参数


你知道我该怎么做吗?

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

您是否将表单分配给视图?如果是这样,那么应该是
$this->form->user\u id

我认为Zend\u form是问题所在。它具有set和get(_set)的神奇方法。尝试在表单类中编写一个简单的setter/getter

<?php

protected $userId = null;

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

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

我认为Zend_形式是问题所在。它具有set和get(_set)的神奇方法。尝试在表单类中编写一个简单的setter/getter

<?php

protected $userId = null;

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

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

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

编辑:

好的,下面是我要做的:


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方法调用私有方法。
希望现在更清楚了。是吗?

您需要将sql查询从构造函数调用的forms init()方法中移出(在您有机会设置用户id之前)。如果sql查询的结果只在呈现时(而不是在验证时)才需要,那么您可以覆盖forms render()方法,在那里执行sql查询,然后调用parent::render()

编辑:

好的,下面是我要做的:


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方法调用私有方法。
希望现在更清楚了。是吗?

我正在将表单发送到操作方法末尾的视图。此代码:
$form=new My_form()$表单->用户标识=$theUserId
位于我的控制器中(它有我的用户id),我正在将表单发送到操作方法末尾的视图中。此代码:
$form=new My_form()$表单->用户标识=$theUserId
位于我的控制器(具有我的用户id)中。这也不起作用,我得到的错误是:。如果我这样做了,它确实可以工作:private$user_id=3;(或其他什么)所以这是价值的传递似乎不起作用…我明白了,谢谢你的解释。还有一个问题:我应该把表格放在哪里?因为现在它在init()函数中,但是有一个select元素使用来自sql的数据,所以在构造函数中创建表单时,我不能将sql放在render()中。有什么想法吗?我已经再次更新了我的答案,希望这会让你走上正轨。是的,这非常清楚,再次感谢,但我还有最后一个问题:当重写render()方法时,\uu-toString方法给了我一个错误:
可捕获的致命错误:方法形式\u-PostForm:\uu-toString()必须在第2行的C:\xamplite\htdocs\codestack\application\views\scripts\posts\add.phtml中返回一个字符串值
(这仅在声明render()后出现……我还尝试了
公共函数render(Zend\u View\u Interface$View=null)
是的,很抱歉,render方法需要返回父::render()-我已相应地更新了答案这也不起作用,我得到的错误是:。如果我这样做,它确实起作用:private$user_id=3;(或其他)因此,传递值似乎不起作用……我明白了,谢谢你的解释。不过,还有一个问题:我应该把表单放在哪里?因为现在表单在init()函数中,但是有一个select元素使用sql中的数据,所以我不能把sql放在render()中当表单在构造函数中创建时。有什么想法吗?我已经再次更新了我的答案,希望这能让您走上正轨。是的,这非常清楚,再次感谢,但我还有最后一个问题:当重写render()方法时,u-toString方法给了我一个错误:
可捕获的致命错误:方法form\u-PostForm:u-toString()必须在第2行的C:\xamplite\htdocs\codestack\application\views\scripts\posts\add.phtml中返回一个字符串值
(这仅在声明render()后出现……我还尝试了
公共函数render(Zend\u View\u Interface$View=null)
是的,很抱歉,render方法需要返回父::render()-我已经相应地更新了答案