[Yii Framework] Membuat Auto Login Setelah Register

Setelah melakukan register, kita ingin user akan secara otomatis login ke dalam sistem. Nah, berikut step-step nya. Misal kita memiliki action login seperti berikut :

    public function actionLogin()
    {
        $model=new LoginForm;

        // if it is ajax validation request
        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')
        {
            echo CActiveForm::validate($model);
            Yii::app()->end();
        }

        // collect user input data
        if(isset($_POST['LoginForm']))
        {
            $model->attributes=$_POST['LoginForm'];
            // validate user input and redirect to the previous page if valid
            if($model->validate() && $model->login())
                $this->redirect(Yii::app()->user->returnUrl);
        }
        // display the login form
        $this->render('login',array('model'=>$model));
    }

Kode tersebut adalah kode bawaan Yii Framework saat kita membuat aplikasi.

Nah, untuk melakukan auto login tambahkan kode berikut pada action register disaat kondisi data user telah berhasil disimpan :

                $model2=new LoginForm;

                $model2->username=$username
                $model2->password=$password;

                if($model2->login())
                    $this->redirect(array('site/index'));

Btw, fungsi login yang ada kode data di atas adalah fungsi login yang saya asumsikan sudah anda buat pada form login(Itu juga kode bawaan dari Yii saat kita membuat aplikasi..)

Selesai.. selamat mencoba..
semoga membantu… 😀

[Yii Framework] Membuat Tampilan Dinamis dengan AJAX

Pada suatu kasus kita perlu membuat tampilan dinamis yang dapat berubah-ubah jika kita inginkan. Misal suatu kasus kita memiliki dropdownlist yang isinya “laki-laki” dan “perempuan”. Jika kita user memilih “laki-laki” maka akan tampil tulisan “Halo cowok cakep”, dan jika milih “perempuan” akan tampil tulisan “halo cewek cantik” :D. Okeh, pertama-tama yang perlu kita buat adalah dropdownlist untuk memilih jenis kelamin dan kita sisipkan AJAX request pada dropdownlist tersebut :

        
$jekel=array(
    array('id'=>1,'jj'=>'Laki-laki'),
    array('id'=>2,'jj'=>'Perempuan'),
);

echo 'Jenis Kelamin :  ';
echo CHtml::dropDownList('jkel',array(),
        CHtml::listData($jekel,'id', 'jj'),
        array('empty'=>'Pilih Jenis Kelamin','style'=>'width:165px','ajax' => array(
           'type'=>'POST',
           'dataType'=>'json',
           'url'=>CController::createUrl('/cat/nama'),
           'data' => "js:{haha:$(this).val()}",
           'success'=>'function(data){
              $("#dinam").html(data.isi);
       }',)
       )
).'<br/>';

Pada code di atas, dropdownlist akan merequest sebuah action pada “cat” controller dan pada action “nama”. Maka dari itu kita harus membuat action tersebut :

    public function actionNama()
    {
        $isi='';
        if($_POST['haha']==1)
        {
            $isi.='Hai Cowok Cakep';
        }
        else {
            $isi.='Hai Cewek Cantik';
        }

        echo CJSON::encode(array
         (
             'isi'=>$isi,
        ));
          Yii::app()->end();
    }

Dari code di atas kita melakukan set tampilan dimana jika yang dipilih pada dropdownlist adalah option dengan “id”=1 atau laki-laki, maka akan tertulis tulisan “Hai Cowok Cakep”, dan klo yang dipilih “id”=2 atau perempuan, maka akan keluar tulisan “Hai Cewek Cantik”.

Terus yang akan di set nilainya tampilan yang mana??

Nah, itu juga sudah di atur pada dropdownlist kita tadi. Anda akan melihat kode berikut :

$("#dinam").html(data.isi);

Maksud dari kode tersebut adalah bahwa kontrol yang memiliki “id”=”dinam” lah yang akan di set tulisannya secara dinamis.

Langkah terkhir adalah kita harus mendefinisikan kontrol dengan id “dinam”  tersebut pada view kita tempat anda mendefinisikan dropdownlist tadi :

<div id="dinam">
</div>

Sip, selesai..
Silahkan mencoba..

Semoga membantu… 😀

[Yii Framework] Menambah Validasi Sendiri

Anda pasti sering menggunakan validasi bawaan dari Yii Framework untuk aplikasi anda. Sangat banyak sekali kondisi suatu validasi dari aplikasi kita yang ga terdapat dari Yii Framework. Tapi tenang, kita dapat membuat suatu validasi sendiri..

Validasi yang akan kita buat adalah  validasi yang persis sama dengan yang ada pada Yii Framework. Dimana setiap kali validasi tersebut tidak terpenuhi, maka akan di tampilkan pesan error pada form input data anda. Lalu setiap kalo kita ingin mengecek apakah suatu inputan user sudah sesuai validasi atau belum dengan cara $itu->validate(), maka validasi yang kita buat tadi juga akan di proses oleh fungsi tersebut..

Nah, bagaimana caranya??, mari kita bahas :

Pada model yang ingin anda sisipkan validasinya, silahkan sisipkan sebuah fungsi validasi. Kurang lebih seperti ini contohnya :

 public function namavalidasi($attribute)
 {
    if($this->$attribute=='sabit')
    {
       $this->addError('nama', 'ga boleh sabit yang post');
       return false; 
    }
 }

Okeh, cara penggunaan validasi tersebut adalah seperti berikut :

public function rules()
 {
      return array(
         array('nama','namavalidasi'),
      );
 }

Sisipkan fungsi tersebut pada fungsi rules() yang terdapat di dalam model. Anda dapat menentukan attribute yang mana saja yang dapat anda sisipkan tersebut..

Selesai.. Selamat mencoba..

Semoga membantu.. 😀

Pencarian Cepat dengan Apache Solr

Apache solr, anda bisa lihat disini, sesuatu yang dapat mempermudah aplikasi melakukan pencarian. Tidak hanya mudah, tapi ini juga dapat mempercepat kinerja dari suatu pencarian. Ini gratis anda gunakan dan anda dapat mendapatkannya disini. Setelah anda mengunduh apache solr, unpack dan letakkan pada suatu direktori.. terserah anda dimana saja..

 

Untuk penggunaanya sendiri, anda harus mengaktifkannya terlebih dahulu dengan menjalankan “example/start.jar”. Lalu buka browser anda dan coba masukkan alamat http://localhost:8983/solr/admin/ (biasanya port defaul apache solr adalah 8983, silahkan sesuaikan dengan milik anda jika berbeda). Bila sudah aktif, maka pada browser akan tampil halaman seperti berikut :

 

Jika sudah berarti anda dapat menggunakannya..

Pada anda pengguna PHP, untuk menggunakan apache solr anda harus menggunakan Solr PHP Client yang dapat anda dapatkan disini. Khusus pengguna Yii Framework, in next post saya akan membahas penggunaan Apache Solr pada Yii Framework hingga bagaimana trik agar dapat melakukan index data dari file PDF..

Sampai berjumpa pada posting selanjutnya..

[Yii Framework] Dropdownlist yang Terhubung Dengan Banyak Dropdownlist Lain

Cukup tertarik dengan pertanyaan yang ada disini, maka saya rasa lebih bagus kalo jawabnnya dibuat postingan saja..

Misal, ketika kita memilih suatu dropdownlist, kita ingin dropdownlist tersebut otomatis langsung mengeset nilai di DUA buah dropdownlist yang lain berdasarkan nilai yang sudah kita pilih..

Pada tampilan dropdownlist, masukkan kode berikut :

echo $form->dropDownList($member,'kewarganegaraan',
   CHtml::listData(Negara::model()->findAll(), 'id', 'negara'),
     array('empty' => 'choose :',
       'ajax' => array(
       'type'=>'POST',
       'dataType'=>'json',
       'url'=>CController::createUrl('/namaController/namaAction'),
       'data' => "js:{haha:$(this).val()}",
       'success'=>'function(data){
           $("#Member_provinsi").html(data.satu);
           $("#Member_kota").html(data.dua);
       }',
 )));

Penjelasan : code di atas akan mengeset dropdownlist yang memiliki inisial  “Member_provinsi” dan “Member_kota”. Kedua nilai tersebut akan memanggil fungsi yang terdapat dalam suatu controller..

Nah, kemudian pada controller buat action berikut  :

 public function actionNamaaction()
 {
    $satu='';
    $dua='';
    $data=NamaModel1::model()->findAllByAttributes(array('namaAttribute'=>$_POST['haha']));
    $data=CHtml::listData($data,'id','provinsi');

    foreach($data as $value=>$name)
    {
      $satu.= CHtml::tag('option',
        array('value'=>$value),CHtml::encode($name),true);
    }

    $data2=NamaModel2::model()->findAllByAttributes(array('namaattribute'=>$_POST['haha']));
    $data2=CHtml::listData($data2,'id','kota');
     foreach($data2 as $value=>$name)
     {
         $dua.=CHtml::tag('option',
           array('value'=>$value),CHtml::encode($name),true);
     }

     echo CJSON::encode(array
     (
         'satu'=>$satu,
         'dua'=>$dua
      ));
      Yii::app()->end();
 }

Kode di atas akan mengembalikan sebuah nilai dengan tipe JSON, dimana kedua nilai itu kemuadian akan digunakan untuk mengeset dua buah dropdownlist yang sudah kita tentukan tadi…

Selesai… selamat mencoba…

Semoga membantu yak… 😀

[Yii Framework] Convert Data To Excel

Data yang sudah kita miliki sering kali harus kita konversi ke dalam bentuk excel untuk suatu kebutuhan. Berikut langkah-langkah mengkonversi data ke dalam excel dengan menggunakan Yii Framework.

Proses ini sendiri saya lakukan dengan menggunakan sebuah extension yang ada pada Yii Framework, yaitu extension phpexcel yang dapat anda download disini. Silahkan anda download file tersebut dan copy ke dalam folder extensions yang sudah ada pada project Yii anda. Berikut kode yang perlu anda masukkan untuk mengkonversi data anda ke dalam excel :

    $hasil=Masukkan nilai array anda disini
    Yii::import('application.extensions.phpexcel.JPhpExcel');
    $xls = new JPhpExcel('UTF-8', false, 'test');
    $xls->addArray($hasil);
    $xls->generateXML('namaFileExcelYangAkanDihasilkan');

Penjelasan : pada variabel $hasil anda harus mendefinisikan dulu array yang anda miliki. Setelah itu array tersebut anda masukkan ke dalam sebuah parameter pada JPhpExcel. Dan secara otomatis file excel akan dihasilkan dan sudah tersedia untuk di download..

Selesai.. Selamat mencoba..

Semoga membantu.. 😀

[Yii Framework] Dropdownlist yang Terhubung

Tujuan dari posting ini tidak berbeda dengan postingan ini, hanya saja saya akan menunjukkan cara lain untuk melakukannya yang menurut saya lebih mudah untuk dipahami..

Yah, misal seperti kasus tersebut, kita memiliki tabel “Provinsi” dan “Kota” dimana kota yang dipilih harus sesuai dengan provinsi yang telah dipilih. Anggaplah saya sudah memiliki dua buah attribut kota dan provinsi. Hal pertama yang harus kita lakukan adalah membuat action yang akan dijalankan ketika attribut provinsi di pilih. Ketika attribute provinsi dipilih, maka attribute kota otomatis akan hanya berisi list kota yang berada pada provinsi tersebut. Code nya seperti beriikut :

public function actionSetKot()
 {
    $data=TabelKota::model()->findAllByAttributes(array('idProv'=>$_POST['haha']));
    $data=CHtml::listData($data,'id','kota');
    foreach($data as $value=>$name)
    {
          echo CHtml::tag('option',
          array('value'=>$value),CHtml::encode($name),true);
    }
 }

Penjelasan : pada code di atas, akan menghasilkan sekumpulan data dari tabel kota yang mana di filter berdasarkan “idProv”(id Provinsi) sesuai dengan request. Setelah itu sekumpulan data itu akan digunakan untuk mengisi option yang ada pada attribute kota.

Nah, setelah membuat action tersebut kita harus memodifikasi code pada form yang bertugas untuk me-request permintaan untuk mengeset attribute kota ketika attribute provinsi telah dipilih.. Berikut code nya :

<div>
  <?php echo $form->labelEx($model,'provinsi'); ?>
  <?php 
     echo $form->dropDownList($model,'provinsi',array(),
         array('empty' => 'choose :',
          'ajax' => array(
             'type'=>'POST',
              url'=>CController::createUrl('namaController/setkot'),
             'data' => "js:{haha:$(this).val()}",
             'update'=>'#Namamodel_kota',
          ))); 
 ?>
 <?php echo $form->error($model,'provinsi'); ?>
</div>
<div>
   <?php echo $form->labelEx($model,'kota'); ?>
   <?php 
         echo $form->dropDownList($model,'kota', array(),
            array('empty' => 'choose :')); 
   ?>
   <?php echo $form->error($model,'kota'); ?>
</div>

Penjelasan : code di atas adalah code pada halaman form. Pada dropdown “provinsi”, terdapat beberapa perintah yang digunakan untuk mengirimkan request jika attribute tersebut telah dipilih oleh user. Disana terlihat request tersebut akan memanggil action “setkot” yang sudah kita buat sebelumnya dimana setelah action tersebut dipilih, maka data akan mengupdate attribute “#Namamodel_kota”. Namamodel_kota merupakan attribute kota, disana terdapat tambahan kata “Namamodel” dikarenakan dia adalah attribute dari suatu model.

Selesai.. Selamat mencoba..

Semoga membantu.. 😀

[Yii Framework] Membuat Operasi CRUD dengan Ajax Request dan Tampilan Dialog

Operasi CRUD, ya kita dapat membuatnya dengan mudah menggunakan Yii Framework. Dengan memanfaatkan code generate dari gii, kita dapat membuat operasi CRUD tanpa menyentuh coding sedikitpun.. jelas itu akan menghemat banyak waktu kita bukan??

Tapi bagaimana jika kita dituntut untuk membuat operasi CRUD dengan menggunakan ajax request yang tampilannya tiap proses nya ditampilkan dengan menggunakan dialog?? susah?? nggak juga kok.. anda cukup memodifikasi beberapa baris code pada code hasil generate gii dan anda bisa menjalankannya dengan ajax.. Tapi bagaimana caranya??  yah, mari kita bahas..

Pertama, silahkan anda buat operasi CRUD pada suatu tabel dengan menggunakan code generate..

Setelah itu pastikan semua operasi berjalan dengan lancar dan tanpa kendala.. Jika anda sudah melakukan hal tersebut, sekarang mari kita modifikasi agar  CRUD ajaxRequest dapat berjalan. Okeh, saya akan menerapkan ajax CRUD pada halaman admin(manage) yang sudah di generate oleh yii, kenapa?? karena halaman ini memiliki navigasi untuk melakukan semua operasi(Create, Read, Update, Delete). Jadi untuk melakukannya pada halaman lain, silahkan anda modifikasi saja..

Pertama yang perlu kita modifikasi adalah bagian controller. Pada bagian controller, kita harus memberikan suatu kondisi tentang apa yang akan terjadi jika terjadi ajaxRequest pada suatu operasi. Pada actionView, yang awalnya seperti ini :

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

Rubah menjadi seperti berikut :

public function actionView($id)
{
     if (Yii::app()->request->isAjaxRequest)
     {
          $this->renderPartial('view',
             array('model'=>$this->loadModel($id),),false,true);
          if (!empty($_GET['asDialog']))
             echo CHtml::script('$("#iddialog").dialog("open")');
          Yii::app()->end();
     }
     else
     {
         $this->render('view',array(
           'model'=>$this->loadModel($id),
         ));
     }
 }

Okeh, selanjutnya pada actionCreate(), yang awalnya seperti berikut :

public function actionCreate()
 {
    $model=new MJenisbahanpustaka;
    if(isset($_POST['MJenisbahanpustaka']))
    {
        $model->attributes=$_POST['MJenisbahanpustaka'];
        if($model->save())
          $this->redirect(array('view','id'=>$model->kdBahanPustaka));
    }

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

menjadi seperti berikut :

public function actionCreate()
 {
    $model=new MJenisbahanpustaka;
    if(isset($_POST['MJenisbahanpustaka']))
    {
        $model->attributes=$_POST['MJenisbahanpustaka'];
        if($model->save())
          $this->redirect(array('view','id'=>$model->kdBahanPustaka));
    }

    if (Yii::app()->request->isAjaxRequest)
    {
        $this->renderPartial('create',
           array('model'=>$model,),false,true);
        if (!empty($_GET['asDialog']))
           echo CHtml::script('$("#iddialog").dialog("open")');
        Yii::app()->end();
    }
    else
    {
       $this->render('create',array(
          'model'=>$model,
       ));
    }
 }

Dan pada actionUpdate(), yang awalnya seperti brikut:

public function actionUpdate($id)
{
    $model=$this->loadModel($id);
    if(isset($_POST['MJenisbahanpustaka']))
    {
        $model->attributes=$_POST['MJenisbahanpustaka'];
        if($model->save())
          $this->redirect(array('view','id'=>$model->kdBahanPustaka));
    }
    $this->render('update',array(
       'model'=>$model,
    ));
}

Menjadi seperti berikut :

public function actionUpdate($id)
{
     $model=$this->loadModel($id);
     if(isset($_POST['MJenisbahanpustaka']))
     {
         $model->attributes=$_POST['MJenisbahanpustaka'];
         if($model->save())
            $this->redirect(array('view','id'=>$model->kdBahanPustaka));
     }

     if (Yii::app()->request->isAjaxRequest)
     {
        $this->renderPartial('update',
           array('model'=>$model,),false,true);
        if (!empty($_GET['asDialog']))
           echo CHtml::script('$("#iddialog").dialog("open")');
        Yii::app()->end();
     }
     else
     {
         $this->render('update',array(
            'model'=>$model,
          ));
     }
 }

Sedangkan untuk delete emang udah pake ajax request, jadi ga perlu kita bahas ya..

Selanjutnya yang perlu kita modifikasi adalah tampilannya agar dapat kita buat menjadi ajaxRequest pada link navigasi nya..

Pada tampilan, untuk membuat navigasi yang mengarahkan pada actionCreate anda dapat memasukkan code berikut pada halaman form anda:

<?php echo Chtml::ajaxLink('Create',Yii::app()->createUrl('namaController/create',
     array('asDialog'=>1)),array('type'=>'POST',
      'url'=>'js:$(this).attr("href")',
      'update'=>'#idtampilan'));
?>

Sedangkan pada CGridView anda harus modifikasi pada bagian buttonnya menjadi seperti berikut :

<?php $this->widget('zii.widgets.grid.CGridView', array(
   'id'=>'mjenisbahanpustaka-grid',
   'dataProvider'=>$model->search(),
   'filter'=>$model,
   'columns'=>array(
       'namaAttribut1',
       'namaAttribute2',
       'namaAttribute3',
       array(
          'class'=>'CButtonColumn',
          'buttons'=>array('view'=>
             array(
                'url'=>'Yii::app()->createUrl("namaController/view", 
                array("id"=>$data->namaAttribute,"asDialog"=>1))',
                'options'=>array(
                   'ajax'=>array(
                      'type'=>'POST',
                      'url'=>"js:$(this).attr('href')",
                      'update'=>'#idtampilan',
                    ),
                 ),
              ),
            'update'=>array(
                 'url'=>'Yii::app()->createUrl("namaController/update", 
                  array("id"=>$data->namaAttribute,"asDialog"=>1))',
                 'options'=>array(
                      'ajax'=>array(
                      'type'=>'POST',
                       'url'=>"js:$(this).attr('href')",
                      'update'=>'#idtampilan',
                 ),
              ),
            ),
         ),
      ),
 ),
)); ?>

Lalu tambahkan code berikut untuk menampung dialog nya :

<?php
$this->beginWidget('zii.widgets.jui.CJuiDialog', array(
   'id'=>'iddialog',
   'options'=>array(
        'title'=>'Detail view',
        'autoOpen'=>false, //important!
        'modal'=>false,
        'width'=>'auto',
        'height'=>'auto',
    ),
));
?>
<div id="idtampilan"></div>
<?php $this->endWidget();?>

Selesai.. Selamat mencoba..

Semoga membantu.. 😀

[Yii Framework] Membuat Pagination dengan CLinkPager

Pagination, kalo kita make CListView atau CGridView tentunya kita ga perlu susah-susah mikirin gimana caranya membuat pagination karena emang hal itu sudah tersedia langsung oleh CLIstView ataupun CGridView. Tapi ada beberapa kondisi dimana biasanya kita tidak menggunakan control tersebut, tetapi ingin membuat pagination.. yah, Yii sendiri sudah menyediakan cara untuk mempermudah kita melakukan hal tersebut.. yaitu menggunakan CLinkPager..

Bagaimana cara menggunakannya?? okeh, mari kita bahas..

Misal anda menggunakan sql query untuk menampilkan data seperti berikut :

 $sql='SELECT * FROM namaTabel';
 
 $dataProvider=new CSqlDataProvider($sql,array(
   'keyField' => 'id',
   'totalItemCount'=>namaTabel::model()->count(),
   'pagination'=>array(
       'pageSize'=>8,
    ),
 ));

Setelah itu mari kita buat pagination nya seperti berikut :

 $page = new CPagination(namaTabel::model()->count());
 $page->pageSize = 8;

Penjelasan :

  • totalItemCount merupakan jumlah nilai yang akan ditampilkan, jadi kalo pun query anda menghasilkan 100 nilai, tapi anda set cuma 30 nilai maka yang akan nampil cuma 30 nilai.
  • pageSize baik di $dataProvider maupun di pagination digunkan untuk mengeset total nilai yang akan di tampilkan perhalaman.

Ket : pastikan Cpagination memiliki nilai yang sama dengan ‘totalItemCount’ yang terdapat pada $dataProvider. Dan pastikan juga pageSize yang ada pada pagination sama dengan pageSize yang ada pada $dataProvider.

Sedangkan untuk menampilkannya, berikut caranya :

<?php
   foreach ($dataProvider->data as $ia=>$iia)
   {
?>
   Nama Attribut 1 : <?php echo $iia['attribute1'] ?>
   Nama Attribut 2 : <?php echo $iia['attribute2'] ?>
   Nama Attribut 3 : <?php echo $iia['attribute3'] ?>
<?php 
  }
  $this->widget('CLinkPager',array('pages'=>$page));
?>

Yah, jika apa yang anda lakukan telah berhasil, maka data akan ditampilkan sesuai dengan paginationnya..

Selesai.. Selamat mencoba..

Semoga membantu.. 😀