Malá knihovna pro generování (X)HTML kódu v PHP.
→ Download
Způsobů, jak v PHP vygenerovat kód stránky, je celá řada. Od obyčejného volání příkazu echo, přes použití šablon, až po funkce DOM. Hledání nejlepší metody vede k paradoxu. Čím je programátor zkušenější, tím více tíhne k čistějším řešením, ideálně na bázi XML DOM. Tím však začne narážet na nové překážky a omezení a více času tráví jejich řešením a obcházením. Díky čemuž více tíhne k pragmatickým řešením, jako je třeba volání echo.
Ale posuzování vhodnosti jednotlivých způsobů není předmětem článku.
Seznamte se s Nette\Utils\Html (dříve NHtml)
Generování HTML značek „na koleně“ vede k nepřehlednému kódu a tím i k větší náchylnosti k chybám. Vezměme si jednoduchý příklad:
echo '<select name="person"',
($required ? ' class="required"' : ''), '>';
$res = dibi::query('SELECT * FROM [persons] WHERE [group]=%s', $group);
while ($rec = $res->fetch())
echo '<option value="', $rec['id'], '"',
($active == $rec['id'] ? ' selected="selected"' : ''),
'>', htmlSpecialChars($rec['name']),
'</option>';
echo '</select>';
Nic moc, že? Zápis lze značně zpřehlednit za použití Nette\Utils\Html pomocníka. Jde o malou knihovničku, která má za úkol objektově zapouzdřit HTML elementy a především nabídnout programátorovi intuitivní a šikovné rozhraní.
Nejprve malá ochutnávka:
// vytvoříme element
$el = Html::el('img');
// včetně jmenného prostoru $el = Nette\Utils\Html::el('img');
// nastavíme atributy
$el->src = 'image.gif';
$el->alt = $text;
// a vypíšeme ho
echo $el; // <img src="image.gif" alt="..." />
// Html::$xhtml = false; vypne XHTML režim
Atributy lze nastavovat i voláním přetížených metod, například
$el->src('image.gif')
. Zde lze s výhodou využít
řetězovitého volání (fluent interfaces):
$params['id'] = 10;
echo Html::el('a')->href('http://www.dgx.cz', $params)->setText('Klikněte');
// vypíše <a href="http://www.dgx.cz?id=10">Klikněte</a>
echo Html::el('img')->src($url)->alt($alt);
echo Html::el('input')->type($secret ? 'password' : 'text');
Atributem však nemusí být jen řetězec:
$el = Html::el('input')->type('checkbox');
$el->checked = true; // <input type="checkbox" checked="checked" />
$el->checked = false; // <input type="checkbox" />
// atribut zrušíme hodnotou null
$el->type = null; // <input />
// lze použít dokonce pole
$el->class[] = $active ? 'active' : null; // null se ignoruje
$el->class[] = 'top';
$el->style['color'] = 'green';
$el->style['display'] = 'block';
echo $el;
// <input class="active top" style="color: green; display: block" />
Někdy dávám přednost samostatnému vypsání počáteční a koncové značky namísto celého elementu:
$el = Html::el('div');
echo $el->startTag();
...
... nyní vypisujeme obsah
...
echo $el->endTag();
// nebo obsah rovnou nastavíme elementu
$el->setText('Barnes & Noble');
echo $el; // <div>Barnes & Noble</div>
// volitelným parametrem je možné indikovat HTML kód
$el->setText('Barnes & Noble', true);
echo $el; // <div>Barnes & Noble</div>
Děti a vnoučata
Rodina je základ HTML státu a proto i každý uzel Nette\Utils\Html může mít své potomky:
$el = Html::el();
// (všimněte si, $el je nyní "kontejner", tj. bez názvu elementu)
// a vytvoříme potomka, element strong
$strong = $el->create('strong');
$strong->setText('La Trine');
// nebo lze psát rovnou:
// $el->create('strong', 'La Trine');
// lze přidávat existující uzly Html
$br = Html::el('br');
$el->add($br);
echo $el; // <strong>La Trine</strong><br />
// uzel může být i textový
$el->add('Yes!'); // obdoba setText
// k potomkům lze přistupovat přímo přes ArrayAccess
$el[] = 'Hello!';
if ($el->count()) ...
A zpět k příkladu
Nakonec přepíši úvodní příklad do přehlednější formy pomocí Nette\Utils\Html:
$el = Html::el('select')->name('person')->class($required ? 'required' : null)
$res = dibi::query('SELECT * FROM [persons] WHERE [group]=%s', $group);
while ($rec = $res->fetch())
$el->create('option')
->value($rec['id'])
->selected($active == $rec['id'])
->setText($rec['name']);
echo $el;
poznámka: Html uvádím jako předskokana knihovny Nette\Forms, která slouží ke snadné tvorbě a obsluze webových formulářů. A právě Nette\Utils\Html používá pro generování kódu. Takže tak.
Komentáře
Sitnarf #1
Hezké, asi vylepším svoje prasácké programování.
ivan_d #2
Mám podobnou tendenci – nemíchat php a html. Mám opačnou tendenci – vynechat php.
zirafka #3
cekala jsem dneska spis spot o googleni, ale tohle je taky dobry (-;
ne fakt, vypada to dost dobre!
Peter p360t Kováč #4
a myslíš, že by sa to dalo použiť ako plnohodnotná náhrada Smarty a pod.?
piler #5
pekne, pekne…ale co oddelenie aplikacnej logiky od prezentacnej?
afu #6
#4 Petere p360te Kováči, smarty je hodně pokročilý šablonovací systém, nhtml bych s nimi moc nerovnával, natož mluvil o plnohodnotné náhradě. třebaže je nhtml počin zajímavý, já osobně pro něj v současnosti využití nemám.
ivan_d #7
#5 pilere, Reálná aplikace je něco jiného než ukázka knihovny. Navíc nikde ani v příkladech nevidím zřejmé míchání aplikační logiky a prezentační – prezentace přece musí od někud číst, ne?
piler #8
#7 ivan_de, priklad to je a to ci sa to odniekadial cita, este neznamena ze si oddelil prezentacnu logiku o aplikacnej. Ked pracuju viaceri na jednom projekte, tak by mali byt tieto casti oddelene..PHP by malo citat HTML sablony…a nie generovat HTML…
piler #9
#6 afu, ja som si tiez zacal tvorit formularovy framework a miesal som html z php, tak som sa rozhodol ze to prerobim cez sablony, pretoze je to balast kodu, ktory nie je mozne modifikovat, bez zasahu do PHP a to uz nie je dobre. Inak smarty vyuzivam ako main system pre svoje projekty a som velmi spokojny, aj ked uz tam je to oddelenie logiky na vazkach…
ivan_d #10
#8 pilere, PHP by malo citat HTML sablony…a nie generovat HTML…
By mělo? To přece záleží na více faktorech – velikost a účel projektu, pravidla daného týmu nebo jednotlivce… Osobně taky upřednostňuji (pseudo)html #2 ivan_d, ale není to absolutní, jediný a hlavně VŽDY správný postup. Nebo se mýlím?
David Grudl #11
#4 Petere p360te Kováči, používám to ve spojení se šablonovacím systémem, lze si tak připravit HTML elementy, které v šabloně umístím (zjednodušeně řečeno). Tedy jde o součást jiného šablonovacího systému. Nicméně, za plnohodnotnou náhradu Smarty v 99 % případů považuju třeba tohle, zkrátka je věc názoru :)
#5 pilere, chceš tím říct, že jsem měl v příkladech umístit
$res = dibi::query(...)
do odděleného „chlívečku“? No, to by hodně pomohlo srozumitelnosti…#3 zirafko, Já to nemůžu Rojovi udělat. Sice je fakt, že už nikdy to nebude jako dřív, ale fakt ho tím nechci zatěžovat.
piler #12
#11 Davide Grudle, vies co som chcel asi povedat tym oddelenim aplikacnej a prezentacnej logiky…
proste moj nazor je taky, ze html sablony by mali byt osobitne subory, ktore PHP nacita, preparsuje zastupne znacky a vypluje na screen…
To mi pride velmi prehladne, pretoze aj clovek neznaly PHP, vie tieto sablony modifikovat..
Co sa tyka NHtml, syntax je super, pripomina mi to jednu triedu na generovanie xml dokumentov, ale v jednoduchosti je krasa, nie? 🙂
Je to urcite prehladnejsie ako ten 1. priklad, ale som proste zvyknuty uz na nieco ine..
David Grudl #13
#12 pilere, no já právě nerozumím, co jsi tím chtěl říct. To, co vidíš v příkladech, je čistě prezentační logika, a řekněme že dibi::query je napovážovou. Ale šablony jsou něco docela jiného. Ano, mohu používat šablony, rád je používám, ale pak je prezentační logikou i celý šablonovací systém. V případě Smarty jde třeba o několik set kilobajtů PHP kódu. A šablona je jen součástí, konfigurákem, pro určitý typ prezentační logiky.
ivan_d #14
#13 Davide Grudle, Zcela souhlasím. A nemyslím si že je dibi::query na pováženou. Pokud má mezivrstva význam, pak má být, pokud POUZE komplikuje kód, tak je mezivrstva ke škodě.
Myslím, že všechny MVC a spol. vznikali kvůli tomu, aby pomohli (urychlit vývoj, udržovat aplikaci atd.). Pokud dělají opačné věci, něco tam nehraje.
Štěpán Svoboda #15
Vypadá to velice užitečně :) Sám používám Smarty na většinu projektů (těch větších (tj. jeden)) na „mini-aplikace“ nepoužívám žádné šablony neb je to kontraproduktivní. A právě při použití původního přístupu tj.:
…mi tohle přijde jako super pomocník… Jsem zvědav na NForms – btw imho je název NForms velice obyčejný :)
PS: Chtěl jsem se optat na něco také:
A jak by to bylo pokud chci použít funkci s parametrem?
error414 #16
#15 Štěpáne Svobodo,
strilim od boku, mozna na to ma specialni ficuru. Ale v jednoduchosti je sila ne?
#12 pilere,
PHP samo je sablonovaci system, s jednoduchym sriptovanim
PHP plnohodnotny scriptovaci jazyk.
Zalezi na uhlu pohledu. Kazdy at si pouziva to PHP co zrovna potrebuje.
tark #17
A neslo by to uz vypustit cele? Clovek se vzdycky dovi neco… ;) BTW, jaka je licence?
error414 #18
#17 tarku, trochu namohy hosi
LokoN #19
#15 Štěpáne Svobodo, Javascriptové události navěšuj javascriptem a je to.
johno #20
DGX: Mne sa to páči. K zdrojáku snáď len malé výhrady.
public static $emptyTags
alebo aspoň vyňal do metódy.htmlspecialchars()
default charset zo zásady na UTF-8.koolazz@koolazz.com #21
zlaté xml a xslt :)
Radek Hulán #22
Pěkně napsané a moc užitečné 🙂
PS: také máš takový pocit, že po pár „flame“ článcích by mělo přijít něco užitečného, a proto jej publikuješ? 😉
afu #23
#11 Davide Grudle, >>Nicméně, za plnohodnotnou náhradu Smarty v 99 % případů považuju třeba tohle, zkrátka je věc názoru :)
šimpanz má s člověkem společných 99% genů, takže je vlastně taky jeho plnohodnotnou náhražkou :)
Thomas #24
#23 afu, Proč ne ? záleží na úhlu pohledu, navíc je otázkou zda působení člověka na této planetě lze nazvat jakkoliv prospěšným (jako je to v případě Smarty v PHP) a tedy zda je vůbec nutné pro něco tak zbytného hledat plnohodnotnou náhradu, kdyby se to náhle rozhodlo vypařit 🙂. Vždyť i do společného přírodního rozpočtu zvaného „potravní řetězec“ už člověk nepřizpívá a jen z něj těží, tak komu by vlatně takový leecher chyběl 🙂
johno #25
#23 afu, #24 Thomas Myslím, že flame PHP vs Smarty tu už zopár krát bol. Tak to urýchlime, hej? Každý nech si používa to, čo mu vyhovuje.
tark #26
#18 error414, Sorry, website Nette is under construction :P
Arthur Dent #27
Programátoři pochopí a mohou se inspirovat, ostatním je to na pendrek, i kdybych to vysvětlil :)
johno #28
#27 Arthure Dente, Ty vole Arthure, ty už reaguješ na ten článok o NForms?
Arthur Dent #29
#28 johno, Inspiraci se meze nekladou :) Kdo chce NForms, použije NForms, kdo chce něco na Míru, udělá si svoje a může se inspirovat (já kód z mnohokrát opakovaných důvodů zveřejňovat nebudu, takže je to opravdu jen pro inspiraci).
David Grudl #30
startTag()
odlišit private od public. Jen proto.Čisté řešení by bylo přes overloading, ale to je mrcha, velké nedochůdče PHP. S přístupem k proměnným jakožto polím by bylo hodně komplikací.
#17 tarku, zatím na to nemám sílu ani chuť. Obojí postupně sbírám 🙂
#20 johno, áá, tak jsi byl s vysvětlením rychlejší ;) ale ještě k tomu charset: vůbec mi nedochází, co změna této hodnoty ovlivní, nasměruj mě prosím.
#27 Arthure Dente, u NForms vypadá konfigurace asi takto:
Zajímavé jsou zejména ty validační pravidla, která pracují jak na straně serveru, tak i na straně klienta vygenerují příslušný javascript. Podobně jako u NHtml, jde o malinkou knihovnu, prostě „malej ale šikovnej“ 🙂
Radek Hulán #31
#30 Davide Grudle, zajímavé, je tam podporován i fieldset, popřípadě table pro formátování?
sway #32
Hmm, to vypada moc sikovne:) Uz se tesim na NForms…ikdyz timhle bych se mohl taky nekde v nejakem projektu inspirovat, ne-li to pouzit:) Diky, dgx
David Grudl #33
#31 Radku Huláne, formátování lze propojit s libovolnou šablonou, zkrátka jsem chtěl odbourat všechna omezení, aby výsledný kód byl přesně podle potřeb, a ne určený knihovnou.
Ale to už fakt komentujeme příští článek 🙂
johno #34
#30 Davide Grudle, Niekde som čítal, že to bez toho parametra môže domrviť niektoré UTF-8 znaky. Odporúčali to tam proste explicitne uviesť. Nejako hlbšie som to neskúmal.
#33 Davide Grudle, Ja budem komentovať NForms až v tom buducom článku, dobre?
David Grudl #35
#34 johno, htmlSpecialChars je záměna čtyř (pěti) znaků v rozsahu ASCII za jiné znaky v rozsahu ASCII. Tady nemá jak vzniknout problém, až už je kódování jakékoliv jednobajtové nebo UTF-8. Problém by byl až s UTF-16 & spol., což zase na webu „nelze“ používat, že.
#34 johno, ad komentování: jo, to bude nejlepší 🙂
poznámka: v komentářích lze používat:
Arthur Dent #36
K #30 David Grudl – kdo uhodne, proč jsem zvolil pole a nikoli objekt, dostane bod. :)
Marek #37
#27 Arthure Dente, [smazáno] pardon, tady jsme si asi nerozuměli … já boha hulána neurážím, račte si prosím přečíst jeho desatero kterak díky tupému davu získat navštěvovaný blog . pouze jsem vypíchl hlavní body z tohoto desatera …
https://web.archive.org/…ovany-weblog
pozastavil jsem se pouze nad tím, s jakou samozřejmostí podobnou bezpáteřní náturu očekává ten člověk i u ostatních blogerů, to je celé …
numero #38
Velice dobré. Proč to nazýváš nhtml, proč ne dgxhtml? Teď budu muset svoje knihovny přejmenovat na num_jmeno :)
Arthur Dent #39
#37 Marku, „také máš takový pocit, že po pár „flame“ článcích by mělo přijít něco užitečného, a proto jej publikuješ?“ je očekávání bezpáteřní nátury? Svatá prostoto!
finc #40
Pěkné, něco podobného řeším také. Sám jsem si napsal několik tříd na generování HTML. Sice může spoustu lidí namítat, že je to míchání aplikační a prezentační logiky, ale pokud člověk dělá např. intranetový systém, grafik či html kodér zde nemají místo.
Navíc, takovéto uspořádání je extrémně rychlé při programování. Psát znovu a znovu html kod je podlě mě větší prasárna (alespoň v zájmu intranetového systému).
Jinak, mám definované i vlastní třídy pro vytváření tabulek:
Díky tomu jsem schopný dané objekty odeslat buď do html, pdf či xls.
Havran #41
#27 Arthure Dente, Niečo podobné má v sebe aj (WEB)CMS DRUPAL – viď Forms API Quickstart Guide
zirafka #42
#11 Davide Grudle, Jeste ze Roj ty Tvoje clanky o PHP necte. Myslim, ze by z tech narazek byl zbytecne vystresovany.
noname #43
Mně se to také celkem líbí, možná bych jen ještě uvítal nějakou jednoduchou možnost pro „internacionalizaci“, tj. aby to umělo všechny vkládané statické texty vytáhnout a nějak přes asi gettext (ngettext) umožnit překlad, aniž bych musel každý text uzavírat do nějaké _() funkce. Nebo jak vy řešíte multijazyčnost vašich aplikací?
Potom by bylo úžasné, kdybys udělal nějaký balíček dibi a nforms (s nhtml) a s pár typickými příklady (nějakou mikroaplikačkou) – třeba primitivní CMS:
BTW mírně offtopic – vidím, že přiřazujete násobné CLASS – znáte nějaký fígl, jak přinutit IE6, aby je podporoval? Když napíšu div class=„abc cde“, tak IE6 si z toho vezme tuším jen tu první.
jonge #44
#11 Davide Grudle, Hm zvláštní… já mám taky svůj vlastní šablonovací systém a ten kód je až podezřele podobný tomu mému :) ono se to asi ani nijak jinak udělat nedá…
llook #45
#11 Davide Grudle, #44 jonge Podobný šablonovací systém také občas používám. Inspiroval jsem se prozměnu jinde. Mimochodem, neměli byste zapomínat ošetřit tohle:
Také jsem si myslíval, že v šablonách nikdy nevyužiju nic, co neumí samotné Smarty, z toho mě vyvedla až zkušenost (zkuste si vypsat vnořená pole jako vnořené UL seznamy; lze to, ale v PHP mnohem přehledněji).
Bohužel, šablonovací schopnosti PHP se nijak nerozvíjejí, něco jako tag libs by se občas hodilo.
#20 johno, Znaky mrví htmlentities a lze se s tím setkat na mnoha a mnoha zahraničních webech. Špatné užití této funkce doporučuje i David Sklar (autor knihy PHP – moduly, rozšíření a akcelerátory)…
FOUS #46
#45 llooku, Tesat do kamene: In short, the point of template engines should be to separate your business logic from your presentation logic, not separate your PHP code from your HTML code.
Keff #47
#22 Radku Huláne, To je hezká zásada, kdyby po každých pár flame článcích vzniknul jeden malý ale užitečný framework, hned by bylo krásně na světě :)))
Roj #48
#3 zirafko, #11 David Grudl Safra safra, nejak nevim, co googlit. Zavolejte 🙂
zirafka #49
#48 Roji, Obavam se, ze to ani nechces vedet! My jsme to taky nikdy vedet nechteli… (-;
miso #50
#4 Petere p360te Kováči, co to ma spolocne so Smarty? podla mna nic
David Grudl #51
#48 Roji, Roji, v pohodě, vůbec o nic nejde
#49 zirafko, já se s tím ještě dodneska nevyrovnal ☹ Ani nevím, jak se teď k němu chovat… Ale neřešme to už.
Roj #52
#51 Davide Grudle, jasne, nic nebylo a nikdo nikde nebyl
#49 zirafko, vsak on ve skutecnosti pozna, ze dokaze odpoustet. Vic, nez si kdy myslel.
tark #53
Kdy se chystáš vydat NForms? Trošku by se mi hodila… 😉
Pavel Gloss #54
Velmi dobrá pomůcka, kterou začínám prakticky používat. Jenom mi nešlo volat u objektu elementu settery
př.: $menulink->href(„index.php?kategorie={$kategorie->getID()}“);
kvůli přistupování k privátní metodě.
Fatal error: Call to private method NHtml::__call() from context
Tak jsem změnil hlavičku funkce na public
public function __call($m, $args)
a funguje. Používám PHP5…mohlo to být tím ?
David Grudl #55
#54 Pavle Glossi, ano, to je dobrá připomínka, v PHP < 5.1 je nutné deklarovat funkci __call jako public. Opravil jsem to.
Dundee #56
Zajímavé a dost jednoduché (kód třídy na 220 řádků).
Pokud ale nejsem úplně mimo, tak tahle třída funguje jen na PHP 5, což bych viděl jako velkou nevýhodu. Jak ale říkám, třída a vůbec princip fungování je dost jednodychý, takže není problém třídu přepsat a nebo napsat rovnou celou po svém…
tark #57
#56 Dundee, PHP5 není nevýhoda,nové projekty NEMÁ SMYSL kódovat pro čtyřku… Nevidím důvod, pětka už je dost rozšířená… A já kóduju ještě jen pro PostgreSQL :D
Lukáš #58
Je to perfektní, strašně se mi líbí malá jednoduchá řešení, ze kterých se dá stavět. Moc se těším na Nette. Na jaře si chci napsat svůj srdeční projekt a rád bych použil Nette. Má smysl čekat?
Veena #59
Html bez html.
Opravdovej DOM… aneb simpledom.
#stary-odkaz-#stary-odkaz-http://slapstick.php5.cz/simpledom/pouziti.phps
#stary-odkaz-#stary-odkaz-http://slapstick.php5.cz/simpledom/simpledom1.0.tgz
Třídy mají implementovány metody nezbytné k základnímu chodu. Další metody zřejmě přibudou, až to pořádně otestuju ve vývoji. Možná se změní i implementace stávajících metod.
Za každý návrh ke zlepšení nebo za doplnění knihovny budu vděčný.
David Grudl #60
Poznámka pro uživatele NHtml: knihovna se neustále mírně vyvíjí, v poslední revizi jsem metodu
setContent
přejmenoval na výstižnějšísetText
.#59 Veeno, pěkné! Líbí se mi volání
$xyz = $el->add('xyz')
, podobnou techniku jsem přidal do NHtml.Doplněno 9. 10. 2007: metoda
add
přejmenována nacreate
JK #61
Mám otázku k licenci. Je/bude kompatibilní k GPL? Řekněme že vytvořím www stránky, které NHtml použijí pro generování částí xhtml (ale zdroják samotné třídy jsem nezměnil) – musím potom dát někam ke stažení zdroják toho webu?
David Grudl #62
#61 JKu, NHtml (a také dibi) jsou šířeny pod licencí ve stylu BSD, která je kompatibilní s GPL.
Jakub #63
Toto rozhodně vyzkouším. A tuším, že mi to bude nápomocno dosti 🙂
Onecar #64
Dejve, to je žrádlo. Mňam.
Honza M. #65
Tak mi napadlo, jestli jde do elementu přidat jako dalšího potomka / potomky nějaké html. Třeba výcuc z databáze.
Ono to přidá <výcuc z db></výcuc z db> ☹
Honza M. #66
už jsem to možná naštudoval
Honza M. #67
Se už asi smí. Ale zrušil bych ty uvozovky u add. Bez nich to hlásí chybu.
Honza M. #68
Přidělal bych $el->addText();. Jenže to už má NForms. Zapeklitá situace…
Honza M. #69
To vkládání existujících elementů mi nefunguje.
Fatal error: Uncaught exception ‚NHtmlException‘ with message ‚Name must be string or null‘ in .........NHtml.php:110 Stack trace: #0 .........NHtml.php(226): NHtml->setName(Object(NHtml)) #1 ................index.php(28): NHtml->add(Object(NHtml)) #2 {main} thrown in ................NHtml.php on line 110
David Grudl #70
#69 Honzo M., no, cca tady #60 David Grudl jsem trošku zmršil API. Totiž, co všechno je možné vložit?
Vkládání řeší metody
add(...)
aaddChild(...)
, jenže takovéto pojmenování je napytel, není zřejmé, co která dělá. Jak z toho ven? NoaddChild
bych bez náhrady zrušil. Je potřeba rozlišit textový uzel a jméno nového elementu.Jedna z možností je: (zápis v pseudophp, čísla odpovídají prvnímu seznamu)
$el->add(NHtml $child)
$el->add(string $text)
$el->addNew(string $name [, $content])
(nebocreate
?)Samozřejmě jde o BC break, kdy metodu
add
by bylo potřeba přejmenovat naaddNew/create
. Nebo:$el->add(NHtml $child)
$el->addText(string $text)
$el->add(string $name [, $content])
Napadá vás jiné řešení?
David Grudl #71
#70 Davide Grudle, a ještě jedna věc. Metoda, která přidává existující NHtml (č. 1), by měla vracet sama sebe ve stylu fluent interfaces, zatímco metoda přidávající nový element (č. 3) by měla vracet tento. Takže tím pádem se nemůžou jmenovat stejně a název musí tento rozdíl vystihovat. BC se holt nevyhnu.
Takže počínaje revizí 87 zde budou metody:
$el->add(NHtml $child | string $text)
vrací sebe$el->create(string $name [, $content])
vrací nový elementVe svých kódech si přejmenujte
add(
→create(
aaddChild(
→add(
. Sorráč. Text článku upravím. Obdobná změna se bude týkat i TexyHtml.Indi #72
#71 Davide Grudle, Prima. Takhle je to nej.
btw. co to phpfashion.com? 🙂 ty ses tajnůstkář
Honza M. #73
Tak, ještě mám dva zvídavé dotazy 😉
NHtml: lze zadat najednou více atributů? Představoval bych si to třeba jako v jQuery:
NForms: Mohla by mít textarea nějaké defaultní rozměry? Pro svoje účely administračního rozhraní si je stejně nastavuji javascriptem, tak mi přišlo zbytečné tam klepat nějaká čísla, která na výsledek nemají vliv.
David Grudl #74
#73 Honzo M., pole atributů uveď jako druhý parametr metody el()
Honza M. #75
#74 Davide Grudle, oki. Bylo by skvělé, kdyby toto uměly i metody add a create.
Honza M. #76
Ještě jsem vymyslel, že metoda addSubmit u NForms by mohla uznat null jako první parametr. Normálně totiž používám submity bez name.
Jo a jen tak pro zajímavost, pokud má submit name „submit“, tak nejde formulář odeslat javascriptem.
To abych nebyl málo aktivní… 😉
Honza M. #77
NForms:
David Grudl #78
#76 Honzo M., V takovém případě ho musíš odeslat přes form.submit.click(). Jinak u NForms musí mít každý prvek nějaké unikátní jméno, s tím počítají další části systému. Validační pravidlo pro URL by se hodilo, přidal jsem ho jako
NForm::URL
. No a regexp je nutné zadat ve tvaru/.../ig
, s jiným formátem si JavaScript nerozumí.#75 Honzo M., u metody add() je to zbytečné, metoda create() by to mít mohla, přidal jsem.
Honza M. #79
#78 Davide Grudle, Co když chci, aby mail nebo url bylo nepovinné? Když políčko nevyplním, hlásí to chybu.
Podle mě je lepší i pro povinný mail mít dvě validační pravidla. Jedno by ohlásilo nevyplněný mail a druhé špatně vyplněný.
Mám takový podezřelý pocit, že tomu tak bývalo.
David Grudl #80
#79 Honzo M.,
nebo
nebo
atd. Podmínky a pravidla lze libovolně kombinovat:
David Grudl #81
V NHtml stromu je nyní možné se pohybovat i nahoru – přidal jsem funkci
NHtml::getParent()
.Vyžadovalo to ovšem zrušit public přístup k poli NHtml::$children a pole zapouzdřit. Aby změna byla co nejmenší, implementoval jsem interface ArrayAccess, takže k potomkům se přistupuje stále přes pole, jen se vynechá
->children
:Navíc pole potomků se chová jako skutečné pole a nikoliv hash.
yed_ #82
Jen taková drobnost, kterou mám ve své třídě pro formuláře. Pokud vytvořím obsáhlejší formulář, mohu záhy zjistit, že zpracovávat každou položku zvlášť by bylo pracné, tak je zaobalím do pole, které lze snadno zpracovat v cyklu. Příklad
Bez použití InputsArray():
S použitím InputsArray():
veena #83
#82 yed_,
jop, to by mě zajímalo, jestli máš array safe validaci vstupních parametrů i při hlouběji zanořených polích.
Pokud ano, nechtěl bys to zveřejnit?
David Grudl #84
#82 yed_, ano, to je dobrá poznámka. V případě NForm je iterování nad formulářem nebo jeho částí možné už z principu komponent. Brzo dodám nějaký příklad
yed_ #85
#83 veeno, při hlouběji zanořených polích kde?
veena #86
#85 yed_,
yed_ #87
#86 veeno, Zadny pokrocily zpusob, ktery bych stal za to uverejnit, nepouzivam.
Tento článek byl uzavřen. Už není možné k němu přidávat komentáře.