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

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í (?).

Jan Endel
Člen | 1016
+
0
-

A nešlo by to přepsat do šablony? Tam takové věci dle mého patří a jdou tam dělat úplná kouzla.

Filip Procházka
Moderator | 4668
+
0
-

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)