Na navigaci | Klávesové zkratky

Nette pro statické stránky?

Žádný komplexní framework se nehodí pro jednoduché weby. Výhody se totiž projeví až od určité míry složitosti webové aplikace. V opačném případě práci spíš komplikuje.

Nette je framework, který se výborně hodí i pro tvorbu statických stránek. Ano, čtete dobře! Obyčejných statických stránek. Pojďme se na to podívat.

Vezměme si jednoduchou stránku homepage.en.html:

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
	<title id="_title">Welcome!</title>
</head>

<body>
  <div id="menu">
	<ul>
	  <li><a href="...">Products</a></li>
	  <li><a href="...">Testimonials</a></li>
	  <li><a href="...">FAQ</a></li>
	  <li><a href="...">About us</a></li>
	</ul>
  </div> <!-- /menu -->

  <div id="breadcrumbs">
	<a href="./">Home</a> &gt; Products
  </div>

  <div id="main">
	<h1>Welcome!</h1>

	<p>Lorem ipsum dollar sit.</p>
  </div> <!-- /main -->

  <div id="footer">
	<p>All rights reserved.</p>
  </div>
</body>
</html>

Jednotlivé stránky v rámci jednoho serveru se hodně podobají. Liší se sice v textu titulku, hlavním obsahu, ale mají stejné (či podobné) hlavičky, patičky atd. Jak jsem zmiňoval dříve, primární zásada Nette zní Nic nepsat dvakrát. Tak si ukažme v praxi, jak bez dvojího psaní vytvoříme stránku „kontakty“:

Soubor contacts.en.html:

<?nette extends="homepage"?>

<title id="_title">Contacts</title>

<body>
<div id="breadcrumbs">
  <a href="./">Home</a> &gt; Contacts
</div>

<div id="main">
  <h1>Contacts</h1>

  <p>Duane Dibley, <i>director</i></p>
</div>
</body>
Upozornění: Článek se týká velmi staré verze Nette Framework, současná syntaxe je jiná.

Prvním řádkem Nette oznámíme, že tato stránka je potomkem stránky homepage. Ano, jde přesně o tentýž mechanismus, jako když dědíme třídy. Prostě Objektově Orientovaný Webdesign. A následují prvky, které chceme přepsat, stejně jako když predefinováváme metody v OOP. Rozhodující je identifikátor id. Prvek se stejným id přepíše prvek rodičovský.

Volitelným atributem override lze navíc upřesnit, jestli se bude dědit jen element samotný (a obsah zůstane nezměněn), nebo naopak jen vnitřní obsah elementu, nebo obojí (což je výchozí stav).

Všimněte si, že <title> má jako identifikátor uvedeno _title. Zavináč Podtržítko nám říká, že atribut id se ve výsledném HTML nezobrazí. Tedy zbude jen <title>Contacts</title>.

Dále v souboru contacts vidíte značky <body>. Protože nemají id, tak se při zpracování ignorují. Zde slouží jen jako ukázka, že ve zděděné stránce můžete použít i doplňující kód, pokud vám to kupříkladu zpříjemní editaci ve WYSIWYG editorech (například přilinkováním CSS).

Za zmínku také stojí ono en v názvech obou souborů. Jde o určení jazyka. Pokud při dědění neexistuje předchůdce v požadovaném jazyce, použije se podle preferencí jiný. Což skýtá řadu dalších obrovských výhod. Stačí překládat jen stránky skutečně obsahující text, a to jen jednou. Také chybějící překlad lze doplnit kdykoliv později (výsledná stránka pak bude přeložena až na malou část).

O tom, jak tento prostý trik zjednodušší správu webů (multijazyčných obzvlášť) snad ani nemusím psát.

Dokáže tohle váš framework?

Pro snadné ladění takovýchto stránek je připraven jednoduchý prohlížeč. Jako parametr dostane jméno stránky, poskládá ji a pustí na výstup (tedy editujete zděděný soubor a v prohlížeči sledujete výsledek).

Pokud na začátek každé takovéto stránky přidáme jednořádkový PHP skript, který spustí onen prohlížecí mechanismus na prováděný soubor, mohu takové stránky nahrát naostro na server a statický web je na světě. Není to paráda?

Již brzy se pokusíme statickým stránkám vdechnout život. Mechanismus dědění tak získá nový netušený rozměr.

Komentáře

  1. rarouš #1

    avatar

    Pokud na začátek každé takovéto stránky přidáme
    jednořádkový PHP skript, který spustí onen prohlížecí
    mechanismus na prováděný soubor, mohu takové
    stránky nahrát naostro na server a statický web je na
    světě.

    A jedná se potom o statické stránky? Pamatuju dobu, kdy slova statické stránky měla jiný význam. Ale dobrá, vypadá to velice zajímavě, je to celé jako Mastery v ASP.NET 2.0 :) Takže v tomto případě, pokud budu někdy „muset“ něco v PHP, vzpomenu si na Nette :)

    A jedna připomínka závěrem. Nebylo by lepší přidělit Nette tagům nějaký xml namespace, aby bylo hned zřejné, o co jde?

    před 18 lety | reagoval [2] David Grudl
  2. David Grudl #2

    avatar

    #1 rarouši, „Statickou stránku“ bych definoval jako stránku, na jejíž obsah nemá vliv stavu serveru ani parametry předané HTTP protokolem a je tudíž vždy stejná. Způsob generování stránky s tím dle mého nemá nic společného.

    je to celé jako Mastery v ASP.NET 2.0 :)

    Ale to snad ne. Master page je trošku něco jiného, lépe řečeno výrazně primitivnějšího. Žádný polymorfismus či předefinovávání, jen se vkládá obsah do předem připravených kontejnerů asp:Content.

    Nebylo by lepší přidělit Nette tagům nějaký xml namespace?

    Ano, má to tam být, do článku jsem to doplnil. Téma syntaxe mám ještě docela otevřené.

    před 18 lety | reagoval [5] xom [14] Stalker [36] Lukáš Lánský
  3. error414 #3

    Takze nejdrive nas s Nette naucis pracovat, a pak ho teprve pustis do obehu. Zajimave.

    před 18 lety | reagoval [5] xom [25] David Grudl
  4. Ivan #4

    Nikdy jsem to prakticky nedělal (proto prosím o shovívavost, jestli plácám nesmysly ;), ale jak se tento přístup liší od Transform View (Fowler)? Tedy vytvořím si xml, a pomoci xslt z něj udělám html stránku?

    před 18 lety | reagoval [11] David Grudl
  5. xom #5

    #3 error414, Ano, přijde mi to i logické, nevím nakolik dal David Nette k testování svým známým, ale tím, že bude zveřejňovat syntaxi a čtenáři mu ji budou komentovat, ptát se na detaily, na nejasnosti, bude mít dostatečný feedback, který pomůže výsledek dotvořit.. (viz. třeba otevřenost syntaxe #2 David Grudl)

    Tak a po drobném nakousnutí jsem zvědavý, co bude dál, co to bude ještě všechno umět.. Dobře nás, čtenáře, napínáš.. ;o)

    před 18 lety
  6. JersyWoo #6

    avatar

    Mě tak napadá, jestli Nette není další z tvých „výstřelků“ ?

    před 18 lety | reagoval [9] Shippy
  7. Milf #7

    primární zásada Nette zní Nic nepsat dvakrát.

    Najde se někdo ochotný, kdo by dokázal interpretovat contacts.en.html pro jinou jazykovou mutaci, třeba češtinu? dgx, prosím.

    před 18 lety | reagoval [11] David Grudl
  8. Shippy #8

    To by tedy byl dost krutý žert ?

    před 18 lety | reagoval [9] Shippy [10] Filda
  9. Shippy #9

    #8 Shippy, Tedy, to byla reakce na #6 JersyWoo, omlouvám se ?

    před 18 lety | reagoval [22] JersyWoo
  10. Filda #10

    #8 Shippy, třeba to neni legrace, může to bejt nějakej druh workshopu nebo brainstormingu. A po pár dalších dílech seriálu bude mit David dost informací aby to Nette skutečne přes víkend napsal ;)

    před 18 lety | reagoval [11] David Grudl
  11. David Grudl #11

    avatar

    #7 Milfe, nazveš to contacts.cs.html a těch několik slov napíšeš česky.

    #4 Ivane, Transform View neznám, tedy můžu porovnat. Jak se liší tento přístup od XML → XSLT → XHTML je celkem zřejmé. První dvě X* se nepoužívají, vstupem i výstupem je už hotové XHTML. Tento přístup mi více vyhovuje, připadá mi srozumitelnější. Nakonec XSLT si ani po 7 letech existence nezískalo takovou přízeň (ani dostupnost), jak se očekávalo, tedy asi nejsem sám, komu úplně nesedí.

    Protože celou skládačku odkrývám postupně, tak na tento princip budou ještě navazovat další techniky a teprve pak se framework ukáže v plné síla.

    Ale docela by mě zajímalo, jak by se přes XSLT právě tento princip polymorfismu realizoval, víte to?

    #10 Fildo, to by bylo skvělé, jenže koloběh nápad → článek → komentáře se prostě obrátit nedá.

    před 18 lety | reagoval [13] Milf [16] Ivan
  12. Zdenda #12

    avatar

    Nepište prosím o ASP.NET – dokud si to alespoň trošku neprozkoumáte. Třída MasterPage je vlastně potomkem třídy Page (o třídě Page dle mého názoru nelze napsat, že je primitivně udělaná…), a je rozšířená právě o ty ContentPlaceHoldery…

    …dosti ale o asp.net…

    Upřímě gratuluji k myšlence Nette – takovýto přístup jsem ještě neviděl. Podobně navržené „systémy“ (záměrně nepíši to sprosté slovo fw) totiž mohou vykazovat jistou známku vnitřní inteligence – jejich využitelnost nikdy není přesně určena.

    před 18 lety | reagoval [15] David Grudl
  13. Milf #13

    #11 Davide Grudle, Ok, díky – pak zřejmě mnou citovanou primární zásadu Nic nepsat dvakrát vnímáš poněkud odlišně, respektive ji aplikuješ na jiné části tvorby.

    IMHO pokud budu chtít (z jakéhokoliv důvodu) pozměnit šablonu pro kontakty, budu tak činit Nkrát, kde N je počet jazykových mutací.
    Nebude se samozřejmě jednat o obsah, který je napříč mutacemi odlišný.

    p.s. … že by v dalších dílech? ?

    před 18 lety | reagoval [15] David Grudl [18] Ivan
  14. Stalker #14

    #2 Davide Grudle, K tým namespacom: ja by som to predsalen ešte vylepšil takto:

    <title nette:id="title">

    BTW, ako spracúvaš tie „šablony“? Regulármi alebo parserom?

    před 18 lety
  15. David Grudl #15

    avatar

    #12 Zdendo, Prosím rozporujte konkrétní omyly a nesuďte mou znalost ASP.NET! Je možná mizerná, ale ASP.NET mám v úctě a určitě mu nechci křivdit. Co je tedy nepravdy na tom, že MP obecně nelze dědit (tedy jakoby jen jednou, z master na page) a že lze pouze naplňovat předpřipravené kontejnery? Jistě, Master pages jsou super. Ale ve srovnání s mým způsobem je to primitivní.

    #13 Milfe, Asi moc nerozumím. Samozřejmě, že pokud existuje N jazyků, mělo by existovat i N šablon. Pokud se tedy nepoužije jiný způsob internacionalizace. Ale v každé je zapsáno něco jiného (Kontakty, Contacts, Kontakte, contatto atd..). A pokud dědím šablonu, abych ji rozšířil o nějaký grafický (tedy nepřekládatelný) prvek, stačí mi dědit jen jednou v jednom souboru, bez určení jazyka.

  16. Ivan #16

    #11 Davide Grudle, Aha většinu jsem zamlčel :). Sled úvah byl:

    • Zajímavý nápad, tak ten jsem ještě neviděl…
    • Že by na to opravdu ještě nikdo nepřišel?
    • A nepodobá se to Transform View?
    • A včem se to liší – jaké to má výhody / nevýhody

    XSLT jsem bohužel viděl z rychlíku, ale mám (pouze) pocit, že by to jít mělo (a možná motivaci se na to mrknout).

    Každopáně výhodu vašeho přístupu (nemusím znát XSLT) beru. Na druhou stranu XSLT je zaimplementováno ve více jazycích, váš způsob je (zatím?) jen pro php. Je tu i výhoda (otázkou je jak často by byla využívaná), že když bych chtěl (je to příklad, nechtěl bych to :) ), aby místo

    <p>Duane Dibley, <i>director</i></p>

    bylo

    <div>Duane Dibley, <i>director</i></div>

    bylo by třeba toto upravit v teoreticky spoustě soubrů. Ale to už je hodně teoretická úvaha. A asi zbytečná.

    Zatím se mi přístup Nette líbí. Líbilo se mi i vaše pseudoSQL, které jste však opustil.

    před 18 lety | reagoval [23] Milf [25] David Grudl
  17. pete #17

    líbí se mi to, konečně vidím elegantní využití polymorfismu/dedičnosti v php. nicméně, zajímaly by toto:

    • jak je v nette uděláno linkování mezi stránkami („tag“, ručně, nebo nějak jinak?).
    • docela by mě zajímalo, jak ty stránky parsuješ: přes regexp? xml_* funkce? simplexml (to asi ne, jestli je nette kompatibilní s php 4)? nebo nějak jinak?
    • v přikadu přepisuješ časti stránky. umožňuje nette místo přepisu kód rozšířit (stejně jednoduše jako přepis), příp. přepis/rozšíření kombinovat v rámci stránky?
    před 18 lety | reagoval [29] David Grudl
  18. Ivan #18

    #15 Davide Grudle, Nic dvakrát dle mě předpokládá, že není nutné psát:

    <li><a href="...">Products</a></li>

    a

    <li><a href="...">Produkty</a></li>

    Myslím, že #13 Milf očekával něco jako:

    <li><a href="...">Products</a></li>

    • en:

      Products : Products

    • cs:

      Products : Produkty

    před 18 lety | reagoval [20] noname [23] Milf
  19. rarouš #19

    avatar

    #15 Davide Grudle, Zanoření másterů je, myslím, neomezené :) Takže tento princi se podle mého shoduje, jde jen o trochu jinou syntaxi :) V content page neni nutné přepisovat jednotlivé placeholdery (stejně jako v nette DIVy), a obsah se zachová takový jaký byl v Masteru :) Takže více násobná dědičnost vzhledu je možná :)

    Díky Davide za inspiraci na další díl, máš to u mě.

    před 18 lety | reagoval [21] Zdenda [25] David Grudl
  20. noname #20

    avatar

    #18 Ivane, no jak já to chápu, tak tento díl je o „statických stránkách“. To co vy popisujete je chování dynamických stránek a to předpokládám bude Nette umět také a bude to asi i častější. Ale tento díl je o statických stránkách, kdy jde právě o to, že chcete napsat do jinak databázově tvořeného webu nedatabázově tvořené záležitosti. Možná mě dgx ale opraví

    před 18 lety | reagoval [24] Ivan
  21. Zdenda #21

    avatar

    #15 Davide Grudle, Možná dochází k informačnímu šumu – já jsem myslel MasterPage jako třídu – z čehož samozřejmě dědit jde (o což samozřejmě ve vašem příspěvku nešlo = moje nepochopení).

    Jak psal #19 rarouš rarouš – zanoření masterů je zřejmě neomezené. Veškeré vlastnosti a metody dané konkrétní mp jsou přístupné z vlastní stránky – (od všech ovládacích prvků, vlastních metod a vlastností po jánevímcoještě) – ale to se jedná čistě o komunikaci mezi instancemi objektů – tady o žádném dědění nemůže být řeč (i když to možná vzdáleně připomíná).

    To by mě právě zajímalo, jestli je to v Nette jinak (pochopení objektů na html stránce, v requestu atd). jinak než v .net (třída Page).

    Nicméně přeji hodně zdaru, váš přístup se jeví nekonvenční, jak jsem již výše napsal.

    před 18 lety | reagoval [29] David Grudl
  22. JersyWoo #22

    avatar

    #9 Shippy, No Nette je pěkný název. Podobně se proslavil tenkrát i takzvaný Sodor nebo Český sen a na další podobné vychytávky si už nevzpomínám. hihihi

    před 18 lety
  23. Milf #23

    #15 Davide Grudle, Co se týče jak jsem to myslel zde za mě již napsal někdo jiný, konkrétně Ivan v #16 Ivan a #18 Ivan.

    Jinak samozřejmě respekt, jen jsem si chtěl vyjasnit problematiku Nic nepsat dvakrát, těším se na další díly, držím palce. Můj zájem o Nette jsem nasdílel již v začátcích, myslím to upřímně.

    před 18 lety
  24. Ivan #24

    #20 noname, Rozumím, já jen reagoval na #15 David Grudl

    Asi moc nerozumím

    :)

    před 18 lety
  25. David Grudl #25

    avatar

    #16 Ivane,

    Že by na to opravdu ještě nikdo nepřišel?

    A přitom taková blbost, že? ? Fakt nevím, nejspíš jo, ale nikde jsem to ještě neviděl.

    aby <p>Duane Dibley, <i>director</i></p> bylo <div>Duane Dibley, <i>director</i></div>

    To není problém, pokud <p id="blokX"> zaměním za <div id="blokX">

    #3 error414,

    Takze nejdrive nas s Nette naucis pracovat, a pak ho teprve pustis do obehu. Zajimave.

    Ono to jinak nejde. Ty mechanismy jsou velmi prosté a snadno pochopitelné, ale až po předvedení.


    Ad ostatní: Tento článek popisuje extrém – ryze statický web. Nette je stavěné především na dynamické weby. Takže berte to spíš jako ukázku techniky dědění stránek, kterou budeme ještě dále rozvíjet.


    #19 rarouši, ad Master Page: Omlouvám se, vyjádřil jsem se úplně špatně. Berme to zpět. Samozřejmě, že lze vytvářet více úrovní zanoření kontejnerů a také dědit ze třídy Master. Myslel jsem to docela jinak, v souvislosti s tímto článkem a uvedenou technikou.

    Master&Page je něco jakoby <IFRAME>. Mohu zanořovat libovolně, to je jasné. Ale žádným frejmem nemůžu upravit jeho okolí na master page. Rozumíte mi? Princip, který funguje v Nette, to je jakoby každý prvek s ID byl takový mini-IFRAME. I když ani to není ono, protože bych musel v každé generaci znovu všechny prvky opakovat. Zkrátka, připouštím, že na první pohled to může vypadat podobně, ale je to něco jiného. A protože Nette může snadno simulovat Master Page z ASP.NET, zatímco obráceně to nelze, označil jsem MP za primitivnější.

    před 18 lety | reagoval [26] rarouš [30] Zdenda [37] rarouš
  26. rarouš #26

    avatar

    #25 Davide Grudle, OK, je to hodně podobný, ale nette v tom jde dál :) Dobrá práce. Mě se to líbí.

    před 18 lety
  27. Ondřej Pohorský #27

    avatar

    Mám ryze praktický dotaz, jak se to Davide vyslovuje?

    Nette = [nete] nebo [net]

    ??

    před 18 lety | reagoval [29] David Grudl
  28. Ondřej Pohorský #28

    avatar

    a ještě jeden na Rarouše..

    Na tom avataru, je to Nick Cage, nebo se mi to jen zdá?

    před 18 lety | reagoval [34] rarouš
  29. David Grudl #29

    avatar

    #17 pete,

    docela by mě zajímalo, jak ty stránky parsuješ:

    Je to trošku složitější. Používám preprocesor, který je připraví pro PHP DOM a tím je pak parsuju. Na kompatibilitu s PHP4 začínám zvolna kašlat…

    umožňuje nette místo přepisu kód rozšířit (stejně jednoduše jako přepis), příp. přepis/rozšíření kombinovat v rámci stránky?

    To už je dynamika. S ní je možné celou stránku přeházet k nepoznání.

    #21 Zdendo,

    To by mě právě zajímalo, jestli je to v Nette jinak (pochopení objektů na html stránce, v requestu atd). jinak než v .net (třída Page).

    Velký rozdíl je v tom, že Nette chápe jako objekty všechny HTML prvky na stránce. Tedy nejen komponenty. Ale obecně popisovat rozdíly si netroufám, to nechám pak na tobě jakožto zkušeném ASP.NETaři ?

    #27 Ondřeji Pohorský, Tos mě dostal já to zatím jen psal ?

    před 18 lety | reagoval [31] Ondřej Pohorský
  30. Zdenda #30

    avatar

    #25 Davide Grudle, Ještě drobná poznámka – ovlivňovat chování na masterpage z cílové stránky (jakkoli zanořené) samozřejmě lze – každá stránka zná svého Mastera ? – zná a může ho měnit se vším všudy. Změny mohu ovšem provádět jen v kódu na pozadí. V nette to zřejmě jde jaksi deklarativně.

    před 18 lety | reagoval [32] David Grudl
  31. Ondřej Pohorský #31

    avatar

    #29 Davide Grudle,  – Aha :) , no, chtělo by to možná pomoc nějakého lingvisty.

    Je to prozatím asi nedůležité, ale každý ví, že [gůgl] není [gogle], tak by i u Nette pro případ, že na něj třeba někde u sklenice piva přijde řeč bylo jasné, jak to vyslovovat

    před 18 lety | reagoval [32] David Grudl [43] Pin007
  32. David Grudl #32

    avatar

    #30 Zdendo, ovlivňovat chování nebo statický HTML obsah? Držme se tématu.

    #31 Ondřeji Pohorský, já asi budu používat u sklenice piva [nete] ?

    před 18 lety | reagoval [34] rarouš
  33. Ondřej Pohorský #33

    avatar

    Ty jsi pan architekt, my se podřídíme :), čili budiž [nete].

    před 18 lety
  34. rarouš #34

    avatar

    #28 Ondřeji Pohorský, It's me ;)

    #32 Davide Grudle, Z jistého úhlu pohledu (jako že v nette stačí přidat atribut id, v dotnetu musíš navíc připrat i runat="server") dosáhneš stejného. V nette to uděláš deklarativně, v dotnetu programově (pokud neberu v úvahu contentplaceholdery). To chování je do značné míry podobné. Podle toho, co ale píšeš, jde nette o kousek dál.

    před 18 lety | reagoval [35] Ondřej Pohorský
  35. Ondřej Pohorský #35

    avatar

    #34 rarouši, neuvěřitelná podoba. možná kvůli tak malé velikosti toho avataru

    před 18 lety | reagoval [37] rarouš
  36. Lukáš Lánský #36

    avatar

    #2 Davide Grudle,

    Ale to snad ne. Master page je trošku něco jiného, lépe řečeno výrazně primitivnějšího. Žádný polymorfismus či předefinovávání, jen se vkládá obsah do předem připravených kontejnerů asp:Content.

    No, takže po téhle diskusi z tohoto způsobu zbylo navíc co? Jestli polymrfismem myslíš co si myslím, tak CPHoldery můžu dědit a Mastery vnořovat v .NETu stejně. Předefinovávání funguje taky stejně, pokud od CPHolderu umístím obsah, bere se jako default při neuvedení šablony.

    Takže: místo ASP.NETích contentplaceholderů používáš id=„…“, což je teda kratší, a navíc… ? Pokud nic, bylo by dobré ten tvůj úvodní příspěvek proškrtat. Možná se ale mýlím, nevím…

    před 18 lety | reagoval [37] rarouš [41] David Grudl
  37. rarouš #37

    avatar
    před 18 lety | reagoval [38] Ondřej Pohorský [39] TimJ
  38. Ondřej Pohorský #38

    avatar

    #37 rarouši,  – jj, je to těmi brýlemi :)

    https://web.archive.org/…news/hat.jpg

    před 18 lety
  39. TimJ #39

    avatar

    #37 rarouši, opravdu hegeš (jsi snad první koho tohle slovo vidim používat – vyjma mý rodiny ;)).
    Jinak nette vypadá víc než luxusně, těším se. Super práce.

    před 18 lety | reagoval [59] rarouš
  40. mrzout #40

    Prvek se stejným id přepíše prvek rodičovský.

    Proc je v te sablone <body> kdyz nema ID a teda nic neprepisuje?

    před 18 lety | reagoval [42] David Grudl
  41. David Grudl #41

    avatar

    #36 Lukáši Lánský, Po diskuzi se nezměnila ani čárka, jen jsme si ujasnili, že jeden o voze a druhý o koze. Abych jasně demonstroval rozdíl, ukážu jednoduchý příklad:

    stranka1.html:

    <html>
    <head>
        <title id="@title"></title>
    </head>
    
    <body>
      <div id="main">
        <h1>Welcome!</h1>
    
        <p>Lorem ipsum dollar sit.</p>
      </div>
    
      <div id="footer">
        <p>All rights reserved.</p>
      </div>
    </body>
    </html>

    stranka2.html:

    <nette:page extends="stranka1" />
    
    <title id="@title">Stránka Dvě</title>
    
    <div id="footer" style="color: blue">
      <p>Práva vyhražena. Webdesign Franta Novák</p>
    </div>

    stranka3.html:

    <nette:page extends="stranka2" />
    
    <title id="@title">Stránka Tři</title>
    
    <div id="main">
      <h1>Jste na stránce 3</h1>
    
      <p>Jak se vám tu líbí?</p>
    </div>

    Zkus přesně tohle udělat v ASP.NET. Pak pochopíš, o jak zásadní rozdíl jde.

    (a to ještě není použita významná podpora pro multijazyčné šablony)

    před 18 lety
  42. David Grudl #42

    avatar

    #40 mrzoute, V článku je tomu věnován celý odstavec.

    před 18 lety
  43. Pin007 #43

    avatar

    #31 Ondřeji Pohorský, a jeste jedna vec, je to zenska, kluk nebo dite?

    • ‚degexovo nete‘
    • ‚degexuv nete‘
    • ‚degexova nete‘

    :D

    před 18 lety | reagoval [46] llook [49] Adam Hošek
  44. Pin007 #44

    avatar

    pardon… nejak se mi vytratil prvni radek… ptal jsem se jestli to je zenska, chlap nebo dite ;)

    před 18 lety
  45. Leo #45

    „A následují prvky, které chceme přepsat, stejně jako když predefinováváme metody v OOP. Rozhodující je identifikátor id. Prvek se stejným id přepíše prvek rodičovský.“

    Jak budou (jsou) v Nette osetrene chyby – naprklad kdyz v souboru contacts.en.html zapomenu uzavrit nejaky div, nebo napisu spatne id? Leo

    před 18 lety
  46. llook #46

    avatar

    A pak že Nette nebude šablonovací systém…

    #43 Pin007, Já bych řekl dégéixovo nete

    před 18 lety | reagoval [49] Adam Hošek
  47. Pachollini #47

    Jen takové poznámka k syntaxi: nebylo by pěkné, když už to jako XML vypadá, aby to taky XML bylo? Dalo by se pak např. kontrolovat správné ststavení pomocí standardních nástrojů.

    A pokud by tam nebylo pro id, které se mají vynechat, „@“, ale třeba „_“, dalo by se to za jistých okolností i validovat. Ale to asi vtéto fázi stejně nebude potřeba.

    před 18 lety
  48. Leo #48

    „dalo by se to za jistých okolností i validovat“

    Validovat tenhle meziprodukt musi Nette samotne a tomu je jedno jaky symboly se pouziji, ne?

    před 18 lety | reagoval [59] rarouš
  49. Adam Hošek #49

    avatar

    #43 Pin007, #46 llook Pozor na jazyk! El Degeixo, obávaný obchodník s drogou LCD, hýčká si své dítko Nette. Jistě se mu nebude líbit, když si z něj budeme dělat šoufky 😉.

    Zda-li během dovolené kromě LCD sjížděl i PHP, to je otázka. Několik fotografií ho usvědčuje, že vozil haitské krásky ve svém corVette a lízali u toho corNette. Jestli se to však domákne jeho přítelkyně, patrně již žádné Nette nespatří světlo světa 🙂.

    (z tajného zdroje z ostrova Haiti)

    před 18 lety
  50. johno #50

    avatar

    Ako spravím v tom hlavnom menu v zdedených stránkach nejako jednoducho klasickú fintu class="selected" na li, ktorý je práve aktuálny?

    před 18 lety | reagoval [51] medden [55] David Grudl
  51. medden #51

    avatar

    #50 johno, Celkom zaujímavá otázka, síce neviem či to dgx implementoval, ale mal by som návrhy ako by sa to mohlo spraviť: stačilo by určiť, že nejaký div je menu, a potom ak adresa odkazu je zhodná s aktuálnou stránkou a je to v menu povolené/nakonfigurované, pridalo by sa jednoducho do li class selected.

    před 18 lety | reagoval [52] johno
  52. johno #52

    avatar

    #51 meddene, Obávam sa, že menu nebude jediné „problematické“ miesto. Použil som to len ako príklad.

    Osobne skôr tipujem menu ako jeden zo základných komponentov, ale nie som si vôbec istý, tak sa pýtam. Nejaké dohady tu môžeme riešiť donekonečna a úplne zbytočne, takže túto otázku tentokrát smerujem priamo na DGX.

    před 18 lety | reagoval [53] Adam Hošek
  53. Adam Hošek #53

    avatar

    #52 johno, Obávám se, že El Degeixo má vše dostatečně promyšlené. Tedy vlastně snad už implementované. ?

    před 18 lety | reagoval [54] johno
  54. johno #54

    avatar

    #53 Adame Hošku, Citujem sám seba.

    Nejaké dohady tu môžeme riešiť donekonečna a úplne zbytočne.

    před 18 lety
  55. David Grudl #55

    avatar

    #50 johno, správná otázka, čekal jsem ji mnohem dřív ?

    Preferoval abych asi dynamické řešení, tedy skriptováním. Během inicializace stránky (něco jako Page_Load pro ASPáky) se prostě nastaví (něco jako) $document->getElementById('menu')->ul->li[xx]['class'] = 'active';, kde xx bude určeno podle požadované stránky.

    Lze to řešit i na čistě statické bázi, a to přiřazením ID jednotlivým položkám <li> (např id="_menu1" až "_menu4") a tu jedinou položku pak předefinovat:

    <li id="_menu2" class="active" override="tag" />

    Volitelný atribut override říká, že se přepíše pouze značka samotná, nikoliv její obsah. Tedy případná změna názvu položky v menu se pak provede jen na jednom místě. I v případě multijazyčného webu.

    před 18 lety | reagoval [56] johno
  56. johno #56

    avatar

    správná otázka, čekal jsem ji mnohem dřív 🙂

    #55 Davide Grudle, Prepáč, ale bol som na lyžovačke.

    Osobne by som to menu asi riešil komponentou. Neviem však ako sa to v Nette robí, tak tápam. Ja menu a zďaleka nie len to riešim cez niečo ako komponent.

    // pseudokód v kontroleri
    $menu = new MainMenu($this->request->getActiveItemId());
    $this->view->attach('menu', $menu);

    To riešenie s menu1menuN napadlo aj mňa, ale úprimne čakal som teda lepšiu fintu.

    Tento zápis je však skvelý. Teda ani nie tak v tomto kontexte, ale skôr všeobecne ako nápad. $document->getElementById('menu')->ul->li[xx]['class'] = 'active';

    Kde som také niečo videl? 😉

    před 18 lety | reagoval [57] David Grudl
  57. David Grudl #57

    avatar

    #56 johno, Jasně, komponenta je asi nejlepší způsob. Ale to už jsme o dva kroky dál.

    To riešenie s menu1 až menuN napadlo aj mňa, ale úprimne čakal som teda lepšiu fintu.

    Nechci framework zaplevelovat fintami pro řešení okrajových úloh. Návrh by měl být čistý. Nastavení aktivní položky menu je úkol jak dělaný pro skript a pak stačí skutečně jeden příkaz.

    Jinak ten zápis $menu->ul->li[xx]['class'] = 'active'; jsem použil podle konvencí SimpleXML. Ale některé problémy mě od něj trošku odrazují…

    před 18 lety
  58. johno #58

    avatar

    Nechci framework zaplevelovat fintami pro řešení okrajových úloh. Návrh by měl být čistý.

    Jasné! KISS. Keď to pôjde komponentou, nie je problém.

    Položka v menu bol len akýsi príklad problému, čo sa mi na demonštráciu hodil. Také okrajové to všeobecnejšie teda nevidím, ale to už som zase pri komponentách, ktoré to väčšinou riešia. Teda aspoň mne sa to zatiaľ darí.

    Inak to prevedenie dedenia šablón (ak to môžem nazvať tak vulgárne) sa mi pozdáva.

    Prvé čo ma pri pohlade na to napadlo, bolo to, že či nebudeš potrebovať niekedy niečo ako mixiny. Dá sa to použiť na lepšie rozbitie a znovupoužitie spoločného správania. Čo však môže znamenať „správanie“ v šablóne netuším takže toto je len taký prvotný nočný výkrik.

    před 18 lety
  59. rarouš #59

    avatar

    #39 TimJi, Hegeš je diskotéka – to není z mé hlavy ;) (i stránky maj hegeš)

    #48 Leo, Samozřejmě, že Nette by to mělo validovat, ale proč mu neusnadnit práci tím, že mu hodíme validní XML – dá se s tim pak lépa pracovat a vymejšlet nad tím různé fičůrky. Nejen na straně serveru, ale někdo to musí i editovat, a když se do Editoru hodí jen schema Nette, mělo by to být v poho…

    před 18 lety
  60. Leo #60

    „Ako spravím v tom hlavnom menu v zdedených stránkach nejako jednoducho klasickú fintu class="selected“ na li, ktorý je práve aktuálny?"

    Pokud jde jen o vzhled, proc to nevyresit na urovni CSS? Napriklad: Znacce body kazde stranky date id podle toho jaka polozka v menu se ma zvyraznit, kazde polozce v menu vlastni id:

    <body id="katalog"
    
    <li id="o_firma">
    <li id='o_katalog">
    <li id="o_kontakty">
    
    #katalog #o_katalog {...}

    Leo

    před 18 lety | reagoval [61] johno
  61. johno #61

    avatar

    #60 Leo, Tak za prvé: Nejde len o vzhľad. Väčšinou je aktuálna položka už nie je linka.

    Za druhé: Aj keby to bol len vzhľad, tak aj to id musí generovať nejaká logika. Potom to id ešte treba vkladať do šablóny. Takže žiadna veľká sláva.

    před 18 lety | reagoval [62] Leo
  62. Leo #62

    #61 johno, Vsak jsem psal pokud jde o vzhled.

    „Väčšinou je aktuálna položka už nie je linka.“

    S tim, ze vetsinou znamena zridka, pokud vubec, osobne takovych webu moc neznam.

    „Aj keby to bol len vzhľad, tak aj to id musí generovať nejaká logika.“

    Jasne, ale odkazy se musi lisit uz ruznym href, ktere generuje nejaka logika, takze o nic nejde.

    Leo

    před 18 lety
  63. Filip Minárik #63

    avatar

    Zaujimavá myšlienka s dedením html súborou, predpokladám, že používaš na nahradzovanie tagov DOMDocument.

    Čo sa týka jazykových verzií, ma napadlo to riešiť cez stringy, v joomle je to xml subor pre každú stránku, čo je dost nešikovné(vznikajú duplicitné stringy).

    Druhé riešenie je pred parsovanim vytiahnúť všetky stringy z documentu <?lang value=‚nazov stringu‘ ?>, kde pri definovaní lang dokumentu dostaneš druhý parameter jazykovú mutáciu($_SESSION, $_REQUEST), ked ich vyzbieraš do pola z dokumentu dáš iba dotaz na databázu/súbor, nech ti vytiahne predmetné stringy.

    lang je názov triedy s unikátnou inštanciou(vzor singleton) kde jednotlivé vytiahnuté stringy sú property objektu. V prípade projektu s jazykovou mutáciou, keď budeš upravovať stránky, tak jednoducho si zvolíš na začiatku jazykovú mutáciu a sa ti natiahnú stringy. Ak string neexistuje vráti false a ty ho pak môžeš zeditovať. Ale to by mohla byť len extension pri jazykových mutáciach do nette(čiže v jednojazyčnom webe sa použije klasika viď. tvoj príklad).

    před 17 lety

Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.


phpFashion © 2004, 2024 David Grudl | o blogu

Ukázky zdrojových kódů smíte používat s uvedením autora a URL tohoto webu bez dalších omezení.