Sabtu, 18 Mei 2019

Laravel : Cara Memanggil Controller ke View Tanpa Menggunakan Route


Apakah mungkin kita bisa memanggil fungsi controller ke view di laravel tanpa menggunakan route. Biasanya pada konsep MVC (Model-View-Controller) di laravel, Controller adalah penghubung antara model sebagai pattern atau pola yang menandakan sebagai objek dari database dan view sebagai tampilannya yang diakses menggunakan route. Lalu bagaimana kalau Controller itu sendiri kita jadikan suatu fungsi atau method yang dapat dipanggil ke view, emang bisa ? jawabannya bisa karena pada dasarnya Controller yang ada di laravel itu merupakan kelas kelas yang berisi fungsi atau method yang dapat dipanggil, tetapi perlu diingat ketika fungsi atau mehod yang dibuat dapat dikatakan sebagai Controller jika isinya merupakan penghubung antara Model dan View seperti membuat variabel dari Model kemudian dilempar ke View. Ketika hanya berisi fungsi yang memiliki nilai dia tidak bisa disebut Controller. Biasanya untuk apa sih ? kok bisa bisanya fungsi di Controller dipanggil ke View, kan bisa pke variabel kemudian dilempar. Bagi yang pernah atau fasih memakai laravel solusi ini dipakai pada kasus ketika kita melooping variabel kemudian kita ingin mendapatkan detailnya dari database mau gak mau kita harus membuat query lagi (asumsi : tidak bisa join) di view dengan parameter hasil loopingan yang pertama itu membuat terjadi perulangan dua kali, itu sangat tidak bagus walaupun sangat bisa untuk dilakukan, nah pusing kan ? langsung aja ini caranya :









Sabtu, 13 April 2019

.NET Winform : Menjalankan File Python dan Membaca Text File






Kali ini saya akan mencoba membuat aplikasi untuk menjalankan file python dan membaca variable dari python menggunakan C# / Visual Studio.

1. Python
Pertama, kita buat file python terlebih dahulu. Saya akan mencoba membuat file python sederhana yang men-generate random data dari 1-100. Disini kita tidak akan langsung mengambil mempassing variable python ke aplikasi C#, tetapi kita akan menyimpan variable python ke dalam text file terlebih dahulu. Berikut script pythonnya.
--- Script Python ---
from time import sleep
import random

filename ="H:/C Sharp Projects/test.txt"
i = 0

#text_file = open(file_descriptor)
while True:
        i = random.randint(0, 100)
       
        # open the file descriptor       
        text_file = open(filename, "w")      
        text_file.write('{}'.format(i))
        print(i)
        text_file.close()
        sleep(0.5)


Kalian bisa mengubah path filename tempat menyimpan text filenya sesuai kebutuhan kalian.

2. Visual Studio (Windows Form Application)
Pada bagian ini, kita membuat program untuk menjalankan file python yang sudah kita buat sebelumnya menggunakan Thread pada C#, dan membaca hasil text file yang di isi oleh program python tersebut. Untuk programnya kalian bisa download di link berikut.



Hasilnya akan tampak seperti gambar berikut.

.net file watcher python


Sebelum kita menekan tombol Start Watching, kita harus memilih file txt yang akan kita baca dengan menekan tombol Browse. Setelah file txt terpilih, barulah kita klik Start Watching. *Pastikan file txt yang dipilih sama dengan file txt yang di write oleh program python

.net c# read python file variable

Selasa, 12 Maret 2019

Python : Memasukkan Data CSV ke Database MySQL



Dalam artikel kali ini, saya akan membahas bagaimana cara memasukkan data ke tabel MySQL melalui Python, mulai dari cara mengkoneksikan Python ke MySQL hingga memasukkan data-data yang telah dibuat ke MySQL melalui Python dengan GUI Tkinter.



Sebelum mulai, MySQL dan Python 2.7 harus sudah terinstall dalam PC anda. Jika belum, anda dapat mendownloadnya di link berikut ini.

Python 2.7.13:

MySQL Community:

Saat anda menginstall MySQL, maka anda akan diminta mengisi username dan password, nantinya username dan password ini akan kita pakai untuk mengkoneksikan Python dan MySQL.
Setelah Python dan MySQL sudah terinstall, maka langkah selanjutnya adalah membuat database dan tabel pada MySQL, pada artikel kali ini saya akan membuat database tentang Dota 2 dengan tabel hero dan abilities. Disini saya anggap pembaca sudah mengerti bagaimana membuat database dan tabel pada MySQL, jadi saya akan langsung lompat ke database saya. Berikut database dota2 yang telah saya buat pada MySQL Command Line Client.
sql show table

sql table description 1

sql table description 2

 Setelah membuat database dan tabel di MySQL, kita akan membuat sekumpulan data yang akan dibaca oleh python dan menghubungkannya dengan MySQL. Data yang dibuat adalah data yang berekstensi .csv (Comma Separated Values). Untuk membuat file .csv ini, saya menggunakan microsoft excel. Berikut data untuk tabel abilities yang telah saya buat.

csv tabel abilities  
Setelah mengetikkan data di microsoft excel, klik save as, lalu pada kolom “save as type” pilih format CSV (Comma delimited) (*.csv).

save file as csv

Barulah kita dapat memulai program pada Pythonnya. Berikut adalah link full code yang telah saya buat.


Pertama kita import semua module yang diperlukan

from Tkinter import *
import mysql.connector
import csv, sys
import tkFileDialog

Kita membuat exception handling untuk koneksi ke MySQL dengan try dan except. Pastikan anda memasukkan nama user dan password MySQL anda dengan benar, untuk host, karena disini saya hanya mengkoneksikan dengan MySQL yang berada di PC saya, maka saya gunakan localhost.

try:
    conn=mysql.connector.connect(user='root', password='24Ka103li98sapnjri', host='localhost', database='dota2')
except mysql.connector.Error as err:
  if err.errno == errorcode.ER_ACCESS_DENIED_ERROR:
    print("Invalid username or password")
  elif err.errno == errorcode.ER_BAD_DB_ERROR:
    print("Database does not exist")
  else:
    print(err)

Lalu, semua code yang berada di dalam class Application(Frame), adalah code untuk GUI dan fungsi-fungsinya.
Di dalam createWidgets anda dapat membuat label, button, dan interface lainnya. Disini saya menggunakan fungsi grid() untuk menempatkan interface pada windows.
Pada bagian __init__ memanggil class createWidgets dan fungsi pack() untuk widgets GUI ini.

    def createWidgets(self):
       
        self.lbl_title = Label(self, text="Dota 2 Insert  Databases", fg="#fff", bg="#007", padx="20px", pady="8px", font=("Times New Roman", 18))
        self.lbl_hero = Label(self, text="Choose .csv file for hero data", fg="#fff", bg="#828282", padx="10px", pady="6px", font=("Times New Roman", 12))
        self.btn_hero = Button(self, text='Browse', width=8, height=2, command=self.openHeroFile)

        self.lbl_title.grid(row=0, column=0, columnspan=3, sticky=N+E+W)
        self.lbl_hero.grid(row=1, column=0,sticky=W)
        self.btn_hero.grid(row=2, column=0)

    #Initialize
    def __init__(self, master=None):
        Frame.__init__(self, master)
        self.pack()
        self.createWidgets()

Didalam def openHeroFile(self): , adalah program utama untuk memasukkan data-data dari .csv yang kita buat ke dalam MySQL database.

        filename = tkFileDialog.askopenfilename(filetypes = (("Template files", "*.csv"), ("All files", "*")))

Code diatas adalah untuk membuat sebuah command untuk memilih file dari directories kita.
Setelah itu, kita buat code untuk membaca setiap baris yang ada pada file .csv kita.

with open(filename, 'rb') as f:
            reader = csv.reader(f)

Kita buat try and except lagi karena ada kemungkinan error dalam pembacaan filenya. Lalu kita uraikan data-data dari .csv yang telah kita buat. Karena data-data yang ada pada .csv terpisah oleh tanda ‘;’ maka kita harus menggunakan fungsi split(‘;’) untuk memisahkan data-datanya.
Setelah itu kita harus membuat data-data tersebut menjadi string dengan menggunakan perintah str(). Lalu kita buat perintah command yang akan dieksekusi MySQL. Disini saya ingin membuat dua buah kondisi, jika ID belum ada di dalam tabel, maka kita gunakan perintah “insert into”, tetapi jika ID sudah ada di dalam tabel, maka kita gunakan perintah “update”.

try:
                for row in reader:
                    data = row[0].split(';')
                    hero_id = str(data[0])
                    hero_name = str(data[1])
                    print("hero_id = " + hero_id)
                    print("hero_name = " + hero_name)
                    cmd = "select hero_id from hero where hero_id = {};".format(hero_id)
                    cursor = conn.cursor()
                    cursor.execute(cmd, hero_id)
                    recordExist = 0
                    for r_row in cursor:
                        recordExist = 1
                    if recordExist == 1:
                        cmd = "update hero set hero_name=%s where hero_id=%s;"
                        cursor.execute(cmd, (hero_name, hero_id))
                    else:
                        cmd = "insert into hero values(%s, %s);"
                        cursor.execute(cmd, (hero_id, hero_name))
                   
                conn.commit()
                cursor.close()
                conn.close()
                   
            except csv.Error as e:
                sys.exit('file %s, line %d: %s' % (filename, reader.line_num, e))

Terakhir, kita memanggil class Application yang telah kita buat, dan kita buat aplikasi tersebut terus mengulang dengan perintah .mainloop(). Lalu jika aplikasi sudah selesai digunakan, kita destroy dengan perintah .destroy().
Karena sebelumnya kita telah membuka koneksi Python dengan MySQL, maka yang harus dilakukan saat sudah selesai menggunakan aplikasi adalah dengan menutup koneksinya, yaitu dengan perintah .close().

root = Tk()
root.resizable(width=False, height=False)
root.title("Dota 2 Insert Databases")
app = Application(master=root)
app.mainloop()
conn.close()
root.destroy()

Jika kita run full code yang telah saya berikan diatas, maka hasilnya akan seperti berikut.


 Anda tinggal menekan tombol Browse dan pilih file .csv yang telah anda buat, maka otomatis data-data yang ada dalam file .csv tersebut akan dimasukkan ke dalam tabel database MySQL yang telah dibuat sebelumnya (dalam hal ini, database=dota2).

Kamis, 21 Februari 2019

Laravel : Membuat Custom Model Sendiri (Kombinasi atau Tanpa Eloquent)

laravel membuat custom model sendiri

Untuk membuat model pada framework laravel biasanya kita biasa menggunakan bawaan yang telah disediakan oleh laravel yaitu Eloquent, mengadaptasi pada metode ORM (Object Relational Mapping) yang digunakan untuk mengakses database dalam ruang lingkup sebagai objek. Tentu saja dengan adanya Eloquent ini kita lebih dimudahkan untuk membuat query langsung  pada code kita, namun bagaimana kalo kita biasa menggunakan SQL untuk mengakses database atau kita kesulitan untuk merubah SQL syntax yang kompleks ke query builder dari Eloquent itu sendiri. Untuk masalah tersebut kita bisa membuat custom model sendiri dengan membuat class yang berisi fungsi (method) SQL yang mengakses database tanpa menggunakan Eloquent atau kita bisa kombinasikan diantara keduanya. Berikut  langkah - langkahnya (jika tanpa eloquent) :

1. Membuat Folder dan Class Untuk Model

Pastikan koneksi ke database anda sudah benar (lihat di file .env). Lalu buat sebuah folder dengan nama Model (optional) dan buat satu file class php (nama_optional). Saya biasanya menamakan sebuah class diawali dari inisial untuk menandakan file ini bekerja di pattern (pola) yang mana, misal dengan pola MVC (Model, View, Controller) untuk model saya kasih inisial m_{nama model}, untuk controller c_{nama controller} dan view v_{nama view}.

contoh membuat folder dan class model laravel tanpa eloquent



2. Membuat Syntax Pada Class Model


Contoh syntax seperti gambar dibawah, yang perlu dperhatikan adalah :
  1. Penulisan direktori namespace, karena tadi kita buat classnya di dalam folder App dan Model  jadi penulisannya App\Model jika diletakan dalam App saja maka penulisannya hanya namespace App. Karena kalo dari sini sudah salah maka tidak bisa diakses di controller.
  2. Penulisan use, penggunaan syntax use digunakan untuk mengakses library yang ada di laravel, Karena kita butuhnya untuk mengakses database tanpa eloquent jadi kita ambil library DB.
  3. Penamaan class, pastikan nama class sama dengan nama file php yang kita buat dan karena kita tidak menggunakan eloquent tidak harus menambahkan extend model setelah nama class.
  4. Penulisan fungsi (method), pada penulisan method tersebut ada kata public agar class bisa dipanggil di semua class termasuk controller maupun view, static agar fungsi dapat dipanggil langsung terhadap classnya tanpa pembuatan objek baru misal {nama_kelas}::{nama_fungsi}, return  adalah nilai akhir yang dihasilkan dari fungsi tersebut. untuk penulisan query pada library DB kita bisa juga menggunakan query builder dari library DB tersebut contoh return DB::table('jenis_ibadah')->get();



contoh membuat model laravel tanpa eloquent


2. Memanggil Custom Model Lewat Controller
  1. Buat satu controller dengan nama c_ibadah dan jangan lupa untuk mengimport clas custom model yang tadi sudah kita bikin dengan mengisi syntax use App/Model/m_ibadah
  2. Untuk memanggilnya kita hanya perlu memanggil {nama_class}::{nama_method} kalau pada kasus diatas proses pemanggilannya m_ibadah::getAllIbadah()
  3. Tanda (::) digunakan seperti halnya dot (.) pada java atau .net untuk memanggil turunan dari class tersebut 
  4. nama method bisa langsung dipangil setelah penulisan class tanpa membuat objek terlebih dahulu karena pada pembahasan diatas kita membuat methodnya dalam bentuk static 
  5. Karena saya tidak membuat view maka untuk melihat tampilannya berhasil atau tidak saya render dalam bentuk json dan jangan lupa untuk mendeklarasikan routenya di routes/web.php dengan menulis Route::get('/showibadah', 'c_ibadah@show');

membuat-custom-model-sendiri-tanpa-atau-kombinasi-eloquent

3. Hasil
  1. Jalankan browser dengan mengetik link (localhost:8000/showibadah) karena saya menggunakan composer untuk menjalankan artisan laravelnya maka saya menggunakan port 8000
  2. Walahh.... Hasilnya terlihat seperti dibawah ini
hasil model tanpa menggunakan eloquent

Bagaimana jika kita kombinasikan dengan eloquent


1. Membuat Class Untuk Model


Buat kelas baru dengan nama optional untuk memisahkan antara kelas model yang dikombinasikan dengan Eloquent dan tidak menggunakan Eloquent. Disini saya membuat kelas baru dengan nama m_ibadah_eloquent. 

membuat folder dan class baru dengan eloquent

2. Membuat Syntax Pada Class Model

Contoh syntax seperti gambar dibawah, yang perlu dperhatikan adalah :
  1. Penulisan direktori namespace, karena tadi kita buat classnya di dalam folder App dan Model  jadi penulisannya App\Model jika diletakan dalam App saja maka penulisannya hanya namespace App. Karena kalo dari sini sudah salah maka tidak bisa diakses di controller.
  2. Penulisan use, penggunaan syntax use digunakan untuk mengakses library yang ada di laravel, Karena kita butuhnya untuk mengakses database dengan eloquent jadi kita ambil library Illuminate\Database\Eloquent\Model.
  3. Penamaan class, pastikan nama class sama dengan nama file php yang kita buat dan karena kita menggunakan eloquent jadi harus menambahkan extend model setelah nama class.
  4. Penulisan Atrribut Eloquent, kalian yang biasa menggunakan eloquent pastinya udah tau kan cara menuliskan attributnya diawali dengan protected {nama_attribut} bisa kalian pake seuai kebutuhan seperti $table, $primary_key, $fillable, $guarded dan lain-lain kalian bisa liat dokumen tasinya disini link. Dalam kasus ini saya menggunakan $table untuk menetukan tabel yang mana yang ingin dijadikan target dan $primary_key untuk menentukan target kolom mana sebagai primary key
  5. Penulisan fungsi (method), pada penulisan method tersebut ada kata public agar class bisa dipanggil di semua class termasuk controller maupun view, static agar fungsi dapat dipanggil langsung terhadap classnya tanpa pembuatan objek baru misal {nama_kelas}::{nama_fungsi}, return  adalah nilai akhir yang dihasilkan dari fungsi tersebut. untuk penulisan library eloquent kalian bisa menggunakan fungsi - fungsi yang telah disediakan oleh eloquent untuk diakases seperti all(), where(), count(), max(), min() dan lain - lain kalian bisa lihat dokumentasinya disini link. dalam kasus ini saya membuat fungsi dengan nama getSpesificIbadah dengan parameter $id_ibadah, fungsi eloquent yang digunakan where untuk mencari daftar ibadah dengan id_ibadah tertentu.


2. Memanggil Custom Model Lewat Controller
  1. Masuk ke conttroler c_ibadah (optional) yang sudah kamu buat tadi kemudian buat satu function dengan nama public function dengan nama showwitheloquent (optional) 
  2. Untuk memanggilnya sama seperti tadi kita hanya perlu memanggil {nama_class}:{nama_method} contoh m_ibadah_eloquent::getSpesificIbadah($parameter).
  3. Karena saya tidak membuat view maka untuk melihat tampilannya berhasil atau tidak saya render dalam bentuk json dan jangan lupa untuk mendeklarasikan routenya di routes/web.php dengan menulis Route::get('/showwitheloquent', 'c_ibadah@showwitheloquent').
3. Hasil
  1. Jalankan browser dengan mengetik link (localhost:8000/showibadah) karena saya menggunakan composer untuk menjalankan artisan laravelnya maka saya menggunakan port 8000
  2. Walahh.... Hasilnya terlihat seperti dibawah ini.
hasil model dengan kombinasi eloquent

Referensi :

https://stackoverflow.com/questions/23658479/laravel-custom-model-methods
https://laracasts.com/discuss/channels/laravel/how-can-i-use-db-facade-in-my-custom-class