Dengan model Post
yang siap, kita perlu mengatur action dan view dari controller PostController
. Dalam bagian ini, kita pertama akan mengkustomisasi access control dari operasi CRUD, kita kemudian mengubah kode yang diimplementasi operasi create
dan update
.
Hal pertama yang ingin kita lakukan adalah mengkustomisasi [access control](https://www.yiiframework.com/doc/guide/topics.auth#access-control-filter dikarenakan kode yang di-generate yiic
tidak sesuai dengan keperluannya.
Kita memodifikasi metode accessRule()
di dalam file /wwwroott/blog/protected/controllers/PostController.php
sebagai berikut,
public function accessRules()
{
return array(
array('allow', // memungkinkan semua user melakukan action `list` dan `show`
'actions'=>array('index', 'view'),
'users'=>array('*'),
),
array('allow', // memungkinkan user yang terotentikasi ke dalam melakukan action apapun
'users'=>array('@'),
),
array('deny', // tolak seluruh user.
'users'=>array('*'),
),
);
}
Pada aturan di atas menetapkan bahwa semua user dapat mengakses aksi index
dan view
dan user yang terotentikasi pada action manapun saja, termasuk kelasadmin
. User harus dilaran mengakses di scenario lain. Harap catat bahwa aturan-aturan ini dievaluasi dalam cara evaluasi aturan order sekarang. Aturan pertama cocok dengan konteks sekarang dalam membuat keputusan akses. Misalnya, jika user sekarang adalah pemilik sistem yang ingin mengunjungi halaman pembuatan post, aturan kedua akan cocok dan memberikan akses kepada user.
create
dan update
Operations ¶Operasi create
dan update
sangat mirip. Mereka sama-sama membutuhkan sebuah tampilan sebuah form HTML untuk mengumpulkan input user, memvalidasi mereka, dan menyimpan mereka ke dalam database. Perbedaan utama antara operasi update
akan mempopulasi bentuk form dengan data post yang sudah ada di dalam database. Untuk alasan ini, yiic
mengenerate partial view /wwwroot/blog/protected/views/post/_form.php
yang dapat diembed baik di view create
dan update
untuk merender form HTML.
Pertama-tama kita mengubah file _form.php
sehingga form HTML hanya mengumpulkan input yang kita inginkan: title
, content
, tags
dan status
. Kita akan menggunakan field teks polos untuk mengumpulkan input-input untuk tiga atribut pertama, dan sebuah dropdown list untuk input status
. Opsi dropdown list adalah tampilan teks untuk menampilkan status yang ada:
echo $form->dropDownList($model,'status',Lookup::items('PostStatus'));
Di atas, kita memanggil Lookup::items('PostStatus')
untuk membawa daftar status post.
Kemudian kita memodifikasi kelas Post
sehingga dapat secara otomatis mengatur beberapa atribut (seperti create_time dan
author_id) sebelum sebuah post dapat disimpan ke database. Kita meng-override metode
beforeSave()` sebagai berikut,
protected function beforeSave()
{
if(parent::beforeSave())
{
if($this->isNewRecord)
{
$this->create_time=$this->update_time=time();
$this->author_id=Yii::app()->user->id;
}
else
$this->update_time=time();
return true;
}
else
return false;
}
Ketika kita menyimpan sebuah post, kita ingin mengupdate tabel tbl_tag
yang merefleksikan perubahan frekuensi tag. Kita dapat melakukan tugas ini di metode afterSave()
, yang akan secara otomatis dipanggil ketika Yii berhasil menyimpan post ke dalam database.
protected function afterSave()
{
parent::afterSave();
Tag::model()->updateFrequency($this->_oldTags, $this->tags);
}
private $_oldTags;
protected function afterFind()
{
parent::afterFind();
$this->_oldTags=$this->tags;
}
Dalam implementasi, karena kita ingin mendeteksi perubahan tag yang dilakukan user ketika dia mengupdate post yang ada, kita perlu mengetahui apa tag lamanya. Untuk alasan ini, kita juga menulis sebuah metode afterFind()
untuk menyimpan tag lama dalam variabel _oldTags
. Jika metode afterFind()
jika memanggil secara otomatis oleh Yii ketika record AR dipopulasi dengan data dari database.
Kita tidak akan menjelaskan secara detail metode Tag::updateFrequency()
di sini, bagi yang tertarik maka bisa merujuk ke file /wwwroot/yii/demos/blog/protected/models/Tag.php
.
Found a typo or you think this page needs improvement?
Edit it on github !
Signup or Login in order to comment.