[Yii Framework] CGridView with CArrayDataProvider

CGridView, sering kali saya menggunakan CActiveDataProvider ataupun CSqlDataProvider untuk menampilkan data lewat CGridView. Namun ada kondisi ketika kita ingin menampilkan suatu array ke dalam CGridView.. Yah, kita dapat menggunakan CArrayDataProvider dalam melakukannya… Berikut contoh simpel penggunaan CArrayDataProvider pada CGridView :

Pertama definisikan terlebih dahulu array yang kita miliki :

$haha=array(
			array('id'=>1, 'nama'=>'Joko'),
			array('id'=>2, 'nama'=>'Toloi'),
		);

Lalu konversi array tersebut menjadi CArrayDataProvider :

$hasil=new CArrayDataProvider($haha, array(
	'id'=>'id',
	'sort'=>array(
		'attributes'=>array(
			'id', 'nama',
		),
	),
));

Terakhir, gunakan variabel tersebut pada CGridView :

    
$this->widget('zii.widgets.grid.CGridView', array(
	'dataProvider'=>$hasil,
		'columns'=>array(
			array(
				'name'=>'Identitas',
				'value'=>'$data["id"]',
			),
			array(
				'name'=>'Nama',
				'value'=>'$data["nama"]',
			),
		),
	));

Selesai… Selamat mencoba..

Semoga membantu.. 😀

[PHP] Convert PDF to text

Berikut akan saya paparkan bagaimana cara melakukan konversi sebuah file PDF menjadi text. Konversi yang saya maksud adalah bagaimana caranya agar kita dapat menangkap isi text yang ada dalam suatu file PDF agar kemudian dapat kita olah sesuai kebutuhan kita..

Pertama-tama, download lah sebuah library yang bernama xpdf disini. Sebelumnya perlu saya jelaskan, xpdf sendiri memiliki beberapa batasan dalam mengkonversi sebuah file PDF. Xpdf tidak akan mengkonversi sebuah text pada pdf file yang file tersebut tidak mengizinkan/diproteksi.

Okeh, setelah anda download xpdf, silahkan letakkan pada sebuah folder dimana anda ingin melatekaannya. Misal saya meletakkannya pada drive “C:/”. Lalu untuk menjalankannya agara dapat mengkonversi PDF file menjadi text, buatlah kode berikut :

$content = shell_exec('C:/xpdf/pdftotext -enc "UTF-8" '.$path.' -');

Penjelasan : $content adalah sebuah variabel yang isinya adalah text hasil konversi dari PDF file. Di dalam $content sendiri kita akan menjalankan library xpdf lalu kode tersebut akan mengkonversi file PDF yang sudah ada pada variabel $path. Variabel $path sendiri tentu dapat anda gunakan untuk mengarahkan file PDF yang akan di konversi. Jadi anda bisa membuat $path menjadi seperti berikut misalnya :

$path='C:\buku\namaebook.pdf';

anda dapat lihat bahwa $path sendiri berisi path dari file PDF yang akan dikonversi..

Selesai..

Selamat mencoba,,,

Semoga membantu,,… 😀

SPARTA

Sparta, Short Palembang Route Application..

adalah sebuah aplikasi yang digunakan untuk mencari rute transportasi terpendek kota palembang berdasarkan jarak dan ongkos. Pengguna dapat mengetahui rute yang harus di tempuh dari tempat asal dan tempat tujuan, beserta angkot apa saja yang akan dinaiki dan berapa ongkos yang dibutuhkan pengguna pada rute tersebut..

Hmm, btw aplikasi ini sendiri bukan buatan saya kok. Aplikasi ini sendiri dibuat oleh seorang wanita bernama Fithri Selva Jumeilah yang, hmmm bisa disebut sesuatu saya lah :D.. Dibangun dengan menggunakan platform mobile berbasis Windows Phone 7 Mango dengan bahasa pemrograman C#.

Berikut sedikit gambaran dari aplikasi ini..

Pilih mode pencarian

Pertama kali menggunakan aplikasi ini, pengguna akan disajika tampilan untuk memilih mode pencarian yang akan digunakan pengguna. Mode pencarian sendiri terdapat tiga jenis, yaitu General, Angkutan Umum, dan Transmusi.

  • Mode pencarian general digunakan apabila pengguna ingin mencari rute terpendek dengan menggunakan kendaraan pribadi. Pada mode pencarian ini, aplikasi hanya akan mempertimbangkan pencarian berdasarkan jarak saja. Hal tersebut dikarenakan pada mode pencarian ini tidak dilibatkan angkutan umum, sehingga tidak melakukan pencarian berdasarkan ongkos.
  • Mode pencarian Angkutan umum digunakan apabila pengguna ingin mencari rute terpendek dengan menggunakan angkutan umum seperti angkot dan bus kota. Pada pencarian ini akan dilakukan pencarian berdasarkan jarak dan ongkos, namun tempat yang dihitung berdasarkan ongkos hanya rute  yang di lewati angkutan umum.
  • Mode pencarian Transmusi digunakan apabila pengguna ingin mencari rute terpendek dengan menggunakan angkutan Transmusi Kota Palembang.

Pilih Lokasi Asal dan Tujuan

Setelah memilih mode pencarian pengguna akan diminta memasukkan lokasi asal dan lokasi tujuan dari pencarian yang ingin ia lakukan.

Menampilkan Rute Optimum Lokasi Asal ke Lokasi Tujuan

Setelah memilih lokasi asal dan lokasi tujuan, aplikasi akan menampilkan rute terpendek dari kedua lokasi tersebut.

Menampilkan Rute optimum yang dilewati beserta daftar angkot yang digunakan dan ongkos pada angkot tersebut

Selain menampilkan rute optimum yang dilewati dari peta, aplikasi juga akan menampilkan daftar persimpangan-persimpangan yang dilewati pada rute optimum. Aplikasi juga akan menampilkan angkutan umum apa saja yang akan dilewati, beserta total ongkos yang dikeluarkan untuk melakukan perjalanan tersebut..

Nice application, selamat ya sayang… 😀 Dari semua wanita yang ku kenal,  kamu yang paling jago coding..

 

 

[Yii Framework] Otak-atik CGridView dan CListView, custom “No Result Found”

Ketika kita menggunakan CGridView atau CListView, ada kalanya query yang dihasilkan tidak menghasilkan nilai apa-apa. Jika kondisi tersebut terjadi, maka CGridView atau CListView kita akan menampilkan pesan “No Result Found”. Mungkin anda sedikit bosan dengan pesan tersebut dan ingin menggantinya dengan pesan yang anda atur sendiri jika data tersebut kosong.. Yah, tentu saja hal itu sangat mungkin.. Berikut langkah-langkahnya :

Gunakan “emptyText” pada CGridView atau CListView anda, lalu buat code nya seperti berikut :

<?php $this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'thread-grid',
	'dataProvider'=>$allt->search(),
	'emptyText'=>'Belum ada thread pada kategori ini',
	'columns'=>array(
		array(
			'name'=>'Judul',
			'type'=>'raw',
			'value'=>'Chtml::link($data->judul,array(\'thread/view\',\'id\'=>$data->id))',
		),
	),
)); ?>

Sedangkan pada CListView juga sama, berikut contoh penggunaannya :

<?php $this->widget('zii.widgets.CListView', array(
	'dataProvider'=>$allt->search(),
	'itemView'=>'_view',
	'emptyText'=>'Tidak ada data yang ditemukan'
)); ?>

Selesai.. Selamat mencoba..

Semoga membantu.. 😀

[Yii Framework] Halaman Register dengan Password Generate dan Email Confirmation

Ada banyak teknik melakukan operasi “register” pada suatu sistem. Salah satu nya adalah dengan cara memerintahkan sistem secara langsung memberikan password kepada pengguna yang telah melakukan proses register ke suatu sistem kemudian mengirimkan password yang sudah dihasilkan secara otomatis tadi ke email pengguna.. Ya, saya akan paparkan langkah-langkah melakukan operasi register dengan metode tersebut…

Pertama-tama silahkan rancang database anda. Tentunya minimal anda harus memiliki attribut “username”, “password”,  dan “email”. Email sendiri disini dibutuhkan karena kita akan melakukan konfirmasi pendaftaran langsung ke email pengguna.. Dan untuk keamanan, saya menambahkan attribut “saltPassword”. Salt Password sendiri adalah attribut yang digunakan sebagai key hasil enkripsi dari attribute “password”. Berikut sql dari tabel “user” pada database saya :

CREATE TABLE IF NOT EXISTS `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user` varchar(50) NOT NULL,
  `pass` varchar(50) NOT NULL,
  `sPass` varchar(50) NOT NULL,
  `email` varchar(50) NOT NULL,
  `jk` enum('male','female') NOT NULL,
  `nama` varchar(50) NOT NULL,
  `tglLahir` date NOT NULL,
  `isActive` int(11) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `user` (`user`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

Okeh, setelah selesai membuat database, silahkan generate “model” dan “CRUD” dengan menggunakan Gii dari Yii Framework. Setelah melakukan proses generate, akan ada file “User.php” pada models, “UserController.php” pada controller, dan folder “User” pada views. Buka “User.php”, lalu lakukan beberapa perubahan seperti berikut :

Pada model tersebut, tambahkan fungsi-fungsi berikut :

	public function validatePassword($password)
	{
		return $this->hashPassword($password,$this->sPass)===$this->pass;
	}
	
	public function hashPassword($password,$salt)
	{
		return md5($salt.$password);
	}

	public function generateSalt()
	{
		return uniqid('',true);
	}
	
	public function rans()
        {
    	         $cc = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    	         $rr = '';
    	         for ($i = 0; $i < 10; $i++)
                      $rr .= $cc[rand(0, strlen($cc))];
    	        return $rr;
         }

Penjelasan :

  • Fungsi validatePassword() digunakan untuk melakukan pencocokan password hasil enkripsi dengan password inputan pengguna saat login.
  • Fungsi hashPassword() digunakan untuk mengkonversi password hasil enkripsi dengan md5.
  • Fungsi generateSalt() digunakan untuk menggenerate saltPassword secara otomatis.
  • Fungsi rans() digunakan untuk menghasilkan random string untuk menggenarate password secara otomatis.

Lalu untuk keamanan pada proses register, kita berikan “captcha”. Anda dapat lihat cara menambahkan captcha disini. Setelah itu, buka folder views/user, dan buka file _form.php. Lalu lakukan beberapa perubahan menjadi seperti berikut :

<div class="form">

<?php $form=$this->beginWidget('CActiveForm', array(
	'id'=>'user-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,'user'); ?>
		<?php echo $form->textField($model,'user',array('size'=>50,'maxlength'=>50)); ?>
		<?php echo $form->error($model,'user'); ?>
	</div>
	
	<div class="row">
		<?php echo $form->labelEx($model,'nama'); ?>
		<?php echo $form->textField($model,'nama',array('size'=>50,'maxlength'=>50)); ?>
		<?php echo $form->error($model,'nama'); ?>
	</div>

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

	<div class="row">
		<?php echo $form->labelEx($model,'jk'); ?>
		<?php echo $form->dropdownlist($model,'jk',array('male'=>'Male','female'=>'Female'),array('style'=>'width:250px')); ?>
		<?php echo $form->error($model,'jk'); ?>
	</div>

	<div class="row">
		<?php echo $form->labelEx($model,'tglLahir'); ?>
		<?php $this->widget('zii.widgets.jui.CJuiDatePicker',
			array(
			    'language'=>'id',
                'model'=>$model,
              	'attribute'=>'tglLahir',
              	'value'=>$model->tglLahir,
             	'options'=>array(
                	'showAnim'=>'fold',
                	'dateFormat'=>'yy-mm-dd'
              	),
            	'htmlOptions'=>array(
               		'style'=>'height:15px;',
            	),
          	));
		?>
		<?php echo $form->error($model,'tglLahir'); ?>
	</div>
	
	<?php if (extension_loaded('gd')): ?>
        <div class="row">
            <?php echo CHtml::activeLabelEx($model, 'verifyCode') ?>
        <div>
        <?php $this->widget('CCaptcha'); ?>
        <?php echo CHtml::activeTextField($model,'verifyCode'); ?>
        </div>
        <div class="hint">Ketik tulisan yang ada pada gambar .
        <br/>Tulisan tidak case sensitive</div>
        </div>
	<?php endif; ?>
	
	<div class="row buttons">
		<?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
	</div>

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

Penjelasan : pada code di atas, saya menghilangkan beberapat attribute yaitu “pass”,”sPass”, “isActivate” dimana ketiga attribute tersebut memang tidak akan diinput oleh pengguna melainkan di generate secara otomatis dari sistem. Lalu silahkan buka “UserController”. Lalu rubah actionCreate menjadi seperti berikut :

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

		if(isset($_POST['User']))
		{
			$model->attributes=$_POST['User'];
			
			$dua=User::model()->rans();
			$model->sPass=$model->generateSalt();
			$model->pass=$model->hashPassword($dua,$model->sPass);
			$model->isActive=0;
			
			if($model->save())
			{
				$mailer = Yii::createComponent('application.extensions.mailer.EMailer');
     			$mailer->IsSMTP();
     			$mailer->IsHTML(true);
     			$mailer->SMTPAuth = true;
     			$mailer->SMTPSecure = "ssl";
     			$mailer->Host = "smtp.gmail.com";
     			$mailer->Port = 465;
     			$mailer->Username = "a@myweb.com";
     			$mailer->Password = 'a';
     			$mailer->From = "Admin";
     			$mailer->FromName = "Admin";
     			$mailer->AddAddress($model->email);
     			$isi='Hai '.$model->nama.'<br/> Anda telah melakukan register dengan :<br/>
     			Username  :'.$model->user.'<br/>
     			Password  :'.$dua;
     			$mailer->Subject = "Confirmation.";
     			$mailer->Body = $isi;
     			$mailer->Send();
				$this->redirect(array('view','id'=>$model->id));
			}
		}

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

Penjelasan : pada code di atas, dilakukan proses penyimpanan data-data pengguna ke dalam database. Proses penyimpanan tersebut akan melakukan generate attribute “pass” dan “sPass”. Selain itu juga sistem juga akan secara otomatis menginput data attribute “isActive” dengan nilai “0”.  Setelah melakukan penyimpanan, sistem akan secara otomatis memberitahukan “nama” dan “password” ke email pengguna yang telah dimasukkan oleh pengguna pada proses “register” tadi. Disana juga terdapat fungsi untuk mengirim email yang dapat lihat disini tutorial membuat nya..

Okeh, setelah itu silahkan anda buat proses untuk melkukan login untuk membuktikan bahwa password yang sudah di generate tadi bisa digunakan. Buka  folder protected/components pada project anda. Lalu buka UserIdentity.php yang ada pada folder tersebut. Lalu rubah code nya menjadi seperti berikut :

<?php
class UserIdentity extends CUserIdentity
{
	private $_id;
	public function authenticate()
	{
		$username = strtolower($this->username);
		$user = User::model()->find('LOWER(user)=?', array($username));
		if($user===null)
		    $this->errorCode=self::ERROR_USERNAME_INVALID;
		else if(!$user->validatePassword($this->password))
		    $this->errorCode = self::ERROR_PASSWORD_INVALID;
		else
		{
		    $this->_id = $user->id;
		    $this->username = $user->user;
		    $this->errorCode = self::ERROR_NONE;
	    }
	    return $this->errorCode == self::ERROR_NONE;
	}
	
	public function getId()
	{
		return $this->_id;
	}
}

Yah, selesai… silahkan jalankan fungsi tersebut..

Lakukan proses register, lalu setelah selesai buka email yg sudah anda input pada proses register tadi..

Kemudian akan ada pesan dari sistem anda.. Lalu gunakan akun yang sudah tertera pada email tersebut untuk melakukan proses login..

Jika apa yang anda buat sudah benar, maka anda akan masuk ke halaman sistem dengan akun yang sudah anda buat tadi..

Selesai… Selamat mencoba..

Semoga membantu… 😀

[Yii Framework] Otak-atik CGridView, Memberikan Nomor Otomatis

Mungkin anda ingin menambahkan nomor yang terurut pada CGridView yang telah bisa mengurutkan page by page pada proses paginationnya.. Berikut langkah-langkahnya..

Misal anda memiliki code CGridView seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'mddc-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		'id',
		'Nama',
		array(
			'class'=>'CButtonColumn',
		),
	),
));

Nah, pada code di atas anda akan melihat tampilan attribut “id” dan “nama” yang di tampilkan.. Jika anda ingin menambahkan nomor yang terurut pada masing-masing data tersebut, anda dapat merubah code di atas menjadi seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'mddc-grid',
	'dataProvider'=>$model->search(),
	'filter'=>$model,
	'columns'=>array(
		array(
      		'header'=>'Nomor',
        	'value'=>'$this->grid->dataProvider->pagination->currentPage*$this->grid->dataProvider->pagination->pageSize + $row+1',
        ),
		'id',
		'Nama',
		array(
			'class'=>'CButtonColumn',
		),
	),
));

Penjelasan : code di atas hanya saya tambahkan sedikit code yang menambahkan sebuah kolom yang berisi nomor dari data tersebut.

Selesai… Selamat mencoba…

Semoga membantu… 😀

[Yii Framework] Add Hint to textField

Mungkin anda sering membuka website yang memiliki textfield yang memiliki hint text. Hint text sendiri adalah text yang akan muncul misal : pada suatu textfield. Lagi-lagi dengan menggunakan Yii Framework, anda tidak perlu pusing memikirkan bagaimana membuat fitur ini. Berikut cara menambahkan hint pada suatu textField.

Misal code textField anda seperti berikut :

	echo Chtml::textField('namaAttribute','',array('size'=>26));

Untuk menambahkan hint, anda dapat mengubah code tersebut menjadi seperti berikut :

	echo Chtml::textField('namaAttribute','',array('placeholder'=>'Kata Kunci...','size'=>26));

Selesai… Selamat mencoba…

Semoga membantu.. 😀

 

[Yii Framework] Otak-atik CGridView, Display Image

Berikut langkah-langkah untuk menampilkan gambar pada CGridView :

Pada code CGridView anda yang awalnya seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'junction-tab-grid',
	'dataProvider'=>$model->search(),
	'columns'=>array(
		'id',
		'nama',
		'foto'
		array(
			'class'=>'CButtonColumn',
		),
	),
));

Ubah  menjadi seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'junction-tab-grid',
	'dataProvider'=>$model->search(),
	'columns'=>array(
		'id',
		'nama',
		array(
			'name'=>'Gambar',
			'type'=>'raw',
			'value'=>'CHtml::image(\'a/../images/1.jpg\', \'DORE\', array("width"=>50))',
		),
		array(
			'class'=>'CButtonColumn',
		),
	),
));

Penjelasan : pada code di atas, kita menampilkan gambar dengan menggunakan Chtml::image. Lalu kita arahkan link gambar yang akan kita tampilkan tersebut.. Tentu saja anda harus melakukan konfigurasi untuk mengarahkan tampilannya ke gambar yang ada..

 

Selesai..

Selamat mencoba..

Semoga membantu… 😀

[Yii Framework] Otak-atik CGridView, If Condition

Misal kita memiliki masalah seperti berikut:

Jika kode=1, maka tampilkan tulisan "Belum diproses"
Jika kode=2, maka tampilkan tulisan "Sedang diproses"
Jika kode=3, maka tampilkan tulisan "Sudah diproses"

Yah, kondisi tersebut tidak terlalu sulit kita lakukan ketika kita membuatnya di form php biasa. Tapi saat di CGridView, kita perlu sedikit mengakalinya dengan beberapa trik..  Berikut langkah-langkah menjalankan trik tersebut :

Misal attribut “kode” tersebut berada di tabel “barang”. Maka pada “Model barang”, masukkan fungsi berikut :

public function statusBarang($i)
	{
		if($i==1)
			return "Belum diproses";
		else if($i==2)
			return "Sedang diproses";
		else 
			return "Sudah diproses";
	}

Jika sudah selesai, maka CGridView yang sebelumnya seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'junction-tab-grid',
	'dataProvider'=>$model->search(),
	'columns'=>array(
		'id',
		'kodeBarang',
		'statusBarang',
		array(
			'class'=>'CButtonColumn',
		),
	),
));

Ubah menjadi seperti berikut :

$this->widget('zii.widgets.grid.CGridView', array(
	'id'=>'junction-tab-grid',
	'dataProvider'=>$model->search(),
	'columns'=>array(
		'id',
		'kodeBarang',
		array(
			'name'=>'Nama Mahasiswa',
			'type'=>'raw',
			'value'=>'Barang::model()->statusBarang($data->statusBarang)',
		),
		array(
			'class'=>'CButtonColumn',
		),
	),
));

Selesai.. Selamat Mencoba..

Semoga membantu… 😀