0

トップメニュー項目を自動的に強調表示するソリューションを探しています。

現在の状況は次のようになります: デフォルトのメニューが .txt ファイルに保存されています:

<li><a href="index.php">HOME</a></li>
<li><a href="#">MENU_1</a>
  <ul>
    <li><a href="submenu_1.php">Submenu_1</a></li>
    <li><a href="submenu_2.php">Submenu_2</a></li>
  </ul>
</li>
<li><a href="#">MENU_2</a>
  <ul>
    <li><a href="#">Submenu_1</a>
      <ul>
        <li><a href="sub_submenu_1.php">Sub_Submenu_1</a></li>
        <li><a href="sub_submenu_2.php">Sub_Submenu_2</a></li>
      </ul>
    </li>
    <li><a href="#">Submenu_2</a></li>
  </ul>
</li>
<li><a href="menu_3.php">MENU_3</a></li>
<li><a href="menu_4.php">MENU_4</a></li>

そのため、、、、submenuまたはsub_submenuその他のアイテムが現在のページの場合、一番上のMENU_X親アイテムを強調表示する必要があります (MENU_Xページのトップ バーにはアイテムのみが表示されるため)。

にCSSスタイルを適用したMENU_Xので、トップメニューを次のように設定すると:

<li class="current"><a href="#">MENU_1</a>

.currentCSS スタイルによって強調表示されます。

今、私はこのようなことをする PHP スクリプトを探しています (例のみ):

<?php
$currentPage = $_SERVER["PHP_SELF"];
$url_parts = Explode('/', $currentPage);
$current_php_file = $url_parts[count($url_parts) - 1];

$raw_menu = file_get_contents("menu.txt");

$current_menu_item = '<li><a href="' . $current_php_file . '">'

$top_menuitem_of_current_page = someFunctionToFindOut(); //need some script to find out

$highlighted_menu_item = '<li class="current"><a href="' . $top_menuitem_of_current_page . '">';
$ready_menu = str_replace($top_menuitem_of_current_page, $highlighted_menu_item, $raw_menu);
echo $ready_menu;
?>

上記のコードは基本的にそのトリックを実行someFunctionToFindOut()しますが、$top_menuitem_of_current_page.

助言がありますか?

4

2 に答える 2

1

誰も実用的な解決策を提供しなかったので、私の質問に答えたいと思います:

include("menu.php");

$current_page = basename($_SERVER['PHP_SELF']);

$menu = "";

function menu_to_array($array, $found) {
    foreach($array as $key => $element){
        if(!is_array($element)){
            if($element == $current_page && !$found){
                $found = true;
                $menu .= "<li class='current'><a href='$element'>$key</a></li>";
            }else{
                $menu .= "<li><a href='$element'>$key</a></li>";
            }
        }else{ 
            if(found_current_page_in($element) && !$found){
                $menu .= "<li class='current'><a href='#'>$key</a><ul>" . menu_to_array($element, true) . "</ul></li>";
            }else{
                $menu .= "<li><a href='#'>$key</a><ul>" . menu_to_array($element, false) . "</ul></li>";
            }
        }
    }
    return $menu; 
}

function found_current_page_in($elem){
    foreach($elem as $key => $element){
        if(!is_array($element)){
            if($element == $current_page){
                return true;
            }
        }else{
            if(found_current_page_in($element)){
                return true;
            }
        }
    }
    return false;
}

$highlighted_menu = menu_to_array($menu_array, false);

そして、menu.phpファイル (.txt ファイルに格納された平面テキストの代わりに php 配列):

<?PHP

$menu_array = Array(
            'Main Page 1' => "page_1.php",
            'Main Page 2' => Array("Sub Page 1" => "sub_page_1.php", "Sub Page 2" => "sub_page_2.php"),
            'Main Page 3' => Array('Sub Page 1' => Array("Sub Sub Page 1" => "sub_sub_page_1.php", "Sub Sub Page 2" => "sub_sub_page_2.php"), 'Sub Page 2' => "#"),
            'Main Page 4' => "page_4.php"
        );

?>

これはかなりうまくいきます。これは基本的に、インターネット上で見つかったコードの集合体の結果です。

于 2013-02-24T03:44:25.410 に答える
0

代わりに jQuery を使用できます。したがって、次のコード スニペットが問題の解決に役立つ可能性があります。

$(document).ready(function(){

    var pathname = window.location.pathname;
    var filename = pathname.substr(pathname.lastIndexOf("/") + 1);

    if( ! filename)
    {
        filename = "index.php";
    }

    $("ul.navigation > li > a").each(function(){

        if($(this).attr("href") == filename || $(this).next("ul").find("a[href='"+filename+"']").length > 0)
        {
            $(this).addClass("current");
        }

    });

});
于 2013-02-23T10:45:39.083 に答える