Memulai Pembuatan Aplikasi Web dengan Yii2 (9): CRUD Dasar ke MySQL

Muhammad Arslan 9 September 2016

Memulai Pembuatan Aplikasi Web dengan Yii2 (9): CRUD Dasar ke MySQL

CRUD adalah salah satu menu utama ketika mempelajari pembuatan sebuah aplikasi. CRUD merupakan singkatan dari create, read, update, dan delete. CRUD merupakan suatu fitur yang terdiri dari menambah suatu item baru, menghapus item, melihat daftar item, mengubah item, dan melihat detail item. Yii2 mempunyai sebuah CRUD generator yang dinamai dengan Gii. Namun, kita tidak akan menggunakannya di tutorial ini, agar dapat mempelajari bagaimana membuat CRUD dari awal di Yii2.

Beberapa file yang harus dibuat dalam mewujudkan sebuah CRUD terdiri dari controller, model, form, dan views. Kita akan membuat controller serta beberapa model di tutorial ini. Untuk menampilkan datanya, kita akan menggunakan views yang akan menampilkan data tim sepakbola. Untuk validasinya kita gunakan form yang ada di Yii2. Tentu saja CRUD ini hanya dapat diakses oleh user yang sudah terautentikasi.

CRUD yang akan kita buat digunakan untuk mengelola tim sepakbola dari berbagai liga di dunia. Kita memerlukan tabel teams yang ada di soccerdb yang digunakan di tutorial "https://www.codepolitan.com/memulai-pembuatan-aplikasi-web-yii2-terhubung-database". Namun kita akan memodifikasi tabel teams tersebut agar dapat berelasi dengan tabel leagues yang akan kita buat di tutorial ini. Begitu juga dengan form yang akan kita buat dapat Anda pelajari terlebih dahulu di tutorial https://www.codepolitan.com/memulai-pembuatan-aplikasi-web-yii2-menggunakan-model-form-yii2, namun kita akan tetap memodifikasinya untuk keperluan tutorial ini. Selain itu, Anda juga harus mengikuti terlebih dahulu tutorial Autentikasi di Yii2 untuk mengetahui bagaimana cara membuat autentikasi sederhana di Yii2.

Selamat mencoba, semoga bermanfaat :D.

Persiapan Coding

Sebelum memulai coding pastikan terlebih dahulu, Anda sudah membuat database yang bernama soccerdb. Di dalamnya mesti ada tiga tabel ini:
CREATE TABLE IF NOT EXISTS `leagues` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(100) NOT NULL,
  `division` enum('primary','secondary') NOT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;

CREATE TABLE IF NOT EXISTS teams ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(50) NOT NULL, country varchar(50) NOT NULL, description text NOT NULL, league_id int(11) NOT NULL, PRIMARY KEY (id) USING BTREE, KEY name_idx (name) USING BTREE, KEY league_idx (league_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='Tabel untuk menyimpan data tim sepakbola' AUTO_INCREMENT=15 ;

CREATE TABLE IF NOT EXISTS users ( id int(11) NOT NULL AUTO_INCREMENT, username varchar(255) NOT NULL, authKey varchar(32) NOT NULL, password varchar(255) NOT NULL, email varchar(255) NOT NULL, accessToken varchar(32) NOT NULL, PRIMARY KEY (id), UNIQUE KEY username (username), UNIQUE KEY email (email) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;

ALTER TABLE teams ADD CONSTRAINT team_league_fk FOREIGN KEY (league_id) REFERENCES leagues (id) ON DELETE CASCADE ON UPDATE CASCADE;

Bila Anda sudah mengikuti tutorial Autentikasi di Yii2, Anda tidak perlu membuat ulang tabel tersebut karena sudah dibuat melalui migration tool yang ada di Yii2. Sekarang kita buat terlebih dahulu sebuah controller yang bernama HelloCrudController.php, berikut adalah isi awal dari controller tersebut:

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\helpers\Url;

use app\models\Teams;
use app\models\Leagues;

class HelloCrudController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }
}

Lalu buat juga file dan folder berikut:

  • folder hello-crud di dalam folder views
  • file Teams.php di dalam folder models
  • file Leagues.php di dalam folder models
  • file TeamsForm.php di dalam folder models
  • file add.php, edit.php, detail.php, dan index.php di dalam folder views/hello-crud
Setelah membuatnya, Anda sudah siap untuk mengikuti langkah selanjutnya. Lanjutkan!

Membuat Model untuk Tabel Tim dan Liga

Setelah kita membuat dua buah tabel untuk CRUD kita, saatnya membuat dua model Yii2 untuk kedua tabel tersebut. Pertama kita buat terlebih dahulu model untuk tabel leagues. Berikut adalah source code untuk model leagues. Buat kode berikut di dalam models/Leagues.php:
<?php

namespace app\models;

use yii\db\ActiveRecord;

class Leagues extends ActiveRecord { public static function tableName() { return 'leagues'; } }

Pada kode diatas, kita mesti memanggil ulang function tableName() untuk menunjukkan model ke tabel yang dituju. Dalam hal ini tabel leagues menjadi target dari model Leagues. Sedangkan berikut adalah model teams. Buat kode berikut di dalam models/Teams.php:

<?php

namespace app\models;

use yii\db\ActiveRecord;

class Teams extends ActiveRecord
{
    public static function tableName()
    {
        return 'teams';
    }

    public function getLeague(){
        return $this->hasOne(Leagues::className(), ['id' => 'league_id']);
    }
}

Pada model yang kedua, ada sebuah function baru yang mempunyai nama getLeague(). Function tersebut digunakan sebagai relasi pada ActiveRecord. Relasi antara teams ke leagues adalah many to one sehingga kita menggunakan hasOne() yang artinya satu tim hanya memiliki satu liga. Nantinya, kita dapat memanggil langsung query ke tabel leagues melalui objek ActiveRecord teams.

Bila belum mudeng, mari kita lanjutkan tutorial ini agar lebih clear :D.

Membuat Daftar Tim Sepak Bola

Sekarang saatnya kita mulai menggunakan model yang sudah kita buat sebelumnya, kali ini kita akan mulai menampilkan daftar tim sepakbola. Kita akan membuat actionIndex() terlebih dahulu di dalam controller HelloCrudController. Action tersebut akan dilindungi oleh AccessControlFilter dan hanya user yang sudah terautentikasi saja yang boleh melihat halaman hello-crud. Silahkan buat kode berikut di dalam file HelloCrudController.php:
<?php

namespace app\controllers;

use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\helpers\Url;

use app\models\Teams; use app\models\Leagues;

class HelloCrudController extends Controller {

public function actions()
{
    return [
        'error' =&gt; [
            'class' =&gt; 'yii\web\ErrorAction',
        ],
    ];
}

public function behaviors()
{
    return [
        'access' =&gt; [
            'class' =&gt; AccessControl::className(),
            'only' =&gt; ['index',],
            'rules' =&gt; [
                [
                    'actions' =&gt; ['index',],
                    'allow' =&gt; true,
                    'roles' =&gt; ['@'],
                ],
            ],
        ],
    ];
}

public function actionIndex()
{
    $query = Teams::find();
    $teams = $query-&gt;orderBy('id')
        -&gt;all();

    return $this-&gt;render('index', ['teams'=&gt;$teams]);
}

}

Pada actionIndex(), kita hanya melakukan query dengan menggunakan ActiveRecord. Kita gunakan find() terhadap model Teams kemudian mengambil semua baris data dan diurut dengan id. Kemudian kita lewatkan variabel $teams kepada views hello-crud/index. Berikut adalah source code untuk views hello-crud/index:

<?php

use yii\helpers\Html;
use yii\widgets\Breadcrumbs;
use yii\helpers\Url;

$this->title = "Hello CRUD";

?>

<div class="row">
    <div class="col-md-12">
        <h1>Team List</h1>
        <hr/>
        <?php

        echo Breadcrumbs::widget([
            'itemTemplate' => "<li>{link}</li>\n", // template for all links
            'links' => [
                'Team List',
            ],
        ]);

        ?>
    </div>
</div>

<div>   
    <div class="col-md-2">
        <div class="list-group">
          <a href="<?php echo Url::to(['hello-crud/add']); ?>" class="list-group-item"><i class="glyphicon glyphicon-plus"></i> Add Team</a>
          <a href="<?php echo Url::to(['hello-crud/delete-all']); ?>" class="list-group-item"><i class="glyphicon glyphicon-trash"></i> Delete All</a>
        </div>
    </div>
    <div class="col-md-10">
        <table class="table table-striped">
            <thead>
              <tr>
                <th>Name</th>
                <th>League</th>
                <th>Country</th>
                <th>Action</th>
              </tr>
            </thead>
            <tbody>
                <?php if (count($teams) > 0) { ?>
                    <?php foreach ($teams as $team): ?>
                        <tr>
                            <td><?= Html::encode("{$team['name']}") ?></td>
                            <td><?= Html::encode("{$team->league['name']}") ?></td>
                            <td><?= Html::encode("{$team['country']}") ?></td>
                            <td style="width:15%;text-align:center;">
                                <a class="btn btn-success btn-sm" href="<?php echo Url::to(['hello-crud/detail', 'id'=>$team['id']]); ?>"><i class="glyphicon glyphicon-eye-open"></i></a> 
                            </td>
                          </tr>
                    <?php endforeach; ?>
                <?php } else { ?>
                <tr>
                    <td style="text-align:center;font-size:15px;padding:25px;" colspan="5">No data found...</td>
                </tr>
                <?php } ?>

            </tbody>
          </table>
    </div>
</div>

Di dalam views hello-crud/index, kita gunakan beberapa helper dan widget seperti Url, Html, dan Breadcrumbs. Kemudian kita isi title dengan "Hello CRUD". Di bagian awal views kita tampilkan breadcrumb dengan menu saat ini adalah "Team List". Kemudian di bawahnya ada menu dengan item "Add Team" dan "Delete All", sedangkan di sebelahnya terdapat tabel yang teridiri dari field Name, League, Country, dan Action.

Tabel tersebut akan menampilkan informasi "No data found" apabila tidak ada data dalam tabel teams, sedangkan baris data akan ditampilkan bila tabel ada isinya. Sebagai acuan, berikut adalah contoh screenshot dari halaman "hello-crud/index":

Selection_010

Anda dapat mengakses action tersebut melalui URL: http://localhost/hello-yii/web/index.php?r=hello-crud/index.

Membuat Halaman Detail Tim Sepak Bola

Pada halaman index CRUD, bila Anda mengisi tabel lewat PHPMyAdmin terlebih dahulu, maka kan tampil daftar tim di halaman tersebut. Di kolom "Action", Anda dapat melihat banyak tombol yang berikon mata dan bila ditekan maka kita akan diarahkan ke halaman detail tim tersebut. Namun saat ini belum dapat digunakan karena tidak ada action yang menangani tombol tersebut. Oleh karena itu, kita harus membuat action-nya terlebih dahulu.

Masih di controller yang sama yaitu HelloCrudController, kita buat action baru dengan nama actionDetail(). Action tersebut menerima satu parameter yang dinamakan dengan $id. Kemudian mengambil baris suatu tim berdasarkan id dari tabel teams melalui model Teams. Dan menampilkannya di views detail. Dan jangan lupa daftarkan action tersebut di access control filter agar hanya user yang terautentikasi saja yang dapat mengakses halaman tersebut. Sekarang silahkan buat action tersebut dengan melanjutkan baris kode setelah actionIndex():

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\helpers\Url;

use app\models\Teams;
use app\models\Leagues;

class HelloCrudController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['index', 'detail',],
                'rules' => [
                    [
                        'actions' => ['index', 'detail',],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }


    .....................................................


    public function actionDetail($id)
    {
        $team = Teams::findOne(['id'=>$id]);
        return $this->render('detail', ['team'=>$team]);
    }
}

Action-nya memang ramping, tapi views-nya yang akan kita buat cukup panjang. Fokus dan telitilah agar tidak terjadi error. Berikut ini adalah kode untuk views hello-crud/detail. Silahkan buat kode berikut di dalam file detail.php di folder views/hello-crud:

<?php

use yii\widgets\Breadcrumbs;
use yii\helpers\Url;

$this->title = "Hello CRUD";

?>


<div class="row">
    <div class="col-md-12">
        <h1><?php echo $team['name'] ?></h1>
        <hr/>

        <?php

        echo Breadcrumbs::widget([
            'itemTemplate' => "<li>{link}</li>\n", // template for all links
            'links' => [
                ['label' => 'Team List', 'url' => ['hello-crud/index']],
                $team['name'],
            ],
        ]);

        ?>
    </div>
</div>

<div>   
    <div class="col-md-2">
        <div class="list-group">
          <a href="<?php echo Url::to(['hello-crud/edit', 'id'=>$team['id']]); ?>" class="list-group-item"><i class="glyphicon glyphicon-pencil"></i> Edit Team</a>
          <a href="<?php echo Url::to(['hello-crud/delete', 'id'=>$team['id']]); ?>" class="list-group-item"><i class="glyphicon glyphicon-trash"></i> Delete Team</a>
        </div>
    </div>
    <div class="col-md-10">

        <div class="col-md-8">
            <p><b>League</b>: <?php echo $team->league['name'] ?></p>
            <p><b>Country</b>: <?php echo $team->country ?></p>
            <p><?php echo $team['description'] ?></p>

        </div>


</div>

Pada kode diatas, seperti biasa kita gunakan widgets dan helpers bawaan Yii seperti Breadcrumbs dan Url. Kemudian kita buat breadcrumb untuk halaman ini dengan menu saat ini adalah nama tim yang sedang dibuka. Setelah itu ada list group di sebelah kiri yang membentuk menu dengan isi "Edit Team" dan "Delete Team", dan di sisi kanannya, kita coba tampilkan detail tim mulai dari nama liga yang diikutinya, negara tempat dia tinggal, dan deskripsi tentang tim tersebut.

Anda dapat melihat kode unik pada kode diatas, saat akan menampilkan nama liga. Kita menunjuk sebuah atribut bernama league dan mengakses key name pada atribut tersebut. Kode tersebut menunjukkan bagaimana relasi bekerja pada ActiveRecord yang dimiliki Yii2. Agar lebih jelas, berikut adalah contoh screenshot bila kita sukses membuat halaman detail ini:

Selection_011

Sebagai contoh Anda dapat mengakses action tersebut melalui URL: http://localhost/hello-yii/web/index.php?r=hello-crud/detail&amp;id=13.

Membuat Form untuk Tabel Tim

OK, index sudah, detail sudah tinggal mengerjakan add, edit, dan delete. Sebelum melangkah ke edit dan add. Kita perlu membuat sebuah forms untuk validasi data tim sepak bola. Kita namai class tersebut TeamsForm dan kodenya akan dibuat di models/TeamsForm.php. Di dalam forms tersebut field name dan country akan kita validasi sesuai ketentuan yaitu dibutuhkan (required) dan masing - masing mempunyai panjang khusus. Ada juga sebuah field yang bernama league_id dimana nantinya akan digunakan untuk menampung inputan berupa select yang akan membantu kita memilih liga untuk tim tersebut.

Berikut adalah kode untuk forms tabel tim. Silahkan buat kode berikut di dalam file models/TeamsForm.php:

<?php

namespace app\models;

use yii\base\Model;

class TeamsForm extends Model
{
    public $name;
    public $country;
    public $description;
    public $league_id;

    public function attributeLabels()
    {
        return [
            'name' => 'Nama tim sepakbola',
            'country' => 'Negara asal',
            'description' => 'Tentang tim'
        ];
    }

    public function rules()
    {
        return [
            ['name', 'required','message' => 'Nama tim gak boleh kosong'],
            ['name', 'string','max'=>'20'],
            ['country', 'required','message' => 'Negara asal tim gak boleh kosong'],
            ['country', 'string','max'=>'25'],
        ];
    }
}

Membuat Tambah Tim Sepak Bola

Setelah membuat forms untuk validasi add dan edit. Sekarang kita akan menggunakan forms di controller. Sertakan forms tersebut dengan menggunakan sintaks user app\models\Teamsform; di bagian atas file controller. Kemudian silahkan tambahkan actionAdd() di dalam HelloCrudController:
<?php

namespace app\controllers;

use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\helpers\Url;

use app\models\Teams; use app\models\Leagues; use app\models\TeamsForm;

class HelloCrudController extends Controller {

public function actions()
{
    return [
        'error' =&gt; [
            'class' =&gt; 'yii\web\ErrorAction',
        ],
    ];
}

public function behaviors()
{
    return [
        'access' =&gt; [
            'class' =&gt; AccessControl::className(),
            'only' =&gt; ['index', 'detail', 'add',],
            'rules' =&gt; [
                [
                    'actions' =&gt; ['index', 'detail', 'add',],
                    'allow' =&gt; true,
                    'roles' =&gt; ['@'],
                ],
            ],
        ],
    ];
}


.....................................................


public function actionAdd()
{
    $forms = new TeamsForm();

    if ($forms-&gt;load(Yii::$app-&gt;request-&gt;post()) &amp;&amp; $forms-&gt;validate())
    {
        $request = Yii::$app-&gt;request;

        $team = new Teams();
        $team-&gt;name = $request-&gt;post('TeamsForm')['name'];
        $team-&gt;description = $request-&gt;post('TeamsForm')['description'];
        $team-&gt;country = $request-&gt;post('TeamsForm')['country'];
        $team-&gt;league_id = $request-&gt;post('TeamsForm')['league_id'];
        $team-&gt;save();

        return $this-&gt;redirect(Url::to(['hello-crud/index']));
    }
    else 
    {
        $leagues = Leagues::find()-&gt;select(['name', 'id'])
                                    -&gt;indexBy('id')
                                    -&gt;column();

            return $this-&gt;render('add', ['forms'=&gt;$forms, 'leagues'=&gt;$leagues]);

    }
}

}

Anda dapat melihat di dalam actionAdd(), TeamsForm() dibuat terlebih dahulu sebelum proses lainnya. Kemudian ada dua pemeriksaan kondisi, bila request yang datang adalah POST maka forms akan memvalidasi data yang dikirimkan lewat POST dan proses penyimpanan data tim sepakbola pun dilakukan. Kemudian setelah menyimpan di-redirect ke halaman index. Sedangkan pada kondisi berikutnya, akan diperiksa bila request yang datang bukan POST. Dalam hal ini adalah GET. Maka kita akan menampilkan views add dengan melewatkan data leagues dan teams.

Data leagues yang kita kirimkan hanya terdiri dari dua field yaitu name dan id, dan data tersebut akan digunakan oleh dropDownList(). Dimana name akan digunakan sebagai display dan id akan digunakan sebagai value pada select yang dihasilkan oleh dropDownList(). Sekarang silahkan buat kode berikut di dalam file views/hello-crud/detail.php:

views hello-crud/detail:

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\Breadcrumbs;
use yii\helpers\Url;

$this->title = "Hello CRUD";

?>

<div class="row">
    <div class="col-md-12">
        <h1>Add Team</h1>
        <hr/>
        <?php

        echo Breadcrumbs::widget([
            'itemTemplate' => "<li>{link}</li>\n", // template for all links
            'links' => [
                ['label' => 'Team List', 'url' => ['hello-crud/index']],
                'Add Team',
            ],
        ]);

        ?>
    </div>
</div>

<div>   
    <div class="col-md-12">
        <?php $form = ActiveForm::begin([
                'id' => 'teams-form',
                'options' => ['class' => 'form-horizontal']
            ])
        ?>

        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'name')->hint('Diisi dengan nama yang terdiri dari angka, huruf kecil atau huruf besar'); ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'country')->hint('Diisi dengan karakter hanya huruf kecil atau huruf besar'); ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'league_id')->dropDownList($leagues, ['prompt' => 'Mohon pilih liga'])->label('Liga') ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'description')->TextArea(); ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
                <?= Html::submitButton('Simpan', ['class' => 'btn btn-primary']) ?>
            </div>
        </div>

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

Pada kode diatas, kita menggunakan juga widget ActiveForm. Untuk membuat form kita awali dengan ActiveForm::begin() dan diakhiri dengan ActiveForm::end(). Di dalamnya terdapat berbagai elemen seperti name, country, league_id, dan description. Kemudian di bagian paling akhir ada tombol submit. Field yang berbeda hanya league_id yang merupakan dropDownList() dan description yang merupakan TextArea() sisanya hanya textInput() biasa.

Berikut adalah beberapa screenshot dimana Anda dapat melihat wujud dari kode views dan action dan add diatas:

Selection_012

Sebagai contoh Anda dapat mengakses action tersebut melalui URL: http://localhost/hello-yii/web/index.php?r=hello-crud/add.

Membuat Edit Tim Sepak Bola

Tidak berbeda jauh dengan action add, untuk edit memiliki kode yang hampir sama. Hanya saja actionEdit() menerima satu parameter yaitu id. Parameter id tersebut digunakan untuk mengambil baris dari tim sepak bola yang akan di-edit. Bila request berupa POST, maka data tim akan diubah kemudian di-redirect ke halaman detail. Sedangkan bila request berupa GET maka akan muncul views edit.

Silahkan sesuaikan kode HelloCrudController bagian atas seperti pada kode berikut dan tambahkan actionEdit() di HelloCrudController Anda:

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\helpers\Url;

use app\models\Teams;
use app\models\Leagues;
use app\models\TeamsForm;

class HelloCrudController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['index', 'detail', 'add', 'edit',],
                'rules' => [
                    [
                        'actions' => ['index', 'detail', 'add', 'edit',],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }

    .....................................................


    public function actionEdit($id)
    {
        $forms = new TeamsForm();

        if ($forms->load(Yii::$app->request->post()) && $forms->validate())
        {
            $request = Yii::$app->request;

            $team = Teams::findOne(['id', $id]);
            $team->name = $request->post('TeamsForm')['name'];
            $team->description = $request->post('TeamsForm')['description'];
            $team->country = $request->post('TeamsForm')['country'];
            $team->league_id = $request->post('TeamsForm')['league_id'];
            $team->save();

            return $this->redirect(Url::to(['hello-crud/detail', 'id'=>$id]));
        }
        else 
        {
            $team = Teams::findOne(['id', $id]);
            $leagues = Leagues::find()->select(['name', 'id'])
                                        ->indexBy('id')
                                        ->column();

            return $this->render('edit', ['forms'=>$forms, 'leagues'=>$leagues, 'team'=>$team]);

        }
    }
}

Kemudian buat juga kode views berikud di file views/hello-crud/edit.php:

<?php

use yii\helpers\Html;
use yii\widgets\ActiveForm;
use yii\widgets\Breadcrumbs;
use yii\helpers\Url;

$this->title = "Hello CRUD";

?>

<div class="row">
    <div class="col-md-12">
        <h1>Edit <?php echo $team['name'] ?></h1>
        <hr/>
        <?php

        echo Breadcrumbs::widget([
            'itemTemplate' => "<li>{link}</li>\n", // template for all links
            'links' => [
                ['label' => 'Team List', 'url' => ['hello-crud/index']],
                'Edit '.$team['name'],
            ],
        ]);

        ?>
    </div>
</div>

<div>   
    <div class="col-md-12">
        <?php $form = ActiveForm::begin([
                'id' => 'teams-form',
                'options' => ['class' => 'form-horizontal']
            ])
        ?>

        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'name')->textInput(['value'=>$team->name])->hint('Diisi dengan nama yang terdiri dari angka, huruf kecil atau huruf besar'); ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'country')->textInput(['value'=>$team->country])->hint('Diisi dengan karakter hanya huruf kecil atau huruf besar'); ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'league_id')->dropDownList($leagues, ['options' => [$team->league_id => ['Selected'=>true]]], ['prompt' => 'Mohon pilih liga'])->label('Liga') ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
            <?= $form->field($forms, 'description')->TextArea(['value'=>$team->description]); ?>
            </div>
        </div>
        <div class="form-group">
            <div class="col-lg-8">
                <?= Html::submitButton('Simpan', ['class' => 'btn btn-primary']) ?>
            </div>
        </div>

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

Kode views diatas hampir mirip dengan kode views add hanya saja di setiap input kita berikan nilai default yang didapat dari data tim yang akan diedit. Untuk dropDownList() pun kita tampilkan dengan memilih nilai yang sesuai dengan data tim yang akan kita edit. Untuk input textInput() dan TextArea() kita dapat melewatkan parameter "value"=>"".

Berikut adalah beberapa screenshot dimana Anda dapat melihat wujud dari kode views dan action dan edit diatas:

Selection_015

 

Sebagai contoh Anda dapat mengakses action tersebut melalui URL: http://localhost/hello-yii/web/index.php?r=hello-crud/edit&amp;id=13.

Membuat Hapus Tim Sepak Bola

OK, sekarang kita tinggal membuat fitur pamungkas dimana kita dapat menghapus suatu tim. Fitur ini akan ditempatkan di halaman detail suatu tim. Dimana kita letakkan link untuk menghapus suatu tim di menu kiri "Delete Team". Proses hapus cukup sederhana, Anda tinggal memilih baris mana yang akan dihapus dengan menggunakan findOne() kemudian variabel hasil instansiasi dari ActiveRecord memanggil method delete(). Kemudian melakukan redirect ke halaman index.

Silahkan tambahkan actionDelete() seperti pada kode berikut dibawah ini dan jangan lupa daftarkan action tersebut ke access control filter:

<?php

namespace app\controllers;

use Yii;
use yii\filters\AccessControl;
use yii\web\Controller;
use yii\helpers\Url;

use app\models\Teams;
use app\models\Leagues;
use app\models\TeamsForm;

class HelloCrudController extends Controller
{

    public function actions()
    {
        return [
            'error' => [
                'class' => 'yii\web\ErrorAction',
            ],
        ];
    }

    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'only' => ['index', 'detail', 'add', 'edit', 'delete'],
                'rules' => [
                    [
                        'actions' => ['index', 'detail', 'add', 'edit', 'delete'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
        ];
    }


    .....................................................


    public function actionDelete($id)
    {
        $team = Teams::findOne(['id' => $id]);
        $team->delete();

        return $this->redirect(Url::to(['hello-crud/index']));
    }
}

Sekarang kita coba hapus beberapa tim, dan berikut screenshot-nya:

Selection_018

Sebagai contoh Anda dapat mengakses action tersebut melalui URL: http://localhost/hello-yii/web/index.php?r=hello-crud/delete&amp;id=13.

Membuat Hapus Semua Tim Sepak Bola

Tidak berbeda jauh dengan actionDelete(), actionDeleteAll() akan melakukan penghapusan data tim hanya saja semua data tim akan dihapus. Anda tidak perlu melakukan instansiasi terlebih dahulu, karena Anda dapat langsung memanggil static method deleteAll(). Tambahkan actionDeleteAll() ke controller Anda:
<?php

namespace app\controllers;

use Yii; use yii\filters\AccessControl; use yii\web\Controller; use yii\helpers\Url;

use app\models\Teams; use app\models\Leagues; use app\models\TeamsForm;

class HelloCrudController extends Controller {

public function actions()
{
    return [
        'error' =&gt; [
            'class' =&gt; 'yii\web\ErrorAction',
        ],
    ];
}

public function behaviors()
{
    return [
        'access' =&gt; [
            'class' =&gt; AccessControl::className(),
            'only' =&gt; ['index', 'detail', 'add', 'edit', 'delete', 'delete-all'],
            'rules' =&gt; [
                [
                    'actions' =&gt; ['index', 'detail', 'add', 'edit', 'delete', 'delete-all'],
                    'allow' =&gt; true,
                    'roles' =&gt; ['@'],
                ],
            ],
        ],
    ];
}


.....................................................



public function actionDeleteAll()
{
    Teams::deleteAll();
    return $this-&gt;redirect(Url::to(['hello-crud/index']));
}

}

Berikut adalah screenshot bagaimana actionDeleteAll() bekerja:

Selection_019

Sebagai contoh Anda dapat mengakses action tersebut melalui URL: http://localhost/hello-yii/web/index.php?r=hello-crud/delete-all.

Penutup

Memang membuat CRUD dapat dengan mudah jika menggunakan Gii, tapi ada pro dan kontra jika menggunakan tools tersebut. Membuat CRUD dari awal di Yii2 pun bukanlah sebuah kerugian, karena kita dapat melihat dan mencoba bagaimana menggunakan forms, model, controller, dan views. Terlebih kita juga dapat memahami cara menggunakan validasi dan berbagai komponen yang tersedia di Yii2. Anda pun dapat mulai membuat CRUD custom sendiri.

Tetap kreatif dan tetap semangat, karena tutorial Yii2 ini masih berlanjut :D hingga beberapa episode.

(codepolitan/yiiframework)