Zásek už při Quick startu (šablony)
- Petr44
- Člen | 12
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
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/cs/quickstart
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
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
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
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
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
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)
- Petr44
- Člen | 12
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)
- Petr44
- Člen | 12
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
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/cs/quickstart#…)
Editoval redhead (21. 3. 2010 14:04)
- Petr44
- Člen | 12
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
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
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)
- Mikulas Dite
- Člen | 756
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
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
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
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
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
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
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)
- Mikulas Dite
- Člen | 756
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
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