вывод дерева и простой шаблон

diamond_krnl

pure-php
обхожусь мальнеким view-хелпером:
PHP:
<?php
$template = array();
$template[0]['prefix'] = "<ol>\n";
$template[0]['normal'] = "<li><a href=\"'.htmlspecialchars(\$fullpath).'\">'.htmlspecialchars(\$title).'</a></li>\n";
$template[0]['active'] = "<li><a href=\"'.htmlspecialchars(\$fullpath).'\" class=\"a\">'.htmlspecialchars(\$title).'</a></li>\n";
$template[0]['suffix'] = "</ol>\n"; 
$template[1]['prefix'] = "<ul>\n";
$template[1]['normal'] = "<li><a href=\"'.htmlspecialchars(\$fullpath).'\">'.htmlspecialchars(\$title).'</a></li>\n";
$template[1]['active'] = "<li><a href=\"'.htmlspecialchars(\$fullpath).'\" class=\"a\">'.htmlspecialchars(\$title).'</a></li>\n";
$template[1]['suffix'] = "</ul>\n"; 
echo $this->treeDraw($this->treeData, $template);
?>
"шаблон" дерева наследуемый, от нижних уровней.
конечно получается "венегрет", но хватает в 80% случаев и работает достаточно быстро.
 

Фанат

oncle terrible
Команда форума
ужасная перемешка все эти ваши хелперы.
с чем боролись - на то и напоролись.
 

diamond_krnl

pure-php
Автор оригинала: *****
...
с чем боролись - на то и напоролись.
там нет рекурсии, дерево - одномерный массив: id, id_parent, level...
строится в два цикла:
1. считаем для каждего узла всякие floor, offset, up, down...
2. собствено рисуется дерево, на оcнове up и down открывая-закрывая ul
 

Фанат

oncle terrible
Команда форума
у меня все делаетс я то же самое, НО разрешенными к применению в шаблонах средствами. без ужасных пэхапэшнах присвоений, да еще и массиву, а, ГЛАВНОЕ - без хтмл кода в кавычках! шаблон, мля.
 

diamond_krnl

pure-php
Автор оригинала: *****
у меня все делаетс я то же самое, НО разрешенными к применению в шаблонах средствами. без ужасных пэхапэшнах присвоений, да еще и массиву, а, ГЛАВНОЕ - без хтмл кода в кавычках! шаблон, мля.
PHP:
<? foreach ($TREE as $row): ?> 
<? if($row['li']=="open"): ?><ul><?endif?> 
<? if($row['li']=="close"): ?></ul><?endif?> 
...
VS
PHP:
$template[1]['prefix'] = "<ul>\n"; 
$template[1]['normal'] = "<li><a href=\"'.htmlspecialchars(\$fullpath).'\">'.htmlspecialchars(\$title).'</a></li>\n"; 
$template[1]['active'] = "<li><a href=\"'.htmlspecialchars(\$fullpath).'\" class=\"a\">'.htmlspecialchars(\$title).'</a></li>\n"; 
$template[1]['suffix'] = "</ul>\n";
что тут сравнивать? шило на мыло :)

для меня template хоть некий стандарт (это большой плюс имхо), и не надо голову ломать, каждый раз вспоминая, как правельно пишется цикл.

как вариант в погоне за красотой:
PHP:
<?php
echo drawTree($tree, array('prefix' => "<ul>\n", 'item' => "<li><a href=\"{fullpath}\">{title}</a></li>\n", 'suffix' => "</ul>\n"));
?>
но суть от этого не меняется, да и теряется управляемость - разные шаблоны для разных уровней дерева, но для 80% задач применимо
 

С.

Продвинутый новичок
*****, я тоже не люблю хтмля в кавычках. И как мне кажется добился этого вполне элегантно на нативе. Шаблон выглядит логично, полностью в соответствии с твоим предположением:
PHP:
{BEGIN entry} 
<ul> 
  {BEGIN item} 
  <li><a href="{$uri}">{$title}</a> 
  {END} 
</ul> 
{END}
Даже в Блитце он выглядит гораздо менее наглядно.

Тебя скорее всего смущает функция tree(). А почему к ней нельзя относится скажем как к strtoupper()?
 

iceman

говнокодер
в ПХП есть встроенный интерфейс Iterator ( http://ru2.php.net/manual/ru/class.iterator.php ), если реализовать его требования в классе, то можно его итерировать через foreach(), а по сегментам дерева перемещаться так:
PHP:
<?php
class MyTree implements Iterator {
// ...
}

$tree = new MyTree();

foreach($tree as $key=>$val){
    echo "{$key}=>{$val}";
    $tree->down(); // или $tree->up();
}
а возможно, можно его чуть доработать и печатать дерево без ->down() и ->up()

P.S. тему полностью не читал, не обессудьте, если это баян, пацаны ;-)
 

Фанат

oncle terrible
Команда форума
что это еще за echo "{$key}=>{$val}";
мы вроде о шаблонах говорили
 

iceman

говнокодер
*****
например в $key мы можем указать текущее состояние указателя в дереве относительно предыдущего, т.е. узнать что указатель в дереве переместился вниз и начался обход по нижней ветке или наоборот.

<?php if($key){?><li><?php } ?>
 

Фанат

oncle terrible
Команда форума
я не понимаю, из этих отрывков, как выглядит шиблон и как - его обработка.
 

iceman

говнокодер
PHP:
<ul>
<?php foreach($tree as $key=>$val){ ?>
<?php if($key[0]) { ?><ul><?php } ?>
<li><?php echo $val ?></li>
<?php if($key[1]) { ?></ul><?php } ?>
<?php } ?>
</ul>
сам класс MyTree в скором времени напишу и скину в эту тему... я думаю теперь понятна моя мысль?
 

Фанат

oncle terrible
Команда форума
сказать по правде, такой механизм реализуется безо всякого итератора.
 

iceman

говнокодер
http://phpclub.ru/paste/2253

выводиться:
* name1_1
* name1_2

класс Shef_Tree нужно доработать (к сожалению у меня сейчас на это времени нету)

в том всмысле, нужно добавить логику отслеживания углубления в дереве, т.е. есть ли у ветки (на которой находиться текущий указатель (foreach)) под-ветки, если они есть, то сделать определённый действия чтобы текущий указатель перешел на нее, а так же в метод key() у нас будет флагом такого перехода, т.е. возвратит массив $key[0] - вход в дерево (указатель "тонит") и $key[1] - выход из дерева (указатель "всплывает")

думаю сделать это вполне реально, просто усложнить логику методов:
PHP:
abstract public mixed Iterator::current ( void )
abstract public scalar Iterator::key ( void )
abstract public void Iterator::next ( void )
abstract public void Iterator::rewind ( void )
abstract public boolean Iterator::valid ( void )
-~{}~ 10.01.09 14:52:

Автор оригинала: *****
сказать по правде, такой механизм реализуется безо всякого итератора.
расскажи про него пожалуйста. в нем есть ограничения по вложености?
 

Фанат

oncle terrible
Команда форума
текущее состояние можно указывать и в $val. и это будет простой обыковенный массив
 

iceman

говнокодер
незнаю, у меня "пробежаться" по дереву, которое храниться в массиве, через foreach() не получалось (именно по всем сегментам дерева), единственный способ я видел рекурсию, но щас можно написать объект дерева, и использовать его как новый тип данных, и при этом его можно будет использовать в конструкциях языка.

P.S. хотя может такое уже есть, я мало гуглил по этому поводу.
P.S.S. а щас я пойду пить пиво +))
 

Фанат

oncle terrible
Команда форума
удачно попить.
любое дерево можно разложить в плоскость.
вот только шаблон у меня получился сложнее, чем у тебя, и я пока не понимаю, почему.
 

Lightning

Трудоголик
<div>Here the tree begins</div>
<? while( tree($treedata,'children') ): ?>
<ul>
<? while( $branch=tree() ): ?>
<li><?=$branch['id']?>
<? endwhile ?>
</ul>
<? endwhile ?>
<div>Here it ends</div>
С.
Интересно, что-то не могу понять, а как ты такого добился? и куда делся </li>?
 

scam87

Новичок
Автор оригинала: С.
Шаблон выглядит логично ... :
PHP:
{BEGIN entry}
<ul>
  {BEGIN item}
  <li><a href="{$uri}">{$title}</a>
  {END}
</ul>
{END}
Даже в Блитце он выглядит гораздо менее наглядно.
И как спарсить такой шаблон блочным шаблонизатором?
Бьюсь не первый день.
Кто решил, помогите!
 
Сверху