Dynamické generování <ul>/<ol> seznamu pomocí \Nette\Utils\Html
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- tomask
- Člen | 9
Snažím se dynamicky generovat seznamy.
Staticky by to mohlo vypadat takto
$list = Html::el('div');
$blockRoot = $list->create('ul');
$rItem1 = $blockRoot->create('li', 'item 1');
$rItem2 = $blockRoot->create('li', 'item 2');
$rItem3 = $blockRoot->create('li', 'item 3');
$blockSub = $rItem3->create('ul');
$sItem1 = $blockSub->create('li', 'subitem 1');
$sItem2 = $blockSub->create('li', 'subitem 2');
$sItem3 = $blockSub->create('li', 'subitem 3');
Vygeneruje požadované a správně
<div>
<ul>
<li>item 1</li>
<li>item 2</li>
<li>item 3
<ul>
<li>subitem 1</li>
<li>subitem 2</li>
<li>subitem 3</li>
</ul>
</li>
</ul>
</div>
V praxi ale získávám z objektu List
jednotlivé Nody
class Node {
/** @return Html */
public function render()
{
return Html::el('li')->style('color: green')->setText('text');
}
}
Html::create()
ale nepřijímá jako parametr objekt
Html
(anóbrž string
) již dříve vytvořené
elementy, nelze tedy psát:
...
$sItem3 = $blockSub->create($node->render());
...
Html::add()
by šlo využít u jednoúrovňového seznamu,
nikoliv dvou a více úrovňových
$list = Html::el('div');
$blockRoot = $list->create('ul');
$rItem1 = $blockRoot->add($node->render());
$rItem2 = $blockRoot->add($node->render());
$rItem3 = $blockRoot->add($node->render());
$blockSub = $rItem3->create('ul');
$sItem1 = $blockSub->add($node->render());
$sItem2 = $blockSub->add($node->render());
$sItem3 = $blockSub->add($node->render());
Vygeneruje chybný kód
<div>
<ul>
<li style="color: green">text</li>
<li style="color: green">text</li>
<li style="color: green">text</li> <!-- SPATNE, ukonceni ma byt jinde!!! //-->
<ul>
<li style="color: green">text</li>
<li style="color: green">text</li>
<li style="color: green">text</li>
</ul>
</ul>
</div>
Pokud by metoda Html::create()
přijímala jako první parametr
již vytvořený Html
objekt, problém by byl vyřešen. Nyní to
takto nejde. Možná přehlížím nějaké jiné řešení (?).
- Filip Procházka
- Moderator | 4668
Je zcela zřejmé, že jsi vůbec nestudoval API
$list = Html::el('div');
$list->add($blockRoot = Html::el('ul'));
$blockRoot->add($node->render());
$blockRoot->add($node->render());
$blockRoot->add($rItem3 = $node->render());
$rItem3->add($blockSub = Html::el('ul'));
$blockSub->add($node->render());
$blockSub->add($node->render());
$blockSub->add($node->render());
Editoval HosipLan (21. 4. 2012 12:14)