NOVINKA: Získej 40 hodin praktických dovedností s AI – ZDARMA ke každému akreditovanému kurzu!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze – Lekce 7 - Jednoduchý redakční systém v Nette - Administrace

Zpět

Upozorňujeme, že diskuze pod našimi online kurzy jsou nemoderované a primárně slouží k získávání zpětné vazby pro budoucí vylepšení kurzů. Pro studenty našich rekvalifikačních kurzů nabízíme možnost přímého kontaktu s lektory a studijním referentem pro osobní konzultace a podporu v rámci jejich studia. Toto je exkluzivní služba, která zajišťuje kvalitní a cílenou pomoc v případě jakýchkoli dotazů nebo projektů.

Komentáře
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na saavikam
Jindřich Máca:23.2.2016 15:13

Ahoj,

je to přesně tak, jak říká Dominik Gavrecký.

  • Mezi action*() a render*() je jediný technický rozdíl a to, že action*() se pro danou akci (to co se dosadí za *) presenteru vykonává dřív než render*(). Potom je tady nějaká konvence (ne pravidlo), že v render*() by se měli předávat data do šablony a obecně řešit operace ohledně vykreslování stránky, zato v action*() by se mělo řešit například plnění komponent (formuláře) výchozími daty nebo přesměrování (logicky dřív, než se začne stránka vykreslovat). Dále nic nezabraňuje tomu, aby existovala např. actionDefault() a renderDefault() najednou v tom samém presenteru. Poté se akorát vykonávají v daném pořadí a měli by (nemusí) dodržovat výše popsané rozdělení zodpovědností.
  • K úplnému pochopení odpovědi na ten druhý dotay, bude možná lepší nejdříve objasnit, jak funguje vztah prezenterů a komponent. Každý presenter může obsahovat libovolné množství různých komponent. Jejich instance poté uchovává ve svém "vnitřním poli" (implementuje totiž interface ArrayAccess). A jak dané instance získává? Při jeho životním cyklu (viz. https://doc.nette.org/…3/presenters#…), konkrétně po metodě startup(), je vytváří podle všech metod z předpisem createComponen­t*() a pojmenovává je podle jejich názvu, tedy to co je v tomto případě * (pozor, mění se tady počáteční písmeno názvu na malé a důrazně se to rozlišuje). Poté, tedy už v libovolné action*() případně i render*(), je tedy k dispozici instance dané komponenty přes ono "vnitřní pole" presenteru a to právě pomocí $this[*] (kde * je právě název komponenty, pouze s počátečním malým písmenem). Ale znalost práce s třídami implementujícími ArrayAccess se již předpokládá ze standardního OOP v PHP. :)

Tak to bylo docela vyčerpávající, ale pokud by byli další dotazy, neváhej se zeptat. ;)

 
Odpovědět
23.2.2016 15:13
Avatar
saavikam
Člen
Avatar
saavikam:25.2.2016 18:08

Děkuju, už je mi to jasné. Andrea

 
Odpovědět
25.2.2016 18:08
Avatar
rosatislav
Člen
Avatar
rosatislav:14.9.2016 10:23

Zdravím, celkem by mně zajímalo tohle:

try {
                        $this->articleManager->saveArticle($values);
                        $this->flashMessage('Článek byl úspěšně uložen.');
                        $this->redirect(':Core:Article:', $values->url);
                } catch (UniqueConstraintViolationException $ex) {
                        $this->flashMessage('Článek s touto URL adresou již existuje.');
                }

přesněji článek s touto URL adresou již existuje.
Nedokážu moc pochopit, jak může k takové chybě dojít. Chápu, že je to asi myšleno, že pokud by při editaci někdo změnil kolonku URL adresy za stejnou, která v databázi už je, tak by to nemělo projít. Nikde jsem ovšem nenašel ošetření, kde by se ověřovalo, zda-li jsme nezadali takovou url, která by již byla použita (pokud se to teda neřeší až v dalších článcích)

 
Odpovědět
14.9.2016 10:23
Avatar
rosatislav
Člen
Avatar
Odpovídá na rosatislav
rosatislav:14.9.2016 11:17

Aha, tak už jsem na to přišel... taková ostuda :D je to dáno už z definice v předchozím článku

ADD UNIQUE KEY `url` (`url`);

každopádně, pokud bych se mohl zeptat, tak co dělá přesně třída UniqueConstra­intViolationEx­ception?

Editováno 14.9.2016 11:18
 
Odpovědět
14.9.2016 11:17
Avatar
Odpovídá na rosatislav
Neaktivní uživatel:14.9.2016 15:10

UniqueConstra­intViolationEx­ception je výjimka, kterou ti vyhodí db driver právě při té duplicitě klíčů

Odpovědět
14.9.2016 15:10
Neaktivní uživatelský účet
Avatar
danhosek
Člen
Avatar
danhosek:5.11.2016 0:23

AHoj.Co mám udělat, když chci předat do editor.latte hodnoty editovaného článku?
Zkusil jsem do public function actionEditor($url) přidal:

($article = $this->articleManager->getArticle($url));
$this->template->article = $article; // Předá článek do šablony.

Ale nefunguje mi to. Sem patří přiřazení proměnných do šablony ne? Proměnné pak v šabloně vypisuju standartně: $article->$article_id
Chci je tam posílat z důvodu další práce ve snippetu s proměnýma.
Děkuji.

Editováno 5.11.2016 0:24
 
Odpovědět
5.11.2016 0:23
Avatar
Jindřich Máca
Tvůrce
Avatar
Odpovídá na danhosek
Jindřich Máca:5.11.2016 23:35

Nezlob se na mě, ale tenhle dotaz na mě opět působí tak, že vlastně moc nevíš, co děláš. Opravdu se mě ptáš na to, jak předat proměnou do šablony?

Sem patří přiřazení proměnných do šablony ne?

NE, je to v těch článcích dokonce popsané! Pokud to lze, měl by jsi předávat proměnné do šablony v metodách render*(). Každopádně, pokud na to dojde, můžeš to udělat i v metodě action*() a bude to fungovat...

V uvedeném kódu pak máš úplně zbytečně závorky kolem přiřazení proměnné, proč?! A potom nemáš vůbec ošetřené, co se stane, pokud článek s danou URL neexistuje. :(

A poslední věc, která mě opravdu dorazila:

Proměnné pak v šabloně vypisuju standartně: $article->$article_id

Vážně, odkdy se to takhle zapisuje? Nemá to být náhodou takhle:

$article->article_id

Tohle je úplně začátečnická chyba, kterou každý, kdo alespoň trochu umí PHP, hned vidí. Což značí opět buď Tvoji nepozornost nebo neznalost PHP, a jak už jsem jednou psal, umět PHP je nutně potřeba než se pustíš vlastně do jakéhokoliv PHP frameworku.

Upřímně mě to už nebaví. Můj čas je drahý a rád bych ho strávil odpovídáním na dotazy, které nevyplývají z neznalosti základních věcí. Rozhodně neříkám, že všechny Tvoje dotazy byly takové, ale tenhle... škoda mluvit. Takže příště až uvidím něco podobného, tak prostě už asi nebudu reagovat. Doufám, že si rozumíme. :)

 
Odpovědět
5.11.2016 23:35
Avatar
danhosek
Člen
Avatar
Odpovídá na Jindřich Máca
danhosek:6.11.2016 1:52

Ahoj, rozumíme. Chtěl jsem jen dodělat ten snipped, který poslední chyběl. Byla tam nepozornost... umím spoustu věcí, ale bohužel pouze teoreticky a v praxi pak přehlédnu hloupé chyby. Ale děkuji ti za tvůj čas, který pro mě nebyl promarněný a dal mi spoustu cenných zkušeností.
Nyní mi to už funguje. Tak myslím, že bude odemne snad i na delší dobu klid.:o)
Už je to snad i klišé, ale moc děkuji za trpělivost s mémi dotazy. Tvé odpovědi byli pro mě plodné, cenné a získal jsem spoustu zkušeností.
Děkuji.

Editováno 6.11.2016 1:54
 
Odpovědět
6.11.2016 1:52
Avatar
Jan Bezdíček
Tvůrce
Avatar
Odpovídá na danhosek
Jan Bezdíček:6.11.2016 1:58

Vice zkusenosti bys asi ziskal, kdybys ty teoreticke znalosti uplatnil v praxi na nejakem projektu bez pouziti nette, at to PHP dostanes poradne do krve ... protoze ocividne z predchoziho komentare ani nevis, jak poradne funguje syntaxe jazyka

 
Odpovědět
6.11.2016 1:58
Avatar
Vakos
Tvůrce
Avatar
Vakos:8.2.2017 23:09

Chtěl bych se zeptat. Zkoušel jsem využít ArticleManager a ArticlePresenter a vytvořil jsem jejich kopie s názvy DateManager a DatePresenter a celý obsah překopíroval a názvy tříd, proměnné, konstanty atd. jsem upravil a pořád mi to hází Error 500.

V Router by problém být neměl, zkopíroval jsem si zde také tu část z Article a dal jsem nakonec i 'url' => null, takže v tomto by problém být neměl.

Nevíte, v čem by mohla být tedy chyba?

Odpovědět
8.2.2017 23:09
"Jediný způsob, jak dělat skvělou práci, je milovat to, co děláte. Pokud jste to ještě nenašli, hledejte dál. Ne...
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 10 zpráv z 34.