Допустим есть две таблицы. В первой хранятся статьи, во второй комментарии для каждой статьи.
В таблице комментариев есть поле id_article, в котором хранится id статьи.
Вам надо вывести отдельную статью и комментарии, которые принадлежат этой статье.
Ссылка для просмотра статьи может выглядеть так:
echo Html::a('Title article', ['view', 'id' => $id]);
В контроллере есть действие view, для вывода отдельной статьи:
public function actionView($id)
{
$comment = new Comments();
$article = $this->findArticle($id);
$query = Comments::find()->where('id_article=:id', [':id' => $id]);
$dataProvider = new ActiveDataProvider([
$query = $query
]);
return $this->render('view', ['article' => $article, 'dataProvider' => $dataProvider, 'comment' => $comment])
}
public function findArticle($id)
{
if(($model = Article::find()->where('id=:id', [':id' => $id])->one()) !== null){
return $model;
}
else{
throw new NotFoundHttpException();
}
}
В представлении:
echo $article->title;
// вывод комментариев
echo ListView::widget([
'dataProvider' => $dataProvider,
'itemView' => 'path_to_view'
])
В форме подачи комментария скрытое поле для id статьи:
$form->field($comment, 'id_article')->hiddenInput(['value' => $article->id])
Вот как-то так.
Всё!
p.s. На ошибки не проверял. Написал всё на скорую руку.
p.s.s.
Пример модели комментариев с минимальным набором полей. Namespace укажите свой
Comments<?php
namespace app\modules\comments\models;
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
/**
* This is the model class for table "{{%comments}}".
*
* @property int $id
* @property string $body
* @property int $id_article
* @property int $created_at
* @property int $update_at
* @property int $status
*/
class Comments extends ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return '{{%comments}}';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['body', 'status', 'id_article'], 'required'],
[['id_article', 'created_at', 'update_at', 'status'], 'integer'],
[['body'], 'string', 'max' => 300],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'body' => Yii::t('app', 'Body'),
'id_article' => Yii::t('app', 'Article ID'),
'created_at' => Yii::t('app', 'Created At'),
'update_at' => Yii::t('app', 'Update At'),
'status' => Yii::t('app', 'Status'),
];
}
public function behaviors()
{
return TimestampBehavior::class;
}
}
p.s.s.s.
Начнём сначала. Без foreach, pjax, вообще, без всяких лишних деталей.
Comments<?php
namespace app\modules\comments\models; // укажите свой namespace
use Yii;
use yii\behaviors\TimestampBehavior;
use yii\db\ActiveRecord;
/**
* This is the model class for table "{{%comments}}".
*
* @property int $id
* @property string $body
* @property int $id_article
* @property int $created_at
* @property int $update_at
* @property int $status
*/
class Comments extends ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return '{{%comments}}';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['body', 'status', 'id_article'], 'required'],
[['id_article', 'created_at', 'update_at', 'status'], 'integer'],
[['body'], 'string', 'max' => 300],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => Yii::t('app', 'ID'),
'body' => Yii::t('app', 'Body'),
'id_article' => Yii::t('app', 'Article ID'),
'created_at' => Yii::t('app', 'Created At'),
'update_at' => Yii::t('app', 'Update At'),
'status' => Yii::t('app', 'Status'),
];
}
public function behaviors()
{
return TimestampBehavior::class;
}
}
Действие в контроллереpublic function actionView($id)
{
$comment = new Comments();
$query = Comments::find()->where('id_article=:id', [':id' => $id]);
$article = $this->findArticle($id);
$dataProvider = new ActiveDataProvider([
'query' => $query
]);
render $this->render('view', ['comment' => $comment, 'dataProvider' => $dataProvider, 'article' => $article);
}
public function findArticle($id)
{
if(($model = Blog::find()->where('id=:id', [':id' => $id])->one()) !== null){
return $model;
}
else{
throw new NotFoundHttpException();
}
}
В представлении view, выводим заголовок одной новости, комментарии к этой новости и форму для комментариев.
view.php<?php
// через use подключаете необходимые классы, виджеты и тому подобное
// выводим заголовок новости.
echo $article->title;
// выводим комментарии
echo ListView::widget([
'dataProvider' => $dataProvider
'itemView' => '_view_comment' // содержимое файла будет ниже.
])
// выводим форму для комментариев
$form = ActiveForm::begin([
'action' => 'путь_к_действию_создания_комментария'
])
echo $form->field($comment, 'body')->textInput(['placeholder' => 'Текст комментария')->label(false)
echo Html::submitButton('Отправить')
ActiveForm::end();
?>
Файл _view_comment.php для виджета ListView();. Положить рядом с файлом view.php
<div>
<?= $model->body; ?>
</div>
Кстати, модель Blog у Вас подозрительная. Вы полностью её код показали?
Всё.