{attr …} a HTML5 atributy

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
jtousek
Člen | 951
+
0
-

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)

Blizzy
Člen | 149
+
0
-

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"}

Editoval Blizzy (4. 7. 2010 10:42)

jtousek
Člen | 951
+
0
-

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
+
0
-

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
+
0
-

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';
jtousek
Člen | 951
+
0
-

Majkl578 napsal(a):

Ale funguje. Zkus si sám:

Jak jsem řekl, neřeší to problém s šablonou takže i když tohle funguje, nijak mi to nepomůže.

David Grudl
Nette Core | 8147
+
0
-

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>