0

再帰によってサイトのナビゲーションを構築する方法を使用していますが、スタイルの追加に問題があります。私のメソッドの構築方法では、親を親クラスにし、子を子クラスにする方法がわからないので、CSS で 2 つのスタイルを設定できます。理解しやすくするために、私のデータベースの例を次に示します。

ここに画像の説明を入力

私が達成しようとしている出力の例を次に示します。

<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

編集内容に基づいて更新する

あなたが達成しようとしていることを理解している場合は、2つのパスでこれを行う必要があるかもしれません...parentデータベースのフィールドはフラットツリーから暗黙の階層を作成するため、必要な出力。データ要素が処理されるときにHTMLをレンダリングしているため、リストをレンダリングするときに階層が保持されることを保証することはできません。

代わりに、データベースに保存されている親子関係に一致する階層を生成する必要があります。このプロセスに対処するいくつかのトピックがここにあります(たとえば)。暗黙のDB構造と一致するツリー構造ができたら、一致するHTMLを生成するのはかなり簡単です。

于 2012-10-28T04:44:06.870 に答える