Struktura slozitejsi aplikace – dedeni presenteru, nebo komponenty?

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

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

repli2dev
Člen | 57
+
0
-

Správnou praktikou je použít komponenty, určitě je nastudujte, architektura Nette na nich dost stavím.

Pokud jsou tyto komponenty na více stránkách, potom nad tyto stránky můžete dát presenter, ve kterém komponentu zinicializujete a popřípadě naplníte daty.

baz
Člen | 42
+
0
-

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…

repli2dev
Člen | 57
+
0
-

Se souvislostmi máte pravdu, zkuste šáhnout po ukázkových příkladech i mimo ty co jsou distribuovány s Nette. Já bohužel po ruce nic nemám, snad někdo bude mít někdo další.

baz
Člen | 42
+
0
-

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)

pave.kucera
Člen | 122
+
0
-

Doporučuju projít kód pár komponent z addons.nette.org

Mesiah
Člen | 240
+
0
-

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

Mesiah napsal(a):

a v BasePresenteru mám v metodě starup() registraci $this->getComponent('about'); …

Proč?

Mesiah
Člen | 240
+
0
-

Používám na tvorbu komponenty továrničku a tu musím registrovat, nebo ne?
Každopádně, pokud to vynechám komponenta se nevykreslí.

Ondřej Brejla
Člen | 746
+
0
-

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)

Mesiah
Člen | 240
+
0
-

Aha, někde jsem četl že nejspolehlivější způsob je použít obě možnosti současně. Díky za radu.

Ondřej Brejla
Člen | 746
+
0
-

Nejspolehlivější to asi bude, ale rozhodně to není nejhezčí ;-)

baz
Člen | 42
+
0
-

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 :-)