Kedy presenter vytvára komponenty
- Čamo
- Člen | 798
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
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
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
Protože PresenterComponent, od které dědí komponenty a presentery, fikaně implementuje ArrayAccess.