Yuk Belajar Yii2 part 4
Tags: php, yii, beginners, tutorial
Published: 2019-07-17 12:09:51

#### Model

Model dalam mvc adalah bagian yang berhubungan dengan data, jadi model adalah class yang langsung berhubungan dengan data, dari mulai pencariaan data, validasi, penyimpanan data dan lain lain.

***Dari dokumen resmi Yii2***

> Models are part of the  [MVC](http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller)  architecture. They are objects representing business data, rules and logic.
> 
> You can create model classes by extending  [yii\base\Model](http://yii-docs-2.0-en.test/yii-base-model.html)  or its child classes. The base class  [yii\base\Model](http://yii-docs-2.0-en.test/yii-base-model.html)  supports many useful features:
> 
> - [Attributes](http://yii-docs-2.0-en.test/guide-structure-models.html#attributes): represent the business data and can be accessed like normal object properties or array elements;
> - [Attribute labels](http://yii-docs-2.0-en.test/guide-structure-models.html#attribute-labels): specify the display labels for attributes;
> - [Massive assignment](http://yii-docs-2.0-en.test/guide-structure-models.html#massive-assignment): supports populating multiple attributes in a single step;
> - [Validation rules](http://yii-docs-2.0-en.test/guide-structure-models.html#validation-rules): ensures input data based on the declared validation rules;
> - [Data Exporting](http://yii-docs-2.0-en.test/guide-structure-models.html#data-exporting): allows model data to be exported in terms of arrays with customizable formats.
> 
> The  `Model`  class is also the base class for more advanced models, such as  [Active Record](http://yii-docs-2.0-en.test/guide-db-active-record.html). Please refer to the relevant documentation for more details about these advanced models.

Dalam Yii class model yang  kita buat adalah class yang merupakan inheritance dari **yii\base\model** dalam implementasinya biasa ditulis dengan :

```
class NamaClass extends model {} 
```

Untuk membahas model, sekaligus agar kita konsisten dengan contoh sebelumnya. Juga agar kita konsisten dengan latihan latihan kita ke depanya, kita akan membahasnya melalui contoh kasus.

Contoh kasus yang kan kita gunakan adalah sistem perkuliahan sederhana, seperti dalam diagram class di bawah ini :

![5d37d81d7a84512404](https://i.loli.net/2019/07/24/5d37d81d7a84512404.png)

Asusmsi Awal:

- Agar lebih mempermudah kita dan tetap terfokus pada Yii2, latihan kita tidak membahas Jurusan, Angkatan, kelas dan lain lain.
- User model adalah model yang berhubungan dengan identity Class
- **Dosen** Dan **Mahasiswa** adalah detail dari **User** model.
- **Dosen** boleh mengajar banyak **Matakuliah**, Tetapi  satu **Matakuliah** hanya boleh di pegang satu dosen.
- **Mahasiswa** boleh mempunyai banyak **Jadwal**, dan satu **Jadwal** boleh diisi oleh banyak **Mahasiswa**. jadi kita akan memakai model **JadwalMahasiswa** untuk menghubungkan model **Mahasiswa** dengan **Jadwal**.
- Satu **Matakuliah** bisa mempunyai banyak **Jadwal**, satu **Jadwal** hanya diisi satu **Matakuliah**.
- Satu **Jadwal** hanya boleh mengisi satu **RuangKelas**, satu **RuangKelas** bisa diisi banyak **Jadwal**.

Jika pada latihanlatihan kita sebelumnya kita memakai project **yii2basic** maka untuk lathan ini  kita akan membuat project baru, disini kita akan menamakan **yii2campus**. untuk instalasi dan lainya silahkan liat referensi dari [https://www.yiiframework.com/doc/guide/2.0/en](https://www.yiiframework.com/doc/guide/2.0/en)

#### Membuat Model Pertama

Pada contoh ini kita akan membuat model Dosen (Agar lebih konsisten dengan  cotoh kita sebelumnya) model bekerja memvalidasi input dari pengguna. 

Pertama kita perlu membuat model file dengan nama **Dosen.php** dalam folder **models**, kemudian masukan kode di bawah ini :

> jika dalam kode ada coment block seperti  /* on */ atau /* * off */ abaikan saja karena itu fungsi custom Eclipse IDE untuk menghiraukan auto format. 

```php-extras
<?php
namespace app\models;

use Yii;

class Dosen extends \yii\db\ActiveRecord
{

    /* off */
    /* property dari model dosen */
    public $id;
    public $nama;
    public $tanggal_lahir;
    public $alamat_rumah;
    public $foto;
    public $file_foto;
    public $user_id;
/* on */

    /**
     * methode ini tidak diperlukan dalam coding,
     * tetapi berguna untul menampilkan label ke pengguna akhir
     */
    public function attributeLabels()
    {
        return [
            'id' => 'ID',
            'nama' => 'Nama',
            'tanggal_lahir' => 'Tanggal Lahir',
            'alamat_rumah' => 'Alamat Rumah',
            'foto' => 'Foto',
            'user_id' => 'User ID'
        ];
    }

    /**
     * aturan validasi model Dosen
     */
    public function rules()
    {
        return [
            /* off */
            [ [  'id','nama', 'tanggal_lahir' ],
                'required'
            ],
            [ [ 'id', 'user_id' ],
                'integer'
            ],
            [ [ 'nama', 'tanggal_lahir', 'alamat_rumah' ],
                'string',
                'max' => 45
            ],
            [ [ 'foto' ],
                'string', 
                'max' => 145
            ],
            [ [ 'id' ],
                'unique'
            ],
        ];
        /* on */
    }
}
```

Keterangan :

- **namespace** digunakan untuk mengatur nama menjadi  deklaratif dalam mengatur file menjadi group  logis untuk mencegah kekacauan file karena nama yang sama antara file. simpelnya name space seperti nama folder tempat file disimpan.

- **use**  digunakan untuk mendeklarasikan class objek lain yang digunakan dalam class kita. 

- **class Dosen extends \yii\db\ActiveRecord** adalah tag pembuka dari class yang kita bangun. **class**mendeklarasikan class, **Dosen** adalah nama atu ID dari class tersebut, **extend** menyatakan kelas ini merupakan inheritance dari class **ActiveRecord**. kemudian **\yii\db\ActiveRecord** bentuk lain dari deklarasi **use**, jika kita deklarasikan **use \yii\db\ActiveRecord** maka deklaras class bisa di buat seperti **class Dosen extends ActiveRecord** karena kita sudah memberitahukan class bahwa kita menggunakan Active pada deklarasi **use**.

- **public function attributeLabels()**    merupakan method yang kita implementasikan dari method pada kelas **Model.php**, kita bisa meng override method tersebut karena **ActiveRecord.php** merupakan inheritance  dari **Model.php**.
  
  **function attrbuteLabels ()** sendiri berduna untuk merubah nama property (mudahnya variabel) dari class kita menjad nama yang lebih mudah dibaca end user. misalnya  **user_name menjadi Nama Pengguna** atau **id menjadi Nomor Induk Dosen**, dan lain lain.

- **public function rules()** sama seperti **public function attributeLabels()**  merupakan method yang kita implementasikan dari class **Model.php**.
  
  **function rules()** berfungsi untuk menmvalidasi data yang di input user sesuai dengan aturan yang kia tetapkan. misalnya
  
  **[ [ 'id','nama', 'tanggal_lahir' ], 'required' ]** artinya field Id, nama, dan tanggl_lahir tidak boleh kosong.  contoh lainya **[ [ 'id', 'user_id' ], 'integer' ]** field id dan user_id harus bertipe integer. referensi lengkap validator dapat dilihat di [https://www.yiiframework.com/doc/guide/2.0/en/tutorial-core-validators](https://www.yiiframework.com/doc/guide/2.0/en/tutorial-core-validators)

Setelah model di bangun kini saatnya kita membuat controller, seperti biasa kita membuat controler lainya, pertama kita membuat file **DosenController.php**  dalam folder controllers, kemudian masukan kode :

```php
<?php

namespace app\controllers;

use Yii;
use yii\web\Controller;
/* model yang dipakai  */
use app\models\Dosen;


/**
 * DosenController implements the CRUD actions for Dosen model.
 */
class DosenController extends Controller
{
    public function actionCreate()
    {
        $model = new Dosen();
        $modelCanSave = false;

        if ($model->load(Yii::$app->request->post()) && 
        $model->validate()) {
            $modelCanSave = true;
        }

        return $this->render('create', [
            'model' => $model,
            'modelCanSave' => $modelCanSave
        ]);
    }
}
```

- Tidak ada perbedaan dengan controller sebelumnya yang pernah kita buat hanya saja dalam deklarasi **use** ada deklarasi **use app/models/Dosen** yang berguna untuk menyatakan bahwa kita menggunakan model **Dosen.php** dalam class ini. 

- **model->load**,  **model->validate** berfungsi untuk memangil mehod dari class model dengan method sesuai nama fungsinya.

- **Yii::$app->request->post()**, **Yi::app** secara sederhana merupakan entry script point  yang dapat di akses secara global. request->post sendiri memanggil method post dari class request. methodnya sendiri berhubungan dengan request parameter

- **return $this->render()** memanggil fungsi render.

- **$model = new Dosen();** membuat instance dari Dosen dengan nama model. 

- **$modelCanSave** variable yang diinisilisasi dengan false.

selanjutnya kita membuat folder baru dalam view/dosen  kemudian diisi dengan kode di bawah ini :

```php-extras
use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\helpers\Url;
use yii\helpers\ArrayHelper;
?>

<?php if($modelCanSave) { ?>
<div class="alert alert-success">model siap disimpan!</div>
<?php } ?>

<?php $form = ActiveForm::begin(); ?>
<div class="row">
    <div class="col-lg-12">
        <h1>Room form</h1>
              <?= $form->field($model, 'id')->textInput() ?>
            <?= $form->field($model, 'nama')->textInput(['maxlength' => true]) ?>
            <?= $form->field($model, 'tanggal_lahir')->textInput(['maxlength' => true]) ?>
            <?= $form->field($model, 'alamat_rumah')->textInput(['maxlength' => true]) ?>
            <?= $form->field($model, 'foto')->textInput(['maxlength' => true]) ?>    
   </div>
</div>

<div class="form-group">
    <?= Html::submitButton('Create' , ['class' => 'btn btn-success']) ?>
</div>
<?php ActiveForm::end(); ?>
```

Setelah semua beres di input, kita bisa mencoba untuk menjalankan di browser dengan URL  [http://yii2campus.test/dosen/create](http://yii2campus.test/dosen/create), kita bisa mencoba dengan input yang tidak sesuai dengan validasi. form field akan berubah menjadi merah tanda validasi gagal. jika semuanya berhasil view akan menampilkan pemberitahuan **model siap disimpan**.

Jika Kita merubah kode dibawah : 

```
<div class="alert alert-success">model siap disimpan !</div>
```

Dengan ini :

```
<div class="alert alert-success">
    Id Dosen : <?php echo $model->id; ?> <br />
    Nama: <?php echo $model->nama; ?> <br />  
    Tanggal Lahir: <?php echo Yii::$app->formatter->asDate($model->tanggal_lahir,'php:m/d/Y'); ?> <br />
    Alamat: <?php echo $model->alamat_rumah; ?> <br />  
      Foto : <?php echo $model->foto; ?> <br />
</div>
```

Hasilnya akan menampilkan informasi yang kita telah kita masukan.

#### Kesimpulan

Pada part ini kita telah mempelajari tentang model, meskipun tidak menghubungkan model tersebut dengan database, tetapi kita telah melihat bahwa model  buka hanya berhubungan dengan penyimpanan dan pencarian data. Di sini model kita gunakan untuk memvalidasi input pada form. Kita juga telah membuat Controller yang mengatur flow antara model dengan view.

pada part selanjutnya kita akan membahas gii, sebuah fitur ajaib yang disediakan oleh Yii.