Forms Rendering
A formák megjelenése nagyon változatos lehet. A gyakorlatban két szélsőséggel találkozhatunk. Egyrészt szükség van
arra, hogy egy alkalmazásban egy sor, egymáshoz vizuálisan hasonló űrlapot jelenítsünk meg, és értékeljük a
$form->render()
segítségével történő egyszerű, sablon nélküli megjelenítést. Ez általában az
adminisztrációs felületek esetében fordul elő.
Másrészt vannak különböző űrlapok, ahol mindegyik egyedi. Megjelenésüket a legjobban a sablonban található HTML nyelv segítségével lehet leírni. És természetesen a két említett szélsőség mellett számos olyan űrlappal is találkozunk, amelyek valahol a kettő között helyezkednek el.
Renderelés Latte-val
A Latte templating rendszer alapvetően megkönnyíti az űrlapok és elemeik megjelenítését. Először megmutatjuk, hogyan lehet az űrlapokat manuálisan, elemenként renderelni, hogy teljes kontrollt kapjunk a kód felett. Később megmutatjuk, hogyan lehet automatizálni ezt a renderelést.
A Nette\Forms\Blueprint::latte($form)
metódus segítségével létrehozhatja a Latte sablon
javaslatát az űrlaphoz, amely a böngészőoldalra kimeneti azt. Ezután csak ki kell választania a kódot egy kattintással,
és be kell másolnia a projektjébe.
{control}
A legegyszerűbb módja egy űrlap megjelenítésének, ha egy sablonba írjuk:
A renderelt űrlap kinézete a Renderer és az egyes vezérlőelemek konfigurálásával változtatható.
n:name
Rendkívül egyszerű a PHP-kódban lévő űrlapdefiníciót HTML-kóddal összekapcsolni. Csak hozzá kell adni a
n:name
attribútumokat. Ennyire egyszerű!
Az eredményül kapott HTML-kód kinézete teljes mértékben az Ön kezében van. Ha a n:name
attribútumot
használja a <select>
, <button>
vagy a <textarea>
elemeket használ, azok
belső tartalma automatikusan kitöltődik. Ezen kívül a <form n:name>
tag létrehoz egy helyi változót
$form
a rajzolt űrlapobjektummal és a záró </form>
kirajzolja az összes ki nem rajzolt
rejtett elemet (ugyanez vonatkozik a {form} ... {/form}
).
Nem szabad azonban megfeledkeznünk az esetleges hibaüzenetek megjelenítéséről sem. Mindazokat, amelyeket a
addError()
módszerrel (a {inputError}
segítségével), mind azokat, amelyeket a módszerrel adtunk
hozzá az egyes elemekhez, és azokat is, amelyeket közvetlenül az űrlaphoz adtunk hozzá (a
$form->getOwnErrors()
által visszaadottak):
Az összetettebb űrlapelemek, mint például a RadioList vagy CheckboxList, elemenként is megjeleníthetők:
{label}
{input}
Nem akarja átgondolni, hogy minden egyes elemhez milyen HTML elemet használjon a sablonban, akár <input>
,
<textarea>
stb. A megoldás az univerzális {input}
tag:
Ha az űrlap fordítót használ, a {label}
címkékben lévő szöveg le lesz fordítva.
Az összetettebb űrlapelemek, mint például a RadioList vagy CheckboxList, elemenként is megjeleníthetők:
A <input>
magának a Checkbox elemben való megjelenítéséhez használja a
{input myCheckbox:}
címet. A HTML-attribútumokat vesszővel kell elválasztani
{input myCheckbox:, class: required}
.
{inputError}
Hibaüzenetet ír ki az űrlapelemhez, ha van ilyen. Az üzenet általában egy HTML-elembe van csomagolva a formázás
érdekében. Az üres elem megjelenítésének elkerülése, ha nincs üzenet, elegánsan megoldható a n:ifcontent
segítségével:
A hasErrors()
metódus segítségével észlelhetjük a hiba jelenlétét, és ennek megfelelően állíthatjuk be
a szülőelem osztályát:
{form}
Címkék {form signInForm}...{/form}
alternatívája a
<form n:name="signInForm">...</form>
.
Automatikus renderelés
A {input}
és {label}
címkékkel könnyen létrehozhatunk egy általános sablont bármilyen
űrlaphoz. Ez az összes elemét szekvenciálisan végigjárja és megjeleníti, kivéve a rejtett elemeket, amelyek automatikusan
megjelenítésre kerülnek, amikor az űrlapot a </form>
címkével zárul. A megjelenített űrlap nevét a
$form
változóban várja el.
A használt önzáró párcímkék {label .../}
a PHP kódban az űrlap definíciójából származó címkéket
jelenítik meg.
Ezt az általános sablont elmentheti a basic-form.latte
fájlba, és az űrlap megjelenítéséhez csak be kell
építenie, és át kell adnia az űrlap nevét (vagy példányát) a $form
paraméterhez:
Ha egy adott űrlap megjelenését szeretnénk befolyásolni, és egy elemet másképp rajzolni, akkor a legegyszerűbb, ha a sablonban olyan blokkokat készítünk, amelyeket később felülírhatunk. A blokkok dinamikus nevet is kaphatnak, így a kirajzolandó elem nevét is beillesztheti beléjük. Például:
A pl. username
elemhez ez létrehozza a input-username
blokkot, amely könnyen felülírható a {embed} tag használatával:
Alternatívaként a basic-form.latte
sablon teljes tartalma definiálható blokkként, beleértve a
$form
paramétert is:
Ez némileg megkönnyíti a használatát:
A blokkot csak egy helyre kell importálnia, az elrendezési sablon elejére:
Speciális esetek
Ha csak az űrlap belső részét kell megjelenítenie HTML címkék nélkül <form>
, például a snippetek
elküldésekor, rejtse el őket a n:tag-if
attribútummal:
A formContainer
címke az űrlapkonténeren belüli bemenetek megjelenítését segíti.
Renderelés Latte nélkül
A legegyszerűbb módja egy űrlap megjelenítésének a következő hívás:
A renderelt űrlap kinézete a Renderer és az egyes vezérlőelemek konfigurálásával változtatható.
Kézi renderelés
Minden űrlapelem rendelkezik olyan metódusokkal, amelyek az űrlapmező és a címke HTML-kódját generálják. A metódusok vagy egy karakterlánc vagy egy Nette\Utils\Html objektum formájában adhatják vissza:
getControl(): Html|string
az elem HTML kódját adja vissza- A
getLabel($caption = null): Html|string|null
a címke HTML-kódját adja vissza, ha van ilyen.
Ez lehetővé teszi az űrlap elemenkénti megjelenítését:
Míg néhány elem esetében a getControl()
egyetlen HTML-elemet ad vissza (pl. <input>
,
<select>
stb.), mások esetében egy egész HTML-kódot ad vissza (CheckboxList, RadioList). Ebben az esetben
használhat olyan metódusokat, amelyek külön-külön generálnak beviteli és címkézési adatokat, minden egyes elemhez
külön-külön:
getControlPart($key = null): ?Html
egy elem HTML-kódját adja vissza.getLabelPart($key = null): ?Html
visszaadja egy elem címkéjének HTML-kódját.
Ezek a metódusok történelmi okokból a get
előtaggal vannak ellátva, de a generate
jobb lenne, mivel minden egyes híváskor egy új Html
elemet hoz létre és ad vissza.
Renderer
Ez egy objektum, amely az űrlap renderelését biztosítja. A $form->setRenderer
metódussal lehet
beállítani. A $form->render()
metódus meghívásakor adják át a vezérlést.
Ha nem állítunk be egyéni renderelőt, akkor az alapértelmezett renderelőt Nette\Forms\Rendering\DefaultFormRenderer fogja használni. Ez az űrlap elemeit HTML táblázatként rendereli. A kimenet így néz ki:
Sok webdesigner más jelöléseket, például listát preferál. Beállíthatjuk a DefaultFormRenderer
címet
úgy, hogy egyáltalán ne rendereljük táblázatba. Csak megfelelő $wrappereket kell
beállítanunk. Az első index mindig egy területet, a második pedig egy elemet jelöl. A képen az összes megfelelő terület
látható:

Alapértelmezés szerint a controls
egy csoportja be van csomagolva egy <table>
, és minden
egyes pair
egy táblázat sora <tr>
amely a label
és a control
egy
párját tartalmazza (cellák <th>
és <td>
). Változtassuk meg ezeket a burkolóelemeket. A
controls
-t be fogjuk csomagolni <dl>
, a pair
-t önmagában hagyjuk, a
label
-t a következőbe tesszük <dt>
és a control
-t a következőbe csomagoljuk
<dd>
:
Az eredmény a következő részlet:
A burkolók számos attribútumot befolyásolhatnak. Például:
- speciális CSS osztályok hozzáadása minden egyes űrlapbemenethez
- megkülönböztetni a páratlan és páros sorokat
- a kötelező és opcionális elemek eltérő rajzolása
- állítsa be, hogy a hibaüzenetek az űrlap felett vagy az egyes elemek közelében jelenjenek meg.
Opciók
A Renderer viselkedése az egyes űrlapelemek opciók beállításával is szabályozható. Így beállítható a beviteli mező mellett megjelenő tooltip:
Ha HTML tartalmat szeretnénk elhelyezni benne, akkor a Html osztályt használjuk.
Html elem is használható a címke helyett: $form->addCheckbox('conditions', $label)
.
Bemenetek csoportosítása
A renderelő lehetővé teszi az elemek vizuális csoportokba (mezőcsoportokba) való csoportosítását:
Új csoport létrehozása aktiválja azt – minden további hozzáadott elemet hozzáad ehhez a csoporthoz. Egy űrlapot így építhetünk fel:
A renderelő először a csoportokat rajzolja ki, majd azokat az elemeket, amelyek nem tartoznak egyik csoporthoz sem.
Bootstrap támogatás
Példákat talál a Twitter Bootstrap 2, Bootstrap 3 és Bootstrap 4 Renderer konfigurációjára.
HTML attribútumok
Az űrlapelemek tetszőleges HTML-attribútumainak beállításához használja a
setHtmlAttribute(string $name, $value = true)
metódust:
Az elem típusának megadása:
A típus és egyéb attribútumok beállítása csak vizuális célokat szolgál. A bevitel helyességének ellenőrzésének a kiszolgálón kell megtörténnie, amit egy megfelelő űrlapvezérlő kiválasztásával és érvényesítési szabályok megadásával biztosíthat.
A rádió- vagy jelölőnégyzet-listák egyes elemeihez beállíthatunk egy HTML-attribútumot, amelynek értékei eltérőek
lehetnek. Vegyük észre a kettőspontot a style:
után, ami biztosítja, hogy az értéket a kulcs alapján
válasszuk ki:
Renders:
A boolean attribútumok beállításához, mint például a readonly
, használhatjuk a kérdőjellel ellátott
jelölést:
Renders:
A selectboxok esetében a setHtmlAttribute()
módszer beállítja az attribútumokat a
<select>
elemhez. Ha az attribútumokat minden egyes <option>
, a
setOptionAttribute()
módszert fogjuk használni. A fent használt kettőspont és kérdőjel is működik:
Renders:
Prototípusok
A HTML-attribútumok beállításának alternatív módja a sablon módosítása, amelyből a HTML-elem generálódik.
A sablon egy Html
objektum, és a getControlPrototype()
metódus adja vissza:
A getLabelPrototype()
által visszaadott címke sablon is módosítható ilyen módon:
A Checkbox, CheckboxList és RadioList elemek esetében befolyásolhatja az elemet körülvevő elemsablont. Ezt a
getContainerPrototype()
adja vissza. Alapértelmezés szerint ez egy „üres“ elem, tehát semmi sem kerül
megjelenítésre, de ha nevet adunk neki, akkor megjelenítésre kerül:
A CheckboxList és RadioList esetében a getSeparatorPrototype()
metódus által visszaadott elemelválasztó
mintát is lehet befolyásolni. Alapértelmezés szerint ez egy elem <br>
. Ha ezt páros elemre változtatjuk,
akkor az egyes elemeket elválasztás helyett be fogja burkolni. Lehetőség van az elemcímkék HTML elemsablonjának
befolyásolására is, amely a getItemLabelPrototype()
metódust adja vissza.
Fordítás
Ha többnyelvű alkalmazást programoz, valószínűleg különböző nyelveken kell megjelenítenie az űrlapot. A Nette Framework erre a célra egy fordítási felületet definiál Nette\Localization\Translator. A Nette-ben nincs alapértelmezett implementáció, igényei szerint választhat több kész megoldás közül, amelyeket a Componette-en talál. A dokumentációjukból megtudhatja, hogyan kell a fordítót konfigurálni.
Az űrlap támogatja a szövegek kiadását a fordítóprogramon keresztül. Ezt a setTranslator()
metódus
segítségével adjuk át:
Mostantól kezdve nemcsak az összes címke, hanem az összes hibaüzenet vagy a kiválasztó dobozok bejegyzései is le lesznek fordítva egy másik nyelvre.
Lehetőség van az egyes űrlapelemekhez más fordítót beállítani, vagy a fordítást teljesen kikapcsolni a
null
címmel:
Az érvényesítési szabályok esetében a fordítónak specifikus paramétereket is át kell adni, például a szabály esetében:
A fordítót a következő paraméterekkel hívjuk meg:
így a characters
szóhoz a megfelelő többes számot tudja kiválasztani.
Esemény onRender
Közvetlenül az űrlap renderelése előtt meghívhatjuk a kódunkat. Ez például HTML-osztályokat adhat az űrlap elemeihez
a megfelelő megjelenítés érdekében. A kódot a onRender
tömbhöz adjuk hozzá: