2015-07-18 5 views
1

Я Главная категория продукта Перечисленное КакCodeigniter цикл внутри другого цикла

  1. торт
  2. пункт Список
  3. Bun
  4. Ириски
  5. Хлеб

Под один Основные категории продукта есть субпродукты тоже.

1 Cake (1,1 торт масла) (1,2 Шоколадный торт)

На мой взгляд, я повторяю эти основные продукты только с помощью следующего кода.

<div class="row"> 
     <?php if(isset($records)) : foreach($records as $row) : ?> 
      <div class="span2"> 
       <p class="text-center subheader"><?php echo $row->main_products_cat_name; ?> 
       </p> 
       <p class="text-center"> 
        <a href="<?php echo base_url()?>product/all_product_data?id=<?php echo $row->main_products_cat_id;?>"><img src="<?php echo base_url(); ?>assests/images/products/main_products/<?php echo $row->main_products_cat_image; ?>" alt="<?php echo $row->main_products_cat_name; ?>" width="200px" height="200px"> 
        </a> 
       </p> 
      </div>   
     <?php endforeach; ?> 
     <?php endif; ?> 
</div> 

Может ли кто-нибудь помочь мне эхо Под-товарная категория в разделе Основной продукт.

+0

Вы можете показать нам таблицы и запросы, которые вы использовали для получения $ records? вопрос не ясен, в ваших $ records мы можем только понять, что у вас есть идентификатор и изображение основной категории, есть ли у вас все подкатегории внутри него? мы не знаем, поэтому схема базы данных и использованный запрос должны быть частью вопроса, и тогда у вас будет ответ точно! – Nassim

+0

@Baci нетрудно использовать прокомментированные псевдополя – charlietfl

+0

@charlietfl что это прокомментированные псевдополя? – Nassim

ответ

2

если я предполагаю, что ваша категория таблица выглядит следующим образом

+-----------+---------------------+------+-----+---------+-------+ 
| Field  | Type    | Null | Key | Default | Extra | 
+-----------+---------------------+------+-----+---------+-------+ 
| id  | tinyint(4) unsigned | NO | PRI | NULL |  | 
| parent_id | tinyint(4) unsigned | YES | MUL | NULL |  | 
| name  | varchar(255)  | YES |  | NULL |  | 
| note  | varchar(254)  | YES |  | NULL |  | 
+-----------+---------------------+------+-----+---------+-------+ 

уведомление, что у вас есть рекурсивные отношения (parent_id, указывающий на идентификатор)

теперь давайте заполнить его с некоторыми данными, как этот

+----+-----------+----------------+------+ 
| id | parent_id | name   | note | 
+----+-----------+----------------+------+ 
| 1 | NULL  | bakery   | NULL | 
| 2 |   1 | Cake   | NULL | 
| 3 |   1 | Bun   | NULL | 
| 4 |   1 | Toffee   | NULL | 
| 5 |   1 | Bread   | NULL | 
| 6 |   2 | Chocolate cake | NULL | 
| 7 |   2 | Butter cake | NULL | 
| 8 |   3 | Honey bun  | NULL | 
| 9 |   5 | Italian bread | NULL | 
| 10 |   5 | French bread | NULL | 
| 11 |   5 | Bereber bread | NULL | 
+----+-----------+----------------+------+ 

так что теперь мы создаем метод в модели, который получает все подкатегории данного идентификатора

Модель

<?php 
class menu_mdl extends CI_Model 
{ 

     public function get_subcategories_id($id) 
     { 
      $qry_str = "SELECT 
      categories.id, 
      categories.`name` AS name 
      FROM 
      categories 
      WHERE 
      categories.parent_id = ".$id; 
      $q = $this->db->query($qry_str); 
      return $q->result();    
     } 
} 
?> 

, то мы называем этот метод в меню контроллера.PHP как это

Контроллер

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class menu extends CI_Controller { 


    public function index() 
    { 
     $this->load->model("menu_mdl"); 
     // get all the subcategories of the root category with id = 1 
     $all_categories_id = $this->menu_mdl->get_subcategories_id(1); 

     // prepare the menu as an HTML string 
     $menu = "<ul>"; 
     //loop through level1 then level2 then level3... you can go as many levels as you want! 
     foreach($all_categories_id as $level1) 
     { 
      if($level1->id) 
      { 
       $menu .= "<li><a href='#'>".$level1->name."</a></li>"; 
       $sub_level1 = $this->menu_mdl->get_subcategories_id($level1->id); 
       if ($sub_level1) 
       { 
        $menu .= "<ul>"; 
        foreach($sub_level1 as $level2) 
        { 
         $menu .= "<li><a href='#'>".$level2->name."</a></li>"; 
         $sub_level2 = $this->menu_mdl->get_subcategories_id($level2->id); 
         if ($sub_level2) 
         { 
          $menu = "<ul>"; 
          foreach($sub_level2 as $level3) 
          { 
           $menu .= "<li><a href='#'>".$level3->name."</a></li>"; 
          } 
          $menu .= "</ul>"; 
         } 
        } 
        $menu .= "</ul>"; 
       } 
      } 

     } 
     $menu .= "</ul>"; 

     $data["menu"] = $menu; // <--- this variable has all the menu as HTML string 
     $this->load->view('menu',$data); 
    } 


} 

сейчас в представлении мы просто эхо готовое меню, с помощью простого эхо-сигнала, как этот

зрения

<?php 
echo $menu ; 
?> 

, то выход будет выглядеть так:

<ul> 
 
     <li><a href='#'>Cake</a></li> 
 
     <ul> 
 
      <li><a href='#'>Chocolate cake</a></li> 
 
      <li><a href='#'>Butter cake</a></li> 
 
     </ul> 
 
     <li><a href='#'>Bun</a></li> 
 
     <ul> 
 
      <li><a href='#'>Honey bun</a></li> 
 
     </ul> 
 
     <li><a href='#'>Toffee</a></li> 
 
     <li><a href='#'>Bread</a></li> 
 
     <ul> 
 
      <li><a href='#'>Italian bread</a></li> 
 
      <li><a href='#'>French bread</a></li> 
 
      <li><a href='#'>Bereber bread</a></li> 
 
     </ul> 
 
    </ul>

, что все, что есть в его


обновление вы можете использовать этот контроллер вместо предыдущего, если вы хотите (благодаря Мех для идея о рекурсивной функции), чтобы перебрать все подкатегории до последнего ребенка, используя функцию magix (потому что это магия: p)

<?php if (! defined('BASEPATH')) exit('No direct script access allowed'); 

class menu extends CI_Controller { 


    public function index() 
    { 
     $this->load->model("menu_mdl"); 
     // get all the subcategories of the root category with id = 1 
     $all_categories_id = $this->menu_mdl->get_subcategories_id(1); 

     // prepare the menu as an HTML string 
     $menu = "<ul>"; 
     //loop through level1 then level2 then level3... you can go as many levels as you want! 
     foreach($all_categories_id as $level1) 
     { 
      // loop until through subcategories until there is no subcategories 
      $this->magix($level1,$menu); 
     } 
     $menu .= "</ul>"; 

     $data["menu"] = $menu; // <--- this variable has all the menu as HTML string 
     $this->load->view('menu',$data); 
    } 

    private function magix($level_id,&$menu) 
    { 
     if($level_id->id) 
      { 
       $menu .= "<li><a href='#'>".$level_id->name."</a></li>"; 
       $sub_level = $this->menu_mdl->get_subcategories_id($level_id->id); 
       if ($sub_level) 
       { 
        $menu .= "<ul>"; 
        foreach($sub_level as $level2) 
        { 
         $menu .= "<li><a href='#'>".$level2->name."</a></li>"; 
         $sub_level2 = $this->menu_mdl->get_subcategories_id($level2->id); 
         if ($sub_level2) 
         { 
          $this->magix($level_id,$menu); 
         } 
        } 
        $menu .= "</ul>"; 
       } 
      } 
    } 

} 

Я надеюсь, что помогает

+0

лучше сделать функцию для получения подкатегорий и в этой функции сказать, если у нее есть суб, а затем вызвать ту же функцию для получения subs. Это делает список категорий без ограничений. – MaHDyfo

+0

@meh да, это то, что get_subcategories_id ($ id) делает в модели, а в контроллере он просто проверяет, есть ли ребенок и помещает его в меню $, или я не понял, понял ли вы? – Nassim

+0

Посмотрите на функцию toUL() в моем ответе. – MaHDyfo

1

я делюсь своим собственным get_category() метод. Идея не моя. Я получил его откуда-то, о котором я не помню год назад.

public static $list; 
public static function get_category(){ 
     $map_result = Product::get_category_array(); 
     // it's like select * from categories. with your table structure 

     foreach($map_result as $row){ 
      $ref = &$refs[$row['cat_id']]; 

      $ref['parent_id'] = $row['parent_id']; 
      $ref['cat_name'] = $row['cat_name']; 
      $ref['cat_id'] = $row['cat_id']; 

      if ($row['parent_id'] == 0){ 
       $list[$row['cat_id']] = &$ref; 
      }else{ 
       $refs[$row['parent_id']]['children'][$row['cat_id']] = &$ref; 
      } 
     } 
     self::$list = $refs; 

     function toUL($list){ 
      $class=""; 
      $html = ""; 

      foreach ($list as $value){ 
       if (!empty($value['children'])){ 
        $html .= '<li><a class="dir" href="./index.php?cat='.$value['cat_id'].'">'.htmlspecialchars($value['cat_name'])."</a>"; 
       }else{ 
        $html .= '<li><a href="./index.php?cat='.$value['cat_id'].'">'.htmlspecialchars($value['cat_name'])."</a>"; 
       } 

       if (!empty($value['children'])){ 
        $html .= "<ul>".toUL($value['children'])."</ul>"; 
       } 
       $html .= "</li>"; 
      } 
      return $html; 
     } 
     return toUL($list); 
    } 

Посмотрите на функцию toUL и то, как она была использована внутри нее для рекурсивного листинга.

+0

, что выглядит немного сложно для меня, как бы я его реализую с помощью своего решения, Im kinda царапает голову прямо сейчас lol – Nassim

+0

@Baci. Преимущество этого кода в том, что он использует 1 запрос для получения категорий, а затем сортирует его в рекурсивном массиве, а затем повторяет его. Вы можете забыть о первой части, которая сортируется по массиву. Только для вывода, возьмите свой первый 'foreach()' в функцию forexample, имя abc ($ id), затем после 'if ($ sub_level)', используйте abc ($ new_id), чтобы получить остальную часть категорий и поместить ее в переменная для эха. Это может быть новое решение, но ур код работает отлично, и это просто улучшение. – MaHDyfo

+0

Взгляните :) Я получил вдохновение, используя рекурсивную функцию, такую ​​как мужчина! лол – Nassim