0

このナビゲーションはほぼ完了しています...このリンクで確認できるナビゲーションを再帰的に生成する次のコードがあります: 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/

サブメニューが存在する nav 要素にのみ表示される矢印に注意してください...

これは、ラベル<span class='arrow'> +</span>の内側に追加することによって行われます。<A>たとえば... (nav_label = title が TRUE の場合、class="" はクラスをアクティブにすることができます)

<a class="" href="about.php">About<span class='arrow'> +</span></a>

したがって、再帰的に生成されているものにこの機能を追加する方法を見つけようとしています...私の最大の問題は、サブナビゲーションが存在するかどうか、およびこれがTRUEであるかどうかを特定する方法がよくわからないことだと思います、次にそれを追加します<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 行の [ここに何が入る?] です。また、elseif が 2 つ必要になることもわかりました。「if active = true AND if sub_menu = true」の場合は 1 つ、「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];
  }

そして、これを理解するには上記の何かが必要だと思います^

もう一度質問です...これを機能させるには、コードの[ここに何が入るの?]ビットに何を入れる必要がありますか?

私の2番目の質問は、私がさらに調査することです。それは、できれば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>

4

2 に答える 2

0

私はすでにあなたに警告しました;-) ...それは汚いコードでした。私のせいなので、2番目の質問に答えます。

/* $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;
}

コードが読みにくいという事実は、データ構造を変更する十分な理由です。

于 2013-02-22T22:54:10.003 に答える
0

よく考えた結果、矢の問題の解決策が思い浮かびました。active の変数と arrow の変数を設定し、それらを 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
}

?>
于 2013-02-24T00:00:08.187 に答える