term
term
term
term
15 Feb 2012

Custom Database, Part 1: Data, Schema, Snippet, dan Chunk

Oleh: Novriko P. Parhusip

Tabel database

Siapkan table dan class yang diperlukan oleh xPDO

Buatlah tabel yang diperlukan, seperti yang ada disini:

Silahkan klik ini untuk mengunduh dumping SQL-nya.

Reverse Engineering schema

  1. Buat file php (saya menamakannya re-engineering.php) dengan script yang diambil dari sini: Reverse Engineer xPDO Classes from Existing Database Table.
  2. Edit bagian:
    1. $package_name = 'karyawan';
    2. aktifkan bagian: include('core/config/config.inc.php');
    3. $table_prefix = 'modx_belajar_';
  3. Simpan file ini di-webroot, berdampingan dengan index.php
  4. Jalankan, dengan command prompt atau browser.
  5. Anda akan melihat folder dan file-file class baru seperti ini:
    Direktori class dan schema

Snippet

Buatlah snippet baru, disini saya menamakannya DaftarKaryawan, yang saya tempatkan dalam folder (category) karyawan - demi kerapihan semata.

Anda dapat menuliskan skrip PHP langsung pada area Snippet code (php), namun saya pribadi lebih senang meletakkannya di file based saja, agar mudah diedit. Pada prinsipnya, MODX menyarankan agar hasil akhir dari kode tersebut ditulis kembali selengkapnya pada area ini, agar MODX dapat menyimpan cache file-nya berdasarkan skrip tersebut, bukan menyimpan cache file sekedar perintah include.

Kode yang kita pakai sekarang adalah:

<?php
$o = include MODX_CORE_PATH . 'components/karyawan/elements/snippets/karyawan.daftar.snippet.php';
return $o;

snippet baru

Snippet ini didalam struktur file, saya letakkan di dalam direktori core/components/karyawan/elements/snippets/ , sebagai konvensi saja. Anda bisa meletakkannya dimana saja, yang penting Anda tetap dapat mengingatnya dengan mudah.

direktori snippet baru

Pada file ini, masukanlah kode ini:

$basePath = !empty($basePath) ? $basePath : $modx->getOption('core_path') . 'components/karyawan/';
$modx->addPackage('karyawan', $basePath . 'model/', 'modx_belajar_');

$karyawan = $modx->getCollection('MasterKaryawan');

return 'Total karyawan: ' . count($karyawan) . ' orang';

 

Harap diperhatikan, bahwa pada addPackage, saya menambahkan "prefix" modx_belajar_ karena kita membuat skema dalam keterbatasan prefix tersebut.

Sekarang, buatlah satu halaman baru dari Manager, dan tempatkan snippet baru ini [[!DaftarKaryawan]] .

Untuk pertama kali menjalankannya, Anda akan mendapatkan hasil:

Total karyawan: 0 orang

Selamat! Anda sudah dapat mengambil data dari custom database dan menampilkannya ke snippet, untuk pertama kalinya.

Lanjut?
Lanjuuuuuttt...

Sekarang kita coba masukan data manual, dengan menambahkan beberapa kode berikut ini, dan jalankan hanya 1 (satu) kali saja, kecuali jika Anda menginginkan duplikasi data.

$basePath = !empty($basePath) ? $basePath : $modx->getOption('core_path') . 'components/karyawan/';
$modx->addPackage('karyawan', $basePath . 'model/', 'modx_belajar_');

/* TAMBAHAN MANUAL */
$karyawanBaru = $modx->newObject('MasterKaryawan');
$karyawanBaru->fromArray(array(
'nama' => 'Budi',
'jenkel' => 'p',
'alamat' => 'Jakarta Selatan'
));
$karyawanBaru->save();

$karyawanBaru = $modx->newObject('MasterKaryawan');
$karyawanBaru->fromArray(array(
'nama' => 'Susi',
'jenkel' => 'w',
'alamat' => 'Bandung'
));
$karyawanBaru->save();
/* AKHIR DARI TAMBAHAN MANUAL */

$karyawan = $modx->getCollection('MasterKaryawan');

return 'Total karyawan: ' . count($karyawan) . ' orang';

Refresh kembali halaman tempat snippet DaftarKaryawan itu berada, dan Anda akan mendapatkan hasil:

Total karyawan: 2 orang

Dan memang, jika Anda mengeceknya melalui SQL browser, Anda akan melihat data-data baru tersebut didalamnya.

Untuk melanjutkan tutorial ini, harap kode yang memasukkan data manual tadi dihapus, atau diberikan tanda comment.

Chunk

Sekarang, coba diedit kembali file snippet ini, agar menjadi seperti ini:

$basePath = !empty($basePath) ? $basePath : $modx->getOption('core_path') . 'components/karyawan/';
$modx->addPackage('karyawan', $basePath . 'model/', 'modx_belajar_');

$karyawan = $modx->getCollection('MasterKaryawan');
$totalKaryawan = 'Total karyawan: ' . count($karyawan) . ' orang';

$karArray = array();
foreach ($karyawan as $v) {
$karArray[] = $v->toArray();
}

$output = '<pre>' .print_r($karArray, true).'</pre>';

return $output;

Anda akan mendapatkan hasil:

Array
(
[0] => Array
(
[id] => 1
[nama] => Budi
[jenkel] => p
[alamat] => Jakarta Selatan
[no_telp] =>
[no_induk] =>
)

[1] => Array
(
[id] => 2
[nama] => Susi
[jenkel] => w
[alamat] => Bandung
[no_telp] =>
[no_induk] =>
)
)

Chunk adalah terminologi MODX untuk memisahkan model dan view agar perubahan template dapat dilakukan terpisah, antara PHP dan HTML.

Placeholder adalah terminologi untuk key dari setiap array diatas, yang akan disisipkan kedalam Chunk. Oleh karena itu, dalam snippet ini, kita telah mempunyai placeholder-placeholder: [[+id]] , [[+nama]] , [[+jenkel]] , [[+alamat]] , [[+no_telp]] , [[+no_induk]]

Kadangkala, menampilkan array seperti ini sebagai hasil justru menjadi sangat membantu untuk mengenali placeholder yang dipergunakan oleh snippet yang bersangkutan. Oleh karena itu, pada snippet getResources, dan banyak snippet lainnya (termasuk yang saya buat), ada pilihan parameter &toArray , agar return dari snippet ini adalah array.

$basePath = !empty($basePath) ? $basePath : $modx->getOption('core_path') . 'components/karyawan/';
$modx->addPackage('karyawan', $basePath . 'model/', 'modx_belajar_');

$karyawan = $modx->getCollection('MasterKaryawan');
$totalKaryawan = 'Total karyawan: ' . count($karyawan) . ' orang';

$karArray = array();
foreach ($karyawan as $v) {
    $karArray[] = $v->toArray();
}
unset($v);

$output = ''; // inisiasi variabel
if (!empty($toArray)) {
// return sebagai array
$output = '<pre>' . print_r($karArray, true) . '</pre>';
}
return $output;

Tentu Anda sudah mengerti, bahwa pada snippet, tanda & didepan parameter tidak lain adalah pengganti tanda $ pada variabel php snippet. Jadi untuk menggunakannya, adalah mengubah panggilan snippet menjadi seperti ini: [[!DaftarKaryawan? &toArray=`1`]].

Sekarang mari kita buat beberapa chunk untuk mengembalikan hasilnya dalam sebuah format HTML.

wrapper-table

Category: karyawan
Description: Pembungkus (wrapper) untuk tabel
Code:

<table>
<tr>
<th>ID</th>
<th>Nama</th>
<th>Jenis Kelamin</th>
<th>Alamat</th>
<th>No. Telpon</th>
<th>No. Induk</th>
</tr>
[[+rows]]
</table>

karyawan-row

Category: karyawan
Description: Baris-baris tabel khusus untuk karyawan
Code:

<tr>
<td>[[+id]]</td>
<td>[[+nama]]</td>
<td>[[+jenkel]]</td>
<td>[[+alamat]]</td>
<td>[[+no_telp]]</td>
<td>[[+no_induk]]</td>
</tr>

Setelah itu, ubah snippet kita menjadi demikian:

$basePath = !empty($basePath) ? $basePath : $modx->getOption('core_path') . 'components/karyawan/';
$modx->addPackage('karyawan', $basePath . 'model/', 'modx_belajar_');

$karyawan = $modx->getCollection('MasterKaryawan');
$totalKaryawan = 'Total karyawan: ' . count($karyawan) . ' orang';

$karArray = array();
foreach ($karyawan as $v) {
    $karArray[] = $v->toArray();
}
unset($v);

$output = ''; // inisiasi variabel
if (!empty($toArray)) {
// return sebagai array
$output = '<pre>' . print_r($karArray, true) . '</pre>';
} else {
// return sebagai parsed template
$rowTpl = $modx->getOption('rowTpl', $scriptProperties, 'karyawan-row');
$wrapperTpl = $modx->getOption('wrapperTpl', $scriptProperties, 'wrapper-table');

$placeholderTable = array(); // inisiasi variabel array

foreach ($karArray as $v) {
$placeholderTable['rows'][] = $modx->getChunk($rowTpl, $v);
}

$placeholderTable['rows'] = @implode("\n", $placeholderTable['rows']);
$output = $modx->getChunk($wrapperTpl, $placeholderTable);
}

return $output;

Anda akan mendapatkan hasil seperti ini:

tabel hasil

$rowTpl dan $wrapperTpl mengambil opsi parameter dari property $scriptProperties, yang diambil dari turunan System Settings global, atau Snippet's Properties (atau dalam group Property Sets), atau Snippet's call parameters, dalam urutan tersebut.

$modx->getOption('rowTpl', $scriptProperties, 'karyawan-row') artinya mengambil opsi rowTpl dari turunan tersebut, namun jika sama sekali tidak ada maka defaultnya ditetapkan manual sebagai karyawan-row.

Dalam contoh ini, kita melakukan 2 kali penggunaan getChunk:

  1. untuk setiap row
  2. untuk bungkusan akhirnya (wrapper)

getChunk menerima parameter ([nama-chunk], [kombinasi array kunci-nilai]) untuk diolah oleh MODX. Oleh karena itu, setiap menyuapi getChunk, parameter kedua harus disiapkan sebagai array, seperti yang dilakukan oleh $placeholderTable.

Bersambung

Silahkan coba lakukan hal yang sama untuk departemen. Pada bagian berikutnya, saya akan menjelaskan bagaimana menggunakan FormIt sebagai form untuk melakukan entry data dan mengedit.

Semoga bemanfaat.

Referensi

  1. Reverse Engineer xPDO Classes from Existing Database Table
  2. Defining the Database and Tables
  3. Using Custom Database Tables in your 3rd Party Components
  4. xPDO.addPackage

 

blog comments powered by Disqus