Pada bagian ini, kita mengimplementasikan fitur penampilan dan pembuatan comment.
Guna meningkatkan interaksi pengguna, kita akan menampilkan error yang mungkin terjadi kepada user setiap kali mereka selesai memasukkan satu field. Ini dikenal dengan validasi input client-side. Kita akan melihat bagaimana ini dapat dilakukan dengan sangat gampang. Harap diperhatikan bahwa ini memerlukan versi Yii 1.1.1 atau lebih tinggi.
Alih-alih menampilkan dan membuat comment pada halaman tersendiri, kita akan menggunakan halaman detail post (yang digenerate oleh action view
dari PostController
). Di bawah tampilan isi post, kita akan meletakkan daftar comment milik post bersangkutan dan sebuah form pembuatan comment.
Guna menampilkan comment di halaman detail post, kita memodifikasi script view /wwwroot/blog/protected/views/post/view.php
sebagai berikut.
..view post di sini.. <div id="comments"> if($model->commentCount>=1): <h3> echo $model->commentCount . 'comment(s)'; </h3> $this->renderPartial('_comments',array( 'post'=>$model, 'comments'=>$model->comments, )); endif; </div>
Di atas, kita memanggil renderPartial()
untuk merender sebuah view partial bernama _comments
untuk menampilkan daftar comment milik post sekarang. Perhatikan di dalam view kita menggunakan ekspresi $model->comments
untuk mengambil comment untuk post. Ekspresi ini valid karena kita telah mendeklarasi relasi comments
di kelas Post
. Dengan mengevaluasi ekspresi ini akan menjalankan query database JOIN secara implisit untuk menarik comment-comment yang benar. Fitur ini dikenal sebagai lazy relational query.
View partial _comments
tidak terlalu menarik. Tujuan utamanya adalah melewati setiap comment dan menampilkan detail-detailnya. Pembaca yang tertarik dengan topik ini bisa merujuk ke /wwwroot/yii/demos/blog/protected/views/post/_comments.php
.
Untuk menangani pembuatan comment, pertama-tama kita harus memodifikasi method actionView()
dari kelas PostController
sebagai berikut,
public function actionView()
{
$post=$this->loadModel();
$comment=$this->newComment($post);
$this->render('view',array(
'model'=>$post,
'comment'=>$comment,
));
}
protected function newComment($post)
{
$comment=new Comment;
if(isset($_POST['Comment']))
{
$comment->attributes=$_POST['Comment'];
if($post->addComment($comment))
{
if($comment->status==Comment::STATUS_PENDING)
Yii::app()->user->setFlash('commentSubmitted','Thank you...');
$this->refresh();
}
}
return $comment;
}
Di atas, kita memanggil method newComment()
sebelum kita merender view
. Di dalam method newComment()
kita mengenerate instance Comment
dan mengecek apakah form comment telah di-submit. Jika iya, kita mencoba menambahkan comment untuk post dengan memanggil $post->addComment($comment)
. Jika dia lewat, maka kita akan me-refresh halaman detail post. Andaikata comment harus di-approve terlebih dahulu, kita akan menampilkan flash message untuk mengindikasikannya. Sebuah flash message umumnya berupa pesan konfirmasi yang ditampilkan ke user. Jika user mengklik tombol refresh di browsernya, maka pesannya akan hilang.
Kita jga perlu memodifikasi /wwwroot/blog/protected/views/post/view.php
lebih lanjut.
...... <div id="comments"> ...... <h3>Leave a Comment</h3> if(Yii::app()->user->hasFlash('commentSubmitted')): <div class="flash-success"> echo Yii::app()->user->getFlash('commentSubmitted'); </div> else: $this->renderPartial('/comment/_form',array( 'model'=>$comment, )); endif; </div><!-- comments -->
Di kode di atas, kita menampilkan flash message jika ada. Jika tidak, kita akan menampilkan form input dengan merender view partial /wwwroot/blog/protected/views/comment/_form.php
.
Supaya mampu melakukan validasi di sisi client, kita harus melakukan beberapa perubahan kecil untuk view form comment /wwwroot/blog/protected/views/comment/_form.php
dan method newComment()
.
Di file _form.php
, kita akan perlu mengatur CActiveForm::enableAjaxValidation menjadi true ketika kita membuat widget CActiveForm:
<div class="form"> $form=$this->beginWidget('CActiveForm', array( 'id'=>'comment-form', 'enableAjaxValidation'=>true, )); ...... $this->endWidget(); </div><!-- form -->
Dan di method newComment()
, kita akan memasukkan sebuah kode untuk merespon request validasi AJAX. Kode mengecek apakah terdapat variabel POST
yang dinamakan ajax
. Jika ada, maka akan menampilkan hasil validasi dengan memanggil CActiveForm::validate.
protected function newComment($post)
{
$comment=new Comment;
if(isset($_POST['ajax']) && $_POST['ajax']==='comment-form')
{
echo CActiveForm::validate($comment);
Yii::app()->end();
}
if(isset($_POST['Comment']))
{
$comment->attributes=$_POST['Comment'];
if($post->addComment($comment))
{
if($comment->status==Comment::STATUS_PENDING)
Yii::app()->user->setFlash('commentSubmitted','Thank you...');
$this->refresh();
}
}
return $comment;
}
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.