我将继续展示当前HTML输出的外观以及下面的同一个小提示我希望如何输出HTML:http://jsfiddle.net/xQ95X/3/
一切都很好,我只需要这个jQuery插件(Superfish)的HTML结构就可以了。下拉列表不适用于儿童UL在LI之外。它们必须嵌套在里面。
阻止我以这种方式格式化HTML的部分如下:
<ul class="sf-menu">
<li><a href="#">HOME</a></li>
<?php
$sql="SELECT * FROM section ORDER BY orderID";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows = mysql_num_rows($result);
// Top level Items
for($i=1;$i<=$nrows;$i++) {
$row = mysql_fetch_array($result);
extract($row);
$sections[] = $section;
$sectionids[] = $sectionid;
if ($section == "FORUM") {
echo"<li><a href='#' rel='dropmenu$i'>$section</a></li>";
} else {
echo"<li><a href='#h' rel='dropmenu$i'>$section</a></li>";
}
}
// Submenu Items
for($s=0;$s<count($sections);$s++) {
/*$sm1 = ($s - 1);*/
$sp1 = ($s + 1);
$sql3="SELECT * FROM category WHERE sectionid='$sectionids[$s]'";
$result3=mysql_query($sql3) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows3 = mysql_num_rows($result3);
if ($nrows3 > 0) {
echo"<ul>";
for($t=0;$t<$nrows3;$t++) {
$row3 = mysql_fetch_array($result3);
extract($row3);
if ($type=='Photo') {
$title20 = strtolower($title);
$title20 = str_replace(" ", "_", $title20);
$sec = strtolower($sections[$s]);
$sec = str_replace(" ", "_", $sec);
if ($sec=='photos') {
echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/$catID-$title20/1.html'>$title</a></li>";
}
else {
echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/photos/$catID-$title20/1.html'>$title</li></a>";
}
} elseif ($type=="Contact") {
$title20 = strtolower($title);
$title20 = str_replace(" ", "_", $title20);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "contactus/contact_$title20.html'>$title</a></li>";
} elseif ($type=='Quote') {
$sql4="SELECT articleID FROM article WHERE category='49' AND Now() > publishingdate ORDER BY publishingdate DESC LIMIT 0, 1";
$result4=mysql_query($sql4) or die ("Error! bad select statement");
$row4=mysql_fetch_array($result4);
extract($row4);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "everton_quotes.php?id=$articleID'>$title</a></li>";
}
elseif ($type=='LastMatch') {
$sql4="select r.matchID as matchID2, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND Now() > r.matchdate ORDER BY r.matchdate DESC LIMIT 0,1";
$result4=mysql_query($sql4) or die ("Error! bad select statement");
$nrows4=mysql_num_rows($result4);
if ($nrows4 > 0) {
$row4=mysql_fetch_array($result4);
extract($row4);
if ($venue=='Home') {
$teams = "Everton V $versus2";
$teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
}
else {
$teams = "$versus V Everton";
$teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
}
$year = str_replace("/", "-", $year);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID2-$teams2/" . strtolower($venue) . "/matchreport.html'>$title</a></li>";
}
} elseif ($type=='NextMatch') {
$sql5="select r.matchID as matchID3, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND r.matchdate > Now() ORDER BY r.matchdate ASC LIMIT 0,1";
$result5=mysql_query($sql5) or die ("Error! bad select statement");
$nrows5=mysql_num_rows($result5);
if ($nrows5 > 0) {
$row5=mysql_fetch_array($result5);
extract($row5);
if ($venue=='Home') {
$teams = "Everton V $versus2";
$teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
}
else {
$teams = "$versus2 V Everton";
$teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
}
$year = str_replace("/", "-", $year);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID3-$teams2/" . strtolower($venue) . "/teamnews.html'>$title</a></li>";
}
} else {
// Overides for missing pages
if($title == "Gwladys Street Preacher") {
echo"<li><a href='/fans/121-gwladys_street_preacher/index.html'>$title</a></li>";
}
elseif($title == "The Secret Fan") {
echo"<li><a href='/news/124-secret-fan/index.html'>$title</a></li>";
}
elseif($title == "Toffee Girl") {
echo"<li><a href='/fans/125-toffee_girl/index.html'>$title</a></li>";
}
else {
echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . $link . "'>$title</a></li>";
}
}
}
echo"</ul>";
}
}
echo "</ul>";
?>
我希望我提供了足够的信息,如果您需要其他信息,请告诉我。虽然JSFiddle应该让你很好地了解我希望如何输出HTML。
PS - 我完全清楚这不是最干净的代码,我的猜测是它需要大量的重新排列才能获得所需的输出。我愿意接受建议。
答案 0 :(得分:4)
我个人将第二个for循环(我已经更改为while循环)嵌套在第一(这是非常粗略的代码)但在父循环中的注意事项已从部分标题中删除。:
一些伪代码:
print parent unordered list start
get section data
loop through section results
print parent list item start
print section title
get page data
print unordered child list start
loop through page results
print child list item start
print page info
print child list item end
print child unordered list end
print parent list item end
print parent unordered list end
从伪代码到接近代码的东西:
$sql="SELECT * FROM section ORDER BY orderID";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
// Top level Items
while($row = mysql_fetch_array($result){
extract($row);
if ($section == "FORUM") echo"<li><a href='#' rel='dropmenu$i'>$section</a>";
else echo"<li><a href='#h' rel='dropmenu$i'>$section</a>";
$sql3="SELECT * FROM category WHERE sectionid='$sectionid'";
$pageResult=mysql_query($sql3) or die ("Error!! BAD SELECT SEARCH STATEMENT");
echo "<ul>";
while($page = mysql_fetch_array($pageResult){
extract($page);
//process and print each child <li>...</li> here
//(this is a cut down example) where you would add your if/elseif section
echo "<li>$title</li>";
}
echo "</ul>"; //close child UL
echo "</li>"; //close parent LI
}
答案 1 :(得分:2)
我认为你需要在第一个中嵌套第二个for循环,以便ul标签嵌套在li中:一般准则是:
for($i=1;$i<=$nrows;$i++) {
$row = mysql_fetch_array($result);
extract($row);
$sections[] = $section;
$sectionids[] = $sectionid;
if ($section == "FORUM") {
echo"<li><a href='#' rel='dropmenu$i'>$section</a>";
for($s=0;$s<count($sections);$s++) { //Filter $sections for FORUM submenu items only
//submenu items
}
echo "</li>";
} else {
echo"<li><a href='#h' rel='dropmenu$i'>$section</a>";
for($s=0;$s<count($sections);$s++) {
//submenu items
}
echo </li>";
}
}
答案 2 :(得分:2)
我遇到了同样的问题,开发我们公司的网站导航,提供最佳可扩展解决方案的是所谓的'嵌套集模型'。
Mike hiller在这里的优秀帖子:
http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/
解释了所有内容并给出了嵌套集模型的精彩摘要。它应该是一个很好的起点。
它允许您将所有复杂性放入数据库查询中,并保持数据库表和php的清洁。
基本上,它在数据库中设置了一个“类别”表,并使用左,右相互关联的值来定义它们的层次结构和关系。
是的,只有一张桌子......没有'子类别'表或任何东西......它们在一张桌子上都是平等的。 同样,定义它们的位置和层次结构的是它们的左(lft)和右(rgt)值。
它将指导您如何构建db表以及如何布置站点的类别和子类别。这对我来说非常好,每当我发现自己必须添加一个类别时,我所做的就是将它添加到类别表中并更改左右值以适应新类别。
希望这对你有所帮助,就像对我一样!
答案 3 :(得分:2)
您需要在
中输入第二个选择语句 if ($section == "FORUM") {
echo"<li><a href='#' rel='dropmenu$i'>$section</a>";
//the ul should start here
echo "</li>";
} else {
echo"<li><a href='#h' rel='dropmenu$i'>$section</a>";
//the ul should start here
echo "</li>";
}
那么你将不得不避免第二个for循环
for($s=0;$s<count($sections);$s++)
因为您可以直接在
中获取部分ID$sql3="SELECT * FROM articles WHERE id='$sectionid'";
所以将代码编写在if中然后也在其他内部,这样做并不好。
我已经修改了你的代码,希望它有所帮助,还没有删除第二个for循环,但我认为它不需要,根据你的要求进行修改。
<ul class="sf-menu">
<li><a href="#">HOME</a></li>
<?php
$sql="SELECT * FROM section ORDER BY orderID";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows = mysql_num_rows($result);
// Top level Items
for($i=1;$i<=$nrows;$i++) {
$row = mysql_fetch_array($result);
extract($row);
$sections[] = $section;
$sectionids[] = $sectionid;
echo "<li><a href='";
if ($section == "FORUM")
echo "#";
else
echo "#h";
echo "' rel='dropmenu$i'>$section</a>";
for($s=0;$s<count($sections);$s++) {
/*$sm1 = ($s - 1);*/
$sp1 = ($s + 1);
$sql3="SELECT * FROM category WHERE sectionid='$sectionids[$s]'";
$result3=mysql_query($sql3) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows3 = mysql_num_rows($result3);
if ($nrows3 > 0) {
echo"<ul>";
for($t=0;$t<$nrows3;$t++) {
$row3 = mysql_fetch_array($result3);
extract($row3);
if ($type=='Photo') {
$title20 = strtolower($title);
$title20 = str_replace(" ", "_", $title20);
$sec = strtolower($sections[$s]);
$sec = str_replace(" ", "_", $sec);
if ($sec=='photos') {
echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/$catID-$title20/1.html'>$title</a></li>";
}
else {
echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . "$sec/photos/$catID-$title20/1.html'>$title</li></a>";
}
} elseif ($type=="Contact") {
$title20 = strtolower($title);
$title20 = str_replace(" ", "_", $title20);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "contactus/contact_$title20.html'>$title</a></li>";
} elseif ($type=='Quote') {
$sql4="SELECT articleID FROM article WHERE category='49' AND Now() > publishingdate ORDER BY publishingdate DESC LIMIT 0, 1";
$result4=mysql_query($sql4) or die ("Error! bad select statement");
$row4=mysql_fetch_array($result4);
extract($row4);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "everton_quotes.php?id=$articleID'>$title</a></li>";
}
elseif ($type=='LastMatch') {
$sql4="select r.matchID as matchID2, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND Now() > r.matchdate ORDER BY r.matchdate DESC LIMIT 0,1";
$result4=mysql_query($sql4) or die ("Error! bad select statement");
$nrows4=mysql_num_rows($result4);
if ($nrows4 > 0) {
$row4=mysql_fetch_array($result4);
extract($row4);
if ($venue=='Home') {
$teams = "Everton V $versus2";
$teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
}
else {
$teams = "$versus V Everton";
$teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
}
$year = str_replace("/", "-", $year);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID2-$teams2/" . strtolower($venue) . "/matchreport.html'>$title</a></li>";
}
} elseif ($type=='NextMatch') {
$sql5="select r.matchID as matchID3, r.venue, r.versus as versus2, s.year FROM regmatch r, season s WHERE r.season=s.seasonID AND r.matchdate > Now() ORDER BY r.matchdate ASC LIMIT 0,1";
$result5=mysql_query($sql5) or die ("Error! bad select statement");
$nrows5=mysql_num_rows($result5);
if ($nrows5 > 0) {
$row5=mysql_fetch_array($result5);
extract($row5);
if ($venue=='Home') {
$teams = "Everton V $versus2";
$teams2 = "everton_vs_" . str_replace(" ", "_", strtolower($versus2));
}
else {
$teams = "$versus2 V Everton";
$teams2 = str_replace(" ", "_", strtolower($versus2)) . "_vs_everton";
}
$year = str_replace("/", "-", $year);
echo "<li><a href='" . dirname($_SERVER['PHP_SELF']) . "match/$year/$matchID3-$teams2/" . strtolower($venue) . "/teamnews.html'>$title</a></li>";
}
} else {
// Overides for missing pages
if($title == "Gwladys Street Preacher") {
echo"<li><a href='/fans/121-gwladys_street_preacher/index.html'>$title</a></li>";
}
elseif($title == "The Secret Fan") {
echo"<li><a href='/news/124-secret-fan/index.html'>$title</a></li>";
}
elseif($title == "Toffee Girl") {
echo"<li><a href='/fans/125-toffee_girl/index.html'>$title</a></li>";
}
else {
echo"<li><a href='" . dirname($_SERVER['PHP_SELF']) . $link . "'>$title</a></li>";
}
}
}
echo"</ul>";
}
}//end of for
echo "</li>";
}
// Submenu Items
echo "</ul>";
?>
答案 4 :(得分:2)
看到这个,注意:我添加了一个名为'has_sub'的索引来检查该部分是否有sub,然后为它创建一个子菜单
echo '<ul>';
$array = array();
while($row = mysql_fetch_array($query_main_data)) {
if($row['has_sub'] === 'yes') {
echo '<li><a>'.$row['section_name'].'</a></li>';
echo '<ul>';
while($row2 = mysql_fetch_array($query_sub_data)) {
echo '<li><a>'.$row['section_name'].'</a></li>';
}
echo '</ul>';
}
}
echo '</ul>';
答案 5 :(得分:2)
tl; dr获取所有数据,然后构建菜单
有很多方法可以做到这一点,但没有一个是错的;在我必须这样做的任何地方,我们拥有比数据库服务器更多的Web服务器,因此为了更好地扩展我们尝试最小化数据库调用,并且为了让开发人员保持简单,我们尽可能多地在数据库之外提取逻辑并完成所有操作在php / javascript中处理。
由于您在开始时就知道自己想要什么数据(也就是说,根据传入的逻辑或其他任何逻辑,您不必从数据库中提取不同的数据),您可以将所需的所有数据提取到页面的开头然后构建菜单,而不是在从数据库中提取时尝试执行此操作。这使您可以1)分离进行数据库调用的代码和保存用于构建菜单的逻辑的代码,以及2)将数据库调用减少到只有两个而不是1 +多个部分。根据您的需要,#2可能不是一个重要因素,但如果您在开始时将所有内容分开,它会使您更容易阅读。
这样的事情(可能更干净):
<li><a href="#">HOME</a></li>
<?php
$sql="SELECT * FROM section ORDER BY orderID";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows = mysql_num_rows($result);
// Top level Items
for($i=1;$i<=$nrows;$i++) {
$row = mysql_fetch_array($result);
extract($row);
$sections[$sectionid] = $section; //we want to reference the section by the id later
$sectionids[] = $sectionid;
}
// Here we can pull all of the subsections we need
$all_section_ids = implode(',', $sectionids); // join all of the ids with a comma
// SQL IN lets you select all rows where the sectionid matches any of a list
$sql3="SELECT * FROM category WHERE sectionid IN ($all_section_ids)";
$result=mysql_query($sql) or die ("Error!! BAD SELECT SEARCH STATEMENT");
$nrows = mysql_num_rows($result);
for($i=1;$i<=$nrows;$i++) {
$row = mysql_fetch_array($result);
extract($row);
//Whatever values that you need from the category table, depends on what your data looks like
$subsections[$sectionid][] = $subsection;
$types[$sectionid][] = $type; //each sectionid gets a separate array
$some_array[$sectionid][] = $whatever_variable;
}
//Now we can loop through and create everything
foreach ($sections as $id => $section) {
//now $section is the name and $id is the sectionid for that section
echo '<li><a href="whatever link"></a>';
echo '<ul>';
//since we separated the subsections by sectionid, we can do this
foreach ($subsections[$id] as $subsection) {
echo '<li>';
//whatever logic you need to to build the inner list
echo '</li>';
}
echo '</ul>';
}