Nefunguje předání parametru signálu

- Ondřej Mirtes
 - Člen | 1536
 
Dělal jsem to už hodněkrát. A dělám to po hodněkrát + 1 a nefunguje
mi to – vytvářím si PollControl na práci s anketama a nefunguje mi
předání signálu s hlasem. Prostě ten parametr $answer Nette
nevidí (je NULL), navíc se chová hodně zvláštně – když po provedení
toho, co signál provést má, volám $this->redirect('this'),
URL se sice částečně „vyčistí“ od parametru volající signál, ale
ten parametru poll-answer tam zůstává…
Relevantní kód:
Registrace komponenty v BasePresenteru:
protected function createComponentPoll($name) {
        return new PollControl();
  }
Kód komponenty PollControl:
/**
 * Poll rendering, voting and archiving
 *
 * @author Ondřej Mirtes
 * @link http://ondrej.mirtes.cz/
 */
class PollControl extends BaseControl {
    const POLL_MODE = 'Poll';
    const ARCHIVE_MODE = 'Archive';
    private $mode = self::POLL_MODE;
    private $model;
    private $colors = array(
        'red', 'green', 'blue', 'yellow',
    );
    public function __construct() {
        $this->model = new PollControlModel();
    }
    /**
     * Setter of the rendering mode
     * @param const Mode to render
     * @throws InvalidStateException If bad mode is passed as argument
     */
    public function setMode($mode) {
        if ($mode != POLL_MODE && $mode != ARCHIVE_MODE)
            throw new InvalidStateException('Bad mode passed as argument of method PollControl::setMode');
        $this->mode = $mode;
    }
    /** chybující metoda */
    public function handleVote($answer) {
        Debug::dump($answer);
        $this->model->vote($answer);
        if (!Environment::getHttpRequest()->isAjax()) $this->redirect('this');
    }
    public function render() {
        $this->{'render'.$this->mode}();
    }
    private function renderPoll() {
        $template = $this->createTemplate();
        $template->setFile(dirname(__FILE__) . '/Poll.phtml');
        $template->poll = $this->model->getLatestPoll();
        $template->colors = $this->colors;
        $template->answersCount = PollControlModel::ANSWERS_COUNT;
        $template->hasVoted = $this->model->hasVoted();
        if ($template->poll == null) $this->renderNoPoll();
        else $template->render();
    }
    private function renderArchive() {
        $template = $this->createTemplate();
        $template->setFile(dirname(__FILE__) . '/Archive.phtml');
        $template->render();
    }
    private function renderNoPoll() {
        $template = $this->createTemplate();
        $template->setFile(dirname(__FILE__) . '/NoPoll.phtml');
        $template->render();
    }
}
Link v šabloně Poll.phtml vytvářím klasicky:
{link vote $i} a klasicky i vypadá v URL,
např: ?poll-answer=1&do=poll-vote
Netuší někdo co s tím?
Editoval LastHunter (4. 6. 2009 21:11)

- _Martin_
 - Generous Backer | 679
 
Nevíme-li si rady, zeptejme se rodičů: „Mamí, tatí, haló…“.
public function __construct() {
	$this->model = new PollControlModel();
	parent::__construct(); // <--------------- TŘIKRÁT PŘEČÍST A ZAPSAT ZA UŠI!
}
Edit: A já, po hodinovém zkoumání Nette zdrojáků, jdu s pocitem
dobře odvedené práce připsat poznámku do dokumentace=)
Než se vrhnu bezhlavě do přepisování dokumentace, zajímám mě, zda je
vlastně přepisování konstruktorů u komponent vhodná cesta. Ostatní
komponenty můžu získávat pomocí továrničky (a bude to fungovat všude a
pěkně líně, načítání jen v případě potřeby). A model vlastně
může být také komponentou – nevykreslitelnou komponentou.
Nebo by bylo lepší směřovat „best practices“ k používání metod
attached a detached?
Co vy na to?
Editoval _Martin_ (4. 6. 2009 23:38)

- Ondřej Mirtes
 - Člen | 1536
 
Super, díky, bylo to opravdu nezavoláním konstruktoru rodičů. V tom případě by to chtělo vyhazovat nějakou výjimku, pokud je něco takového detekovatelné :)
Jinak lazy model jsem vyzkoušel a funguje bezvadně :) (akorát jsem BaseModel místo od Objectu musel musel podědit od Componentu).