Zásek už při Quick startu (šablony)

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

Zdravím, chci začít s Nette, moje startovací fáze začíná asi na uplně stejném bodě, jako píše kolega tady.

Bohužel přišla chyba hned při studování quick startu, konkrétně při vytváření šablony akce.

Nevím kde je problém, ale i když by se mi měl dle tutoriálu zobrazovat obsah souboru show.phtml, zobrazuje se stále první stránka, tedy „Congratulations on your first Nette Framework powered page.“.
V diskuzi pod tím článkem někdo píše něco o staré verzi a že je někde chyba. Každopádně já nevím kde a trochu tápu :) Soubor je umístěn takhle /app/templates/Todolist/show.phtml pod tím článkem je v diskuzi ale zmínka o tom, že by to mělo být /app/templates/Todolist/show/show.phtml, ale ani to mi nefunguje. Jak to tedy je?
A jak vůbec nette pozná, že má zobrazovat soubor show.phtml ve složce Todolist? Nikde v quick startu není žádná zmínka o nějaké změně místa, odkud má zobrazovat šablony.

Díky

Editoval Petr44 (20. 3. 2010 15:16)

SyXcz
Člen | 75
+
0
-

základní šablona je v /app/templates v souboru @layout.phtml

Pro Nette Framework je šablona soubor s názvem XXX.phtml, kde XXX nahradíme názvem akce, ke které šablona patří (s malým počátečním písmenem). Tento soubor se nachází v adresáři /app/templates/YYY/, kde YYY nahradíme názvem presenteru, ke kterému tato šablona patří (zde pro změnu s velkým počátečním písmenem).

okopírováno :) víc najdeš tu: https://doc.nette.org/…ting-started
přečti si to důkladněji, píšou tu o tom, z jakého adresáře se šablony berou a jak fungují…

Petr44
Člen | 12
+
0
-

Jednoduší by bylo vysvětlit co jsem udělal špatně :) Věř, že ten článek sem si přečet slovo od slova asi 5×. A vše (umístění souborů,o má dle toho článku dělat).

Je mi jasný že základní je @layout.phtml, když pominu co je napsáno, tak logicky bych tedy odvodil, že ji musím upravit, ale jediné co v ní je na místě obsahu je {include #content}. Podle toho tedy soudím že je třeba upravit někde něco, co mi udává tu hodnotu content, ale kde to je, jak to funguje a jak to mám upravit tak, aby mi nette zobrazoval to co chci a ne soubor app/templates/Homepage/default.phtml.

Editoval Petr44 (20. 3. 2010 17:06)

Jan Endel
Člen | 1016
+
0
-

skutečne by ta šablona měla být v app/templates/Todolist/show.phtml . Navic podobny zpusob pouzivam i ve svych aplikacich s tim rozdilem ze na zacatku kazde sablony (krom @layout.phtml) pisu ne {block content} ale {block #content}. Ta # z historickeho hlediska mela znacit oznaceni blocku a ja si ted nejsem jist jestli sablony v nette povazuji content = #contnent …ale zkus :)

Petr44
Člen | 12
+
0
-

Přidání # do show.phtml nepomohlo.
Jak vůbec nette pozná, že chci zobrazovat obsah ze složky Todolist a ne z Homepage? Nikde sem totiž nezapisoval odkud se to má zobrazovat (třeba do bootstrap.php) Nikde o tom nebyla v quick start žádná zmínka. Tak nevím jestli nemůže být chyba v tom?

Jan Endel
Člen | 1016
+
0
-

Pokud se pristoupi na adresu kuprikladu localhost/tvojeaplikace tak nette veme presenter a akci ktera je nastavena v routeru jako defaultni, konfigurace je v bootstrapu a jsou to tyto radky:

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

tedy pokud se pristoupi primo na index aplikace prejde se na presenter Homepage s action default.

Cili na presenter Todolist a action show by mela vest url localhost/tvojeaplikace/Todolist/show pokud jsi bootstrap nijak neupravoval.

Petr44
Člen | 12
+
0
-

Předtím sem bootstrap nijak neupravoval. Jen jsem se do něj podíval, ale vše nechal tak jak tam bylo.
Teď jsem upravil bootstrap takhle:

function importFile($m)
$router = $application->getRouter();

$router[] = new Route('index.php', array(
	'presenter' => 'Homepage',
	'action' => 'default',
), Route::ONE_WAY);

$router[] = new Route('<presenter>/<action>/<id>', array(
	'presenter' => 'Todolist',
	'action' => 'show',
	'id' => NULL,
));

Funguje to (tedy po zadání localhost/TodoList/document_root/ se zobrazí soubor z /templates/Todolist/show.phtml), ale nejsem si jistej že to tak má být pro tu aplikaci z quick startu, jelikož tam o tom nikde není ani zmínka.

Editoval Petr44 (20. 3. 2010 18:54)

Jan Endel
Člen | 1016
+
0
-

Zobrazi se cela stranka (tzn. i s @layout.phtml, hlavicka a tak)? Jinac timhle postupem by ses tim zbytkem mel prokousat. Jinac doporucuju rozjet si lokalne virtualhosty. Tak mi staci kdyz do adresniho radku napisu trebas jen todo a hned jsem na frontendu aplikace.

Petr44
Člen | 12
+
0
-

Jo, zobrazí se to v @layout.phtml, to je v pohodě.

Jinac timhle postupem by ses tim zbytkem mel prokousat.
To znamená že to není standartní stav? Jde to dělat jinak? Chtěl bych to mít hned od začátku správně, tak aby to šlo dát na web – ne že bych to tam chtěl dávat, ale teoreticky, zkrátka aby to bylo vše dobře, aby v tom nebylo nějaký nestandartní obcházení nějaký funkce, nebo tak. :)

Editoval Petr44 (20. 3. 2010 19:36)

Jan Endel
Člen | 1016
+
0
-

no, do toho bootstrapu se nastavuje akorat defaultni presenter. Cili pokud chces defaultni presenter Todolist a action Show tak to tak byt rozhodne muze :). k jinym presenterum se dostanes tak, jak jsem popsal vyse.

Petr44
Člen | 12
+
0
-

Ok, díky :)
Mimochodem, chtělo by to upravit v tom quick startu, jelikož tam o tom není nikde ani zmínka. Dokonce je tam napsaný, že nás bootstramp zatím nemusí zajímat, což je celkem chyba, když se v něm musí nastavit „cesta“ :)

Jan Endel
Člen | 1016
+
0
-

nemusi, jen by se mozna hodilo patrne rict, ze vysledek vaseho snazeni uvidite na adrese vaseaplikace/Todolist/show :)

redhead
Člen | 1313
+
0
-

to přepsání defaultních presenter/action je zmíněno o nějakou kapitolu dále, čili by stačilo to přesunout a nebo jak říkáte zmínit, že je to na adrese /Todolist/show

Petr44
Člen | 12
+
0
-

Dobrá, mám teď další otázku. Asi to bude opět znít jako blbost a ona to taky blbost bude, jenže problém je v tom, že nevím narozdíl od klasickýho php jak to v nette funguje, tak nevím kde hledat chybu :)
Dostal jsem se o část (nebo o dvě) dál, zkrátka k připojení s databází.
Při pokusu o zobrazení mi laděnka hned vyhodí.
DibiException
Dibi is not connected to database.
File: /var/www/TodoList/libs/dibi/dibi.php Line: 228
Line 228: throw new DibiException(‚Dibi is not connected to database.‘);

Zkrátka se to nechce připojit k mysql. Soubor config.ini mám takhle

[production < common]
; common database connection
database.driver = mysql
database.database = todolist
database.charset = utf8
database.lazy = TRUE
database.host = localhost
database.username = root
database.password = lokomotiva

[development < production]
; database options in development mode
database.profiler = TRUE
database.username = root
database.password = lokomotiva

Údaje jsou 100% správně, ale zkrátka nic. (údaje v dev i produkčním mám schválně stejně).
Kde ještě může být chyba?

Editoval Petr44 (21. 3. 2010 13:46)

redhead
Člen | 1313
+
0
-

A určitě ten config předáváš metodě connect?

dibi::connect(Environment::getConfig('database'));

(v posledním odstavci této podkapitoly https://doc.nette.org/…ting-started#…)

Editoval redhead (21. 3. 2010 14:04)

Petr44
Člen | 12
+
0
-

Chyba byla jinde :) Měl jsem špatně pojmenované soubory v /Models/, i když nechápu proč mi to psalo, že se dibi nemůže připojit, spíš to mělo psát chybějící modely :/ Ale to je jedno, vyřešeno :) Jak se dalo čekat, mám teď jiný problém. :)
V komentářích u toho článku někdo píše chybu „Class ‚TodoManager‘ not found“.
Mám uplně stejný problém. „TodoManager.php“ má stejný obsah jako je v příkladu a jmenuje se stejně. Přesto not found.
Vymazání tempu jak je psáno nepomohlo.

Omlouvám se za blbé otázky, s nette začínám a koukám že je to vážně celkem špatný, když už při quick startu mám někde jednu chybu za druhou. Už potřetí musím prosit radu, což je víc než sem za celou dobu mého programování potřeboval u klasického php :))

Editoval Petr44 (21. 3. 2010 14:27)

Mikulas Dite
Člen | 756
+
0
-

Zkontroluj jestli se tak jmenuje ta třída, jestli se vůbec načte (na to se můžeš kouknout v laděnce, je tam list načtených tříd).

A nezapomeň promazat temp…

Petr44
Člen | 12
+
0
-

Kde přesně to mám v laděnce hledat? (nikde není žádnej popis leděnky)
Jediný co by tak možná mohlo odpovídat (nevím jestli je to ono) by bylo Nette Application > Presenter, kde mám (mimo jiné) tohle

object(TodolistPresenter) (30) ▼ {
„todoManager“ private ⇒ NULL

Každopádně vše jsem dělal přesně podle quick start (každej kód ctrl+c/v), tudíž by nějaká chyba musela být tam.

Editoval Petr44 (21. 3. 2010 14:51)

22
Člen | 1478
+
0
-

tusim, ze tam je nekde kod ke stazeni, tak ho zkus stahnout a rozbalit…jestli se to rozjede

Mikulas Dite
Člen | 756
+
0
-

Petr44 napsal(a):

Kde přesně to mám v laděnce hledat?

Když rozbalíš Environment, vykoukne na tebe z tabu Included Files list všech načetlých souborů http://i43.tinypic.com/t9ihcp.jpg
Tam si kdyžtak překontroluj, jestli tam tvůj model je.

Editoval Mikulas Dite (21. 3. 2010 19:24)

Jan Endel
Člen | 1016
+
0
-

List načtených tříd je myslím jen v profileru. Ten se spustí jednoduše, doplníš do bootstrap.php řádek:
Debug::enableProfiler() a v aplikaci se ti v pravem dolnim rohu ukaze sikovne okynko kde budes mit napsane, jak dlouho se stranka vykreslovala, jake mas nactene tridy a spousty dalsich uzitecnych informaci ;), da se tam doplnit i dalsi veci. Ja trebas pouzivam jeste:
Debug::$counters['Last SQL query'] = & dibi::$sql; co ti zobrazi i posledni polozeny sql dotaz z dibi.

Mikulas Dite
Člen | 756
+
0
-

Načtené soubory ale bohatě stačí – co model to soubor (a ani jinak není problém to najít mezi ostatními).

Petr44
Člen | 12
+
0
-

Ne, v Included files soubor /models/TodoManager.php není.

Mimochodem, laděnka mi zobrazuje konkrétně tohle (nevím jestli z toho něco vyčtete)

Fatal Error
Class ‚TodoManager‘ not found

Source file:

File: /var/www/TodoList/app/presenters/TodolistPresenter.php   Line: 23
Line 16:
Line 17:        public function renderShow($showDoneTasks) {
Line 18:            $this->template->showDone = $showDoneTasks;
Line 19:        }
Line 20:
Line 21:        public function getModel() {
Line 22:            if(!isset($this->todoManager))
Line 23:                $this->todoManager = new TodoManager; //tenhle řádek laděnka označila
Line 24:
Line 25:            return $this->todoManager;
Line 26:        }
Line 27:    }
Line 28:

V call stack je tohle
<PHP inner-code> Debug:: _shutdownHandler ()

Soubor /models/TodoManager.php mi obsahuje uplně to stejné co je v quick start

A presenter TodolistPresenter.php osahuje uplně to stejné co je zde.

Soubory quick startu nikde bohužel ke stažení nejsou. Tedy jsou tam, ale hned na začátku, asi tak 4 kroky dozadu, takže tam probíraný model, nebo presenter vůbec nejsou.

Editoval Petr44 (21. 3. 2010 20:26)

Mikulas Dite
Člen | 756
+
0
-

No podle mě je to docela jasný, prostě Nette ten model nemůže najít. Smaž temp, zkontroluj si config.ini, jestli robotloader opravdu může tvůj model najít a zkontroluj práva pro čtení.

Petr44
Člen | 12
+
0
-

Temp sem zkoušel mazat prakticky furt (tedy obsah složky /app/temp/), config.ini mám na chlup stejný jako je zde (samozřejmě kromě údajů k databázím). Vše od složky /var/www/TodoList/ má práva ke čtení i zápisu, naprosto vše, soubory, složky, podsložky (i readme.txt :p)
Nechápu.

Jak poznám jestli bootloader může ten model najít?

Nemáte někdo na localhostu funkční hotovej quick start? Mohl bych ověřit jestli není problém v něm (třeba v něm na webu někdo něco upravil?), nebo mám něco špatně nastaveno třeba v apache,…

Editoval Petr44 (21. 3. 2010 21:22)

Mikulas Dite
Člen | 756
+
0
-

To je docela zvláštní. Zkus si ten model přidat natvrdo přes require_once, potom to skoro určitě pude a zaměříme se na RobotLoader.

EDIT: a můžeš zkusit dát do bootstrapu Debug::$strictMode = true;, mohlo by to vyhodit jestli tam není nějaké typo.

Editoval Mikulas Dite (21. 3. 2010 22:05)

Ola
Člen | 385
+
0
-

Přidal sem DL link do sekce o komponentě, zkuste to prosím.

https://files.nette.org/67/qs.zip

Petr44
Člen | 12
+
0
-

Po malé dovolené to opět řeším :)
Jak si mám konkrétně ten model „přidat natvrdo přes require_once“. Jak mám kam co napsat? :-)

Jinak to přepsání souborů z toho archivu od uživatele „Ola“ nepomohlo.

Mikulas Dite
Člen | 756
+
0
-

Petr44 napsal(a):
Jak si mám konkrétně ten model „přidat natvrdo přes require_once“. Jak mám kam co napsat? :-)

Úplně obyčejně,

require LIBS_DIR . '/CestaKTvemuModelu/NazevModelu.php';

No a když ti to hodí výjimku že to existuje (což se ale nestane, protože to by to potom fungovalo), tak už to robotloader načet.

Ola
Člen | 385
+
0
-

Petr44 napsal(a):

Po malé dovolené to opět řeším :)
Jak si mám konkrétně ten model „přidat natvrdo přes require_once“. Jak mám kam co napsat? :-)

Jinak to přepsání souborů z toho archivu od uživatele „Ola“ nepomohlo.

To, co jsem dal ke stažení fungovat musí, neboť to jede i veřejně na http://nette-quickstart.hys.cz