|
|
|
|
|
для: Trianon
(07.07.2008 в 12:51)
| | Пути решений могут быть разными. Спасибо за все. | |
|
|
|
|
|
|
|
для: Лена
(07.07.2008 в 12:34)
| | Всё равно это не повод, так над тегами издеваться.
Вот:
<?php
include("configs/dbopen.php");
require ("smarty/Smarty.class.php");
$smarty = new Smarty;
function showTree($parent_id,$level)
{
global $link, $list;
$sql = "SELECT * FROM `menu` WHERE `pid` = ". $parent_id ." ORDER BY `id_menu`";
//echo $sql."<br>";
$result = mysql_query($sql) or die (mysql_error());
if ($level > 0 && mysql_num_rows($result) > 0)
{
$ulopn = "<ul>";
$ulcls = "</ul>";
} else $ulopn = $ulcls = "";
$list .= $ulopn;
while ($row = mysql_fetch_row($result))
{
$list.= "<li><A HREF=\"?id=$row[0]\">".htmlspecialchars($row[2])."</A>";
showTree($row[0],$level+1);
$list.="</li>";
}
$list .= $ulcls;
}
//$list = "<div class='suckerdiv'>";
//$list .= "<ul id='suckertree1'>";
showTree(0,0);
//$list .= "</ul>";
//$list .= "</div>";
$smarty->assign('arr', $list);
$smarty->display("menu1.tpl");
?>
|
| |
|
|
|
|
|
|
|
для: Trianon
(07.07.2008 в 11:37)
| | Если у нас есть вложенные элементы, то у элемента-родителя вырезаем substr() закрывающий тэг LI:
$list = substr($list, 0, -5);
Если вложения идут, например, вот так:
<li><ul>
<li></li>
<li></li>
</ul>
получается, что родительский элемент LI все еще открыт (потому как мы вырезали substr() конечный тэг). Поэтому надо его закрыть, у меня это: $ulcls = "</ul></li>"; Поэтому в случае вложений открывается один тэг, а закрывается - два. Если же мы имеем дело с родителем, то конечный LI не вырезается. | |
|
|
|
|
|
|
|
для: Лена
(07.07.2008 в 09:28)
| | а) Вместо showTree($row[0],$level++); нужно написать showTree($row[0],$level+1);
б) в строках $ulopn = "<ul>";
$ulcls = "</ul></li>";
Вы почему-то готовитесь открыть один тег , а закрыть - два. | |
|
|
|
|
|
|
|
для: sim5
(04.07.2008 в 18:31)
| | Код, преложенный Trianon`ом, работает нормально.
Но, если в функции формировать уровень, то получается вот что:
<?php
include("configs/dbopen.php");
require ("smarty/Smarty.class.php");
$smarty = new Smarty;
function showTree($parent_id,$level) {
global $link, $list;
$sql = "SELECT * FROM `menu` WHERE `pid` = ". $parent_id ." ORDER BY `id_menu`";
//echo $sql."<br>";
$result = mysql_query($sql) or die (mysql_error());
if ($level > 0 && mysql_num_rows($result) > 0) {
$ulopn = "<ul>";
$ulcls = "</ul></li>";
$list = substr($list, 0, -5);
} else $ulopn = $ulcls = "";
$list .= $ulopn;
while ($row = mysql_fetch_row($result)) {
$list.= "<li><A HREF=\"?id=$row[0]\">".htmlspecialchars($row[2])."</A></li>";
showTree($row[0],$level++);
}
$list .= $ulcls;
}
//$list = "<div class='suckerdiv'>";
//$list .= "<ul id='suckertree1'>";
showTree(0,0);
//$list .= "</ul>";
//$list .= "</div>";
$smarty->assign('arr', $list);
$smarty->display("menu1.tpl");
?>
|
При этом содержимое выводится следующим образом(на вот таких уровнях):
Пункт1
Пункт1.1.
Пункт 1.2.
Пункт 2
Пункт 3
Пункт 3.1.
Пункт 3.2
А надо, чтобы Пункт1.1 и Пункт 1.2 выпадали, как и Пункт 3.1, Пункт 3.2. Получается стиль не срабатывает для потомков Пункта 1.
Где ошибка? | |
|
|
|
|
|
|
|
для: Trianon
(04.07.2008 в 18:14)
| | )) Это мой недосмотр, я сократил пример кода, оставив по одному родителю и их потомков, что бы покороче было, когда выставлял меню, потому так получилось. | |
|
|
|
|
|
|
|
для: sim5
(04.07.2008 в 17:29)
| | Тогда может быть Вы мне это проясните?
<div class="suckerdiv">
<ul id="suckertree1">
<li><a href="#">Главная</a></li>
<ul>
<li><a href="#">JavaScript</a></li>
<ul>
<li><a href="#">PHP 4</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">CSS</a></li>
</ul>
</div>
|
Потому что я двух открывающих тэгов в этом коде не вижу | |
|
|
|
|
|
|
|
для: Trianon
(04.07.2008 в 17:04)
| | Нет, закрывающие теги элементов LI на месте - это родительские элементы. Картина немного прояснилась - я увидел JS и CSS. Нужно формировать в функции уровень, проверять его, формируя родительские элементы UL и LI. Этого должно хватить. Иначе суть вопроса в объедении в одном запросе - получить pid равное parent, одновременно узнавая есть ли у этого id потомки. В общем я так все понял. | |
|
|
|
|
|
|
|
для: sim5
(04.07.2008 в 16:29)
| | Вот в этом примере 4-я снизу строка </li> явно чужая. Во всяком случае соответствующего открывающего тега я не нашел.
Уровень вложенности необязательно передавать параметром.
Его можно посчитать в статической переменной.
ShowTree()
{
static $level=0;
++$level;
.....
ShowTree()
....
--level;
return $list;
} | |
|
|
|
|
|
|
|
для: Trianon
(04.07.2008 в 15:51)
| | Полон или нет был пример, сказать не могу. Я не видел CSS для меню, но мне показали пример HTML-кода меню:
<div class="suckerdiv">
<ul id="suckertree1">
<li><a href="#">Главная</a></li>
<ul>
<li><a href="#">JavaScript</a></li>
<ul>
<li><a href="#">PHP 4</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#">CSS</a></li>
</ul>
</div>
|
И если все так, то думается, достаточно будет добавить аргументом функции еще и уровень вложения, по которому определять вложенность. В противном случае (как я понимаю) требуется запросом узнавать не только, что pid=parent, но и есть ли категории с id равными pid, то есть - имеет ли запрашиваемая категория потомков. | |
|
|
|
|