我正在尝试在PHP中显示我正在处理的网站的递归列表。
我在尝试显示第二级时遇到了麻烦。我有一个功能,显示内容到页面如下。
function get_menu_entries($content,$which=0)
{
global $tbl_prefix, $sys_explorer_vars, $sys_config_vars;
// INIT LIBRARIES
$db = new DB_Tpl();
$curr_time = time();
$db->query("SELECT * FROM ".$tbl_prefix."sys_explorer WHERE preid = '".$which."' && config_id = '".$sys_explorer_vars['config_id']."' && blocked = '0' && startdate < '".$curr_time."' && (enddate > '".$curr_time."' || enddate = '') ORDER BY preid,sorting");
while($db->next_record()){
$indent = $db->f("level") * 10 - 10;
$sitemap_vars['break'] = "";
$sitemap_vars['bold'] = "";
if($db->f("level") == 2) {
$sitemap_vars['ul_start'] = "";
$sitemap_vars['bold'] = "class='bold'";
$sitemap_vars['ul_end'] = "";
}
switch($db->f("link_type"))
{
case '1': // External Url
$sitemap_vars['hyperlink'] = $db->f("link_url");
$sitemap_vars['target'] = "";
if($db->f("link_target") != "") {
$sitemap_vars['target'] = "target=\"".$db->f("link_target")."\"";
}
break;
case '2': // Shortcut
$sitemap_vars['hyperlink'] = create_url($db->f("link_eid"),$db->f("name"),$sys_config_vars['mod_rewrite']);
$sitemap_vars['target'] = "";
break;
default:
$sitemap_vars['hyperlink'] = create_url($db->f("eid"),$db->f("name"),$sys_config_vars['mod_rewrite']);
$sitemap_vars['target'] = "";
break;
}
if($db->f("level") > 1) {
$content .= "<div style=\"text-indent: ".$indent."px;\" ".$sitemap_vars['bold']."><a href=\"".$sitemap_vars['hyperlink']."\" ".$sitemap_vars['target'].">".$db->f("name")."</a></div>\n";
}
$content = get_menu_entries($content,$db->f("eid"));
}
return(''.$content.'');
}
目前内容显示正常,但我想将此功能转换为DHTML下拉菜单。 目前,2级元素发生的事情是使用CSS使用CSS缩进内容。我需要做的是将UL标记放在开头,将/ UL标记放在2级元素的末尾。
我希望这是有道理的。任何帮助将不胜感激。
答案 0 :(得分:0)
不使用缩进的<div>
标记,而是为每个级别使用无序列表,包括第一个级别。让您的函数在开始时输出<ul>
,在结尾输出</ul>
,并将<div style="text-indent: ...">
更改为简单的<li>
。为第一级提供一个ID,以便您可以挂钩。然后你可以使用CSS删除项目符号并更改缩进等。你不需要计算缩进或是否在PHP中加粗文本,而是使用选择器并允许浏览器弄明白:
ul#menu { margin: 0; padding: 0; }
ul#menu > li { margin: 0; padding: 0; }
ul#menu > li > ul { margin-left: 10px; font-weight: bold; }
所有这些将允许您使用一种标准算法生成列表,而不是基于级别进行分支,以及使菜单看起来像网页爬虫,搜索引擎和无CSS浏览器的菜单。
顺便说一句,你应该htmlspecialchars
- 所有动态文本。你不希望流浪<
弄乱你的标记。
答案 1 :(得分:0)
如果我错了,请纠正我,但似乎您的问题不在于您不知道何时打印第一组<ul>
标签,而是您正在尝试打印每个函数调用中的第二个集合(对于级别2),因此最终会有太多的打开/关闭标记。
我认为你应该尝试做的是先按级别排序数组(参见uasort()然后你可以在第二级的第一个循环上输出你的开始<ul>
标签(使用计数器以跟踪您所处的循环,然后执行if ($i == 0)
或($i == (count($array) - 1))
之类的操作。无论您拥有多少嵌套级别,这都会有效。