[Review Book] Instant Building Multi-Page Forms with Yii How-to

Cover Image

For the third time pactk give me an apprecation to review their book. Now they ask me to try review book “Instant Building Multi-Page Form With Yii How To” from Udah Sawant. First, this book not a general Yii book that learn about all of Yii from installation until implementation. This book focuss to teach you about “how to make a multi page form in Yii Framework?”. What that mean about “multi page form”? Multi page form is a mechanism make a form (usually to insert/update data) that have some step. For example want insert my profile, in step 1 we insert name and address, step 2 upload my foto, step 3 upload my CV.

This book have 51 page and its good for you both beginners or not because this book will teach you from the basic of Yii Framework. Uday Sawant have been make the session group from the beginners, intermediate till advance. This is what will you learn :

– start with yii Fraemework and do some setting

– make a generate code CRUD operation (you will learn some concept about model, view and controller)

– create multipage  forms. So from the generate code CRUD operation, you will explode it become some form.

– Validate, you will learn to ensure your form run good when save data with validation.

– AJAX form. This is good point to learn because you can make better performance with this.

– Upload file, of course you must be know how to upload file to your server.

– Using multiple models, you will use this when your tabel have relations.

– Customising looks.

 

Thats it the session from the book. If you intereset with book, you can look it here,  so you can try it in your application . Hope it will help your code…

Happy Coding..

http://www.packtpub.com/building-multi-page-forms-yii/book

[ Yii Framework + MongoDb ] Update And Delete Data

Melanjutkan postingan sebelumnya di https://sabitlabscode.wordpress.com/2013/06/28/yii-framework-mongodb-select-collection-and-view/ sekarang kita akan mencoba membuat fungsi update dan delete. After all at least we can create a CRUD operation in Mongodb. Baiklah, pertama-tama mari kita create fungsi di model untuk mengeksekusi perintah update dan delete. Masukkan fungsi berikut pada model anda :

     public function editmongo($id) // udpdate data
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('siswa');
            //insert some value that we will change
            $varsiswa = array(
                'name' => $this->name,
                'jk' => $this->jk,
                'kota'=>$this->kota,
                'alamat'=>$this->alamat,
                'createddate' => new MongoDate()
            );
            //update data with parameter "_id" and insert value.
            $collection->update(array('_id' => new MongoId($id)),$varsiswa);
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to update data '.$e->getMessage());
        }
    }

    // function to delete data
    public function deletemongo($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->siswa;
            //delete data by document "_id"
            $collection->remove(array('_id'=>new MongoId($id)));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to do operation '.$e->getMessage());
        }
    }

Setelah itu mari kita buat action pada controller dimana action inilah yang akan dijalankan untuk melakukan request. Pada controller masukkan code berikut :

     public function actionUpdate($id)
    {
        $model=new SiswaForm;
        $data=$model->findOneById($id);
        $model->name=$data['name'];
        $model->jk=$data['jk'];
        $model->kota=$data['kota'];
        if(isset($data['alamat']))
            $model->alamat=$data['alamat'];

        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->editmongo($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('siswa',array('model'=>$model));    
    }

    public function actionDelete($id)
    {
        $model= new SiswaForm;
        $model->deletemongo($id);
        $this->redirect(array('index'));
    }

Dapat kita lihat pada action update dia me render halaman sedangkan delete tidak. Karena pada update me render halaman “siswa”, sedangkan halaman siswa sendiri sudah ada pada actionSiswa yang telah dibuat pada postingan sebelumnya. Jalankan fungsi tersebut..

Selesai.. 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..

[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..

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..

%d bloggers like this: