[addon navigation] Navigation

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

Diskuse ke stránce Navigation


Jsem rád, že se tu něco takového objevilo. Usnadní to práci. Díky za to!

Jan Tvrdík
Nette guru | 2595
+
0
-

Už se těším, až to na nějakém webu budu moci použít v praxi.

rokerkony
Člen | 122
+
0
-

pekne :-) az bude cas vyzkousim :)

rokerkony
Člen | 122
+
0
-

mozna by se hodilo pridat setter pro ovlivneni useHomepage

	/**
	 * Set use homepage
	 * @param bool $useHomepage
	 */
	public function setUseHomepage($useHomepage) {
		$this->useHomepage = $useHomepage;
	}
LuKa
Člen | 3
+
0
-

Řeším takovou věc. Mám různé presentery závislé na BasePresenteru a v něm mám funkci createComponentNavigation pro vytvoření menu.

Ale nevím jak mám nastavit pro jednotlivé presentery aktuální menu funkcí setCurrent().

Zkouším tu funkci volat treba z presenteru Clanky, ale nic se nestane ani chybu to nehodí. menu se zobrazí, ale aktivní se neoznačí.

Nevíte někdo jak to udělat.

Díky za pomoc

Už jsem to vyřešil, díky za pomoc.

Editoval LuKa (15. 6. 2010 11:27)

rixi
Člen | 109
+
0
-

LuKa wrote:
Už jsem to vyřešil, díky za pomoc.

Tiez riesim ten problem, mohol by mi to niekto objasnit ako na to nastavovanie setCurrentu?

Honza Marek
Člen | 1664
+
0
-

V nejnovější verzi takto:

// v továrničce v BasePresenteru
$navigation->add("Sekce", $this->link("Sekce:"))
	->setAsCurrent($this->name === "Sekce" && $this->action === "default");
	// doufám, že jméno presenteru se dá zjistit $this->name ;)

ve starších verzích je nutné toto:

$sekce = $navigation->add("Sekce", $this->link("Sekce:"));

if ($this->name === "Sekce" && $this->action === "default") {
	$navigation->setCurrent($sekce);
}
Podbor
Člen | 19
+
0
-

Zdravím,
tato komponenta se mi jeví jako velmi užitečná, a tak bych jí rád zakomponoval do své aplikace. Stáhl jsem si tedy soubory „Navigation.php“ a „NavigationNode.php“ do adresáře \Moje-aplikace\libs\Navigation\
Třída Navigation dědí „Controler“, a tak jsem před ni do souboru dopsal:

<?php
use Nette\Application\Control;
?>

A zde je vše v pořádku. Potíž dělá druhá třída, která dědí ComponentContainer.

<?php
use Nette\ComponentModel\ComponentContainer;
?>

Zde mi laděnka stále hlásí:
*
Fatal Error
Class ‚Nette\ComponentModel\ComponentContainer‘ not found
*
A s tím si nějak nevím rady. :-( Používám verzi Nette 2.0 pro PHP 5.3.
Setkal se někdo s něčím podobným ?

EDIT: Omlouvám se, ale už se mi to podařilo vyřešit. Nahrál jsem tu Navigaci do špatného adresáře a ještě mi k tomu chyběly phtml soubory „menu.phtml“ a „breadcrumbs.phtml“.
Pokud to nevadí, tak můj příspěvek klidně smažte.

Editoval Podbor (20. 3. 2011 18:27)

Filip Procházka
Moderator | 4668
+
0
-

To bude nejspíše tím, že třída Nette\ComponentModel\ComponentContainer neexistuje. Přestože se nachází v souboru Nette/ComponentModel/ComponentContainer.php tak se jmenuje pouze Nette\ComponentContainer

kralik
Člen | 230
+
0
-

Ahoj lidičky prosím poraďte,
pokouším se „čarovat“ s touto komponentou.
Rozjel jsem ji ale nevím jak přidat odkaz na další presenter.
Potřeboval bych nakopnout, s Nette teprve začínám.
Používám verzi 2.0 Alpha pro PHP5.3

mám:
presenters

– BasePresenters.php
– ErrorPresenter.php
– DocumentPresenter.php
– HomepagePresenter.php

templates

– Document

|- default.latte

– Homepage

|- default.latte

<?php
protected function createComponentNavigation($name) {
    $nav = new Navigation($this, $name);
    $nav->setupHomepage("Úvod", $this->link("Homepage:"));
    $nav->add("Dokumenty", $this->link("Document:"));
}
?>

HomePage jede ale nefunguje mi odkaz na „Dokumenty“

nevím zda musím ještě nějak upravit Router v bootstrap.php

<?php
  $router = $application->getRouter();
  $router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
  $router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');

};
?>

Přečetl jsem něco o Router, ale nějak mi to nění jasné.

Mooc díky
t0m

bojovyletoun
Člen | 667
+
0
-

Co znamená, že to nefunguje a jak se to projevuje?

kralik
Člen | 230
+
0
-

při kliknutí na odkaz se zobrazí

Not Found
The requested URL /dokumenty_v02/www/document/ was not found on this server.

nevím jak přidat další odkaz na jiný Presenter.

Díky

kralik
Člen | 230
+
0
-

Mohl by sem prosím někdo dát ukázku na použití této komponenty.

3 položky menu, každá položka samostatný Presenter a vše potřebné k rozchození (úpravy bootstrap.php, atd.)

toto by nám začátečníkům mooc pomohlo

díky

Filip Procházka
Moderator | 4668
+
0
-

Můj šestý smysl mi říká, že ti nefunguje správně mod_rewrite

kralik
Člen | 230
+
0
-

tvůj šestý smysl je super, mod_rewrite už mám v pořadku.

mohl bys sem napsat ještě jak s těmi routami na 3 samostatné presentery s touto komponentou

teď mi to píše „No route for HTTP request.“

bohužel s těmi routami si zatím nevím rady :-(

mooc díky

kralik
Člen | 230
+
0
-

Tak už jsem to dal dohromady, díky moc za nakopnutí.

Shrnutí pro nás začátečníky:
Pokud se někdo bude, stejně jako já, potýkat s Routerem a touto komponentou, tak zde jsou mé poznatky, které mi vše spolu s lidmi zde na fóru vyřešit.

implementace této komponenty:
obsah zipu jsem nahrál do /libs/Navigation
z distribusce nahrát někam na web_root a spustit /tools/Requirements-Checker/checker.php a zkontrolovat, měl jsem disabled mod_rewrite, takže na Apache povolit a je to

BasePresenter

<?php
  protected function createComponentNavigation($name) {
    $nav = new Navigation($this, $name);
    $nav->setupHomepage("Úvod", $this->link("Homepage:"));
    $nav->add("Dokumenty", $this->link("Dokument:"));
 }
?>

vytvořené 2× Presentery: „Homepage“ a „Dokument“ s obsahem
k tomu mít příslušné šablony, k tomuto jsem využil „sendbox“ z distribuce Alpha 2.0 PHP5.3

bootstrap.php – router v tomto souboru

<?php
$router = $application->getRouter();
  $router[] = new Route('index.php', 'Homepage:default', Route::ONE_WAY);
  $router[] = new Route('<presenter>/<action>[/<id>]', 'Homepage:default');
?>

Takto mi to vše funguje.

I když přepínání mezi těmito 2 stránkami je cca 1s což je celkem dlouho, ale nevím jak to zrychlit a zatím to neřeším.

Díky za pomoc a snad toto někomu dalšímu pomůže

bojovyletoun
Člen | 667
+
0
-

Otázka je, jak to bude rychlé na hostingu. Dále Diskuse

některé body (z vlastní zkušenosti,

  • eaccelerator
  • minified verze nette a dibi
  • vypnutý profiler (a další panely)
  • dynamická změna frekvence (CPU na noteboocích především) (RmClock) např 1 GHz vs 2 GHz. Pro krátké výkonové špičky se může problém projevit (default transition interval je 200ms).
  • webserver
  • samozřejmě optimalizace jako taková (kešování odkazů,…)

Editoval bojovyletoun (14. 4. 2011 21:09)

mr.mac
Člen | 87
+
0
-

kralik napsal(a):
Shrnutí pro nás začátečníky:

Udělal jsem to podle tebe a stále mi hlásí laděnka Fatal error – Class ‚Navigation‘ not found. Můžeš prosím tě doplnit jak máš zajištěno, že se komponenta v libs najde? Chápu, že to je hloupá otázka, ale nikde jsem nenašel úplný návod pro blbý, jak instalovat komponenty (Nette 2.0) do svých aplikací. Na stránce https://componette.org/search/?q= je odkaz jak přidat nové rozšíření nefunkční. Vůbec je to velká dřina něco rozchodit – hodně návodů je zastaralých nebo nefunkčních. Vážím si práce autorů i přispívajících zkušených editorů, ale pro začátečníky stále hodně nepřehledné až zmatené.
K věci: Ve složce apps/components/Navigation se mi taky nehlásí, přitom bootsrap mám standardní.

Editoval mr.mac (10. 10. 2011 14:12)

Ot@s
Backer | 476
+
0
-

mr.mac napsal(a):

kralik napsal(a):
Shrnutí pro nás začátečníky:

Udělal jsem to podle tebe a stále mi hlásí laděnka Fatal error – Class ‚Navigation‘ not found.
K věci: Ve složce apps/components/Navigation se mi taky nehlásí, přitom bootsrap mám standardní.

  1. Koukni na konfguraci RobotLoaderu, resp. zda se komponenta Navigation nachazí v uvedených cestách, např. v config.neon máš %appDir%, %libsDir%:
	robotLoader:
		option:
			directory: [%appDir%, %libsDir%]
		run: true

Kde %appDir%, %libsDir% jsou obvykle definovány jako konstatny v index.php a v těchto cestách se pak rekurzivně „skenuje“.

  1. Ještě je možné, že u komponenty Navigation bude definován nějaký namespace – pokud ano, musíš ho při volání/použití prefixovat nebo dát na začátek skriptu, kde komponentu používáš, use.

Editoval Ot@s (10. 10. 2011 14:38)

mr.mac
Člen | 87
+
0
-

Ot@s napsal(a):

Díky móóóc. Doplnil jsem si odkaz na cesty v config.neon – komponentu jsem měl ve složce app/components/Nevigation – a nenašla se – myslel jsem si, že robotLoader implicitně app prohledává (asi ano). Doplnil jsem i prefix namespace (možná to byl ten hlavní důvod).

22
Člen | 1478
+
0
-

Ot@s: k bodu 1) to už je snad historie v Nette 2 beta! Ty dvě cesty už nejsou konstatnty v index.php, ale součást DI kontajneru a robotLoader ty 2 složky prohledává automaticky, není potřeba je mu je znova připomínat.

simPod
Člen | 383
+
0
-

kdyz mam komponentu Navigation vytvarenou v BasePresenteru, da se ji nejak menit Current (setCurrent()) z jinych presenteru, ktere extenduji muj BasePresenter?

Ot@s
Backer | 476
+
0
-

simPod napsal(a):

kdyz mam komponentu Navigation vytvarenou v BasePresenteru, da se ji nejak menit Current (setCurrent()) z jinych presenteru, ktere extenduji muj BasePresenter?

Kdekoli v presenteru $this['nazevKomponentyNavigation']->setCurrent().

simPod
Člen | 383
+
0
-

dekuji

duskohu
Člen | 778
+
0
-

Dobry den,
chcel by som sa informovat mam taketo menu v BasePresenter,
ako viem nastavit current page podla aktualnej ktoru si zistiom z aktualneho presenteru a action
Za radu dakujem.

<?php
public function createComponentNavigation($name) {
	$menu = new Navigation($this, $name);
	$menu->setupHomepage("Domov", $this->link("Homepage:"));

	$menu->add("Charakteristika", $this->link("Homepage:charakteristika"));
	$menu->add("Aktivity projektu", $this->link("Homepage:aktivityProjektu"));

	$menu->setCurrent(????? Auto ??????);
}
?>
Ot@s
Backer | 476
+
0
-

Já to řešil úpravou samotné komponenty (atomaticky testuju link v metodě add, kde vkládám lazyLink).
Když to nebudeš nikde šířit, tak by mohlo provizorně zafungovat něco jako (netestováno):

// zadani jedne polozky navigace
$tmp = $menu->add("Charakteristika", $this->link("Homepage:charakteristika"));
if ($this->isLinkCurrent("Homepage:charakteristika")) $menu->setCurrent($tmp);
duskohu
Člen | 778
+
0
-

Dakujem

lunak83
Člen | 47
+
0
-

Ahoj, dokážete někdo výsledný objekt kešovat, prosím?

Já dostávám při pokusu o uložení do FileStorage cache:

SplObjectStorage::serialize() must return a string or NULL

Případně pokud to zavolám hned po deklaraci tak:

Object serialization is not supported by class Navigation\Navigation

Děkuji předem za nakopnutí.