实现单用户博客系统文章详情页插入评论表单的方法,可以通过以下步骤来完成:
第一步:创建表结构
首先需要设计评论表的表结构。我们可以创建一个名为“comment”的表,其中包含以下字段:
- id:评论id,主键,自增
- article_id:所评论的文章id,外键,关联文章表
- content:评论内容
- created_at:创建时间
- updated_at:更新时间
- author:评论者名字
- email:评论者邮箱
可以使用Yii的迁移工具创建该表:
php yii migrate/create create_comment_table
然后在新文件“migrations/yyyyMMddHHmmss_create_comment_table.php”中编写迁移代码,创建评论表:
public function up()
{
$this->createTable('comment', [
'id' => $this->primaryKey(),
'article_id' => $this->integer()->notNull(),
'content' => $this->text()->notNull(),
'created_at' => $this->integer()->notNull(),
'updated_at' => $this->integer()->notNull(),
'author' => $this->string()->notNull(),
'email' => $this->string()->notNull(),
]);
$this->createIndex(
'idx-comment-article_id',
'comment',
'article_id'
);
$this->addForeignKey(
'fk-comment-article_id',
'comment',
'article_id',
'article',
'id',
'CASCADE',
'CASCADE'
);
}
public function down()
{
$this->dropTable('comment');
}
第二步:在详情页加载评论表单
接下来我们需要在文章详情页中加载评论表单。可以在文章详情页的视图文件中添加一个表单,用于提交评论内容:
<!-- 在文章详情页视图文件中添加表单 -->
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($comment, 'author')->textInput(['maxlength' => true]) ?>
<?= $form->field($comment, 'email')->textInput(['maxlength' => true]) ?>
<?= $form->field($comment, 'content')->textarea(['rows' => 6]) ?>
<div class="form-group">
<?= Html::submitButton(Yii::t('app', 'Submit'), ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
其中$comment是在控制器中创建的Comment表的实例。
第三步:处理评论表单提交
最后,我们需要在控制器中编写代码,将表单提交的数据存入评论表中:
// 在控制器中的详情页操作处理表单提交
public function actionView($id)
{
$model = $this->findModel($id);
$comment = new Comment();
if ($comment->load(Yii::$app->request->post()) && $comment->validate()) {
$comment->article_id = $id;
$comment->created_at = time();
$comment->updated_at = time();
$comment->save();
Yii::$app->session->setFlash('success', 'Comment posted.');
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('view', [
'model' => $model,
'comment' => $comment,
]);
}
在处理表单提交的代码中,我们首先使用load()方法将表单数据加载到Comment实例中。如果表单数据验证通过,即没有错误,我们为该评论设置文章id,并设置创建时间和更新时间。最后,我们使用save()方法将评论保存到数据库中。如果保存成功,我们就会把一个Flash消息保存在session中,并重定向到原始页面。
示例说明:
这里给出两个示例,以便更好地理解上述过程。
示例1:在article详情页添加评论表单
在我们的博客系统中,我们需要为每篇文章提供一个评论表单,让读者可以在页面中对文章进行评论。为了实现这个功能,我们需要在文章详情页中添加一个评论表单,并在表单提交时将数据保存到评论表中。
在文章详情页的视图文件中,我们可以添加以下代码,用于加载表单:
<div class="article-comment">
<h4>Leave a Comment:</h4>
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($comment, 'author')->textInput(['maxlength' => true]) ?>
<?= $form->field($comment, 'email')->textInput(['maxlength' => true]) ?>
<?= $form->field($comment, 'content')->textarea(['rows' => 6]) ?>
<div class="form-group">
<?= Html::submitButton(Yii::t('app', 'Submit'), ['class' => 'btn btn-primary']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
其中,$comment是在控制器中创建的Comment实例。
在控制器中的处理代码如下:
public function actionView($id)
{
$model = $this->findModel($id);
$comment = new Comment();
if ($comment->load(Yii::$app->request->post()) && $comment->validate()) {
$comment->article_id = $id;
$comment->created_at = time();
$comment->updated_at = time();
$comment->save();
Yii::$app->session->setFlash('success', 'Comment posted.');
return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('view', [
'model' => $model,
'comment' => $comment,
]);
}
上述代码中,我们创建了一个新的评论实例$comment,并在表单数据加载到该实例后,设置文章id,创建时间,更新时间等评论信息,并将评论保存到数据库表中。
示例2:添加评论者昵称
在博客系统中,我们是通过博客作者或管理员审核后,再将评论内容显示在网站上。在该条件下,我们可以添加评论者的昵称,以便审核更加方便。
我们可以更改评论表的结构,添加一个author字段存储评论者的昵称,然后在表单中添加相关的输入框,代码如下:
<!-- 在表单中添加author 字段 -->
<?= $form->field($comment, 'author')->textInput(['maxlength' => true]) ?>
在控制器中的保存代码中,我们需要增加如下代码:
$comment->author = $comment->author ? $comment->author:'匿名';
这样,如果提交表单时没有填写昵称,则会使用匿名作为评论者的昵称。
这就是在博客系统的评论表单中加入评论者昵称的过程。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Yii实现单用户博客系统文章详情页插入评论表单的方法 - Python技术站