Belajar Kode Program

Blog belajar menulis kode program dan aplikasi komputer

Sabtu, 24 Juni 2017

Mengenal Scenario pada Model di Yii2

Scenario sama artinya dengan bahasa kita sehari-hari:skenario. Ini berarti rencana lakon suatu sandiwara. Tetapi, di konteks aplikasi, skenario berarti kemungkinan-kemungkinan kondisi tertentu. Sebagai misal, ketika kita membuat satu tabel untuk menampung data surat-menyurat, tentu kita memiliki perlakuan berbeda untuk data surat masuk dan keluar. Untuk surat keluar, kita mengharuskan adanya data tanggal pengiriman, sementara untuk surat keluar kita tidak mewajibkannya. Untuk urusan tersebut, kita menggunakan scenario. Mari kita diskusikan.

Skenario sebenarnya digunakan untuk kepentingan validasi sebuah model. Nah, dalam satu model, kita bisa menerapkan beberapa jenis validasi dengan menggunakan scenario. Pada artikel ini, kita akan mengangkat kasus data surat-menyurat dengan satu tabel. Berikut ini adalah tabelnya:


Dari tabel tersebut, mari kita gunakan alat canggih milik yii, yaitu Gii. Buat model dan CRUD-nya melalui http://localhost/?r=gii. Hasilnya kita akan membuat file model Surat.php dan SuratSearch.php (hasil dari generate CRUD), file controller SuratController.php serta file-file view pada folder views/surat.

Selanjutnya, pada model (nama model adalah models/Surat.php) kita modifikasi dengan skenario berikut:

class Surat extends \yii\db\ActiveRecord
{
  const SCENARIO_MASUK = 'Surat Masuk';
  const SCENARIO_KELUAR = 'Surat Keluar';

  public function scenarios()
  {
    $scenarios = parent::scenarios();
    $scenarios[self::SCENARIO_MASUK] = ['jenis', 'nomor', 'perihal', 'tanggal', 'tgl_terima', 'penerima', 'pengirim'];
    $scenarios[self::SCENARIO_KELUAR] = ['jenis', 'nomor', 'perihal', 'tanggal', 'tgl_kirim', 'penerima'];
    return $scenarios;
  }
  // kode lainnya
}

Selain menggunakan kode di atas, yakni fungsi scenarios(), kita juga bisa membuat alternatif melalui fungsi rules() pada model Surat dengan isi sebagai berikut:
public function rules()
{
 return [
   [['jenis', 'nomor', 'perihal', 'tanggal','tgl_terima', 'penerima', 'pengirim'], 'required','on' => self::SCENARIO_MASUK],
  [['jenis', 'nomor', 'perihal', 'tanggal', 'tgl_kirim', 'penerima'], 'required', 'on' => self::SCENARIO_KELUAR],
    [['jenis', 'nomor', 'perihal', 'tanggal', 'tgl_kirim', 'tgl_terima', 'penerima', 'pengirim', 'status'], 'required'],
    [['jenis'], 'string'],
    [['tanggal', 'tgl_kirim', 'tgl_terima'], 'safe'],
    [['status'], 'integer'],
    [['nomor', 'perihal', 'penerima', 'pengirim'], 'string', 'max' => 100],
  ];
}

Pada controller, kita akan membuat dua fungsi untuk memanggil pembuatan surat masuk (?r=surat/create-masuk) dan surat keluar (?r=surat/create-keluar). Modifikasi pada controller menjadi seperti berikut:

public function actionCreateKeluar()
{
  $model = new Surat(['scenario' => Surat::SCENARIO_KELUAR]);
  $model->jenis = $model->scenario;

  if ($model->load(Yii::$app->request->post()) && $model->save()) {
    return $this->redirect(['view', 'id' => $model->id]);
  } else {
    return $this->render('create', [
      'model' => $model,
    ]);
  }
}

public function actionCreateMasuk()
{
  $model = new Surat(['scenario' => Surat::SCENARIO_MASUK]);
  $model->jenis = $model->scenario;

  if ($model->load(Yii::$app->request->post()) && $model->save()) {
    return $this->redirect(['view', 'id' => $model->id]);
  } else {
    return $this->render('create', [
      'model' => $model,
    ]);
  }
}

Sementara pada views, pada file index.php, untuk membuat tombol kita modifikasi di bagian tombol menjadi seperti berikut:

<p>
  <?= Html::a('Tambah Surat Keluar', ['create-keluar'], ['class' => 'btn btn-success']) ?>
  <?= Html::a('Tambah Surat Masuk', ['create-masuk'], ['class' => 'btn btn-success']) ?>
</p>

Hasilnya akan menjadi seperti gambar berikut:



Masih di views, kita akan modifikasi file _form.php di bagian surat-form menjadi seperti berikut:

<div class="surat-form">

  <?php $form = ActiveForm::begin(['layout'=>'horizontal']); ?>

  <?= $form->field($model, 'nomor')->textInput(['maxlength' => true]) ?>

  <?= $form->field($model, 'perihal')->textInput(['maxlength' => true]) ?>

  <?= $form->field($model, 'tanggal')->textInput() ?>

  <?= $form->field($model, 'tgl_kirim')->textInput() ?>

  <?php
  if(in_array('tgl_terima', $model->scenarios()[$model->scenario])){
    echo $form->field($model, 'tgl_terima')->textInput();
  }
  ?>
 
  <?= $form->field($model, 'penerima')->textInput(['maxlength' => true]) ?>

  <?= $form->field($model, 'pengirim')->textInput(['maxlength' => true]) ?>

  <?= $form->field($model, 'status')->textInput() ?>

  <div class="form-group">
    <?= Html::submitButton($model->isNewRecord ? 'Create' : 'Update', ['class' => $model->isNewRecord ? 'btn btn-success' : 'btn btn-primary']) ?>
  </div>

  <?php ActiveForm::end(); ?>

</div>

Nah, jadilah form kita. Untuk form membuat surat masuk seperti ini:



Pada gambar di atas field tgl_kirim tidak wajib diisi karena memang tidak kita cantumkan dalam field wajib isi pada scenario 'Surat Masuk'.

Selamat belajar, semoga bermanfaat!


Referensi:

Tidak ada komentar:

Posting Komentar