Struktura slozitejsi aplikace – dedeni presenteru, nebo komponenty?
- baz
- Člen | 42
Ahoj,
pracuji na první aplikaci v Nette a mám už cca 10 presenterů a
15 šablon.
Pomalu mi ale začíná chybět něco, čím bych mohl například v 5 presenterech a jeho 7 šablonách vykreslit např. Anketu (nebo spec. menu, údaje o uživateli apod.). Nechci to v každém presenteru dělat znovu.
Teď k té otázce, jakým způsobem tohle opakované používání
nějakých částí realizovat ?
Napadá mě více způsobů a nevím, který je správný :
1 – udělat si pro tyhle metody Presenter, který pak budou ostatní
„dědit“ přes extends (teď mám všechny odvozené z basePresenter)
2 – použít komponenty, tady ale pořádně nevím jak fungují, našel jsem
jen tohle : https://doc.nette.org/…n/components
a o tom se zase ve foru zminujete, ze ma dost chyb
- baz
- Člen | 42
a muzu se zeptat na zdroj, kde muzu studovat komponenty ? v dokumentaci jsem
nasel jen tohle : https://doc.nette.org/…n/components
a pak zminovany popis v develu…
ani z jednoho mi ale nejsou jasne vsechny souvislosti, nerad bych se ucil neco pouzivat spatne…
- baz
- Člen | 42
Díky za rady,
tímto bych rád vyzval všechny, kteří mají použitelné příklady k této
problematice.
Jsem si jist, že to nebude prospěšné jen mě, ale spoustě začátečníkům
:-)
Kdyby se povedlo dát něco dohromady a já do toho pronikl, mohl bych se
následně pokusit něco k tomu sepsat…
Editoval baz (19. 8. 2010 12:58)
- Mesiah
- Člen | 240
Hele k těm controlům to dělám takhle:
Mám adresar component a v tom mám naházené komponenty (vykreslovatelné). Komponenta se dělí na logickou cast a případně i template(s).
<?php
/**
* Description of About
*
* @author sebastian
*/
class AboutControl extends Control
{
private $__about;
public function render()
{
$about = $this->about->read();
$template = parent::createTemplate();
$template->setFile(dirname(__FILE__) . '/AboutControl.phtml');
// $template->setFile(__DIR__ . '/AboutControl.phtml');
if ($about)
$template->about = $about->text;
else
$template->about = NULL;
$template->render();
}
public function getAbout()
{
if (!isset($this->__about))
{
$this->__about = new About();
}
return $this->__about;
}
}
?>
a k tomu šablonu:
{if $about}
<h1 class="sidebar">O blogu</h1>
<p>{$about}</p>
<hr class="sidebar-border" />
{/if}
a v BasePresenteru mám v metodě starup() registraci
$this->getComponent('about');
a k ní továrničku
<?php
public function createComponentAbout($name)
{
$control = new AboutControl($this, $name);
return $control;
}
?>
a v šabloně webu ji volám v @layout.phtml
pomocí
{widget about}
.
Editoval Mesiah (19. 8. 2010 15:14)
- Ondřej Brejla
- Člen | 746
Mesiah napsal(a):
a v BasePresenteru mám v metodě starup() registraci
$this->getComponent('about');
…
Proč?
- Ondřej Brejla
- Člen | 746
Volání {widget about}
automaticky hledá továrničku a volá
na takto připojené komponentě metodu render()
. Pokud je potřeba
komponentu inicializovat explicitně dříve pomocí
$this->getComponent('about');
, tak se „nejspíš“ děje
někde něco nestandardního.
Jinak, buď připojuji komponentu k presenteru v konstruktoru:
public function createComponentAbout($name) {
new About($this, $name);
}
nebo ji v továrničce vrátím:
public function createComponentAbout() {
return new About();
}
Není důvod používat obě možnosti najednou…
Editoval Ondřej Brejla (19. 8. 2010 17:08)
- baz
- Člen | 42
Diky za rady,
jen k te tovarnicce a zdvojenemu prirazeni je to zminene prave tady : https://doc.nette.org/…n/components.
Podle toho jsem chtel taky pouzivat tuhle verzi, ale uz jste dalsi, kdo tvrdi,
ze je to zbytecne „hyzdeni“ kodu :-)