[Yii Framework] Insert Banyak Data dengan Jappendo

Menanggapi request seorang teman yang ingin menginput banyak data sekaligus pada suatu tabel dengan menggunakan JAppendo. Dengan kasus misal input tabel dosen dan mahasiswa. Dimana dia ingin menginput beberapa data mahasiswa, mahasiswa diinput satu persatu, tetapi dosen hanya sekali terisi. Dimana semua nama mahasiswa tadi akan memiliki dosen yang telah diinput satu kali tadi. Sama seperti tutor tentang jappendo sebelumnya, kita definisikan dulu view di Jappendo yang kita miliki :

<table class="appendo-gii" id="<?php echo $id ?>">
 <thead>
   <tr>
      <th>Nama Mahasiswa</th><th>Kelas</th>
   </tr>
 </thead>
 <tbody>
   <?php if (count($model) == 0): ?>
     <tr>
       <td><?php echo CHtml::textField('nama[]','',array('style'=>'width:190px')); ?></td>
       <td><?php echo CHtml::textField('kelas[]','',array('style'=>'width:190px')); ?></td>
     </tr>
   <?php else: ?>
      <?php //for($i = 0; $i < count($model); ++$i): 
        foreach ($model as $value){
      ?>
    <tr>
       <td><?php echo CHtml::textField('nama[]',$value->dosis,array('style'=>'width:90px')); ?></td>
       <td><?php echo CHtml::textField('kelas[]',$value->jumlah,array('style'=>'width:90px')); ?></td>
    </tr>
 <?php } ?>
   <tr>
     <td><?php echo CHtml::textField('nama[]','',array('style'=>'width:90px')); ?></td>
     <td><?php echo CHtml::textField('kelas[]','',array('style'=>'width:90px')); ?></td>
   </tr>
 <?php endif; ?>
 </tbody>
</table>

Nah, pada kasus di atas saya umpamakan ada field: dosen, mahasiswa dan kelas. Di jappendo di atas hanya disimpan field mahasiswa dan kelas. Tapi di tidak ada field dosen..

Dimana field dosen, kita akan menambahkan field dosen di luar jappendo. Dimana nantinya user tinggal menginput field dosen 1 kali, dan mahasiswa bisa berkali-kali sesuai jumlah mahasiswa yang diinput. Setelah itu semua mahasiswa yang kita input tadinya akan memiliki nama dosen sesuai dengan yang sudah kita input sebelumnya.

Untuk membuat alur seperti itu, di form tempat kita input nanti masukkan code seperti berikut :

<div class="form">
<?php $form=$this->beginWidget('CActiveForm', array(
 '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,'diagnosa'); ?>
    <?php echo $form->textField($model,'diagnosa',array('size'=>60,'maxlength'=>255)); ?>
    <?php echo $form->error($model,'diagnosa'); ?>
 </div>

 <div class="row">
   <?php 
      $this->widget('application.extensions.appendo.JAppendo',array(
        'id' => 'repeateEnum',
        'model' => $model,
        'viewName' => 'namaViewJappendo',
        'labelDel' => 'Remove Row',
     )); 
 ?>
 </div>
<div class="row buttons">
 <?php echo CHtml::submitButton($model->isNewRecord ? 'Create' : 'Save'); ?>
 </div>
<?php $this->endWidget(); ?>
</div>

Kemudian setelah itu kita setting pada controller agar alur nya dapat sesuai dengan yang kita inginkan..

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

  if(isset($_POST['Mahasiswa']))
  {
     $total = count($_POST['nama']);
     for ($i = 0; $i <= $total; $i++)
     {
       if(isset($_POST['nama'][$i]))
       {
         $model2 = new Mahasiswa;
         $model2->dosen =$_POST['Mahasiswa']['dosen'];
         $model2->nama=$_POST['nama'][$i];
         $model2->kelas=$_POST['kelas'][$i];
         $model2->save();
      }
    }
    $this->redirect(array('admin'));
  }
  $this->render('create',array(
   'model'=>$model,
  ));
}

Pada code di atas kita memasukkan data mahasiswa dengan memasukkan masing-masing field yang ada pada jappendo.. Tetapi untuk field dosen kita ambil dari inputan dosen yang telah ada bukan di jappendo melainkan di form tersebut dan hanya diinput satu kali..

 

Selesai..

Selamat mencoba.. Semoga membantu..

[MongoDB] Integrasi MongoDB pada PHP

Akhir-akhir ini di dunia IT telah populer  konsep NoSQL untuk urusan simpan menyimpan data pada database. Apalagi banyak pemain besar di dunia IT seperti Facebook, Twitter, foursquare, dll telah menggunakan NoSQL untuk penyimpanan data mereka sehingga membuat banyak orang penasaran akan noSQL.. yah, termasuk saya.. Walau sedikit, udah mulai oprek-oprek tentang mongodb.. Yah, hingga sekarang sejujurnya masih cukup bingung dan belum menemukan kenyamanan di dalamnya (udah kebiasaan pake SQL mungkin). Tapi ga ada salahnya saya share apa yang sudah pernah saya pelajari.. yaitu mengintegrasikan MongoDb pada PHP..

Pertama-tama yang harus kita lakukan adalah menginstal mongodb terlebih dahulu di computer kita.. Pertama silahkan download mongoDB di http://www.mongodb.org/. Setelah anda selesai mendownload nya, ekstrak file nya dan silahkan lakukan proses instalasi dengan mengikuti step-step pada dokumentasi mongodb di http://docs.mongodb.org/manual/installation/. Karena saya menggunakannya pada windows, saya mengikuti tutorialnya di http://www.mongodb.org/display/DOCS/Quickstart+Windows. Dari dokumentasinya, anda dapat menjalankan mongodb dengan memilih sebuah file yang terdapat pada hasil downloadan tadi yaitu file bernama “mongod.exe”. Setelah sudah jalan, anda dapat otak-atik mongodb anda dengan script command dengan memilih file “mongo.exe” dahulu sebelumnya.. Okeh, saya anggap sudah berhasil..

Setelah itu saya ingin menjalankan agar mongodb dapat diakses dari aplikasi PHP saya.. Pertama-tama yang harus kita lakukan adalah menginstal driver mongoDB untuk PHP..  Anda dapat ikuti tutorial disini : http://www.mongodb.org/display/DOCS/PHP+Language+Center. Saya sendiri akan menerangkan cara instalasi pada windows.. Sebenarnya sama dengan cara menginstal extension-extension PHP lainnya.. Pertama download terlebih dahulu driver nya pada link yang ada di atas. Setelah itu pindahkan file “php_mongo.dll” pada direktori server anda. Saya menggunakan Wamp server biasa direktorinya di “C:\wamp\bin\php\php5.3.5\ext”, jika anda menggunakan server lain silahkan sesuaikan path nya di server masing-masing.. Kemudian pada file php.ini tambahkan code berikut : “extension=php_mongo.dll”. Itu digunakan untuk mengaktifkan driver mongoDb pada server kita agar dapat dijalankan PHP. Selesai…

Restart server anda.. jika telah terinstal, maka saat membuat localhost, akan muncul tampilan wamp server seperti ini :

Anda dapat lihat pada list-list extensions terdapat sebuah extension dengan tulisan “mongo”. Nah, jika sudah berhasil itu artinya anda sudah dapat menjalankan mongodb pada PHP..

Agar lebih user friendly digunkan, kita dapat menggunakan AdminUi, yah mungkin sejenis phpMyAdmin atau pgAdmin nya postgresql.. Ada banyak admin UI di mongodb, berikut listnya http://www.mongodb.org/display/DOCS/Admin+UIs. Saya sendiri sudah coba beberapa, kalo yang berbasis web cukup nyaman menggunkana rockmongo.. http://rockmongo.com/.

Yah, bagaimana tertarik? saya sendiri baru mencicipi dasar-dasarnya saja.. Masih belum mendalami tahap “mengapa saya harus menggunakan mongodb”..  🙂 semoga ke depannya masih dapat menggali..

 

Bagi anda yang tertarik.. selamat mencoba..

Semoga membantu.. 🙂

[Yii Framework] Membuat Level Access User dengan Rights Extension

Selama ini saya selalu membuat sendiri alur dan code untuk melakukan level akses user untuk mengontrol hak akses user pada sistem yang saya buat.. Sebanarnya pada Yii sudah ada extension yang menyediakan fitur untuk pengaturan level akses user ini agar kita dapat membuat pengaturan level akses user secara dinamis pada aplikasi yang kita bangun. Sejauh ini yang saya tahu extension yang sudah populer untuk membuat level akses user di kalangan yii adalah Rights dan SRBAC. Dan walau sudah lama saya memecahkan masalah ini dengan coding sendiri, akhirnya tadi malam timbul rasa penasaran saya untuk mencicipi penggunaan extension dalam kasus ini. Saya bandingkan antara Rights dan SRBAC akhirnya saya pilih Rights.. yah, tidak ada alasan ilmiah kenapa saya pilih Rights daripada SRBAC, hanya berdasarkan total “Like” nya dan rights ada contoh blog nya yang bisa saya coba langsung..

Sebelum lebih lanjut, bagi anda yang belum pernah mencoba membuat level akses user secara manual, saya sarankan jangan langsug menggunakan extension.. Ada baiknya pelajari terlebih dahulu dengan membuat sendiri (di blog ini ada tutor nya).. paling tidak membantu anda dalam mempelajari dan memahami terlebih dahulu tentang level akses user..

Okeh mari kita bahas penggunaan extension ini. Pertama-tama, silahkan download terlebih dahulu extension rights di : http://www.yiiframework.com/extension/rights/ Dan jangan lupa untuk mendownload dokumentasi dan contoh blog nya.. Paling tidak ini bisa sangat membantu ketika anda kesulitasn.. Setelah sudah mendownload nya, silahkan anda buat aplikasi baru anda dengan Yii Framework. Sebelum menginstal rights extension pada aplikasi anda, buatlah terlebih dahulu agar aplikasi anda dapat melakukan operasi login, logout, register yang sudah terhubung dengan database (jika anda tidak tahu caranya, saya sudah pernah posting di blog ini silahkan dicari yak.. 🙂 ). Anda sudah selesai melakukannya ? jika iya baru kita akan satukan extension rights.

Unpack rights extension yang telah anda download tadi lalu pindahkan pada aplikasi anda tepatnya pada direktori “protected/modules”. Kemudian lakukan setting pada file “protected/config/main.php” menjadi seperti berikut :

'import'=>array(
 'application.models.*',
 'application.components.*',
 'application.modules.rights.*',  // mendefinisikan rights modules ke dalam aplikasi kita
 'application.modules.rights.components.*',  // mendefinisikan rights modules components ke dalam aplikasi kita
 ),
'modules'=>array(
 'rights'=>array(
    'superuserName'=>'Admin',
    'userIdColumn'=>'id',    // mengeset nama colom yang menjadi id user
    'userNameColumn'=>'username',  mengeset nama colom yang menjadi username user
    'install'=>true, // jika anda ingin menginstall, jika sudah terinstal dihilangkan saja baris ini
    ),
),
'components'=>array(
  'user'=>array(
    'allowAutoLogin'=>true,
    'class'=>'RWebUser',
 ),
 'authManager'=>array(
    'class'=>'RDbAuthManager',
 ),
),

Sebelumnya perlu anda ketahui bahwa rights extension akan mengakses sebuah model bernama “User” untuk mengecek seorang user. Jika memang anda memberi nama model anda dengan nama lain misal “member”,”tabel_anggota”, dan lain-lain anda harus lakukan pengaturan lagi pada configurasi di atas. Bagaimana configurasi nya? silahkan baca dokumentasi yang ada dari rights extensions..

Jika sudah melakukan konfigurasi di atas, untuk menginstall rights extension di aplikasi anda silahkan mengakses url “http://localhost/namaaplikasianda/index.php?r=rights” pada browser anda.. Jika berhasil, maka pada database anda akan terdapat 4 buah tabel baru yang di generate dari Rights extension. Ingat setelah kita menginstal rights extension user yang diizinkan untuk mengakses nya adalah user yang melakukan penginstalan tadi. Misal tadi saya login dengan username “admin”, secara otomatis si “admin” ini lah yang diizinkan mengakses rights, jika user lain maka tidak bisa.. Tetapi setelah itu si “admin” dapat memberikan hak yang sama kepada user lain sesuai dengan yang dia inginkan.. Setelah sudah terinstal, silahkan masuk kembali ke url di atas.. maka anda akan melihat tampilan seperti berikut :

Okeh, pada menu tersebut terdapat 5 buah menu.. mari kita bahas satu persatu menu tersebut :

  1. Assignment : ini adalah menu yang digunakan untuk memberikak hak akses kepada seorang user. Hak akses yang diberikan bisa dengan cara memberikan pangkat (level) kepada seorang user atau memberikan langsung izin seorang user mengakses sebuah “task” (controller) atau lebih detail lagi sebuah operastion (action di dalam controller). Jadi saya bisa memberikan “sabit” pangkat admin, saya juga bisa mengizinkan “sabit” mengakses controller “PegawaiController” atau saya juga menentukan apakah “sabit” boleh mengakses “actionCreate” yang ada di controller pegawai.. Menarik bukan??
  2. Permissions : disini adalah tempat dimana kita menentukan suatu level boleh mengakses siapa saja. Misal kita memiliki level “momod” kita mengizinkan dia mengakses actionCreate,actionDelete, dan actionUpdate.. kita cukup mengeset nilai “assign”(mengizinkan) atau “revoke” (tidak mengizinkan) pada si level momod. Dan tentu saja ini dapat dilakukan konfigurasinya pada semua level. Note : level admin adalah super user, dia diizinkan mengakses apa saja termasuk menu rights extension.
  3. Roles : tempat dimana kita dapat menentukan level-level yang ada di dalam sistem kita. Misal kita ingin dalam sistem kita ada level “momod”, “content-writer”,”sekretaris” , dan lain-lain.. disinilah tempatnya..
  4. Tasks : kita dapat menentukan tasks apa saja yang ada di dalam sistem kita. Biasanya digunakan untuk memberikan hak penuh pada suatu controller di semua actionnya..
  5. Operations : digunakan untuk melakukan pengesetan level akses user pada suatu action yang ada di controller.

Okeh, sudah saya paparkan.. Jika memang masih sulit dipahami ada baiknya anda langsung mencoba atau membaca kembali dokumentasi rights.. karena  saya juga masih belum terlalu dalam memahami extension ini.. 🙂

Nah, jika telah berhasil cobalah untuk memberi hak akses kepada seorang user baik berdasarkan “task”,”operastion” ,maupun “role” nya.. Jika sudah, ada satu hal lagi yang perlu anda konfigurasi.. yaitu pada file “protected/components/Controller.php” rubahlah extend classnya yang semula seperti ini :

class Controller extends CController

Menjadi seperti ini :

class Controller extends RController

Itu dimaksudkan untuk mengizinkan right extension di terapkan filter nya pada masing-masing controller yang ada di aplikasi kita.. Kemudian jangan lupa di controller kita masing-masing di set code seperti berikut :

public function filters()
 {
   return array(
     'rights',
   );
 }

Hal itu dilakukan untuk memastikan filter yang dijalankan pada controller tersebut adalah filter yang berasal dari Rights extension..

Selesai.. anda dapat mendalami penggunaan rights extension dengan melihat dokumentassi, forum, contoh blog  rights extension di internet maupun website Yii…

Selamat mencoba..

Semoga membantu… 🙂

[Yii Framework] Membuat Custom Otomatis Value ke Database

Banyak kasus dan pertanyaan dari orang -orang tentang membuat nilai yang otomatis diinput ke dalam database tapi dengan mengikuti aturan bisnis yang dimiliki. Misal pada suatu tabel, kita ingin sebuah field tidak perlu kita input melainkan secara otomatis kode tersebut akan bernama “KD-001″,”KD-002″,”KD-003” dan seterusnya.. Secara logika yang perlu kita lakukan adalah mengetahui terlebih dahulu nilai terkahir yang ada pada database misal “3” lalu nilai kita saat ini tinggal menginput 3+1 yaitu 4. Okeh, mari kita bahas..

Misal saya memiliki sebuah tabel yang terdiri dari 3 buah field “nilai1″,”nilai2″,”nilai3”. Kita ingin field “nilai1” tidak diinput melainkan secara otomatis diisi ketika kita menginput sebuah nilai ke dalam database. Saya asumsikan nilai yang diinput ke dalam field nilai1 adalah “sabit-1″,”sabit-2”, “sabit-3” dan seterusnya.. Pokok nya di depannya ada kata “sabit-” dan diikuti angka terakhir sesuai dengan yang sudah ada di dababase. Untuk melakukan ini, kita bisa menggunakan event trigger yang ada pada Yii Framework seperti beforeSave atau beforeValidate. Disini saya akan gunakan fungsi beforeValidate dan didefinisikan di model seperti berikut :

protected function beforeValidate() 
 {
   parent::beforeValidate();
   $date = new DateTime();
   if($this->isNewRecord)
   {
     $criteria=new CDbCriteria;      //kita menggunakan criteria untuk mengetahui nomor terakhir dari database
     $criteria->select = 'nilai1';   //yang ingin kita lihat adalah field "nilai1"
     $criteria->limit=1;             // kita hanya mengambil 1 buah nilai terakhir
     $criteria->order='nilai1 DESC';  //yang dimbil nilai terakhir
     $last = $this->find($criteria);
     if($last)   // jika ternyata ada nilai dalam data tersebut maka nilai nya saat ini tinggal di tambah 1 dari data sebelumya
     {
       $newID = (int)substr($last->nilai1,6) + 1;
       $newID = 'sabit-'.$newID;
     }
     else  //jika ternyata pada tabel terebut masih kosong, maka akan di input otomatis nilai "sabit-1" karena memang belum ada sebelumnya nilai lain
     {
       $newID = 'sabit-1';
     }
     $this->nilai1=$newID; // nilai1 di set nilai yang sudah di dapat tadi
  } 
  return true;
 }

Penjelasa  : fungsi di atas menggunakan beforeValidate. Dengan adanya beforeValidate, berarti setiap sebelum melakukan validasi saat akan menyimpan data maka akan dijalankan fungsi ini. Jadi ketika anda menginput sebuah data, maka tanpa diketahui oleh user, kita memasukkan nilai pada field “nilai1” secara otomatis…

Selesai.. Selamat mencoba..

Semoga membantu… 🙂