我几乎完成了这个导航...我有以下代码,递归生成我的导航,可以在这个链接上看到:http://khill.mhostiuckproductions.com/siteLSSBoilerPlate/arraytest2.php
它还成功地向标签=页面标题的任何链接添加了一类“活动”。继到目前为止我的代码,请在底部查看我的问题。我已经标记了javascript和jquery,但我更喜欢PHP解决方案,尽管我愿意接受建议。请注意这个导航的全部目的是通过下面的数组编辑单个文件来添加/删除/编辑导航元素。
设置页面的$ title:
<?php $title = 'Home'; ?>
导航数组:
<?php
$nav_array = array ('Home' => 'index.php',
'About' => array ( 'about.php', array (
'Michael' => array( 'michael.php', array (
'Blog' => 'blog.php',
'Portfolio' => 'portfolio.php')),
'Aaron' => 'aaron.php' ,
'Kenny' => 'kenny.php',
'David'=> 'david.php')),
'Services' => array ( 'services.php', array (
'Get Noticed' => 'getnoticed.php',
'Hosting' => 'hosting.php')),
'Clients' => 'clients.php',
'Contact Us' => 'contact.php'
);
$base = basename($_SERVER['PHP_SELF']);
?>
foreach:
<?php
echo "<ul>";
foreach ($nav_array as $nav_title => $nav_data) {
echo buildLinks($nav_title, $nav_data, $base, $title);
}
echo "</ul>";
?>
buildLinks功能:
<?php // Building the links
function buildLinks ($label_name, $file_name, $active_class, $title) {
$theLink = '';
$navigation_list = false;
if (is_array($file_name)) {
$navigation_list = $file_name[1];
$file_name = $file_name[0];
}
// build the links with active class
if ($label_name == $title) {
$theLink = "<li><a class=\"active\" href=\"$file_name\">$label_name</a></li>\n";
} else {
$theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
}
// recursively loop back through build links function
if ($navigation_list) {
$theLink .= "<ul>";
foreach ($navigation_list as $nav_title => $nav_data) {
$theLink .= buildLinks($nav_title, $nav_data, $active_class, $title);
}
$theLink .= "</ul>";
}
return $theLink; // print the nav
}
所以,我已经有了这种导航视觉样式,但它是使用非递归讨厌的代码生成的。您可以在以下链接中看到我要引用的箭头,因此您了解我想要实现的目标。 http://khill.mhostiuckproductions.com/siteLSSBoilerPlate/
请注意仅出现在具有子菜单的导航元素上的箭头...
这是通过在<span class='arrow'> +</span>
标签内添加<A>
来完成的。例如......(如果nav_label = title为TRUE,则class =“”可能使该类处于活动状态)
<a class="" href="about.php">About<span class='arrow'> +</span></a>
所以我想弄清楚如何将此功能添加到递归生成的内容中...我想我最大的问题是我不太确定如何识别是否存在子导航,以及是否这是正确的,然后添加<span>
我认为我会使用elseif扩展buildLinks函数中的原始IF语句。所以......
//使用活动类构建链接
if ($label_name == $title) {
$theLink = "<li><a class=\"active\" href=\"$file_name\">$label_name</a></li>\n";
} elseif ([what goes here?]) {
$theLink = "<li><a href=\"$file_name\">$label_name<span class='arrow'> +</span></a></li>\n";
} else {
$theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
}
问题是[上面有什么?]在上面的elseif行中。此外,我意识到我需要两个elseifs。一个用于“if active = true AND if sub_menu = true”那么这个......以及一个用于“if sub_menu = ture”然后这个......
此时上面变成......
if ($label_name == $title) {
$theLink = "<li><a class=\"active\" href=\"$file_name\">$label_name</a></li>\n";
} elseif ($label_name == $title && [what goes here?]) {
$theLink = "<li><a class=\"active\" href=\"$file_name\">$label_name<span class='arrow'> +</span></a></li>\n";
} elseif ([what goes here?]) {
$theLink = "<li><a href=\"$file_name\">$label_name<span class='arrow'> +</span></a></li>\n";
} else {
$theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
}
我现在完全失去了,因为我帮助生成了这个递归导航,我理解它主要是如何工作的,但我不完全理解这里发生了什么:
$theLink = '';
$navigation_list = false;
if (is_array($file_name)) {
$navigation_list = $file_name[1];
$file_name = $file_name[0];
}
我怀疑这个问题需要上面的内容^
所以我的问题再次提出......我需要在我的代码中添加什么内容才能使这项工作成功?
我的第二个问题,对我来说更多的是进一步研究,这就是我可以用什么方法更动态地提供上述数组,最好是没有MySQL?
编辑:我已经对此进行了更多的研究,但我仍然坚持使用我自己没有制作的代码。
$navigation_list = false;
if (is_array($file_name)) {
$navigation_list = $file_name[1];
$file_name = $file_name[0];
}
我大部分都了解is_array运算符。有了上述内容,通过说$file_name[1];
,是说$file_name[TRUE]
?然后对于低于0 = FALSE的行
我需要帮助了解如何检测数组是否存在才能打印包含<span class="arrow"> +</span>
的链接
答案 0 :(得分:0)
我已经警告过你了;-) ......这是脏代码。 我会回答你的第二个问题,因为这是我的错:
/* $file_name is a mixed parameter, denpending on when
* buildLinks() is called, it will be $file_name (as in your first element
* for 'Home' or an array with another navigation menu (as in your second
* element for 'About'
*/
function buildLinks ($label_name, $file_name, $active_class, $title) {
$theLink = '';
// if this is false, there will be no recursive call
$navigation_list = false;
if (is_array($file_name)) {
/* $file_name is an array, as in 'About' */
/* so we get the second element to build the navigation list */
$navigation_list = $file_name[1];
/* and then set $file_name to the real filename string, which
* in your data structure is the first element of the array.
* This is why I suggested reconsidering your data structure.
*/
$file_name = $file_name[0];
}
// build the links with active class
if ($label_name == $title) {
$theLink = "<li><a class=\"active\" href=\"$file_name\">$label_name</a></li>\n";
} else {
$theLink = "<li><a href=\"$file_name\">$label_name</a></li>\n";
}
// since we assigned $navigation_list to an array, this is true
if ($navigation_list) {
$theLink .= "<ul>";
foreach ($navigation_list as $nav_title => $nav_data) {
$theLink .= buildLinks($nav_title, $nav_data, $active_class, $title);
}
$theLink .= "</ul>";
}
return $theLink;
}
很难读取代码的事实只是改变数据结构的理由。
答案 1 :(得分:0)
经过深思熟虑,我的箭头问题的解决方案击中了我。我只需要为active设置一个变量,为箭头设置一个变量,并将它们放在它们应该位于的Link里面。然后移动if语句。它不是完全动态的,因为我必须手动声明哪些标签有一个子菜单才能让箭头类打印,但由于没有很多链接有子菜单,这不会让我感到困惑现在很多。
以下是解决方案的代码:
<?php // Building the links recursively
function buildLinks ($label_name, $file_name, $active_class, $title) {
$theLink = '';
$navigation_list = false;
if (is_array($file_name)) {
$navigation_list = $file_name[1];
$file_name = $file_name[0];
}
if ($label_name == $title) { // print active if it is true
$active = 'active';
}
if ($label_name == 'About') { // print arrow if it is true
$arrow = '<span class=\"arrow\"> +</span>';
} elseif ($label_name == 'Michael') {
$arrow = '<span class=\"arrow\"> +</span>';
} elseif ($label_name == 'Services') {
$arrow = '<span class=\"arrow\"> +</span>';
}
$theLink = "<li><a class=\"$active\" href=\"$file_name\">$label_name $arrow</a></li>\n";
// recursively loop back through build links function
if ($navigation_list) {
$theLink .= "<ul class=\"sub-nav\">";
foreach ($navigation_list as $nav_title => $nav_data) {
$theLink .= buildLinks($nav_title, $nav_data, $active_class, $title);
}
$theLink .= "</ul>";
}
return $theLink; // print the nav
}
?>