Kedy presenter vytvára komponenty

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

Tak ešte raz ja ak dovolíte:
Vŕta mi v hlave takýto riadok z kódu čo je v metóde actionEdit v postPresentery z quickstartu:

$this['postForm']->setDefaults($post->toArray());

Nechápem, kde presenter(to je dúfam to $this), zoberie objekt postForm. Ako to, že tá komponenta už existuje? Ja som myslel, že sa vytvorí, až keď ju bude šablóna potrebovať. Lebo mi to pripadá neefektívne, že presenter vytvorí objekty všetkých komponent, ktoré možno v šablone ani nebudem potrebovať. Napr je v tomto danom presentery ešte komponenta commentForm. Ale tú pri editácii vôbec nepotrebujem. Tá tiež existuje v $this[commentForm]? Či ako??? Kedy si presenter vytvorí to $this[postForm]???
Tu ešte pre prípad celý ten presenter:

<?php
namespace App\Presenters;

use Nette, Nette\Utils\Validators, Nette\Caching\Cache;

class PostPresenter extends BasePresenter
{
	/** @var Nette\Database\Context */
	private $database;
	/** @var Nette\Caching\IStorage @inject */
	public $storage;

	public function __construct(Nette\Database\Context $database)
	{
		$this->database = $database;
	}

	public function renderShow($postId)
	{
		$this.database vytvorenom v konštruktore
		$post = $this->database->table('posts')->get($postId);
		if (!$post)
		{
			$this->error('Stránka nebyla nalezena');
		}
		$this->template->post = $post;

		$this->template->comments = $post->related('comment')->order('created_at');
	}

	protected function createComponentCommentForm()
	{
		$form = new Nette\Application\UI\Form;

		$form->addText('name', 'Jméno:')
		->setRequired('Meno je povinná položka');

		$form->addText('email', 'Email:');

		$form->addTextArea('content', 'Komentář:')
			->setRequired('Komentár je povinná položka')
			->setAttribute('class','area400');

		$form->addSubmit('send', 'Publikovat komentář');

		$form->onSuccess[] = $this->commentFormSucceeded;

		return $form;
	}

	public function commentFormSucceeded($form)
	{
		$values = $form->getValues();
		$postId = $this->getParameter('postId');

		$this->database->table('comments')->insert(array(
			'post_id' => $postId,
			'name' => $values->name,
			'email' => $values->email,
			'content' => $values->content,
		));

		$this->flashMessage('Děkuji za komentář', 'success');
		$this->redirect('this');
	}

     protected function createComponentPostForm()
	{
		$form = new Nette\Application\UI\Form;
		$form->addText('title', 'Titulek:')
		->setRequired('Titulok je povinná položka');
		$form->addTextArea('content', 'Obsah:')
		->setRequired('Pole obsah nesmie byť prázdne')
		->setAttribute('class','area600');

		$form->addSubmit('send', 'Uložit a publikovat');
		$form->onSuccess[] = $this->postFormSucceeded;

		return $form;
	}

	public function postFormSucceeded($form)
	{
		if (!$this->user->isLoggedIn()) {
			$this->error('Pro vytvoření, nebo editování příspěvku se musíte přihlásit.');
		}
		$values = $form->getValues();
		$postId = $this->getParameter('postId');
		if ($postId)
		{
			$post = $this->database->table('posts')->where('id ?', $postId)->update($values);
		}
		else
		{
			$post = $this->database->table('posts')->insert($values);
		}

	$this->flashMessage('Příspěvek byl úspěšně publikován.', 'success');
	$this->redirect('show', $postId);
	}

	public function actionEdit($postId)
	{
		if (!$this->user->isLoggedIn()) {
			$this->redirect('Sign:in');
		}
		$post = $this->database->table('posts')->get($postId);
		if (!$post) {
			$this->error('Příspěvek nebyl nalezen');
		}
		$this['postForm']->setDefaults($post->toArray());
	}

	public function actionCreate()
	{
		if (!$this->user->isLoggedIn()) {
			$this->redirect('Sign:in');
		}
	}
}

Editoval Čamo (27. 5. 2014 20:06)

David Matějka
Moderator | 6445
+
0
-

prave ono $this['postForm'] tu komponentu vytvori, pokud neexistuje. Ta komponenta je vytvorena ve chvili, kdy ji nekdo potrebuje – at uz sablona, nebo zpracovani signalu (treba u formulare), nebo ty, kdyz na ni sahas rucne.

Čamo
Člen | 798
+
0
-

Matej21:
Ak sa vytvorí až v tom momente ako ju volám, tak je to výborné.
Ale nechápem ako je to možné, že ten zápis funguje(možno nechápem PHP).
Lebo tento kód dole mi hádže Fatal error: Cannot use object of type test as array

class test{

public function testFc()
{
	$this['nieco']->akoToZeAno();
}

}

$o = new test;
$o->testFc();

Ako to že to v Nette funguje?

jiri.pudil
Nette Blogger | 1032
+
0
-

Protože PresenterComponent, od které dědí komponenty a presentery, fikaně implementuje ArrayAccess.

Čamo
Člen | 798
+
0
-

jiri.pudil:
Paráda, až sa divím, že som to pochopil. Najprv mi to pripadalo ako mágia.

akadlec
Člen | 1326
+
0
-

me uz hrabe misto kedy sem cetl KDYBY a uz sem myslel ze @Filip Procházka udelal dalsi rozsireni pro nette ;)