Pada tutorial ini, kita akan belajar bagaimana cara memanipulasi data dengan CakePHP, yaitu menambah, membaca, mengubah, dan menghapus data.

Tutorial CakePHP Dasar Part II - Manipulasi Data (CRUD)

Updated: 18 Mei 2014

Kali ini saya akan melanjutkan tutorial sebelumnya, yaitu Tutorial CakePHP Dasar Part I. Pada tutorial lanjutan ini, kita akan belajar bagaimana cara memanipulasi data dengan menggunakan framework CakePHP. Manipulasi data mencakup trik-trik dasar bagaimana mengubah data pada database dengan menggunakan program, seperti menambah, membaca, mengubah, dan menghapus data, atau kita sebut istilahnya dengan CRUD (Create, Read, Update, Delete). Supaya bisa mengikuti tutorial ini dengan baik, kamu harus menyelesaikan tutorial sebelumnya, karena tutorial ini melanjutkan kasus dari Tutorial CakePHP Dasar Part I.

Menambahkan Data (dengan Validasi)

Langkah-langkah yang akan kita lakukan yaitu:

  • Menambahkan validasi pada model Artikel.php

  • Membuat function tambah() pada ArtikelController.php

  • Membuat form dengan membuat view baru, yaitu tambah.ctp

Untuk menambahkan data, kita perlu membuat validasi. Validasi adalah suatu pengecekan apakah data yang diisi pada input form sudah sesuai dengan ketentuan yang didefinisikan atau belum, jika belum maka akan kembali ke form tersebut dan pengguna harus mengisi kembali, dan jika sudah benar maka form akan tersubmit dan penambahan data akan diproses.

Pada CakePHP, validasi data sangat menyenangkan untuk dibuat (saking gampangnya). Kita tidak usah membuat if satu persatu dengan kode PHP manual, tetapi kita cukup mendefinisikan apa saja yang perlu divalidasi pada model. Dengan begitu, jika ada form lain yang menggunakan data pada model yang sama, maka validasi tidak usah dibuat di controller, karena memang sudah didefinisikan pada model sebelumnya. Cara untuk membuat vaidasi untuk tabel artikel adalah dengan menambahkan kode-kode berikut pada model.

Buka /app/Model/Artikel.php, kemudian tambahkan kode berikut ini:

  ...

  public $validate = array(
      'judul' => 'notEmpty',
      'konten' => 'notEmpty',
  );
  
  ...

Penjelasan kode di atas yaitu kita mendefinisikan validasi untuk judul artikel dan isi konten tidak boleh kosong (notEmpty). Adapun variable $validate adalah bawaan dari CakePHP untuk menentukan validasi. Ada banyak variasi validasi yang dapat digunakan, untuk melihatnya bisa kamu lihat di sini: book.cakephp.org/2.0/en/models/data-validation.html.

Sekarang, setelah kita menambahkan validasi pada model, kita akan membuat function baru di controller, kita beri nama function tersebut tambah().

Buatlah sebuah function baru dengan isi function kosong di /app/Controller/ArtikelController.php:

  ...

  function tambah()
  {

  }

  ...

Sekarang, ketika kita buka alamat http://localhost/blogku/artikel/tambah maka akan tampil error. CakePHP akan memberitahu kita bahwa View belum dibuat. Oke, sekarang yang akan kita lakukan adalah membuat form pada view.

Buatlah sebuah file baru /app/View/Artikel/tambah.ctp dengan isi html sebagai berikut:

<h1>Buat Artikel</h1>

<?php
echo $this->Form->create('Artikel');
echo $this->Form->input('judul');
echo $this->Form->input('konten');
echo $this->Form->end('Simpan');
?>

Sekarang, coba buka http://localhost/blogku/artikel/tambah, dan lihat tampilannya.

 

 

Woow... membuat form semudah membalikkan telapak tangan! Ya, begitulah mengapa CakePHP disebut Rapid PHP Framework. Pada kode form di atas, kita memanggil FormHelper bawaan CakePHP untuk digunakan dalam pembuatan Form lengkap dengan validasinya. Untuk referensi FormHelper, kamu bisa lihat selengkapnya di sini: http://book.cakephp.org/2.0/en/core-libraries/helpers/form.html.

Output dari kode di atas adalah:

<form action="/blogku/artikel/tambah" id="ArtikelTambahForm" method="post" accept-charset="utf-8">
  <div style="display:none;">
    <input type="hidden" name="_method" value="POST"/>
  </div>
  <div class="input text required">
    <label for="ArtikelJudul">Judul</label>
    <input name="data[Artikel][judul]" maxlength="125" type="text" id="ArtikelJudul"/>
  </div>
  <div class="input textarea required">
    <label for="ArtikelKonten">Konten</label>
    <textarea name="data[Artikel][konten]" cols="30" rows="6" id="ArtikelKonten"></textarea>
  </div>
  <div class="submit">
    <input  type="submit" value="Simpan"/>
  </div>
</form>

Pertanyaannya adalah, mengapa input untuk konten menjadi textarea? Yup, jawabannya adalah karena CakePHP mendeteksi otomatis tipe data dari database, jika tipe datanya varchar, maka form akan membentuk input text, tetapi jika tipenya text, maka input akan otomatis berubah menjadi textarea. Oke, selanjutnya kita akan membuat kode untuk penambahan data di controller.

Tambahkan kode berikut ini pada function tambah() tadi di controller /app/Controller/ArtikelController.php

  function tambah()
  {
    //jika form sudah disubmit
    if ($this->request->is('post') || $this->request->is('put'))
    {
      //simpan data baru dengan isi dari form
      if ($this->Artikel->save($this->request->data))
      {
        //beri keterangan "Data telah disimpan."
        $this->Session->setFlash('Data telah disimpan.');
//alihkan ke function index() $this->redirect(array('action' => 'index')); } } }

Arti kode di atas adalah:

Jika form sudah disubmit (yaitu $this->request->data tidak kosong/sudah berisi data) maka: Jika model artikel menyimpan data baru, maka berilah keterangan "Data telah disimpan." dan alihkan ke daftar artikel.

$this->Article->save() adalah perintah untuk membuat data baru di dalam database dengan model "Artikel" berikut dengan validasinya. Parameter di dalamnya adalah data apa yang disimpan? yaitu data hasil submit dari form yaitu $this->request->data.
Referensihttp://book.cakephp.org/2.0/en/models/saving-your-data.html

$this->Session->setFlash() adalah function dari komponen Session bawaan CakePHP untuk memberikan flashdata/keterangan yang muncul pada browser. Biasanya dipakai ketika menambahkan data, menghapus, dan mengubah data.
Referensi: http://book.cakephp.org/2.0/en/core-libraries/components/sessions.html#creating-notification-messages

$this->redirect() adalah redirect/mengalihkan halaman ke url tertentu. Parameter bisa berupa URL maupun Controller Action pada CakePHP.

Ok, untuk penambahan data selesai, silakan coba dengan membuka link http://localhost/blogku/artikel/tambah. Kemudian coba tambahkan data. Sebelumnya kosongkan dulu input box dan lihat bagaimana validasi bekerja. Jika kita isi input box, maka data akan tersimpan.

Mengubah Data

Setelah kita menambahkan data, sekarang kita akan membuat bagaimana cara mengubah data yang telah kita buat. Langkah-langkah yang akan kita lakukan yaitu:

  • Menambahkan tombol edit pada tabel di index.ctp

  • Membuat function ubah() pada ArtikelController.php

Langkah pertama yang harus dilakukan adalah menambahkan tombol edit pada file index.ctp. Tombol ini dibuat di tabel bagian kanan pada kolom aksi. Buatlah kolom baru dengan nama aksi setelah kolom Tanggal Dibuat

Ubah /app/View/Artikel/index.ctp sehingga menjadi seperti ini:

<h1>Data Artikel</h1>

<table>
  <thead>
    <tr>
      <th>ID</th>
      <th>Judul</th>
      <th>Konten</th>
      <th>Tanggal Dibuat</th>
      <th>Aksi</th>
    </tr>
  </thead>
  <tbody>
    <?php foreach ($artikel as $a): ?>
      <tr>
        <td><?php echo $a['Artikel']['id'] ?></td>
        <td><?php echo $a['Artikel']['judul'] ?></td>
        <td><?php echo $a['Artikel']['konten'] ?></td>
        <td><?php echo $a['Artikel']['created'] ?></td>
        <td><?php echo $this->Html->link('Ubah', array('action' => 'ubah', $a['Artikel']['id'])) ?></td>
      </tr>
    <?php endforeach ?>
  </tbody>
</table>

Pada kode di atas, kita membuat th baru, yaitu Aksi yang di dalam kolomnya berisi $this->Html->link(), yaitu sebuah link yang bertuliskan Ubah  dan URL nya menuju action/function ubah dan parameter ID nya kita isikan dengan id dari artikel, yaitu $a['Artikel']['id']. Url yang akan dibentuk, sebagai contoh akan menjadi seperti ini: http://localhost/blogku/artikel/ubah/1 (id artikel = 1).

Selanjutnya karena kita sebelumnya sudah membuat form input data, maka untuk membuat function edit ini sangat simpel, kita tidak perlu membuat form edit, melainkan dengan menggunakan form tambah yang sebelumnya dibuat, hanya saja sekarang form tersebut berisi nilai sesuai dengan ID tertentu dari suatu data. Untuk lebih jelasnya, silakan buat function baru pada /app/Controller/ArtikelController.php:

  function ubah($id)
  {
    $this->Artikel->id = $id;
    
    $this->request->data = $this->Artikel->read();
    $this->render('tambah');
  }

$this->Artikel->id kita isikan dengan $id, yaitu parameter dari function ubah(). $id ini didapatkan pada tombol Ubah pada tabel, yaitu id dari artikel. Kemudian $this->request->data diisikan dengan $this->Artikel->read(), $this->request->data adalah isi dari form yang telah kita buat. Form tersebut diisikan dengan data artikel yang sudah dibaca berdasarkan id = $id (read). Kemudian, setelah itu render dengan view tambah.ctp. Jadi, pada function ubah() kita tidak harus membuat view ubah.ctp, cukup menggunakan view tambah.ctp.

Nah, sekarang jika kita buka link http://localhost/blogku/artikel/ubah/1 (id artikel = 1) maka form sudah terisi otomatis dengan data yang mempunyai id 1. Selanjutnya, kita tambahkan kode untuk mengubah dan menyimpan hasil perubahan ke dalam database. Simpel, kita cukup menambahkan kode yang sama dengan kode pada function tambah(). Ubah /app/Controller/ArtikelController.php menjadi seperti ini:

  function ubah($id)
  {
    $this->Artikel->id = $id;

    //tambahkan kode sama seperti kode yang ada di dalam tambah()
    if ($this->request->is('post') || $this->request->is('put') )
    {
      if ($this->Artikel->save($this->request->data))
      {
        $this->Session->setFlash('Data telah disimpan.');
        $this->redirect(array('action' => 'index'));
      }
    }

    $this->request->data = $this->Artikel->read();
    $this->render('tambah');
  }

Di dalam CakePHP, function untuk tambah maupun ubah adalah save(). Jika $this->Artikel->id sudah terisi, maka fungsi dari save() adalah edit, sedangkan jika belum terisi, fungsi dari save() adalah menambah data baru. Kita lihat bahwa $this->Artikel->id terisi oleh $id, maka fungsi save() menjadi edit sekarang.

Sekarang, buat kondisi pada halaman /app/View/tambah.ctp untuk membedakan label jika tambah dan jika ubah. Ubah pada bagian ini:

<?php if ($this->action == 'tambah'): ?>
  <h1>Buat Artikel</h1>
<?php else: ?>
  <h1>Ubah Artikel</h1>
<?php endif ?>

Selesai? Yup, untuk edit dapat berfungsi dengan baik sekarang, berikut dengan validasi dan keterangan (flashdata) setelah kita mengubah data tersebut. Untuk mencobanya, silakan buka http://localhost/blogku/artikel kemudian edit salah satu data dengan klik tombol Ubah pada kolom Aksi.

 

 

Menghapus Data

Setelah kita membuat pengubahan data, sekarang kita akan membuat bagaimana cara menghapus data yang telah kita buat. Langkah-langkah yang akan kita lakukan yaitu:

  • Menambahkan tombol hapus pada tabel di index.ctp

  • Membuat function hapus() pada ArtikelController.php

Untuk membuat tombol hapus, sangat mudah. Kita tinggal menambahkan tombol hapus seperti tombol ubah di atas. Silakan ubah  bagian kolom Aksi pada file /app/View/Artikel/index.ctp menjadi seperti berikut ini:

<td>
  <?php echo $this->Html->link('Ubah', array('action' => 'ubah', $a['Artikel']['id'])) ?>
  <?php echo $this->Html->link('Hapus', array('action' => 'hapus', $a['Artikel']['id']), array('confirm' => 'Anda yakin?')) ?>
</td>

Setelah itu, buat function baru bernama hapus() di controller /app/Controller/ArtikelController.php.

  function hapus($id)
  {
    if ($this->Artikel->delete($id))
    {
      $this->Session->setFlash('Data telah dihapus.');
      $this->redirect(array('action' => 'index'));
    }
  }

Untuk hapus sangat simpel, kode di atas sudah bisa bekerja dengan baik untuk menghapus data berikut dengan alert konfirmasi yang bertulisan "Anda yakin?". Untuk function hapus() sudah tidak perlu saya jelaskan lagi, pasti sahabat Jaco sudah mengerti maksudnya, hehe..

Bagaimana, mudah bukan? Ya, itulah framework. Dengan menggunakan framework, framework apapun itu, kita dapat dengan cepat dan mudah dalam mengembangkan sebuah aplikasi dibandingkan dengan menggunakan PHP murni.

Terima kasih sudah mengikuti tutorial kali ini dengan baik, nantikan tutorial-tutorial saya berikutnya pada Tutorial CakePHP Dasar Part III. Pada tutorial Part III, kita akan membuat pagination dan sorting berdasarkan tabel dengan menggunakan CakePHP.

 

Berikut ini adalah screenshot hasil jadinya:

 

~ Jagocoding.com

Stand by with Me, @cheyuz,
Jagocoding, learn and share your code!


About Author

Cecep Yusuf

Hi, my name is Cecep Yusuf. However, in the virtual world I am more likely to use the name Cheyuz, which is an abbreviation of two words "Cecep" and "Yusuf". I am founder of Jagocoding.com, u can view more of me in Cheyuz.com


Comment & Discussions

  • andi masri
    bagusan mana bikin web dengan framework atau dengan php murni bang?

    • Cecep Yusuf

      Bagusan pake framework, karena mudah dimaintenance gan :)


  • randyose (Guest)
    kok muncul fatal error: call to member setFlash() on non-object

  • farhan jazmi
    ksalahannya dimana ya gan?? setelah menambahkan fungsi tambah jd tampil Error: syntax error, unexpected '<' File: C:\xampp\htdocs\blogku\app\Controller\ArtikelController.php Line: 18

    • farhan jazmi

      setelah d coba <br> di hapus. sudah bisa tampil halaman tambah datanya, saya coba tambahkan data, nah langsung tampil error seperti di atas tadi. tetapi saya cek d http://localhost/blogku/artikel , data sudah bertambah. errornya tetap di line $this->Session->setFlash('Data telah disimpan.');


    • farhan jazmi

      saya coba hapus $this->Session->setFlash('Data telah disimpan.'); sudah tidak error lagi. kira-kira kesalahannya apa gan kalo pake $this->Session->setFlash('Data telah disimpan.'); bisa eror?


  • mas, koq saya abis input syntax function ubah malah jd error ya?? error messages nya seperti ini : Fatal error: Class declarations may not be nested in C:\xampp\htdocs\blogku\lib\Cake\Error\ExceptionRenderer.php on line 56

  • Yosep (Guest)
    kang cecep mau nanya kalo error begini apa siy masalahnya :

    Warning (512): DbAcl::check() - Failed ACO node lookup in permissions check.

  • Please LOGIN before if you want to give the comment.