Передать значение 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
,