передать значение Zend_Form через контроллер? - PullRequest
1 голос
/ 20 января 2011

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

Я пытался присвоить моей форме public user_id; датаблок, так что когда я создаю форму, я могу сделать это:

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

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

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

Ответы [ 3 ]

1 голос
/ 20 января 2011

Я думаю, что 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);
0 голосов
/ 20 января 2011

Вам нужно убрать 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. Надеюсь, теперь все понятно. Это так?

0 голосов
/ 20 января 2011

Вы назначаете форму для представления? Если так, то это должно быть $this->form->user_id.

...