Quantcast
Channel: Masino Sinaga
Viewing all 176 articles
Browse latest View live

Nomor Urut Record di Export Data pada PHPMaker 2020 dan PHPMaker 2021

$
0
0

Sampai dengan versi 2021, PHPMaker belum memiliki kemampuan untuk menampilkan nomor urut record di halaman List yang merupakan hasil dari Export Data. Meskipun opsi Sequence sudah tersedia di bawah pengaturan level Table yang berfungsi untuk menampilkan nomor urut record pada halaman List, tapi nomor urut record ini belum bisa ditampilkan di hasil Export Data tadi.

Bukan PHPMaker namanya jika hal ini tidak bisa diatasi dengan sangat mudah dan cepat. Untuk kesekian kalinya PHPMaker berhasil membuktikan bahwa betapa fleksibelnya kita sebagai Web Developer untuk menambahkan fitur nomor urut record (sequence) pada Export Data dari Aplikasi Web yang dihasilkannya. Melalui apa? Jawabannya melalui penggunaan Extensions.

Masino Extensions untuk PHPMaker 2021 sudah mengatasi hal ini. Sebagai bonus, Masino Extensions untuk PHPMaker 2020 juga sudah menangani hal yang sama. Sekarang Anda dapat menyertakan nomor urut pada data hasil Export di Aplikasi Web yang dihasilkan oleh PHPMaker 2021 maupun PHPMaker 2020 jika menggunakan Masino Extensions tadi.

Untuk melihat demo pada PHPMaker 2021, Anda dapat mengunjungi halaman List Order Details, dan pastikan sudah login dengan menggunakan username admin dan password master. Setelah itu, pilih menu Export Data di pojok kiri atas halaman List tersebut, maka Anda akan melihat nomor urut tersebut akan disertakan pada file hasil Export Data tadi.

Demikian juga untuk PHPMaker 2020, Anda dapat mengunjungi halaman List Order Details, dan pastikan sudah login dengan menggunakan username admin dan password master. Setelah itu, pilih menu Export Data di pojok kiri atas halaman List tersebut, maka Anda akan melihat nomor urut tersebut akan disertakan pada file hasil Export Data tadi.

Tantangan untuk menampilkan nomor urut record ini adalah bagaimana cara untuk menyertakan nomor urut record yang sesuai dengan halaman yang sedang diekspor. Jika tidak ditangani secara khusus, maka nomor urut akan selalu diawali dengan nomor 1, dan ini yang digunakan oleh logic asli PHPMaker. Melalui penggunaan Masino Extensions, maka logic tersebut bisa kita sesuaikan menjadi lebih dinamis lagi.

Satu lagi bukti bahwa betapa fleksibelnya PHPMaker dapat memenuhi keinginan Web Developer untuk menambahkan fitur sesuai dengan kebutuhan. Dengan menggunakan Extensions, maka fitur yang belum disediakan oleh PHPMaker dapat kita tambahkan sendiri dengan sangat mudah dan cepat.

Bahkan bagi Anda sendiri yang belum bisa membuat Extensions, tinggal mengaktifkan saja dari dalam project PHPMaker Anda, generate ulang semua file script, jadi daah… Keren, ‘kan? 😛


Betapa Mudahnya Mengubah Link atau URL Export to PDF dari PHPMaker 2021

$
0
0

Barusan mencari arsip artikel mengenai cara mengubah link Export to PDF, dapatlah artikel Mudahnya Mengubah URL Export Data di Aplikasi Web dari PHPMaker karena ingin diterapkan di PHPMaker 2021. Pastikan Anda sudah membaca artikel tadi sebelum melanjutkan membaca ke paragraf di bawah ini.

Karena ada sedikit perbedaan kode untuk mengubah link Export to PDF antara PHPMaker versi 2021 dan versi major yang digunakan pada tahun 2014 lalu tersebut (saat saya menulis artikel di atas tadi), maka kode pada artikel tersebut membutuhkan penyesuaian menjadi seperti ini untuk PHPMaker 2021 (berlaku juga untuk PHPMaker 2020):

$this->ExportPdfUrl = "url-export-anda-di-sini.php"; // <-- pastikan Anda menyesuaikan kode ini sesuai kebutuhan!
$item = &$this->ExportOptions->Add("pdf");
$item->Body = "<a href=\"" . $this->ExportPdfUrl . "\" class=\"ew-export-link ew-pdf\" title=\"" . HtmlEncode(Language()->phrase("ExportToPDFText")) . "\" data-caption=\"" . HtmlEncode(Language()->phrase("ExportToPDFText")) . "\">" . Language()->phrase("ExportToPDF") . "</a>";
$item->Visible = TRUE;

Sekedar menyegarkan kembali, kode di atas berfungsi untuk mengubah link atau URL Export to PDF pada halaman List dan/atau View. Cukup masukkan ke dalam server event Page_Render milik salah satu atau kedua halaman tadi sesuai kebutuhan.

Hanya dengan 4 baris kode PHP itu saja, kita sudah dapat menyesuaikan link atau URL Export to PDF sesuai dengan kebutuhan. Luar biasa betapa fleksibel dan efektifnya membangun Aplikasi Web menggunakan PHPMaker.

Tidak perlu lagi menulis kode yang sangat panjang sampai beratus-ratus atau beribu-ribu baris untuk menggunakan fitur Export to PDF bawaan PHPMaker melalui link atau URL yang bersifat kostum, sehingga dapat kita link-kan ke Custom File yang juga dapat kita buat dari dalam project PHPMaker 2021.

Perbedaan Penanganan Current Filter di Tables dan Reports pada PHPMaker 2021

$
0
0

Sejak disatukannya PHP Report Maker ke dalam PHPMaker mulai versi 2020, bukan berarti method yang digunakan pada object Tables sama dengan yang digunakan pada object Reports. Salah satu perbedaan yang bisa kita lihat adalah cara menampilkan string Filter yang sedang diterapkan pada kedua objects tadi.

Pada object Tables, kita dapat menampilkan kriteria filter yang sedang diterapkan melalui kode berikut pada server event Page_DataRendering yang terdapat di bawah halaman List:

if (!empty($this->getSessionWhere())) {
    $header = "Current Filter: " . $this->getSessionWhere();
}

Sedangkan untuk object Reports, maka kode di atas masih pada server event Page_DataRendering menjadi seperti ini:

if (!empty($this->SearchWhere)) {
    $header = "Current Filter: " . $this->SearchWhere;
}

Sudah tahu perbedaannya dimana kan? Kalau untuk object Tables kita menggunakan method getSessionWhere, sedangkan untuk object Reports, kita menggunakan property SearchWhere.

Meskipun terdapat perbedaan kode seperti contoh di atas, kita dapat menarik kesimpulan bahwa PHPMaker masih tetap menyediakan kemudahan kepada Web Developer untuk mengetahui string Filter yang sedang diterapkan pada suatu object Tables maupun Reports.

Tidak perlu menulis kode berpuluh-puluh atau beratus-ratus panjangnya hanya untuk mengetahui string dari current filter tersebut.

O iya, jangan lupa untuk mencobanya, cukup masukkan kriteria pencarian pada object Tables maupun Reports dari aplikasi web yang sudah dihasilkan oleh PHPMaker.

Mudahnya Menangani Field Upload yang Tidak Ada Filenya di PHPMaker 2021

$
0
0

Bagi yang belum tahu apa itu Field Upload, ini adalah field yang berfungsi untuk meng-upload file. Kalau di dalam project PHPMaker, maka kita cukup memilih File dari bagian Fields setup -> panel Edit Tag.

Jika field ini kita set Allow NULL di database, berarti field ini boleh kosong nilainya. Ketika field ini kosong, dan jika ditampilkan pada halaman List dan View di Aplikasi Web, maka hasilnya adalah cell atau area yang kosong sama sekali.

Dengan kata lain, kita tidak dapat mengubah property ViewValue dari object Field tersebut untuk menampilkan nilai tertentu, hanya jika nilai field ini kosong di database.

Di sisi yang lain, kadang-kadang kita ingin menampilkan informasi kepada Pengguna Akhir, bahwa jika belum ada file yang di-upload, maka ada pesan yang kira-kira berbunyi seperti ini: belum ada file yang di-upload.

Pertanyaannya adalah, bagaimana cara menampilkan pesan tersebut pada field tadi, sementara yang kita ketahui, PHPMaker tidak mengijinkan kita untuk mengubah property ViewValue dari object Field yang tipe-nya File tadi jika nilainya kosong di database?

Bukan PHPMaker namanya, jika kita tidak dapat mengatasinya. Selalu saja ada solusi di balik suatu masalah.

Sekarang kita bisa menangani kondisi jika belum ada file yang di-upload, maka kita dapat menampilkan pesan pada field tersebut. Bagaimana caranya?

Ternyata mudah sekali. Katakanlah nama field-nya adalah Berkas, maka cukup lakukan dua langkah utama berikut.

Pertama, kita harus mengeset field Berkas tadi menjadi NOT NULL, lalu memberikan nilai default-nya di database, misalnya: nofile yang artinya tidak ada file. Pastikan setelah itu untuk melakukan sinkronisasi antara database dan project, dari menu Tools -> Synchronize.

Kedua, cukup tambahkan kode ini ke dalam server event Row_Rendered milik table yang bertalian:

if ($this->Berkas->CurrentValue == 'nofile'){
    $this->Berkas->CellAttrs["class"] = "bg-danger text-white";
    $this->Berkas->ViewAttrs["class"] = "btn disabled";
    $this->Berkas->ViewValue = "<span style='color: white; text-decoration: none; '>No file uploaded</span>";
}

Arti dari kode di atas adalah, jika nilai field ini adalah nofile yang artinya belum ada file yang di-upload, maka gunakan class bg-danger text-white untuk atribut cell field tersebut, dan gunakan class btn disabled untuk atribut view field tersebut, dan setelah itu, tampilkan tulisan berwarna putih No file uploaded.

Perhatikan. Hanya dengan sedikit kode itu saja, kita sudah bisa menangani field upload yang belum ada file-nya. Kita bisa menampilkan pesan bahwa tidak ada file yang di-upload.

Setelah itu, seperti biasa, generate ulang semua file script menggunakan PHPMaker, lalu buka aplikasi web dengan menggunakan browser, maka Anda akan melihat tulisan No file uploaded pada record yang belum ada file-nya.

Betapa mudah dan cepatnya, bukan? Bukan! Hohoho… 😀

Menyesuaikan Item Secara Dinamis pada Control Combobox di PHPMaker 2021

$
0
0

Tidak percuma memang PHPMaker 2021 menggunakan tagline The Best Gets Even Better, seperti yang ditampilkan pada website resminya: https://phpmaker.dev. Terbuti masih yang terbaik di kelasnya, PHPMaker juga terbukti semakin lebih baik dari versi-versi major sebelumnya.

Salah satu yang semakin baik itu bisa kita rasakan sendiri dari salah satu server event yang bernama Lookup_Selecting. Seperti namanya, server event ini akan dijalankan sebelum membangun SQL untuk memilih record-record dari lookup table.

Artinya, kita sebagai Web Developer masih diberi kesempatan melalui server event Lookup_Selecting ini untuk mengganti filter, supaya item-item yang ditampilkan bisa disesuaikan juga secara dinamis seperti yang kita butuhkan.

Di server event Lookup_Selecting ini, nama field, object Lookup, dan filter untuk lookup dapat ditampilkan dengan kode ini:

var_dump($fld->Name, $fld->Lookup, $filter);

$fld->Lookup adalah sebuah object Lookup. Untuk mengganti SQL lookup, maka kita dapat memodifikasi properties berikut milik object Lookup tadi:

UserSelect, yang merupakan pernyataan SELECT (hanya klausa SELECT dan FROM)
UserFilter, yang merupakan klausa WHERE
UserOrderBy, yang merupakan klausa ORDER BY

Dari menu Help atau Bantuan yang disediakan di aplikasi PHPMaker, kita dapat melihat 5 contoh kode berikut untuk menyesuaikan item-item yang terdapat di dalam field Lookup tersebut.

Di contoh pertama, kita dapat menambahkan filter tambahan ke filter table lookup.

function Lookup_Selecting($fld, &$filter) {
    // var_dump($fld->Name, $fld->Lookup, $filter); // untuk menampilkan nama field, object Lookup, dan filter 
    if ($fld->Name == "MyLookupField")
        $fld->Lookup->UserFilter = "MyField = 'xxx'"; // asumsi: tipe field adalah string
}

Di contoh yang kedua berikut, kita dapat mengganti operator standar dari field yang memiliki filter

function Lookup_Selecting($fld, &$filter) {
    if ($fld->Name == "MyLookupField") {
        $fld->Lookup->UseLookupCache = false; // pastikan dalam hal ini lookup cache dalam posisi non-aktif
        $fld->Lookup->setFilterOperator("FilterField", ">"); // operator baru menjadi tanda ">" (lebih besar)
    }
}

Selanjutnya, pada contoh yang ketiga di bawah ini, kita dapat memodifikasi pernyataan SQL pada bagian SELECT dan ORDER BY:

function Lookup_Selecting($fld, &$filter) {
    if ($fld->Name == "MyLookupField") {
        $fld->Lookup->UserSelect = "SELECT Field1 AS lf, Field2 AS df, Field3 AS df2, '' AS df3, '' AS df4 FROM Table1"; // modifikasi pada bagian SELECT
        $fld->Lookup->UserOrderBy = "Field2 ASC"; // modifikasi pada bagian ORDER BY
    }
}

Kemudian, pada contoh keempat berikut ini, kita dapat mengganti semua item yang terdapat di dalam control Combobox menjadi menggunakan array yang bersifat statis dengan menggunakan method setOptions milik object Lookup:

function Lookup_Selecting($fld, &$filter) {
    if ($fld->Name == "MyLookupField")
        $fld->Lookup->setOptions([
            ["link1", "display1 row1", "display2 row1", "...", ""],
            ["link2", "display1 row2", "display2 row2", "...", ""],
            ["link3", "display1 row3", "display2 row3", "...", ""],
            ["link4", "display1 row4", "display2 row4", "...", ""]
         ]); // gunakan array statis
}

Terakhir, untuk contoh yang kelima berikut, kita dapat menyesuaikan item-item di field Lookup tadi menggunakan data yang dihasilkan oleh fungsi global yang bernama ExecuteRows:

function Lookup_Selecting($fld, &$filter) {
    if ($fld->Name == "MyLookupField")
        $fld->Lookup->setOptions(ExecuteRows("SELECT LinkField, DisplayField1, DisplayField2, DisplayField3, DisplayField4 FROM MyTable")); // gunakan data yang dihasilkan oleh ExecuteRows
}

Penting untuk diketahui, bahwa supaya kode pada contoh kelima ini bisa kita implementasikan, syaratnya adalah dua opsi berikut harus diset dari Fields setup -> panel Edit Tag:

Use lookup table dalam posisi aktif atau enabled. Artinya, kita harus mengeset Lookup Table untuk field tersebut. Dengan kata lain, kita tidak dapat menyesuaikan item-item pada field Lookup tadi jika kita menggunakan User Values dari bagian Fields tadi.

Use modal dialog for lookup dalam posisi tidak aktif atau disabled. Artinya, pastikan untuk menonaktifkan opsi ini jika ingin menyesuaikan item-item yang terdapat pada field Lookup tadi secara dinamis.

Dari kelima contoh di atas, maka server event Lookup_Selecting menjadi semakin powerful dan flexible lagi. Terbukti memang, bahwa PHPMaker 2021 adalah yang terbaik, dan semakin lebih baik lagi dari versi-versi major sebelumnya.

Bahkan, code generator lainnya belum ada yang bisa menyamai fleksibilitas dan kemampuan yang sudah disediakan oleh PHPMaker 2021 ini.

Begini Cara Menampilkan Konten Custom Files ke File PDF dari PHPMaker 2021 dan FPDF

$
0
0

Sekitar 5 tahun yang lalu, tepatnya tahun 2016, kita sudah pernah membahas bagaimana mudahnya mengekspor atau menampilkan konten dari Custom Files ke file PDF melalui bantuan FPDF. Buat yang belum tahu, ini artikel yang membahas hal tersebut: Mudahnya Mengekspor Konten Custom File ke File PDF dari PHPMaker dan FPDF.

Sayangnya, kode di artikel tersebut tidak bisa sepenuhnya digunakan di PHPMaker 2021. Penyebabnya karena PHPMaker yang kita gunakan 5 tahun lalu tersebut masih belum menggunakan namespace di PHP. Pada saat itu, versi PHP yang digunakan adalah versi jadul yang belum mendukung pemakaian namespace.

Sama seperti di artikel tadi, maka di tulisan ini, lagi-lagi kita masih tetap mengoptimalkan pemakaian Masino Extensions di project PHPMaker 2021, dimana sudah disertakan library FPDF. Library ini akan di-generate oleh PHPMaker 2021 pada sub-folder plugins/fpdf di sisi Aplikasi Web.

Oke, tanpa berlama-lama lagi… langsung saja ya. Untuk memulai, berikut sebuah contoh yang paling sederhana untuk mengekspor sebuah tulisan atau kalimat ke file PDF. Konten tulisan ini kita buat melalui fitur Custom Files di PHPMaker 2021.

Pertama, kita harus menambahkan sebuah Custom File baru. Klik kanan pada tulisan Custom Files yang terdapat di panel Database, lalu klik menu Add File.

Kedua, di jendela Custom File berikutnya, masukkan nama file (misalnya) fpdf_test.php di bagian File Name. Di bagian Caption, masukkan judulnya (misalnya) Test FPDF. Pastikan kali ini Anda mencentang Include common files, lalu klik tombol OK untuk menyimpan perubahan tersebut.

Ketiga, klik tab Code (Server Events, Client Scripts and Custom Templates), lalu lompat ke lokasi Custom Templates -> Table-Specific -> Custom File -> Content, lalu copy-kan kode PHP berikut ke dalam editor teks di sebelah kanannya:

<?php
    ob_end_clean(); // don't forget this at the beginning
    require('plugins/fpdf/fpdf.php'); // it is generated by Masino Extensions for PHPMaker 2021
    $pdf = new \FPDF(); // we use black slash in order to avoid error, since PHPMaker 2021 uses namespace
 
    // Add first page
    $pdf->AddPage();
 
    // Set initial x and y position per page
    $y_axis_initial = 15;
    $x_axis_initial = 25;
 
    // Set Font Name and Size
    $pdf->SetFont('Arial','',12);
 
    // Set Y and X initial position
    $pdf->SetY($y_axis_initial);
    $pdf->SetX($x_axis_initial);
 
    // Print it out now ...
    $pdf->Cell(170, 4, "Halo, ini untuk mencoba FPDF di Custom Files pada PHPMaker 2021.", 0, 0, 'L', 0); // left-align, width: 170
    ob_end_clean(); // don't forget this before saving the content to pdf file
    $pdf->Output("fpdf_test.pdf", "D"); // save and download the content to "fpdf_test.pdf" file
?>

Jika kita perhatikan kode yang terdapat di artikel ini lalu kita bandingkan dengan kode yang saya share pada tahun 2016 yang lalu itu, maka hanya ada sedikit saja perbedaannya.

Pertama, kita harus menempatkan kode ob_end_clean(); di awal sebelum kode yang menyertakan library FPDF-nya.

Kedua, untuk memanggil atau menciptakan object FPDF dari class FPDF, maka kita harus menambahkan awalan karakter back slash sebelum FPDF(), yaitu: $pdf = new \FPDF();. Hal ini wajib, karena sejak versi 2020, PHPMaker menggunakan namespace.

Ketiga, sebelum menyimpan konten ke dalam file PDF, kita harus menambahkan kembali kode ob_end_clean();. Jika tidak, maka konten dari Custom Files tadi tidak akan pernah berhasil tersimpan dengan sempurna ke file PDF.

Betapa cepat dan mudahnya bukan? Hanya dengan sedikit perubahan kode itu saja, yang pernah kita buat 5 tahun yang lalu, sekarang di tahun 2021, kode tersebut bisa kita gunakan kembali dari Custom Files di PHPMaker 2021.

Modal Dialog Edit Sekarang Bisa Tetap Terbuka Setelah Edit Data di PHPMaker 2021

$
0
0

Salah satu alasan mengapa Anda harus menggunakan PHPMaker 2021 adalah karena selalu ada improvement di samping fitur-fitur baru yang selalu ditambahkan pada versi terakhir. Salah satu improvement itu adalah adanya kemampuan untuk tetap menampilkan Modal Dialog Edit setelah kita mengubah data di form Edit tersebut.

Sebenarnya improvement ini pun sudah ditambahkan pada PHPMaker 2020, namun lebih disempurnakan lagi di versi 2021. Tulisan ini hanya sekedar ingin mengingatkan saja, bahwa kemampuan tadi sudah bisa kita nikmati juga pada PHPMaker 2021.

Di versi sebelum PHPMaker 2020, setelah kita mengubah data menggunakan Modal Dialog, maka sistem akan menampilkan halaman Edit tanpa menggunakan Modal Dialog, meskipun kita sudah mengeset Edit Page dari Table setup -> Return Pages -> After edit. Tentu saja kondisi ini menyebabkan Aplikasi Web yang kita kembangkan menjadi kurang profesional.

Untuk mengatasi keterbatasan ini, sekitar 5 tahun yang lalu, kita sudah pernah mengatasinya melalui bantuan session, lalu memunculkan kembali Modal Dialog tadi. Anda bisa membaca artikel yang khusus membahas trik tadi melalui Supaya Modal Dialog Edit Tetap Terbuka Setelah Proses Edit Record di PHPMaker.

Beruntunglah Anda jika sudah menggunakan PHPMaker 2021, karena hal tersebut sudah ditangani di versi terakhir ini. Sekarang kita tetap dapat menampilkan form Edit dalam Modal Dialog, setelah Pengguna Akhir Aplikasi Web berhasil mengubah data. Tentu saja syaratnya kita sudah memilih Edit Page dari pengaturan level Table -> Return Pages -> After edit.

Jika pengaturan tadi tidak disesuaikan, maka sistem akan menutup form Modal Dialog tadi, dan langsung kembali ke halaman List yang masih terbuka di bawah jendela Modal Dialog tadi.

Dengan menggunakan PHPMaker 2021, maka kita tidak perlu lagi menggunakan kode pada artikel di atas. Semuanya sudah ditangani oleh fitur bawaan PHPMaker 2021.

Nah, sekarang keputusan sepenuhnya berada di tangan Anda, apakah tetap bertahan menggunakan versi yang lama, atau segera beralih untuk menggunakan versi yang terakhir. Buat Anda yang sudah menggunakan PHPMaker 2021, saya ucapkan selamat. Maju terus, pantang mundur!

Mudahnya Menampilkan DateTimePicker di Custom Files pada PHPMaker 2021

$
0
0

Hari ini kita akan membuktikan betapa mudahnya untuk menampilkan control DateTimePicker di Custom Files pada PHPMaker 2021. Sekitar 4 tahun yang lalu hal ini sudah pernah kita bahas melalui artikel Begini Mudahnya Menampilkan DatePicker JSCalendar di Custom Files PHPMaker.

Tentu saja kode yang digunakan sekitar 4 tahun lalu tidak bisa digunakan di PHPMaker 2021. Alasan utamanya adalah karena saat itu PHPMaker menggunakan extension JSCalendar, sedangkan di PHPMaker 2021, menggunakan extension DateTimePicker.

Untuk mencoba di PHPMaker 2021, Anda bisa menggunakan project demo yang sudah disediakan oleh PHPMaker. Pastikan kita sudah mengaktifkan extension DateTimePicker dari menu Tools -> Extensions.

Setelah itu, pastikan Anda sudah membuat sebuah Custom File baru. Jika belum tahu caranya, baca topik Custom Files di menu Help PHPMaker, atau cari artikel saya di situs ini dengan kata kunci topik tadi.

Perlu diketahui, bahwa pengaturan Inclue common files harus diaktifkan untuk Custom File tadi. Artinya, kita ingin menggunakan object Form yang sudah disediakan oleh PHPMaker 2021, daripada membuat object Form sendiri yang justru akan mempersulit situasi.

Selanjutnya, salin kode berikut ke bagian Content dari Custom File yang sudah Anda buat tadi.

<script>
  var currentForm, currentPageID;
  var my_form;
  loadjs.ready("head", function () {
    var $ = jQuery;
    // Form object
    currentPageID = ew.PAGE_ID = "custom";
    my_form = currentForm = new ew.Form("my_form", "custom");
    // load the form
    loadjs.done("my_form"); // <--- don't forget this!
  });
</script>

<form id="my_form" name="my_form" class="form-horizontal">
    <div id="r_my_date" class="form-group row">
        <label for="my_date" class="col-sm-2 control-label ew-label">Please select a Date</label>
        <div class="col-sm-10">
          <span id="el_my_date">
          <input type="text" id="my_date" name="my_date" data-field="my_date" data-format="9" size="20" class="form-control">
          <script type="text/javascript">
             loadjs.ready(["my_form", "datetimepicker"], function() {
               ew.createDateTimePicker("my_form", "my_date", {"ignoreReadonly": true, "useCurrent": false, "format": 1});
             });
          </script>
          </span>
        </div>
    </div>
</form>

Perhatikan kode Javascript yang berada di bagian atas. Kode itu wajib ada, supaya kita dapat menggunakan object Form yang sudah tersedia di PHPMaker 2021, dengan menggunakan kode new ew.Form(). Mengapa? Karena kita mengaktifkan pengaturan Include common files.

Kita juga harus memuat form menggunakan loadjs.done() Jika itu tidak ada, maka DateTimePicker tidak dapat ditampilkan.

Untuk format tanggal yang kita gunakan di contoh tersebut adalah 1, yang artinya adalah tanggal lengkap dengan format Tahun-Bulan-Tanggal Jam:Menit:Detik. Untuk separator tanggal dan jam, tergantung dengan pengaturan yang dapat kita tentukan dari menu Tools -> Locale Settings.

Betapa mudahnya, bukan? Hanya dengan sedikit kode itu saja di Custom File, kita sudah dapat menampilkan control DateTimePicker seperti yang di-generate oleh PHPMaker 2021 pada object Form yang berasal dari table di database. 😉


Menghapus Kata Total, Membuat Cetak Tebal dan Rata Kanan pada Baris Aggregate di PHPMaker 2021

$
0
0

Pasti sebagian besar di antara kita Web Developer yang selama ini sudah menggunakan PHPMaker 2021, ingin menghapus kata TOTAL: (beserta karakter titik duanya), dan membuat cetakan tebal atau bold pada baris Aggregate di Aplikasi Web yang dihasilkannya. Tidak hanya itu, teks pada baris ini juga sering kali harus dibuat menjadi rata kanan, supaya lebih mudah terbaca.

Penyesuaian ini sering sekali dibutuhkan, mengingat Aplikasi Web yang dihasilkan oleh PHPMaker 2021 masih belum bisa memenuhi kebutuhan tadi. Teks seperti TOTAL: atau RATA-RATA: atau JUMLAH:, masih muncul sebelum angkanya, dan cetakan hurufnya pun belum bold atau tebal, serta belum rata kanan.

Yang dimaksud dengan baris Aggregate adalah baris yang menampilkan fungsi Penjumlahan (TOTAL), Rata-Rata (AVERAGE), atau Jumlah Item (COUNT) pada halaman List yang menampilkan data dalam bentuk table. Baris ini letaknya pada bagian paling bawah dari table tadi.

Supaya lebih mudah mengikutinya, langsung saja kita mencoba menerapkannya pada project demo2021.

Pertama sekali, pastikan kita sudah membuka project tersebut dengan menggunakan PHPMaker 2021, lalu pada panel Database, klik table orderdetails. Selanjutnya, klik field Quantity, dan di sebelah kanan, pastikan tab Fields sudah terbuka.

Setelah itu, pilih TOTAL dari kolom List Page -> Aggregate, untuk memastikan field Quantity tadi menggunakan fungsi penjumlahan.

Berikutnya, klik tab Code (Server Events, Client Scripts and Custom Templates, lalu lompat ke lokasi ini: Server Events -> Table-Specific -> Common -> Row_Rendered, lalu masukkan kode ini ke dalam function Row_Rendered() tersebut:

    if ($this->RowType == ROWTYPE_AGGREGATE) {
        $this->Quantity->ViewValue = "<div style='text-align: right; font-weight: bold;'>" . $this->Quantity->ViewValue . "</div>";
    }

Kode di atas fungsinya untuk mengubah teks pada baris Aggregate pada field Quantity menjadi rata kanan dan cetakan tebal atau bold.

Pertanyaan selanjutnya, bagaimana cara menghilangkan teks TOTAL? Jawabannya, kita menggunakan bantuan kode CSS. Caranya, klik icon HTML General Settings di toolbar PHPMaker 2021, lalu klik tab Styles -> User, kemudian masukkan kode berikut:

span.ew-aggregate {
    display: none;
}

Kode ini berfungsi untuk menghilangkan teks TOTAL: (ya, beserta karakter titik duanya sekalian). Sebenarnya, kita bisa saja menggunakan kode jQuery untuk menyembunyikan bagian tersebut. Tapi sayangnya jika menggunakan jQuery, akan ada jedah waktu sepersekian detik untuk menghilangkan tulisan TOTAL: tadi.

Oleh karena itu, disarankan untuk mengoptimalkan fitur CSS yang kode-nya bisa kita tambahkan sendiri dari bagian User Styles tadi.

Terakhir, pastikan jangan lupa untuk men-generate ulang semua file script menggunakan PHPMaker 2021.

Lalu setelah itu, buka aplikasi web dari browser, dan pastikan sudah memuat ulang file .css yang terakhir di-generate oleh PHPMaker 2021 tadi.

Setelah login menggunakan username admin dan password master, lalu buka menu List Order Details, maka sekarang kita sudah tidak lagi melihat tulisan TOTAL: di baris aggregate dari table yang menampilkan data order details. Demikian juga nilai penjumlahannya sekarang ditampilkan dengan tulisan cetak tebal (bold), dan juga sudah rata kanan.

Betapa mudah dan cepatnya menerapkan kebutuhan tadi dari PHPMaker 2021. Hanya dengan sedikit kode PHP dan CSS itu saja, kita sudah bisa menyesuaikan teks pada baris Aggregate dari table yang terdapat di halaman List.

Mencegah Pengguna Memilih Tanggal yang Sudah Lewat di DateTimePicker pada PHPMaker 2021

$
0
0

Satu lagi kemudahan di PHPMaker 2021 yang akan kita kupas di artikel ini, yaitu bagaimana cara mencegah Pengguna memilih tanggal-tanggal yang sudah lewat pada control DateTimePicker.

Seperti yang kita ketahui, PHPMaker 2021 menggunakan Extension DateTimePicker dari Bootstrap Date/Time Picker untuk membantu Pengguna memilih tanggal saat menginput data.

Tulisan ini mirip dengan artikel yang saya tulis sekitar 5 tahun yang lalu, yaitu Mencegah Pengguna Memilih Tanggal yang Sudah Lewat di JSCalendar dari PHPMaker.

Kalau Anda perhatikan di artikel tadi, ada lumayan banyak kode yang harus kita sesuaikan untuk mencegah Pengguna memilih tanggal-tanggal yang sudah lewat pada Extension JSCalendar. Entah apakah karena saat itu Extension yang digunakan memiliki keterbatasan dibandingkan dengan Extension DateTimePicker untuk PHPMaker 2021.

Tapi yang jelas, di Extension DateTimePicker untuk PHPMaker 2021 ini, kita bisa mengimplementasikannya dengan sangat mudah dan cepat. Tidak perlu lagi menulis kode sebanyak yang kita tulis 5 tahun lalu itu. Hanya dengan sedikit kode saja, kita sudah bisa menerapkannya dengan sangat mudah dan cepat.

Katakanlah kita ingin membatasi Pengguna Akhir untuk memilih tanggal-tanggal yang sudah lewat pada field OrderDate di table orderdetails dari project demo2021 yang bisa di-download dan coba di komputer kita masing-masing.

Cukup dengan memasukkan kode di bawah ini dari lokasi berikut pada project PHPMaker 2021: Tools -> Extensions -> DateTimePicker -> Advanced -> Fields -> Tables -> orders -> OrderDate -> Options:

{"minDate":[]}

Karena PHPMaker 2021 menggunakan Moment JS untuk mengimplementasikan fitur yang terkait dengan Tanggal dan pemakaian DateTimePicker, maka kita cukup menambahkan opsi minDate, dengan nilai [], yang artinya itu adalah tanggal hari ini di Moment JS.

Setelah itu, simpan file demo project tadi, generate ulang semua file script seperti biasa dengan menggunakan PHPMaker 2021.

Ketika kita mencoba menambah data di table orders lalu memilih tanggal pada field OrderDate, maka DateTimePicker akan menampilkan tanggal-tanggal yang telah lewat menjadi dalam posisi disabled atau non aktif.

Itu artinya, kode di atas berhasil mencegah Pengguna Akhir untuk memilih tanggal-tanggal yang telah lewat. Tanggal minimal yang boleh dipilih adalah tanggal hari ini. Tentu saja karena tanggal hari ini yang minimal, kita bisa juga memilih tanggal-tanggal yang akan datang.

Sampai di sini misi awal kita sudah selesai, yaitu hanya sebatas mencegah Pengguna memilih tanggal-tanggal yang telah lewat dari control DateTimePicker.

Tapi misi keseluruhan masih belum selesai. Maksudnya?

Jadi begini. Kalau Anda perhatikan setelah kita memilih tanggal hari ini, maka setelah DateTimePicker kita tutup, kita masih bisa mengganti tanggal tersebut menjadi tanggal yang telah lewat secara langsung dengan mengetik pada field OrderDate. Jika data tersebut disimpan, itu artinya data tanggal yang telah lewat masih lolos masuk ke database.

Pertanyaan selanjutnya, bagaimana cara mencegah supaya data tanggal yang telah lewat yang diubah secara langsung di field OrderDate tadi (tanpa melalui bantuan DateTimePicker) bisa dicegah masuk ke database?

Jawabannya sangatlah mudah dan juga sangat cepat. Cukup dengan memasukkan sedikit kode berikut ke dalam server event Row_Inserting:

if (strtotime($rsnew["OrderDate"]) < strtotime(CurrentDateTime())) {
    $this->setFailureMessage("Order Date cannot be lower than today!");
    return false;
}

Kode ini untuk mencegah Pengguna Akhir menyimpan data tanggal yang sudah lewat. Jika data yang dimasukkan secara langsung ke field OrderDate tanpa bantuan control DateTimePicker, maka masih ada benteng terakhir yang kita gunakan untuk memvalidasi data tanggal tersebut.

Terbukti sudah, di versi terakhir, selalu saja ada peningkatan fitur yang memungkinkan Web Developer dapat bekerja secara lebih efektif dan efisien. Tidak perlu banyak kode yang kita tulis. Kita pun masih tetap bisa mengkombinasikan kode di sisi client dan di sisi server.

Hanya dengan sedikit kode itu saja, maka kita sudah bisa mencegah Pengguna Akhir untuk memilih tanggal-tanggal yang telah lewat dari control DateTimePicker, dan juga memvalidasi tanggal di sisi server melalui bantuan server event Row_Inserting.

Memvalidasi Tanggal Minimal Harus Tanggal Hari Ini dengan Javascript dari PHPMaker 2021

$
0
0

Di artikel yang saya tulis kemarin berjudul Mencegah Pengguna Memilih Tanggal yang Sudah Lewat di DateTimePicker pada PHPMaker 2021, kita belum menangani validasi di sisi client.

Di artikel ini, kita akan membahas bagaimana mudah dan cepatnya untuk menambahkan validasi tanggal yang harus diinput minimal harus tanggal hari ini dengan menggunakan Javascript di sisi client, sama seperti artikel Mudahnya Memvalidasi Format Tanggal Menggunakan Javascript dari PHPMaker yang saya tulis 5 tahun lalu.

Artinya, jika tanggal yang dimasukkan Pengguna Akhir lebih kecil dari tanggal hari ini, maka sistem akan menolak dan menampilkan pesan error yang memberitahukan Pengguna Akhir bahwa tanggal yang dimasukkan tidak boleh lebih kecil dari tanggal hari ini.

O iya, kode di artikel ini merupakan pelengkap dari kode yang sudah kita bahas di artikel ini. Jadi, jika Anda belum mengimplementasikannya, saya sarankan agar Anda membaca artikel yang saya tulis kemarin itu, lalu mempraktekkannya terlebih dulu sebelum mempraktekkan kode di artikel ini.

Jika sudah, pertanyaan selanjutnya adalah, lalu bagaimana caranya kita menambahkan validasi tanggal yang diinput minimal harus sama dengan tanggal hari ini?

Caranya sangat mudah dan cepat. Cukup dengan menambahkan sedikit kode ini saja ke Form_CustomValidate yang terdapat di bawah lokasi Client Scripts -> Table-Specific -> Add/Copy Page milik table orders dari project demo2021 menggunakan PHPMaker 2021, sehingga kode selengkapnya menjadi seperti ini:

function(fobj) { // DO NOT CHANGE THIS LINE!
    // Your custom validation code here, return false if invalid.
    var orderDate = $(this).fields("OrderDate");		
    var todayDate = new Date();
    todayDate.setHours(0,0,0,0);
    if (orderDate.toJsDate() < todayDate) 
        return this.addCustomError("OrderDate", "The Order Date must be equal to or greater than today's date.");
    return true;
}

Jika kita bandingkan kode barusan dengan kode yang terdapat pada artikel yang saya tulis 5 tahun lalu tadi, Anda akan melihat perbedaannya. Di PHPMaker 2021 ini, kita tidak perlu lagi menulis kode untuk memeriksa format tanggal-nya, karena sudah ditangani oleh framework Javascript bawaan PHPMaker 2021.

Artinya, jika format tanggal dan jam yang kita set dari menu Tools -> Locale Settings lalu memilih file .json yang sesuai dengan bahasa yang digunakan dengan Y-m-d H:i:s, maka ketika Pengguna Akhir menginput format tanggal yang berbeda dengan format tadi, maka sistem akan otomatis menyesuaikan dengan format yang sudah kita tentukan tadi. Keren, ‘kan? 😉

Itu artinya lagi, kode yang kita tulis di versi 2021 ini menjadi lebih ringkas lagi. Terbukti lagi, bahwa di versi terakhir selalu ada penyempurnaan fitur dari versi-versi major sebelumnya.

Terakhir, jangan lupa untuk men-generate ulang semua files script dengan menggunakan PHPMaker 2021.

Setelah itu, jalankan Aplikasi Web dari browser, lalu login sebagai user admin dan password master, lalu cobalah tambahkan record baru dari halaman List Orders, Anda akan melihat bahwa tanggal minimal yang bisa dipilih adalah tanggal hari ini.

Setelah memilih tanggal hari ini, tutup DateTimePicker-nya. Kemudian silahkan ganti tanggal Order Date yang sudah di-input tadi dengan mengubahnya langsung pada control TextBox field Order Date, kemudian tekan tombol Add untuk menyimpan data tersebut.

Perhatikan apa yang terjadi! Betul, sistem akan mencegah data tersebut disimpan, dimana validasi tersebut dilakukan di sisi client. Jadi, validasi ini semakin melengkapi lagi validasi yang sebelumnya sudah kita buat di sisi server.

Pengalaman Pengguna Akhir saat menggunakan Aplikasi Web yang kita generate dengan PHPMaker 2021 ini pun menjadi bertambah menyenangkan lagi. Tidak perlu menunggu validasi yang dilakukan di sisi server.

Menghilangkan Index Field di ExecuteRow dan ExecuteRows pada PHPMaker 2021

$
0
0

Sebagian besar global function di PHPMaker 2021 dapat dikenali dari namanya. Contohnya, ExecuteRow yang berfungsi untuk mengeksekusi data di satu baris (row), dan ExecuteRows yang berfungsi untuk mengeksekusi data di beberapa baris (rows).

Di kedua global function tersebut, kita bisa mengakses data baik dari nomor indeks kolom atau field-nya, yang biasanya dimulai dari 0, maupun dari nama kolom atau field-nya.

Kadang-kadang, kita tidak ingin menyertakan nomor indeks kolom-nya, sehingga data yang ditampung ke dalam array menjadi lebih ringkas.

Supaya lebih mudah dipahami, mari kita mencobanya di project demo2021 yang bisa Anda download file-nya untuk dicoba di localhost. Jika sudah di-download, silahkan buka dengan PHPMaker 2021.

Pertama, kita akan membuat sebuah Custom File untuk mencoba kedua global function tadi. Klik kanan di bagian Custom Files pada panel Database, lalu pilih Add File. Di jendela dialog yang terbuka, masukkan array_test.php pada File Name, masukkan Array Test pada Caption, lalu beri tanda centang pada Include common files, lalu klik tombol OK.

Kedua, pastikan array_test.php sudah terpilih pada panel Database di bawah bagian Custom Files, lalu pastikan tab Code (Server Events, Client Scripts and Custom Templates) sudah terbuka. Kemudian lompat ke lokasi ini: Custom Templates -> Table-Specific -> Custom File -> Content, lalu copy-kan kode ini ke editor teks di sebelah kanannya:

<?php
	$rows = ExecuteRow("SELECT * FROM models", null, \Doctrine\DBAL\FetchMode::ASSOCIATIVE);
	var_dump($rows);
?>

Setelah itu, simpan file project-nya, lalu generate ulang semua file script seperti biasa menggunakan PHPMaker 2021.

Jika sudah selesai di-generate, silahkan buka Aplikasi Web dari browser, login dengan username admin dan password master, lalu klik menu Array Test.

Output dari kode di atas adalah seperti ini:

array (size=3)
  'ID' => string '1' (length=1)
  'Trademark' => string '9' (length=1)
  'Model' => string '240SX' (length=5)

Untuk lebih mempercepat, kita akan coba bermain-main langsung dengan kode yang kita buat untuk Custom File di atas tadi. Caranya, buka file ArrayTest.php yang terdapat di dalam sub-folder views, maka Anda akan melihat kode selengkapnya menjadi seperti ini:

<?php

namespace PHPMaker2021\demo2021;

// Page object
$ArrayTest = &$Page;
?>
<?php
	$rows = ExecuteRow("SELECT * FROM models", null, \Doctrine\DBAL\FetchMode::ASSOCIATIVE);
	var_dump($rows);
?>

<?= GetDebugMessage() ?>

lalu ubah kode di bagian ExecuteRows saja, sehingga menjadi seperti ini:

<?php

namespace PHPMaker2021\demo2021;

// Page object
$ArrayTest = &$Page;
?>
<?php
	$rows = ExecuteRow("SELECT * FROM models"); //, null, \Doctrine\DBAL\FetchMode::ASSOCIATIVE);
	var_dump($rows);
?>

<?= GetDebugMessage() ?>

lalu pastikan Anda sudah menyimpan perubahan tadi pada file views/ArrayTest.php, lalu refresh ulang halaman yang bertalian di browser, maka Anda akan melihat output-nya menjadi seperti ini:

array (size=6)
  'ID' => string '1' (length=1)
  0 => string '1' (length=1)
  'Trademark' => string '9' (length=1)
  1 => string '9' (length=1)
  'Model' => string '240SX' (length=5)
  2 => string '240SX' (length=5)

Sudah tahu perbedaannya dimana? Ya, jika kita tidak menggunakan \Doctrine\DBAL\FetchMode::ASSOCIATIVE pada parameter ketiga di global function tadi, maka itu artinya indeks kolom atau field akan disertakan di array yang dihasilkan oleh global function ExecuteRow tersebut.

Jika kita menghilangkan indeks kolom atau indeks field tadi, maka kita tidak dapat mengakses nilai berdasarkan nomor indeks kolomnya. Contoh, jika indeks kolom dihilangkan, maka kita tidak dapat menggunakan kode PHP berikut:

echo $row[0]; // 1
echo $row[1]; // 9
echo $row[2]; // 240SX

Karena tidak bisa menggunakan indeks kolom atau indeks field-nya, maka kita harus menggunakan nama kolom atau nama field-nya seperti ini:

echo $row["ID"]; // 1
echo $row["Trademark"]; // 9
echo $row["Model"]; // 240SX

Ketentuan ini berlaku juga untuk ExecuteRows. Perbedaannya, kalau di ExecuteRows, maka output array-nya bisa terdiri lebih dari satu elemen, sedangkan ExecuteRow hanya mengembalikan record pertama atau elemen array yang teratas saja.

Begini Mudahnya dan Cepatnya Membuat Fake Delete di PHPMaker 2021

$
0
0

Fake Delete sering diartikan dengan Penghapusan Palsu. Dengan kata lain, ketika Pengguna Akhir dari Aplikasi Web menghapus data, maka data tersebut sebenarnya tidak dihapus dari database, tetapi hanya ditandai statusnya sebagai sudah dihapus.

Fitur Fake Delete adalah salah satu fitur yang sering dibutuhkan di dalam suatu Aplikasi Web. Khususnya jika ada ketentuan yang mengharuskan data tidak boleh dihapus secara fisik. Pengguna Akhir hanya tidak dapat melihat data yang sudah ditandai statusnya sebagai sudah dihapus.

Beruntunglah Anda jika membangun Aplikasi Web dengan PHPMaker 2021. Anda dapat menerapkan Fake Delete dengan sangat mudah dan cepat. Anda hanya perlu menambahkan sedikit kode saja ke server event Row_Deleting.

Langsung saja kita membuktikannya bersama-sama dari demo project untuk PHPMaker 2021 yang bisa Anda download file-nya dan coba di localhost.

Langkah Pertama, jalankan perintah SQL di bawah ini, untuk menambahkan sebuah field yang bernama IsDelete pada table models di dalam database yang digunakan project demo tadi:

ALTER TABLE `models` 
ADD COLUMN `IsDelete` enum('0','1') NOT NULL DEFAULT '0' AFTER `Model`

Langkah Kedua, pastikan Anda sudah melakukan sinkronisasi struktur table terbaru tadi dengan project demo, dengan mengklik menu Tools -> Synchronize, lalu tekan Yes atau OK untuk menerima perubahan.

Langkah Ketiga, salin kode berikut ke dalam server event Row_Deleting dari table models tepat sebelum baris return true;, sehingga kode selengkapnya menjadi seperti ini:

// Row Deleting event
function Row_Deleting(&$rs)
{
    // Enter your code here
    // To cancel, set return value to False
    $conn = $this->getConnection();
    $conn->executeUpdate("UPDATE models SET IsDelete = '1' WHERE ID = " . $rs["ID"]);
    $conn->commit();
    $conn->beginTransaction();
    $this->setSuccessMessage(Language()->phrase("DeleteSuccess"));
    $this->terminate("modelslist");
    return false;
    
    return true;
}

Kode di atas mengupdate nilai field IsDelete menjadi 1, yang artinya status datanya menjadi sudah dihapus. Di bawahnya kita menambahkan method commit milik object connection, diikuti dengan memulai transaction dengan method beginTransaction, tampilkan pesan berhasil, lalu redirect Pengguna Akhir ke halaman List dari menu Models, dan yang terakhir jangan lupa untuk mengembalikan nilai false.

Jika return false tidak kita gunakan, maka perintah selanjutnya akan lanjut ke kode return true untuk menghapus data tersebut dari database. Tentu saja kita tidak ingin menghapus data tersebut dari database. Untuk itulah kenapa kita harus menggunakan return false.

Langkah Keempat, tambahkan kode berikut ke dalam server event Page_Load di bawah Delete Page milik table models:

    Language()->setPhrase("DeleteCancelled", "");

Jika kode barusan ini tidak kita tambahkan, maka pesan error yang berisi Delete cancelled akan muncul. Supaya pesan ini tidak muncul, maka kita harus mengeset phrase DeleteCancelled dengan string kosong.

Tentu saja Anda bisa mengembangkan fitur ini dengan tidak menampilkan record yang memiliki nilai 1 pada field IsDelete tadi, dengan menambahkan satu baris kode ini saja ke dalam server event Recordset_Selecting:

    AddFilter($filter, "IsDelete = '0'"); // hanya tampilkan yang IsDelete = '0'

Langkah Kelima, pastikan Anda sudah men-generate semua file script dari PHPMaker 2021. Setelah itu, cobalah untuk menghapus sebuah record di menu List Models, maka Anda akan melihat record yang dihapus tetap ada. Hanya nilai pada field IsDelete saja yang berubah.

Perhatikanlah kembali kode di server event Recordset_Selecting, Row_Deleting, dan Page_Load di atas tadi. Hanya dengan sedikit kode itu saja, kita sudah dapat mengimplementasikan Fake Delete di PHPMaker 2021.

Tidak perlu menulis kode berpuluh-puluh atau beratus-ratus baris hanya untuk menerapkan penghapusan palsu tadi. Selebihnya sudah ditangani oleh PHPMaker, sehingga waktu pengembangan Aplikasi Web menjadi lebih cepat.

Sebagai catatan terakhir, trik ini memiliki keterbatasan, yaitu hanya bisa menghapus per satu record saja. Jika opsi Multiple delete diaktifkan, maka hanya record yang paling pertama terpilih saja yang akan ditandai sebagai sudah dihapus.

Jadi, pastikan sekali lagi Anda tidak mengaktifkan Multiple Delete jika ingin menerapkan Fake Delete ini.

Mudahnya Membuat Fake Delete yang Bisa Multi Record di PHPMaker 2021

$
0
0

Di artikel sebelumnya kita sudah membahas bagaimana mudahnya membuat Fake Delete di PHPMaker 2021.

Tapi sayangnya, di artikel tersebut, kita tidak bisa menerapkannya untuk beberapa record sekaligus (Multiple Delete). Kita hanya bisa “menghapus” per satu record (Single Delete) saja. Penyebabnya karena kita langsung melakukan return false dan me-redirect Pengguna Akhir kembali ke halaman List.

Bukan PHPMaker namanya jika kita tidak bisa mencarikan alternatif solusi untuk membuat Fake Delete yang bisa untuk beberapa record sekaligus. Untuk itu, kita akan kembali menggunakan project demo2021 yang sudah kita bahas di artikel di atas tadi.

Jika Anda belum pernah mengikuti dan mencobanya secara langsung, maka saya sarankan agar Anda mencobanya terlebih dulu, sesuai yang dijelaskan pada artikel tersebut.

Langkah pertama, pastikan Anda sudah membuka file project demo2021 menggunakan PHPMaker 2021, lalu hapus tanda centang pada opsi Delete dari Table setup -> Delete Page. Kali ini kita tidak lagi menggunakan fitur Delete bawaan PHPMaker.

Langkah kedua, copy dan paste-kan kode berikut ke dalam server event Page_Load di bawah List Page milik table models, sehingga kode selengkapnya menjadi seperti ini:

// Page Load event
function Page_Load()
{
    //Log("Page Load");
    $this->CustomActions["deleteModels"] = new ListAction("deleteModels", "&nbsp;Delete Models", IsLoggedIn(), ACTION_POSTBACK, ACTION_MULTIPLE, "Delete the selected records?", "fas fa-star ew-icon");
}

Langkah ketiga, copy dan paste-kan kode berikut ke dalam server event Row_CustomAction milik List Page dari table models, sehingga kode selengkapnya menjadi seperti ini:

// Row Custom Action event
function Row_CustomAction($action, $row)
{
    // Return false to abort
    if ($action == "deleteModels") { // Check action name
        $rsnew = ["IsDelete" => "1"]; // Array of field(s) to be updated
        $result = $this->update($rsnew, "ID = " . $row["ID"]); // Update the current record only (the second argument is WHERE clause for UPDATE statement)
        if (!$result) { // Failure
            $this->setFailureMessage("Failed to delete record, ID = " . $row["ID"]);
            return false; // Abort and rollback
        } elseif ($this->SelectedIndex == $this->SelectedCount) { // Last row
            $this->setSuccessMessage("All selected records deleted.");                
        }
        return true; // Success
    }
    return true;
}

Langkah keempat, silahkan generate ulang semua file script menggunakan PHPMaker 2021 seperti biasa.

Setelah semua file script selesai di-generate, silahkan login ke Aplikasi Web dengan menggunakan username admin dan password master. Kemudian buka halaman Models, maka Anda akan melihat tombol di bagian bawah dan/atau atas table di halaman List tersebut yang bernama Delete Models dengan icon bintang di sebelah kirinya.

Sekarang cobalah pilih beberapa record sekaligus, lalu tekan tombol Delete Models, maka sistem akan menampilkan pertanyaan Delete the selected records?. Klik tombol OK untuk menyetujui dan melanjutkan, lalu tunggulah beberapa detik, sistem akan “menghapus” record-record yang terpilih tadi dengan cara meng-update nilai field IsDelete menjadi nilai 1, lalu menampilkan pesan All selected records deleted.

Betapa mudah dan cepatnya bukan? Tidak perlu menulis kode sampai berpuluh-puluh atau beratus-ratus baris hanya untuk membuat fitur Fake Delete yang bisa Multi Record. Hanya dengan sedikit kode itu saja, kita sudah bisa membuat Fake Delete yang bisa Multi Record di PHPMaker 2021.

Mari Berkenalan dengan Server Event Route_Action di PHPMaker 2021

$
0
0

Sejak versi 2021, PHPMaker memperkenalkan sebuah server event baru yang bernama Route_Action. Fungsinya untuk membuat route baru, selain route built-in yang sudah disediakan oleh PHPMaker, seperti: add, edit, delete, list, view, search, atau update.

Untuk route built-in yang kita sebutkan di atas tadi, sudah pernah kita bahas pada artikel Mengenal SEO-Friendly URL di Aplikasi Web yang Dihasilkan oleh PHPMaker 2021.

Dengan menggunakan server event Route_Action, maka kita sebagai Web Developer dapat menambahkan aksi controller kita sendiri ke dalam controller yang terdapat di Aplikasi Web yang dihasilkan oleh PHPMaker. Untuk informasi lebih lanjut, dapat dibaca pada dokumentasi Slim Framework’s Routing.

Tidak banyak penjelasan yang terdapat di menu Help PHPMaker 2021 mengenai server event Route_Action ini. Satu-satunya cara untuk mengenal lebih dalam server event tersebut adalah dengan mencobanya secara langsung.

Untuk itu kita akan kembali menggunakan project demo2021 yang bisa kita download file-nya untuk dicoba di localhost kita masing-masing.

Sekarang mari kita buka file demo2021 tersebut dengan menggunakan PHPMaker 2021, kemudian silahkan langsung lompat lokasi ini: Server Events -> Global -> All Pages -> Route_Action, lalu masukkan kode berikut ke dalam server event tersebut:

    $app->any('/my-models', function ($request, $response, $args) {
        $oldresponse = "";
        if (!isset($_GET['searchTerm'])) { 
            $data =   ExecuteRows("SELECT ID AS id, Model AS Text FROM models ORDER BY ID LIMIT 10");
        } else { 
            $search = $_GET['searchTerm'];   
            $search = AdjustSql($search);
            $data =  ExecuteRows("SELECT ID AS id, Model AS Text FROM models WHERE Model LIKE '%".$search."%' LIMIT 10");
        } 
        return $response->withJson($data);	 
    });

Jika sudah, simpan project-nya, lalu pastikan untuk men-generate ulang file script seperti biasa menggunakan PHPMaker 2021.

Kita asumsikan bahwa Aplikasi Web di-generate ke dalam sub-folder demo2021 di bawah root folder web server yang kita gunakan, maka kita dapat mengakses alamat ini melalui browser:

http://localhost/demo2021/my-models

Perhatikanlah hasilnya. Seharusnya Aplikasi Web akan menampilkan output sebagai berikut:

[{"id":"1","0":"1","Text":"240SX","1":"240SX"},{"id":"2","0":"2","Text":"530iabc","1":"530iabc"},{"id":"3","0":"3","Text":"645Ci","1":"645Ci"},{"id":"4","0":"4","Text":"735i","1":"735i"},{"id":"5","0":"5","Text":"745i","1":"745i"},{"id":"6","0":"6","Text":"Allante","1":"Allante"},{"id":"7","0":"7","Text":"Avenger","1":"Avenger"},{"id":"8","0":"8","Text":"B350 Ram","1":"B350 Ram"},{"id":"9","0":"9","Text":"C230 Kompressor Sport Coupe","1":"C230 Kompressor Sport Coupe"},{"id":"10","0":"10","Text":"C240","1":"C240"}]

Itu artinya kode yang kita masukkan ke dalam server event Route_Action tadi berfungsi sebagaimana mestinya. Kode tersebut akan menampilkan semua record yang berada di table models dalam format JSON (JavaScript Object Notation).

Kemudian, cobalah ubah URL di browser tadi menjadi seperti ini:

http://localhost/demo2021/my-models?searchTerm=Avenger

Lalu perhatikan sekarang seperti apa output-nya? Seharusnya yang muncul di halaman browser adalah seperti ini:

[{"id":"7","0":"7","Text":"Avenger","1":"Avenger"}]

Dari URL yang kedua tadi, kita mencoba menambahkan parameter untuk menyaring data yang ditampilkan dengan menyertakan parameter searchTerm yaitu Avenger, maka sistem hanya menampilkan data dari table models yang bernama Avenger.

Dengan contoh yang sangat sederhana tersebut, bisa kita ambil kesimpulan bahwa server event Route_Action sangat cocok digunakan jika kita ingin mengembalikan output dalam format JSON melalui URL yang business-logic dan route-nya bisa kita tentukan sendiri sesuai kebutuhan.

Jadi, di sini tidak ada HTML tag yang kita sertakan. Hanya data dalam format JSON saja yang kita tampilkan berdasarkan fungsi global ExecuteRows yang kita panggil di dalam server event tersebut.

Contoh penerapan dari server event Route_Action ini juga bisa lewat pemakaian AJAX yang akan mengembalikan nilai tertentu berdasarkan alamat URL yang bisa kita definisikan route-nya sesuai keinginan kita.


Setelah Route_Action, Ada Lagi Server Event Api_Action di PHPMaker 2021

$
0
0

Kemarin kita sudah membahas server event Route_Action. Hari ini kita membahas server event baru lainnya yang bernama Api_Action. Server event ini juga baru pertama kali ditambahkan di PHPMaker 2021.

Hampir sama dengan server event Route_Action, server event Api_Action ini berfungsi untuk menambahkan aksi API ke dalam controller API. Untuk informasi lebih lanjut, dapat dibaca pada dokumentasi Slim Framework’s Routing.

Kalau melihat dari manual atau Help PHPMaker 2021, contoh kode di server event Api_Action persis sama dengan contoh kode di server event Route_Action. Itu artinya logic yang kita implementasikan untuk Route_Action, bisa juga kita gunakan untuk Api_Action.

Mungkin timbul pertanyaan, mengapa harus dipisahkan antara Route_Action dan Api_Action jika contoh kode yang digunakan di kedua server event tersebut pada menu Help PHPMaker sama saja?

Jawabannya kurang lebih seperti ini. Meskipun logic-nya sama, terbukti dari dokumentasi yang diacu oleh kedua server event ini juga sama, yaitu Slim Framework’s Routing, server event Api_Action akan dipanggil dari file src/apiroutes.php, sedangkan server event Route_Action akan dipanggil dari file src/routes.php.

Meskipun Api_Action juga menggunakan route, sama seperti Route_Action yang tentu saja menggunakan route, sementara Aplikasi Web yang dihasilkan oleh PHPMaker 2021 memisahkan keduanya, maka bisa disimpulkan bahwa Route_Action biasanya digunakan untuk keperluan internal Aplikasi Web.

Sedangkan Api_Action digunakan untuk keperluan eksternal Aplikasi Web, khususnya jika kita menyediakan API (Application Programming Interface) agar sistem lain dapat terhubung dengan Aplikasi Web yang sudah di-generate oleh PHPMaker 2021.

Jadi, server event Api_Action, sesuai dengan namanya; disediakan untuk kebutuhan API, khususnya jika Aplikasi Web yang kita kembangkan menyediakan API supaya bisa dikonsumsi oleh sistem eksternal lainnya.

Mudahnya Mengubah Teks di Title dari Modal Dialog pada PHPMaker 2021

$
0
0

Ingin tahu seperti apa cara mengubah teks atau tulisan di bagian Title dari Modal Dialog pada PHPMaker 2021? Begini caranya.

Pertama sekali, pastikan opsi Modal dialog sudah diaktifkan dari Table setup -> Edit Page pada project PHPMaker 2021 yang Anda gunakan.

Kedua, cukup tambahkan kode jQuery berikut ke dalam Startup Script di bawah halaman List:

$('#ew-modal-dialog').on('shown.bs.modal', function (event) {
    $(this).find('h4#modal-title').text("My Edit"); // sesuaikan My Edit dengan teks lainnya
})

Pastikan sekali lagi, bahwa kode ini ditempatkan di halaman List, dan bukan di halaman Edit. Jadi, jangan sampai salah ya.

Setelah itu jangan lupa untuk men-generate ulang semua file script dengan PHPMaker 2021 seperti biasa.

Anda bisa melihat hasilnya melalui browser dengan menjalankan Aplikasi Web yang bertalian. Ketika menu Edit diklik dari halaman List pada salah satu record, maka judul di Modal Dialog akan berubah menjadi My Edit.

Udah. Gitu aja. Gak pake lama, gak pake ribet, hehehe… 😛

Meng-crop Image Saat Upload File di Aplikasi Web dari PHPMaker 2021

$
0
0

Jika kita mengaktifkan Resize image dari panel Edit Tag, maka kita dapat menggunakan server event Row_Inserting dan/atau Row_Updating untuk meng-crop Image.

Caranya, kita menambahkan plugins kepada object Upload, lalu mengubah ukuran lebar dan tinggi Image dari file yang di-upload tersebut.

Contoh, dengan sedikit kode PHP ini saja, maka kita dapat men-gcrop Image dari posisi tengah dengan menentukan ukuran lebar dan tingginya:

$this->MyFileUploadField->Upload->Plugins[] = function($thumb) {
    $thumb->cropFromCenter(400, 300); // lebar = 400, tinggi = 300
};

MyFileUploadField adalah nama field Upload. Silahkan disesuaikan dengan nama field yang kita gunakan.

$thumb adalah instansiasi dari sub-class GD (yang meng-extends class PHPThumb). Ada beberapa method yang dimiliki oleh class ini, yaitu: crop(), cropFromCenter(), dan adaptiveResize*().

Kode selengkapnya dapat dilihat dari file vendor/hkvstore/phptumb/src/PHPThumb/GD.php.

Anda dapat meng-crop dan/atau mengubah ukuran file Image. Perubahan ukuran akan tetap dilakukan kemudian, sesuai dengan setting project.

Menampilkan Form Edit dengan Modal Dialog Lewat Custom Files di PHPMaker 2021

$
0
0

Hari ini kita akan membuktikan satu lagi kemudahan yang disediakan oleh PHPMaker 2021, khususnya bagi Anda yang sudah menggunakan Masino Extensions. Jadi, project demo yang akan kita gunakan di artikel ini baru dapat Anda download setelah Anda menjadi member di situs ILovePHPMaker.com.

Kita akan menampilkan halaman Edit atau form Edit yang mengubah data Profil Pengguna dari database view yang bernama myuserprofile dengan ID = 1 pada Modal Dialog. Kali ini kita akan menggunakan bantuan Custom Files di PHPMaker 2021.

Jika Anda sudah menggunakan Masino Extensions untuk PHPMaker 2021, maka silahkan buka project demo yang sudah tersedia di situs I Love PHPMaker dengan menggunakan PHPMaker 2021.

Selanjutnya, klik item news.php di bawah bagian Custom Files pada panel Database, lalu klik tab Code (Server Events, Client Scripts and Custom Templates). Kemudian klik Content yang berada di bawah Custom Files -> Table-Specific -> Custom File, lalu cari kode ini:

<div class="card-body">

Jika sudah ketemu, di bawah baris kode tadi, copy dan paste kode berikut:

<?php if (IsAdmin()) { ?>
    <script>
        if (!ew.vars.tables.myuserprofile) ew.vars.tables.myuserprofile = <?= JsonEncode(GetClientVar("tables", "myuserprofile")) ?>;
    </script>
    <a class='btn btn-primary ew-row-link ew-edit' data-caption='Edit' href="#" onclick="return ew.modalDialogShow({lnk:this,btn:'SaveBtn',ask:1,msg:'<?php echo Language()->phrase("AlertifyConfirmSaveMessage"); ?>',url:'myuserprofileedit/1'});">Edit Employee 1</a><br><br>
<?php } ?>

Perhatikan kode tersebut. Karena menggunakan Custom Files, maka kita wajib menambahkan kode Javascript yang mendefinisikan variable myuserprofile yang merupakan bagian dari variable ew.vars.tables.

Jika kode Javascript ini tidak ditambahkan, maka sistem akan menampilkan pesan error lewat panel Console setelah Anda menekan tombol F12 dari browser. Sistem akan mengatakan bahwa myuserprofile tidak dikenal.

Parameter ask:1 di dalam function ew.modalDialogShow menandakan bahwa sistem akan menampilkan pertanyaan sebelum menyimpan data.

Sedangkan phrase AlertifyConfirmSaveMessage adalah phrase baru yang ditambahkan pada file language .xml, berisi pertanyaan apakah ingin menyimpan data.

Sekarang simpan project, lalu pastikan untuk men-generate semua file script dengan menggunakan PHPMaker 2021 seperti biasa.

Jika sudah, jalankan Aplikasi Web dari browser, login dengan username admin dan password master, lalu klik menu Front -> News dari bagian Navbar.

Selanjutnya klik tombol Edit Employee 1 di bagian atas halaman News tersebut, maka Anda akan melihat Modal Dialog yang di dalamnya terdapat form Edit data Profil Pengguna dengan ID = 1.

Silahkan ubah data di salah satu field, lalu klik tombol Save, sistem akan menampilkan pertanyaan yang Are you sure you want to save the data?. Klik tombol OK untuk mengkonfirmasi, lalu tunggu beberapa detik, sistem akan menyimpan data tersebut.

Betapa mudah dan cepatnya, bukan? Hanya dengan sedikit kode itu saja, kita sudah dapat menampilkan Modal Dialog yang di dalamnya berisi halaman atau form Edit data Employee dengan ID = 1, beserta pertanyaan apakah ingin menyimpan data.

Tidak perlu menulis kode berpuluh-puluh, beratus-ratus, atau bahkan beribu-ribu baris hanya untuk menampilkan Modal Dialog lewat fitur Custom Files di PHPMaker 2021.

Menyesuaikan Maksimum Ukuran File Secara Dinamis dari PHPMaker 2021

$
0
0

Tahukah Anda bahwa di PHPMaker 2021 kita dapat menyesuaikan maksimum ukuran file yang di-upload atau diunggah secara dinamis? Jika belum tahu, berikut ini caranya.

Katakanlah kita memiliki field yang bernama Berkas dimana field ini sudah kita sesuaikan pengaturannya dari panel Edit Tag di project PHPMaker 2021 sebagai File, yang artinya field tersebut dapat digunakan untuk meng-upload file.

Seperti yang sudah kita ketahui, object Field (khususnya yang menggunakan object Upload) di PHPMaker 2021 memiliki property yang bernama UploadMaxFileSize. Secara default atau standar, nilai untuk field ini diambil dari variable config yang bernama MAX_FILE_SIZE.

Itu artinya, kita dapat menimpa nilai default tadi dengan nilai yang kita inginkan secara dinamis, menggunakan server event Page_Load milik halaman dimana proses Upload tersebut akan dijalankan.

Contoh, kita cukup memasukkan satu baris kode ini saja ke dalam server event Page_Load di bawah atau milik halaman Add (upload file saat menambah data) dan/atau di halaman Edit (upload file saat mengubah data):

    // sesuaikan nilai 500000000 (yang artinya 500000000 bytes = sekitar 500 MB)
    $this->Berkas->UploadMaxFileSize = 500000000; // diasumsikan kita menggunakan PHP yang 64-bit di web server

Dalam contoh kode di atas, kita dapat menentukan nilai maksimum ukuran file yang dapat di-upload melalui field Berkas tadi sebesar 500 MB. Tentu saja nilai ini tergantung kebutuhan dan spesifikasi PHP yang digunakan oleh web server kita.

Hanya sebaris kode itu saja yang ditambahkan dari dalam project PHPMaker 2021, maka kita dapat menyesuaikan secara dinamis nilai maksimum ukuran file yang diijinkan oleh sistem untuk di-upload.

Dengan cara tersebut, kita bisa mengimplmentasikan proses bisnis secara dinamis sesuai kebutuhan, tanpa harus selalu menyesuaikan pengaturan yang terkait dari file php.ini di web server.

Viewing all 176 articles
Browse latest View live