unknownby писал(а): ↑2020.07.07, 15:32
Drugpunker писал(а): ↑2020.07.07, 14:57
Но в таком случае, новый экземпляр модели в actionCommentCreate, будет затирать пришедшие в $_Post данные.
Не кажется ли, что слишком простой функционал приобретает неимоверную запутанность?
По порядку:
1. Должно быть представление вывода информации статьи. Это actionView контроллера Post.
2. Внутри представления view должен быть рендер формы, в который передает модель Post, чтобы можно было отобразить все комментарии к данной статье.
Код: Выделить всё
<?= $this->render('_form', ['model' => $model]) ?>
3. Внутри представления _form нужно отобразить все комментарии и сделать форму для отправки комментария.
4. По нажатию на создание нового комментария, если поле для комментария заполнено, нужно открыть статью заново, взяв id статьи из экшена по созданию нового комментария.
Код: Выделить всё
return $this->render('view', ['model' => Post::findOne($id)]);
Это упрощенная версия статья+комментарии. Никаких затираний не вижу.
Моя ошибка была. Да, нет затираний.
Вобщем сделал так. Не уверен, что вышло оптимально правильно. Но почти нравится.
В
PostController вызываю экшен (думал, думал и пришёл к выводу, что такой вызов не противоречит православному MVC):
Код: Выделить всё
public function actionView($id)
{
$post = $this->findModel($id);
$comment_form = Yii::$app->runAction('comments/create', ['post_id' => $post->post_id]);
Экшн в
CommentController сделал так:
Код: Выделить всё
/**
* Creates a new CommentForm model.
* If creation is successful, the browser will be refreshed.
* @param integer $post_id
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionCreate($post_id)
{
$model = new CommentForm;
if (isset($_POST['CommentForm']) && isset($_POST['post_id']) && isset($_POST['parent_id'])) {
$model->attributes = $_POST['CommentForm'];
$model->post_id = $_POST['post_id'];
$model->parent_id = $_POST['parent_id'];
if ($model->create()) {
return $this->refresh();
}
}
$model->post_id = $post_id;
return $this->renderPartial('/comments/_form', [
'model' => $model,
]);
}
Ну и собственно во вьюхе статьи, уже после виджета вывода комментариев, вывожу форму
Код: Выделить всё
<?php
//Форма комментариев
if (!Yii::$app->user->isGuest) {
print_r($comment_form);
}
?>
Добавил access rules в CommentsController (ради чего собственно всё и затевалось).
Код: Выделить всё
'access' => [
'class' => AccessControl::className(),
'rules' => [
[
'actions' => ['error'],
'allow' => true,
],
[
'actions' => ['create', 'update'],
'allow' => true,
'roles' => ['@'],
],
],
],
Но теперь при попытке открыть статью (под неавторизованным), меня бросает на форму входа.
Видимо из-за того, что вызываю форму добавления комментов в контроллере статей так:
Код: Выделить всё
public function actionView($id)
{
$post = $this->findModel($id);
$comment_form = Yii::$app->runAction('comments/create', ['post_id' => $post->post_id]);
За что боролся блин...
Пришлось внести корректировки.
В
PostController изменил вызов контроллера на экземпляр модели.
И присваиваю её полю id статьи.
Код: Выделить всё
public function actionView($id)
{
$post = $this->findModel($id);
$comment_form = new CommentForm();
$comment_form->post_id = $post->post_id;
Экшн Create теперь без входных параметров и просто ловит форму:
Код: Выделить всё
/**
* Creates a new CommentForm model.
* If creation is successful, the browser will be refreshed.
* @throws NotFoundHttpException if the model cannot be found
*/
public function actionCreate()
{
$model = new CommentForm;
if (isset($_POST['CommentForm']) && isset($_POST['post_id']) && isset($_POST['parent_id'])) {
$model->attributes = $_POST['CommentForm'];
$model->post_id = $_POST['post_id'];
$model->parent_id = $_POST['parent_id'];
if ($model->create()) {
return $this->goBack();
}
}
return $this->redirect('/');
}
Ну и во view статей вывод формы стал таким:
Код: Выделить всё
<?php
//Форма комментариев
if (!Yii::$app->user->isGuest) {
echo $this->context->renderPartial('/comments/_form', [
'model' => $comment_form
]);
}
?>
Вроде всё нравится.
И не покидает чувство, что наворачивал круги вокруг ничего.