Set validation rule message pada Yii Framework

Saat belajar IMK(Interaksi Manusia Komputer) kita di ajarkan untuk membuat sebuah aplikasi dengan bahasa yang konsisten. Artinya dalam aplikasi kita harus nya hanya menggunakan satu bahasa saja(Inggris saja/Indonesia saja/dll). Nah, dalam Yii framework bahasa default yang digunakan saat generate code untuk tampilan adalah bahasa Inggris. Okeh, kalo masalah tampilan saya kira kita bisa langsung saja edit di bagian view nya. Tapi untuk masalah pesan kesalahan?? Yah, ini sedikit berbeda. Berikut tips untuk melakukan setting membuat pesan kesalahan pada Yii framework:

Buka project/protected/models/modelYangDituju.php

Setelah itu temukan fungsi rules yang biasa kita gunakan untuk melakukan setting validasi.

	public function rules()
	{
		return array(
			array('level', 'required',
                               'message'=>'Nilai {attribute} harus terisi'),
			array('level', 'length', 'max'=>20,'min'=>5,
                              'tooLong'=>'Nilai {attribute} terlalu panjang',
			      , 'tooShort'=>'Nilai {attribute} terlalu pendek'),
			array('id, level', 'safe', 'on'=>'search'),
		);
	}

Terlihat disana saya menambahkan sedikit code pada masing-masing validasi nya. Yah, itu adalah code untuk melakukan setting pada pesan error nya.  Berikut penjelasannya:

  • (‘message’=>’pesan error’) = ini digunakan untuk menampilkan pesan error
  • (‘tooShort’=>’pesan error terlalu pendek’) = untuk validasi yang melibatkan panjang dari suatu karakter, kita deklarasikan dengan tooShort jika ingin menampilkan pesan bahwa nilai yang dimasukkan terlalu pendek.
  • (‘tooLong’=>’pesan error terlalu pendek’) = validasi untuk karakter yang terlalu panjang.
  • (‘tooBig’=>’Nilai terlalu besar’) = khusus inputan tipe numeric, ini digunakan untuk validasi angka yang terlalu besar.
  • (‘tooSmall’=>’Nilai terlalu besar’)  = khusus inputan tipe numeric juga, ini digunakan untuk validasi angkat yang terlalu kecil.
Oh iya, pada contoh code di atas ada code {attribute}, nah itu digunakan untuk mencetak otomatis nama attribute yang mengalami kesalah inputan..
Okeh… Selesai, selamat mencoba 😀
Semoga membantu…. 😀

[Yii framework] Cara Upload File

Sebelum kita bahas cara membuat fungsi upload file ke server, saya akan jelaskan bahwa bagaimana alur file yang kita upload akan disimpan di dalam database. Okeh, pada postingan ini,  file yang kita upload ke server tidaklah masuk ke dalam database, yang kita masukkan di dalam databse adalah PATH dari file tersebut. Ada cara dimana kita bisa menyimpan suatu file ke dalam database kita yaitu dengan menggunakan type BLOB(Binary Large Object). Dimana file yang akan disimpan ke dalam database akan di konversi terlebih dahulu ke dalam Binary file dan disimpan ke dalam database kita. Memang lebih simpel, tapi menyimpan nya langsung ke dalam database tidaklah baik. Karena menurut pengalaman saya, saat file nya ditampilkan file ny berubah :D. Contoh, saya pernah upload gambar, dan ketika gambar ny mau saya tampilin gambar ny berubah :D.

 

Okeh, udah panjang lebar kita bahas. Mari kita bahas cara coding ny di yii…

Pada models tempat penyimpanan path nya, beri batasan pada rules nya agar hanya data-data bertipe tertentu yang bisa di upload. Berikut cara membuat rules nya:

 public function rules()
    {
        return array(
            array('namaAttributFile', 'file', 'types'=>'jpg, gif, png, pdf'),
        );
    }

tinggal anda masukkan saja tipe file apa saja yang mau anda support untuk upload file nya..

nah, setelah itu kita buat di controller ny perintah untuk melakukan upload file nya. Pada contoh kali ini, saya melakukan upload file pada action “create”, begini contoh code nya:

 public function actionCreate()
    {
        $model=new NamaModel;
        if(isset($_POST['NamaModel']))
        {
            $model->attributes=$_POST['NamaModel'];
            $model->namaAttribute=CUploadedFile::getInstance($model,'namaAttribute');
            if($model->save())
            {
                $model->namaAttribute->saveAs('path/to/localFile');
                $this->redirect(array('view','id'=>$model->id));
            }
        }
        $this->render('create', array('model'=>$model));
    }

Nah, anda tinggal lakukan setting path posisi tempat anda ingin menyimpan file yang anda upload dan contoh di atas sudah bisa menjalankan perintah upload file nya…

Beberapa permasalahan klasik pada upload file adalah dimana kadang kita ingin mengubah nama file yang kita upload sesuai dengan kemauan kita. Dan biasa ny kita juga ingin path dari file yang kita simpan otomatis akan langsung mengarah ke path project kita.. Okeh untuk permasalahan seperti itu, silahkan anda rubah code pada action “create” nya menjadi seperti berikut:

	public function actionCreate()
	{
		$model=new NamaModel;

		if(isset($_POST['NamaModel']))
		{
			$model->attributes=$_POST['NamaModel'];
			$simpanSementara=CUploadedFile::getInstance($model,'namaAttribut');
			if($model->save())
			{
				$simpanSementara->saveAs(Yii::app()->basePath . 
                                              '/../namaFolder/' . $model->id.'.pdf');
				$this->redirect(array('view','id'=>$model->id));
			}
		}

		$this->render('create',array(
			'model'=>$model,
		));
	}

Penjelasan:

Pada contoh diatas, saya menyimpan file yang di upload ke dalam foleder : Project/namaFolder. Kunci nya ada pada kode ini:

 $simpanSementara->saveAs(Yii::app()->basePath . '/../namaFolder/' . $model->id.'.pdf');

Pada code tsb, terlihat bahwa kita melakukan penyimpanan file di dalam Project kita, dan di dalam folder “namaFolder”. Selain itu juga kita mengubah nama file yang kita upload sesuai dengan nama attribut “id” nya, dan kita simpan nama nya bertipe “.pdf”. Silahkan anda konfigurasi sendiri sesuai dg kemauan anda yak 😀

 

Eits.. belum selesai proses ny… kita masih harus edit tampilannya dulu gan 😀 …

Sekarang silahkan buka view nya, dan buka file “form.php”. Di bagian atas form tersebut, ubah code ny menjadi seperti berikut:

<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'laporan-form',
	'enableAjaxValidation'=>false,
        'htmlOptions'=>array('enctype'=>'multipart/form-data'),
)); ?>

Dan untuk merubah control “namaAttribut” agar nanti tampilannya kita tinggal klik dan langsung terbuka form yang menyuruh kita memilih folder, maka rubah code nya dari seperti ini:

<?php echo $form->textField($model,'namaAttribute',array('size'=>50,'maxlength'=>50)); ?>

Menjadi seperti ini:

<?php echo $form->fileField($model,'namaAttribute',array('size'=>50,'maxlength'=>50)); ?>

Selesai…

Silahkan anda coba langsung…

Semoga membantu 😀

Read XML dengan Language Integrated Query(LINQ) pada C#

Mungkin kebanyakan dari kita sudah terbiasa menggunakan SQL query untuk melakukan pengelolaan data. Tapi bagaimana jika kita dihadapkan dengan data dengan berupa format lain, pada kasus ini XML file… Yah, di .netframework sendiri sudah ada sebuah cara mudah membaca XML file yang query nya mirip-mirip dengan SQL query, cara tersebut disebut LINQ(Language Integrated Query). Untuk penjelasan LINQ silahkan anda searching di internet yak 😀 , saya disini akan mendemokan sedikit cara menggunakan LINQ untuk membaca XML file..

Okeh, pertama-tama buka visual studio anda, dan buat project baru..

Setelah itu buatlah sebuah file XML dengan cara klik kanan dan pilih new item lalu pilih xml file. Setelah itu isilah XML tersebut dg format seperti berikut:

<?xml version="1.0" encoding="utf-8" ?>
<Indonesia>
  <prov nama="Sumatera Selatan">
    <kota>Palembang</kota>
    <kota>Prabumulih</kota>
  </prov>
  <prov nama="Jawa Barat">
    <kota>Bogor</kota>
    <kota>Depok</kota>
    <kota>Bandung</kota>
  </prov>
  <prov nama="DKI Jakarta">
    <kota>Jakarta Timur</kota>
    <kota>Jakarta Barat</kota>
    <kota>Jakarta Selatan</kota>
    <kota>Jakarta Utara</kota>
  </prov>
</Indonesia>

Setelah itu rancanglah tampilan di Form1 dengan memasukkan 1 buah combobox dan 1 buah datagridview. Sebelumnya, tambahkan code berikut agar dapat menggunakan fitur-fitur LINQ untuk membaca XML file:

using System.Xml;
using System.Xml.Linq;
using System.IO;

Buat sebuah code yang mengarahkan pembacaan file pada file xml yang kita buat tadi :

XDocument data = XDocument.Load(Application.StartupPath + @"\..\..\indonesia.xml");

lalu buatlah sebuah fungsi yang berguna untuk memasukkan list nama-nama provinsi dari file XML :

        private void setCombo()
        {
            var prov = from a in data.Descendants("prov")
                       select a;
            foreach (var b in prov)
            {
                comboBox1.Items.Add(b.Attribute("nama").Value);
            }
            comboBox1.SelectedIndex = 0;
        }

Lalu buat sebuah fungsi yang memasukkan list-list kota-kota dari provinsi yang terpilih seperti berikut:

        private void setData()
        {
            dataGridView1.RowCount = 1;
            var prov = from a in data.Descendants("prov")
                       where a.Attribute("nama").Value == comboBox1.SelectedItem.ToString()
                       select a;

            var kab = from b in prov.Descendants("kota")
                      select b;

            int i = 0;
            foreach (var k in kab)
            {
                this.dataGridView1.RowCount++;
                this.dataGridView1[0, i].Value = k.Value;
                i++;
            }
        }

Lalu masukkan kedua fungsi tersebut di contructor, agar setiap form1 dibuka kedua fungsi tersebut dijalankan. Sehingga contructor nya akan menjadi seperti berikut:

 public Form1()
        {
            InitializeComponent();
            setCombo();
            setData();
        }

Lalu kita masukkan fungsi “setData()” di dalam event combobox_change agar setiap kita memilih provinsi baru, maka datagrid akan berganti isinya sesuai dengan provinsi yang terpilih. Sehingga menjadi seperti berikut:

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            setData();
        }

Selesai…

setelah selesai, maka tampilannya akan seperti berikut:

Selamat mencoba, semoga membantu… 😀

Anda bisa men download source code lengkapnya disini.

Mengetahui waktu proses pada C#

Berikut beberapa cara untuk mengetahui waktu berjalannya suatu proses di dalam sebuah program dalam C#.

Pertama-tama definisikan dulu :   using System.Diagnostics;

Lalu di baris program yang ingin kita ketahui waktu eksekusi ny, kita masukkan code beriktu:

            Stopwatch timerr = new Stopwatch();
            timerr.Start();
            {Code proses yang ingin dihitung waktunya}

            timerr.Stop();

 

Setelah dibuat code tersebut, program akan mencatat waktu yang digunakan saat melakukan proses di dalam program. Jika kita ingin melihat hasilnya(waktu proses), kita dapat menampilkannya dengan cara menampilkan nilai “timerr.Elapsed.ToString();”…

 

Selesai… Selamat mencoba,…

Somoga membantu 😀

Pengaturan halaman home pada user sebelum dan sesudah login pada yii framework

Pada beberapa kasus kadang aplikasi yang kita buat mengharuskan user login terlebih dahulu sebelum user bisa masuk ke dalam aplikasi tersebut. Maka dari itu kita harus melakukan pengaturan seperti berikut :

  • Jika user belum melakukan login, maka dia akan langsung disuguhkan halaman login saat memasuki web aplikasi tersebut.
  • Jika user sudah melakukan login, maka dia akan langsung disuguhkan halaman home.
Baik mari kita modifikasi aplikasi kita….
Pertama-tama silahkan buka controller yang menghandle halaman “login” dan “home” yaitu di “protected/controllers/SiteController.php”. Setelah itu tambahkan kode berikut di atas   “public function actions()”
	/**
	 * @return array action filters
	 */
	public function filters()
	{
		return array(
			'accessControl',
		);
	}

	/**
	 * Specifies the access control rules.
	 * This method is used by the 'accessControl' filter.
	 * @return array access control rules
	 */
	public function accessRules()
	{
		return array(
			array('allow',
				'actions'=>array('error','contact','login','captcha'),
				'users'=>array('*'),
			),
			array('allow',
				'actions'=>array('index','logout','update'),
				'users'=>array('@'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}

Selesai… Berikut  penjelasannya:

Mungkin anda terkejut melihat betapa singkatnya code yang kita tambahkan, sebagian dari anda juga mungkin berpikir bahwa kita akan mengotak-atik bagian views/model. Yah, dalam penjelasan di atas, kita hanya perlu melakukan manipulasi di kode controller. Kita cukup memberi hak akses pada masing-masing halaman yang akan di akses. Jadi kita cukup memberikan access rule pada halaman home dimana kita hanya mengizinkan halaman home hanya bisa di akses oleh user yang telah melakukan login. Jika user belum login, maka secara otomatis user akan dilempar ke halaman login…

Yak, selamat mencoba 😀 ….

Semoga membantu….

2 model 1 form… pada yii framework…

Pada beberapa kasus, terkadang ada masalah dimana kita harus menginput nilai dari 2 buah model/table dalam satu form. Tentu saja hal ini dapat kita lakukan dengan mudah di Yii framework. Berikut cara nya :

Pada postingan saya kali ini, saya akan asumsikan kita memiliki 2 buah table di dalam satu database, misal table “satu” dan table “dua”. Saya asumsikan nilai Primary key pada table “dua” adalah sama dengan nilai Primary key pada tabel “satu”. Dan nama attribute Primary Key nya adalah “id”.

Pertama-tama, kita harus membuat model pada masing-masing tabel yang ingin dimasukkan(tentu hal ini bisa kita lakukan dengan menggunakan gii untuk mempermudah :D). Setelah itu akan ada dua buah model, yaitu model “Satu” dan model “Dua”. Lalu dengan menggunakan gii, anda buat sebuah code operasi CRUD dengan menggunakan CRUD generator yg ada dalam fitur gii(ingat cukup salah satu CRUD saja, misal CRUD utk model “Satu” atau CRUD untuk model “Dua”). Dalam postingan ini saya akan membuat CRUD untuk model “Satu”.
Setelah itu akan terbentuk sebuah controller dari model “Satu” pada protected/controller, silahkan anda buka controller tersebut. Coba lihat function “actionCreate()”, anda akan melihat code seperti berikut:

		$model=new Satu;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Satu']))
		{
			$model->attributes=$_POST['Satu'];
			if($model->save())
				$this->redirect(array('view','id'=>$model->id));
		}

		$this->render('create',array(
			'model'=>$model,
		));

Nah, silahkan rubah code tersebut menjadi seperti berikut:

$model=new Satu;
		$model2=new Dua;

		// Uncomment the following line if AJAX validation is needed
		// $this->performAjaxValidation($model);

		if(isset($_POST['Satu'],$_POST['Dua']))
		{
			$model->attributes=$_POST['Satu'];
			$model2->attributes=$_POST['Dua'];

		        $valid=$model->validate();
		        $valid=$model2->validate() && $valid;

			if($valid)
			{
				if($model->save(false))  
				{  
					$model2->duasatu = $model->satusatu;  
					$model2->save(false);
					$this->redirect(array('view','id'=>$model->satusatu));
				}
			}	
		}

		$this->render('create',array(
			'model'=>$model,
			'model2'=>$model2,
		));

Penjelasan:

($model2=new Dua; ) ini maksud ny kita mendeklarasikan sebuah model baru yang kita ambil dari model “Dua”.

 $valid=$model->validate();
 $valid=$model2->validate() && $valid;

	if($valid)
	{
		if($model->save(false))  
		{  
			$model2->id = $model->id;  
			$model2->save(false);
			$this->redirect(array('view','id'=>$model->id));
		}
	}

Nah, $valid adalah sebuah variabel yang digunakan untuk mengecek apakah nilai yang di input oleh user di dalam form sudah memenuhi syarat dari validasi yang sudah kita tentukan. Sedangkan pernyataan yang ada di dalama “if($model->save(false))” berguna untuk melakukan penyamaan nilai Primary Key pada table “dua” sesuai dengan Primary Key pada table “satu”. Maksud dari “$model2->save(false)” adalah nilai dari model tersebut akan disimpan dalam database tanpa melakukan validasi terlebih dahulu, kenapa? karena hal tersebut sudah dilakukan pada “$valid”. Dan setelah disimpan ke dalam database, aplikasi akan langsung di arahkan ke tampilan view dari data yang sudah di masukkan tadi.. hal itu terlihat dari code “$this->redirect(array(‘view’,’id’=>$model->id));”.
Nah, sampai disini kita telah selesai membuat operasi untuk menyimpan data dari dua model yang berbeda, sekarang tinggal kita buat tampilan dari fungsi tersebut…

Membuat tampilan sendiri tidak bisa sembarangan, kita harus pastikan nilai yang ada pada tampilan harus terhubung ke model yang ada di controller tadi. Okeh, pertama-tama buka views dari operasi create yang ada pada “protected/satu/create.php”, lalu temukan code seperti beriktu: “renderPartial(‘_form’, array(‘model’=>$model)); ?>”. Setelah anda temukan, tambahkan sedikit code yang memanggil model “Dua”, sehingga akan menjadi seperti berikut:
“<!–?php echo $this->renderPartial(‘_form’, array(‘model’=>$model,’model2’=>$model2)); ?>”
Nah, model2 yang di tambahkan disana adalah nilai dari model2 yang sudah kita deklarasikan pada controller, sehingga kita bisa menghubungkan form dengan model “Dua”. Setelah itu, silahkan buka “protected/satu/_form.php”, di dalam nya mungkin akan tersedia beberapa tag html yang berguna sebagai inputan yang menampung nilai-nilai yang di masukkan user. Hanya saja disana hanya terdapat nilai inputan untuk model “Satu” saja. Nah, anda dapat menambahkan tag html untuk menampung nilai pada model “Dua” dengan cara menambahkan tag seperti berikut:

	<div class="row">
		<!--?php echo $form->labelEx($model2,'duadua'); ?>
		textField($model2,'duadua',array('size'=>30,'maxlength'=>30)); ?>
		error($model2,'duadua'); ?>
	</div>

Nah, disana anda bisa melihat pada masing-masing tag diberi $model2 yang artinya tag html tersebut dimiliki oleh model “Dua”. Sedangkan “duadua” adalah nama dari attribut pada table “Dua”.

Selesai, anda dapat mencoba melakukan operasi “Create” pada form itu….

Selamat mencoba…. semoga membantu… 😀

Pemecahan masalah PK tipe string pada yii

Pada yii, kita biasa menggunakan gii untuk menggenerate code pada model, view, controller, modul, dan form. Nah, salah satu hal yg sering kita lakukan dengan gii adalah melakukan generate code untuk operasi CRUD. Sialnya code operasi CRUD yg di generate oleh gii tidak selalu compatible dengan berbagai kondisi. Sebagai contoh,  jika kita membuat Primary Key dengan tipe numeric(angka), kita tidak akan menghadapi msalah dengan hasil code yang di generate dari gii. Tapi bila kita menggunakan primary key bertipe string(char,varchar, dll), maka kita akan mendapat masalah pada saat melakukan operasi “views” dan operasi “admin/manage”. Kenapa, karena pada code hasil generate gii, code tersebut akan mengenali suatu nilai dari PK nya dengan cara mengkonversi nilai PK ny ke dalam integer.. Bagaimana pemecahannya?? Ya, anda tinggal mengubah code yang ada pada folder protected/controllers/”controller yang anda tuju”, lalu ubah code “public function loadModel($id)” yang awal nya seperti berikut:

$model=MBahasa::model()->findByPk((int)$id);
if($model===null)
throw new CHttpException(404,’The requested page does not exist.’);
return $model;

rubah menjadi seperti berikut:

$model=MUnitKerja::model()->findByAttributes(array(‘nama attribut PK anda’=>$id));
if($model===null)
throw new CHttpException(404,’The requested page does not exist.’);
return $model;

Selesai, selamat mencoba… 😀

%d bloggers like this: