【问题标题】:Creating a category tree with smarty and php使用 smarty 和 php 创建类别树
【发布时间】:2023-03-31 18:10:02
【问题描述】:

我的网络项目中有类别和子类别。我是聪明的新手。 通常我使用下面的代码来构建一个类别树。主类别由 parent id = 0 定义,所有子类别都以主类别 id 作为其父 id

$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

请注意,上面的代码在我分配 smarty 变量时不起作用。

但我似乎无法让它与 Smarty 一起使用。感谢您的帮助。

【问题讨论】:

  • 你为什么在你的函数中使用echo?尝试将 HTML 代码存储在某个变量中,然后使用 $smarty-&gt;assign() 函数在 smarty 中分配此变量。
  • 这个脚本给出什么输出?
  • @MayankPandeyz 好吧,我尝试将 build_categories(0, $categories); 值分配给 smarty,但没有运气。
  • @ViacheslavZhabonos 我确实尝试过,但没有成功。感谢如果你能举个例子
  • 请详细说明“没有运气”或“似乎无法正常工作”。例如,产生的错误或输出不能满足您的需求。

标签: php html mysql smarty3


【解决方案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');

编辑:添加了脚本中使用的表结构

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

编辑:更新功能

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);
}

【讨论】:

  • 我试过你的代码。但它似乎只显示第一类。
  • @Jordyn,在我的示例中,它显示了来自 DB 的 2 个类别。请看一下我在这个例子中使用的表格。这是正确的逻辑吗?
  • 我还在寻找哪里出错了。我会在几分钟后再次更新你。谢谢。
  • @Jordyn 我只是稍微改变了功能。请看一下。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-20
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 1970-01-01
  • 1970-01-01
  • 2021-02-25
相关资源
最近更新 更多