0

PHPを使用してWebサイトを開発していますが、動的メニューを試すのはこれが初めてです。

私がしているのは、ページのテーブルを作成したことです。

テーブルの構造は次のとおりです。

____________________________________________________________________________
|page_id|title|url|content|menu_title|show_on_navuigation|is_sub|parent_page|
|_______|_____|___|_______|__________|___________________|______|___________|

is_subこれは、メインメニューのドロップダウンメニューであるかどうかを示します。parent_pageサブメニューのメインメニューです。

今、私が欲しいのは、

2つの親ページを作成しました。

About UsTest

および2つのサブメニュー:テストaboutusおよびtestsub、

テストaboutusはAboutUsのサブであり、testsubはテストのサブです。

メニューが完全にレンダリングされるように、クエリとループを実際にどのようにすべきか。

前もって感謝します。

これが私のメニュー構造です。

<ul>
    <li class='has-sub'><a href='#'><span>About Us</span></a>
      <ul>
         <li><a href='corporateprofile'><span>Corporate Profile</span></a></li>
         <li class='last'><a href='visionandmission'><span>Vision &amp; Mission</span></a></li>
      </ul>
   </li>
   <li class='has-sub'><a href='#'><span>Business Services</span></a>
      <ul>
         <li><a href='recruitment'><span>Recruitment</span></a></li>
         <li><a href='training'><span>Training</span></a></li>
         <li><a href='executivesearch'><span>Executive Search</span></a></li>
         <li><a href='payroll'><span>Payroll</span></a></li>
         <li class='last'><a href='backgroundverification'><span>Background Verification</span></a></li>
      </ul>
   </li>
   <li class='has-sub'><a href='#'><span>Employers</span></a>
      <ul>
         <li><a href='enquiry'><span>Enquiry</span></a></li>
         <li><a href='jobdescription'><span>Job Description</span></a></li>
         <li><a href='employercontract'><span>Employer Contract</span></a></li>
         <li class='last'><a href='feedback'><span>Feedback</span></a></li>
      </ul>
   </li>
   <li class='has-sub'><a href='javascript:;'><span>Job Seeker</span></a>
      <ul>
         <li><a href='applyforjob'><span>Apply For Job/Register</span></a></li>
         <li><a href='careertips'><span>Career Tips</span></a></li>
         <li><a href='interview Questions'><span>Interview Questions</span></a></li>
         <li><a href='interviewprocess'><span>Interview Process</span></a></li>
         <li class='last'><a href='corporatedress'><span>Corporate Dress</span></a></li>
      </ul>
   </li>
   <li class='has-sub'><a href='#'><span>Franchise</span></a>
      <ul>
         <li class='last'><a href='#'><span>Franchise Enquiry Form</span></a></li>
      </ul>
   </li>
   <li class='last'><a href='#'><span>Contact us</span></a></li> 

</ul>

<?php
function displayMenu($parent_page_id) {
      $sql = "SELECT * FROM `pages` WHERE `parent_page` = '$parent_page_id'"; // sql
      $result = mysql_query($sql);
      if( mysql_num_rows($result) === 0 ) { // mysql_num_rows() is deprecated, but you are using mysql extension so that's why I show it here
         return true; // exit function
      } // else, continue to rest of function
      echo '<ul>';
      while($row = mysql_fetch_assoc($result)) { // deprecated mysql php function here for simplicity
         echo '<li><a href="' . $result['url'] . '">' . $result['menu_title'] . '</a>'; // no closing </li> yet
         displayMenu($row['page_id']); // this is the recursive part
         echo '</li>'; // close the <li> from before the recursion
      }
      echo '</ul>';
}
$get_base_menu = mysql_query("SELECT * FROM pages WHERE parent_page = 0");
while($fetch_base_menu = mysql_fetch_array($get_base_menu))
{
    $parent_page_id = $fetch_base_menu['page_id'];
    displayMenu($parent_page_id);

}

?>

4

2 に答える 2

1

隣接リスト モデルの使用をやめて、ネストされたセットなど、より管理しやすいソリューションに移行することを強くお勧めします。MPTT タイプのソリューションを使用すると、階層データの管理がはるかに簡単になります。隣接リスト モデルを使用すると、特定の時点で制限されます。

Zebra_MPTTのラインに沿ったもの、または他の形式の MPTT ライブラリの使用を検討することをお勧めします。MySQL での階層データの管理に関するこの記事を確認してください。

于 2013-03-09T09:45:05.943 に答える
0

コード化するのが最も簡単なのは、この再帰関数のようなものになると思います。あなたがしなければならないのは、あなたのページにそれを置き、あなたがparent_page_id = 0基本レベルのメニュー項目を持っていることを確認することだけです. (parent_page_id代わりに使用しているのparent_pageは、それがあなたの意味であり、答えがより明確であると想定しているためです。)

「0」の引数で関数を呼び出すと、完全なメニュー ツリーが表示されます。

$trace = array();

function displayMenu($parent_page_id) {
  $sql = "SELECT * FROM `tbl_menu` WHERE `parent_page_id` = $parent_page_id"; // sql
  $result = mysql_query($sql);
  if( mysql_num_rows($result) === 0 ) { // mysql_num_rows() is deprecated, but you are using mysql extension so that's why I show it here
     $trace[] = "Page_id $parent_page_id has no children";
     return true; // exit function
  } // else, continue to rest of function
  echo '<ul>';
  while($row = mysql_fetch_assoc($result)) { // deprecated mysql php function here for simplicity
     $trace[] = "Entered while loop for page_id = $parent_page_id"; // not an error, just tracking
     echo '<li><a href="' . $row['url'] . '">' . $row['menu_title'] . '</a>'; // no closing </li> yet
     displayMenu($row['page_id']); // this is the recursive part
     echo '</li>'; // close the <li> from before the recursion
  }
  echo '</ul>';
}

displayMenu(0); // call function for base level

var_dump($trace);

より詳しい情報:

以前にこのトピックについて調査したことがあり、mysql.com のページへの素敵なリンクがあり、階層型リレーショナル データベース構造の詳細な調査が行われています。でも調べたらリンク切れてた!

しかし、別のサイトで見つけたと思います。

http://mikehillyer.com/articles/managing-hierarchical-data-in-mysql/

于 2013-03-09T09:43:57.723 に答える