Вам нужно убрать sql-запрос из метода init () форм, который вызывается конструктором (и прежде чем вы получите возможность установить идентификатор пользователя). если результаты SQL-запроса нужны только во время рендеринга (а не во время проверки), тогда вы можете переопределить метод render (), выполнить там свой SQL-запрос и затем вызвать parent :: render ()
/* My Form */
public function render($view = null)
{
/* SQL here */
return parent::render($view);
}
EDIT:
Хорошо, вот что я бы сделал:
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.
Надеюсь, теперь все понятно. Это так?