Jak se dostat k proměnným v query stringu při zpracovávání url?
- fary
- Člen | 155
Mám formulář, kterým se odesílají komentáře uživatelů k článkům. Mám to udělané tak, že když chcete na něčí komentář reagovat, kliknete v tom jeh komentáři na link „reagovat“ a do url se přidá ?reakce=1, kde číslo 1 je id komentáře, na který se reaguje. Rád bych se při zpracování odeslaného formuláře k tomu query stringu dostal, ale nemůžu přijít na to, jaká metoda jej zpracovává.
- petr.pavel
- Člen | 535
Dostaneš se k nim v presenteru přes $this->request->getParameters() (viz dokumentace).
Správně bys ale měl používat formuláře Nette a GET vůbec
neřešit.
Nebo používat signály presenteru a opět GET neřešit.
EDIT: Možná, že jsem pochopil tvou situaci. Ty používáš formulář Nette, ale z nějakého důvodu chceš brát id článku odjinud. Proč si ho nepošleš ve skryté položce formuláře?
Editoval petr.pavel (28. 7. 2013 16:02)
- fary
- Člen | 155
Mě jde spíš o to, že potřebuju zjistit, jestli nově přidávaný komentář reaguje na nějaký předchozí, proto je tam ten link „reagovat“, který do url adresy přidá ?reakce=číslo-komentáře-na-který-je-reagováno. Pak se komentář napíše a odešlě se. Problém je právě v tom, že v metodě, která mi ho zpracovává – commentTextAreaSucceeded($form) se mi ze zmiňovaného $this->request->getParameters() vrací jiné parametry, jako do=commentTextArea-submit. Je nějaký způsob, jak do této metody, která ten formulář zpracovává, připojit do query stringu to moje reakce=xyz?
- petr.pavel
- Člen | 535
Jestli ti dobře rozumím, reakce má nějaký atribut clanek_id, který potřebuješ nastavit buď na NULL, když je nový příspěvek bez reakce na článek, nebo na id článku, pokud uživatel před odešláním formuláře klikne na „reagovat“.
To bych asi řešil javascriptem – po kliknutí bych nastavil hodnotu skryté položky formuláře. Na url bych nesahal. Tohle ovšem zkolabuje při vypnutém javascriptu nebo prohlížeči, který js neumí.
Možnost by taky byla mít pro každý článek vlastní formulář pro reakci vyrobený multiplierem.
- petr.pavel
- Člen | 535
Doporučuju ti investovat čas do hledání „Nette way“ řešení – tj. nevzít si z Nette jen hromadu souborů, ale i jeho filosofii. Později ti dojde, proč to stojí za to.
- hAssassin
- Člen | 293
Myslim ze te petr.pavel uplne spravne nepochopil, presto poradil aspon castecne dobre. Ano, pridat si ID komentare na ktery odpovidas do hidden pole, zda se byti nejlepsi. Resil bych to asi takto (psano z hlavy, takze asi tam bude hodne chyb, navic pouze nastrel):
class ArticlePresenter extends BasePresenter
{
protected $commentId = NULL; // tady budu mit ID komentare na ktery reaguju, ale muzu to vyuzit i na jiny veci
public function actionDefault($reakce = NULL) {
$this->commentId = $reakce;
// ... tady dalsi veci, pokud nejaky jsou
}
public function createComponentCommentsForm() {
$form = new UI\Form();
// pridame nejaky prvky...
// Pokud reagujeme na komentar, nastavime si hidden
if ($this->commentId) {
$form->addHidden('reakce_id', $this->commentId);
}
$form->onSuccess[] = $this->processCommentsForm;
return $form;
}
protected function processCommentsForm(UI\Form $form) {
$values = $form->values;
$commentId = $values['reakce_id'];
dump($commentId); // tady ma ID komentare na ktery reaguju.
// ulozim data
$this->redirect('this', array('reakce' => NULL));
die;
}
}
Otazkou jeste je, jestli na to nahodou nemas nejaky specialni view. Toto predpoklada stejny view jako ve kterym se zobrazuji komentare i clanek. Ale logika je snad jasna.