[PHP Mongodb] Conditional Queries

Ada kondisi dimana kita ingin mencari data “lebih besar dari”, “lebih kecil dari”, dan lain-lain yang melibatkan nilai angka. Pada mongodb dengan PHP kita dapat menggunakannya dengan menggunakan Conditional Queries dimana terdapat beberapa jenis yang dapat kita gunakan diantaranya contohnya :

  • $gt = (greater than) sama dengan operator “>” pada sql
  • $lt = (lower than) sama dengan operator “<” pada sql
  • $gte = (greater than equal) sama dengan operator “>=” pada sql
  • $lte = (lower than equal) sama dengan operator “<=” pada sql
  • $ne = (not equal) sama dengan “<>” pada sql

Nah, itulah beberapa contoh operatornya. Dan berikut cara penggunannya pada code PHP :

$namaCollection->find(array('x' => array('$gt' => 100)));

$namaCollection->find(array('x' => array('$lt' => 100)));

$namaCollection->find(array('x' => array('$gte' => 100)));

$namaCollection->find(array('x' => array('$lte' => 100)));

$namaCollection->find(array('x' => array('$ne' => 100)));

Itulah beberapa contohnya. Dapat anda lihat, operator yang kita gunakan harus diapit dengan single quote ‘. Anda juga dapat membuat code untuk operator pencarian “between” dengan mengkombinasikan penggunan $gte dan $lte like this :

 
$namaCollection->find(array('x' => array('$gte' => 100, '$lte' => 200)));

Selesai, Selamat mencoba..

Happy coding..

[Yii Framework + Mongodb] Select Collection And View

From my previous post here https://sabitlabscode.wordpress.com/2013/06/28/yii-framework-mongodb-insert-value/, sekarang saya akan coba paparkan cara menampilkan suatu data dalam suatu collection dan bagimana menampilkan halaman detail dari suatu nilai. First, create fungsi baru di model “SiswaForm” yang telah kita buat tadi :

    //return all value from a collcetion
    public function findallmongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('siswa');
            return $collection->find();
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    //find a value from collection by id
    public function findOneById($id)
    {
        try 
        {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('siswa');
            return $collection->findOne(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

Next, create dua buah action di controller. Action pertama digunakan untuk menampilkan all data from collection. Yang kedua untuk menampilkan detail data from collection yang telah kita pilih. Insert this code to controller :

    //action for show all data in a collection
    public function actionIndex()
    {
        $model=new SiswaForm;
        $data=$model->findallmongo();
        $this->render('index',array(
            'data'=>$data,
        ));
    }

    //action for show a detail data from collection
    public function actionView($id)
    {
        $model=new SiswaForm;
        $data=$model->findOneById($id);
        $this->render('view',array(
            'data'=>$data,
        ));
    }

Setelah selesai, kita akan create view untuk masing-masing action. Yang pertama adalah view “index” for actionIndex dan yang kedua adalah view “view” for actionView. Berikut adalah code view “index” :

<h1>Test Mongo - Siswa</h1>
<?php 
    while ($data->hasNext()):
        $siswa = $data->getNext(); 
?>
<h2><?php echo CHtml::link($siswa['name'],array('view','id'=>$siswa['_id'])); ?></h2>
<p><?php echo $siswa['kota']; ?></p>
<p><?php echo $siswa['jk']; ?></p>
<?php if(isset($siswa['alamat'])){ ?>
    <p><?php echo $siswa['alamat']; ?></p>
<?php } ?>
<?php endwhile; ?>

Kemudian berikut adalah view “view”

<h1>Test Mongo - Siswa</h1>
<h2><?php echo $data['name']; ?></h2>
<p><?php echo $data['kota']; ?></p>
<p><?php echo $data['jk']; ?></p>
<?php if(isset($data['alamat'])){ ?>
    <p><?php echo $data['alamat']; ?></p>
<?php } ?>

Selesai… You can run your application now..

Happy coding..

[Yii Framework + Mongodb] Insert Value

Berikut adalah contoh melakukan insert data ke dalam mongodb dengan menggunkan Yii Framework. Sebelumnya perlu anda ketahui pada Yii Framework sendiri telah ada extension yang bagus digunakan untuk mengoneksikan Yii dengan Mongodb yaitu Yiimongodbsuite yang dapat anda lihat di http://www.yiiframework.com/extension/yiimongodbsuite/. Tetapi untuk postingan kali ini saya tidak menggunakan extension tersebut. Dengan begitu code ini dapat diimplementasikan baik di Yii, framework PHP lain, maupun menggunakan pure PHP.

Sebelum memulai, pastikan bahwa server anda telah memiliki driver untuk mongodb, jika belum silahkan install. Pertama-tama buatlah database, lalu collection seperti postingan ini. Lalu dengan mengacu collection tersebut, buatlah sebuah model pada Yii Framework dengan nama “SiswaForm”, masukkan code berikut :

<?php

class SiswaForm extends CFormModel
{
  public $name;
  public $jk;
  public $kota;
  public $alamat;
  public $createddate;

  public function rules()
  {
     return array(
        array('name', 'required'),
     );
  }

  public function attributeLabels()
  {
     return array(
        'name'=>'Name',
        'jk'=>'Sex',
        'kota'=>'City',
        'alamat'=>'Address',
        'createddate'=>'Crated Date',
     );
   }

  //digunakan untuk menyimpan data pada mongodb
  public function savemongo()
  {
     try {
       //memanggil class mongodb, secara default port mongodb adalah 27071. Jika portnya berbeda, maka 
       //anda perlu melakukan konfigurasi lagi pada code. Find it on google.
       $connection = new Mongo();
       //menentukan dataabase mana yang akan kita gunakan.
       $database = $connection->selectDB('belajar');
       //mendefinisikan suatu collection ke dalam variabel
       $collection = $database->selectCollection('siswa');
       // memasukkan nilai-nilai ke dalam collection
       // jika anda menggunakan code selain Yii. Just change the value with your value.
       $varsiswa = array(
          'name' => $this->name,
          'jk' => $this->jk,
          'kota'=>$this->kota,
          'alamat'=>$this->alamat,
          'createddate' => new MongoDate() // this is for insert an automatic date from mongodb
       );
       //save data
        $collection->insert($varsiswa,array('safe'=>true));
        return true;
     }
     catch(MongoConnectionException $e) { 
        //let you know when it failed connect to your database
        die("Failed to connect to database ".$e->getMessage());
     }
     catch(MongoException $e) {
        // let you know when we failed to insert data.
        die('Failed to insert data '.$e->getMessage());
     }
   }
}

Code di atas digunakan untuk menyediakan inputan data yang akan dimasukkan ke dalam mongodb collection. Juga terdapat fungsi “savemongo()” dimana fungsi tersebutlah yang akan menyimpan data ke dalam mongodb collection. Penjelasan dari code tersebut dapat anda lihat pada komentar nya.

Setelah itu buatlah sebuah action seperti berikut :

    public function actionSiswa()
    {
        $model=new SiswaForm;
        if(isset($_POST['SiswaForm']))
        {
            $model->name=$_POST['SiswaForm']['name'];
            $model->jk=$_POST['SiswaForm']['jk'];
            $model->kota=$_POST['SiswaForm']['kota'];
            $model->alamat=$_POST['SiswaForm']['alamat'];
            if($model->validate())
            {
                if($model->savemongo())
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('siswa',array('model'=>$model));
    }

Lalu terakhir, buatlah view “siswa” dengan membuat viewnya dan masukkan code berikut :

<h1>Test Mongo - Siswa</h1>
<div>
<?php $form=$this->beginWidget('CActiveForm', array(
    'id'=>'contact-form',
    'enableClientValidation'=>true,
    'clientOptions'=>array(
        'validateOnSubmit'=>true,
    ),
)); ?>

    <p>Fields with <span>*</span> are required.</p>

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

    <div>
        <?php echo $form->labelEx($model,'name'); ?>
        <?php echo $form->textField($model,'name'); ?>
        <?php echo $form->error($model,'name'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'jk'); ?>
        <?php echo $form->textField($model,'jk'); ?>
        <?php echo $form->error($model,'jk'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'kota'); ?>
        <?php echo $form->textField($model,'kota',array('size'=>60,'maxlength'=>128)); ?>
        <?php echo $form->error($model,'kota'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'alamat'); ?>
        <?php echo $form->textArea($model,'alamat',array('rows'=>6, 'cols'=>50)); ?>
        <?php echo $form->error($model,'alamat'); ?>
    </div>
    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

Selesai,.. Jalankan aplikasi anda. Untuk melihat apakah data yang diinsert berhasil atau tidak, lihatlah melalui command prompot anda (bila tidak tahu lihat tutorial saya sebelumnya)..

Happy coding..

[Mongodb] Create, Insert And Select Document In Collection

Pertama untuk mendefinisikan sebuah database masukkan code berikut kedalam command prompt anda :

use namadatabase

Lalu untuk memasukkan data baru ke dalam sebuah collection, buatlah code berikut ke dalam command prompt anda :

> db.siswa.insert({name:"Sabit Huraira",jk:"Laki-laki",kota:"1"})
> db.siswa.insert({name:"Fithri Selva",jk:"Perempuan",kota:"2"})
> db.siswa.insert({name:"Fariko",jk:"Perempuan",kota:"3",alamat:"Palembang"})

Dapat anda lihat pada baris 1 dan 2 kita menginput data dengan document yang sama. Sedangkan pada baris ke 3 kita menginput dengan document baru yaitu “alamat”. Itulah salah satu kelebihan mongodb..

Jika anda ingin melhat data yang telah diinput, masukkan command berikut :

> db.siswa.find()

Lalu akan muncul hasil seperti berikut :

 
{ "_id" : ObjectId("51cc2f21bd6570d7b8966faa"), "name" : "Sabit Huraira", "jk" :
 "Laki-laki", "kota" : "1" }
{ "_id" : ObjectId("51cc2f47bd6570d7b8966fab"), "name" : "Fithri Selva", "jk" :
"Perempuan", "kota" : "2" }
{ "_id" : ObjectId("51cc2fadbd6570d7b8966fac"), "name" : "Fariko", "jk" : "Perem
puan", "kota" : "3", "alamat" : "Palembang" }
>

Selesai.. Happy coding..

[Yii Framework] How To Call Widget With Smarty Template

Kebetulan ada kerjaan yang menggunakan smarty dan Yii Framework. Walau ada beberapa perbedaan dengan menggunakan syintax PHP biasa, tetapi penggunaan smarty tidak sulit untuk dipelajari. Tetapi ketika mencoba memanggil sebuah widget Yii menggunakan smarty, awal nya menggunakan code seperti berikut :

{$this->widget(‘listsmarty’, array(‘textnya’=>$textnya]))}

kemudian muncul pesan error yang mengatakan kesalahan penggunaan syntaxt quote bla bla bla.. Ternyata pada smarty penggunan syntaxt yang mengandung array() harus diganti dengan menggunakan kurung siku “[]” sehingga kode nya menjadi seperti berikut :

{$this->widget(‘listsmarty’, [‘textnya’=>$textnya])}

Tetapi setelah kode di atas dijalankan, ternyata masih menyisakan error yang mengatakan bahwa class “listsmarty” tidak dapat di konversi ke dalam bentuk string. Tetapi ternyata kode tersebut dapat dijalankan dengan lancar setelah digunakan kode berikut :

{$this->widget(‘listsmarty’, [‘textnya’=>$textnya],true)}
Setelah itu kode akan menampilkan widget yang kita inginkan.. Tentu hal tersebut juga berlaku untuk cgridview, clistview..

Selesai.. Semoga bermanfaat…

Happy coding..

Auto Increment Trigger Oracle Not Work With Yii Framework Active Record

Sebelumnya saya telah memaparkan bagaimana cara membuat sebuah auto increment pada oracle disini. Tetapi setelah di implementasikan langsung dengan menggunakan Yii Framework ternyata trigger tersebut tidak berjalan. Perlu diketahui fungsi ini tidak berjalan ketika menggunakan active record pada Yii. Sedangkan jika anda menggunakan query builder atau DAO ini tidak masalah.  Saya menemukan hal ini dengan menggunakan Yii Framework versi 1.1.13, semoga versi selanjutnya dapat menyelesaikan masalah ini..

Mengapa tidak berjalan ? berikut alur kerja penyimpanannya menggunakan active record :

– kita mendefinisikan model

– memasukkan data

– menyimpan data , pada proses ini seharusnya sesaat sebelum insert data Yii sudah menjalankan trigger yang telah kita buat sebelumnya. Tetapi ternyata dia tidak melakukan hal tersebut melainkan langsung menyimpan dan menyebabkan error. Andaikata kita menyisipkan sebuah nilai pada field auto increment tadi, maka setelah penyimpanan berhasil dilakukan tetapi nilai dari field auto increment akan mengikuti nilai sequence kita.

Untuk mengatasi hal tersebut, maka saya putuskan untuk menghilangkan trigger yang ada pada oracle, dan membuat sendiri fungsi pada Yii yang akan selalu dijalankan sebelum proses insert data baru terjadi. Caranya cukup mudah, cukup sisipkan code beforeValidate pada model anda seperti berikut :

    public function beforeValidate()
    {
        if(Yii::app()->db->driverName=="oci")
        {

            $connection = Yii::app()->db;
            if($this->primaryKey==NULL)
            {            
                $sql = "select nama_sequence_anda.NEXTVAL from DUAL";
                $command = $connection->createCommand($sql);
                $this->primaryKey = $command->queryScalar();

            }
        }
        return parent::beforeValidate();
    }

Fungsi di atas akan selalu dijalankan sebelum data divalidasi. Pada fungsi tersebut dapat anda lihat kita melakukan cek terlebih dahulu apakah database yang dituju adalah oracle atau bukan. Kemudian ketika primary key dari data yang kita input adalah NULL (artinya dia data baru, dan tidak dijalankan untuk fungsi update) maka dia akan mengambil nilai terakhir dari sebuah sequence yang telah kita buat sebelumnya dan menyisipkannya ke dalam nilai primary key..

Auto Increment In Oracle

Bagi anda yang terbiasa menggunakan MySql dalam membangung aplikasi, mungkin sudah tidak asing lagi dengan istilah auto increment. Auto increment sendiri adalah penandaan suatu field agar setiap kali kita insert data maka field tersebut tidak perlu lagi diinput melainkan akan secara otomatis diinput dengan sebuah nilai angka yang berurutan. Misal ada field “id” dan “nama”, dimana field  “id” adalah auto increment. Ketika insert data, kita hanya perlu memasukkan nilai “nama” saja di dalam field tersebut, sedangkan field “id” akan terisi otomatis dengan suatu nilai angka yang selalu berurutan misal 1, selanjutnya 2 selanjutnya 3 dan seterusnya.

Nah, ketika anda menggunakan oracle fitur auto increment tidaklah sesederhana itu. Oracle sendiri tidak menyediakan secara langsung sebuah tipe seperti itu (auto increment).  Maka dari itu kita perlu menyisipkan suatu script di dalam oracle database untuk membuatnya dapat bekerja seolah-olah memiliki tipe auto increment.

Pertama-tama buatlah sebuah sequence pada database anda.

CREATE SEQUENCE nama_sequence
    INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE NOCACHE ORDER;

Kemudian buatlah sebuah trigger dimana trigger tersebut akan selalu dijalnkan sebelum kita menyimpan suatu data baru ke tabel tersebut :

create or replace 
TRIGGER nama_trigger 
    BEFORE INSERT ON nama_tabel_anda 
      FOR EACH ROW
      BEGIN
         SELECT nama_sequence.NEXTVAL
         INTO   :new.nama_field_yang_akan_dibuat_auto_increment
         FROM   dual;
      END;

Selesai, untuk memastikan apakah sudah auto increment atau belum, cobalah menginput sebuah data dimana anda mengosongkan field yang telah anda buat auto increment pada oracle…

Install PHPUnit On Windows

Berikut beberapa tahapan melakukan installasi PHPUnit pada server windows anda. Dalam postingan ini dijelaskan proses installasi dengan menggunakan PEAR. Saya asumsukan bahwa anda sudah memiliki PEAR pada server anda. Lalu buka command promt anda, lalu ketikkan perintah berikut :

1.  pear channel-discover pear.phpunit.de
2. pear channel-discover components.ez.no
3. pear channel-discover pear.symfony-project.com
4. pear install phpunit/PHPUnit

Untuk mengetahui apakah proses installasi berhasil dilakukan, ketikkan perintah “phpunit” pada command prompt anda. Jika berhasil maka command prompt akan menampilkan beberapa command-command PHPUnit . Jika tidak berarti proses installasi gagal dilakukan. Maka cobalah masukkan perintah berikut pada command prompt anda :

1.  pear channel-discover pear.symfony.com

2.pear install pear.symfony.com/Yaml

3. pear install phpunit/PHPUnit

 

Selesai… Semoga membantu..

Happy coding..

 

Integrate Propel And Yii Framework

Beberapa hari kemarin sempat mencoba mengintegrasikan aplikasi Yii Framework menggunakan propel orm dengan dibantu seorang teman yang sudah pengalaman dengan propel orm. Untuk penjelasan tentang propel, bisa dilihat disini. Berikut adalah beberapa hal yang perlu dilakukan untuk mengintegrasikan aplikasi yii dengan propel orm.

1. Build sebuah build propel. Untuk cara membuat nya dapat dilihat disini.

2. Pindahkan folder tersebut ke dalam aplikasi anda tepatnya pada folder “protected/vendor”.

3. Pindahkan folder propel yang sudah anda download dari website propel ke dalam folder yang sama.

4. Lalu pada file index.php pada root aplikasi anda, code yang tadinya seperti ini :

require_once($yii);
Yii::createWebApplication($config)->run();

menjadi seperti berikut :

require_once($yii);
spl_autoload_unregister(array('YiiBase','autoload'));

require_once ('/protected/vendor/folderPropel/runtime/lib/Propel.php');
Propel::init("/protected/vendor/folder-build-propel/build/conf/crm-conf.php");
set_include_path("protected/vendor/folder-build-propel/build/classes" . PATH_SEPARATOR . get_include_path());
spl_autoload_register(array('Propel', 'autoload'));

spl_autoload_register(array('YiiBase', 'autoload'));
Yii::createWebApplication($config)->run();

Selesai.. anda dapat gunakan code propel di dalam aplikasi anda untuk terhubung ke database.. Masalah performance? terus terang saya belum implementasikan hal ini pada aplikasi real (hanya sebatas belajar).. jadi silahkan anda nilai sendiri..

Happy coding..

Preview Ebook “Yii Application Development Cookbook [Second Edition]”

Capture

Untuk kedua kalinya saya diminta Packt Publishing melakukan review bukunya. Kali ini saya diminta melakukan review buku seorang guru besar dan veteran Yii yaitu  Alexander Makarov yang berjudul “Yii Application Development Cookbook [Second Edition]”. Buku ini adalah second edition dari buku “Yii Application Development Cookbook” yang sudah pernah diterbitkan sebelumnya.

“Yii Application Development Cookbook [Second Edition]” Terdiri dari 13 chapter yang membahas topik-topik tertentu yang ada pada Yii Framework. Berikut adalah 13 chapter yang ada pada buku ini :

1. Under The Hood, bagian ini akan menjelaskan beberapa rangkuman hal-hal yang paling menarik dari Yii Framework. Setelah membaca bagian ini, mungkin para pembaca bisa menjadi lebih tertarik dengan Yii Framework.

2. Router, Controller, and Views. Membahas teknik-teknik untuk memperindah URL, menggunakan controller, memodifikasi view, membuat pesan dengan flash message dan lain-lain yang berhubungan dengan ketiga bahasan tersebut.

3. AJAX dan Jquery. AJAX dibahas secara khusus karena saat ini penggunaan AJAX sudah digunakan di banyak website di dunia. Hal itu karena fungsinya yang dapat memperindah tampilan, memudahkan komunikasi denga user, juga dapat memperbaiki performa aplikasi. Sedangkan Jquery sendiri adalah salah satu framework javascript paling populer saat ini.

4. Working With Forms. Anda akan belajar bagaimana memaksimalkan code pada form anda. Baik itu tata cara membuat validasi, menggunakan captcha, hingga melakukan upload file..

5. Testing Your Application, disini anda akan belajar bagaimana cara yang baik untuk melakukan testing aplikasi kita.

6. Database, ActiveRecord, and Model Tricks. Tahap ini adalah tahap dimana kita belajar melakukan pengelolaan database menggunakan activerecord dan model. Tidak hanya itu, pada bagian ini juga dipaparkan beberapa trik umum yang sering digunakan untuk menjalankan operasi CRUD.

7. Using Zii Components. Yii Framework sendiri menyediakan banyak komponen yang dapat kita gunakan untuk memaksimalkan kinerja aplikasi kita. Chapter ini akan membahas penggunaan komponen zii yang telah disediakan oleh Yii Framework.

8. Extending Yii.

9. Error Handling, Debugging, and Logging

10. Security. Salah satu isu yang pasti dipertanyakan dalam pengembangan website adalah masalah security. Disini akan dibahas beberapa celah security dan bagaimana  Yii Framework dapat mengatasinya..

11. Performance Tuning

12. Using External Code. Pada pengembangan website, tidak jarang kita membutuhkan bantuan kode dari pihak ketiga untuk memenuhi kebutuhan aplikasi kita. Chapter ini akan menjelaskan dan memberikan contoh bagaimana melakukan penggabungan kode pihak ketiga ke dalam aplikasi Yii Framewok yang telah kita kembangkan.

13. Deployment. Bagian ini akan menjelaskan hal-hal apa saja dan trik-trik yang perlu dilakukan ketika pengembangan website kita sudah masuk pada tahap development.

Itulah dia beberapa chapter yang ada di dalam ebook tersebut..  Jika anda tertarik untuk mendalami Yii Framework, tidak ada salahnya belajar dari buku ini. Karena selain bahasannya yang cukup mendalam, buku ini juga ditulis langsung oleh seorang guru besar Yii Framewok, Alexander Makarov. Dimana Alexander Makarov sendiri selalu aktif berpartisipasi dalam forum Yii yang tentu saja sudah memahami kesulitan apa saja yang sering ditanyakan oleh teman-teman yang sedang mendalami Yii Framework…

Terakhir dari saya untuk anda yang berminat memiki buku ini, dapat melihatnya langsung pada tautan berikut : http://www.packtpub.com/yii-application-development-cookbook-2nd-edition/book..

 

Happy coding 😀