2017-12-15 1 views
1

"메뉴"아래 그림은 내가 디자인하고자하는 메뉴를 보여 주며 "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 쿼리를 분리했습니다 모델, t를 읽으십시오 그는 내가 올바른 방향으로

만들기에 여러분을 안내 할 수 있다고 생각 코드를 기반으로 MVC

에 대해 조심스럽게 특히 부분을 Codeigniter Overview Section 컨트롤러 기능에서 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 당신이 단순히 이 모델을로드하십시오.

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

관련 문제