Minimalistický quickstart

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

Ahoj, pro účely výuky jsem včera dopsal extrémně jednoduchou quickstart ukázku, původně určenou jako učební pomůcku na IIVOS. Při psaní byla snaha používat jen minimum fičur, těch nejdůležitějších, o kterých se snadno dočteš v dokumentaci.
Nicméně, jestli k tomu vznikce i quickstart návod, to nemohu slíbit. Bude záležet na studentech, pro které to je psané :)

Proto zatím zakládám toto vlákno, kde mohu odpovídat na vaše dotazy a zůstane všechno pěkně pohromadě. Prosím, nepište dotazy, které se netýkají přímo kódu v ukázkách (takové dotazy patří do sekce začátečníci). Problémy s rozběhnutím aplikace sem klidně pište, aspoň budu vědět na co se zaměřit při psani návodu.

Zároveň sem můžete psát podněty na další, ale jednoduché a základní funkce, které by měl projekt obsahovat. Stále by to ale měl být extrémně jednoduchý tutorial pro naprosté začátečníky.


  • Jede na Nette 2.2, zkusím ho udržovat aktualizovaný. (Zda se mi to daří prozradí stáří posledního commitu.)
  • Ledacos napoví i seznam commitů, text by jen tento seznam sledoval a komentoval.
  • V readme jsou popsané jednotlivé body, kterým odpovídají i otagované verze, které je možné stáhnout samostatně.

K rozběhnutí jen několik poznámek:

  • Vycházím ze Sandboxu, který předpokládá použití composeru. Knihovny proto nejsou verzované a pokud máte composer nainstalovaný, stačí updatovat závislosti a ony se dotáhnou samy. Pokud composer nemáte a nechcete, pak si zkopírujte aktuální Nette do adresáře /vendor (ideálně celý vendor ze Sandboxu).
  • Verzovaný také není soubor config.local.neon, tento soubor musíte vytvořit zkopírováním z ukázkového config.local.example.neon (je to z toho důvodu, aby v repozitáři nebylo nastavení pro žádný konkrétní stroj a při práci s gitem se pak toto nastaveni nepřepisovalo ostatním).
  • Soubor s ukázkovou databází najdete v adresáři app/model

Editoval Šaman (22. 5. 2014 5:27)

Michal Vyšinský
Člen | 608
+
0
-

Dobrá práce!

Jen pár poznámek:

  • udělal bych to instalovatelné přes create-project (čili změnil název projektu)
  • ty poznámky k rozběhnutí bych dal do readme
  • to ‚pokud composer nemáte…‘ bych úplně vyhodil, protože IMO je dnes composer must-have pro php vývojáře
Majkl578
Moderator | 1364
+
-2
-

Proč je to česky?

Šaman
Člen | 2659
+
0
-

Majkl578 napsal(a):

Proč je to česky?

Protože já, i všichni studenti kterým je určen, jsme češi. Je-li nějaký kód od čecha pro čechy, proč by měl být komentován anglicky, když čeština představuje menší bariéru a UTF řeší i diakritiku?

Kód samotný je samozřejmě anglicky, žádné vulgarismy jako setPoloměr($r), nebo dokonce dejUživatel() tam nejsou…

Šaman
Člen | 2659
+
0
-

Michal Vyšinský napsal(a):

Dobrá práce!

Jen pár poznámek:

  • udělal bych to instalovatelné přes create-project (čili změnil název projektu)
  • ty poznámky k rozběhnutí bych dal do readme
  • to ‚pokud composer nemáte…‘ bych úplně vyhodil, protože IMO je dnes composer must-have pro php vývojáře
  • create-project : možná tu verzi, která obsahuje vyčištěný Sandbox, tedy Skeleton. Ale ten mám rozpracovaný samostatně a některé věci tam mám jinak, než je defaultním nastavení Nette, proto to není vhodné pro nováčky.
  • asi založím vedle dalši verzovaný soubor, kam napišu poznámky a případně odpovězené dotazy odtud, třeba z toho časem vznikne ta dokumentace. Nevo spíš GitHub wiki.
  • Composer je must have pro vývojáře, ale neměl by být vstupní bariérou k vyzkoušení frameworku. Pokud uživatel během pár minut může dělat první pokusy v Nette a zalíbí se mu to, composer si doinstaluje. Když se nejdřív zasekne na composeru, zanevře i na framework.
Majkl578
Moderator | 1364
+
-7
-

Šaman napsal(a):

Protože já, i všichni studenti kterým je určen, jsme češi.

Učíš desetileté děti, které neumí anglicky? To mi přijde jako podobné jako „bastlím, protože lidé, kterým je to určeno, bastlí také“. :)

Je-li nějaký kód od čecha pro čechy, proč by měl být komentován anglicky, když čeština představuje menší bariéru

To jsi ovšem nenapsal a vzhledem k tomu, že jsi to vystavil tady jako „prostě quickstart“, přišlo mi to nevhodné, vzhledem k faktu, že je snaha Nette dokumentovat a prezentovat primárně v angličtině. Určitě by to bylo fajn, pokud z toho má benefitovat co nejvíc lidí (a právě zahraniční mají větší poznávací bariéru).

Kód samotný je samozřejmě anglicky

Ještě aby ne. Psát kód česky učí snad jen blázni na VŠE. Nicméně texty hlášek apod. nejsou.

Šaman
Člen | 2659
+
+5
-

Ale zveřejnil jsem to na českém fóru v češtině, takže kdo neumí česky, ani se k tomu neprokliká. Chápu, že je snaha dělat dokumentaci v angličtině, ale tohle nemá být součást dokumentace. Hážu to sem jen proto, že je to nad aktuálním 2.2 frameworkem a funguje to. Nejsou tam programátorské prasárny, ale snaha o best practise. A protože jsem ochoten odpovídat nováčkům, kteří by s tímhle kódem měli nějaké záseky. Oficiální quickstart se mění a s některými kusy kódu moc nesouhlasím (jestli se to zase nezměnilo).
A hlavně, i když pravděpodobnost dokončení textového návodu je tak 1:3, jestli budu psát jakýkoliv souvislý text, nejsem schopný ho napsat v uspokojivé kvalitě v angličtině. A bastlit ho v infinitivech nechci.
Asi jsem měl zdůraznit, že jde o soukromý projekt, který z výše uvedených důvodů zveřejňuji, protože třeba se někomu bude hodit. Další věc, která by v oficiálním návodu vadila je maličko odlišný (roztahanější) coding standard.

P.S. Ono se někde učí psát kód česky? To jakože najdiUživatelePodleEmailu();? Já to psal jen jako vtípek nakonec :)

Ondřej Brejla
Člen | 746
+
+4
-

Šamane nenech se od Majkla vytrolit (já vím, že to myslí dobře) ;) Je to učební materiál, tak si to strukturuj tak, aby to bylo pro studenty co nejjednodušší k pochopení a pro tebe co nejjednodušší k vysvětlení :)

mrataja
Člen | 57
+
+1
-

Já bych se do návodu klidně pustil a to z toho důvodu, že jsem téměř začátečník a moc rád bych se dozveděl jestli vůbec i ty úplné základy dělám správně nebo ne.

Čamo
Člen | 798
+
0
-

Zdravím,
Ja som akurát s nette začal, tak hľadám všetky možné iformácie. Toto mi ale pripadá až moc jednoduché. Ja ako začiatočník by som skôr uvítal, keby sa buď rozšíril quickstart(napr. Moduly),alebo dokumentácia.

Oli
Člen | 1215
+
0
-

Šaman napsal(a):
P.S. Ono se někde učí psát kód česky? To jakože najdiUživatelePodleEmailu();? Já to psal jen jako vtípek nakonec :)

No jasně :-D
Rudolf Pecinovský je velký guru česky psanýho kodu, viz: např.: http://vyuka.pecinovsky.cz/…_Predmet.htm. Na základku dobrý, ale že se to takhle učí na vysoký škole…

Šaman
Člen | 2659
+
+2
-

IMistnost extends IPojmenovany – myslím, že to mi jako ukázka stačilo. Budu mít noční můry.

Čamo napsal(a):

Zdravím,
Ja som akurát s nette začal, tak hľadám všetky možné iformácie. Toto mi ale pripadá až moc jednoduché. Ja ako začiatočník by som skôr uvítal, keby sa buď rozšíril quickstart(napr. Moduly),alebo dokumentácia.

Chápu a asi jsem to špatně pojmenoval. Tohle není oficiální QuickStart, ale vzorový, úplně minimalistický projektík k vyzkoušení práce v Nette a NDbT. Vznikl jako učební pomůcka a zajímavý by na tom mohla být jedině historie. Každou fičuru jsem nejdřiv nabastlil do presenterů (jako ukázku minimálního úsilí jak něčeho dosáhnout) a následující commit je refaktoring – oddělení modelu, uhlazení a přespání na best practise.

Starý oficiální QS (aplikace Todolist) měl problém, že se nedal snadno rozběhnout. Tak jsem zveřejnil tohle, nad aktuálním Nette, ať je nějaká alternativa. Pak jsem zjistil, že už delší dobu je QS kompletně přepsaný, takže tohle asi ztrácí význam.

Jan Suchánek
Člen | 404
+
0
-

@Šaman: Koukal jsem že používáš:

$form->addHiden("id");

je to lepší, než přez url?

Editoval jenicek (12. 6. 2014 11:49)

Hurass
Člen | 114
+
+1
-

@jenicek:
Můžeš použít oboje zároveň. Ve formuláři to používám, abych věděl zda například uživatele vytvářím, nebo edituji a pokud edituji, hned vím koho.

Jan Suchánek
Člen | 404
+
0
-

@Hurass: Máš i nějaký fajn příklad jak to kombinuješ?

Čamo
Člen | 798
+
0
-

Šaman
A existuje nejaký dôvod prečo sa quickstart nerozvíja? Aspoň nejaká komponenta a práca s ňou alebo routovanie tam zúfalo chýba.

Editoval Čamo (12. 6. 2014 14:26)

mrtnzlml
Člen | 140
+
+1
-

Čamo napsal(a):

A existuje nejaký dôvod prečo sa quickstart nerozvíja? Aspoň nejaká komponenta a práca s ňou alebo routovanie tam zúfalo chýba.

Proto jsou zde jiné projekty, kde tyto věci jsou… (-:

Šaman
Člen | 2659
+
+1
-

jenicek napsal(a):

@Šaman: Koukal jsem že používáš:

$form->addHiden("id");

je to lepší, než přez url?

IMHO je, nemusím řešit předávání id pomocí persistentního parametru, při editaci se mi vyplní automaticky ve chvíli, kdy celé $row nastavím jako defaultní hodnoty. Samozřejmě používám ve formuláři názvy polí shodné s názvy sloupců v db, pak je s tím minimum další práce.


Čamo napsal(a):

Šaman
A existuje nejaký dôvod prečo sa quickstart nerozvíja? Aspoň nejaká komponenta a práca s ňou alebo routovanie tam zúfalo chýba.

Důvod to má – skončil semestr a výuka nepokračuje. Na komponenty mám jinou ukázku, ale ta už není minimalistická, resp. je minimalistická, ale používá generované továrny a traity (vše, co je v souboru TCreate… patří do presenteru).
Na druhou stranu mám tímto všechnen možný kód pohromadě, stačí pak jen vytvořit továrnu v configu a vložit trait do presenteru.
V adresáři LoginForm je i ukázka formuláře jako plnohodnotné komponenty s vlastní šablonou.
Co se routováni týče, tak do toho by se začátečník neměl moc vrtat, maximálně přidat moduly, nebo routu jako zkratku na nějakou akci:

<?php
namespace App;

use Nette\Application\Routers\RouteList,
	Nette\Application\Routers\Route,
	Nette\Application\IRouter;

/**
 * Router factory.
 */
class RouterFactory
{

	/**
	 * @return IRouter
	 */
	public function createRouter()
	{
		$router = new RouteList();
		$router[] = new Route('admin/login', "Admin:Sign:in", Route::SECURED); # tohle je zkratka - adresa bude "www.server.cz/admin/login" a vede na akci "Admin:Sign:in"
		$router[] = new Route('admin/<presenter=User>/<action=list>[/<id>]', ['module' => 'admin'], Route::SECURED);
		$router[] = new Route('<presenter=Homepage>/<action=default>[/<id>]', ['module' => 'front']);
		return $router;
	}

}
?>

Takhle nakonfigurované moduly budou mít frontend bez názvu modulu v adrese a cokoliv začínajícího na admin/ povede na AdminModule. Za rovnítkem jsou defaultní pohledy.

Editoval Šaman (12. 6. 2014 18:24)

Jan Suchánek
Člen | 404
+
0
-

@Šaman: ok, já myslel že stačí

	$this->getParam("id");

aniž bych používal persistentní id.

Editoval jenicek (12. 6. 2014 17:19)

Šaman
Člen | 2659
+
+1
-

jenicek napsal(a):

@Šaman: ok, já myslel že stačí

	$this->getParam("id");

aniž bych používal persistentní id.

No, nejde ani tak o to to id načíst, jako ho odeslat. Nebo jak to děláš ty?

Čamo
Člen | 798
+
0
-

Šaman:
Minimalizmus ako vyučovacia metóda asi neni správna cesta pre mňa. Ale díky za snahu.

Jan Suchánek
Člen | 404
+
0
-

@Šaman: V renderEdit předám $id jako v examples/CD collection.

	public function renderEdit($id = 0) {...}

a v success přez get:

	public function albumFormSucceeded($button)
	{
		$values = $button->getForm()->getValues();
		$id = (int) $this->getParameter('id');
		…

		// nevim zda je $this->getParam("id") depricated?

já jen že ten persistent pak tam není vůbec potřeba, teda kdysi jsem si myslel,
že ho taky musím furt používat, nebo jak to myslíš ty?

Editoval jenicek (13. 6. 2014 10:42)

Oli
Člen | 1215
+
+1
-

Já to dělám skoro stejně jako jenicek, jen to teda ukládám do proměnný např.: editId. Ale to jen z lenosti → rychlejc napíšu $this->editId, než to $this->getParameter('id') ;-)

Jan Suchánek
Člen | 404
+
0
-

@Oli: hmm ukládání fajn, ale jak to pak využiješ? Já pochopil, že využití je v životním cyklu presenteru

  • action (vytáhnu řádek)
  • handle (upravím, změním apod), to same u success formu
  • render (vykreslím)

ale není lepší si uložit rovnou ActiveRow nebo Entitu?

Nebo $this->editId je jen odlišení aby se nemyxovalo s $id?

Edit: Ok tzn v action ověřit zda řádek existuje uložit si pouze $this->editId a v signalu provést změnu.

A přesměrovat i v případě ajaxu?

Editoval jenicek (13. 6. 2014 11:06)

Oli
Člen | 1215
+
+1
-

jenicek: je to zejména „zkratka pro“ $this->getParameter('id');. Je to napsaný nejrychleji :-) Ale ne že bych vubec nepoužíval uložení ActiveRow nebo getParameter.