2017-12-15 10 views
1

"Menu"の下の図は設計したいメニューを示し、 "table:menu"の図はメニューを作成するために使用されるレコードを含む表を示しています。一番下はHTMLPHPを一緒に使用するコードです。これまでは、メニューに表示されているように2レベルのサブメニューを持っていましたが、テーブルレコードに依存するサブメニューのレベルを上げたいのですが?ハードコードするのではなく、動的な再帰的なforeachとif文が必要です。再帰的な回数はテーブルレコードに依存するでしょうか?どうすればいい?現在私はコードイグナイタを使用しています。おかげ動的再帰foreachおよびif文からサブメニュー出力

メニュー

Menu

テーブル:メニュー

enter image description here

<ul class="sidebar-menu"> 

<?php 
$main = $this->db->query("SELECT * FROM menu WHERE link_id = '' "); 
foreach($main->result() as $row) 
{ 
    $check_main = $this->db->query("SELECT * FROM menu WHERE link_id IN (SELECT id FROM menu WHERE id = '$row->id') "); 

    if($check_main->num_rows() > 0) 
    { ?> 

    <li class="treeview"> 
    <a href="#"> 
     <i class="fa fa-share"></i> <span><?php echo $row->description; ?></span> 
     <span class="pull-right-container"> 
     <i class="fa fa-angle-left pull-right"></i> 
     </span> 
    </a> 
    <ul class="treeview-menu"> 

     <?php 
     $main2 = $this->db->query("SELECT * FROM menu WHERE link_id = '$row->id' "); 

     foreach($main2->result() as $row2) 
     { 
     $check_main2 = $this->db->query("SELECT * FROM menu WHERE link_id = '$row2->id' "); 

     if($check_main2->num_rows() > 0) 
     { ?> 

      <li> 
      <a href="#"><i class="fa fa-circle-o"></i><?php echo $row2->description; ?> 
       <span class="pull-right-container"> 
       <i class="fa fa-angle-left pull-right"></i> 
       </span> 
      </a> 
      <ul class="treeview-menu"> 

       <?php 
       $main3 = $this->db->query("SELECT * FROM menu WHERE link_id = '$row2->id' "); 

       foreach($main3->result() as $row3) 
       { 
       $check_main3 = $this->db->query("SELECT * FROM menu WHERE link_id = '$row3->id' "); 

       if($check_main3->num_rows() > 0) 
       { ?> 

        <li> 
        <a href="#"><i class="fa fa-circle-o"></i><?php echo $row3->description; ?> 
         <span class="pull-right-container"> 
         <i class="fa fa-angle-left pull-right"></i> 
         </span> 
        </a> 
        </li> 

       <?php } 
       else 
       { ?> 

        <li><a href="<?php echo site_url('Report_controller'); ?>?guid=<?php echo $row3->id; ?>"><i class="fa fa-circle-o"></i><?php echo $row3->description; ?></a></li> 

       <?php } 
       } ?> 

      </ul> 
      </li> 

     <?php } 
     else 
     { ?> 

      <li><a href="<?php echo site_url('Report_controller'); ?>?guid=<?php echo $row2->id; ?>"><i class="fa fa-circle-o"></i><?php echo $row2->description; ?></a></li> 

     <?php } 
     } ?> 

    </ul> 
    </li> 

<?php } 
else 
{ ?> 

    <li><a href="<?php echo site_url('Report_controller'); ?>?guid=<?php echo $row->id; ?>"><i class="fa fa-share"></i><?php echo $row->description; ?></a></li> 

<?php } 
} ?> 

</ul> 
+0

メニューを関数に生成するコード(主な 'foreach'ループ)を除外し、その関数の間にサブメニューの関数を再度呼び出す必要があるかどうかを判断できますしたがって、再帰) –

+0

私はそれを行う例を教えてください。ありがとう。 – Tee

答えて

0

はあなたの問題は、あなたの構造であり、あなたは自分の中にDBクエリを分離するためにきましたモデル、お読みください彼は慎重に、特に私は正しい方向に

あなたを導くことができると思いますあなたのコードに基づいて​​

に関する部分は、単にあなた、あなたのコントローラ機能でMenu_model.php

class Menu_Model extends Base_Model 
{ 
    public function getTreeItems() 
    { 
     $query = $this->db 
      ->select('*') 
      ->from('menu') 
      ->get(); 

     $arrTree = $query->result(); 
     $arrTreeById = []; 
     $arrItems = []; 

     foreach($arrTree AS $objItem) 
     { 
      $arrTreeById[$objItem->id] = $objItem; 
      $objItem->arrChilds = []; 
     } 

     foreach($arrTreeById AS $objItem) 
     { 
      if ($objItem->link_id == 0) $arrItems[] = $objItem; 
      if (isset($arrTreeById[$objItem->link_id])) $arrTreeById[$objItem->link_id]->arrChilds[] = $objItem; 
     } 

     return $arrItems; 
    } 
} 

と呼ばれるMenu_modelを作成Codeigniter Overview Sectionこのモデルをロードする

public function tree() 
{ 
    $this->load->model('menu_model'); 
    $arrData = $this->Menu_Model->getTreeItems(); 
    $this->load->view('menu', ['arrData' => $arrData]); 
} 

などです。 menu.php

function createTree($arrData, $level = 0) 
{ 
    if (count($arrData) > 0) 
    { 
     if ($level == 0) 
     { 
      $strUlClass ='sidebar-menu'; 
      $strCSSFaClass = 'fa-share'; 
     } 
     else 
     { 
      $strUlClass ='treeview-menu'; 
      $strCSSFaClass = 'fa-circle-o'; 
     } 
     echo '<ul class="'.$strUlClass.'">'; 
     foreacH($arrData AS $objItem) 
     { 
      echo '<li class="treeview"><a href="#"><i class="fa '.$strCSSFaClass.'"></i><span>'.$objItem->description.'</span></a>'; 
      if (isset($objItem->arrChilds) && count($objItem->arrChilds) > 0) 
      { 
       createTree($objItem->arrChilds,$level+1); 
      } 
      echo '</li>'; 
     } 
     echo '</ul>'; 

    } 
} 
createTree($arrData); 
+0

ありがとうございます。しかし、私はまだ適切な解決策を得ることができません。 – Tee

+0

それは動作するはずです - 私はそれをテストし、それは完全に働いた - あなたの問題は何ですか? – sintakonte

+0

「createTree($ arrData、$ level = 0)」という関数を私のビューで読むことができないことに気づきました。どうして? – Tee

関連する問題