0

我正在使用一种通过递归为我的网站构建导航的方法,但我在添加样式时遇到了麻烦。我的方法的构建方式我似乎无法找到一种方法让父类成为父类,子类成为子类,所以在 CSS 中我可以设置两者的样式。如果它会让事情更容易理解,这里是我的数据库的一个例子:

在此处输入图像描述

这是我试图实现的输出示例:

<ul>
    <li class="parent">Parent
    <ul>
        <li class="child">Child 1</li>
        <li class="child">Child 2</li>
        <li class="child">Child 3</li>
        <li class="child">Child 4</li>
    </ul>
    </li>
</ul>

当前代码将 child 放在<li>. 我尝试了很多不同的事情,这让我很生气。这是代码:

/* i'm using pdo to pull all the categories out of MySQL, NULL means it will be a parent category */
$array = $categoryVIEW->fetchAll(PDO::FETCH_ASSOC);
$this->buildSide($array,NULL)

private function buildSide($items,$parent)
{
    $hasChildren = false;
    $outputHtml = '<ul>%s</ul>';
    $childrenHtml = ''; 
    foreach($items as $item)
    {
        if ($item['parent'] == $parent)
        {
            $hasChildren = true;
            $childrenHtml .= '<li><a href="?c='.$item['category_id'].'">'.$item['category_name'];         
            $childrenHtml .= $this->buildSide($items,$item['category_id']);         
            $childrenHtml .= '</a></li>';           
        }
    }
    if (!$hasChildren)
    {
        $outputHtml = '';
    }
    return sprintf($outputHtml,$childrenHtml);      
}

我确定这很容易,但我被卡住了:(

感谢您的关注!

更新

我一直在玩弄我的代码并添加了一个条件来检查$parent存在NULL,如果是这样$class,则成为父母,否则成为$class孩子。我遇到的问题是我<ul></ul>在每个孩子之后都会得到一个不需要的东西?奇怪的是,当我改变$child = false;它时,它消除了我的错误<ul></ul>,但让一切都成为父母。

private function buildSide($array,$parent)
{       
    $child = ($parent === NULL)?false:true;
    $html  = '';
    $tag   = '<ul>%s</ul>'; 
    $class = ($child)?'child':'parent'; 

    foreach($array as $item)
    {
        if($item['parent'] === $parent)
        {
            $child = true;
            $html .= '<li class="'.$class.'">'.$item['category_name'];
            $html .= $this->buildSide($array,$item['category_id']);
            $html .= "</li>\n";
        }
    }
    if(!$child)
    {
        $tag = '';
    }
    return sprintf($tag,$html);
}
4

1 回答 1

0

更新基于您的编辑

如果我了解您要实现的目标,则可能需要分两次执行此操作...由于parent数据库中的字段从平面树创建了隐式层次结构,因此您可能需要首先构造层次结构才能获得所需的输出。由于您在处理数据元素时渲染 HTML,因此您将无法保证在渲染列表时保留层次结构。

相反,您需要生成与存储在数据库中的父/子关系相匹配的层次结构。这里有几个主题可以解决这个过程(例如)。一旦有了与隐式 DB 结构相匹配的树结构,生成要匹配的 HTML 应该是相当简单的。

于 2012-10-28T04:44:06.870 回答