Как решить задачку, ломаю голову

fizot

Новичок
Как решить задачку, ломаю голову

Следующая ситуация:
База состоит из древовидных документов:
У документов есть Вступление и Заключение, они могут быть бесконечной вложенности, но проблема в том:
Что должны идти так:
==========================
Вступление 1

-Вступление 2

--Вступление 3

---Вступление 4
---Заключение 4

---Вступление 5

---Вступление 6

-Заключение 2
==========================
То есть Вступление и Заключение должны быть на одном уровне.
Первоначально я сделал так: Выводил все вступления, а потом все заключения в обратном порядке:
PHP:
<{$story.prev_text}>
		<{if $story.child!=''}>
			<table>
				<{foreach from=$story.child item=child}>
					<tr>
						<td><table><tr><td colspan="2" width="1%"><b><{$child.prefix}><{$child.topic}></b></td></tr><tr><td width=1><b><{$child.prefix}></b></td><td width="100%"><{$child.prev_text}></td></tr></table></td>
					</tr>
				<{/foreach}>
		
				<{foreach from=$story.reverse_child item=reverse_child}>
				<{if $reverse_child.final_text!=''}>
					<tr>
						<td><table><tr><td width=1><b><{$reverse_child.prefix}></b></td><td width="100%"><{$reverse_child.final_text}></td></tr></table></td>
					</tr>
					<{/if}>
				<{/foreach}>
			</table>
		<{/if}>
<{$story.final_text}>
Вот так, но проблема в том, что пример приведенный выше выглядел так:
==========================
Вступление 1

-Вступление 2

--Вступление 3

---Вступление 4

---Вступление 5

---Вступление 6

---Заключение 4

-Заключение 2
==========================
 

Solid

Drosera anglica
Я в подобных случаях использовал foreach + section. Section брал результат count, который высчитывал до того, как передавать массив в шаблонный движёк (насколько я понимаю, здесь используется Smarty).
 

fizot

Новичок
Блин, про рекурсию я и сам знаю. Но вот какой масив посылать в Смарти? Как ты его видишь? Мне ничего кроме трехмерного масива в голову не приходит [0][0][0] - [Номер главного элемента][Уровень вложенности][Порядковый номер на этом уровне] я в правильном направлении ???!1!

-~{}~ 20.04.06 16:50:

Решил:
Класс:
======
PHP:
function GetProjectPrintChild($sel_id='0', $prefix="")
	{
		$sql = "SELECT * FROM ".$this->table." WHERE id_gen='".$sel_id."' and showme='1'  ORDER BY doc_order ASC";
		$result = $this->db->query($sql);
		$count = $this->db->getRowsNum($result);
		if ( $count == 0 ) {
			return null;
		}
		while ( $row = $this->db->fetchArray($result) ) {
			$row['prefix'] = $prefix."&nbsp;&nbsp;";
			$row['child'] = $this->GetProjectPrintChild($row['id'], $row['prefix']);
			$parray[]=$row;
		}
		return $parray;
	}
	
	function GetProjectPrint($id_project='0', $parray = array())
	{
		$sql = "SELECT * FROM ".$this->table." WHERE id_gen='0' and showme='1' and id_project='".$id_project."' ORDER BY doc_order ASC";
		$result = $this->db->query($sql);
		$count = $this->db->getRowsNum($result);
		if ( $count == 0 ) {
			return $parray;
		}
		while ( $row = $this->db->fetchArray($result) ) {
			$row['child'] = $this->GetProjectPrintChild($row['id']);
			$row['author'] = XoopsUser::getUnameFromId($row['id_author']);
			$row['date_create']= date("d.m.Y H:i",$row['date_create']);
			//print_r($row['child']['0']['topic']);
			//print "<BR><BR><BR><BR>";
			$parray[] = $row;
		}
		return $parray;
	}
====
$Article = new Article();
	$array = $Article->GetProjectPrint($id_project);
	$xoopsTpl->assign('tree', $array);
	$xoopsTpl->assign('status', $Project->status);
И рекурсию ещё в Смартях замутил
 
Сверху