Передать значение Zend_Form через контроллер?

У меня есть эта контактная форма с selectbox, где значения в поле выбора зависят от user_id. Таким образом, эти значения выбираются из БД, и мне нужен user_id в моей форме.

То, что я пытался дать мне форму public user_id; datamember, так что когда я создаю форму, я могу сделать это:

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

Может быть, я что-то упустил, но я просто не могу заставить это работать. $theUserId имеет значение в моем контроллере, но не в моей форме (всякий раз, когда я делаю $this->user_id в моей форме я получаю: Invalid parameter number: no parameters were bound)

Есть идеи, как мне это сделать?

3 ответа

Решение

Вам нужно переместить запрос sql из метода init() форм, который вызывается конструктором (и до того, как вы получите возможность установить идентификатор пользователя). если результаты 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, а затем вызовите закрытый метод из метода рендеринга и метода isValid. Надеюсь, теперь все понятно. Это?

Я думаю, что Zend_Form это проблема. У него есть магические методы для установки и получения (__set). Попробуйте написать простой установщик / получатель внутри вашего класса формы.

<?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,

Другие вопросы по тегам