Nový Quickstart – diskuze

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

Konečně plním slib… Nette dostalo pod stromeček nový Quickstart! Prozatím se jedná o prvotní verzi, která navíc byla psána pod tlakem blížícího se deadline, takže prosím omluvte případné překlepy, chybky a další nedodělky.

Zatím pod každou kapitolou chybí aplikace ke stažení, umístím ji tam až po stabilizaci kódu. Také doplním sekce „Co si pamatovat“, které byly tak fajn na QS pro 0.9. Také ještě chybí poslední dvě kapitolky, které se budou zabývat routováním a nasazením aplikace do produkčního prostředí.

QS najdete v dokumentaci: https://doc.nette.org/cs/quickstart
Zdrojové soubory jsou k dispozici na Githubu: https://github.com/…/quick-start

Všechny vás nyní žádám o pomoc s tvorbou. Bylo by dobré, kdyby jste si celý QS prošli a zkusili si podle toho aplikaci napsat. Případné překlepy a podobně buď hlaste, nebo rovnou opravujte. Pokud narazíte na některé nesrovnalosti, nebo vám například bude chybět nějaká zmínka a měla by tam podle Vás být, tak taky hlásit. Pokud si myslíte, že by se něco mělo řešit jinak (já osobně jsem přeci jen poslední dobou Nette moc nesledoval a některé věci mám stále tendenci psát ve stylu starších verzí), tak do diskuze.

Předem všem moc děkuji za pomoc!

25. 2. 2012: QS byl dnes aktualizován. Vizte https://forum.nette.org/…tart-diskuze?p=2.

Editoval Panda (25. 2. 2012 17:21)

Darkry
Člen | 101
+
0
-

Projdu to a budu opravovat překlepy a i vytvářet současně tu aplikaci na Nette 2.0 Beta verzi, která je teď v Download.

Až to bude odladěný a přepsaný bylo by dobrý začít dělat na překladu do angličtiny, ale na to já si asi netroufnu :-)

Filip Procházka
Moderator | 4668
+
0
-

Máme opravy posílat na github, nebo si je tam „synchronizuješ“ sám?

Panda
Člen | 569
+
0
-

Ne, na github není nutné posílat, jednou za čas si to sesynchronizuji sám. Dokumentace v repository tam teď bude hlavně kvůli překladu Texy! → TeX → PDF.

Což mi připomíná, že bych mohl do úvodního postu hodit odkaz na zdrojáky…

Tomáš Votruba
Moderator | 1114
+
0
-

Pár myšlenek, jak to čtenáři usnadnit, tedy nezmiňovat historické verze, které se mohl kdysi taktéž naučit.

https://doc.nette.org/cs/quickstart

  • používal bych jednotný (kratší, novější, hežčejší) zápis: n:foreach
  • stejně tak na odkazy to samé, tedy místo href="{link Task: $list->id} bych použil: n:href="Task id => $list->id (teď nevím, jesli je to ‚id =>‘ potřeba)

Samo to záleží na tobě, co se ti líbí/víc vyhovuje :)

hrach
Člen | 1838
+
0
-

Nejsem zastáncem n:maker ve smyslu používat tam, kde jde. Používat, tam, kde to něco zpřehlední. Což se u foreache nejedná určitě, n:href imo taky ne, protože to editory nezvýrazní. (smarty je naopak často podporováno).

Darkry
Člen | 101
+
0
-

Stáhnul jsem verzi nette 2.0 beta ze stránek a v sandboxu v app/models je pouze soubor Authenticator.php, takže by to asi chtělo trochu přepsat část o modelech.

A teď jsem si všimnul, že config.neon je přesunut do app/config/config.neon

Editoval Darkry (23. 12. 2011 14:58)

RiskyNet
Člen | 20
+
0
-

Trochu na rychlo, ale zkusil jsem vytvořit Úkolníček. Při tom jsem narazil na drobnosti – předpokládám že se často jedná o rozdíly vývojových verzí ale přeci:

Začínáme > Složka app
- v sandboxu chybí soubor Model.php v adresáři models
- config.neon je v adresáři config

Vytvoření databáze a modelu > Nastavení připojení k databázi
- použita jiná struktura config.neon než je v sandboxu

Vytvoření presenteru > Šablona (1)
- píše se „V šabloně default.latte máme nyní k dispozici proměnnou $list“ ale v sekci „Spojení s modelem“ je $this->template->tasks

Tady se možná jedná o mou neznalost/chybu, ale jel jsem podle postupu a začátečníka může zmást. V šabloně:

  • $task->created vyvolává error: htmlspecialchars() expects parameter 1 to be string, object given
  • $task->created|date:‚j. n. Y.‘ už je ok

Vytvoření presenteru > Šablona (2)
překlep „Ve složce templates vytvoříme podložku Task“

Po dokončení „Navigace“ error:
Nette\MemberAccessException > Cannot write to an undeclared property TaskPresenter::$taskList

a tady jsem se zasekl a už není čas takže pokračovat budu zítra :)

Ještě drobnost při vytváření TaskPresenter se popisuje:
$this->template->tasks = $this->taskList->related(‚task‘)->order(‚created‘);

později v laděnce je ale vidět, že řadíš dle id, to možná může být taky matoucí když bych hledal kde podle id řadím.

edit: btw klidně i opravím co vím ale ted už musím fakt letět :)

Editoval RiskyNet (23. 12. 2011 15:06)

Panda
Člen | 569
+
0
-

Díky, sandbox byl v posledních dnech opraven a já na to nestačil zareagovat. Během dneška opravím.

Filip Procházka
Moderator | 4668
+
0
-

Taky jsem malinko přispěl tuhle a táhle opravičkou :P

Zkuste místo vypisování co je špatně, to jít rovnou opravit. Když to opravíte a bude to pořád špatně, tak vám to milerád smažu, takže se není čeho bát :) :P

Editoval HosipLan (23. 12. 2011 15:57)

Panda
Člen | 569
+
0
-

RiskyNet napsal(a):

Ještě drobnost při vytváření TaskPresenter se popisuje:
$this->template->tasks = $this->taskList->related(‚task‘)->order(‚created‘);

později v laděnce je ale vidět, že řadíš dle id, to možná může být taky matoucí když bych hledal kde podle id řadím.

Screeny prosím berte trochu s rezervou, aplikaci jsem postupně psal a zpětně jsem dělal některé změny, které jsem pak nepřescreenovával. Toto je jedna z nich.

Panda
Člen | 569
+
0
-

RiskyNet napsal(a):

Po dokončení „Navigace“ error:
Nette\MemberAccessException > Cannot write to an undeclared property TaskPresenter::$taskList

Do jakého souboru jsi psal uvedenou actionDefault? Do QS jsem doplnil, že se změna týká TaskPresenteru…

Mimochodem, tutoriál by nyní měl adresářovou strukturou sedět i na aktuální sandbox. Snad jsem na nic nezapomněl…

Tomáš Votruba
Moderator | 1114
+
0
-

hrach napsal(a):

Nejsem zastáncem n:maker ve smyslu používat tam, kde jde. Používat, tam, kde to něco zpřehlední. Což se u foreache nejedná určitě, n:href imo taky ne, protože to editory nezvýrazní. (smarty je naopak často podporováno).

Myslím, že způsob inner, o kterém jsem dříve nevěděl, tuto nepřehlednost řeší.
A zvýrazňování jsem bral jako samozřejmost, protože to tak mám. Je otázkou, jestli je lepší nepoužívat nic, co můj editor nezvýrazňuje, nebo si to raději dopsat. :)

peane
Člen | 16
+
0
-

Ježiš to je super. Díky moc za nový quickstart.

Semik
Backer | 135
+
0
-

V šabloně Task\notfound.latte ve {var $title 'Nenalezeno'} chybí rovnítko.

Panda
Člen | 569
+
0
-

Díky! Opravil jsem to i na githubu.

spidy
Člen | 55
+
0
-

Nemělo by se místo $this->setView('notFound'); používat spíš něco jako throw new Nette\Application\BadRequestException;?

bojovyletoun
Člen | 667
+
0
-

Taky by to šlo. Tady to chápu jako , a) méně důraznou informaci o tom, že stránka (nebo spíš to nazvat „záznam“) neexistuje, b) třeba (generická) hláška z errorpresenteru by se tady nehodila, tak ji nahradím vlastní.

Jinak návod je pěkný, akorát jediné co mě napadlo, je v části o komponentách upozornit na nutnost psát malé mpísmeno v v šabloně.

Ještě jeden poznatek: stránka se mi načítala přes sekundu, frusrovalo mě to, tak jsem se pomocí wincachegrind( který se hodí spíš pro rychlou konkrétní analýzu než kcachegrind) doklikal k PDO::connect, a vzpomněl si na starý problém, že host:localhost zpomaluje. Tak jsem to nahradil 127.0.0.1 a jede to OK. Pravá příčina ale byla v chybějícím řádku 127.0.0.1 localhostc:\Windows\System32\drivers\etc

Filip Procházka
Moderator | 4668
+
0
-

spidy napsal(a):

Nemělo by se místo $this->setView('notFound'); používat spíš něco jako throw new Nette\Application\BadRequestException;?

V tomhle případě výjimka není použita záměrně, protože nechceme uživatele posílat tam, kde slunce nesvítí, ale chceme mu přesně říct co je špatně. V podstatě je to takový vstřícnější ErrorPresenter.

Radimorous
Člen | 30
+
0
-

Pro začátečníky by bylo dobré doplnit do textu, že při editaci confing.neon je třeba dát pozor na mezery a tabulátory. Když tam budou připisovat registraci služby model, tak se u toho dá celkem na dlouho seknout.

Radimorous
Člen | 30
+
0
-

Můžu se zeptat, na kdy je přibližně plánováno dokončení Quick Startu? My úplní začátečníci v Nette jistě velmi oceníme jakýkoliv posun, protože aktuálnost tutoriálů je asi největší slabina celého frameworku, když vždycky pár řádků kódu řešíme půl dne…

Panda
Člen | 569
+
0
-

Dokončení? V jakém smyslu? Chybí Ti poslední dvě kapitoly? Ty budu dopisovat někdy během následujících 14 dnů. Jádro tutoriálu by ale nyní mělo být hotové a mělo by se podle něj jít v pohodě řídit. Pokud ne, tak prosím sepiš konkrétní místa, která Ti přijdou nedokončená a nejasná a něco s tím uděláme.

Co se aktuálnosti týče, tak to bylo také myšleno na QS? Ten by měl reflektovat poslední nightly buildy, pro jistotu jsem dneska upravil poznámku o revizi, byly tam 2 commity navíc, které QS ale nijak neovlivňovaly.

Předem díky za jakoukoliv zpětnou vazbu!

Radimorous
Člen | 30
+
0
-

Panda napsal(a):

Dokončení? V jakém smyslu? Chybí Ti poslední dvě kapitoly? Ty budu dopisovat někdy během následujících 14 dnů. Jádro tutoriálu by ale nyní mělo být hotové a mělo by se podle něj jít v pohodě řídit. Pokud ne, tak prosím sepiš konkrétní místa, která Ti přijdou nedokončená a nejasná a něco s tím uděláme.

Co se aktuálnosti týče, tak to bylo také myšleno na QS? Ten by měl reflektovat poslední nightly buildy, pro jistotu jsem dneska upravil poznámku o revizi, byly tam 2 commity navíc, které QS ale nijak neovlivňovaly.

Předem díky za jakoukoliv zpětnou vazbu!

Zrovna jsem začal s Nette náhodou 25.12, takže jsem byl nejspíš mezi prvními začátečníky, kteří se učili podle nového, díky za to :) Za každou kapitolu by se hodilo dát aktuální zdrojáky, ale není to must, spíše jen nice to have… A těším se na dokončení kapitoly s routováním, zrovna jsem se totiž u toho celkem sekl, když si chci napsat blog bez dibi, tak nevím, jak zprovoznit routování (ale to sem nepatří, dotaz jsem dal v sekci začátečníci). Ještě jednou díky za tvorbu tutoriálů, protože kvalitní tutorialy přispějí k šíření Nette. Pár známých bohužel nemělo nervy na bordel v tutorialech a šlo na Zend, tak snad se to s novým Quick startem obrátí.

Ot@s
Backer | 476
+
0
-

Radimorous napsal(a):
… Pár známých bohužel nemělo nervy na bordel v tutorialech a šlo na Zend …

Právě pro „slabinu“ v dokumentaci vznikla kolem Nette taková silná a kvalitní komunita. Kdo „vydržel“, tak tomu většinou propadl a má hlubší znalosti díky nutnosti jít více do hloubky, poprat se s tím sám – prostě vydržet a nevzdát to.

Panda
Člen | 569
+
0
-

Radimorous napsal(a):

Za každou kapitolu by se hodilo dát aktuální zdrojáky, ale není to must, spíše jen nice to have…

Určitě budou, na začátek jsem je ale záměrně nedával, protože aktualizovat při každé změně několik archivů by bylo nad síly všech zúčastněných a mít tam neaktuální zdrojáky se mi také nechce.

Momentálně to chce hlavně vyřešit, co se třídou Model. Rád bych celou modelovou vrstvu trochu refactoroval, aby se v komponentách a presenterech neoperovalo přímo s objektem typu Nette\Database\Table\Selection, ale nevím přesně, jak na to.

Řešení zmíněné v tématu o routách (https://forum.nette.org/…uty-bez-dibi#…) se mi nelíbí trošku v tom, že Nette\Database\Table\Selection si udržuje sestavený dotaz i po jeho vykonání, takže zděděná třída, která nadefinuje metody get*, pak musí být vytvořena jen za účelem volání té jedné jediné metody. Pokud nad již vytvořeným objektem zavolám nějaký další get*, tak se dotaz připojí k předchozímu a v lepším případě se vrátí špatné výsledky, v horším SQL error.

Přejmenování takových metod na where*, aby to „padlo do věty“, jak navrhoval HosipLan na dnes na nette@conf.netlab.cz, podle mě úplně nevystihuje podstatu get funkce.

Co myslíte? Jak ideálně trochu poupravit model, abychom se vyhnuli přímému sestavování dotazu pomocí Nette\Database\Table\Selection přímo v presenterech a komponentách, případně jej alespoň omezili?

David Grudl
Nette Core | 8229
+
0
-

Především: díky moc za hromadu odvedené práce na Quick startu! Takový čin zůstane nezapomenut a v budoucnu za něj sklidíš ještě spoustu neoprávněné kritiky :-))

K třídě Model: její existence je poněkud nešťastná, protože málokdo si umí pod slovem model představit cokoliv konkrétního, takže ani netuší, k čemu takové třída slouží. Dříve v sandboxu sloužila jako vstupní a inicializační bod modelu, což je věc, kterou plně nahradilo DI. Bylo by tedy vhodné DI naplno využít i v QS.

Samozřejmě je otázka, jak takové DI lidem podat. Sám s tím ze školení zatím moc zkušeností nemám, ale snažím se k tomu přistupovat stejně jak třeba k MVC, tj. žádné MVC nevysvětlovat, neplést tím zbytečně lidem hlavu, a jít přímo k věci. Nechci, aby lidé používali určité postupy proto, že to někdo říkal na školení, nebo proto, že „tak je to přece správné“, ale aby věděli, že to má konkrétní smysl. Na školeních k DI „přijdu“ až po sérii nešikovným pokusů, kdy se potřebujeme v autorizátoru dostat k databázi.

S tím trošku souvisí i používání Table\Selection v presenteru a komponentách. Spousta lidí tady na fóru bude hlasitě namítat proti volání SQL dotazů přímo v kódu presenteru, ale jen málokdo z nich to bude schopen i obhájit (třeba před Jakubem Vránou). Chytře navržený kód totiž používá odpovídající míru abstrakce. U triviálních aplikací může být skutečně pragmatické SQL v presenteru použít.

Framework se ale spíš využívá pro netriviální aplikace, kde se už nějaká další vrstva vyloženě hodí. Univerzální vrstvou mezi databází a vlastním kódem je právě Table\Selection. V případě jednodušších aplikací se dá velmi výhodně používat v presenteru a šablonách. V případě složitějších aplikací v modelu.

Nicméně, samotný QS a značná část aplikací tvořených v Nette bude patřit právě do ranku těch „jednodušších“, proto bych se jeho použití nebál, naopak předvedl všechny výhody. Teprve nakonec mohou být naznačeny metody vhodné pro vyšší level aplikací.

mrataja
Člen | 57
+
0
-

Ahoj, upřímné díky za QS. Rád bych se zeptal:
1.) Pokud budu chtít využít více modelů než jen použitý Model.php, budu je rovněž definovat jako službu v config.neon?

2.) V BasePresenteru jsme vytvořili metodu beforeRender, která tahá data pro navigaci. Pokud ji vytvořím ve startup metodě, chová se to stejně. Nezáleží tedy na tom, jestli je tahám ve startupu nebo v beforeRender?

3.) Při změně stavu tasku (metoda handleMarkDone) bych rád dostal informaci do snipettu, že se to povedlo/nepovedlo. Přidání $this->flashMessage(‚msg‘) nepomohlo. Jak na to?
Musí být $this->presenter->flashMessage(‚Změna stavu byla úspěšná.‘);

4.) Možná by se někomu hodilo jako mě, zvýraznit aktivní menu

<ul n:inner-foreach="$taskLists as $list">
	<li {ifCurrent Task: $list->id}class="current"{/ifCurrent}>
		<a href="{link Task: $list->id}">{$list->title}</a>
	</li>
</ul>

v css doplnit

div.task-lists .current a{
  color: #333;
  border-bottom-color: #555;
}

Editoval mrataja (27. 12. 2011 20:44)

Tomáš Votruba
Moderator | 1114
+
0
-

mrataja napsal(a):

<ul n:inner-foreach="$taskLists as $list">
	<li {ifCurrent Task: $list->id}class="current"{/ifCurrent}>
		<a href="{link Task: $list->id}">{$list->title}</a>
	</li>
</ul>

Lépe:

<ul n:inner-foreach="$taskLists as $list">
	<li n:class="item, $presenter->linkCurrent ? current"> <!-- umožňuje další třídy -->
		<a href="{link Task: $list->id}">{$list->title}</a>
	</li>
</ul>
Patrik Votoček
Člen | 2221
+
0
-

Schmutzka napsal(a):

Lépe:

<ul n:inner-foreach="$taskLists as $list">
	<li n:class="item, $presenter->linkCurrent ? current"> <!-- umožňuje další třídy -->
		<a href="{link Task: $list->id}">{$list->title}</a>
	</li>
</ul>

Špatně!

$presenter->linkCurrent totiž ověřuje aktuálnost naposledy generovaného linku. A jelikož se zde link generuje až na dalším řádku bude se tedy ověřovat link z předchozí iterace nikoli stávající.

Správně je to tedy:

<ul n:inner-foreach="$taskLists as $list">
	<li n:class="item, $presenter->isLinkCurrent('Task:', array($list->id)) ? current">
		<a href="{link Task: $list->id}">{$list->title}</a>
	</li>
</ul>
bojovyletoun
Člen | 667
+
0
-

Do handlemarkdone vložit $this->presenter->flashMessage("Změna stavu byla úspěšná."); pro potvrzení odškrtnutí.
Dál bych refactrotoval
$this->model->getTasks()->where(array('id' => $taskId))->update(array('done' => 1));
na $task->update(array('done' => 1))

Myslím, že by bylo i vhodné dát do tutoriálu jakési cvičení.

Mohla by to být další kapitola a v ní tyto drobé úkoly – jak ostatně vyplynulo odsud

  • zvýraznění akutálního projektu. (n:class=islinkcurr...)
  • zprávička pro potvrzení odškrnutí tasku
  • možnost smazat task
  • možnost smazat task, byl li dokončen.

Někde dál by mohlo být řešení. Případně by toto mohlo být jako další kapitola „drobné úpravy“.

Zkusím to napsat a přidat.

Editoval bojovyletoun (28. 12. 2011 19:02)

Panda
Člen | 569
+
0
-

bojovyletoun napsal(a):

Zkusím to napsat a přidat.

Je to zajímavý nápad, zatím to ale piš někam bokem. Některé věci, například ty flash zprávičky z komponenty, by měly asi být řešeny přímo v QS. Navíc na některé věci, které se Tobě zdají samozřejmé, začátečník vůbec nepřijde, protože nemá přehled. Cvičení by třeba vyřešil, ale asi by to nebylo moc v duchu Nette. Smyslem QS by mělo být začátečníkovi některé „best practice“ naservírovat rovnou na talíř, aby si na ně zvykl a zbytečně si nekomplikoval život.

Co se dalšího rozšiřování týče, tak mám v hlavně několik myšlenek na další rozšiřující tutoriály. Teď je ale hlavní doladit základní QS, až pak bych se bavil dál.

Tomáš Votruba
Moderator | 1114
+
0
-

Patrik Votoček napsal(a):

Pravda, bral jsem to jako položky v menu, přehlédl jsem ta id. Díky za opravu.

err
Člen | 77
+
0
-

jako uplny zacatecnik s nette podle tutorialu jedu a mam par poznamek neznaleho, seznamujiciho se cloveka:

– u struktury adresaru prosim dopsat pozadovana opravneni pro /temp a /log . jsou sice popsana dale v textu (po nacteni titulni stranky), ale pokud jsou prava nenastavena, server zahlasi nicnerikajici chybu 500 a nebylo intuitivni presto pokracovat v navodu a narazit na poznamku, ktera prava vysvetluje.

– Vytvoreni DB OK

– Model – zminka o vytvoreni noveho souboru Model.php v adresari model a tridu vlozit do nej. U funkci getTask, getTaskList atd. prosim dopiste, ze jsou to funkce teze tridy.

– Setup OK, authentizace take OK

– Presentery – zde jsem zmateny. Sice je nejdrive ukazan a HomepagePresenter, ale nasledujici modifikace mi jasne nejsou:
* spojeni s modelem – „Pro pohodlnější přístup si připravíme v presenteru atribut $model.“
Pokud jsem vlozil dle navodu a upravil funkci renderDefault, server po uprave default.latte hlasi opet chybu 500

pokud jsem pochopil navod, ma to vypadat takhle:

class HomepagePresenter extends BasePresenter
{
	/** @var Model */
	private $model;

	public function startup()
	{
    		parent::startup();
    		$this->model = $this->getService('model');
	}

	public function renderDefault()
	{
    	$this->template->tasks = $this->model->getTasks()
                ->where(array('done' => false))->order('created ASC');
	}
}

No a dal jsem se zatim nedostal. Ted zjistuji jak pustit debug. V logu serveru nic nemam.


Take by nebylo spatne projekt vystavit, cimz by vetsina dotazu odpadla. stacilo by se jen podivat.

Editoval err (30. 12. 2011 16:52)

Panda
Člen | 569
+
0
-

Pro vynucení debug módu si v bootstrap.php uprav řádek s Debugger::enable takto:

Debugger::enable(FALSE);

(FALSE – vývojový režim, TRUE – produkční prostředí, neuvedeno – autodetekce podle IP adresy, současné Nette považuje za vývojové jen localhost, je také možné zadat seznam IP adres jako pole)

Od pohledu v uvedeném kódu žádnou chybu nevidím, takže by výstup z laděnky moc pomohl. Díky!

Doplněno 16:57:

err napsal(a):

Take by nebylo spatne projekt vystavit, cimz by vetsina dotazu odpadla. stacilo by se jen podivat.

On vystavený je, viz první příspěvek tématu. Po odladění chyb bude pod každou kapitolou ke stažení aplikace ve stavu, v jakém by měla být na konci dané kapitoly. Tutoriál by ale měl být srozumitelný i bez toho, aby člověk musel koukat do zdrojáků, proto jsem teď záměrně odkaz na github hodil jen sem.

Editoval Panda (30. 12. 2011 16:58)

err
Člen | 77
+
0
-

dal jsem ti screen do mailu

22
Člen | 1478
+
0
-

Panda napsal(a):

(FALSE – vývojový režim, TRUE – produkční prostředí, neuvedeno – autodetekce podle IP adresy, současné Nette považuje za vývojové jen localhost, je také možné zadat seznam IP adres jako pole)

..nevím, jak jinde, ale poslední dev verze pole nežere, akorát string oddělenný čárkami…

Jan Tvrdík
Nette guru | 2595
+
0
-

Panda wrote:

Pro vynucení debug módu si v bootstrap.php uprav řádek s Debugger::enable takto:

Debugger::enable(FALSE);

Lépe je použít konstantu:

Debugger::enable(Debugger::DEVELOPMENT);
err
Člen | 77
+
0
-

Oboji je funkcni v tom smyslu, ze se mi ukaze debug bar. Nicmene to stale hazi chybu 500 a ladenka nevyskakuje. Cache ?. V /log/error.log mam :[2011–12–30 20–21–38] Nette\DI\MissingServiceException: Service ‚model‘ not found. in /muj_web_adresar/libs/Nette/DI/Container.php:159 @ http://muj_web/www/ @@ exception-2011–12–30–17–07–12–70048f45eb99cc80b12dc7a58aa280dc.html


V souboru /app/config/config.neon dle navodu mam:
model: Model( @database )
authenticator: Authenticator( @model::getUsers() )


v /app/models jsem vytvoril Model.php s tridou class Model extends Nette\Object a jejimi funkcemi dle navodu


/app/presenters/HomepagePresenter.php viz. vyse


bootstrap.php :
// Enable Nette Debugger for error visualisation & logging
Debugger::$logDirectory = __DIR__ . ‚/../log‘;
Debugger::$strictMode = TRUE;
Debugger::enable(Debugger::DEVELOPMENT);


Checker mi dava vse OK. Pouzivam Apache / mod_php


err
Člen | 77
+
0
-

Diky rade uzivatele Panda je po smazani cache ladenka funkcni ! Dekuji.

Editoval err (30. 12. 2011 21:05)

err
Člen | 77
+
0
-

Takze vse otazka cache. Dekuji za rady. Abych pokracoval v pripominkach, hned bych tento stav zminil :-) pro zacatecnika to neni samostatne resitelne. Take bych se primlouval o pridani zakomentovanych radku pro spusteni debugeru do sandboxu. Tohle je myslim zcela zasadni funkce, ktera by mohla mit vyjimku.

Jeste jednou diky za pomoc, jdu prochazet navod dal. Napisu vysledek.

Panda
Člen | 569
+
0
-

err napsal(a):

Takze vse otazka cache. Dekuji za rady. Abych pokracoval v pripominkach, hned bych tento stav zminil :-) pro zacatecnika to neni samostatne resitelne.

Většina začátečníků má server umístěn na localhostu, takže u nich se chyby neprojeví. Přidal jsem ale do QS poznámky, kdyby se s tím někdo setkal.

Jak jsem zmiňoval v mailu, zkusím vymyslet nějaké jednotnější řešení pro detekci prostředí, aby se nemusel Configurator a Debugger nastavovat zvlášť.

Jan Tvrdík: Jinak díky za upozornění na konstanty Debugger::DEVELOPMENT a Debugger::PRODUCTION, když jsem to psal, tak jsem si vůbec neuvědomil, že tam jsou. :-) V QS opraveno.

Editoval Panda (30. 12. 2011 21:56)

err
Člen | 77
+
0
-
Dokonceni navodu
TaskPresenter – zalozeni a napln pochopitelne bez potizi, kvituji odkaz na adresar kam patri
po manualnim doplneni Projekt A a Projekt B do databaze, link u Projekt A odkazuje na /www/%EF%BB%BF/www/task/default/1 a Projekt B na /www/task/default/2 (to je asi jiz spravne), nicmene zadny z odkazu neni v teto fazi funkcni . Ani u jednoho, ani u default/3 nevyskakuje ladenka, ale objevi se standardni hlaseni apache Not Found – The requested URL /www//www/task/default/1 was not found on this server.

Vyzkousel jsem vsechny zapisy <ul><li n:foreach …


Panda
Člen | 569
+
0
-

Poprosil bych o celý kód šablony, první odkaz je divný.

Druhý odkaz nefunguje kvůli tomu, že na serveru nemáš povolený mod_rewrite. A pokud máš, tak nejde nastavovat v .htaccess, tzn. v konfiguraci Apache je špatně AllowOverride (měl by být nastaven na All).

Editoval Panda (30. 12. 2011 23:46)

err
Člen | 77
+
0
-

Je to tak. Doplnil jsem do virualu a je to OK. Omlouvam se tedy. pro poradek: doplnil jsem do rootu Virtual serveru RewriteEngine On a do Directory AllowOverride All . Struktura tedy vypada :

<VirtualHost *:80>

RewriteEngine On
<Directory />
AllowOverride All
</Directory>
</VirtualHost>

---
Odkaz: /www/%EF%BB%BF Zpusoboval BOM (chyba take na me strane)
 ---

Editoval err (31. 12. 2011 0:00)

Panda
Člen | 569
+
0
-

RewriteEngine On ve virtuálu být nemusí. Je již povolený v .htaccessu ze sandboxu.

err
Člen | 77
+
0
-

Pozoruji, ze znehodnocuji tema fora, takze me prispevky pak prosim klidne smazte. Diky!

Jan Tvrdík
Nette guru | 2595
+
0
-

Následují drobnosti, kterých jsem si všiml při čtení první kapitoly QS.

  • podivná formulace „toto ukládání chybových hlášení…“
  • podivný termín „data sezení“
  • podivný spojení „prostředí Nette“
  • místo document root použít document root nebo DocumentRoot
  • podivná formulace „nastaví mechanismus automatického načítání jednotlivých částí Nette až v případě jejich potřeby“
  • podivné spojení „Nette tříd“
  • podivná formulace „jméno presenteru, který se bude vykonávat“
err
Člen | 77
+
0
-

Formulare

– Formular pro zadani ukolu je OK
 – Formular pro vytvoreni seznamu ukolu hlasi chybu. Resp BasePresenter, radek 29 . Vyreseno pridanim use Nette\Application\UI\Form; na zacatek souboru BasePresenteru . Mozna by mohlo byt zmineno.

err
Člen | 77
+
0
-

Komponenty

– rozchazi se kod funkce createComponentTaskList() ; V komponentach je pouze:

return new TaskList($this->taskList->related('task')->order('created'));

a zrejme by melo byt tak, jak je predtim

return new TaskList($this->taskList->related('task')->order('done, created'));

Editoval err (31. 12. 2011 16:11)

err
Člen | 77
+
0
-

Signaly

  • TaskPresenter / Funkce createComponentTaskList() – chybi druhy argument konstruktoru . Chyba nevyvola ladenku, ale server error 500.

Oprava:

protected function createComponentTaskList()
{
    return new TaskList($this->taskList->related('task')->order('done, created'), $this->model);
}