0

Codeigniter用にネストされたコメントライブラリを作成しましたが、ほとんど機能しています。

<ul>各要素または要素をエコーせずにネストされたコメントを出力できないようです<li>。ライブラリに直接何も書き込ませたくないので、それを変数に保存して返し、ビュー内にエコーアウトできるようにします。

ライブラリコードは次のとおりです。

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Comments
{
    public $parents  = array();
    public $children = array();

    public function init($comments)
    {
        foreach ($comments as $comment)
        {
            if ($comment['parent_comment_id'] === NULL)
            {
                $this->parents[$comment['comment_id']][] = $comment;
            }
            else
            {
                $this->children[$comment['parent_comment_id']][] = $comment;
            }
        }

        $this->prepare($this->parents);

    } // End of init

    public function thread($comments)
    {
        if(count($comments))
        {
            echo '<ul>';

            foreach($comments as $c)
            {
                echo "<li>" . $c['text'];
                //Rest of what ever you want to do with each row

                if (isset($this->children[$c['comment_id']])) {
                    $this->thread($this->children[$c['comment_id']]);
                }

                echo "</li>";
            }
            echo "</ul>";
        }
    } // End of thread

    private function prepare()
    {
        foreach ($this->parents as $comment)
        {
            $this->thread($comment);
        }
    } // End of prepare

} // End of Comments class

上記のコードは以下を生成します:

- Parent
    - Child
        - Child Third level
- Second Parent
    - Second Child

またはHTMLで:

<ul>
    <li>Parent
        <ul>
        <li>Child
            <ul>
                <li>Child Third level</li>
            </ul>
        </li>
        </ul>
    </li>
</ul>

<ul>
    <li>Second Parent
        <ul>
            <li>Second Child</li>
        </ul>
    </li>
</ul>

これは正しいHTMLですが、エコーアウトすることは望ましくありません。

私がやろうとしたことは:

public function thread($comments)
    {
        if(count($comments))
        {
            $output = '<ul>';

            foreach($comments as $c)
            {
                $output .= "<li>" . $c['text'];
                //Rest of what ever you want to do with each row

                if (isset($this->children[$c['comment_id']])) {
                    $this->thread($this->children[$c['comment_id']]);
                }

                $output .= "</li>";
            }
            $output .= "</ul>";

            echo $output;
        }
    } // End of thread

これは期待どおりに機能せず、エコーすると次のように生成されます。

- Child Third level
- Child
- Parent
- Second Child
- Second Parent

またはHTML:

<ul><li>Child Third level</li></ul>
<ul><li>Child</li></ul>
<ul><li>Parent</li></ul>
<ul><li>Second Child</li></ul>
<ul><li>Second Parent</li></ul>

コメントをネストしていないため、これは明らかに望ましくありません。

私は一日中これに固執しています、誰かが私がリストを適切に生成する方法について提案がありますか?

4

2 に答える 2

1

これを試して:

public function thread($comments,$output='')
{
    if(count($comments))
    {
        $output. = '<ul>';

        foreach($comments as $c)
        {
            $output .= "<li>" . $c['text'];
            //Rest of what ever you want to do with each row

            if (isset($this->children[$c['comment_id']])) {
                $output.=$this->thread($this->children[$c['comment_id']],$output);
            }

            $output .= "</li>";
        }
        $output .= "</ul>";

        return $output;
    }
}

私はそれをテストしていませんが、それはうまくいくはずです!

于 2012-09-07T23:15:47.290 に答える
0

$output問題は、再帰呼び出しが終了するまでレベルの出力をエコーし​​ないことです。これは、変数に物事を蓄積しているためです。それを受け入れる代わりに、その瞬間にそれをエコーするだけです:

public function thread($comments)
    {
        if(count($comments))
        {
            echo'<ul>';

            foreach($comments as $c)
            {
                echo "<li>" . $c['text'];
                //Rest of what ever you want to do with each row

                if (isset($this->children[$c['comment_id']])) {
                    $this->thread($this->children[$c['comment_id']]);
                }

                echo "</li>";
            }
            echo "</ul>";
        }
    } // End of thread
于 2012-09-07T23:30:43.803 に答える