Jak přistoupit k proměnné šablony dále v presenteru?

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

Zdravím. Pokusím se můj problém vysvětlit co nejstručněji, tudíž to hodně zkrátím.

V metodě renderDefault() deklaruji proměnnou post.

public function renderDefault($param)
    {
		$this->template->post = $this->nejakymodel->showPost($param);
	}

Model mi tedy podle vloženého parametru vrátí nějaký řádek z tabulky databáze kde jsou údaje o příspevku (v mém případně to bohužel bude náhodný příspěvek).
Ve stejné šabloně ještě budu mít formulář na komentáře. Když ovšem budu komentář ukládat, budu potřebovat vědět k jakému id příspěvku ho přiřadit.
Parametr o ID příspěvku nic neříká, pouze udává na jaké příspěvky se zaměřit a poté z nich vybrat jeden náhodný.
Zpracování formuláře by tedy zkráceně vypadalo takto:

	public function commentFormSubmitted($form) {
$values = $form->getValues();
		$this->database->table('comments')->insert(array(
        'postId' => $post->id,
        'content' => $values->content,
));
	}

Právě do $post v ukázce nějak potřebuju strčit $this->template->post který je v renderu.

Upravit to tak, aby parametr byl id příspěvku nemůžu. Uživatel nesmí ovlivnit jaký příspěvek se mu vykreslí.

Pravděpodobně je to banalita, ale opravdu mě nenapadlo jak to efektivně vyřešit. Díky za jakoukoliv radu.

Editoval volpet (7. 12. 2014 17:09)

Aurielle
Člen | 1281
+
0
-

Přesuň vytahování z databáze do action*() metody a ideálně vyčleň do vlastní property, abys znovu nemusel sahat do šablony.

Aleš Jandera
Člen | 24
+
0
-

Ahoj, tohle by mohlo fungovat.

<?php
/** @var Post **/
private $post;

actionDefault($param)
{
	$this->post = $this->nejakymodel->showPost($param);
	$this->template->post = $this->post;
}

public function commentFormSubmitted($form) {
    $values = $form->getValues();
    $this->database->table('comments')->insert(array(
            'postId' => $this->post->id,
            'content' => $values->content,
    ));
}
?>
volpet
Člen | 6
+
0
-

Aleš Jandera napsal(a):

Ahoj, tohle by mohlo fungovat.

<?php
/** @var Post **/
private $post;

actionDefault($param)
{
	$this->post = $this->nejakymodel->showPost($param);
	$this->template->post = $this->post;
}

public function commentFormSubmitted($form) {
    $values = $form->getValues();
    $this->database->table('comments')->insert(array(
            'postId' => $this->post->id,
            'content' => $values->content,
    ));
}
?>

Díky za odpověd, ovšem z nějakýho neznámýho důvodu dostávám v commentFormSubmitted jinej řádek z databáze než mám v šabloňe. Zítra se na to ještě pořádně podívám.

Editoval volpet (7. 12. 2014 22:38)

Zax
Člen | 370
+
0
-

To nemůže fungovat už z principu – zobrazím formulář, načte se náhodný příspěvek, odešlu formulář = nový request, načte se jiný náhodný příspěvek. Asi by se hodilo to rozdělit na dvě akce – jedna, která ti zobrazí příspěvek podle ID v parametru a druhá, která ti vytáhne náhodný a přesměruje tě na akci s ID v parametru, zhruba takhle:

<?php
/** @var Post **/
private $post;

actionDefault($param)
{
  $randomPost = $this->nejakymodel->showPost($param);
  $this->redirect('postDetail', $randomPost->id);
}

actionPostDetail($id) {
  $this->post = $this->nejakymodel->getPostById($id);
  $this->template->post = $this->post;
}

public function commentFormSubmitted($form) {
    $values = $form->getValues();
    $this->database->table('comments')->insert(array(
            'postId' => $this->post->id,
            'content' => $values->content,
    ));
}
?>

Editoval Zax (7. 12. 2014 22:50)

Quinix
Člen | 108
+
+1
-

Tak jestli showPost vrací náhodný příspěvek, tak po odeslání formuláře se z databáze vybere jiný náhodný příspěvek.

Musíš si ID postu předat například v hidden poli formuláře.

Zax
Člen | 370
+
0
-

Heh a nebo tak, to mě zrovna vůbec nenapadlo ^^

volpet
Člen | 6
+
0
-

Ano, s tím formulářem to bude nejlepší :)

To co psal Zax mě už napadlo také, ovšem jak jsem už psal tak bych byl nerad, aby si uživatel sám volil jaké id zobrazí.

Díky všem :)