2016-12-14 4 views
0

私のWebプロジェクトにはカテゴリとサブカテゴリがあります。私はスマートに新しいです。 通常、以下のコードを使用してカテゴリツリーを構築します。主なカテゴリが親のid = 0によって定義され、すべてのサブカテゴリが自分の親IDsmartyとphpでカテゴリツリーを作成

$sql = "SELECT * FROM categories ORDER BY category"; 
$res = $mysqli->query($sql); 
while ($row = mysqli_fetch_assoc($res)) { 
    $parent = intval($row['parent_id']); 
    if (!isset($categories[$parent])) { 
     $categories[$parent] = array(); 
    } 
    $categories[$parent][] = $row; 
} 
function build_categories($parent, $categories) { 
    if (isset($categories[$parent]) && count($categories[$parent])) { 
      foreach ($categories[$parent] as $category) { 

      $cat_name = $category['category']; 
      $cat_link = preg_replace("![^a-z0-9]+!i", "-", $cat_name); 
      $cat_link = urlencode($cat_link); 
      $cat_link = strtolower($cat_link); 

      if($category['parent_id']==0){ 
       echo '<li><a href="category-'.$category['cat_id'].'-'.$cat_link.'">' .$category['category'].'</a>'; 
      }else{ 
       echo '<li><a href="subcategory-'.$category['cat_id'].'-'.$cat_link.'"><span class="fa fa-angle-double-right"></span> '.$category['category'].'</a>';  
      } 
      echo build_categories($category['cat_id'], $categories); 
      echo '</li>'; 
     } 


    } 

} 

//output category tree 
build_categories(0, $categories); 

//テーブル構造

cat_id | category | parent_id 
1   | cat 1  | 0 
1   | cat 2  | 0 
1   | cat 3  | 1 
1   | cat 4  | 2 
1   | cat 5  | 1 

として、メインカテゴリIDを持っているときに私のコードの仕事の上だけで作業をいけないことに注意してくださいスマートな変数を割り当てます。

しかし、私はそれがSmartyで動作するように見えることはできません。あなたの助けを訴える。

+0

なぜあなたは 'あなたの関数でecho'を使用していますか?いくつかの変数にHTMLコードを格納してから、$ smarty-> assign() '関数を使ってこの変数をsmartyに代入してください。 –

+0

このスクリプトはどのような出力をしていますか? –

+0

@MayankPandeyzよく 'build_categories(0、$ categories);'という値をsmartyに割り当てようとしました。 – Jordyn

答えて

1

これを試してください。私のローカルマシンではうまく動作します。

require_once('smarty/Smarty.class.php'); 
$smarty = new Smarty(); 
$smarty->setTemplateDir('tpl'); 
$smarty->setCompileDir('tpl_c'); 
$mysqli = new mysqli('localhost', 'root', '', 'test'); 

$sql = "SELECT * FROM categories ORDER BY category"; 
$res = $mysqli->query($sql); 
while ($row = mysqli_fetch_assoc($res)) { 
    $parent = intval($row['parent_id']); 
    if (!isset($categories[$parent])) { 
     $categories[$parent] = array(); 
    } 
    $categories[$parent][] = $row; 
} 
function build_categories($parent, $categories) { 
    if (isset($categories[$parent]) && count($categories[$parent])) { 
     foreach ($categories[$parent] as $category) { 
      $cat_name = $category['category']; 
      $cat_link = preg_replace("![^a-z0-9]+!i", "-", $cat_name); 
      $cat_link = urlencode($cat_link); 
      $cat_link = strtolower($cat_link); 

      if($category['parent_id']==0){ 
       $result[] = '<li><a href="category-'.$category['cat_id'].'-'.$cat_link.'">' .$category['category'].'</a>'; 
      }else{ 
       $result[] = '<li><a href="subcategory-'.$category['cat_id'].'-'.$cat_link.'"><span class="fa fa-angle-double-right"></span> '.$category['category'].'</a>'; 
      } 
      $result[] = build_categories($category['cat_id'], $categories); 
      $result[] = '</li>'; 
      return implode('', $result); 
     } 
    } 
} 

$smarty->assign('smarty_var', build_categories(0, $categories)); 
$smarty->display('template.tpl'); 

EDIT:スクリプトで使用追加されたテーブル構造

id| cat_id| category | parent_id  
1 | 1  | cat 1 main | 0 
2 | 2  | cat 2 child | 1 

EDIT:更新機能

function build_categories($parent, $categories) { 
     foreach ($categories[$parent] as $category) { 
      $cat_name = $category['category']; 
      $cat_link = preg_replace("![^a-z0-9]+!i", "-", $cat_name); 
      $cat_link = urlencode($cat_link); 
      $cat_link = strtolower($cat_link); 

      if($category['parent_id']==0){ 
       $result[] = '<li><a href="category-'.$category['cat_id'].'-'.$cat_link.'">' .$category['category'].'</a>'; 
      }else{ 
       $result[] = '<li><a href="subcategory-'.$category['cat_id'].'-'.$cat_link.'"><span class="fa fa-angle-double-right"></span> '.$category['category'].'</a>'; 
      } 
      if(isset($categories[$category['cat_id']])) { 
       $result[] = build_categories($category['cat_id'], $categories); 
      } 
      $result[] = '</li>'; 
     } 
     return implode('', $result); 
} 
+0

あなたのコードを試しました。しかし、それは第1カテゴリーのみを表示するようです。 – Jordyn

+0

@ Jordyn、私の例では、DBから2つのカテゴリを表示しています。この例で使ったテーブルを見てください。正しい論理ですか? –

+0

私はまだどこが間違っているのか探しています。私は数分後にもう一度あなたを更新します。ありがとうございました。 – Jordyn

関連する問題