【问题标题】:Adding categories & subcategories to a blog向博客添加类别和子类别
【发布时间】:2018-06-27 17:40:36
【问题描述】:

好的,我做了很多研究,查看了很多 stackoverflow 问题,但没有一个回答我的问题。

我正在构建一个简单的博客,目前我正在尝试构建一个简单的类别/子类别系统,但在将子类别加载到其父类别下时遇到了障碍。如果你知道我在下面做的一种更简单的方法,请告诉我。

这是我的数据库的结构:

id || name || parent_id || status
------------------------------------------
1  || category1 || NULL || 1
2  || subcategory1 || 1 || 1

然后我有我的型号代码:

public function getCategories()
{
    $results = $this->db->select('msi_items_categories','status = 1 AND parent_id = NULL');
    if( !is_array($results[0]) ) {
        $new_results = array();
        array_push($new_results, $results);
        return $new_results;
    } else {
        return $results;
    }
}

public function getSubCategories($parent)
{
    $bind = [':parent' => $parent];
    $results = $this->db->select('msi_items_categories','status = 1 AND parent_id = :parent');
    if( !is_array($results[0]) ) {
        $new_results = array();
        array_push($new_results, $results);
        return $new_results;
    } else {
        return $results;
    }
}

这是我的控制器代码:

public function error()
{
    $getSettings = $this->setting->getAll();
    $getCategories = $this->setting->getCategories();
    $getSubCategories = $this->setting->getSubCategories();
    if(is_array($getCategories[0]) ) {
        $isCategory = true;
    } else {
        $isCategory = false;
    }
    if(is_array($getSubCategories[0]) ) {
        $isSubCategory = true;
    } else {
        $isSubCategory = false;
    }
    $data = [
        'settings' => $getSettings,
        'mainCategory' => $getCategories,
        'subCategory' => $getSubCategories,
        'isCategory' => $isCategory
        'isSubCategory' => $isSubCategory
    ];
    $this->view('index', $data);
}

然后我有我的模板代码,这是我尝试做 foreach 的地方,顶级类别工作正常,但我就是不知道我是如何做子类别的。在我开始使用 MVC 模型之前,我只需将类放在主类别 foreach 中,然后放入 id,但现在它全部在控制器中完成,所以我无法弄清楚我如何使用 MVC 模型做子类别。

    <?php foreach($data['mainCategory'] as $category) : ?>
    <li class="dropdown">
        <a class="dropdown-toggle nav-link dropdown-toggle pl-0" data-toggle="dropdown" aria-expanded="false" href="#"><?php echo $category['name']; ?></a>
        <div class="dropdown-menu" role="menu">
            <a class="dropdown-item" role="presentation" href="#"><i class="text-black-50 fas fa-box"></i>&nbsp; All <?php echo $category['name']; ?></a>
            <div class="dropdown-divider" role="presentation"></div>
            <?php foreach($data['subCategory'] as $scategory) : ?>
                <a class="dropdown-item" role="presentation" href="#"><i class="text-black-50 <?php echo $scategory['icon']; ?>"></i>&nbsp; <?php echo $scategory['name']; ?></a>
            <?php endforeach; ?>
        </div>
    </li>
    <?php endforeach; ?>

非常感谢!

【问题讨论】:

  • 这是您正在实施的最佳方法。
  • 好的,谢谢,但你会建议我如何获得子类别?不会回声!我坚持如何制作它,以便子类别低于其父类别。现在我得到了顶级类别,但下拉列表只是一堆错误。
  • 你遇到了什么错误?
  • 我发现的最整洁的方法是将导航构建为XML(使用DOMDocument);这样,如果您按parent_id ASC 订购,您可以在一个查询中完成所有操作 - 您只需循环并创建每个节点的id 属性,然后,如果一个类别具有parent_id,您将其分配给节点对应的id 属性。这样,无论类别结构有多深,所有内容都按照您想要的输出方式构建。
  • @LovepreetSingh 这是错误:media.discordapp.net/attachments/456742636653641728/… - 错误是因为我没有指定父 ID,但我不知道如何在控制器中指定它。所以基本上这里 $getSubCategories = $this->setting->getSubCategories($parent_id);但我不知道如何从控制器获取父 ID。

标签: php mysql foreach


【解决方案1】:
$query = 'SELECT id, parent_id, name, icon FROM categories ORDER BY name';
$result = mysqli_query($conn, $query) OR trigger_error($query.'<br>'.mysqli_error($conn),E_USER_ERROR);

$refs = Array();
$categories = Array();
while($row = mysqli_fetch_assoc($result))
{
  $thisref = &$refs[$row['id']];
  $thisref['name'] = $row['name'];
  $thisref['icon'] = $row['icon'];
  if($row['parent_id']) $refs[$row['parent_id']]['children'][$row['id']] = &$thisref;
    else $categories[$row['id']] = &$thisref;
}

echo '<ul class="nav navbar-nav mr-auto">';
foreach($categories as $category)
{
  echo '<li class="dropdown">';
  echo is_array($category['children'])
    ? '<a class="dropdown-toggle nav-link dropdown-toggle pl-0" data-toggle="dropdown" aria-expanded="false" href="#">'.$category['name'].'</a>'.sub($category['children'])
    : $category['name'];
  echo '</li>';
}
echo '</ul>';

function sub(&$subCat)
{
  echo '<div class="dropdown-menu" role="menu">
    <a class="dropdown-item hide-me" role="presentation" href="#"><i class="fas fa-fire mr-2"></i> Most Popular </a>
    <div class="dropdown-divider hide-me" role="presentation"></div>';
  foreach($subCat as $id => $subcategory)
  {
    echo '<a class="dropdown-item" role="presentation" href="'.FULL_ROOT.'/category/'.$id.'/"><i class="'.$subcategory['icon'].' mr-2"></i>'.$subcategory['name'].'</a>';
  }
  echo '</div>';
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-23
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-18
    • 2016-10-27
    • 2021-03-14
    相关资源
    最近更新 更多