Minimalistický quickstart
- Šaman
- Člen | 2659
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éhoconfig.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
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
- Šaman
- Člen | 2659
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
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
Š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
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
Š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í :)
- Oli
- Člen | 1215
Šaman napsal(a):
P.S. Ono se někde učí psát kód česky? To jakoženajdiUž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
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
@Šaman: Koukal jsem že používáš:
$form->addHiden("id");
je to lepší, než přez url?
Editoval jenicek (12. 6. 2014 11:49)
- mrtnzlml
- Člen | 140
Č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
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
@Šaman: ok, já myslel že stačí
$this->getParam("id");
aniž bych používal persistentní id.
Editoval jenicek (12. 6. 2014 17:19)
- Jan Suchánek
- Člen | 404
@Š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)
- Jan Suchánek
- Člen | 404
@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)