Beranda > CakePHP > Konsep Dasar CakePHP (bag IV)

Konsep Dasar CakePHP (bag IV)

Mulai bagian ini anda harus pasang perhatian baik-baik. Pada manual resmi dari situs CakePHP.org sebelum Chapter Models ini ada satu chapter bernama Scaffold yang merupakan salah satu ‘hot feature’ dari Cake sendiri, dimana anda bisa membuat satu aplikasi lengkap cukup dengan menuliskan var $scaffold;, dan simsalabim!!! Akan tercipta aplikasi dengan action: index, add, edit, view, dan delete (sesuai dengan standar Cake, lengkap dari model hingga view.

Namun dalam membangun aplikasi sering kita melakukan kustomisasi, misal dalam data validation ataupun penambahan logic atau action tertentu. Jadi pembahasan pembuatan aplikasi dengan feature scaffolding dan Bake akan saya simpan dulu. Menurut hemat saya, jika kita memulai latihan dari yang berat, maka ketika kita diminta untuk ‘berlomba’ di level yang lebih ringan, semuanya akan terasa sangat mudah.

Section 1

Apakah Model Itu?

Dalam Chapter 2: Konsep Dasar, kita sudah menyinggung sedikit tentang konsep MVC, dimana Model menjadi bagian awalnya. Jika database ada di level presentation, maka Model berada pada level application logic. Boleh dikata bahwa suatu Model merupakan titik akses ke database, atau lebih tepatnya tabel di dalam database. Dalam konvensi Cake mengatur bahwa nama suatu tabel harus jamak, sedangkan nama Model merupakan bentuk tunggalnya (singular). Contoh: jika tabel bernama ‘users’ maka modelnya bernama ‘User’. Model juga dapat berisi validasi data, informasi asosiasi, dan metode lain yang berkaitan dengan tabel yang digunakan. Berikut contoh jika anda membuat Model User, yang kemudian disimpan di /app/model/user.php

//Untuk membuat model dalam Cake anda harusmenurunkannya dari AppModel
class User extends AppModel
{
    // Pastikan untuk memulai dengan mendifinasikanvariabel modelnya sendiri.
    var $name = 'User';
    // Kemudian diikuti validasi data.
    var $validate = array();
 
    // Dan sertakan asosiasi jika ada.
 
    var $hasMany = array('Image' =>
                   array('className' => 'Image')
                   );
    // Anda juga dapat menyertakan function buatan anda sendiri:
    function makeInactive($uid)
    {
        //Silahkan tulis logic-nya disini...
    }
}
?>

Section 2

Function dalam Model

Jika kita lihat contoh kode di atas dari sisi OOP/PHP, suatu model adalah suatu class yang merupakan turunan dari AppModel. Class AppModel sendiri aslinya terletak dalam direktori /cake, tapi jika anda ingin merubahnya sesuai kebutuhan aplikasi anda, salinlah ke app/app_model.php. Jika anda cermati isi filenya, AppModel ini sendiri juga merupakan turunan dari class Model yang merupakan library Cake standar yang ada di cake/libs/model.php. Jika anda ingin mengetahui lebih banyak tentang function dalam Model, silahkan kunjungi http://api.cakephp.org untuk info lebih lengkap. Yang akan dibahas disini adalah function yang paling sering digunakan.

Pengambilan Data

Berikut adalah beberapa cara mendapatkan data menggunakan model:

  • findAll
  • string $conditions
  • array $fields
  • string $order
  • int $limit
  • int $page
  • int $recursive

Mengembalikan field tertentu sampai dengan batasa $limut sesuai dengan $conditions (jika ada syarat/kondisi tertentu), dimulai dari halaman $page (defaultnya 1). $conditions berbentuk seperti statement SQL, semisal: $conditions=”description=’tutorial’ AND life_cycle>4”.

Ketika opsi $recursive diset lebih besar dari 1, operasi findAll() akan mengembalikan model yang diasosiasikan dengan model yang ditemukan oleh findAll().

  • find
  • string $conditions
  • array $fields
  • string $order
  • int $recursive

Mengembalikan field tertentu (atau seluruhnya jika tidak ditentukan) dari record pertama yang sesuai dengan $conditions.

Ketika opsi $recursive diset ke suatu nilai integer antara 1 dan 3, find() akan mengembalikan model yang diasosiasikan dengan model yang ditemukan oleh find().

  • findAllBy
  • string $value

Method ini bisa dipakai sebagai jalan pintas untuk mencari suatu nilai tertentu dari suatu field dalam tabel. Tinggal lekatkan field yang ingin anda cari, kemudian buatlah menjadi CamelCase (CamelCase adalah Case yang menjadikan setiap huruf awal dari setiap kata dalam suatu frase menjadi huruf capital, contoh: LastName, JobPosition, ProductOwner). Contoh (ketika digunakan dalam suatu Controller) seperti:

$this->Post->findByTitle(‘My First Blog Post’);
$this->Author->findByLastName(‘Rogers’);
$this->Property->findAllByState(‘AZ’);
$this->Specimen->findAllByKingdom(‘Animalia’);

Hasil yang didapatkan dalam bentuk Array seperti find() atau findAll().

  • findNeighbours
  • string $conditions
  • array $field
  • string $value

Method seperti ini mirip seperti jika kita menggunakan aplikasi kamus/dictionary. Biasanya jika kita mencari kata tertentu, maka akan diberikan pula kata yang mendekati bentuk kata tersebut. Hasil yang didapatkan berupa array, yang ditentukan oleh $field dan $value, dan dibatasi oleh $conditions. Namun hanya dapat digunakan pada tipe data ‘numeric’ dan ‘date’. Contoh:

class ImagesController extends AppController
{
function view($id)
{
// Ini cara untuk mengambil data sebuah Image

$this->set(‘image’, $this->Image->find(“id = $id”);

// Tapi kita juga ingin melihat yang sebelum dan sesudahnya…

$this->set(‘neighbours’, $this->Image->findNeighbours(null, ‘id’, $id);

}
}

Kode di atas memberi kita suatu array $image[‘Image’], sekaligus dengan $ neighbours[‘prev’][‘Image’][‘id’] dan $neighbours[‘next’][‘Image’][‘id’] pada sisi view.

  • field
  • string $name
  • string $conditions
  • string $order

Mengembalikan sebuah string dari field tunggal dari record pertama sesuai $conditions dan urut berdasar $order.

  • findCount
  • string $conditions

Mengembalikan jumlah record sesuai $conditions.

  • generateList
  • string $conditions
  • string $order
  • int $limit
  • string $keyPath
  • string $valuePath

Method ini merupakan cara cepat untuk mendapatkan sederet daftar pasangan nilai kunci –sangat cocok dipakai untuk membuat tag select HTML dari daftar Model aplikasi anda. Gunakan $conditions, $order, dan $limit sama seperti pada findAll(). $keyPath dan $valuePath merupakan tempat dimana Model dapat menemukan letak key dan value untuk daftar tadi.. Sebagai contoh, jika anda ingin meng-generate suatu daftar/list berdasar aturan pada model Role, dengan key berupa ids integer, maka bisa berbentuk seperti ini:

$this->set(
‘Roles’,
$this->Role->generateList(null, ‘role_name ASC’, null, ‘{n}.Role.id’, ‘{n}.Role.role_name’)
);

//Kode di atas akan menghasilkan:
array(
‘1’ => ‘Account Manager’,
‘2’ => ‘Account Viewer’,
‘3’ => ‘System Manager’,
‘4’ => ‘Site Visitor’
);

  • read
  • string $fields
  • string $id

Gunakan read() ini untuk memperoleh field dan nilainya dari record yang telah diload atau record yang ditentukan oleh $id.

Sebagai catatan, read() hanya akan mengambil data dari model asosiasi level pertama tanpa mempedulikan hasil $recursive dalam model. Untuk memperoleh level tambahan, gunakan find() atau findAll().

  • query
  • string $query
  • execute
  • string $query

Perintah SQL biasa dapat dipanggil dengan method query dan execute. Perbedaan antara keduanya adalah query() digunakan untuk membuat custom SQL query (hasilnya dikembalikan). Sedangkan execute() digunakan untuk membuat custom SQL command (tidak membutuhkan nilai dikembalikan). Berikut contoh perintah SQL dengan query():

query(“SELECT first_name FROM posters_table
WHERE poster_id = 1”);
$firstName = $ret[0][‘first_name’];
return $firstName;
}
}
?>

Kondisi Pencarian Kompleks (menggunakan array)

Kebanyakan pemanggilan pencarian dalam model dilakukan dengan melibatkan kondisi tertentu. Pendekatan yang paling sederhana adalah dengan menggunakan klausa WHERE dalam potongan kode SQL. Tetapi jika anda butuh sesuatu yang lebih, anda dapat menggunakan array yang membuat query menjadi lebih mudah untuk dibuat dan dibaca. Syntax ini dapat memisahkan setiap elemen dalam query (field, value, operator, dll) ke bagian yang bisa dimanipulasi. Salah satu contoh sederhana query berbasis array:

$conditions = array(“Post.title” => “This is a post”);

//Contoh penggunaan dalam suatu model:
$this->Post->find($conditions);

Kode di atas menjelaskan bahwa query akan mencari dalam Model Post yang mempunyai Title=”This is a post”. Untuk diperhatikan, bahwa lebih baik jika anda melakukan query dalam Cake selalu merujuk kepada Model, bukan tabel. Ini untuk menghindari terjadinya collision dalam aplikasi anda. Ok, lalu bagaimana jika kita ingin menggunakan operator? Hal tersebut sama mudahnya. Katakan jika kita ingin menemukan seluruh Post dimana title nya bukan “This is a post”:

array(“Post.title” => ” This is a post”)

Cake dapat menangani semua operator pembanding SQL, termasuk ekspresi seperti LIKE, BETWEEN, atau REGEX. Yang jadi catatan adalah jangan lupa memberi spasi antara operator dan ekspresi atau value. Satu-satunya pengualian disini adalah ekspresi IN (…). Baik, sekarang kita ingin mencari Post dengan beberapa value:

array(“Post.title” => array(“First post”, “Second post”, “Third post”))

Jika kita ingin membatasi lagi pencarian lagi caranya hanya dengan menambahkan pasangan key/value ke array:

array( “Post.title” => array(“First post”, “Second post”, “Third post”), “Post.created” => “> ” . date(‘Y-m-d’, strtotime(“-2 weeks”)))

Secara default, Cake menggunakan operator Boolean AND untuk operasi join seperti di atas. Jika kita ingin memakai operator Boolean lain, maka bisa dengan cara seperti ini:

array(“or” => array ( “Post.title” => array(“First post”, “Second post”, “Third post”), “Post.created” => “> ” . date(‘Y-m-d’, strtotime(“-2 weeks”)) ))

Cake menerima semua operand Boolean, seperti AND, OR, NOT, XOR, dll., dan bisa ditulis huruf kapital maupun tidak.Kondisi ini juga dapat dibuat bersarang. Berikut adalah contoh untuk query dengan tabel Posts dan Authors punya hubungan hasMany/belongTo, yang akan menghasilkan LEFT JOIN pada sisi Post. Kondisinya adalah anda ingin mencari kata ‘magic’ atau yang dibuat dua minggu yang lalu, tapi dibatasi pada Post yang ditulis oleh ‘Bob’:

array (“Author.name” => “Bob”, “or” => array ( “Post.title” => “LIKE %magic%”, “Post.created” => “> ” . date(‘Y-m-d’, strtotime(“-2 weeks”) ))

Menyimpan Data

Untuk menyimpan data ke dalam model, tentu anda harus mengisinya dengan data yang ingin anda simpan. Data yang disimpan dengan method save() menghasilkan bentuk seperti berikut:

Array( [NamaModel] => Array ( [namafield1] => ‘value’ [namafield2] => ‘value’ ))

Cara paling mudah untuk mendapatkan data seperti ini adalah dengan menggunakan helper HTML (akan dibahas setelah pembahasan MVC), karena akan membuat elemen-elemen form yang namanya sesuai dengan aturan di Cake. Anda tidak harus menggunakannya: pada pokoknya hanya pastikan nama elemen formnya berbentuk seperti data[NamaModel][namafield]. Namun bagaimanapun juga $html->input(‘Model/fieldname’) adalah cara termudah.

Data yang dikirim dari form secara otomatis akan terformat seperti di atas dan diletakkan dalam $this->data didalam Controller. Berikut contoh fungsi edit pada Controller Property:

function edit($id)
{

//Catatan: Model Property secara otomatis diletakkan oleh Cake ke $this->Property.

// Mengecek apakah form diisi data…
if (empty($this->data))
{
$this->Property->id = $id;
$this->data = $this->Property->read();//membaca field pada form
}
else
{
// Perhatikan cara menyimpan data berikut. Cake juga secara otomatis dapat melakukan validasi checking
if ($this->Property->save($this->data[‘Property’]))
{
//Pesan Flash yang ditampilkan dan redirect.
$this->flash(‘Your information has been saved.’,
‘/properties/view/’.$this->data[‘Property’][‘id’], 2);
}
//jika ada field yang invalid atau gagal menyimpan, Cake juga akan merender halaman error.
}
}

Perhatikan bagaimana operasi menyimpan ini terletak pada suatu kondisional validasi sesuai aturan yang telah dibuat. Lebih lanjut tentang Validasi Data akan dibahas nanti. Sekarang jika anda tidak ingin save() memvalidasi data anda gunakan save($data, false).

Beberapa fungsi lain yang berguna:

  • del
    • string $id
    • boolean $cascade

Menghapus model sesuai $id.

Jika Model mempunyai ke Model-Model lain, dan ‘dependent key’ telah terdeklarasikan dalam array asosiasi, maka method del() ini akan menghapus Model-Model lain tersebut jika $cascade diset ‘true’.

del() akan mengembalikan nilai true jika sukses.

· saveField

o string $name

o string $value

Digunakan untuk menyimpan nilai field tunggal.

· getLastInsertId

Mengembalikan nilai ID dari record yang terakhir dibuat.

Callback Model

Dalam Model Cake, dikenal juga Callback yang memperbolehkan anda untuk melakukan sesuatu sebelum atau setelah suatu operasi. Berikut method Callback dalam Cake:.

· beforeFind

o string $conditions

Set ke ‘return true’ ketika anda ingin method find dieksekusi, dan ‘false’ jika ingin menghentikan perintah find.

· afterFind

o array $results

Gunakan method callback yang satu ini jika ingin memodifikasi hasil operasi find() atau jika ingin melakukan operasi lain terhadap hasil find(). Parameter untuk method ini tentu saja hasil operasi find, dan keluarannya berupa hasil yang sudah diubah.

  • beforeValidate

Gunakan callback ini untuk memodifikasi data Model sebelum divalidasi. Bisa juga digunakan untuk aturan validasi yang lebih kompleks, menggunakan Model::invalidate().Dalam konteks ini, data Model dapat diakses melalui $this->data. Method ini juga harus diset ke true, dan sebaliknya false jika ingin menghentikan save()..

  • beforeSave

Callback ini juga diset ke true jika operasi save() ingin berlanjut, dan false jika ingin digagalkan. Contoh penggunaan beforeSave dalam penanganan format waktu di suatu database:

// Berikut adalah field Date/time yang dibuat helper HTML:

// Kode ini akan dilihat di View

$html->dayOptionTag('Event/start');

$html->monthOptionTag('Event/start');

$html->yearOptionTag('Event/start');

$html->hourOptionTag('Event/start');

$html->minuteOptionTag('Event/start');

/*=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-*/

// Kode berikut akan ada di Model Event, callback beforeSave digunakan untuk merubah format waktu sebelum disimpan ke database:

function beforeSave()

{

 $this->data['Event']['start'] = $this->_getDate('Event', 'start');

 return true;

}

function _getDate($model, $field)

{

 return date('Y-m-d H:i:s', mktime(

     intval($this->data[$model][$field . '_hour']),

     intval($this->data[$model][$field . '_min']),

     null,

     intval($this->data[$model][$field . '_month']),

     intval($this->data[$model][$field . '_day']),

     intval($this->data[$model][$field . '_year'])));

}
  • afterSave
  • beforeDelete

Set ke ‘return true’ ketika anda ingin penghapusan dieksekusi, dan ‘false’ jika ingin menghentikan perintah penghapusan.

  • afterDelete

Section 3

Variabel Model

Ketika anda bekerja dengan Model, ada sejumlah variabel yang bisa anda manfaatkan untuk mendapat fungsi khusus dari Cake.

$primaryKey

Jika suatu Model merupakan suatu tabel dalam database, dan primary key tabel tersebut tidak bernama ‘id’, anda bisa guakan variabel ini untuk memberitahukan Cake nama primary key-nya.

$recursive

Variabel ini mengatur kedalaman tingkat pengambilan Model yang terasosiasi ketika menggunakan operasi find() dan findAll().

Contoh : seandainya anda mempunyai Groups yang mempunyai banyak Users yang masing-masing mempunyai Articles.

Opsi dalam Model::recursive

$recursive = 0

Cake mengambil data Group

$recursive = 1

Cake mengambil sebuah Group dan User yang terasosiasi

$recursive = 2

Cake mengambil sebuah Group, User yang terasosiasi, dan Articles yang dimiliki User tersebut

$transactional

Memberitahukan Cake apakah Model dapat melakukan transaksi atau tidak (seperti begin/commit/rollback). Menggunakan nilai Boolean. Hanya dapat untuk database tertentu.

$useTable

Jika tabel dalam database anda tidak berbentuk plural/mendapat akhiran ‘s’, dan anda tidak ingin menggantinya, set lah variabel ini ke nama tabel yang ingin anda gunakan.

$validate

Merupakan array yang digunakan untuk memvalidasi data ke model (akan ada pembahasan lebih lanjut di Chapter lain).

$useDbConfig

Masih ingat setting database pada Chapter sebelumnya di /app/config/database.php? Gunakan variabel ini untuk berpindah antara nama koneksi database yang ada di file tersebut. Nilai defaultnya adalah ‘default’.

Kategori:CakePHP
  1. Tajibu
    12 November 2008 pukul 10:51

    Lanjutannya kapan?

  2. 17 Januari 2009 pukul 13:48

    Makasih ya, tulisan yang bagus

  1. No trackbacks yet.

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: