Вложенные комментарии Yii2 - PullRequest
0 голосов
/ 30 июня 2018

У меня есть таблица комментариев, как показано ниже:

+-----------+--------------+------+-----+---------+----------------+
| Field     | Type         | Null | Key | Default | Extra          |
+-----------+--------------+------+-----+---------+----------------+
| id        | int(11)      | NO   | PRI | NULL    | auto_increment |
| user_id   | int(11)      | NO   |     | NULL    |                |
| parent_id | int(11)      | NO   |     | 0       |                |
| post_id   | int(11)      | NO   |     | NULL    |                |
| body      | text         | NO   |     | NULL    |                |
| date      | datetime     | NO   |     | NULL    |                |
| status    | tinyint(1)   | NO   |     | 0       |                |
+-----------+--------------+------+-----+---------+----------------+

Комментарий parent_id от defautl равен 0, если на комментарий получен ответ, родительский идентификатор вставляется в столбец parent_id.

И установить связь с таблицей пользователей с кодом ниже:

public function getPosts()
{
    return $this->hasMany(Post::className(), ['category_id' => 'id']);
}

Как мне показать вложение?

1 Ответ

0 голосов
/ 01 июля 2018

Во-первых, вам нужно определить отношение внутри вашего комментария класса модели:

public function getChildComments()
{
    return $this->hasMany(self::className(), ['parent_id' => 'id']);
}

Это определяет отношение сущности к себе. Я думаю, что всегда полезно также хранить связанную логику или обработчики в вспомогательных / вызываемых методах в одном классе таким образом, чтобы не требовалось загружать их все сразу из базы данных. Что будет дальше, должен ответить на вопрос:

Как мне показать вложение?


CASE01: Внутри приложения RESTFul

Просто переопределить fields() внутри Комментарий класс, чтобы всегда выводить дочерние комментарии:

public function fields()
{
    $fields = parent::fields();
    $fields['childs'] = 'childComments';
    return $fields;
}

Вот и все. yii \ rest \ Serializer должен позаботиться о рекурсивном представлении, и вы получите нечто похожее на это при выводе списка комментариев:

enter image description here


CASE02: внутри веб-представления HTML

Вероятно, есть много способов достичь этого. Самым простым и чистым способом, который я мог придумать, является привязка к движку шаблонов, который Yii уже использует для рекурсивного представления представления, содержащего дочерние комментарии. В качестве рабочего примера добавьте что-то вроде следующего в ваш файл index.php :

<?php
use yii\helpers\Html;
use yii\widgets\ListView;
use yii\data\ActiveDataProvider;
use app\models\Comment;
?>

<?= ListView::widget([
    'dataProvider' => new ActiveDataProvider([
        'query' => Comment::find(),
    ]),
    'itemView' => '_comment',
    'itemOptions' => ['style' => 'padding: 10px 50px; border: 1px solid red'],
]); ?>

Затем создайте этот _comment.php файл:

<?php
use yii\helpers\Html;
use yii\widgets\ListView;
use yii\data\ActiveDataProvider;
?>
    <div style="background-color: skyblue; padding: 5px 15px">
        <h4><?= Html::encode($model->id) ?></h4>
        <p><?= Html::encode($model->name) ?></p>
    </div>

    <?php
        if ($model->getChildComments()->count()) {
            echo ListView::widget([
                'dataProvider' => new ActiveDataProvider([
                    'query' => $model->getChildComments(),
                ]),
                'itemView' => '_comment',
                'itemOptions' => ['style' => 'padding: 10px 0 10px 50px; border: 1px dotted blue'],
            ]);
        }

    ?>

Шаблон будет создавать свой новый экземпляр каждый раз, когда обнаружит, что childComments связан с представленным. С этим битом CSS-отступов, чтобы показать вложенность, этот код должен вывести это:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...