[Yii Framework] Update with Multi Select Control

Saya pernah posting tentang bagaimana untuk menginput data dengan multiselect control disini. Sekarang timbul pertanyaan bagaimana cara untuk melakukan proses update. Yah, proses update yang dimaksud berarti pada control tersebut otomatis data yang sudah terpilih sebelumnya akan masuk ke list data yang sudah dipilih.  Berikut step-stepnya :

Select terlebih dahulu semua data yang akan terpilih dengan fungsi dari Yii, lalu kita simpan dalam suatu array seperti berikut :

$terpilih=array();
$terpilih['data1']=array('selected'=>'selected');
$terpilih['data2']=array('selected'=>'selected');
$terpilih['data3']=array('selected'=>'selected');

Setelah itu pada dropdownlist yang digunakan, masukkan “option” seperti berikut :

 
echo $form->listBox($model,'namaAttribute',
       $isis,array('multiple'=>'multiple','key'=>'label', 'class'=>'multiselect',
      'style'=>'width:650px','options'=>$terpilih)
 );

Disana saya mengeset option-option apa saja yang akan terpilih. Jadi apabila ada options “data1”, “data2”, dan “data3” maka dia akan secara otomatis berada pada kolom yang telah terpilih tempatnya..

 

Selesai.. Selamat mencoba…

Semoga membantu… 🙂

Advertisements

[Yii Framework] Membuat Search Engine Dengan Zend Search Lucene

Anda ingin membuat fitur pencarian cepat pada website anda? Ada banyak cara anda bisa menggunakan Apache Solr seperti yang sudah pernah saya posting sebelumnya, menggunakan Sphinx, atau menggunakan Apache Lucene.. Untuk tutorial kali ini saya akan post membuat pencarian cepat menggunakan Apache Lucene, tetapi lucene yang dibuat oleh Zend Framework agar kita lebih mudah integrate nya pada PHP. Hal ini sendiri sebenarnya sudah ada pada wiki Yii Framework disini, tapi ga ada salahnya kan saya kemas ulang dan tambahkan sedikit hal disana..

Pertama-tama yang perlu anda lakukan adalah mendownload zend framework disini. Dan sebelum memulai, saya asumsikan anda sudah memahami masalah zend search lucene. Setelah anda mendownload zend lucene, extract file donlotan. Buat folder baru pada direktori “namaAplikasi/protected/”  misal saya beri nama “ZF”. Kemudian pindahkan hasil extractan tadi ke dalam direktori “namaAplikasi/protected/ZF”. Untuk memanggil dan menggunakan fungsi-fungsi yang ada pada zend search lucene, masukkan code berikut pada bagian atas controller yang ingin menggunakan Zend search lucene :

Yii::import('application.ZF.*');
require_once('Zend/Search/Lucene.php');

Code di atas digunakan untuk mendefinisikan file Zend  Framework agar dapat kita gunakan dalam aplikasi kita. Lalu bagaimana melakukan index data yang ada pada database kita? Saya asumsikan kita akan mengindex semua data pada suatu tabel yang kita miliki. Buatlah sebuah action seperti berikut :

public function actionAll()
 {
     $index = new Zend_Search_Lucene(Yii::getPathOfAlias('application.tempatSimpan'), true);

     $posts = NamaModel::model()->findAll();
     foreach($posts as $post)
     {
         $doc = new Zend_Search_Lucene_Document();

         $doc->addField(Zend_Search_Lucene_Field::Keyword('pk',CHtml::encode($post->namaAttribute1), 'utf-8')); 
         $doc->addField(Zend_Search_Lucene_Field::Text('isi',Chtml::encode($post->namaAttribute2), 'utf-8')); 
         $index->addDocument($doc);
     }
     $index->commit();
 }

Pada code di atas kita menyimpan data hasil index kita pada direktori “namaAplikasi/protected/tempatSimpan”, itu dapat dilihat dari definisi pertama fungsi zend search lucene. Kita memasukkan semua data yang ada pada tabel “Namamodel” ke dalam index lucene. Dari code tersebut yang saya index adalah field “namaAttribute1” dengan nama “pk” dan field “namaAttribute2” dengan nama “isi”.

Code di atas kita mengindex semua data dimana semua index akan di kosongkan terlebih dahulu, kemudian baru diisi kembali. Kenapa saya katakan dikosongkan? karena kita mendefinisikan ulang, tidak mengupdate. Bagaimana jika kita hanya ingin menambah satu buah data saja pada index kita? dengan kata lain kita melakukan update pada index data yang sudah ada dan menambahkan satu buah file index? Seperti berikut :

public function actionUpdateField()
 {
     $index = new Zend_Search_Lucene::open(Yii::getPathOfAlias('application.tempatSimpan'), true);

     $doc = new Zend_Search_Lucene_Document();

     $doc->addField(Zend_Search_Lucene_Field::Keyword('pk',CHtml::encode('3'), 'utf-8')); 
     $doc->addField(Zend_Search_Lucene_Field::Text('isi',Chtml::encode('hahahahahah'), 'utf-8')); 
     $index->addDocument($doc);
    $index->commit();
 }

Pada code di atas, saya mendefinisikan Zend Search Lucene dengan kata “Open” yang artinya index yang lama tidak akan dikosongkan melainkan di update. Setelah itu saya menambahkan sebuah document pada index tersebut yang memiliki “pk” =3 dan “isi”=’hahahahahah’. Okeh itu adalah proses update..

Contoh di atas kita melakukan penambahan satu buah document ke dalam index data kita. Lalu bagaimana jika kita ingin melakukan update suatu document yang sudah ada?? Zend Search Lucene sendiri tidak memiliki support untuk melakukan update data(hingga saat ini). Untuk itu, untuk melakukan proses update anda harus menghapus terlebih dahulu document tersebut, lalu menginputnya kembali.. Untuk lebih lengkap, dapat dilihat pada dokumentasinya.

Setelah kita telah melakukan index data, sekarang saatnya kita membuat fitur pencarian pada Zend Search Lucene.. Okeh buatlah action pencarian seperti berikut :

public function actionSearch()
 {
     $term=$_GET['keyword'];
     $index = new Zend_Search_Lucene(Yii::getPathOfAlias('application.tempatsimpan'));
     $results = $index->find($term);
     $query = Zend_Search_Lucene_Search_QueryParser::parse($term); 
     $pages=5;
     $page = new CPagination(count($results));
     $page->pageSize = $pages;

     $dataProvider=new CArrayDataProvider($results,array(
       'keyField' => 'id',
       'totalItemCount'=>count($results),
       'pagination'=>array(
          'pageSize'=>$pages,
         ),
       )
     );

     $this->render('search', compact('dataProvider','results', 'term', 'query','page'));
 }

Penjelasan : pada code di atas, kita melakukan pencarian berdasarkan keyword yang sudah diinput oleh user dari index data pada direktori “namaAplikasi/protected/tempatSimpan”. Setelah itu kita mendapatkan hasil pencariannya. Agar memperindah tampilan, kita membuat pagination pada hasil pencariannya, bisa jadi kan hasilnya sampe 10000 data maka dari itu amat diperlukan fitur pagination. Pagination sendiri kita buat dengan memanfaatkan fitur Carraydataprovider agar mudah diintergrasikan dengan componen yang ada pada Yii.

Lalu pada view, buatlah sebuah file “search.php” lalu isi seperti berikut :

<?php
  $this->pageTitle=Yii::app()->name . ' - Search';
  $this->breadcrumbs=array(
    'Search',
  );
?>
<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
   'id'=>'login-form',
   'enableClientValidation'=>true,
   'method'=>'GET',
)); ?>
<?php echo 'Kata Kunci : '; ?>
<?php echo Chtml::textField('keyword','',array('placeholder'=>'Masukan Kata kunci anda...','style'=>'width:340px;')); ?>
<?php echo CHtml::submitButton('Search'); ?>
<?php $this->endWidget(); ?>
</div>
<h3>Hasil Pencarian untuk "<?php echo CHtml::encode($term); ?>"</h3>
<?php 
   if (!empty($results))
   {
      foreach($dataProvider->data as $result)
      { 
 ?> 
     <p><?php echo Chtml::link($query->highlightMatches(CHtml::encode($result->pk)),array('namaModel/view','id'=>$result->pk));?></p>
     <p><?php echo $query->highlightMatches(CHtml::encode($result->isi)); ?></p>
     <hr/>
<?php }
   $this->widget('CLinkPager', array('pages'=>$page,));
  }
  else
  { 
?>
   <p class="error">Tidak ada hasil yang cocok untuk pencarian tersebut.</p>
<?php 
  }
?>

Apabila telah selesai dan anda tidak melakukan kesalahan, maka anda akan mendapati tampilan kurang lebih seperti berikut saat melakukan pencarian :

Anda tertarik membuatnya pada website anda??

Selamat mencoba… Semoga membantu… 😀

[Yii Framework] Membuat Search Engine Dengan Apache Solr

Sebelumnya saya telah posting tentang “How to index data to Apache Solr” disini. Sekarang permasalahannya adalah bagaimana membuat fitur pencarian “search” dari data yang telah kita index tadi.. Sebelumnya saya harap anda mengerti terlebih dahulu konsep kerja Apache Solr agar tidak kebingunga..

Okeh, setelah anda telah berhasil melakukan indeks data seperti tutorial sebelumnya sekarang buatlah sebuah actionSearch pada suatu controller anda. Jangan lupa terlebih dahulu untuk memanggil fungsi dari PHP-Solr-Client untuk menghubungkan antara Apache Solr dengan PHP :

Yii::import('application.tambahan.*');
require_once('SolrPhpClient/Apache/Solr/Service.php');

Sebelumnya perlu saya jelaskan bahwa menu pencarian dengan apache solr dapat dilakukan dengan langsung mengakses Link nya secara langsung dari solr tersebut dengan Web Service (REST), tetapi yang akan saya gunakan adalah dengan menggunakan fungsi-fungsi penunjang pada SolrPhpClient..

Lalu buatlah sebuah actionSearch pada controller anda :

public function actionSearch()
 {
   $model=array(new Search);
   $result;
   if(isset($_GET['keyword']))
   { 
      $solr = new Apache_Solr_Service('localhost', 8983, '/solr');

      if ($solr->ping())
      {
         try
         { 
           $offset = 0;
           $limit = 10;

           $queries = array('subject:'.$_GET['keyword'].'^2 title:'.$_GET['keyword'].'^4',);
           foreach ( $queries as $query )
           {
               $response = $solr->search($query, $offset, $limit);
               if ($response->getHttpStatus() == 200 )
               { 
                  if ($response->response->numFound > 0 )
                  {
                       $i=0;
                       foreach ( $response->response->docs as $doc )
                       {
                           $model[$i]->id=$doc->id;
                           $model[$i]->category=$doc->category;
                           $model[$i]->subject=$doc->subject;
                           $model[$i]->title=$doc->title;
                           $i++;
                       }
                  }
               }
               else{echo $response->getHttpStatusMessage();}
            } 
          }
          catch(Exception $e){echo $e->getMessage();}
       } 
   }
   $this->render('search',array('model'=>$model));
 }

Penjelasan : Pada contoh di atas, saya menangkap inputan user(keyword) dari menu pencarian. Setelah itu kita lakukan query pada apache solr, kemudian hasilnya saya simpan dalam sebuah array sebuah model bernama “Search”. Dan setelah itu, kita kirim nilainya ke tampilan kita guna ditampilkan pada user. Lalu buatlah tampilan seperti berikut untuk menampilkannya :

<?php foreach($model as $i => $aa): ?>

<div class="view">
 <h4><?php echo CHtml::link(CHtml::encode($aa->title), array($aa->category.'/view', 'id'=>$aa->id)); ?></h4>
 <?php echo '<br/>' ?>
</div>

Selesai…

Selamat mencoba…

Semoga membantu.. 😀

[Yii Framework] Membuat Multi Select Control dengan EMultiSelect

Cukup sering kita temukan kasus yang membutuhkan suatu form yang mengizinkan user menginput pilihan yang dapat dipilih lebih dari satu pilihan. Ada banyak cara yang bisa diterapkan untuk memungkinkan form seperti itu, tapi salah satu yang cukup efektif menurut saya adalah menggunakan extension EMultiSelect yang mana hasilnya adalah seperti gambar berikut :

Big thanks lah buat developernya emultiselect.. Kita sudah dimanjakan dengan fitur add, remove, search, add all, dan remove all dengan menggunakan emultiselect..  Lalu bagaimana cara menerapkannya pada code kita??

Seperti biasa, donlot extensionnya dari link di atas dan pindahkan ke folder extensions yang ada pada project anda..

Lalu pada tampilan anda, masukkan code berikut :

 $isis=CHtml::listData(Lfunction::model()->findAll(),'id','label');
 $this->widget(
    'application.extensions.emultiselect.EMultiSelect',
    array('sortable'=>true, 'searchable'=>true)
 );

 echo $form->listBox($model,'namaAttribute',
       $isis,array('multiple'=>'multiple','key'=>'label', 'class'=>'multiselect',
      'style'=>'width:650px')
 );

Penejelasan : pada kode diatas pertama-tama kita mendefinisikan terlebih dahulu extension EMultiSelect. Lalu kita definisikan sebuah control “listbox” (anda dapat gunakan listbox ataupun dropdownlist untuk menggunakan emultiselect) kemudian kita masukkan class “multiselect” ke dala listbox tersebut. Lalu jangan lupa untuk melemparkan data option-option yang akan mengisi control tersebut..

Dan sekarang tinggal “How to save our data from emultiselect?”. Anda harus lakukan sedikit perubahan pada controller anda seperti berikut :

foreach ($_POST['NamaModel']['namaAttribute'] as $ii) 
 {
    $model2=new NamaModel;
    $model2->namaAttribute=$ii;
    $model2->save();
 }

 

Pada kode di atas, kita mengambil masing-masing nilai yang sudah di pilih pada multi select. Kemudian satu persatu datanya kita simpan dalam database kita..

Selesai..

Selamat mencoba…

Semoga membantu… 😀

%d bloggers like this: