Vytvoření navigace závislé na ID aktuální zprávy
- dotTwelve
- Člen | 167
Ježiš, trošku mi ulítnul název tématu ;) „NAVIGACE“ tam
má být…
Nevím si rady, a než se do toho pustím rád bych zjistil nejlepší možné řešení.
Potřebuji vytvořit navigační menu, které se bude generovat v šabloně a bude závislé na daném ID aktuálního článku (to znamená že zjistí podle ID aktuální článek – to není problém a vytvori odkaz jeden článek vzad a jeden článek vpřed, pokud bude existovat v DB).
Jde mi o to, co k tomu použít (komponentu?) kam mam jednotlivé části kódu dát (co do presenteru?, sablony?).
Děkuji
Editoval kravčo (19. 8. 2009 15:22)
- Jod
- Člen | 701
Nejaký NavigatorControl?
Môžeš:
- volať db priamo
- volať db z modelu v controle
- predať dáta z modelu do control v presenteru ← takto to bude asi najlepšie :)
Vytvoríš si v presenteri továrničku
createComponentNavigatorControl($name) kde vytvoríš control a naplníš ho
dátami (id zistíš cez $this->getParam(‚id‘) ).
V šablone použiješ už len {control navigatorControl}
- Jod
- Člen | 701
Keď sa sekneš už vo vytvárani súboru tak si buď naštuduj
nette/componenty/controly ,
alebo to sprav normálne v šablone, aj tak to budeš mať len na jednom
mieste.
A keď už toto nezvládneš, tak si naštuduj php.
Normálne si natahaj tie dve idcka vpred a v zad v nejakej action presentera, pridaj do template a v šablone vygeneruj dva odkazy. Nič vic zatým nevidím ak ma oči neklamú.
- romansklenar
- Člen | 655
dotTwelve napsal(a):
Můžem mi trošku více rozepsat kam co dát a kde vytvořit jaký soubor? Nějak se mi to stále nedaří.
Nebo rovnou napsat a poslat že… ;)
- dotTwelve
- Člen | 167
romansklenar napsal(a):
dotTwelve napsal(a):
Můžem mi trošku více rozepsat kam co dát a kde vytvořit jaký soubor? Nějak se mi to stále nedaří.
Nebo rovnou napsat a poslat že… ;)
Tak to by bylo asi úplně nejlepší, ač o to nežádám :D Nevím prostě co kam dát, v tom je ten problém.
- jasir
- Člen | 746
To máš těžký, nikomu se nechce moc plýtvat silami , když se zdá, že než by sis přečetl manuál a prohledal fórum či prohlédl příklady, radši se jdeš zeptat hned sem. Je to totiž únavné odpovídat na podobně nekonkrétní dotazy typu „do jakého souboru“ mám co dát. Nahoře ti Jod radil co a jak, pokusil ses to aspoň pochopit? Zdá se že ne,
- Blizzy
- Člen | 149
Vedle složek presenter, templates apod. vytvoříš složku controls a v ní soubor NavigatorControl.php, něco takového:
class NavigatorControl extends Control {
... různé handle, render aj. funkce ...
}
Více zde:
- https://doc.nette.org/cs/quickstart
- https://doc.nette.org/…n/components
- https://doc.nette.org/cs/glossary
V presenteru potom někde:
$this->addComponent(new NavigatorControl($parametry_konstruktoru), 'navigatorControl');
V šabloně potom:
{control navigatorControl}
nebo
{control navigatorControl:akce}
nebo
{control navigatorControl:akce parametry}
Editoval Blizzy (20. 8. 2009 15:17)
- dotTwelve
- Člen | 167
Diky!!!
Nakonec to mam takto, a chci se zeptat, zda-li je to z vaseho pohledu spravne reseni…
Presenter
<?php
public function createComponentNavigaceZpravy()
{
$navigace = new NavigaceZpravy;
$navigace->nactiZpravy($this->getParam('id'));
return $navigace;
}
?>
Komponenta: NavigaceZpravy.php
<?php
class NavigaceZpravy extends Control
{
public $odkazy;
public function nactiZpravy($id)
{
function array_navigate($array, $key)
{
$keys = array_keys($array);
$index = array_flip($keys);
$return = array();
$return['prev'] = (isset($keys[$index[$key]-1])) ? $keys[$index[$key]-1] : end($keys);
$return['next'] = (isset($keys[$index[$key]+1])) ? $keys[$index[$key]+1] : current($keys);
return $return;
}
$zpravy = new ZpravyModel;
$pole_id = $zpravy->navigaceZpravy();
$pole_id = array_navigate($pole_id, $id);
$odkazy = array();
foreach ($pole_id as $n)
{
$odkaz = $zpravy->zobrazitZpravu($n)->fetch();
$odkazHtml = Html::el('a')->href($odkaz['id'])->setText(String::truncate($odkaz['nazev'], 50));
array_push($odkazy, $odkazHtml);
}
$this->odkazy = $odkazy;
}
public function render()
{
$template = $this->createTemplate();
$template->setFile(dirname(__FILE__) . '/navigaceZpravy.phtml');
$template->odkazy = $this->odkazy;
$template->render();
}
}
?>
Sablona: navigaceZpravy.phtml
<div id="zpravyNavigace">
«
{foreach $odkazy as $odkaz}
{$odkaz}
{/foreach}
»
</div>
Sablona s widgetem:
{control navigaceZpravy}
Model: ZpravyModel.php
<?php
class ZpravyModel extends BaseModel
{
#tabulky
const ZPRAVY = 'zpravy';
public function getDataSource($table)
{
return $this->connection->dataSource('SELECT * FROM %n', $table);
}
public function zobrazitZpravy()
{
return $this->connection->select('*')->from(self::ZPRAVY);
}
public function zobrazitZpravu($id)
{
return $this->connection->select('*')->from(self::ZPRAVY)->where('id=%i', $id);
}
public function navigaceZpravy()
{
return $this->connection->select('id, nazev')->from(self::ZPRAVY)->fetchAssoc('id');
}
}
?>
Editoval dotTwelve (20. 8. 2009 15:39)
- romansklenar
- Člen | 655
dotTwelve napsal(a):
koukam, ze dokazete poradit, myslel jsem, ze jsem na foru a ne na skoleni
Bez urážky, ale…
Konkrétně toto se tu už na fóru řešilo (dokonce jsou tu i dvě vlákna myslím, z toho jsem jedno před rokem sám zakládal) – kdybys vůbec chvíli hledal tak to najdeš. Jak říká jasir, tvoje dotazy vyplývají z toho, že nehledáš nebo nemáš vůbec znalosti jazyka ve které píšeš, dokumentaci jsi nejspíš ani neviděl, s API pracovat neumíš nebo nevíš co to je. Bez urážky, ale úroveň tvých dotazů je na úrovni PHP začátečníka, z popisu chyby co na tebe vyhodí překladač nejsi schopný nic udělat a radši se zeptáš, než aby ses podíval do zdrojáků.
Chytrému napověz, hloupého kopni…
Když už ti někdo zveřejní kus kódu s funkční ukázkou, tak ho nedokážeš ani správně použít (ano mluvím o datagridu). My nejsme poradna a nedostáváme za TVOU práci zaplaceno. Proč má teda člověk obětovat svůj čas pro někoho takového? Školení by ti opravdu neuškodilo a částečně či přímo/nepřímo bys tím podpořil i další vývoj frameworku.
Navíc (to už se netýká ale tebe) mám zkušenost s tím, že jakmile takovémuto člověku osobně (třeba přes mail) někdo poradí, tak si z něj dělá v zápětí osobní nette-helpdesk a už mu nedá pokoj dokud ho ten dotyčný nepošle (slušně samozřejmě) někam.
- dotTwelve
- Člen | 167
romansklenar napsal(a):
Asi tak…
Jiz z tohoto prispevku jsem pochopil, ze z tve strany uz nejakou pomoc cekat nemam. Proc to tedy dale rozvadet. Holt nejsem zkuseny v teto oblasti jako „nekdo“ ale rad se priucim novym vecem i postupem, ktery mozna „nekomu“ pripada neobvykly. Mimochodem, pokud nechces pomoci, proc tedy reagujes?
Za zacatecnika se samozrejme povazuji, proc taky ne.
- kravčo
- Člen | 721
dotTwelve napsal(a):
… Mimochodem, pokud nechces pomoci, proc tedy reagujes?
Pokiaľ si si nevšimol, Roman, ja i iní sa ti snažíme pomôcť. Ak sa v Nette nevyznáš a potrebuješ sa v ňom vyznať, jednorázová investícia do školenia sa ti rýchlo vráti. Žiadne vlákna plné riešení z fóra ho nenahradia, to mi môžeš veriť.
Každý, kto tu na fóre odpovedá a pomáha, to pre niečo robí. Fakt, že v tomto vlákne je viacej odkazov ako odpovedí na tvoju otázku možno znamená, že by to chcelo zmeniť prístup. Verím, že ak sa budeš pýtať inak, alebo si niečo predtým naštuduješ, budú tvoje otázky jasnejšie a zrejme na ne dostaneš i skoršiu a lepšiu odpoveď.