jednotné menu – pro každou stránku jiná akce
- milan
- Člen | 24
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.
- milan
- Člen | 24
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ě.
- milan
- Člen | 24
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 )
- Jan Endel
- Člen | 1016
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
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
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
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.
- milan
- Člen | 24
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
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
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
@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
- milan
- Člen | 24
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
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)