Jak se dostat k proměnným v query stringu při zpracovávání url?

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

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

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

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

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.

fary
Člen | 155
+
0
-

Už jsem to tedy vyřešil. Sice krkolomě, ale přeci. :-) Použil jsem jednoduchou podmínku,k terou jsem zkontroloval, zda se v query stringu ta moje proměnná nachází. Pokud ano, vloží se do hidden pole formuláře. Díky za rady. :-)

petr.pavel
Člen | 535
+
0
-

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

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.