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