jednotné menu – pro každou stránku jiná akce

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

Zdravím, řeším takový, pro někoho možná laický, problém. Mám jedno menu pro několik stránek a každá stránky by měla ukladat data do jiné tabulky v databázi. Můj problém je, že si nevím rady jak to udělat. Uvedu příklad: 2 stranky maji v menu položky: nahratPIL, nahratTEXT, nahratIMAGE ale pro kazdou stranku existuje vlastni tabulka. Poradí mi s tím někdo? Díky za každý napad či radu.

Jan Endel
Člen | 1016
+
0
-

Předpokládám že ty jednotlivé stránky jsou akce prestenteru. Pokud chceš menu stejné pro všechny akce existuje metoda beforeRender která se zavolá před posláním zkompilované šablony do prohlížeče, takže právě zde je správné umístění naplnění toho tvého menu.

milan
Člen | 24
+
0
-

pilec napsal(a):

Předpokládám že ty jednotlivé stránky jsou akce prestenteru. Pokud chceš menu stejné pro všechny akce existuje metoda beforeRender která se zavolá před posláním zkompilované šablony do prohlížeče, takže právě zde je správné umístění naplnění toho tvého menu.

Zdravím, máš pravdu, že jednotlivé stranky jsou akce příslušných prezenterů a pro ně mam v metodě beforeRender udělané menu. Problém je v tom, že vždy na příslušné stránce je další menu, které je stejně tak pro ně identické, jen akce u každé položky na jednotlivých stránkám jsou trochu odlišné – snad to vysvětliju srozumitelně.

Jan Endel
Člen | 1016
+
0
-

Podle toho jak moc mírně se liší, pokud mírně málo tak to můžeš vypodmínkovat. Pokud mírně hodně tak společné prvky do beforeRender a konkrétní k dané akci do render. Je k tomu moc málo informací, zkus tady hodit nějaký příklad, jak by sis to představoval.

milan
Člen | 24
+
0
-

pilec napsal(a):

Podle toho jak moc mírně se liší, pokud mírně málo tak to můžeš vypodmínkovat. Pokud mírně hodně tak společné prvky do beforeRender a konkrétní k dané akci do render. Je k tomu moc málo informací, zkus tady hodit nějaký příklad, jak by sis to představoval.

Jasně zkusím to ještě přiblížit.
V AdminPresenteru mám:

<?php
public function beforeRender(){

		$this->template->adminmenicko=array(
							'Rino+'=>'Rinoplus',
							'Rinospray'=>'Rinospray',
							'Farspray'=>'Farspray',
							'Larspray'=>'Larspray',
							);
		$this->template->upravy = array(
							'Nahrát obrázek' => 'image',
							'Upravit text' => 'text',
							'Upravit cenu' => 'cena',
							'informace' => 'pil',
							);
	}
?>

a v latte obě dvě menu vypisuji klasicky pres foreach.

No a menu upravy potřebuji nasměrovat tak aby, když vyberu například nahrát obrazek, tak aby se mi cesta uložila do spravné tabulky k danemu produktu a fotka do příslušné složky. Snažím se to řešit právě nějak komplexněji než jen tím, že do každíé šablony budu rvát ručně jednotlivé cesty. ( tedy pakliže to ovšem jde )

milan
Člen | 24
+
0
-

našel by se tu někdo, kdo by věděl jak na to? moc děkuji

Jan Endel
Člen | 1016
+
0
-

milan napsal(a):

No a menu upravy potřebuji nasměrovat tak aby, když vyberu například nahrát obrazek, tak aby se mi cesta uložila do spravné tabulky k danemu produktu a fotka do příslušné složky. Snažím se to řešit právě nějak komplexněji než jen tím, že do každíé šablony budu rvát ručně jednotlivé cesty. ( tedy pakliže to ovšem jde )

mícháš generování menu a práci s modelem dohromady… zkus trošku podrobněji popsat problém a rozpitvat ho na víc částí.

milan
Člen | 24
+
0
-

pilec napsal(a):

milan napsal(a):

No a menu upravy potřebuji nasměrovat tak aby, když vyberu například nahrát obrazek, tak aby se mi cesta uložila do spravné tabulky k danemu produktu a fotka do příslušné složky. Snažím se to řešit právě nějak komplexněji než jen tím, že do každíé šablony budu rvát ručně jednotlivé cesty. ( tedy pakliže to ovšem jde )

mícháš generování menu a práci s modelem dohromady… zkus trošku podrobněji popsat problém a rozpitvat ho na víc částí.

jestli to tedy dobře chapu, tak si musím vytvořit model a použít pak daný model?

ViPEr*CZ*
Člen | 817
+
0
-

Samozřejmě. Pro obsluhu databáze si vytvořit model. Taky podle mě generovat takhle menu je neoptimální (v tom příkladě). To menu bych si klidně vložil komplet do šablony. Aplikace ušetří paměť na dvě pole a ještě čas jejich procházením. Ty položky menu budou furt stejný a když mi nějaká přibude, tak místo přidání prvku do pole si jednoduše přidám do šablony položku menu. A rozlišení do které tabulky se bude nahrávat? Použijte parametry. Do šablony si pošlete IDéčko o jakej prvek jde.

milan
Člen | 24
+
0
-

ViPErCZ napsal(a):

Samozřejmě. Pro obsluhu databáze si vytvořit model. Taky podle mě generovat takhle menu je neoptimální (v tom příkladě). To menu bych si klidně vložil komplet do šablony. Aplikace ušetří paměť na dvě pole a ještě čas jejich procházením. Ty položky menu budou furt stejný a když mi nějaká přibude, tak místo přidání prvku do pole si jednoduše přidám do šablony položku menu. A rozlišení do které tabulky se bude nahrávat? Použijte parametry. Do šablony si pošlete IDéčko o jakej prvek jde.

to menu je takto úmyslně generované – jde mi o to, aby se to odkazovalo na například Farspray:image. Je mi jasné, že pak musím mít příslušný model pro ukládání do databáze – ale právě nevím, jak docílit toho odkazu.

Jan Endel
Člen | 1016
+
0
-

Musíš udat více informací, více to rozepsat čeho chceš dosáhnout.

milan
Člen | 24
+
0
-

pilec napsal(a):

Musíš udat více informací, více to rozepsat čeho chceš dosáhnout.

Dobre, zkusim to jeste jednou vysvetlit. V hlavnim menu si vyberu napriklad Farspray a zobrazi se mi stranka s Farspray, ktera mimo to obsahuje dalsi menu – viz. vyse (nahratTEXT, …). Jse mi o to, kdyz na tuto polozku kliknu aby jsem se dostal na strankku, ktera je tvorena presenterem napr. nahratTEXT, ktery v sobe ponese „dedeni“ presenteru Farspray. A tak by to melo platit pro všechny ostatni stranky.

Jan Endel
Člen | 1016
+
0
-

hmm, pokud dobře chápu tak něco takového:

BasePresenter.php:

class BasePresenter extends \Nette\Aplication\UI\Presenter
{
	public function beforeRender()
	{
		$this->template->products=array(
                                                        1 =>'Rinoplus',
                                                        2 =>'Rinospray',
                                                        3 =>'Farspray',
                                                        4 =>'Larspray',
                                                        );
		//pozn: 1,2,3,4 jsou id produktu
	}
}

@layout.latte:

<ul>
	{foreach $products as $id => $product}
		<li><a n:href="Product:product $id">{$product}</a></li>
	{/foreach}
</ul>

ProductPresenter.php:

class ProductPresenter extends BasePresenter
{
	private $product;



	public function beforeRender()
	{
		$this->template->changeMenu = array(
                                                        'image' 	=> 'Nahrát obrázek',
                                                        'text' 		=>  'Upravit text',
                                                        'price' 	=> 'Upravit cenu',
                                                        'information' 	=> 'informace',
                                                        );
	}



	public function actionProduct($id)
	{
		$this->product = $this->context->productModel->get($id);
	}



	public function renderProduct()
	{
		$t = $this->template;
		$t->product = $this->product;
	}

product.latte:

<ul>
	{foreach $changeMenu as $action => $change}
		<li><a n:href="Change:$action">{$change}</a></li>
	{/foreach}
</ul>

ChangePresenter.php:

class ChangePresenter extends BasePresenter
{
	public function renderImage()
	{
		//...
	}



	public function renderText()
	{
		//...
	}



	public function renderPrice()
	{
		//...
	}



	public function renderInformation()
	{
		//...
	}
}
ViPEr*CZ*
Člen | 817
+
0
-

Tak jsem asi nepochopil o co jde.
Pokud to je tak jak píše pilec, pak samozřejmě produkty v layoutu musím takto přes foreach, protože to je dynamické pole. Ovšem product.latte by šel klidně rovnou vypsat do šablony. Nevýhoda je pokud bych pak chtěl ten kus kódu (s foreach) nějak dědit, pak by to s pevnými položkami nešlo.

milan
Člen | 24
+
0
-

@pilec Díky, tp je přesně ono co jsem potřeboval, jen mám k tomu ještě jeden dotaz – jak docílím aby mě to nehodilo na ../A/www/product/product/2 ale na ../A/www/Admin/product/$id. Díky moc za radu

Jan Endel
Člen | 1016
+
0
-

routování:

$router[] = new Route('<action>/<id [0-9]+>', 'Admin:Product:default');
milan
Člen | 24
+
0
-

pilec napsal(a):

routování:

$router[] = new Route('<action>/<id [0-9]+>', 'Admin:Product:default');

za tu routu ti děkuji … nicméně jsem si dal do boostrap.php ale nic se nezměnilo ani když jsem smazal cache.

Jan Endel
Člen | 1016
+
0
-

Velice dulezite je, na jakou pozici ji davas, u route strasne zalezi na poradi

milan
Člen | 24
+
0
-

@pilec asi jsem ¨totální blbec, ale ať jsem vyzkoušel jakékoliv pořadí tak je to stále beze změny. Mohl bys mi poradit jaké tedy zvolit pořadí. Momentálně to mám následovně:
boostrap.php:

<?php
$configurator->addConfig(__DIR__ . '/config/config.neon');
$container = $configurator->createContainer();

$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
$container->router[] = new Route('admin/<presenter>/<action>[/<id>]', 'Admin:default');
$container ->router[] = new Route('<action>/<id [0-9]+>', 'Admin:Product:default');

?>

Děkuji moc za radu

Melmen
Člen | 132
+
0
-

Přesně obrácené pořadí :)

milan
Člen | 24
+
0
-

Melmen napsal(a):

Přesně obrácené pořadí :)

Tak jestli tomu rozumím tak by to mělo být tedy takto

<?php


$configurator->addConfig(__DIR__ . '/config/config.neon');
$container = $configurator->createContainer();

$container ->router[] = new Route('<action>/<id [0-9]+>', 'Admin:Product:default');
$container->router[] = new Route('admin/<presenter>/<action>[/<id>]', 'Admin:default');
$container->router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
$container->router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
?>

jenže když to takto dám, tak mi zase naopak vyleze www/admin/homepage :-(

Editoval milan (14. 3. 2012 20:07)

milan
Člen | 24
+
0
-

VYŘEŠENO … mám ještě jeden dotaz … jak ještě zajistit aby to dědilo hlavní šablonu @layout.latte
struktura:

<?php
+app
  +AdminModule
      +presenters
      +templates
	 +Admin
	   -default.latte
	 +Product
	   -product.latte
	-@layout.latte
....
?>

Našla by se tu dobrá duše, která by mi s tím poradila? Předem děkuji

Editoval milan (15. 3. 2012 12:49)

milan
Člen | 24
+
0
-

věděl by si s tím někdo rady? mořím se s tím už dva dny a jsem z toho hotový:-( díky moc