Kolaborasi Basic4Android dan Yii PHP Framework (2)
|Di bagian kedua ini saya akan share cara membuat CRUD untuk tabel barang dan kategori. Prosesnya hampir sama seperti proses login sebelumnya, dimana aplikasi Android-nya mengirim request data ke server dengan menyertakan parameter-parameter yang dibutuhkan oleh server. Dan kemudian server merespon balik dari request data tersebut yang hasilnya berupa JSON, yang kemudian di-parsing dan ditampilkan oleh aplikasi Android-nya.
Oke, langsung saja…
Membuat List Barang
Pada menu utama, terdapat dua Button yaitu Kategori dan Barang. Saat Button Barang diklik akan muncul activity baru berupa List Barang.
- Pada BarangController (yang ada di Yii Framework) saya menambahkan fungsi actionMobile, yang mana di dalamnya terdapat beberapa action yang datangnya dari mobile atau aplikasi Android. Code-nya seperti berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
Public function actionMobile() { switch ($_GET['action']){ Case 'list': $barang = Barang::model()->findAll(); echo CJSON::encode($barang); break; Case 'view': $barang = Barang::model()->findByPk($_GET['id']); echo CJSON::encode(Array('data'=>$barang)); break; Case 'create': $model=new Barang; $model->kode = $this->actionGenerateCode(); $model->nama = $_GET['nama']; $model->harga = $_GET['harga']; $model->keterangan = $_GET['keterangan']; $model->kategori_id = $_GET['kategori_id']; If($model->save()) $message = $model->nama.' has been created.'; Else $message = 'Failed to save Barang.'; echo CJSON::encode(Array('message'=>$message, 'data'=>$model)); break; Case 'update': $model=$this->loadModel($_GET['id']); $model->nama = $_GET['nama']; $model->harga = $_GET['harga']; $model->keterangan = $_GET['keterangan']; $model->kategori_id = $_GET['kategori_id']; If($model->save()) $message = $model->nama.' has been updated.'; Else $message = 'Failed to update Barang.'; echo CJSON::encode(Array('message'=>$message, 'data'=>$model)); break; Case 'delete': $this->loadModel($_GET['id'])->delete(); $message = $_GET['nama'].' has been deleted.'; echo CJSON::encode(Array('message'=>$message)); break; } } |
- Beri akses actionMobile pada fungsi accessRules, agar bisa diakses oleh aplikasi Android-nya.
1 2 3 4 5 6 7 8 9 10 11 12 |
Public function accessRules() { Return Array( Array('allow', // allow all users to perform 'index' and 'view' actions 'actions'=>array('index','view','mobile'), 'users'=>array('*'), ), ... ... ... ); } |
- Lalu saya menambahkan satu fungsi lagi: actionGenerateCode, yang nantinya akan digunakan untuk generate kode barang otomatis.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Public function actionGenerateCode() { $barang = Barang::model()->findAll(); $count = count($barang); $count = $count+1; If ($count < 10) $count = '000'.$count; Else If ($count < 100) $count = '00'.$count; Else If ($count < 1000) $count = '0'.$count; Else $count = $count; $code = 'BRG-'.$count; Return $code; } |
- Beralih ke B4A, buka kembali project h-store.
- Buat activity baru, beri nama BarangList.
- Pada Sub Globals deklarasikan sebuah object ListView dengan nama: LvBarang.
1 2 3 4 5 |
Sub Globals 'These global variables will be redeclared each time the activity is created. 'These variables can only be accessed from this module. Dim LvBarang As ListView End Sub |
- Pada event Activity_Create masukkan code seperti di bawah ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
Sub Activity_Create(FirstTime As Boolean) 'Set judul untuk activity ini. Activity.Title = "List Barang" 'Tambahkan menu. Activity.AddMenuItem("Create Barang","CreateBarang") Activity.AddMenuItem("Sync data Barang","SyncBarang") 'Initialize ListView. LvBarang.Initialize("LvBarang") 'Tampilkan ListView di activity ini. Activity.AddView(LvBarang, 0,0,100%x,100%y) End Sub |
- Buat fungsi baru dengan nama: GetBarang. Fungsi ini digunakan untuk melakukan request data barang ke server. Yang nantinya akan ditampilkan ke dalam ListView.
1 2 3 4 5 6 7 8 9 |
Sub GetBarang ProgressDialogShow2("Loading data from server... Please wait!", False) Dim job As HttpJob job.Initialize("barangJob", Me) 'Request data barang ke server. Dim S As String = Main.serverAddress & "/barang/mobile" job.Download2(S , Array As String("action", "list")) End Sub |
- Kemudian buat event Click untuk object menu SyncBarang. Lalu panggil fungsi GetBarang yang pada no. 8 sudah dibuat.
1 2 3 |
Sub SyncBarang_Click() GetBarang End Sub |
- Panggil juga fungsi GetBarang pada event Activity_Resume. Agar setiap List Barang dibuka akan otomatis menampilkan data barang dari server.
1 2 3 |
Sub Activity_Resume GetBarang End Sub |
- Setelah itu buat event JobDone. JobDone ini akan berjalan ketika proses komunikasi antara App Client (Android) dengan Web Server selesai.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
Sub JobDone(Job As HttpJob) Dim JSON As JSONParser If Job.Success = False Then ProgressDialogHide ToastMessageShow("Sync failed! Please try again.", True) Else Select Job.JobName Case "barangJob" Log(Job.GetString) JSON.Initialize(Job.GetString) Dim barang As List barang = JSON.NextArray 'Tampilkan data barang di ListView. LvBarang.Clear For i = 0 To barang.Size - 1 Log(barang.Get(i)) Dim m As Map = barang.Get(i) LvBarang.SingleLineLayout.Label.TextColor = Colors.Black LvBarang.AddSingleLine2(m.Get("nama"), m.Get("id")) Next End Select ProgressDialogHide End If Job.Release End Sub |
Berikut adalah JSON yang dihasilkan saat ada request data barang dari mobile atau aplikasi Android dengan action list:
- Buat fungsi event ItemClick untuk object ListView: LvBarang.
1 2 3 4 5 |
Sub LvBarang_ItemClick (Position As Int, Value As Object) BarangView.ID = Value BarangView.NewData = False StartActivity(BarangView) End Sub |
- Buat satu fungsi event lagi, kali ini event Click untuk menu: Create Barang.
1 2 3 4 5 6 |
Sub CreateBarang_Click 'Saat Menu Create Barang diklik, maka buka BarangView. 'Dan set NewData di BarangView menjadi True. BarangView.NewData = True StartActivity(BarangView) End Sub |
* * *
Membuat View Barang
Setelah membuat List Barang, sekarang kita akan membuat View Barang. Jadi, ketika user mengklik barang yang ada di ListView, atau ketika user melakukan Create Barang, maka akan diarahkan ke View Barang ini.
- Oke, sekarang tambahkan satu activity baru dengan nama: BarangView.
- Jika sudah dibuat, pada Sub Process_Globals deklarasikan variabel-variabel seperti di bawah ini:
1 2 3 4 5 6 |
Sub Process_Globals 'Variabel ID untuk menampung ID barang. Dim ID As Int 'Variabel boolean untuk membedakan apakah create data baru atau bukan. Dim NewData As Boolean End Sub |
- Buat object-object seperti Panel, Label, EditText, Spinner, dan Button. Deklarasikan semua object tersebut di Sub Globals.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
Sub Globals 'These global variables will be redeclared each time the activity is created. 'These variables can only be accessed from this module. Dim pnlBarang As Panel Dim lblKode As Label Dim lblNama As Label Dim lblKategori As Label Dim lblHarga As Label Dim lblKeterangan As Label Dim edtKode As EditText Dim edtNama As EditText Dim spnKategori As Spinner Dim mapKategori As Map Dim edtHarga As EditText Dim edtKeterangan As EditText Dim btnSave As Button Dim btnDelete As Button Dim kategoriId As Int End Sub |
- Pada event Activity_Create masukkan beberapa fungsi yang nanti akan digunakan dalam activity ini. Lengkapnya bisa dilihat code berikut ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Sub Activity_Create(FirstTime As Boolean) 'Do not forget to load the layout file created with the visual designer. For example: 'Activity.LoadLayout("Layout1") Activity.Title = "Create Barang" 'Fungsi untuk initialize object-object yang ada. InitObject 'Fungsi untuk set label pada object-object yang ada. SetLabel 'Fungsi request data barang di database server. GetBarang 'Fungsi untuk menampilkan object-object di activity ini. SetObjectView End Sub |
- Semua fungsi yang dipanggil di atas pasti berwarna merah, itu tandanya bahwa fungsi tersebut belum pernah dibuat. Maka dari itu, buatlah fungsi-fungsi baru seperti berikut:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
Sub InitObject lblKode.Initialize("") lblNama.Initialize("") lblKategori.Initialize("") lblHarga.Initialize("") lblKeterangan.Initialize("") edtKode.Initialize("EdtKode") edtNama.Initialize("EdtNama") spnKategori.Initialize("SpnKategori") mapKategori.Initialize edtHarga.Initialize("EdtHarga") edtKeterangan.Initialize("EdtKeterangan") btnSave.Initialize("BtnSave") btnDelete.Initialize("BtnDelete") pnlBarang.Initialize("PnlBarang") 'Set keyboard menjadi number. edtHarga.InputType = edtHarga.INPUT_TYPE_NUMBERS End Sub Sub SetLabel lblKode.Text = "Kode" lblNama.Text = "Nama" lblKategori.Text = "Kategori" lblHarga.Text = "Harga" lblKeterangan.Text = "Keterangan" 'Disable kode, karena ini akan terisi otomatis. edtKode.Enabled = False 'Jika create barang baru, Button-nya beri nama: Save. Dan disable Button delete. 'Selain itu, Button-nya beri nama: Update. Dan enable Button delete. If NewData Then btnSave.Text = "Save" btnDelete.Enabled = False Else btnSave.Text = "Update" btnDelete.Text = True End If btnDelete.Text = "Delete" End Sub Sub GetBarang 'Jika create baru, maka kosongkan form-form yg ada. 'Selain itu, maka request data barang dari database server sesuai ID-nya. If NewData Then edtNama.Text = "" spnKategori.SelectedIndex = 0 edtHarga.Text = 0 edtKeterangan.Text = "" 'Request data kategori ke server. GetKategori Else ProgressDialogShow2("Loading data from server... Please wait!", False) Dim job As HttpJob job.Initialize("barangViewJob", Me) 'Request data barang sesuai ID yang dipilih ke server. Dim S As String = Main.serverAddress & "/barang/mobile" job.Download2(S , Array As String("action", "view", "id", ID)) End If End Sub Sub SetObjectView Dim ctop As Int = 20dip Dim labelHeight As Int = 30dip Dim textHeight As Int = 40dip 'Taruh Label dan EditText di Panel. pnlBarang.AddView(lblKode, 20dip, ctop, 100%x-40dip, 30dip) : ctop = ctop + labelHeight pnlBarang.AddView(edtKode, 20dip, ctop, 100%x-40dip, 40dip) : ctop = ctop + textHeight pnlBarang.AddView(lblNama, 20dip, ctop, 100%x-40dip, 30dip) : ctop = ctop + labelHeight pnlBarang.AddView(edtNama, 20dip, ctop, 100%x-40dip, 40dip) : ctop = ctop + textHeight pnlBarang.AddView(lblKategori, 20dip, ctop, 100%x-40dip, 30dip) : ctop = ctop + labelHeight pnlBarang.AddView(spnKategori, 20dip, ctop, 100%x-40dip, 40dip) : ctop = ctop + textHeight pnlBarang.AddView(lblHarga, 20dip, ctop, 100%x-40dip, 30dip) : ctop = ctop + labelHeight pnlBarang.AddView(edtHarga, 20dip, ctop, 100%x-40dip, 40dip) : ctop = ctop + textHeight pnlBarang.AddView(lblKeterangan, 20dip, ctop, 100%x-40dip, 30dip) : ctop = ctop + labelHeight pnlBarang.AddView(edtKeterangan, 20dip, ctop, 100%x-40dip, 40dip) : ctop = ctop + textHeight 'Taruh Panel dan Button di activity. Activity.AddView(pnlBarang, 0,0,100%x, 85%y) Activity.AddView(btnSave, 0, 85%y, 50%x, 15%y) Activity.AddView(btnDelete, 50%x, 85%y, 50%x, 15%y) End Sub |
- Kemudian buatlah fungsi untuk meng-handle event Click dari Button Save dan Button Delete. Masukkan code di bawah ini:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Sub BtnSave_Click() 'Jika create baru, maka save. 'Selain itu, maka update. If NewData Then ProgressDialogShow2("Inserting data to server... Please wait!", False) Dim job As HttpJob job.Initialize("barangSaveJob", Me) 'Request untuk create barang ke server. Dim S As String = Main.serverAddress & "/barang/mobile" job.Download2(S , Array As String("action", "create", _ "nama", edtNama.Text, _ "harga", edtHarga.Text, _ "keterangan", edtKeterangan.Text, _ "kategori_id", kategoriId)) Else ProgressDialogShow2("Updating data to server... Please wait!", False) Dim job As HttpJob job.Initialize("barangUpdateJob", Me) 'Request untuk update barang ke server. Dim S As String = Main.serverAddress & "/barang/mobile" job.Download2(S , Array As String("action", "update", _ "id", ID, _ "nama", edtNama.Text, _ "harga", edtHarga.Text, _ "keterangan", edtKeterangan.Text, _ "kategori_id", kategoriId)) End If End Sub Sub BtnDelete_Click() Dim result As Int = Msgbox2("Are you sure to delete: " & edtNama.Text & "?", "Confirmation", "Yes", "No", "", _ LoadBitmap (File.DirAssets, "confirm.png")) If result = DialogResponse.Positive Then ProgressDialogShow2("Deleting data... Please wait!", False) Dim job As HttpJob job.Initialize("barangDeleteJob", Me) 'Request untuk delete barang ke server. Dim S As String = Main.serverAddress & "/barang/mobile" job.Download2(S , Array As String("action", "delete", "id", ID, "nama", edtNama.Text)) End If End Sub |
- Setelah itu buat event JobDone. JobDone ini akan berjalan ketika proses komunikasi antara App Client (Android) dengan Web Server selesai.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
Sub JobDone(Job As HttpJob) Dim Map1 As Map Dim JSON As JSONParser Map1.Initialize If Job.Success = False Then ToastMessageShow(Job.ErrorMessage, True) ProgressDialogHide Else JSON.Initialize(Job.GetString) If Job.JobName <> "kategoriJob" Then Map1 = JSON.NextObject End If Log(Job.GetString) Select Job.JobName Case "barangViewJob" Dim m As Map m = Map1.Get("data") Log(m) LoadBarang(m) 'Request data kategori ke server GetKategori Case "barangSaveJob" Dim m As Map m = Map1.Get("data") LoadBarang(m) Activity.Finish ToastMessageShow(Map1.Get("message"), True) Case "barangUpdateJob" Dim m As Map m = Map1.Get("data") LoadBarang(m) ToastMessageShow(Map1.Get("message"), True) Case "barangDeleteJob" Activity.Finish ToastMessageShow(Map1.Get("message"), True) Case "kategoriJob" 'Tampilkan data ketegori ke dalam Spinner. Log(Job.GetString) JSON.Initialize(Job.GetString) Dim kategori As List kategori = JSON.NextArray LoadSpnKategori(kategori, spnKategori, mapKategori, NewData, kategoriId) End Select ProgressDialogHide End If Job.Release End Sub |
- Buat fungsi baru dengan nama: LoadBarang. Fungsi ini digunakan untuk menampilkan data barang yang di-request dari database server ke object-object EditText yang ada di activity BarangView.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub LoadBarang(m As Map) If m.Get("kode") <> Null Then edtKode.Text = m.Get("kode") End If If m.Get("nama") <> Null Then Activity.Title = "View: " & m.Get("nama") edtNama.Text = m.Get("nama") End If If m.Get("harga") <> Null Then edtHarga.Text = m.Get("harga") End If If m.Get("keterangan") <> Null Then edtKeterangan.Text = m.Get("keterangan") End If kategoriId = m.Get("kategori_id") End Sub |
- Lalu buat fungsi lagi dengan nama: GetKategori. Fungsi ini digunakan untuk melakukan request data kategori ke server, yang nanti akan ditampilkan ke dalam Spinner Kategori (spnKategori).
1 2 3 4 5 6 7 8 |
Sub GetKategori Dim job As HttpJob job.Initialize("kategoriJob", Me) 'Request data kategori ke server. Dim S As String = Main.serverAddress & "/kategori/mobile" job.Download2(S , Array As String("action", "list")) End Sub |
- Buat satu fungsi event lagi, kali ini event ItemClick untuk Spinner Kategori.
1 2 3 4 5 6 7 8 9 |
Sub SpnKategori_ItemClick(Position As Int, Value As Object) 'Set kategori_id sesuai kategori yang dipilih. 'Jika kategori tidak dipilih set jadi -1. If mapKategori.Get(Value) <> Null Then kategoriId = mapKategori.Get(Value) Else kategoriId = -1 End If End Sub |
- Dan yang terakhir, buat satu fungsi lagi untuk menampilkan data ketegori ke dalam Spinner.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
Sub LoadSpnKategori(List1 As List, Spinner1 As Spinner, SpinnerMap As Map, new As Boolean, kID As String) Spinner1.Clear Spinner1.Add("- Pilih Kategori -") For row = 0 To List1.Size-1 Dim m As Map = List1.Get(row) Spinner1.Add(m.Get("nama")) 'Tampung ID-nya di map. SpinnerMap.Put(m.Get("nama"), m.Get("id")) Next 'Jika bukan create barang baru, maka select kategori susuai kategori_id barangnya. If new = False Then For i = 0 To List1.Size-1 Dim m As Map = List1.Get(i) Dim s As String = m.Get("id") If s = kID Then Spinner1.SelectedIndex = i+1 End If Next End If End Sub |
- Save, kemudian Run/Compile project ini dalam versi Release.
- Lalu lihat, apa yang terjadi…
- Halaman List Barang, sudah terdapat beberapa data di dalamnya.
- Menu Create Barang dan Sync data Barang.
- Saat Create Barang diklik, muncul form baru seperti ini.
- Silakan isi data-data barangnya.
- Setelah diisi, klik button Save.
- Apa yang terjadi? Ya, jika proses insert data berhasil, maka akan muncul notif seperti ini.
- Dan ketika melakukan update data, dan sukses ter-update ke database server, maka akan muncul notif seperti gambar berikut.
- Ketika ingin melakukan delete data, akan muncul dialog konfirmasi. Jika yakin ingin menghapusnya, klik saja Yes.
- Apa yang terjadi? Ya, jika proses delete data berhasil, maka akan muncul notif seperti gambar ini.
* * *
Untuk CRUD tabel kategori, Anda bisa melakukan hal yang sama seperti pembuatan CRUD tabel barang di atas. “Wah, jadi tidak dijelaskan nih di sini?” Hmm… Iya. Tapi jangan khawatir, jika masih merasa kesulitan untuk membuatnya, source code lengkapnya saya lampirkan di bawah.
Oke, demikian kolaborasi antara Basic4Android dengan Yii PHP Framework untuk bagian kedua. Jika masih ada kesulitan atau problem jangan ragu untuk bertanya di form komentar. Dan… Tetap nantikan juga tutorial-tutorial menarik lainnya seputar Basic4Android.
Happy Coding!
Silakan download source code lengkapnya di sini: B4A | Yii | DB
Untuk yang ingin mencoba aplikasi demo-nya,
Silakan download file APK-nya di sini
Username: admin
Password: 12345
[…] Kolaborasi Basic4Android… […]
mas heru bisa di di berikan sample crud, php tapi bukan framework dengan basic4android, terimakasih
Kalau yang PHP murni saya tidak punya sample-nya. Soalnya biasa develop pakai PHP Framework. Tapi insya Allah nanti saya buatkan.
di tunngu yg php murni bang heru
Mas Heru tambah lagi dong tutornya, kalau bisa isi penjelasan nya, hehe.. makasi banyak mas..
Bang, bisa kirim alamat email abang atau no telp ke email abdimuhammad894@gmail gak bang? butuh banget saya hehe
saya pengen belajar programming khususnya dibidang pembuatan aplikasi vb gitu, php, mysql, html, pascal, c++. pokoknya kepengen dah semua hehe
saya baru kelas 2 SMK, ngambil jurusan rpl, saya pengen mendalamin tuh jurusan bang, kalo abg bisa ngajarin saya, saya akan sangat senang bg, makasih sebelumnya
Gan, pernah nyoba interfacenya ke mysql langsung lewat php ga?
Ini kan pake PHP gan. Cuma pake framework. Kalo pake PHP murni belom coba.
Nah pake PHP murni gan maksudnya hehe.. okeydeh saya lagi riset pakai php murni juga sih. ntar sharing aja ya kalau agan nyoba ke php murni.
kang bisa ditambahin sub buat form pencarian data nya..
Bikin fungsi baru buat request data pencariannya.
Di JobDone:
Nanti di PHP-nya tinggal tangkap parameter “keyword” –> $_GET[‘keyword’] buat query pencariannya.