2013-02-22 71 views
0

我非常接近這個導航做...我有以下的代碼生成遞歸我的導航,可在此鏈接中可以看出:http://khill.mhostiuckproductions.com/siteLSSBoilerPlate/arraytest2.php兩個PHP遞歸導航問題

它也成功地增加了一類「活動「的任何鏈接的標籤=頁面標題。下面是我的代碼,看到我的問題在底部。我已經標記了javascript和jquery,但我更喜歡PHP解決方案,儘管我願意接受建議。請注意,此導航的全部目的是通過編輯單個文件通過下面的數組添加/刪除/編輯導航元素。

設置頁面的標題$:

<?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 =標題是TRUE)

<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且如果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

你有沒有考慮使用這個數據庫?而不是從文件中讀取,並且不得不編輯文件。 – 2013-02-22 17:25:11

+0

我曾一度考慮它,它的東西我願意並希望在未來的探索。目前的簡短答案是,我沒有時間自我介紹數據庫以實現這一目標。這也是我稍後可以更新的內容。目前,我有兩個網站需要快速完成此工作,而我目前缺少的唯一功能是箭頭。 – Michael 2013-02-22 17:33:45

回答

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; 
} 

的事實,這是很難讀代碼只是足夠多的理由來改變數據結構。

+0

非常感謝!我主要想到了這一點,但並不完全確定頂端發生了什麼。我很感激! – Michael 2013-02-23 01:14:32

0

左思右想,解決我的問題箭頭打我。我只需要設置一個活躍的變量和箭頭的變量,把它們內部theLink,他們應該是。然後移動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 
} 

?>