SMARTY :: Проблема с вложением FOREACH

php_m

Новичок
SMARTY :: Проблема с вложением FOREACH

Есть скрипт, выводящий категории файлового архива, там есть несколько уровня категорий:
-основные категории
--подкатегории
---"под подкатегории"

т.е. в табличке есть поля CID и PARENTID , скрипт выглядит вот так:
PHP:
	$db = new db_class();
	$db->con();
	$db1 = $db;
	$db2 = $db;

		$nc = new db_class();
		$nc->con();
		$nc1 = $nc;
		$nc2 = $nc;
		$cat = $lib->checkGet($_GET['cat']);
		$db->query("SELECT cid,title,descr,parentid FROM categories WHERE parentid='0' ORDER BY cid ASC LIMIT 40");
		$z = 0;
	    while ($row = $db->farray()) {
			$nc->query("SELECT cid FROM downloads WHERE cid='".$row['cid']."'");
			$cts = $nc->nrows();
			$dwnld[$z]['cts'] = $cts;
			$dwnld[$z]['cid'] = $row['cid'];
			$dwnld[$z]['title'] = $row['title'];
			$dwnld[$z]['descr'] = $row['descr'];
			$db1->query("SELECT cid,title,descr,parentid FROM categories WHERE parentid='".$row['cid']."' ORDER BY cid ASC LIMIT 40");
			$g = 0;
	    	while ($row1 = $db1->farray()) {
				$nc1->query("SELECT cid FROM occ_downloads WHERE cid='".$row1['cid']."'");
				$cts1 = $nc1->nrows();
				$dwnld1[$g]['cts'] = $cts1;
				$dwnld1[$g]['cid'] = $row1['cid'];
				$dwnld1[$g]['title'] = $row1['title'];
				$dwnld1[$g]['descr'] = $row1['descr'];
    	 		$db2->query("SELECT cid,title,descr,parentid FROM categories WHERE parentid='".$row1['cid']."' ORDER BY cid ASC LIMIT 40");
				$d = 0;
	    		while ($row2 = $db2->farray()) {
					$nc2->query("SELECT cid FROM downloads WHERE cid='".$row2['cid']."'");
					$cts2 = $nc2->nrows();
					$dwnld2[$d]['cts'] = $cts2;
					$dwnld2[$d]['cid'] = $row2['cid'];
					$dwnld2[$d]['title'] = $row2['title'];
					$dwnld2[$d]['descr'] = $row2['descr'];
    	 			$d++;
				}
				$g++;
			}
    	 	$z++;
		}

		$titler = $site_name ." || ".$p_title;
	    $tmpl->assign('title',$titler);
		$tmpl->assign('dnl',$dwnld);
		$tmpl->assign('dnl1',$dwnld1);
		$tmpl->assign('dnl2',$dwnld2);
		$tmpl->assign('keywords',$keywords." , ".$p_title);
		$tmpl->display('header.tpl');
		$tmpl->display('down-cat.tpl');

		$nc->close();
и выводится это все таким шаблоном:

PHP:
{foreach item=dnl from=$dnl}
  <b>»&nbsp;</b><a href="{$siteurl}/downloads/{$dnl.cid}.xhtml">{$dnl.title}</a>: {$dnl.descr} ({$dnl.cts}).<br />
  {foreach item=dnl1 from=$dnl1}
	&nbsp;&nbsp;<b>»&nbsp;</b><a href="{$siteurl}/downloads/{$dnl1.cid}.xhtml">{$dnl1.title}</a>: {$dnl1.descr} ({$dnl1.cts}).<br />
	{foreach item=dnl2 from=$dnl2}
	  &nbsp;&nbsp;&nbsp;&nbsp;<b>»&nbsp;</b><a href="{$siteurl}/downloads/{$dnl2.cid}.xhtml">{$dnl2.title}</a>: {$dnl2.descr} ({$dnl2.cts}).<br />
    {/foreach}
  {/foreach}
{/foreach}
в таблице категорий 6 записей: две основных категории, у каждой из них есть по одной подкатегории, у одной из подкатегорий есть еще две подкатегории, т.е. примерно такой вид:
-категория 1:
--подкатегория 1.1:
---подкатегория 1.1.1
---подкатегория 1.1.2
-категория 2
-подкатегория 2.1
в итоге выводится 5 категорий в неправильном порядке и туча каких-то глюков: то первая буква названия категории также, как и сами категории - ссылкой, то по CIDу выводястя ссылками, вот и не пойму че к чему, но если не вкладывать FOREACH'и друг в друга, то выводится все норм, но без древовидности, как бы. Так в чем же моя ошибка? заранее спасибо.
 

Necromant

Новичок
потому , что и масив , должен иметь такую струтуру
PHP:
$a = array(
  new=>array(
       new1+>array() 
      ...
  )
   .... 
);
Иначе , просто получается, неоднозначкная интерпритация , принадлежности , раздела к подкатегории.
 

php_m

Новичок
Necromant, чето не очень понял, у меня тут итак получается массив в массиве впринципе... хотя.. т.е. мне надо перменные $dwnld загнать в массив примерно так:
PHP:
$downloads = array (
    dwnld=>array(
       dwnld1=>array(
          dwnld2=>array()
       )
    )
);
или я не прав?
 

alexhemp

Новичок
Necromant

Преобразуй вложенную структуру в линейную, т.е. вместо вложенных массивов, используй один

Категория 1, уровень 0
Категория 1.1, уровень 1
Категория 1.1.1, уровень 2
Категория 1.1.2, уровень 2
...
Категория 1.2, уровень 1
...
Категория 2, уровень 0
Категория 2.1, уровень 1
Категория 2.2, уровень 1
Категория 2.2.1, уровень 2
Категория 2.2.2, уровень 2
...

и т.п.

Уровень - задаст отступ (при выводе его формируешь как хочешь, хоть стилями, хоть тупо выводишь столько пробелов, какой уровень).

Преобразовать дерево в линейную структуру не сложно, подумай как это сделать.

Но вообще твоя ошибка в том, что ты не прочитал про нормальные методы хранения иерархических данных в SQL базах - например тебе бы очень подошел Nested Set для дерева категорий (вся иерархия была бы одной таблице).
 

php_m

Новичок
Блин, туплю, но хотелось бы глянуть хоть какой-то простенький пример скрипта, если храню в бд криво- перпишу все как надо, но хотелось бы пример какой-то видеть, много всяких движков смотрел, но, впринципе, везде категории по таком принципу и сделаны вобщем-то
 

adur

Guest
У меня тотже вопрос, как это сделать без Nested Sets и преобразования в линейную, неужеле смарти на это не способна !!!
Народ подскажите плиз.
 

alexhemp

Новичок
adur

А что трудно преобразовать в линейную структуру. Smarty способна - это ты не можешь.

Не берись сразу за рекурсивные шаблоны, сделай вывод линейного списка с отступами, все равно HTML - текст имеет линейную структуру.
 
Сверху