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.
- Prainstalasi
- Instalasi YiiFramework 2.0
- Login
- Login dengan Database pada Yii2
- Bekerja dengan Gii
- Module pada Yii2
- Layout dasar dan Manipulasinya pada Yii2
- Costum Asset dan Asset Bundle pada Yii2
- Alias pada Yii2
- Bekerja dengan Form
- Timestamp, Blameable, dan Sluggable Behavior pada Yii2
- Menggunakan Rich Text Input CkEditor dan Alternatifnya pada Yii2
- Gridview dan Listview
- SEO Friendly Url dengan slug
- Scenario pada Model Yii2
- Retrieve data pada Yii2
- Relasi Database pada Yii2
- Menggunakan Bootstrap4
- Widget Kartik dan Kartik Gridview
- Select2 dengan Kartik Ekstension
- Dependent Dropdown pada Yii2
- Bekerja dengan Modals
- Membuat Costum Template untuk Gii
- Mengupload File
- Mengupload File dengan Kartik Widget
- Gridview atau Datatables?
- Session dan Cookie pada Yii2
- Menggunakan AdminLTE pada Yii2
- Membuat Themes pada Yii2
- Menggunakan GoogleMaps API pada Yii2
- Menggunakan Socket.io pada Yii2
- Handling Error
- Bekerja dengan AuthClient
- Menggunakan Amazon S3 pada Yii2
- Mengirim Email dengan Swiftmailer pada Yii2
- Middleware pada Yii2
- Mengenal RBAC pada Yii2
- Implementasi RBAC pada Yii2
- 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:
- 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.
- Stack yang digunakan adalah Wamp Server (Apache 2.2, MySQL, PHP 7).
- 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
Mengenal Scenario
Scenario merupakan salah satu metode dalam model. Dalam sebuah aplikasi, tidak jarang sebuah model memiliki beberapa skenario penginputan. Contohnya ketika model User yang digunakan untuk pendaftaran, penambahan, dan login. Pada saat penambahan dan pendaftaran pengguna harus mengisi seluruh field seperti email, username, password. Sedangkan ketika login user cukup mengisi username dan password saja. Perbedaan ini membuat perlu ada 2 rules yang berbeda dalam model, yaitu rules yang membuat email menjadi required dan rule yang membuat email tidak harus required.
Model akan menggunakan properti scenario. Secara default model akan menggunakan scenario bernama default. Sedangkan scenario lain kita susun secara langsung pada model dan di set pada controller.
Pada contoh ini kita akan membuat scenario pada modul blog manajemen. Modul blog manajemen akan membuat user tidak dapat mengubah title dan rules title dihilangkan dari required apabila user yang melakukan update blog bukan user yang sebelumnya membuat blog tersebut.
Penerapan Scenario pada modul Blog
Pada contoh yang akan kita rancang sebelumnya kita akan menambahkan scenario baru sehingga ketika pengguna yang mengubah artikel orang lain tidak dapat mengubah judul dari artikel. Pertama kita akan mengubah model pada file app\models\Blog.php
sehingga bagian rules dan menambahkan scenario editByOther menjadi seperti di bawah ini.
public function rules()
{
return [
[['slug', 'title', 'body'], 'required', 'on' => 'default'],
[['body'], 'required', 'on' => 'editByOther'],
[['body'], 'string'],
[[ 'created_by', 'updated_by'], 'integer'],
['created_at', 'date', 'timestampAttribute' => 'created_at'],
['updated_at', 'date', 'timestampAttribute' => 'updated_at'],
[['slug'], 'string', 'max' => 2048],
[['title'], 'string', 'max' => 512],
];
}
Selanjutnya kita akan mengubah controller agar menerapkan scenario editByOther pada actionUpdate. Ubah file app\modules\administrator\contollers\BlogController.php
sehingga pada actionUpdate ditambahkan scenario editByOther menjadi seperti di bawah ini.
public function actionUpdate($id)
{
$model = $this->findModel($id);
$users = User::find()->select(['id', 'username'])->all();
// if user who update different from user who create, scenario set to editByOther
if($model->created_by != Yii::$app->user->identity->id) $model->scenario = 'editByOther';
if ($model->load(Yii::$app->request->post())) {
// prevent user from change title if that article is not created by them
if($model->created_by != Yii::$app->user->identity->id) $model->title = $model->oldAttributes['title'];
if($model->save()) return $this->redirect(['view', 'id' => $model->id]);
}
return $this->render('update', [
'model' => $model,
'users' => $users,
]);
}
Terakhir kita akan membuat _form menjadi disabled apabila scenario editByOther berlaku. Ubah file app\modules\administrator\views\blog\_form.php
sehingga menjadi seperti di bawah ini.
<?php
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use dosamigos\ckeditor\CKEditor;
/* @var $this yii\web\View */
/* @var $model app\models\Blog */
/* @var $form yii\widgets\ActiveForm */
?>
<div class="blog-form">
<?php $form = ActiveForm::begin(); ?>
<?= $form->field($model, 'title')->textInput(['maxlength' => true, 'disabled' => $model->scenario == 'editByOther' ? true : false]) ?>
<?= $form->field($model, 'body')->widget(CKEditor::class, [
'options' => ['rows' => 6],
'preset' => 'basic'
]) ?>
<div class="form-group">
<?= Html::submitButton('Save', ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
</div>
Terimakasih sudah membaca. Semoga bermanfaat dan happy coding!