[Yii Framework] Mudah Memainkan Database Anda dengan Active Record

Pada Yii Framework dikenal Active Record yang digunakan untuk mempermudah aplikasi berinteraksi dengan database. Yii sendiri sudah cukup jelas memaparkan penggunaan active record pada Yii Framework disini. Tapi saya akan ulas kembali lebih detail beberapa hal terkait cara penggunaan Yii Framework sendiri pada sebuah aplikasi. Saya sendiri akan membahas beberapa active record yang sangat sering saya gunakan dalam pembuatan aplikasi, diantaranya sebagai berikut:

Misal saya memiliki sebuah database dengan tabel “biodata”. Tabel “biodata” sendiri memiliki attribute sebagai berikut:

  1. id : Primary Key, Integer, Auto Increment
  2. nama : varchar(100)
  3. alamat : text il
Tabel tersebut saya input data seperti berikut:
             |   id    |     nama         | alamat                    |
             |    1     |   Joko            | Palembang           |
             |    2    |    Ali                | Jakarta                  |
             |    3    |     Joko           | Papua                     |
             |     4    |   Mahmud    |  Palembang          |
             |     5    |   Ga tahu       | Ga tahu juga        |
  • FindByPk() : Digunakan untuk menemukan data yang memiliki Primary Key tertentu.
contoh penggunaan :
$itu=Biodata::model()->findByPk(2);

Code di atas akan mengembalikan sebuah nilai dari tabel biodata yang memiliki “id” 2. Untuk menampilkan hasil nya, anda dapat gunakan code seperti berikut:

echo $itu->id; (untuk menampilkan id nya)
echo $itu->nama; (untuk menampilkan nama nya)
echo $itu->alamat; (untuk menampilkan alamatnya)
  • FindByAttributes(): Digunakan untuk menemukan data yang memiliki attribute tertentu.
contoh penggunaan :
$itu=Biodata::model()->findByAttributes(array('nama'=>'Ali')); atau bisa juga
$itu=Biodata::model()->findByAttributes(array('nama'=>'Joko','alamat'=>'Palembang'));

Sedangkan tata cara untuk menampilkannya sama saja dengan yang digunakan pada ‘findByPk()’

 

  • FindAllByAttributes() : Digunakan untuk menemukan data yang memiliki attribute tertentu, tapi data yang di hasilkan lebih dari 1 row data.
contoh penggunaan :
$itu=Biodata::model()->findAllByAttributes(array('nama'=>'Joko'));

Dari code di atas, akan dihasilkan 2 buah row data. Yaitu data dengan ‘id’ 1 dan 3, itu karena kedua nya memiliki ‘nama’ Joko. Karena data yang dihasilkan lebih dari 1, maka cara menampilkannya pun harus 1 per 1. Berikut tata cara untuk menampilkan data nya:

foreach($itu as $i=>$ii)
{
      echo $ii->id;
      echo $ii->nama;
      echo $ii->alamat;
}

 

  • Menggunakan ‘scopes’
Penggunaan scopes digunakan saat kita membutuhkan sebuah query yang sama berulang-ulang pada suatu aplikasi. Hal ini dimaksud untuk mempermudah dan mempersingkat aktivitas coding kita :D. Contoh penggunaan :
    public function scopes()
    {
        return array(
            'panggilJoko'=>array(
                'condition'=>'nama=Joko',
                'limit'=>5,
            ),
        );
    }
Letakkan kode di atas pada “model” bersangkutan. Kode tersebut jika dipanggil akan menghasilkan semua data dengan nama “Joko” dimana maksimal yang di tampilkan adalah 5 buah data. Berikut contoh code untuk menggunakan fungsi tersebut dan menampilkan data yang dihasilkan dari fungsi tersebut :
$itu=Biodata::model()->panggilJoko()->findAll();
//berikut untuk menampilkan nya
foreach($itu as $i=>$ii)
{
      echo $ii->id;
      echo $ii->nama;
      echo $ii->alamat;
}
  • Menggunakan ‘scopes’ dengan parameter
Pada fungsi yang ada di atas, kita memanggil sebuh query yang sudah kita tetapkan kondisi nya. Misal ‘nama=Joko’, bagaimana bila kita ingin membuat banyak kondisi dimana nama nya bisa kita ubah-ubah setiap saat kita memanggil fungsi tersebut. Tentu kita harus mengubah fungsi tersebut menjadi dinamis dengan cara memberikan parameter pada fungsi tersebut. Berikut cara untuk menggunakannya:
Masukkan code berikut pada ‘model’ bersangkutan:
public function panggilSiapa($nama=Joko)
{
    $this->getDbCriteria()->mergeWith(array(
        'condition'=>'nama='.$nama,
        'limit'=>4,
    ));
    return $this;
}
Kode di atas akan mengembalikan semua data pada tabel biodata yang memiliki nama sesuai dengan kita mau. Tapi bila kita tidak mengisi parameter nama sesuai yang dimaksud, maka code tersebut akan menghasilkan data yang memiliki nama “Joko”(default nya adalah “Joko”). Berikut cara menggunakan fungsi tersebut beserta cara menampilkannya:
$itu=Biodata::model()->panggilSiapa()->findAll(); //mengembalikan semua data dengan nama Joko
$itu=Biodata::model()->panggilSiapa('Ali')->findAll();  //mengembalikan semua data dengan nama Ali

Sedangkan cara menampilkan data nya adalah sebagai berikut:

foreach($itu as $i=>$ii)
{
      echo $ii->id;
      echo $ii->nama;
      echo $ii->alamat;
}
Sebenarnya masih ada banyak Active Record yang tidak saya paparkan 1 per 1 disini, seperti findBySql,findAllBySql, dll.. Anda dapat menggali sendiri penggunaan lainnya. Tapi 1 hal yang perlu anda ingat,
Penggunaan Active Record lebih lambat dari menggunakan SQL query secara langsung ke database. Hal ini sudah dijelaskan langsung dari Yii Framework disini.
Jadi tentukan kebutuhan anda sendiri kapan anda harus menggunakannya atau tidak…
Selamat mencoba…
Semoga membantu…. 😀

[Yii Framework] How to Restore MySql Database

Berikut step-step melakukan restore SQL pada Mysql database:

  • Download sebuah class untuk restore mysql database disini.
  • Setelah itu, extract hasil downloadan tadi ke folder “protected/extensions/” simpan class ny di dalam folder misal “rest”. Jadi akan ada file “mysql_restore.class.php” di folder “protected/extensions/rest”
  • Lalu kita mulai coding…
Buatlah sebuah model dengan nama “Rst” misal, lalu masukkan code berikut:
<?php
class Rst extends CFormModel
{
	public $filee;
	public function rules()
	{
		return array(
			array('filee', 'required'),
			array('filee', 'file','types'=>'sql','message'=>'File Harus Format .sql'),
		);
	}

	public function attributeLabels()
	{
		return array(
			'filee'=>'Cari File',
		);
	}
}

Model di atas kita buat untuk mendefinisikan form yang akan di tampilkan beserta validasi nya. Di atas saya mendefinisikan attribut “filee” dimana attribute tersebut merupakan sebuah attribute yang bisa menangkap sebuah file. Dimana file yang di upload harulah memiliki extensi  “.sql”.

Lalu buat sebuah controller dengan nama “RstController.php” misal. Dan isi code berikut:

<?php
Yii::import('application.extensions.*');
require_once('rest/mysql_restore.class.php');
class RstController extends Controller
{
	public function filters()
	{
		return array(
			'accessControl',
		);
	}
	
	public function accessRules()
	{
		return array(
			array('allow',
				'actions'=>array('restore'),
				'users'=>array('*'),
			),
			array('deny',  // deny all users
				'users'=>array('*'),
			),
		);
	}
	
	
	public  function actionRestore()
	{
		$model=new Rst;
		
		if(isset($_POST['Rst']))
		{
			$model->attributes=$_POST['Rst'];
			$models=CUploadedFile::getInstance($model,'filee');
			
			$path='/../12345.sql';
			$models->saveAs($path);
				
			$restore_obj = new MySQL_Restore();
			$restore_obj->server = 'localhost';
			$restore_obj->username = 'root';
			$restore_obj->password = '';
			$restore_obj->database = 'shp0';
			
			if (!$restore_obj->Execute( $path,MSR_FILE,true, false))
			{
  				die($restore_obj->error);
			}
			unlink($path);
			
  			$cs = Yii::app()->clientScript;
  			$cs->registerScript('my_script', 'if(confirm("Data Sukses Disimpan di Database!"))
  			window.location.href="index.php";
  			', CClientScript::POS_READY);
			
		}
		$this->render('rst',array(
			'model'=>$model,
		));
	}
}

Penjelasan : Code di atas akan mengupload sebuah file yang telah kita pilih, lalu program akan membaca file tersebut.  Pada code di atas juga  kita akan mengeset informasi database yang akan kita restore. Bisa anda lihat disana ada informasi “server”,”username”,”password”, dan “database”. Yah, jelas anda harus menyesuaikan code tersebut dengan code anda :D.. Setelah itu program akan membaca file yang sudah dipilih untuk me restore sesuai database yang kita miliki. Setelah semua data sudah di restore, program akan menghapus kembali file yang sudah di upload tadi…

 

Kemudian pada view, buat sebuah file view “rst.php” misal, dan isi dengan code berikut:

<?php
$this->breadcrumbs=array(
	'Upload Data',
);
?>
<h1>Upload Data Anda</h1>
<div class="form">

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

	<?php echo $form->errorSummary($model); ?>

	<div class="row">
		<?php echo $form->labelEx($model,'filee'); ?>
		<?php echo $form->fileField($model,'filee',array('size'=>60,'maxlength'=>255)); ?>
		<?php echo $form->error($model,'filee'); ?>
	</div>

	<div class="row buttons">
		<?php echo CHtml::submitButton('Save'); ?>
	</div>
<?php $this->endWidget(); ?>
</div>

Lalu jalankan program anda pada http://localhost/namaProject/index.php?r=rst/restore. Lalu pilih file SQL yang ingin anda restore..

Jika code anda sudah benar, maka program akan merestore database anda..

Selesai… Selamat mencoba..

Semoga membantu… 😀

[Yii Framework] Otak-Atik CGridView, Menambahkan Link

Berikut cara menambahkan link pada CGridView:

Misal awal ny kita punya CGridView seperti berikut:

<?php $this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'namatabel-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		'attribut1',
		'attribut2',
		'attribut3',
	),
)); ?>

Lalu kita ingin membuat “attribut3” menjadi sebuah link yang jika di klik akan mengarah ke sebuah link. Maka anda ubah code di atas seperti berikut:

<?php $this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'namatabel-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		'attribut1',
		'attribut2',
		array(
			'name'=>'Nama Attribut',
			'type'=>'raw',
			'value'=>'Chtml::link('tulisan yang akan tampil',array(\'namaModel/namaAction\',\'id\'=>$data->attribut3))',
		),
	),
)); ?>

Jika code anda sudah benar, maka dia akan menampilkan link pada attribut tersebut..

Selesai.. Selamat mencoba..

Semoga membantu… 😀


[Yii Framework] Integrasi Chart dan Database dengan Highchart

Menyambung postingan saya sebelumnya disini dimana saya sudah mencontohkan step-step untuk membuat chart. Pada postingan kali ini saya akan paparkan bagaimana caranya untuk menghubungkan chart yang kita buat dengan database..

Okeh, pertama saya asumsikan saya memiliki tabel “profile”, dimana tabel tersebut memiliki attribut sebagai berikut:

  • id : Primary key, integer, auto increment
  • nama : varchar(30)
  • jenisKelamin: enum(“Laki-laki, Perempuan”);
Anggaplah saya sudah menginput ke dalam data tersebut beberapa informasi untuk tabel tersebut. Lalu saya akan membuat jumlah pengguna berdasarkan jenis kelaminnya dengan menggunakan chart, yaitu pie chart dan bar chart. Okeh berikut step-step nya:
Pertama buatlah sebuah action di controller anda seperti berikut:
	public function  actionStus()
	{
		$sql='SELECT count(id),jenisKelamin FROM profile GROUP BY jenisKelamin';
		
		$dataProvider=new CSqlDataProvider($sql,array(
                            'keyField' => 'id',
		));
		$this->render('stus',array(
			'dataProvider'=>$dataProvider,
		));
	}

Penjelasan : kode di atas akan mengembalikan jumlah pengguna berdasarkan jenis kelaminnya.

Lalu buatlah sebuah file view “stus.php” yg isinya sebagai berikut jika anda ingin menampilkan datanya berupa bar chart:

<?php
$this->breadcrumbs=array(
	'Chart'=>array('index'),
	'Statistik Pengguna',
);

<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'tinstrument-form',
	'enableAjaxValidation'=>false,
)); ?>
<center>
?>
<?php
$label=array();
$nilai=array();

foreach($dataProvider->getData() as $i=>$ii)
{
    $label[$i]=$ii['aa'];
    $nilai[$i]=(int)$ii['count(id)'];
}

$this->widget('application.extensions.highcharts.HighchartsWidget', array(
   'options'=>array(
     'chart'=> array('defaultSeriesType'=>'column',),
      'title' => array('text' => ''),
      'legend'=>array('enabled'=>false),
      'xAxis'=>array('categories'=>$label,
			'title'=>array('text'=>''),),
      'yAxis'=> array(
            'min'=> 0,
            'title'=> array(
            'text'=>'Jumlah'
            ),
        ),
      'series' => array(
         array('data' => $nilai)
      ),
      'tooltip' => array('formatter' => 'js:function(){ return "<b>"+this.point.name+"</b> :"+this.y; }'),
      'tooltip' => array(
		'formatter' => 'js:function() {return "<b>"+ this.x +"</b><br/>"+"Jumlah : "+ this.y; }'
      ),
      'plotOptions'=>array('pie'=>(array(
                    'allowPointSelect'=>true,
                    'showInLegend'=>true,
                    'cursor'=>'pointer',
                )
            )                       
        ),
      'credits'=>array('enabled'=>false),
   )
));

?>
</center>
<?php $this->endWidget(); ?>

Sedangkan jika ingin menampilkannya dalam bentuk pie chart, anda dapat membuat code ny sebagai berikut:

<?php
$this->breadcrumbs=array(
	'Chart'=>array('index'),
	'Statistik Pengguna',
);

<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'tinstrument-form',
	'enableAjaxValidation'=>false,
)); ?>
<center>
?>
<?php

$bb=array();
foreach($dataProvider->getData() as $i=>$ii)
	$bb[$i]=array($ii['aa'],(int)$ii['count(id)']);

$this->widget('application.extensions.highcharts.HighchartsWidget', array(
   'options'=>array(
      'series' => array(
         array('type'=>'pie',
               'data' => $bb
              )
      ),
      'title'=>'',
      'tooltip' => array(
		'formatter' => 'js:function(){ return "<b>"+this.point.name+"</b> :"+this.y; }'
      ),
      'plotOptions'=>array('pie'=>(array(
                    'allowPointSelect'=>true,
                    'showInLegend'=>true,
                    'cursor'=>'pointer',
                )
            )                       
        ),
      'credits'=>array('enabled'=>false),
   )
));

?>
</center>
<?php $this->endWidget(); ?>

Jika kode yang anda masukkan sudah benar, maka anda akan melihat tampilan seperti berikut:

Bar Chart:

Pie Chart :

Okeh, selesai.. Silahkan anda coba dan modifikasi dengan kebutuhan anda…

Selamat mencoba..

Semoga membantu… 😀

[Yii Framework] Membuat Entry Data One to Many Relation dengan Tabel Dinamis

Pastinya banyak sekali kasus dimana kita diharuskan membuat form entry data yang dimana tabel nya memiliki hubungan one to many. Nah, biasanya untuk mempermudah user, kita membuat form entry data terebut menjadi sebuah tabel dinamis seperti gambar berikut:

Yah, bisa anda lihat disana dimana kita harus menginput sebuah data Kelas sekaligus murid-murid yang ada di dalam kelas tersebut.

Sebenarnya postingan ini adalah sedikit pengembangan pada postingan sebelumnya, jadi akan lebih baik jika anda membaca postingan sebelumnya terlebih dahulu :D. Okeh, langsung saja.. Sama seperti postingan sebelumnya, saya akan menjelaskan dulu definisi tabel-tabel yang saya gunakan pada postingan ini.

Saya disini menggunakan 2 buah tabel, tabel “Kelas” dan tabel “Murid”, berikut penjelasannya :

Tabel Kelas :

  • id : integer, Primary key, auto increment
  • namaKelas : varchar(10)
  • waliKelas : varchar(30)
Tabel Murid :
  • id: integer, Primary Key, auto increment
  • nama : varchar(50)
  • jk: varchar(10)
  • kelas : integer, Foreign Key tabel “kelas” attribute “id”
Mari kita mulai coding..
Pertama-tama lakuakan generate code Model dan CRUD kedua tabel tersebut dengan gii. Lalu download lah extension JAppendo disini. Extract dan letakkan pada folder “protected/extensions”. Sekarang buka “protected/controllers/KelasController.php”, lalu lakukan modifikasi pada code actionCreate menjadi seperti berikut:
	public function actionCreate()
	{
		$model=new Kelas;
		$model2=new Murid;

		if(isset($_POST['Kelas']))
		{
			$model->attributes=$_POST['Kelas'];
			if($model->save())
			{
				if(isset($_POST['nama']))
				{
					$total = count($_POST['nama']);
		    		for ($i = 0; $i <= $total; $i++)
		    		{
		    			if(isset($_POST['nama'][$i]))
		    			{
		     				$jiakakak = new Murid;
		     				$jiakakak->kelas=$model->id;
		        			$jiakakak->nama = $_POST['nama'][$i];
		        			$jiakakak->jk = $_POST['jk'][$i];
		         			$jiakakak->save();
		    			}	
					}
					$this->redirect(array('view','id'=>$model->id));
				}
			}
		}

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

Penjelasan : Code di atas adalah code yang akan melakukan penyimpanan pada data baik data “Kelas” maupun data “Murid”. Disana terlihat saya melakukan perulangan pada penyimpanan tabelnya. Itu karena kita melakukan penyimpanan banyak data pada tabel “Murid”, sedangkan pada tabel “kelas” kita hanya melakukan penyimpanan 1 data saja. Lalu saya membuat attribut “kelas” pada tabel “Murid” tidak di input 1 per 1, melainkan langsung mengikuti semua “kelas” yang sudah di input di atas. Jadi nginput kelasnya cukup 1 kali aja dan itu akan mengarah ke semua murid yang di input di bawah nya..

Nah, kalo tabel yang anda gunakan berbeda attribut-attribut nya dengan yang saya paparkan, silahkan anda sesuaikan yak.. 😀

okeh, next step.. Buatlah sebuah file .php di protected/extensions/appendo/views/. Kasih nama  “jiakak”, jadi akan ada tabel jiakak.php di dalam folder tersebut. Lalu isi file tersebut dengan code berikut:

<table class="appendo-gii" id="<?php echo $id ?>">
	<thead>
		<tr>
			<th>Nama </th><th>Jenis Kelamin</th>
		</tr>
	</thead>
	<tbody>
    <?php if ($model->nama == null): ?>
		<tr>
			<td><?php echo CHtml::textField('nama[]','',array('style'=>'width:120px')); ?></td>
            <td>
            <?php echo CHtml::dropDownList('jk[]',"string",
                array(
                    "Laki-laki"=>"Laki-laki",
                    "Perempuan"=>"Perempuan",
                ),array('style'=>'width:100px'));
            ?>
            </td>
		</tr>
    <?php else: ?>
        <?php for($i = 0; $i < sizeof($model->nama); ++$i): ?>
    		<tr>
    			<td><?php echo CHtml::textField('nama[]',$model->nama[$i],array('style'=>'width:120px')); ?></td>
                <td>
                <?php echo CHtml::dropDownList('jk[]',$model->jk[$i],
                    array(
						"Laki-laki"=>"Laki-laki",
						"Perempuan"=>"Perempuan",
					),array('style'=>'width:100px'));
                ?>
                </td>
            </tr>
        <?php endfor; ?>
		<tr>
			<td><?php echo CHtml::textField('nama[]','',array('style'=>'width:120px')); ?></td>
            <td>
            <?php echo CHtml::dropDownList('jk[]',"string",
                array(
						"Laki-laki"=>"Laki-laki",
						"Perempuan"=>"Perempuan",
					),array('style'=>'width:100px'));
            ?>
            </td>
		</tr>
    <?php endif; ?>
	</tbody>
</table>

Penjelasan : code di atas adalah code untuk melakukan pengaturan attribut sesuai dengan tabel “Murid”. Saya disana memasuki attribute “nama” dan “jk” sesuai dengan yang ada pada database saya tadi. Tapi saya tidak memasukkan attribute “id” dan “kelas”, kenapa?? untuk attribute “id”, dia adalah attribtue dengan auto increment yang artinya attribute tersebut akan di input secara otomatis dari database, jadi ga perlu di input. Sementara attribute “kelas”, saya akan mengambil nilai nya dari inputan lain, jadi ga saya masukin biar ga nginput 1 per 1 nilainya.. 😀 . Lagi-lagi jika tabel anda berbeda dengan yang saya miliki, silahkan anda modifikasi sesuai dengan attribute yang ada di tabel anda :D…

Lalu buka “protected/views/kelas/_form.php”, tambahkan sebuah attribute seperti berikut:

	<div class="row">
	    <?php $this->widget('application.extensions.appendo.JAppendo',array(
        	'id' => 'repeateEnum',        
        	'model' => $model2,
        	'viewName' => 'jiakak',
        	'labelDel' => 'Remove Row',
       		// 'cssFile' => 'css/jquery.appendo2.css'
    	)); ?>
    </div>

Sehingga code lengkap pada “_form.php” nya akan menjadi seperti berikut:

<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'kelas-form',
	'enableAjaxValidation'=>false,
)); ?>

	<p class="note">Fields with <span class="required">*</span> are required.</p>

	<?php echo $form->errorSummary($model); ?>

	<div class="row">
		<?php echo $form->labelEx($model,'namaKelas'); ?>
		<?php echo $form->textField($model,'namaKelas',array('size'=>10,'maxlength'=>10)); ?>
		<?php echo $form->error($model,'namaKelas'); ?>
	</div>

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

	<div class="row">
	    <?php $this->widget('application.extensions.appendo.JAppendo',array(
        	'id' => 'repeateEnum',        
        	'model' => $model2,
        	'viewName' => 'jiakak',
        	'labelDel' => 'Remove Row',
       		// 'cssFile' => 'css/jquery.appendo2.css'
    	)); ?>
    </div>

	<div class="row buttons">
		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
	</div>
<?php $this->endWidget(); ?>
</div>

Penjelasan : code di atas adalah form input yang akan di tampilkan. Disana saya menambahkan sebuah control tabel dinamis yang digunakan untuk melakukan input data dengan tabel dinamis yang bisa kita tambahkan dan kurangi sesuka hati :D.

Nah, jika anda sudah berhasil melakukan proses di atas..Harusnya anda sudah bisa melakukan input data dengan menggunakan tabel dinamis. Terakhir mari kita poles tampilan untuk menampilkan datanya agar lebih enak dilihat. Bukalah “protected/views/kelas/view.php”, lalu edit menjadi seperti berikut:

<?php
$this->breadcrumbs=array(
	'Kelases'=>array('index'),
	$model->id,
);

$this->menu=array(
	array('label'=>'List Kelas', 'url'=>array('index')),
	array('label'=>'Create Kelas', 'url'=>array('create')),
	array('label'=>'Update Kelas', 'url'=>array('update', 'id'=>$model->id)),
	array('label'=>'Delete Kelas', 'url'=>'#', 'linkOptions'=>array('submit'=>array('delete','id'=>$model->id),'confirm'=>'Are you sure you want to delete this item?')),
	array('label'=>'Manage Kelas', 'url'=>array('admin')),
);
?>

<h1>View Kelas #<?php echo $model->id; ?></h1>

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

<?php $this->widget('zii.widgets.grid.CGridView', array(
	'dataProvider'=>$murid,
	'columns'=>array(
		'id',
		'nama',
		'jk',
		 array(
            'name'=>'Kelas',
            'value'=>'Kelas::model()->findByPk($data->kelas)->namaKelas',
        ),
	),
)); ?>

Lalu jangan lupa di KelasController, tepatnya di actionView, edit code ny menjadi seperti berikut:

public function actionView($id)
	{
		$kelas=Murid::model()->findByAttributes(array('kelas'=>$id));
                $haha=new CDbCriteria;
                $criteria=new CDbCriteria;
                $criteria->compare('kelas',$id);
 
                $murid=new CActiveDataProvider('Murid',
                     array('criteria'=>$criteria,)
                );
		$this->render('view',array(
			'model'=>$this->loadModel($id),
			'murid'=>$murid,
		));
	}

Dan anda akan lihat hasilnya seperti berikut:

Hohohoho….

Selesai… Selamat mencoba… dan lagi-lagi pesan saya… silahkan anda modifikasi code di atas sesuai tabel anda…

Semoga membantu… 😀

[Yii Framework] Membuat Entry Data Tabel Dinamis dengan JAppendo

Apa anda perlu membuat sebuah form entri data dengan menggunakan tabel dinamis yang bisa ditambah dan dikurangi seperti gambar berikut:

Biasa nya kita harus menggunakan cukup banyak code jquery yang kita rancang sendiri untuk membuat form serupa. Tapi ada sebuah solusi yang cukup bagus untuk melakukan ini.. yaitu dengan menggunakan extension JAppendo.  Dan saya akan paparkan step-step menggunakan JAppendo disini..

Okeh, step pertama.. Tentu saja download extension Jappendo tersebut dari link yang sudah saya berikan, lalu pindahkan ke folder “namaProject/protected/extensions”.

Biar seragam dan mudah di mengerti, saya akan jelaskan dulu tentang database dan tabel yang saya gunakan disini.

Saya memiliki sebuah tabel bernama “hahaha”  dimana attribut-attribut nya adalah sebagai berikut:

  • id: integer, Primary Key, Auto Increment
  • nama : varchar, panjang=100
  • nilai : integer
  • jk: varchar , panjang = 30
Nah, setelah itu saya lakukan generate Model dan CRUD tentunya.
Sekarang pada “protected/views/hahaha/_form.php”, rubah semua code nya hingga menjadi seperti berikut:
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'hahaha-form',
	'enableAjaxValidation'=>false,
)); ?>
    <div class="row">
	    <?php $this->widget('application.extensions.appendo.JAppendo',array(
        	'id' => 'repeateEnum',        
        	'model' => $model,
        	'viewName' => 'hihihi',
        	'labelDel' => 'Remove Row',
       		// 'cssFile' => 'css/jquery.appendo2.css'
    	)); ?>
    </div>
	<div class="row buttons">
		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
	</div>
<?php $this->endWidget(); ?>
</div>

Penjelasan :

Disana saya memanggil sebuah extension JAppendo yang mengacu pada model hahaha(‘model’=>$model) dan memanggil tampilan “hihihi”(‘viewName’=>’hihihi’).

Nah, mungkin anda bingung apa maksud dari memanggil tampilan ‘hihihi’ ??  Sekarang silahkan anda buka “protected/extensions/appendo/views” lalu di dalam folder tersebut buatlah sebuah file .php dengan nama ”hihihi’ sehingga akan ada sebuah file “hihihi.php” di dalamnya. Lalu isi code nya menjadi seperti berikut:

<table class="appendo-gii" id="<?php echo $id ?>">
	<thead>
		<tr>
			<th>Nama </th><th>Nilai</th><th>Jenis Kelamin</th>
		</tr>
	</thead>
	<tbody>
    <?php if ($model->nama == null): ?>
		<tr>
			<td><?php echo CHtml::textField('nama[]','',array('style'=>'width:120px')); ?></td>
            <td><?php echo CHtml::textField('nilai[]','',array('style'=>'width:90px')); ?></td>
            <td>
            <?php echo CHtml::dropDownList('jk[]',"string",
                array(
                    "Laki-laki"=>"Laki-laki",
                    "Perempuan"=>"Perempuan",
                ),array('style'=>'width:100px'));
            ?>
            </td>
		</tr>
    <?php else: ?>
        <?php for($i = 0; $i < sizeof($model->nama); ++$i): ?>
    		<tr>
    			<td><?php echo CHtml::textField('nama[]',$model->enum_name[$i],array('style'=>'width:120px')); ?></td>
                <td><?php echo CHtml::textField('nilai[]',$model->enum_value[$i],array('style'=>'width:90px')); ?></td>
                <td>
                <?php echo CHtml::dropDownList('jk[]',$model->enum_type[$i],
                    array(
						"Laki-laki"=>"Laki-laki",
						"Perempuan"=>"Perempuan",
					),array('style'=>'width:100px'));
                ?>
                </td>
            </tr>
        <?php endfor; ?>
		<tr>
			<td><?php echo CHtml::textField('nama[]','',array('style'=>'width:120px')); ?></td>
            <td><?php echo CHtml::textField('nilai[]','',array('style'=>'width:90px')); ?></td>
            <td>
            <?php echo CHtml::dropDownList('jk[]',"string",
                array(
						"Laki-laki"=>"Laki-laki",
						"Perempuan"=>"Perempuan",
					),array('style'=>'width:100px'));
            ?>
            </td>
		</tr>
    <?php endif; ?>
	</tbody>
</table>

Penjelasan : pada hihihi.php saya mendefinisikan variabel-variabel yang akan ditampilkan pada tabel dinamis nya nanti. Disana terliha ada variabel “nama”,”nilai”, dan “jk”. Sedangkan variabel “id” sendiri tidak ada dikarenakan “id” merupaka Auto Increment yang artinya nilainya akan diisi secara otomatis oleh database.

Jika anda sudah selesai melakukan langkah di atas, anda akan melihat tampilan dari “hahaha/create” sudah menampilkan sebuah tabel yang bisa anda tambah dan anda kurangi panjang tabelnya..

Hanya saja walau sudah dapat menampilkan tabel nya, tapi code-code tersebut belum mengizinkan dilakukannya penyimpanan semua variabel yang sudah di input.. Untuk memungkinkan penyimpanannya, mari kita lakukan modifikasi pada controller nya, yaitu HahahaController, tepatnya di actionCreate hingga menjadi seperti berikut:

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

		if(isset($_POST['nama']))
		{
			$total = count($_POST['nama']);
		    for ($i = 0; $i <= $total; $i++)
		    {
		    	if(isset($_POST['nama'][$i]))
		    	{
		     		$jiakakak = new Hahaha();
		        	$jiakakak->nama = $_POST['nama'][$i];
		        	$jiakakak->nilai = $_POST['nilai'][$i];
		        	$jiakakak->jk = $_POST['jk'][$i];
		         	$jiakakak->save();
		    	}
		    }
		    $this->redirect(array('index'));
		}
		$this->render('create',array(
			'model'=>$model,
		));
	}

Penjelasan : code di atas akan menyimpan satu per satu nilai yang ada pada tabel sesuai dengan panjang tabel nya.

 

Selesai… Selamat mencoba…

Semoga membantu… 😀

[Yii Framework] Membuat Chart dengan Highchart

Sebelumnya saya pernah memaparkan step-step menampilkan chart dengan menggunakan extension Yii Openflashchart. Kali ini saya akan memaparkan step-step menampilkan chart dengan menggunakan extension highchart yang menurut saya pribadi lebih bagus dari openflashchart.

Kenapa saya katakan lebih bagus?

  • Dari sisi coding, openflashchart jauh lebih mudah, tapi saya cukup kesulitan untuk membuat chart dengan tampilan yang spesifik.
  • Ukuran extension highchart yang lebih ringan, hehe..
  • Highchart punya fitur print dan save chart ke dalam image.
  • Lagi-lagi pendapat saya pribadi, tampilan highchart lebih bagus.
Btw, saya nggak bermaksud menjelek-jelekan openflashchart ya,.. itu hanya pendapat pribadi :D..
Tapi yang harus diperhatikan bahwa highchart adalah library BERBAYAR untuk sebuah project komersil. Tapi GRATIS untuk project non komersil http://www.highcharts.com/license.
Okeh, langsung saja ke step cara penggunaannya. Pertama download lah extension highchart disini. Jika sudah, extract dan pindahkan ke dalam folder project Yii anda,tepatnya di protected/extensions. Berikut contoh code untuk menampilkan chart nya:
Menampilkan Pie Chart:
$this->widget('application.extensions.highcharts.HighchartsWidget', array(
   'options'=>array(
      'title' => array('text' => 'Masukkan Judulnya Disini'),
      'series' => array(
         array('type'=>'pie',
               'data' => array(array('nama1',4),array('nama2',5),array('nama3',2),)
              )
      ),
      'tooltip' => array(
		'formatter' => 'js:function(){ return "<b>"+this.point.name+"</b> :"+this.y; }'
      ),
      'plotOptions'=>array('pie'=>(array(
                    'allowPointSelect'=>true,
                    'showInLegend'=>true,
                    'cursor'=>'pointer',
                )
            )                       
        ),
      'credits'=>array('enabled'=>false),
   )
));

 

Menampilkan Bar Chart:

$this->widget('application.extensions.highcharts.HighchartsWidget', array(
   'options'=>array(
     'chart'=> array('defaultSeriesType'=>'column',),
      'title' => array('text' => 'Proporsi Jumlah Publikasi Berdasarkan Jenisnya'),
      'legend'=>array('enabled'=>false),
      'xAxis'=>array('categories'=>array('nama1','nama2','nama3'),),
      'yAxis'=> array(
            'min'=> 0,
            'title'=> array(
            'text'=>'Jumlah'
            ),
        ),
      'series' => array(
         array('data' => array(4,6,2))
      ),
      'tooltip' => array('formatter' => 'js:function() {return "<b>"+ this.x +"</b><br/>"+"Jumlah : "+ this.y; }'),
      'plotOptions'=>array('pie'=>(array(
                    'allowPointSelect'=>true,
                    'showInLegend'=>true,
                    'cursor'=>'pointer',
                )
            )                       
        ),
      'credits'=>array('enabled'=>false),
   )
));

yah, cukup panjang bukan coding nya dibanding dengan openflashchart.. Tapi lebih enak untuk melakukan modifikasi pada tampilan chart nya..

Untuk melihat demo lebih lengkap biar ga dikira beli kucing dalam karung, anda bisa lihat disini..

 

Selesai…. Selamat mencoba…

Semoga membantu… 😀

Yiiclipse, Eclipse PDT Extension for Yii Framework

Mungkin tidak menyangkut coding-codingan.. Cuma share pengalaman setelah mencoba Eclipse dengan PDT Extension khusus untuk Yii Framework..

Tidak seperti di C#, VB.NET, ASP.NET yang biasa saya pakai dimana mereka sudah memiliki IDE yang sangat powerfull yang sudah disediakan oleh Microsoft, yaitu Visual Studio. Di PHP sendiri saya masih belum menemukan IDE atau editor yang bisa menandingi Visual Studio, dan saya rasa memang tidak ada 😀 .. Selama ini untuk PHP saya selalu berganti-ganti pasangan IDE/editor, mulai dari NotePad++,  KomodoEdit, dll.. sejauh ini yang paling lama saya gunakan adalah KomodoEdit… Beberapa teman saya sendiri banyak yang menggunakan NetBeans, tapi melihat betapa berat nya Netbeans saat dijalankan dan laptop saya yang sudah tidak prima lagi, membuat saya melupakan untuk menggunakan netbeans..

Tapi setelah mencoba Eclipse dengan extension khusus untuk Yii Framework http://blog.maziarz.org/p/yiiclipse.html, saya rasa ini sangat recommended untuk digunakan.. Yah, sejauh saya berganti-ganti pasangan di PHP, saya rasa ini yang paling baik yang pernah saya rasakan…  Selain sangat mudah navigasi nya, autocomplete code nya cukup cepat dan ringan..

Yah, kalo anda berminat, silahkan mencoba…

[Yii Framework] Cara Reset Password

Memberikan fasilitas reset password adalah sesuatu yang perlu kita berikan untuk kemudahan user dalam mengelola akunnya. Berikut tahap-tahap seseorang melakukan reset password.

  • User harus masuk ke sistem(login) dengan akun mereka masing-masing
  • Jika berhasil, user memilih menu reset password.
  • Untuk melakukan reset password, user harus memasukkan password lama dan memasukkan password baru sebagai pengganti password lama
  • Jika sukses, password sudah berubah..
Oh iya, untuk keamanan di dalam sistemnya, saya akan memberikan lapisan keamanan untuk memastika data user terjaga. Hal itu saya lakukan dengan enkripsi password user beserta memberikan saltpassword nya, untuk lebih detail anda bisa lihat disini. Okeh, saya asumsikan anda udah buat fungsi untuk melakukan login, register, dan logout pada sistem anda. Jadi saya disini hanya akan fokus pada fungsi melakukan reset password.
Sebelumnya jika anda ngikutin step-step pembuatan login, logout, dan register pada postingan saya disini, maka anda harus melakukan modifikasi pada beberapa step yang ada disana.
Pertama, hapuslah fungsi “beforeSave()” yang ada pada model. Lalu rubah “actionCreate”/”actionRegister” anda menjadi seperti berikut:
	public function actionRegister()
	{
		$model=new MUsertab;

		if(isset($_POST['MUsertab']))
		{
			$model->attributes=$_POST['MUsertab'];
		
			$dua=$model->password;
			$model->saltPassword=$model->generateSalt();
			$model->password=$model->hashPassword($dua,$model->saltPassword);
			$model->level=20;
			
			if($model->save())
				$this->redirect(array('site/login'));
		}

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

Penjelasan : code tersebut sebenarnya sama aja fungsinya dengan fungsi “beforeSave” sebelumnya. Hanya saja untuk keperluan “Reset Password”, maka saya pindahkan ke dalam controller fungsi tersebut. Hal ini karena pada saat sistem melakukan “reset password”, maka fungsi tersebut tidak perlu menjalankan fungsi beforeSave tersbut. Jadi saya pilih langsung meletakkan code tersebut pada action-action yang memang memerlukan fungsi tersebut..

 

Setelah anda sudah melakukan hal di atas, buatlah sebuah tamiplan untuk merubah password nya. Disini saya beri nama file nya “reset.php”. Lalu masukkan code berikut:

<?php
$this->breadcrumbs=array(
	'Users'=>array('index'),
	'Reset Password',
);
?>
<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'coba-form',
	'enableAjaxValidation'=>false,
)); ?>

        <div class="row">
                <?php echo Chtml::label('Old Password',''); ?>
		<?php echo Chtml::passwordField('oldpassword'); ?>
	</div>

	
	<div class="row">
		<?php echo Chtml::label('New Password',''); ?>
		<?php echo Chtml::passwordField('newpassword'); ?>
	</div>
	
	<div class="row buttons">
		<?php echo CHtml::submitButton('Reset Password'); ?>
	</div>
<?php $this->endWidget(); ?>

Setelah itu buat sebuah action untuk mengeksekusi perubahan passwor nya, seperti berikut:

	public function actionResetpass()
	{
		$model=$this->loadModel(Yii::app()->user->id);

		if(isset($_POST['oldpassword'],$_POST['newpassword']))
		{	
			
			if($model->validatePassword($_POST['oldpassword']))
			{
				$dua=$_POST['newpassword'];
                                $model->saltPassword=$model->generateSalt();
				$model->password=md5($model->saltPassword.$dua);
				
				$model->save(false);
					$this->redirect(array('view','id'=>$model->id));	
				
			}
		}

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

Oh iya, jangan lupa memberi izin user mengakses fungsi tersebut di function  “accessRule()”.

Okeh, selesai…

Selmat mencoba…

Semoga membantu… 😀