Nefunguje předání parametru signálu

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ondřej Mirtes
Člen | 1536
+
0
-

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)

Patrik Votoček
Člen | 2221
+
0
-

nemělo by tam být {link vote!, $i}?

Editoval vrtak-cz (4. 6. 2009 21:37)

vlki
Člen | 218
+
0
-

vrtak-cz: Pokud se volá link na komponentě, je to automaticky signál, přidání vykřičníku je už jen pro přehlednost…

Nepoužíváš v BasePresenteru metody loadState a saveState? Jinak mne nenapadá, proč by to nemělo fungovat.

_Martin_
Generous Backer | 679
+
0
-

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
+
0
-

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).