Pada tulisan ini saya akan membuat series mengenai pemrograman dengan Yii Framework. Series ini akan disusun untuk membuat sebuah program sederhana yang memanfaatkan fitur-fitur umum yang sangat mungkin digunakan di banyak kasus. Tulisan ini akan menggunakan Basic Template Yii2 (yang menurut saya penggunaannya sedikit lebih sulit daripada advance template Yii2).

Secara garis besar (dan mungkin akan bertambah sesuai keperluan yang mungkin terjadi) outline dari seri tulisan ini akan terdiri dari hal berikut.

  1. Prainstalasi
  2. Instalasi YiiFramework 2.0
  3. Login
  4. Login dengan Database pada Yii2
  5. Bekerja dengan Gii
  6. Module pada Yii2
  7. Layout dasar dan Manipulasinya pada Yii2
  8. Costum Asset dan Asset Bundle pada Yii2
  9. Alias pada Yii2
  10. Bekerja dengan Form
  11. Timestamp, Blameable, dan Sluggable Behavior pada Yii2
  12. Menggunakan Rich Text Input CkEditor dan Alternatifnya pada Yii2
  13. Gridview dan Listview
  14. SEO Friendly Url dengan slug
  15. Scenario pada Model Yii2
  16. Retrieve data pada Yii2
  17. Relasi Database pada Yii2
  18. Widget Kartik
  19. Select2 dengan Kartik Ekstension
  20. Dependent Dropdown pada Yii2
  21. Bekerja dengan Modals
  22. Membuat Costum Template untuk Gii
  23. Mengupload File
  24. Mengupload File dengan Kartik Widget
  25. Gridview atau Datatables?
  26. Session dan Cookie pada Yii2
  27. Menggunakan AdminLTE pada Yii2
  28. Membuat Themes pada Yii2
  29. Menggunakan GoogleMaps API pada Yii2
  30. Menggunakan Socket.io pada Yii2
  31. Handling Error
  32. Bekerja dengan AuthClient
  33. Menggunakan Amazon S3 pada Yii2
  34. Mengirim Email dengan Swiftmailer pada Yii2
  35. Middleware pada Yii2
  36. Mengenal RBAC pada Yii2
  37. Implementasi RBAC pada Yii2
  38. Notifikasi Real Time dengan Socket.io pada Yii2

Anda dapat mengunduh dan memantau progress dari series ini lewat repositori Github belajararief-yii2series. Silahkan bintangi (star) untuk dapat lebih mudah memantau perkembangan repositori.

Requirement

Untuk memudahkan anda dalam memahami petunjuk ini, maka beberapa hal yang perlu diperhatikan diantaranya:

  1. Sistem Operasi yang saya gunakan adalah Windows 10 64bit dengan terminal menggunakan powershell terminal (beberapa command seperti cd dapat berbeda dengan command prompt biasa), namun saya akan berusaha sebisa mungkin mencontohkan perintah pada sistem operasi lain jika memunkinkan.
  2. Stack yang digunakan adalah Wamp Server (Apache 2.2, MySQL, PHP 7).
  3. Yii yang digunakan adalah Yii 2.0 dengan catatan jquery yang digunakan bukan jquery3. Beberapa perintah jquery akan berbeda pada jquery3, dan beberapa extensions yang saya gunakan sepertinya belum mendukung jquery3

Relational Data

Jika sebelumnya kita telah bermain dengan Active Record dengan memanggil isi dari tabel Blog, maka kali ini kita akan menampilkan tabel Blog pada laman administrator/blog sehingga menampilkan user yang membuat dan memodifikasi data tersebut. Hal ini umum dilakukan terutama pada aplikasi yang banyak memanfaatkan RDBMS.

Pada kasus kita kali ini adalah sebuah tulisan pada tabel blog memiliki satu creator/updater yang bersumber dari tabel users. Sedangkan satu user bisa memiliki lebih dari satu tulisan pada tabel Blog.

Declaring Relations

Untuk membuat data yang berelasi antar model maka hal pertama yang akan kita lakukan adalah mendeklarasikan relasi tersebut pada model. Pertama kita akan mendeklarasikan relasi pada Model Blog. Buka file \app\models\Blog.php dan tambahkan baris berikut.


class Blog extends ActiveRecord
{
// .....
public function getUserCreator() { return $this->hasOne(User::class, ['id' => 'created_by']); } public function getUserUpdater() { return $this->hasOne(User::class, ['id' => 'updated_by']); }

// .....
}

Kode di atas berarti kita mendeklarasikan relasi pada model Blog yang bernama userCreator dan userUpdater. Keduanya berelasi langsung dengan 1 user melalui metode hasOne(). Jika anda perhatikan nama metode untuk deklarasi relasi ini menggunakan format getXyz(). Pada Yii2 untuk mempermudah akses pada data berelasi digunakan awalan getXyz() pada metode yang merupakan metode relasi. Dengan begini relasi dapat dipanggil lebih mudah pada banyak widget yang ada di Yii2 dengan cara seperti kita mengakses field pada tabel. Lebih lengkap akan dibahas pada seksi berikutnya pada tulisan ini.

Kedua kita akan mendeklarasikan relasi pada model User. Buka file \app\models\User.php dan tambahkan baris berikut.


class User extends ActiveRecord
{
// .....

public function getBlogs() { return $this->hasMany(Blog::class, ['created_by' => 'id']); }
// .....
}

Sama seperti relasi pada model Blog, pada model User kita buat dengan cara yang sama. Hanya saja pada model User kita menggunakan metode hasMany() yang menunjukkan bahwa satu user dapat memiliki banyak tulisan pada Blog. Fungsi ini akan memberikan hasil berupa array.

Accesing Relational Data

Selanjutnya kita akan menampilkan creator dari blog pada laman administrator/blog dan menampilkan creator dan updater secara lengkap pada administrator/blog/view?id=x. Untuk itu pertama kita buka terlebih dahulu view untuk laman administrator/blog melalui file \app\modules\administrator\view\blog\index.php kemudian modifikasi sehingga bagian gridView terlihat seperti di bawah ini.

            <?= GridView::widget([
                'dataProvider' => $dataProvider,
                'filterModel' => $searchModel,
                'columns' => [
                    ['class' => 'yii\grid\SerialColumn'],
                    'title',
                    [
                        'attribute' => 'body',
                        'format' => 'raw',
                        'value' => function ($model){
                            return StringHelper::truncateWords(strip_tags($model->body, "<image>"), 30, "", true);
                        }
                    ],
                    [
                        'attribute' => 'created_by',
                        'value' => 'userCreator.username'
                    ],
                    'created_at:date',
                    // 'userCreator.username',

                    ['class' => 'yii\grid\ActionColumn'],
                ],
            ]); ?>

Lalu untuk memodifikasi agar laman administrator/blog/view memunculkan juga updater tulisan, maka kita memodifikasi file \app\modules\administrator\view\blog\view.php sehingga bagian detailView menjadi seperti di bawah ini.

    <?= DetailView::widget([
        'model' => $model,
        'attributes' => [
            'id',
            'slug',
            'title',
            'body:html',
            'created_at:date',
            'updated_at:date',
            'userCreator.username',
            'userUpdater.username',
        ],
    ]) ?>

Setelah kita buka maka halaman administrator/blog dan view akan memunculkan nama creator dan updater dari tulisan yang ada pada aplikasi kita. 

Dari contoh di atas maka untuk menampilkan data creator dapat dengan mudah dengan menuliskan deklarasi relasi dan field yang akan ditampilkan seperti 'userCreator.username', atau dengan cara OOP yaitu $model->userCreator->username. Atau dengan cara lebih tradisional lagi seperti $model->getUserCreator()->username.


Terimakasih sudah membaca. Semoga bermanfaat dan Happy Coding!