[Yii Framework]Auto Save Attribute

Salah satu hal yang sering terjadi pada saat kita ingin melakukan penyimpanan data ke dalam tabel adalah adanya satu attribut dalam tabel tersebut yang ingin kita simpan secara otomatis. Contoh, pada tabel “berita”, kita ingin menyimpan informasi “pengentri”(orang yang menginput berita) dengan cara aplikasi kita otomatis menyimpan informasi pengentri melalui informasi user yang sedang login di aplikasi kita..

Okeh, tentu saja hal itu bisa di lakukan di Yii Framework..  Pada postingan ini, saya akan lakukan dengan 2 cara yang berbeda. Okeh, mari kita bahas satu persatu:

1. Lewat Controller

Anda bisa melakukannya dengan cara menginsert code nya di dalam controller tepat nya di “function actionCreate()”. Berikut code nya:

	public function actionCreate()
	{
		$model=new NamaModel;
		if(isset($_POST['UserAdmin']))
		{
			$model->attributes=$_POST['NamaModel'];
			$model->pengentri=Yii::app()->user->getId();
			
			if($model->save())
				$this->redirect(array('view','id'=>$model->idModel));
		}
		$this->render('create',array(
			'model'=>$model,
		));
	}

Penjelasan : Disana bisa anda lihat saya menyisipkan satu baris code yang menyimpan attribut pengentry sesuai dengan “id” yang dimiliki oleh user yang sedang login, dengan begitu, user tidak perlu susah-susah menginput nilai “id” nya.

 

2. Lewat Model

Pada “model” ada sebuah fungsi “beforeSave()” dimana semua code yang terdapat di dalam tag “beforeSave()” tersebut akan dijalankan sesaat sebelum aplikasi kita melakukan penyimpanan data pada model tersebut. Dengan itu, anda dapat memanfaatkan “beforeSave()” tersebut untuk melakukan penyimpanan otomatis. Kurang lebih anda dapat menyisipkan code berikut di model anda:

	protected function beforeSave()
	{
		$this->pengentri=Yii::app()->user->getId();
	}

Dengan adanya code tersebut, sebelum program kita melakukan penyimpanan pada model yang kita tuju, ia akan melakukan penyisipan nilai yang informasi user yang login ke dalam attribut “pengentri” .

 

Selesai…. Selamat mencoba…

Semoga membantu 😀

[view] 2 model 1 form… pada yii framework…

Untuk proses create(insert) 2 table dari satu form, anda dapat melihatnya disini. Nah, disini yang akan saya bahas adalah bagaimana cara menampilkan 2 tabel dalam 1 form.

Pertama, pada controller nya pastikan terdapat dua fungsi yang mengembalikan nilai pada kedua model tersebut seperti berikut:

	public function loadModel($id)
	{
		$model=Satu::model()->findByAttributes(array('satusatu'=>$id));
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}
	
	
	public function loadModel2($id)
	{
		$model=Dua::model()->findByAttributes(array('duasatu'=>$id));
		if($model===null)
			throw new CHttpException(404,'The requested page does not exist.');
		return $model;
	}

Untuk “loadModel($id)” itu adalah fungsi yang dihasilkan otomatis pada saat yii framework menggenerate operasi CRUD. Fungsi loadModel itu sendiri akan mengembalikan sebuah nilai yang tabel yang memiliki PK=$id. Nah, karena kita disini akan memanggil juga tabel “Dua” maka kita harus sebuah fungsi yang mengembalikan nilai pada tabel “Dua”. Disinilah peranan dari fungsi “loadModel2($id)”, dimana fungsi tersebut akan mengembalikan nilai pada tabel “Dua” yang memiliki PK=$id.

Setelah itu, kita render nilai dari tabel “Satu” dan tabel “Dua” ke function actionView agar dapat ditampilkan. Code pada fungsi tampil akan menjadi seperti berikut:

	public function actionView($id)
	{
		$this->render('view',array(
			'model'=>$this->loadModel($id),
			'model2'=>$this->loadModel2($id),
		));
	}

Disana terlihat fungsi tersebut merender dua buah model, yaitu “model” dan “model2”. Setelah itu mari kita modifikasi file view nya yang terletak pada protected/views/namaModel/view.php.

Sebelum dilakukan perubahan, code pada halaman tersebut adalah sebagai berikut:

<?php $this->widget('zii.widgets.CDetailView', array(
	'data'=>$model,
	'attributes'=>array(
		'satusatu',
		'satudua',
	),
));

Code diatas hanyalah menampilkan tampilan pada tabel “Satu”, untuk menampilkan tampilan nilai dari tabel “Dua”, cukup anda tambahkan code berikut tepat di bawah code di atas:

$this->widget('zii.widgets.CDetailView', array(
	'data'=>$model2,
	'attributes'=>array(
		'duadua',
	),
));

Code di atas menunjukkan bahwa kita akan menampikan nilai atribut “duadua” pada tabel “Dua”.

Selesai…. Selamat mencoba…

Semoga membantu 😀 ….

Pengaturan sederhana Bing Map pada Windows Phone 7

Biasanya kita ingin mengkonfigurasi tampilan awal Bing map pada aplikasi kita. Berikut adalah beberapa pengaturan sederhana untuk melakukan pengaturan diantaranya pada koordinat mana peta kita akan berpusat, menampilkan tombol zoom in dan zoom out, dan pengaturan zoom default..

Sebelum nya, pastikan anda sudah menambahkan reference nya dengan System.Device. Lalu pada class nya tambahkan

using System.Device.Location;

😀

Ada 2 cara untuk melakukan pengaturan Bing Map pada WP7, satu lewat code nya langsung, dan satu lagi lewat code XAML form nya langsung. Baiklah, kita akan bahas satu persatu..

Yang pertama kita akan coba melakukan pengaturan lewat code di class nya langsung..

Buka mainpage.xaml.cs.

Berikut code untuk melakukan pengaturan Bing map:

            map1.Center = new GeoCoordinate(-2.99103520810604, 104.757377877831);
            map1.ZoomBarVisibility = Visibility.Visible;
            map1.ZoomLevel = 15;
  • Baris pertama digunakan untuk melakukan pengaturan koordinat default pada peta(koordinat di atas saya atur untuk menampilkan peta kota kelahiran saya, Palembang 😀 )
  • Baris kedua digunakan untuk menampilkan tombol zoom in dan zoom out
  • Baris ketiga untuk mengatur tingkat zoom pada peta.
Nah, sedangkan untuk pengaturan langsung lewat code XAML nya, anda bisa merubah tag XAML map nya menjadi seperti berikut:
     <my:Map Height="349" HorizontalAlignment="Left" Margin="9,6,0,0" Name="map1" 
           VerticalAlignment="Top" Width="441" CredentialsProvider="key api anda" 
           Center="-2.99103520810604, 104.757377877831" ZoomBarVisibility="Visible" 
           ZoomLevel="15" />

Selesai, hasil nya nanti akan menjadi seperti berikut:

Yak, disana terlihat peta kota Palembang dan menunjukkan sungai Musi dan Jembatan Ampera :D. Terlihat juga dua buah tombol untuk melakukan zoom in dan zoom out… Tentu anda dapat mencoba pengaturan-pengaturan lainnya. Yang saya paparkan di atas barulah segelintir saja..

Selamat bereksperimen…

Semoga membantu…

User Level Access Dinamis pada yii framework

Sebelumnya saya sudah buat  cara membuat level access rule disini dan disini. Hanya saja cara tersebut akan sangat sulit di lakukan untuk sebuah informasi user(khususnya pelevelan) yang berubah-ubah dan berskala besar. Contoh, misal kita membuat web site untuk suatu universitas, dimana kita hanya mengizinkan mahasiswa pada fakultas tersebut yang boleh mengakses informasi pada fakultas nya sendiri. Nah, sepertinya ga mungkin kita buat user level access nya satu persatu untuk masing-masing fakultas mengingat fakultas pada suatu universitas sangatlah banyak dan besar kemungknan bisa terjadi perubahan pada informasi. Nah, maka dari itu kita akan lakukan dengan cara lain yang dapat melakukan hal tersebut dengan lebih mudah dan cepat.

Pada setiap website, biasanya kita akan membuat sebuah level access untuk halaman “profile user” dimana hanya user tersebut lah yang bisa mengakses informasi tentang dirinya. Untuk menerapkan hal tersebut, kita tidak dapat menggunakan “function accessRule()”(kalo ada yg bisa mohon di share yak :D) untuk membuat batasannya, tetapi kita dapat melakukannya dengan mengedit controller nya tepatnya di function nya masing-masing. Tapi sebelumnya pastikan pada file “protected/components/UserIdentity.php” terdapat function “getId” yang mengembalikain “id” user yang telah login:

	private $_id;
	public function getId()
	{
		return $this->_id;
	}

Fungsi “getId()” tentu dapat anda modifikasi sesuai dengan kebutuhan masing-masing misal getFakultas(),getLevel(), getTerserah(), dll..

Lalu pada controller yang ingin diberikan level access rule nya, buatlah pada function yang ingin diberikan level access nya beberapa modifikasi code seperti berikut:

	public function actionView($id)
	{
		if(Yii::app()->user->getid()==$id)
		{	
			$this->render('view',array(
				'model'=>$this->loadModel($id),
			));	
		}
		else
		{
			$this->redirect(array('salah'));
		}
	}

Penjelasan:

Disana dapat anda lihat anda pernyataan “if(Yii::app()->user->getId()==$id)”, nah itu dilakukan untuk mengizinkan hanya user yang memiliki profil tersebutlah yang dapat mengakses halaman tersebut. Jika tidak, maka user akan dilemparkan ke sebuah halaman “salah” yang sudah anda buat sendiri 😀

Selesai, selamat mencoba…

Semoga membantu 😀 …

Membuat User Level Access pada yii[upgrade]

Sebelum nya saya sudah pernah posting bagaimana cara nya menerapkan user level access pada yii framework disini. Nah, disini saya akan membuat cara yang berbeda. Sebenarnya cara yang saya buat hanya sedikit memodifikasi beberapa hal pada postingan sebelumnya, tapi menurut saya yang ini lebih mudah untuk di buat dan di terpakan. Okeh, pertama-tama buatlah sebuah project yii framework. Setelah itu buatlah operasi CRUD pada tabel yang anda inginkan. Lalu di folder “protected/components” buatlah sebuah file dengan nama “EWebUser.php”. Setelah isi file tersebut dengan code seperti berikut:

<?php
class EWebUser extends CWebUser{
 
    protected $_model;
 
   protected function loadUser()
    {
        if ( $this->_model === null ) {
                $this->_model = MUser::model()->findByPk( $this->id );
        }
        return $this->_model;
    }
    
    function getLevel()
    {
        $user=$this->loadUser();
        if($user)
            return $user->level;
        return 100;
    }
}

Sebelumnya, pastikan di table user anda terdapat sebuah attribut yang digunakan untuk melakukan pe-level-an. Pada project saya sendiri saya memiliki sebuah attribut “level” pada tabel MUser. Dan jangan lupa code di atas harus anda modifikasi pada bagian “MUser” menjadi sesuai dengan nama tabel user anda. Dan setelah kode di atas telah anda buat, anda dapat membuat level access user nya dengan memberikan code berikut di controller yang anda tuju tepatnya di “function accesssRule()”:

array('allow', 
		'actions'=>array('index','view','create','update','admin','delete'),
		'expression'=>'$user->getLevel()<=1',
	),

Yah, dapat anda lihat disana saya membuat “<=” pada level access nya, itu bisa diterapkan karena kita mengambil nilai integer pada “getLevel()” nya. Jadi kita bisa membuat nya denga =,<=,<,>,>= yah silahkan anda bereksperimen…

 

Selesai, selamat mencoba…

Semoga membantu 😀

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 😀

%d bloggers like this: