Дубль 2.Smarty+ PHP. Вот такая вот задачка, ума не приложу.

fizot

Новичок
Дубль 2.Smarty+ PHP. Вот такая вот задачка, ума не приложу.

Постараюсь всё подробно разъяснить, чтобы поменьше в коде разбираться. Т.к. я уже второй день парюсь над этим, и прошу помочь.

Вообщем это функция рекруссивно проходит по всем дочерним документам и посылает их в Смарти.
PHP:
function get_sub($id_gens,$begin=''){
	$begin.="   ";
	global $db,$smarty;
	
	if ($article_sub_list = $db->query("SELECT article.*,users.login FROM ".DB_PREFIX."article article RIGHT JOIN ".DB_PREFIX."users users ON users.id = article.id_user WHERE id_gen='".$id_gens."' and level='1' ORDER BY doc_order ASC")) {
		while ($article_sub_data= $db->fetch_array($article_sub_list))
		{
			$article_sub_data['sub']=$begin;
			if ($popravok=$db->query("SELECT * FROM ".DB_PREFIX."article WHERE (id_prav='".$article_sub_data['id']."'  || id_gen='".$article_sub_data['id']."') and level='2'"))$article_sub_data['popravok']=$db->num_rows($popravok);
			$smarty->append("article_data",$article_sub_data);
			get_sub($article_sub_data['id'],$begin);
			
		}
		
		
	}

}


ЗДЕСЬ Я ДЕЛАЮ ВЫБОРКУ ИЗ БД ГЛАВНОГО ДОКУМЕНТА, И ВЫЗЫВАЮ ФУНКЦИЮ GET_SUB, КОТОРАЯ РЕКРУССИВНО ВЫВЕДЕТ ВСЁ ПОДДЕРЕВО.
$article_list = $db->query("SELECT article.*,users.login FROM ".DB_PREFIX."article article RIGHT JOIN ".DB_PREFIX."users users ON users.id = article.id_user WHERE article.id='".$id_article."'");
	if ($article_list_data= $db->fetch_array($article_list))
	{
		$smarty->append("article_data",$article_list_data);
		get_sub($article_list_data['id']);
		$smarty->display("article/read_article.tpl");
	}
И ГЛАВНЫЙ И ДОЧЕРНИЕ ДОКУМЕНТЫ(ВСЁ ДЕРЕВО) ПОСЫЛАЕТСЯ В СМАРТИ И ТАМ ВЫВОДИТСЯ.

НО ЗНАНИЙ СМАРТИ У МЕНЯ ЕЩЁ МЕНЬШЕ, И ПОЭТОМУ Я НЕ ЗНАЮ КАК МНЕ РЕАЛИЗОВАТЬ НУЖНЫЙ МНЕ ВЫВОД НА ЭКРАН, ВОТ ШАБЛОН СМАРТИ:
PHP:
<title>Чтение статей</title>
<BR>
<center><B>Чтение документа "<{$article_data.0.name}>"</B><BR>
<{if $access<3}><a href="read.php?id_edit=<{$article_data.0.id}>">Изменить<a/> <{/if}> </center><BR>
<table width="100%" border="1" cellpadding="5" style="border-collapse: collapse" bordercolor="#111111">
<tr>
	<td width="50"><B>Заголовок</B></td>
	<td><B><{$article_data.0.subject}></B></td>
</tr>
<tr>
	<td width="50"><B>Вступление</B></td>
	<td><B><{$article_data.0.up_text}></B></td>
</tr>
<{if $article_data.1.name}>                  //Тут я проверяю есть ли дочерние документы и если есть, то вывожу их
<tr>
	<td width="50"><B>Дочерние документы</B></td>
	<td>
	<table  width="100%" border =1 cellpadding="5">
	<TR><td>
	<{section name=article loop=$article_data start=1}>
	<B><a class="sub_doc" href="read.php?id_article=<{$article_data[article].id}>"><{$article_data[article].sub}><{$article_data[article].name}></a>  <{$article_data[article].subject}></b>
	<BR><b>Вступление:</b><BR><{$article_data[article].up_text}>
	<BR><b>Заключение:</b><BR><{$article_data[article].down_text}><BR><BR>
	<{/section}>
	</td>
	</tr>
	</table>
	</td>
</tr>
<{/if}>

<tr>
	<td width="50"><B>Заключение</B></td>
	<td><B><{$article_data.0.down_text}></B></td>
</tr>
В ИТОГЕ ВСЁ ЭТО ВЫВОДИТСЯ ПРИМЕРНО ТАК http://fizot.narod.ru/read.htm

А ТЕПЕРЬ ВОПРОС:
КАК МНЕ СДЕЛАТЬ, ЧТОБЫ ЗАКЛЮЧЕНИЕ ГОЛОВНОГО ДОКУМЕНТА РАСПАЛАГАЛОСЬ ПОСЛЕ ВСЕХ СВОИХ ДОЧЕРНИХ ДОКУМЕНТОВ, как видно в Смарти
<BR><b>Вступление:</b><BR><{$article_data[article].up_text}>
<BR><b>Заключение:</b><BR><{$article_data[article].down_text}><BR><BR>
Тут идет Вступление, а сразу после него Заключение, так вот, между Вступлением и Заключением должны распологатся дочерние документы, этого поддокумента, а сейчас идет примерно такая вещь:


Головной документ:
Вступление....
Дочерний документ:
Вступление...
Заключение... <-Это заключение должно располагаться под всеми его поддокументами
Его поддокумент
Вступление...
Заключение...

Может тут рекурсию нужно?Ведь дерево может быть стремящимся к бесконечности
 

crocodile2u

http://vbolshov.org.ru
Дубль два. Ключевые слова в дубле №1 - кода _много_ + _правила форума_.
 

fizot

Новичок
я немогу описать проблему с меньшим кодом, постарался побольше комментов и пояснений вставить, плюс отформатировал текст
 

crocodile2u

http://vbolshov.org.ru
Ещё раз: в твоем коде сложно разобраться. Но даже навскидку ясно, что из него можно повыкинуть почти весь HTML, оставив лишь _ключевые_ куски. (например, таблица и ее ряды нафиг не нужны тем, кто соберется тебе помогать)

И опять навскидку - я не разбирался в этом коде глубоко - похоже, ты формируешь массив статей таким образом, что шаблон просто не сможет узнать, что статья 3-го уровня на самом деле является "подстатьей" 2-го и т. д. Возможно, придется переформировать этот массив и использовать рекурсивные {include}'ы.
 

Kostya

Новичок
Автор оригинала: crocodile2u

И опять навскидку - я не разбирался в этом коде глубоко - похоже, ты формируешь массив статей таким образом, что шаблон просто не сможет узнать, что статья 3-го уровня на самом деле является "подстатьей" 2-го и т. д. Возможно, придется переформировать этот массив и использовать рекурсивные {include}'ы.
Мне кажется ты прав, с той структурой, что есть сейчас в
коде ничего не получится:( Надо менять структуру массива.
Например, вначале формировать массив с вложенностями сколь угодно большого уровня, а потом его передавать в смарти.
Ну а там уже разбирать.
 
Сверху