Pemrograman

Bahasa

Framework

Peralatan

Info

Pertemuan kedua praktikum bebas, memahami MVC Yii

– 14 January 2015

Melanjutkan praktikum sebelumnya, pada pertemuan kedua ini kita akan belajar MVC (Model, View, Controller) Yii. Memahami MVC dengan praktik langsung.

Modifikasi controller Jurusan

Mari kita buka berkas JurusanController.php, yang berada di direktori backend/controllers/. Isi dari berkas tersebut berupa kelas bernama JurusanController, kelas ini turunan dari kelas Controller.

<?php

namespace backend\controllers;

use Yii;
use backend\models\Jurusan;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

/**
 * JurusanController implements the CRUD actions for Jurusan model.
 */
class JurusanController extends Controller
{
    public function behaviors()
    {
        return [
            'verbs' => [
                'class' => VerbFilter::className(),
                'actions' => [
                    'delete' => ['post'],
                ],
            ],
        ];
    }

    /**
     * Lists all Jurusan models.
     * @return mixed
     */
    public function actionIndex()
    {
        $dataProvider = new ActiveDataProvider([
            'query' => Jurusan::find(),
        ]);

        return $this->render('index', [
            'dataProvider' => $dataProvider,
        ]);
    }

    /**
     * Displays a single Jurusan model.
     * @param integer $id
     * @return mixed
     */
    public function actionView($id)
    {
        return $this->render('view', [
            'model' => $this->findModel($id),
        ]);
    }

    /**
     * Creates a new Jurusan model.
     * If creation is successful, the browser will be redirected to the 'view' page.
     * @return mixed
     */
    public function actionCreate()
    {
        $model = new Jurusan();

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

    /**
     * Updates an existing Jurusan model.
     * If update is successful, the browser will be redirected to the 'view' page.
     * @param integer $id
     * @return mixed
     */
    public function actionUpdate($id)
    {
        $model = $this->findModel($id);

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

    /**
     * Deletes an existing Jurusan model.
     * If deletion is successful, the browser will be redirected to the 'index' page.
     * @param integer $id
     * @return mixed
     */
    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect(['index']);
    }

    /**
     * Finds the Jurusan model based on its primary key value.
     * If the model is not found, a 404 HTTP exception will be thrown.
     * @param integer $id
     * @return Jurusan the loaded model
     * @throws NotFoundHttpException if the model cannot be found
     */
    protected function findModel($id)
    {
        if (($model = Jurusan::findOne($id)) !== null) {
            return $model;
        } else {
            throw new NotFoundHttpException('The requested page does not exist.');
        }
    }
}

Namespace menandakan lokasi JurusanController.php disimpan. Kata kunci use, artinya kita akan menggunakan kelas-kelas lain di dalam berkas ini. use mirip seperti import pada bahasa pemrograman java atau python.

<?php

namespace backend\controllers;

use Yii;
use backend\models\Jurusan;
use yii\data\ActiveDataProvider;
use yii\web\Controller;
use yii\web\NotFoundHttpException;
use yii\filters\VerbFilter;

Di dalam kelas JurusanController terdapat fungsi-fungsi (aksi) untuk mengendalikan data. Sebelum ditampilkan ke views, data perlu diproses; di kelas inilah kita menuliskan kode logika pengolahan data.

class JurusanController extends Controller
{
    ...
    ...
    ...
}

Contoh, lihatlah fungsi yang bernama actionIndex(). Perhatikan logika program yang ada di dalamnya. Fungsi ini untuk menampilkan data di index.php

class JurusanController extends Controller
{
// ...

  public function actionIndex()
  {
      // mengambil data di database (model)
      $dataProvider = new ActiveDataProvider([
      'query' => Jurusan::find(),
      ]);

      // mengirim data ke views index.php
      return $this->render('index', [
      'dataProvider' => $dataProvider,
      ]);
   }

// ...
}

Sekarang, mari kita membuat aksi sendiri. Aksi ini hanya untuk menampilkan pesan "Hallo Dunia" saja. actionUcapsalam(), itulah nama aksi yang akan kita buat. Penulisannya di dalam kelas JurusanController.

class JurusanController extends Controller
{
// ...

  public function actionUcapsalam()
  {
      $ucapan = "Hallo Dunia";
      
      echo $ucapan;
   }

}

Kode lengkap JurusanController.php yang sudah ditambahkan dengan aksi actionUcapsalam() dapat di lihat di http://pastebin.com/dNbEfVCG. Untuk melihat aksi yang telah dibuat, silahkan buka URL ini http://localhost/pmb/backend/web/index.php?r=jurusan/ucapsalam.

Menuliskan echo di berkas controller sangat tidak dianjurkan. Karena akan membuat kode programnnya menjadi kurang rapi. Berkas controller khusus untuk menulis kode logika saja, bukan untuk menampilkan data. Kita dapat menggunakan echo di berkas views. Sekarang, mari kita modif lagi aksi yang sudah dibuat; ganti perintah echo menjadi return

class JurusanController extends Controller
{
// ...

    public function actionUcapsalam()
    {
	$ucapan = "Hallo Dunia";

	return $this->render('salam',[
		'ucapanSalam' => $ucapan
	]);
    }

}

Kode lengkap dapat dilihat di pastebin: http://pastebin.com/dhE19xg9

Selanjutnya, mari kita membuat berkas baru di direktori backend/views/jurusan dengan nama salam.php. Berkas inilah tempat menampilkan data. Di bawah ini isi berkas salam.php.

<?php

echo $ucapanSalam;

Di aksi actionUcapsalam(), kita sudah menggunakan perintah return untuk me-render atau mengirim data yang ada di variabel $ucapan ke berkas salam.php. Data yang dikirim tersimpan di variabel $ucapanSalam. Oleh karena itu, kita akan mencetak isi variabel tersebut di berkas salam.php.

Setelah itu coba lihat lagi tampilan aksi yang sudah dibuat. Masuk ke http://localhost/pmb/backend/web/index.php?r=jurusan/ucapsalam

Cobalah mengirim lebih dari satu variabel, modifikasi lagi aksi actionUcapsalam() menjadi seperti ini:

public function actionUcapsalam()
    {
	$ucapan = "Assalamualaikum, Saya sedang belajar framework Yii";
	$nama = "Ardianta";

	return $this->render('salam',[
		'ucapanSalam' => $ucapan,
		'seseorang' => $nama
	]);
    }

Ubah juga berkas salam.php menjadi seperti ini:

<?php

echo $seseorang ." Mengatakan: <q>". $ucapanSalam ."</q>";

Modifikasi views jurusan

Buka berkas index.php yang ada di direktori backend/views/jurusan/. Isi dari berkas tersebut adalah ini:

<?php

use yii\helpers\Html;
use yii\grid\GridView;

/* @var $this yii\web\View */
/* @var $dataProvider yii\data\ActiveDataProvider */

$this->title = 'Jurusans';
$this->params['breadcrumbs'][] = $this->title;
?>
<div class="jurusan-index">

    <h1><?= Html::encode($this->title) ?></h1>

    <p>
        <?= Html::a('Create Jurusan', ['create'], ['class' => 'btn btn-success']) ?>
    </p>

    <?= GridView::widget([
        'dataProvider' => $dataProvider,
        'columns' => [
            ['class' => 'yii\grid\SerialColumn'],

            'kode_jurusan',
            'nama_jurusan',

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

</div>

Modifikasilah kode di atas seperti tangkapan layar dibawah ini.

Lihatlah, perbedaannya setelah dimodifikasi.

Membuat pagination

Pagination berfungsi untuk membatasi jumlah baris yang ditampilkan di tabel. Mari kita modifikasi berkas JurusanController.php, di bagian aksi actionIndex(), tambahkan 'pagination' => ['pageSize' => 2,]. 2 adalah jumlah baris yang akan ditampilkan.

Coba buka halaman jurusan, maka akan tampil dua baris, dan dibawahnya terdapat pagination.

Membuat tabel pendaftar

Seperti rencana, proyek ini akan memiliki bebarapa tabel. Kita sudah membuat tabel jurusan. Sekarang membuat tabel pendaftar, berikut ini kalimat SQL untuk membuat tabel pendaftar.

CREATE TABLE pendaftar(
  nomer int(11) NOT NULL,
  nama varchar(40) NOT NULL,
  jk enum('L','P') NOT NULL,
  agama enum('Islam','Hindu','Budha','Kristen','Konghucu') NOT NULL,
  nilai_ijazah varchar(45) NOT NULL,
  asal_sekolah varchar(32) NOT NULL,
  alamat_sekolah varchar(45) NOT NULL,
  PRIMARY KEY(nomer)
)

Membuat model pendaftar secara manual

Di praktikum sebemulnya, kita membuat model dengan me-genrate melalui fitur Yii. Sekarang kita akan coba menulis kode model secara manual. Mari membuat berkas bernama Pendaftar.php di direktori backend/models.

Isilah berkas tersebut dengan kelas bernama Pendaftar.

<?php

namespace backend\models;

class Pendaftar extends \yii\db\ActiveRecord
{

// ...

}

Membuat nama tabel, tambahkan fungsi ini di dalam kelas Pendaftar. Nama tabel sesuai dengan nama tabel yang dibuat di database.

public static function tableName()
{
    return 'pendaftar';
}

Membuat rules atau aturan. Aturan ini berfungsi untuk menangani input/update di form

public function rules()
{
    return [
       	// #1 Data harus terisi semua
        [['nomer', 'nama', 'jk', 'agama', 'nilai_ijazah', 'asal_sekolah', 'alamat_sekolah'], 'required'],
            
        // #2 nomer pedaftaran harus berupa angka
        [['nomer'], 'integer'],
            
        // #3 Selain nomer, datanya berupa string
        [['nama', 'jk', 'agama', 'nilai_ijazah', 'asal_sekolah', 'alamat_sekolah'], 'string']
        ];
}

Membuat label atribut.

public function attributeLabels()
{
    return [
        'nomer' => 'Nomer Pendaftaran',
        'nama' => 'Nama',
        'jk' => 'Jenis Kelamin',
        'nilai_ijazah' => 'Nilai Ijazah',
        'asal_sekolah' => 'Sekolah Asal',
        'alamat_sekolah' => 'Alamat Sekolah'
    ];
}

Isi lengkap: Pendaftar.php

<?php

namespace backend\models;

class Pendaftar extends \yii\db\ActiveRecord
{

    // membuat nama tabel
    public static function tableName()
    {
        return 'pendaftar';
    }
	
	
    // membuat aturan
    public function rules()
    {
        return [
        	// #1 Data harus terisi semua
            [['nomer', 'nama', 'jk', 'agama', 'nilai_ijazah', 'asal_sekolah', 'alamat_sekolah'], 'required'],
            
            // #2 nomer pedaftaran harus berupa angka
            [['nomer'], 'integer'],
            
            // #3 Selain nomer, datanya berupa string
            [['nama', 'jk', 'agama', 'nilai_ijazah', 'asal_sekolah', 'alamat_sekolah'], 'string']
        ];
    }
    
    
    // membuat label atribut
    public function attributeLabels()
    {
        return [
            'nomer' => 'Nomer Pendaftaran',
            'nama' => 'Nama',
            'jk' => 'Jenis Kelamin',
            'nilai_ijazah' => 'Nilai Ijazah',
            'asal_sekolah' => 'Sekolah Asal',
            'alamat_sekolah' => 'Alamat Sekolah'
        ];
    }

}

Membuat CRUT pendaftar

Pembuatan CRUT dilalkukan melalui fitur ajaib Yii. Buka http://localhost/pmb/backend/web/index.php?r=gii/default/view&id=crud. Kemudian isi datanya seperti ini

Guling ke bawah, klik tombol Preview; kemudian klik tombol Generate. Bila berhasil, akan keluar pesan seperti ini:

Generating code using template "/var/www/html/pmb/vendor/yiisoft/yii2-gii/generators/crud/default"...
generated controllers/PendaftarController.php
generated views/pendaftar/_form.php
generated views/pendaftar/create.php
generated views/pendaftar/index.php
generated views/pendaftar/update.php
generated views/pendaftar/view.php
done!

Uji coba CRUT pendaftar, kunjungi halaman pendaftar http://localhost/pmb/backend/web/index.php?r=pendaftar.

----- Bersambung -----

Tulisan ini sebagai catatan praktikum bebas yang saya ikuti. Pembahasannya tidak terlalu mendalam, hanya sebagai pengingat; kalau kelak saya lupa. Mudah-mudahan tulisan ini bermanfaat.

No comments :

Post a Comment