Tutorials

Pengantar

Tutorial ini ditujukan untuk memperkenalkan pada user tentang GTFW dan prinsip-prinsip dasar arsitektur GTFW. Selain itu juga akan diberikan step-by-step bagaimana mengembangkan sebuah aplikasi berbasis GTFW.

Halaman Manajemen GTFW

Dalam tutorial ini, user akan memahami tentang halaman manajemen GTFW, yaitu halaman landing page ketika user pertama kali mengakses aplikasi berbasis GTFW. Langkah pertama, pastikan anda sudah mengunduh dan menginstal package GTFW pada lingkungan pengembangan aplikasi anda.

Selanjutnya, ketikkan localhost/direktori_gtfw/application pada address bar browser anda. Jika konfigurasi GTFW anda benar, browser akan menampilkan sebuah halaman login. Namun, apabila terjadi error, dan halaman yang diakses muncul ‘Not Found‘, maka terdapat kesalahan penulisan alamat basedir pada file application.conf.php.

$application['basedir'] = '/path/to/application/'; // with trailling slash (sesuaikan dengan folder aplikasi)

Atau apabila terjadi kegagalan dalam load halaman login dan muncul notifikasi ‘Fatal: Cannot find GTFW base!‘, maka user perlu mengecek kembali struktur penulisan alamat direktori base yang digunakan.

D:/path/to/gtfw-base

atau

\path\to\gtfw-base\

Apabila aturan penulisan alamat direktori diatas sudah benar, maka refresh kembali browser anda. Pada halaman login, ketikkan user dan password default ‘admin | admin‘ untuk masuk ke halaman manajemen GTFW.

Di dalam menu manajemen GTFW, terdapat tiga sub menu yaitu menu manajemen user, menu manajemen group dan menu manajemen modul. Menu manajemen user berisi tentang data-data informasi pengguna yang terdaftar dalam aplikasi berbasis GTFW. Sedangkan, manajemen group merupakan menu yang berisikan informasi group meliputi deskripsi, unit kerja dan hak akses group. Berikutnya, manajemen module merupakan menu yang didalamnya terdapat informasi tentang module, jumlah submodule dan status module. Di dalam manajemen module, terdapat aksi register untuk module yang belum terdaftar dan update register untuk module yang sudah terdaftar.

Memahami Fungsionalitas dari Method-method yang Ada di Class Response

Pertama, buatlah sebuah modul baru latihan_satu lengkap dengan direktori business, response dan template didalamnya. Kemudian buatlah kelas baru dalam direktori response dengan nama ViewLatihanSatu.html.class.php dan isikan kode berikut:

<?php
/**
* @copyright Copyright (c) 2014, PT Gamatechno Indonesia
* @license http://gtfw.gamatechno.com/#license
*/

class ViewLatihanSatu extends HtmlResponse{

        function TemplateModule()
        {
        $this->SetTemplateBasedir(Configuration::Instance()->GetValue('application', 'docroot').'module/latihan_satu/template');
        $this->SetTemplateFile('view_latihan_satu.html');
        }

        function ProcessRequest()
        {
        $return['NAMA'] = 'Gamatechno';
        $return['EMAIL'] = 'test@gamatechno.com';

        return $return;
        }

        function ParseTemplate($data=null)
        {
        $this->mrTemplate->addVar('info', 'NAMA', $data['NAMA']);
        $this->mrTemplate->addVar('info', 'EMAIL', $data['EMAIL']);
        }
}
?>

Kelas ViewLatihanSatu merupakan perluasan dari kelas HtmlResponse. Kelas tersebut disimpan di direktori base/main/lib/gtfw/html. Selain HtmlResponse, kelas yang lain seperti JsonResponse, PdfResponse, XlsxResponse dan lainnya juga bisa digunakan sesuai kebutuhan devel aplikasi.

Untuk kelas response dasar, biasanya terdiri dari beberapa fungsi yaitu:

  • TemplateModule(), merupakan fungsi untuk mendefinisikan letak dan nama template modul yang akan digunakan untuk kelas response tersebut.
  • ProcessRequest(), merupakan fungsi untuk memproses dan mengolah data.
  • ParseTemplate(), merupakan fungsi untuk menampilkan data.

Selanjutnya, buatlah file template pada direktori application/module/latihan_satu/template dengan nama view_latihan_satu.html. Dan isikan kode berikut:

<!-- patTemplate:tmpl name="content" -->

<h1> Latihan Satu </h1><br/>
<!-- patTemplate:tmpl name="info" -->
NAMA : <b>{NAMA}</b><br/>
EMAIL : <b>{EMAIL}</b>
<!-- /patTemplate:tmpl -->
<!-- /patTemplate:tmpl -->

Langkah terakhir, lakukan register modul seperti yang pernah dijelaskan sebelumnya dan lihatlah hasilnya.

Mengambil Data dari Database dan Mengolahnya di Response

Pertama, buatlah modul baru dengan nama latihan_dua, lengkap dengan direktori business, response dan template didalamnya. Buatlah file dengan nama latihandua.sql.php, simpan dalam direktori application/module/latihan_dua/business/mysqlt/. Isikan dengan kode berikut:

$sql['GetListAgama'] = "
SELECT
agmId AS  ID_AGAMA,
agmNama AS NAMA_AGAMA
FROM pub_ref_agama
ORDER BY NAMA_AGAMA ASC
";

Kemudian buatlah kelas baru dari query tersebut dengan nama LatihanDua.class.php dan simpanlah di direktori yang sama. Isikan dengan kode berikut:

<?php
/**
* @copyright Copyright (c) 2014, PT Gamatechno Indonesia
* @license http://gtfw.gamatechno.com/#license
*/

class LatihanDua extends Database{
        protected $mSqlFile;
        function __construct($connectionNumber=0) {
        $this->mSqlFile = 'module/latihan_dua/business/mysqlt/nama_sql_file.sql.php';
        parent::__construct($connectionNumber);
        }

        function GetListAgama() {
        $result = $this->Open($this->mSqlQueries[’GetListAgama’], array());
        return $result;
        }
}
?>

Selanjutnya, untuk menjalankan modul tersebut buatlah kelas response dengan nama ViewLatihanDua.html.class.php simpan di direktori application/module/latihan_dua/response/ . Isikan dengan kode berikut:

<?php
/**
* @copyright Copyright (c) 2014, PT Gamatechno Indonesia
* @license http://gtfw.gamatechno.com/#license
*/

require_once Configuration::Instance()->GetValue('application','docroot'). 'module/latihan_dua/business/'.Configuration::Instance()->GetValue('application','db_conn',0,'db_type').'/LatihanDua.class.php';
class ViewLatihanDua extends HtmlResponse{

        function TemplateModule()
        {
        $this->SetTemplateBasedir(Configuration::Instance()->GetValue('application', 'docroot').'module/latihan_dua/template');
        $this->SetTemplateFile('view_latihan_dua.html');
        }

        function ProcessRequest()
        {
        $Obj = new LatihanDua();
        $return['dataAgama'] = $Obj->GetListAgama();
        return $return;
        }

        function ParseTemplate($data=null)
        {
        if(!empty($data['dataAgama'])) {
        foreach(data['dataAgama'] as $key=>$value) {

        $this->mrTemplate->addVars('data_agama', $value, 'AGAMA_');
        $this->mrTemplate->parseTemplate('data_agama', 'a');
        }
}
?>

Kemudian, jangan lupa juga buat file template dengan nama view_latihan_dua.html dan simpan di direktori application/module/latihan_dua/template/. Isikan dengan kode berikut:

<!-- patTemplate:tmpl name="content" -->
<h1>Latihan Dua</h1><br>
<h2>Daftar Agama</h2>

<table class="table-common" width="100">
<tr><th>No</th><th>Nama</th></tr>
<!-- patTemplate:tmpl name="data_agama" -->
<tr>
<td>{AGAMA_NO}</td>
<td>{AGAMA_NAMA}</td>
</tr>
<!-- /patTemplate:tmpl -->

<!-- /patTemplate:tmpl -->
</table>
<!-- /patTemplate:tmpl -->

Langkah terakhir, registerkan modul seperti pembahasan sebelumnya, dan lihatlah hasilnya.

Fitur Kondisi dari patTemplate

Penggunaan fungsi kondisional sering dijumpai ketika devel aplikasi dengan pemrograman PHP, namun di patTemplate user bisa membuat kondisional sendiri sehingga tampilan dapat di atur sesuai kebutuhan. Caranya adalah sebagai berikut:

Copy-paste modul latihan_dua dan rename dengan nama latihan_tiga. Modifikasilah file ViewLatihanTiga.html.class.php dengan mengikuti kode berikut:

<?php
/**
* @copyright Copyright (c) 2014, PT Gamatechno Indonesia
* @license http://gtfw.gamatechno.com/#license
*/

function ParseTemplate($data = NULL) {
        if(empty($data['dataAgama'])) {
        $this->mrTemplate->AddVar('data_agama','DATA_EMPTY','YES');
        }
        else {
        $this->mrTemplate->AddVar('data_agama','DATA_EMPTY','NO');
        foreach ($data as $key => $value) {
        $no = $key+1;
        $value['no'] = $no;
        $this->mrTemplate->AddVars(data_agama_item,$value,'AGAMA_');
        $this->mrTemplate->parseTemplate('data_agama','a');
        }
        }
}
?>

Pada fungsi ParseTemplate diberikan kode kondisional untuk proses pengecekan di patTemplate. Seperti terlihat pada kode program di atas, jika data dari variabel $data['dataAgama'] nilainya kosong maka akan di jalankan sub patTemplate yang bernilai ‘Yes‘, begitu juga sebaliknya. Dalam proses pe-marsingan data, addVar digunakan untuk parsing single variabel. Sedangkan addVars digunakan untuk parsing data dalam bentuk jamak atau banyak variabel dan biasanya berbentuk array.

Sedangkan berikutnya, modifikasi juga pada file view_latihan_tiga dengan mengikuti kode berikut:

<!-- patTemplate:tmpl name="content" -->
<h1>Latihan Tiga</h1><br>
<h2>Daftar Agama</h2>

<table class="table-common" width="100">
<tr><th>No</th><th>Nama</th></tr>
<!-- patTemplate:tmpl name="data_agama" type="condition" conditionvar="DATA_EMPTY" -->
<!-- patTemplate:sub condition="YES" -->
<tr><td colspan="4" align="center"> Data tidak ditemukan </td></tr>
<!-- /patTemplate:sub -->
<!-- patTemplate:sub condition="NO" -->
<!-- patTemplate:tmpl name="data_agama_item" -->
<tr>
<td>{AGAMA_NO}</td>
<td>{AGAMA_NAMA}</td>
</tr>
<!-- /patTemplate:tmpl -->
<!-- /patTemplate:sub -->
<!-- /patTemplate:tmpl -->
</table>
<!-- /patTemplate:tmpl -->

Untuk mengeceknya, langkah terakhir adalah meregisterkan modul latihan_tiga ke database, dan lihatlah hasilnya.

Penggunaan Do dan Proc Pada Proses Tambah Data

Buatlah modul baru untuk tambah data dengan nama file latihan_empat, atau jika tidak ingin ribet bisa memodifikasi modul sebelumnya yang sudah ada yaitu dengan menambahkan script berikut untuk menampilkan tombol tambah di sebelah kanan pada file list_agama.html:

<p align="right">
        <a class="xhr dest_subcontent-element" href="{URL_ADD}" title="Tambah Menu" tabindex="2"><button class="btn btn-success"><span class="glyphicon glyphicon-plus"> Tambah</span></button></a>
</p>

Sisipkan juga script berikut pada file response ViewListAgama.html.class.php, tepat dibawah function ParseTemplate():

$this->mrTemplate->Addvar('content', 'URL_ADD', Dispatcher::Instance()->GetUrl('latihan_empat', 'AddAgama', 'View', 'html'));

Langkah selanjutnya, buatlah file response untuk inputan tersebut dengan nama ViewAddAgama.html.class.php. Berikut script yang digunakan:

<?php
class ViewAddAgama extends HtmlResponse{

        function TemplateModule(){
        $this->SetTemplateBasedir(Configuration::Instance()->GetValue('application', 'docroot').'module/latihan_empat/template');
        $this->SetTemplateFile('view_add_agama.html');
        }

        function ProcessRequest(){

        }

        function ParseTemplate($data = NULL) {
        $this->mrTemplate->Addvar('content', 'URL_ACTION', Dispatcher::Instance()->GetUrl('latihan_empat', 'AddAgama', 'Do', 'json'));
        $this->mrTemplate->addVar('content', 'URL_CANCEL', Dispatcher::Instance()->GetUrl(Dispatcher::Instance()->mModule, 'ListAgama', 'view', 'html'));
        }
}
?>

Selanjutnya, buatlah sebuah file html dengan nama view_add_agama.html dan isikan dengan script berikut:

<!-- patTemplate:tmpl name="content" -->
<div class="row">
        <div class="col-lg-12">
                <div class="panel panel-default">
                        <div class="panel-heading">
                        Insert Agama
                        </div>
                        <div class="panel-body">
                        <div class="row">
                                <form method="POST" action="{URL_ACTION}" class="xhr_form std_form" id="frmInput" name="frmInput">
                                        <div class="form-group">
                                                <label>Masukan nama Agama</label>
                                                <td><input type="text" name="nama_agama" class="form-control" value="{NAMA_AGAMA}" size="30" /></td>
                                                <td><input type="hidden" name="id_agama" class="form-control" value="{ID_AGAMA}" size="30" /></td>
                                        </div>
                                        <button class="btn btn-default" type="submit" name="btnsimpan">Simpan</button>
                                        <button class="btn btn-default" type="reset" name="btnreset">Reset</button>
                                        <a href="{URL_CANCEL}" class="xhr dest_subcontent-element btn btn-default">Batal</a>
                                </form>
                        </div>
                        </div>
                </div>
        </div>
</div>
<!-- /patTemplate:tmpl -->

Sebelum lanjut ke pembahasan berikutnya, registerkan submodul terlebih dahulu. Pastikan halaman input agama dapat ditampilkan ketika tombol tambah diklik.

Ada 2 file lagi yang harus dibuat yaitu DoAddAgama.json.class.php dan ProcessAgama.proc.class.php. File dengan awalan ‘Do‘ tersebut merupakan submodul yang akan diregisterkan ke database. Sedangkan file dengan awalan ‘Process‘ diatas berisi perintah-perintah untuk memproses data seperti simpan, update dan hapus.

Buatlah file DoAddAgama.json.class.php dan tuliskan script berikut:

<?php
require_once GTFWConfiguration::GetValue('application', 'docroot').'module/latihan_empat/response/ProcessAgama.proc.class.php';

class DoAddAgama extends JsonResponse {

        function TemplateModule() {
        }

        function ProcessRequest() {
        $Obj = new ProcessAgama();
        $urlRedirect = $Obj->Add();
        return array('exec' => 'GtfwAjax.replaceContentWithUrl("subcontent-element","'.$urlRedirect.'&ascomponent=1")');
        }

        function ParseTemplate($data = NULL) {
        }
}
?>

Setelah itu, buatlah file ProcessAgama.proc.class.php dan tuliskan script berikut:

<?php
require_once GTFWConfiguration::GetValue('application', 'docroot'). 'module/latihan_empat/business/mysqlt/Agama.class.php';

class ProcessAgama {
var $_POST;
var $Obj;
var $pageInput;
var $pageView;

        function __construct(){
        $this->Obj = new Agama();
        $this->_POST = $_POST->AsArray();
        $this->pageView = Dispatcher::Instance()->GetUrl('latihan_empat', 'ListAgama', 'View', 'html');
        }

        function Add(){
        if(isset($this->_POST['btnsimpan'])){
        $add = $this->Obj->DoAddAgama($this->_POST['nama_agama']);
        return $this->pageView;
        }
        return $this->pageView;
        }
}
?>

Kemudian tambahkan sebuah fungsi di business/mysqlt/Agama.class.php. Berikut script yang ditambahkan:

function DoAddAgama($namaAgama) {
        $result = $this->Execute($this->mSqlQueries['do_add_agama'], array($namaAgama));
        return $result;
}

Jangan lupa juga tambahkan script berikut di business/mysqlt/agama.sql.php:

$sql['do_add_agama']="
INSERT INTO pub_ref_agama (AgamaNama)
VALUES ('%s');
";

Penggunaan Fitur Notifikasi

Modifikasilah latihan sebelumnya! Ubah isi file ProcessAgama.proc.class.php menjadi seperti berikut:

<?php

require_once GTFWConfiguration::GetValue('application', 'docroot'). 'module/latihan_enam/business/mysqlt/Agama.class.php';

class ProcessAgama {
var $_POST;
var $Obj;
var $pageInput;
var $pageView;
var $cssDone = "notebox-done";
var $cssFail = "notebox-warning";

        function __construct(){
                $this->Obj = new Agama();
                $this->_POST = $_POST->AsArray();
                $this->pageView = Dispatcher::Instance()->GetUrl('latihan_enam', 'ListAgama', 'View', 'html');
        }

        function Add(){
                if(isset($this->_POST['btnsimpan'])){
                $add = $this->Obj->DoAddAgama($this->_POST['nama_agama']);
                if($add == true) {
                        Messenger::Instance()->Send('latihan_enam', 'ListAgama', 'view', 'html', array($this->_POST,'Penambahan data berhasil dilakukan', $this->cssDone), Messenger::NextRequest);
                } else {
                        Messenger::Instance()->Send('latihan_enam', 'ListAgama', 'view', 'html', array($this->_POST,'Penambahan data gagal dilakukan', $this->cssFail), Messenger::NextRequest);
                }
                return $this->pageView;
                }
        }
}
?>

Lakukan pula pada file ViewListAgama.html.class.html. Ubah isi file menjadi seperti berikut:

<?php
...

function ProcessRequest() {
        $msg = Messenger::Instance()->Receive(__FILE__);
        if($msg) {
                $return['pesan'] = $msg[0][1];
                $return['css'] = $msg[0][2];
        } else {
                $return['pesan'] = null;
                $return['css'] = null;
        }

        $Obj = new Agama();
        $return['dataAgama'] = $Obj->GetListAgama();
        return $return;
}

function ParseTemplate($data = NULL) {
        $this->mrTemplate->Addvar('content', 'URL_ADD', Dispatcher::Instance()->GetUrl('latihan_enam', 'AddAgama', 'View', 'html'));

        if($data['pesan']!="") {
                $this->mrTemplate->SetAttribute('warning_box', 'visibility', 'visible');
                $this->mrTemplate->AddVar('warning_box', 'ISI_PESAN', $data['pesan']);
                $this->mrTemplate->AddVar('warning_box', 'CLASS_PESAN', $data['css']);
        }

...
?>

Dan terakhir, ubahlah isi file template view_list_agama.html menjadi seperti berikut:

<!-- PatTemplate:tmpl name="content" -->
        <br/>
        <h3><strong>Latihan Enam</strong></h3>
        <!-- patTemplate:tmpl name="warning_box" visibility="hidden" -->
                <div class="{CLASS_PESAN}">
                {ISI_PESAN}
                </div>
        <!-- /patTemplate:tmpl -->

...
<!-- /patTemplate:tmpl -->

Membuat komponen sederhana dan memanggilnya di modul lain

Buatlah modul baru dengan struktur direktori seperti berikut:

  • module_filter
  • response
  • template

Buat class response dengan nama ViewModuleFilter.html.class.php. Isikan dengan script berikut:

<?php
class ViewModuleFilter extends HtmlResponse {

        function TemplateModule() {
        $this->SetTemplateBasedir(GTFWConfiguration::GetValue('application', 'docroot').'module/module_filter/template');
        $this->SetTemplateFile('view_module_filter.html');
        }
        /**
        * $msg[0][0] URL form pencarian
        * $msg[0][1] value nama
        */

        function ProcessRequest() {
        $msg = Messenger::Instance()->Receive(__FILE__,$this->mComponentName);
        $return['module_name'] = $msg[0][0];
        $return['value_nama'] = $msg[0][1];

        return $return;
        }

        function ParseTemplate($data = NULL) {
        $this->mrTemplate->AddVar('content', 'URL_SEARCH', $data['module_name']);
        $this->mrTemplate->AddVar('content', 'NAMA', $data['value_nama']);
        }
}
?>

Kemudian, jangan lupa buat juga file templatenya dengan nama view_module_filter.html. Isikan dengan script berikut:

<!-- patTemplate:tmpl name="content" -->

<div class="row">
  <div class="col-lg-12">
        <div class="panel panel-default">
          <div class="panel-heading">
                Pencarian
          </div>
          <div class="panel-body">
                <div class="row">
                  <div class="col-lg-6">
                        <form role="form_search" method="POST" action="{URL_SEARCH}" class="dataquest xhr_simple_form dest_subcontent-element" id="filterbox">
                          <div class="form-group">
                                <label>Nama Agama</label>
                                <input type="text" name="nama" class="form-control" value="{NAMA}" size="30" />
                          </div>
                        <button class="btn btn-default" type="submit" name="action" value="Tampilkan &raquo;">Cari</button>
                        </form>
                  </div>
                </div>
          </div>
        </div>
  </div>
</div>
<!-- /patTemplate:tmpl -->

Selanjutnya, modifikasilah latihan tiga, ubahlah pada function ProcessRequest() menjadi script berikut:

<?php
...

function ProcessRequest() {
        $Obj = new Agama();
        $nama='';
        if(isset($_POST['nama'])) {
                $nama = $_POST['nama'];
        }
        $urlSearch = Dispatcher::Instance()->GetUrl('latihan_tujuh', 'ListAgama', 'view', 'html');
        Messenger::Instance()->SendToComponent('module_filter', 'ModuleFilter', 'view', 'html', 'module_filter', array($urlSearch, $nama), Messenger::CurrentRequest);
        $return['dataAgama'] = $Obj->GetListAgama($nama);
        return $return;
}

...
?>

Ubahlah juga pada template view_list_agama.html. Tambahkan dengan script berikut:

    <!-- PatTemplate:tmpl name="content" -->
    <br/>
    <!-- patTemplate:gtfwrendermodule module="module_filter" submodule="ModuleFilter" action="view" name="module_filter" / -->
    <div class="row">
    <div class="col-lg-12">

...
<!-- /patTemplate:tmpl -->

Dua step terakhir, modifikasi function GetListAgama di folder business/mysqlt/Agama.class.php. Berikut scriptnya:

<?php
...

function GetListAgama($nama) {
        $result = $this->Open($this->mSqlQueries['get_list_agama'], array('%'.$nama.'%'));
        return $result;
}

...
?>

Langkah terkahir, ubahlah file agama.sql.php dengan script berikut:

<?php

$sql['get_list_agama'] = "
SELECT
 agamaNama AS NAMA_AGAMA
FROM pub_ref_agama
WHERE agamaNama like '%s'
ORDER BY NAMA_agama ASC
";

?>

Menggunakan fasilitas komponen yang lebih kompleks

Pada GTFW terdapat fitur untuk meng-include-kan sebuah modul pada modul yang lain. Dalam hal ini modul yang di-attach-kan diperlakukan seperti komponen. Modul yang sering diperlakukan sebagai komponen adalah modul paging. Untuk meng-include-kan modul paging, modifikasilah latihan 3 pada ViewListAgama.html.class.php seperti berikut:

<?php
...

function ProcessRequest() {
        $Obj = new Agama();

        $totalData = $Obj->GetCountAgama();
        $itemViewed = 5;
        $currPage = 1;
        $startRec = 0;

        if(isset($_GET['page'])) {
                $currPage = (string) $_GET['page']->StripHtmlTags()->SqlString()->Raw();
                $startRec = ($currPage - 1) * $itemViewed;
        }

        $return['dataAgama'] = $Obj->GetListAgama($startRec, $itemViewed);

        $url = Dispatcher::Instance()->GetUrl(
        Dispatcher::Instance()->mModule,
        Dispatcher::Instance()->mSubModule,
        Dispatcher::Instance()->mAction,
        Dispatcher::Instance()->mType);

        $destination_id = "subcontent-element";

        Messenger::Instance()->SendToComponent('paging', 'Paging', 'view', 'html', 'paging_top', array($itemViewed, $totalData, $url, $currPage, $destination_id), Messenger::CurrentRequest);
        $return['start_number'] = $startRec+1;

        return $return;
}

...
?>

Juga ubah function GetListAgama yang sudah di buat sebelumnya pada class Agama.class.php di folder business/mysqlt. Berikut script yang digunakan:

<?php
...

function GetListAgama($startRec, $itemViewed) {
        $result = $this->Open($this->mSqlQueries['get_list_agama'], array($startRec, $itemViewed));
        return $result;
}

...
?>

Tambahkan juga script berikut pada class yang sama:

<?php
...

function GetCountAgama() {
        $result = $this->Open($this->mSqlQueries['get_count_agama'], array());
        return $result[0]['total'];
}

...
?>

Modifikasilah script pada agama.sql.php. Berikut script yang digunakan:

<?php

$sql['get_list_agama'] = "
SELECT
        agamaId AS ID_AGAMA,
        agamaNama AS NAMA_AGAMA
FROM pub_ref_agama
ORDER BY NAMA_AGAMA ASC
LIMIT %s, %s
";

$sql['get_count_agama'] = "
SELECT
        COUNT(agamaId) AS total
FROM pub_ref_agama
";

?>

Supaya fitur paging muncul, tambahkan script xml di template html pada file view_list_agama.html. Berikut script yang di tambahkan:

<!-- PatTemplate:tmpl name="content" -->
...

 <div style="width:50%;" class="pageBar">
  <!-- patTemplate:gtfwrendermodule module="paging" submodule="paging" action="view" name="paging_top"  / -->
 </div>

...
<!-- /patTemplate:tmpl -->

Memahami penggunaan fitur ajax pada modul

Modifkasilah latihan lima pada file ViewListAgama.html.class.php, lebih tepatnya pada function ParseTemplate().Berikut scriptnya:

<?php
...

function ParseTemplate($data = NULL) {
        ...

        if(!empty($data['dataAgama'])) {
                $this->mrTemplate->AddVar('data_agama', 'DATA_EMPTY', 'YES');
                foreach($data['dataAgama'] as $key=>$value) {
                        $no = $key + 1;
                        $value['no'] = $no;
                        $value['URL_UPDATE'] = Dispatcher::Instance()->GetUrl('latihan_sembilan', 'UpdateAgama', 'view', 'html').'&idAgama='.Dispatcher::Instance()->Encrypt($value['ID_AGAMA']);
                        $this->mrTemplate->AddVars('data_agama_item', $value);
                        $this->mrTemplate->parseTemplate('data_agama_item', 'a');
                }
        } else {
                $this->mrTemplate->AddVar('data_agama', 'DATA_EMPTY', 'NO');
        }
}

...
?>

Sama halnya juga, lakukan perubahan pada template view_list_agama.html:

<!-- PatTemplate:tmpl name="content" -->
...

<table class="table table-striped table-bordered table-hover">
  <tr>
        <th width="5">No</th>
        <th width="10">Aksi</th>
        <th>Nama</th>
  </tr>
<!-- patTemplate:tmpl name="data_agama" type="condition" conditionvar="DATA_EMPTY" -->
  <!-- patTemplate:sub condition="NO" -->
  <tr><td colspan="4" align="center"> -Data tidak ditemukan- </td></tr>
  <!-- /patTemplate:sub -->
  <!-- patTemplate:sub condition="YES" -->
  <!-- patTemplate:tmpl name="data_agama_item" -->
        <tr>
          <td>{NO}</td>
          <td class="links">
        <div class="btn-toolbar">
          <div class="btn-group btn-group-sm">
            <a class="xhr dest_subcontent-element btn btn-default" href="{URL_UPDATE}" title="Ubah"><span class="glyphicon glyphicon-pencil"></span></a>
          </div>
        </div>
      </td>
          <td>{NAMA_AGAMA}</td>
        </tr>
  <!-- /patTemplate:tmpl -->
  <!-- /patTemplate:sub -->
  <!-- /patTemplate:tmpl -->
</table>

...
<!-- /patTemplate:tmpl -->

Buat class response baru dengan nama ViewUpdateAgama.html.class.php. Berikut script yang digunakan:

<?php
require_once Configuration::Instance()->GetValue('application', 'docroot').'module/latihan_sembilan/business/mysqlt/Agama.class.php';

class ViewUpdateAgama extends HtmlResponse {
        function TemplateModule() {
                $this->SetTemplateBasedir(Configuration::Instance()->GetValue('application', 'docroot').'module/latihan_sembilan/template');
                $this->SetTemplateFile('view_update_agama.html');
        }

        function Processrequest() {
                $ObjAgama = new Agama();
                $idAgama = Dispatcher::Instance()->Encrypt($_GET['idAgama']->Raw());
                if(!empty($idAgama)) {
                        $return['dataAgama'] = $ObjAgama->GetAgamaById($idAgama);
                }

                        $return['ID_AGAMA'] = $idAgama;
                        return $return;
        }

        function ParseTemplate ($data = NULL) {

                if(!empty($data['ID_AGAMA'])) {
                        $this->mrTemplate->AddVar('content', 'URL_ACTION', Dispatcher::Instance()->GetUrl('latihan_sembilan', 'UpdateAgama', 'do', 'json'));
                        $this->mrTemplate->AddVar('content', 'NAMA_AGAMA', $data['dataAgama'][0]['NAMA_AGAMA']);
                        $this->mrTemplate->AddVar('content', 'ID_AGAMA', $data['ID_AGAMA']);
                        $this->mrTemplate->addVar('content', 'URL_CANCEL', Dispatcher::Instance()->GetUrl(Dispatcher::Instance()->mModule, 'ListAgama', 'view', 'html'));
                } else {
                        $this->mrTemplate->AddVar('content', 'URL_ACTION', Dispatcher::Instance()->GetUrl('latihan_sembilan', 'ListAgama', 'do', 'json'));
                }

        }
}
?>

Buat file html view_update_agama.html pada folder template:

<!-- patTemplate:tmpl name="content" -->
</h2>
<br/>
<div class="row">
    <div class="col-lg-12">
        <div class="panel panel-default">
        <div class="panel-heading">
            Update Agama
        </div>
        <div class="panel-body">
            <div class="row">
                <div class="col-lg-6">
                    <form method="POST" action="{URL_ACTION}" class="xhr_form std_form" id="frmInput" name="frmInput">
                        <div class="form-group">
                            <label>Ubah nama Agama</label>
                            <td><input type="text" name="nama_agama" class="form-control" value="{NAMA_AGAMA}" size="30" /></td>
                                                        <td><input type="hidden" name="id_agama" class="form-control" value="{ID_AGAMA}" size="30" /></td>
                        </div>
                        <button class="btn btn-default" type="submit" name="btnsimpan" value="Simpan">Simpan</button>
                                                <button class="btn btn-default" type="reset" name="btnreset" value="Reset">Reset</button>
                                                <a href="{URL_CANCEL}" class="xhr dest_subcontent-element btn btn-default">Batal</a>
                    </form>
                </div>
            </div>
        </div>
        </div>
    </div>
</div>
<!-- /patTemplate:tmpl -->

Tambahkan fungsi GetAgamaById pada class Agama.class.php Berikut isi scriptnya:

<?php
...

function GetAgamaById($idAgama) {
        $result = $this->Open($this->mSqlQueries['get_agama_by_id'], array($idAgama));
        return $result;
}

...
?>

Modifikasi pada file agama.sql.php untuk pengambilan data. Berikut query nya:

<?php
...

$sql['get_agama_by_id']= "
SELECT
agamaId AS ID_AGAMA,
agamaNama AS NAMA_AGAMA
FROM pub_ref_agama
WHERE agamaId = '%s'
";

...
?>

Buat sebuah class response dengan nama DoUpdateAgama.json.class.php Berikut isi scriptnya:

<?php
require_once GTFWConfiguration::GetValue('application', 'docroot').'module/latihan_sembilan/response/ProcessAgama.proc.class.php';

class DoUpdateAgama extends JsonResponse {
        function TemplateModule() {
        }

        function ProcessRequest() {
        $Obj = new ProcessAgama();
        $urlRedirect = $Obj->Update();
        return array('exec'=> 'GtfwAjax.replaceContentWithUrl("subcontent-element","'.$urlRedirect.'&ascomponent=1")');
        }

        function ParseTemplate($data = NULL) {
        }
}
?>

Tambahkan fungsi Update pada class ProcessAgama.proc.class.php berikut isi scriptnya:

<?php
...

function Update(){
        if(isset($this->_POST['btnsimpan'])){
        $idAgama = $this->_POST['id_agama'];
        $update = $this->Obj->DoUpdateAgama($this->_POST['nama_agama'], $idAgama);
        if($update == true) {
        Messenger::Instance()->Send('latihan_sembilan', 'ListAgama', 'view', 'html', array($this->_POST,'Update Data Berhasil Dilakukan', $this->cssDone), Messenger::NextRequest);
        } else {
        Messenger::Instance()->Send('latihan_sembilan', 'ListAgama', 'view', 'html', array($this->_POST,'Update Data Gagal Dilakukan', $this->cssFail), Messenger::NextRequest);
        }
return $this->pageView;
}

...
?>

Tambahkan juga fungsi DoUpdateAgama pada class Agama.class.php. Berikut isi script yang digunakan:

<?php
...

function DoUpdateAgama($nama_agama, $idAgama) {
        $result = $this->Execute($this->mSqlQueries['do_update_agama'], array($nama_agama, $idAgama));
        return $result;
}

...
?>

Modifikasi query yang ada di file agama.sql.php dengan script berikut:

<?php
...

$sql['do_update_agama']="
UPDATE pub_ref_agama
SET
agamaNama = '%s'
WHERE agamaId = '%s';
";

...
?>

Memahami cara penggunaan fungsi delete dan module confirm

Sebelumnya pada aplikasi ini sudah terdapat module konfirmasi hapus. Dan tujuan dari pada latihan ini adalah bagaimana memanfaatkan module tersebut. Untuk modul confirm tersebut dapat dilihat di direktori module/confirm/.

Modifkasilah latihan sembilan pada file ViewListAgama.html.class.php Tambahkan script delete berikut pada fungsi ParseTemplate():

<?php
...

function ParseTemplate($data=NULL){
        ...

if (!empty($data)) {
    $this->mrTemplate->addVar('data', 'IS_EMPTY', 'NO');
    $no = $filter['start'] + 1;
    foreach ($data as $val) {
        $val['no'] = $no;
        $val['row_class'] = $no%2 == 0?'even':'odd';
                        $val['URL_UPDATE'] = Dispatcher::Instance()->GetUrl('latihan_sepuluh', 'UpdateAgama', 'view', 'html').'&idAgama='.Dispatcher::Instance()->Encrypt($val['ID_AGAMA']);
                        //delete
                        $label = "Agama";
                        $idEnc = Dispatcher::Instance()->Encrypt($val['ID_AGAMA']);
                        $dataName = Dispatcher::Instance()->Encrypt($val['NAMA_AGAMA']);
                        $urlAccept = 'latihan_sepuluh|DeleteAgama|do|json';
                        $urlReturn = 'latihan_sepuluh|ListAgama|view|html';
                        $val['URL_DELETE']=Dispatcher::Instance()->GetUrl('confirm', 'confirmDelete', 'do', 'html').'&urlDelete='.$urlAccept.'&urlReturn='.$urlReturn.'&id='.$idEnc.'&label='.$label.'&dataName='.$dataName;
                        $this->mrTemplate->AddVar('content', 'URL_DELETE', Dispatcher::Instance()->GetUrl('confirm', 'confirmDelete', 'do', 'html'));
        $this->mrTemplate->addVars('item', $val);
        $this->mrTemplate->parseTemplate('item', 'a');
        $no++;
    }
} else {
    $this->mrTemplate->addVar('data', 'IS_EMPTY', 'YES');
}
}

...
?>

Tambahkan juga script berikut pada file template view_list_agama.html:

<a class="xhr dest_subcontent-element btn btn-default" href="{URL_DELETE}" title="Detail"><span class="glyphicon glyphicon-trash"></span></a>

Buat file baru dengan nama DoDeleteAgama.json.class.php pada class response:

<?php

require_once Configuration::Instance()->GetValue( 'application', 'docroot') . 'module/latihan_sepuluh/response/ProcessAgama.proc.class.php';

class DoDeleteAgama extends JsonResponse {

        function TemplateModule() {
        }

        function ProcessRequest() {

        $Obj = new ProcessAgama();

        $urlRedirect = $Obj->Delete();

        return array( 'exec' => 'GtfwAjax.replaceContentWithUrl("subcontent-element","'.$urlRedirect.'&ascomponent=1")');
        }

        function ParseTemplate($data = NULL) {
        }
}
?>

Tambahkan fungsi Delete pada class ProcessAgama.proc.class.php seperti berikut:

<?php
...

function Delete() {
        $agamaId = $this->_POST['idDelete'];
        if(isset($agamaId)) {
                $delete = $this->Obj->DoDeleteAgama($agamaId);

                if($delete == true) {
                Messenger::Instance()->Send('latihan_sepuluh', 'ListAgama', 'view', 'html', array($this->_POST,'Delete Data Berhasil Dilakukan', $this->cssDone), Messenger::NextRequest);
                } else {
                Messenger::Instance()->Send('latihan_sepuluh', 'ListAgama', 'view', 'html', array($this->_POST,'Delete Data Gagal Dilakukan', $this->cssFail), Messenger::NextRequest);
                }
        }
        return $this->pageView;
}

...
?>

Tambahkan juga fungsi DoDeleteAgama pada class Agama.class.php seperti berikut:

<?php
...

function DoDeleteAgama($idAgama) {
        $result = $this->Execute($this->mSqlQueries['do_delete_agama'], array($idAgama));
        return $result;
}

...
?>

Tambahkan juga query pada file agama.sql.php seperti berikut:

<?php
...

$sql['do_delete_agama']="
DELETE from pub_ref_agama
WHERE agamaId='%s';
";

...
?>

Setelah semua selesai jangan lupa registerkan module delete dengan aksi delete.