{attr …} a HTML5 atributy
- jtousek
- Člen | 951
Zdravím,
V html5 je možnost používat takzvané datové atributy:
<img src="img.jpg" data-cokoli="nějaký text" />
Tyto atributy potom může nejtypičtěji využívat nějaký javascript.
Není potřeba čekat ani na žádnou implementaci v prohlížečích –
fungují již dnes.
Je možné v Nette šablonách tyto atributy definovat pomocí {attr …
}?
Syntaxe {attr data-cokoli(‚text‘)} přirozeně nefunguje, protože pomlčka
nemůže být součástí názvu metody.
Což znamená, že otázkou vlastně je, jak atributy s pomlčkou definovat pomocí
<?php
Html::el()->atribut('text');
Html::el()->data-cokoli('text'); //přirozeně chyba
Html::el()->dataCokoli('text'); //atribut v html je malými písmeny bez pomlčky
Html::el()->data_cokoli('text'); //atribut v html je s podtržítkem
?>
Editoval jtousek (4. 7. 2010 10:26)
- jtousek
- Člen | 951
Blizzy napsal(a):
Pokud chceš název proměnné nebo metody obsahující pomlčku, zkus ho uzavřít do složených závorek, PHP to takto podporuje, nevím jestli to půjde v Html::el.
Html::el()->{data-cokoli}
Velmi pochybuju, že by něco takového fungovalo. Navíc to zdaleka neřeší problém s {attr …} v šabloně.
- Blizzy
- Člen | 149
jtousek napsal(a):
Velmi pochybuju, že by něco takového fungovalo. Navíc to zdaleka neřeší problém s {attr …} v šabloně.
Problém v šabloně to neřeší (leda že by se řešení ze složenými závorkami dalo použít v šabloně), ale funguje to, tvůj element z prvního příspěvku můžeš definovat takto:
$el = Html::el("img");
$el->src = "img.jpg";
$el->{"data-cokoli"} = "nějaký text";
EDIT:
Jediný fuknční způsob, jak to udělat v šabloně jsem našel tohle
(protože ty složené závorky použité výše se nedají kombinovat s Latte
filtrem):
<img src="img.jpg"{? $x = "data-nejaka"; echo Html::el()->$x("nějaký text")->attributes()} />
Nějaké řešení přímo v šablonách (Latte makru attr) by si to zasloužilo.
Editoval Blizzy (4. 7. 2010 18:43)
- Majkl578
- Moderator | 1364
jtousek napsal(a):
Velmi pochybuju, že by něco takového fungovalo. Navíc to zdaleka neřeší problém s {attr …} v šabloně.
Ale funguje. Zkus si sám:
class Foo
{
public function __call($name, $args)
{
var_dump($name, $args);
}
public function __set($name, $value)
{
var_dump($name, $value);
}
}
$foo = new Foo;
$foo->{'#$%^&&^%$#@!@#$%'}('foo');
$foo->{'defrčštřžýjun@#$%^'} = 'hello';
- David Grudl
- Nette Core | 8218
V poslední revizi jsem přidal podporu pro datové atributy:
$el = Html::el('div');
$el->data['hello'] = 'world';
// nebo
$el->data('hello', 'world');
echo $el; // <div data-hello="world"></div>
stále přitom funguje staré chování
$el->data = 'simple';
echo $el; // <div data="simple"></div>