Message Box di Windows Phone 8

Mungkin ini hal yang sanggat dasar cocok untuk tahap awal pemrograman di windows phone 8, terkadang message box sanggat dibutuhkan dalam sebuah aplikasi jadi tidak menutup kemungkinan anda membutuhkan message box. Berikut aplikasi sederhana yang saya desain.

1. Buatlah sebuah page standard seperti gambar dibawah ini :

Image

2. Desainlah page yang ada di tahap 1 menjadi seperti dibawah ini

Image

  • Button Tampil untuk menampilkan pesan yang telah diinput ke dalam sebuah message box
  • Button cancel untuk menghapus pesan yang ada di text box

3. Ubahlah nama dari textbox menjadi tbPesan, tombol “Tampil” menjadi btnTampil dan tombol “Cancel” menjadi btnCancel.

4. Pilih tombol btnCancel dan aktifkan event Clicknya dengan cara mengklik 2 kali event Clicknya dan menambahkan coding di bawah ini

       private void btnCancel_Click(object sender, RoutedEventArgs e)
        {
            tbPesan.Text = "";
        }

5. Lakukan hal yang sama pada btnTampil dan tambahkan code seperti di bawah ini :

       private void Button_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(tbPesan.Text); //`1
            MessageBox.Show(tbPesan.Text, "Pesan",MessageBoxButton.OKCancel);//2
        }

Ada dua buah cara membuat message box,

1)      Dengan MessageBox.Show(“Isi  Pesan”);

Ini bisa digunakan jika message box yang bisa digunakan jika anda hanya membutuhkan message box yang sederhana tidak memutuhkan tombol cancel dan tidak membutuhkan judul.

2)      Dengan MessageBox.Show(“Isi Pesan”, “Judul Pesan”, Tombol);

Message box ini lebih lengkap dari pada yang sebelumnya, dimana message box ini bisa diatur judul message box dan bisa menentukan tombolnya apakah hanya tombol OK saja atau mau tombol OK dan Cancel

Advertisements

[PHP Mongodb] Implement MapReduce

In previous posti https://sabitlabscode.wordpress.com/2013/07/29/mongodb-understanding-mapreduce/ , saya sudah paparkan tentang mapreduce dan bagaimana cara membuatnya di mongodb. So, how to implement it in PHP? Sebenarnya tidak terlalu jauh berbeda dengan memanggil tabel biasa. Jika anda memiliki tabel “member” misal, anda bisa memanggil semua datanya pada PHP dengan :

             
$result = $database->selectCollection('member')->find();

untuk mapreduce anda dapat memanggil nya sama dengan cara di atas, seperti berikut :

             
$result = $database->selectCollection('your_mapreduce_name')->find();

Dan berikut adalah contoh lengkap mulai dari mendefinisikan mapreduce hingga memanggilnya pada PHP. Pertama kita harus mendefinisikan map dan reduce nya seperti berikut (i use same case with previous post) :

     public function getSiswabyjk()
    {
        try {
            $connection = new Mongo();
            //get your database
            $database = $connection->selectDB('your_database_name');
            //define map function
            $map1=new MongoCode("function(){emit(this.sex,1);}");
            //define reduce function
            $reduce1=new MongoCode("function(key,value){".
                "var count=0;".
                "for(var i=0;i<value.length;i++){".
                "count+=value[i]".
                "}".
                "return count;".
                "}");
            //define map reduce function
            $command = array(
                'mapreduce' => 'your_table_name_here', // set table name
                'map' => $map1, // set map
                'reduce' => $reduce1, // set reduce
                'out' => 'mapreduce_name'  //set name of mapreduce, it use for call mapreduce
            );
            //run mapreduce command
            $database->command($command);
            // get result from mapreduce
            $result = iterator_to_array($database->selectCollection('mapreduce_name')->find());
            return $result;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }                
    }

Finish, you can see the result from this function..
Happy coding..

[Mongodb] Understanding MapReduce

Mongodb memiliki sesuatu yang disebut mapreduce yang biasa digunakan untuk menganalisis data mongodb lebih jauh. Mapreduce sendiri adalah sebuah proses yang membagi-bagi suatu proses besar menjadi subtask2 yang lebih kecil. Pada map reduce sendiri terdapat dua buah proses yaitu map dan reduce.

– Map adalah proses dimana data yang besar akan dibagi-bagi menjadi beberapa bagian yang lebih kecil. For example kita ingin menganalisis orang  yang ada di seluruh Indonesia, kemudian kita bagi-bagi data nya berdasarkan provinsinya. Setelah itu data pada masing-masing provinsi akan di olah masing-masing secara independent dengan provinsi lain.

– Reduce adalah proses dimana hasil olahan pada proses Map tadi kita gabungkan untuk kita olah secara keseluruhan.

This is some example how we implement mapreduce in mongodb :

Misal saya memiliki table “member” with field : _id, name, sex(male,female). Kita ingin tahu total “member” male dan female. Untuk kasus ini kita gunakan map reduce. Pertama definisikan fungsi map :

             
//this code check data by field sex. It will return value like this male = [1][1] female =[1][1][1][1]
//always add [1] for its sex
var map1=function(){emit(this.sex,1);}

Setelah itu definisikan reduce nya :

 var reduce1 = function(key, values) {
   var count = 0;
   for (var i = 0; i < values.length; i++){
      count += values[i];
   }
   return count;
 };

Setelah itu kita gabungkan kedua fungsi di atas menjadi mapreduce seperti berikut :

 db.runCommand({
    mapreduce: 'your_table_name',
    map: map1,
    reduce: reduce1,
    out: 'name_that_you_call_for_this_mapreduce'
 })

Jika mapreduce anda sudah berhasil dibuat, maka dia akan menampilkan pesan yang memperlihatkan result nya. Tetapi jika tidak, maka dia akan menampilkan pesan error.

Kita telah selesai membuat mapreduce, sekarang bagaimana kita memanggilnya untuk melihat hasilnya? Cukup masukkan perintah berikut :

 db.name_that_you_call_for_this_mapreduce.find()

Finished, you can see the result.. Hope it help, Happy coding..

[Nodejs + Express] Make CRUD Operation With Mysql

Sebelumnya saya pernah posting simple example how to use nodejs dengan express untuk membuat form sederhana di https://sabitlabscode.wordpress.com/2013/07/03/nodejs-express-make-simple-form/. Tentunya tidaklah cukup hanya membuat simple form, paling tidak kita harus tahu bagaimana cara menghubungkan nodejs itu sendiri ke database. Kali ini saya akan memaparkan bagaimana membuat operasi CRUD (Create, Read, Update, Delete) pada nodejs dengan sasaran databasenya Mysql. Pertama-tama buatlah sebuah aplikasi baru dengan nodejs. Lalu hal yang kita butuhkan adalah sesuatu untuk menghubungkan nodejs dengan mysql database. Untuk itu kita perlu menginstallnya dengan cara mengetikkan code berikut pada command anda :

npm install mysql

Setelah itu definisikan module mysql pada aplikasi anda, pada app.js pastikan code konfigurasi anda seperti berikut :

 var express = require('express')
  , routes = require('./routes')
  , user = require('./routes/user')
  , http = require('http')
  , path = require('path')
  , mysql = require('mysql');

var app = express();
var connection = mysql.createConnection({
  host     : 'your host',
  user     : 'your user',
  password : 'your password',
  database : 'database name'
});

Saya asumsikan kita memiliki sebuah database dengan nama tabel “author” dimana tabel ini terdiri dari 3 buah column yaitu : id, first_name, dan last_name. Kita ingin membuat fungsi-fungsi yang dapat melakukan hal-hal berikut :

– melihat semua data pada tabel author

– melihat data detail pada tabel author

– menghapus data pada tabel author

– memperbaharui data pada tabel author

– membuat data baru

Pertama-tama, kita definisikan terlebih dahulu fungsi-fungsi di atas.

1. View All Data

Pada app.js, masukkan code berikut :

 //show all data from author table
app.get('/author', function(req, res) {
  sql='SELECT * FROM author';
  // execution sql and save result to "rows"
  connection.query(sql, function(e, rows, f) {
    if (!e) {
      //render "author" page
      //and send "rows" as "data" 
      res.render('author', {
        data: rows
      });
    }
  });
});

Kemudian pada folder “views”, buatlah file “author.jade” yang akan menampilkan user interfacenya. Masukkan code berikut pada file “author.jade” :

 extends layout

block content
  h1= title
  p Welcome to Author
  a(href="/author/new")!= "Add New Author"
  #Daftar Author
   table
    thead
     tr 
      th Firstname
      th Lastname
    tbody
    each row in data
        tr 
         td= row.first_name 
         td= row.last_name
         td
            a(href="/author/view/"+row.id)!= "View"

2. View Detail Data

Untuk menampilkan data secara detail, tambahkan kode berikut pada “app.js” :

 //view detail data
app.get('/author/view/:id', function(req, res) {
  //get parameter :id and save it in "tid"
  var tid=req.params.id;
  sql='SELECT * FROM author WHERE id='+connection.escape(tid);
  // execution query and save result to "rows"
  connection.query(sql, function(e, rows, f) {
    //check if there is error or data not found
    if (!e && (rows.length === 1)) 
    {
      //get first data and save it to "row"
      var row = rows[0];  
      //render "author_view" and send some value
      res.render('author_view', {
        title: 'New Author',
        data : row
      });
    } 
    else {
      //write error when error
        console.log(e);
    }
  });
});

Setelah itu buatlah “author_view.jade” pada folder “views” dan masukkan kode berikut :

 extends layout

block content
    h1= title
    div.newsiswa
        div
            div= data.first_name
            div= data.last_name
        a(href="/author/update/"+data.id)!= "[Update]"
        label   
        a(href="/author/delete/"+data.id)!= "[Delete]"

3. Insert New Data
Masukkan kode berikut pada app.js :

 //we have 2 request in author/new
//"get" will run when we request author/new
//and "post" will run when we do submit data
app.get('/author/new', function(req, res) {
      //render "author_new"
      res.render('author_new', {
        title: 'New Author'
      });
});

app.post('/author/new', function(req, res) {
  //get value that have been submitted
  //and save it in variable
  var fname = req.param('firstname');
  var lname = req.param('lastname');
  sql='INSERT INTO author(first_name,last_name) VALUES("'+fname+'","'+lname+'")';
  //do query
  connection.query(sql, function(e, rows, f) {
    if (!e) {
      res.redirect('/author')
    }
  });
});

dan untuk tampilannya yaitu “author_new.jade” masukkan code berikut :

 extends layout

block content
    h1= title
    div.newsiswa
        form( method="post")
            div
                div
                    span.label Firstname :
                    input(type="text", name="firstname")
                div
                    span.label Lastname :
                    input(type="text", name="lastname")
                div#editEmployeeSubmit
                    input(type="submit", value="Save")
        a(href="/author")!= "Back to Author List"

4.Updata Data
Masukkan code berikut pada app.js

 //same with author/new
//author update have 2 request
app.get('/author/update/:id', function(req, res) {
  //get parameter :id and save it to "tid"
  var tid=req.params.id;
  sql='SELECT * FROM author WHERE id='+connection.escape(tid);
  //show data to the form
  connection.query(sql, function(e, rows, f) {
    if (!e && (rows.length === 1)) 
    {
      var row = rows[0];  
      res.render('author_update', {
        title: 'Update Author'+row.first_name+' '+row.last_name,
        data : row
      });
    } 
    else {
        console.log(e);
    }
  });
});

app.post('/author/update/:id', function(req, res) {
  //get parameter :id
  var tid=req.params.id;
  //get data that have been submitted
  var fname = req.param('firstname');
  var lname = req.param('lastname');
  sql='UPDATE author SET first_name="'+fname+'",last_name="'+lname+'" WHERE id='+tid;
  //do query
  connection.query(sql, function(e, rows, f) {
    if (!e) {
      res.redirect('/author')
    }
  });
});

Lalu masukkan kode berikut pada “author_update.jade” yang telah anda buat pada folder “views”:

 extends layout

block content
    h1= title
    div.newsiswa
        form( method="post")
            div
                div
                    span.label Firstname :
                    input(type="text", name="firstname", value=data.first_name)
                div
                    span.label Lastname :
                    input(type="text", name="lastname", value=data.last_name)
                div#editEmployeeSubmit
                    input(type="submit", value="Save")
        a(href="/author")!= "Back to Author List"

5. Delete Data

Untuk delete data sendiri tidak akan memanggil tampilan suatu form, dia hanya akan mengeksekusi dan setelah itu langsung redirect ke halaman “author”, untuk itu masukkan kode seperti berikut :

 //delete data
app.get('/author/delete/:id', function(req, res) {
  // get parameter :id
  var tid=req.params.id;
  sql='DELETE FROM author WHERE id='+connection.escape(tid);
  //do query
  connection.query(sql, function(e, rows, f) {
    if (!e) 
    {
      //redirect to "/author"
      res.redirect('/author')
    } 
    else {
        console.log(e);
    }
  });
});

Itulah dia cara melakukan operasi crud pada suatu tabel dengan menggunakan msyql database.

Selesai… Hope it help.. Happy coding..

[PHP Yii Mongodb] Work With Data Relation (2)

Melanjutkan previous post di https://sabitlabscode.wordpress.com/2013/07/14/php-yii-mongodb-work-with-data-relation/, postingan ini akan membahas penggunaan cara ke 2 yaitu dengan cara memasukkan langsung data ke dalam document. Anggaplah saya memiliki document “news” yang data nya terdiri dari :

news : title, news, comments [comment_title, comment_name, comment]

dapat anda lihat bahwa setiap satu “news” dapat memiliki banyak komentar di dalamnya. Bagaimana cara membuatnya? Okeh, pertama-tama kita buat terlebih dahulu modelnya, kita definisikan semua fungsi-fungsi yang kita butuhkan mulai dari savedate, edit, delete, findall, findone, da addcomment. Sehingga model anda akan menjadi seperti berikut :

 <?php
//definition model name
class NewsForm extends CFormModel
{
    //define variable in model 
    public $title;
    public $news;
    public $comment_name;
    public $comment_title;
    public $comment;

    // rule validation
    public function rules()
    {
        return array(
            array('title,news', 'required'),
            //required just when we add comment
            array('comment_name,comment_title,comment','required','on'=>'createcomment'),
        );
    }

    //attribute label in form
    public function attributeLabels()
    {
        return array(
            'title'=>'Title',
            'news'=>'Insert Your News Here',
            'comment_name'=>'Created By',
            'comment_title'=>'Comment Title',
            'comment'=>'Comment',
        );
    }

    //run it for save data
    public function savenews()
    {
        try {
            //get connection to access document
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            $varnews = array(
                'title' => $this->title,
                'news' => $this->news,
            );
            //insert data
            $collection->insert($varnews,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for update data
    public function editnews($id)
    {
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            $varnews = array('$set'=>array(
                    'title' => $this->title,
                    'news' => $this->news,
                )
            );        
            //update data    
            $collection->update(array('_id' => new MongoId($id)),$varnews);
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for delete data
    public function deletenews($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //remove data
            $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());
        }
    }

    // this will return all data from document nilai
    public function findallmongo()
    {
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //get all data
            $result= $collection->find();

            return $result;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    // find news by id
    public function findOneById($id)
    {
        try 
        {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //get data by $id in parameter
            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());
        }    
    }

    //use for add a comment in news
    public function addcomment($id)
    {
        try 
        {
            $connection = new Mongo();
            $collection = $connection->belajar->news;
            //set some value for comment
            $varcomment = array(
                'comment_name' => $this->comment_name,
                'comment_title' => $this->comment_title,
                'comment'=>$this->comment
            );

            // we use $push to add insert value to comments
            // if we not use $push, it replace old data that
            // we have insert
            $collection->update(array('_id' => new MongoId($id)),
                array('$push' =>array('comments' => $varcomment)),
                array('upsert'=>true));
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }
    }
}

Setelah membuat model, kita lanjutkan dengan membuat controller agar user dapat melakukan request pada action-action yang telah kita tentukan. Pada controller ini kita akan menyediakan action-action berikut :

– action index = view all data from news

– actionview = show single data by id, pada actionview juga akan disediakan fitur untuk menambah komentar

– actioncreate = insert new data to document

– actionupdate = update data

– actiondelete = delete data from document

dan berikut adalah code dari controller nya :

 <?php
class NewsController extends Controller
{
    // action index to see all data in document nilai
    public function actionIndex()
    {
        $model=new NewsForm;
        //get all data from model
        $data=$model->findallmongo();

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

    // it will show detail data from tabel "nilia"
    public function actionView($id)
    {
        $model=new NewsForm('createcomment');//it will do validation for "createdcomment"
        // call a data from model "news" by id
        $data=$model->findOneById($id);
        //set field model with $data that 
        //we get from model
        $model->news=$data['news'];
        $model->title=$data['title'];

        //if user do submit(POST) data
        //for write a comment, then do this
        if(isset($_POST['NewsForm']))
        {
            //set value with data that have been submitted
            $model->comment_name=$_POST['NewsForm']['comment_name'];
            $model->comment_title=$_POST['NewsForm']['comment_title'];
            $model->comment=$_POST['NewsForm']['comment'];

            //check validate
            if($model->validate())
            {
                // call function addcomment
                if($model->addcomment($id))
                {
                    $this->redirect(array('view'));
                }
            }
        }

        $this->render('view',array(
            'data'=>$data,
            'model'=>$model,
        ));

    }

    // it use for create new data
    public function actionCreate()
    {
        $model=new NewsForm;
        //when user do submit to this
        if(isset($_POST['NewsForm']))
        {
            $model->news=$_POST['NewsForm']['news'];
            $model->title=$_POST['NewsForm']['title'];
            if($model->validate())
            {
                //save data
                if($model->savenews())
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('update',array('model'=>$model));
    }

    // update data
    public function actionUpdate($id)
    {
        //define model
        $model=new NewsForm;
        // get data by id
        $data=$model->findOneById($id);
        //set value
        $model->news=$data['news'];
        $model->title=$data['title'];

        //do this when submit
        if(isset($_POST['NewsForm']))
        {
            //set value with submit value
            $model->news=$_POST['NewsForm']['news'];
            $model->title=$_POST['NewsForm']['title'];

            if($model->validate())
            {
                //edit data
                if($model->editnews($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('update',array('model'=>$model));    
    }

    // delete data
    public function actionDelete($id)
    {
        $model= new NewsForm;
        $model->deletenews($id);
        $this->redirect(array('index'));
    }
}

Di atas adalah code controller kita. Anda dapat melihat pada komentar-komentar code nya untuk melihat penjelasannya.
Setelah membuat controller nya, sekarang saatnya membuat tampilan dari controller itu sendiri. Berikut tampilan yang akan kita buat mulai dari index.php

 <h1>This Is All News That We Have In Mongodb</h1>
<?php echo CHtml::link('Create News',array('create')); ?>
<?php 
    while ($data->hasNext()):
        $news= $data->getNext(); 
?>

<h2>
<?php echo CHtml::link($news['title'],array('view','id'=>$news['_id'])); ?>
</h2>
[[
<?php 
$totalcomment=0;
if(isset($news['comments']))
    $totalcomment=count($news['comments']);
echo 'Total Comment('.$totalcomment.') | ';
?>
<?php echo CHtml::link('Update',array('update','id'=>$news['_id'])) ?> |
<?php echo CHtml::link('Delete',array('delete','id'=>$news['_id'])) ?>
]]<br/>
<?php endwhile; ?>

Kemudian tampilan untuk actionCreate dan actionUpdate yaitu create.php

 <h1>Test Mongo - Pelajaran</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,'title'); ?>
        <?php echo $form->textField($model,'title'); ?>
        <?php echo $form->error($model,'title'); ?>
    </div>

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

    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

dan yang terakhir adalah actionView yang akan menampilkan single data dan dapat menambahkan komentar di dalamnya :

 <h1>View News</h1>

<h2><?php echo $data['title']; ?></h2>
<p><?php echo $data['news'];?></p>
<table>
    <tr>
        <td>Craeted By</td>
        <td>Comment Title</td>
        <td>Comment</td>
<?php
if(isset($data['comments']))
{
    foreach ($data['comments'] as $key => $value) {
        echo '<tr>';
        echo '<td>'.$value['comment_name'].'</td>';
        echo '<td>'.$value['comment_title'].'</td>';
        echo '<td>'.$value['comment'].'</td>';
    }
}
?>
</table>

<h2>Insert Your Comment Here :</h2>
<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,'comment_name'); ?>
        <?php echo $form->textField($model,'comment_name'); ?>
        <?php echo $form->error($model,'comment_name'); ?>
    </div>

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

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

    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

Okeh, itulah dia sedikit contoh membuat proses CRUD untuk document mongodb yang memiliki embedded document di dalamnya. Yang perlu diperhatikan adalah kapan kita harus menggunakan relasi langsung dan kapan kita menggunakan embed document karena tentu ini akan berpengaruh pada aplikasi yang anda buat..

Finish… Hope it help.. Happy coding… 😀

[PHP Yii Mongodb] Work With Data Relation

Pada rdbms biasanya kita sudah tidak asing dengan istilah tabel relation yang membuat hubungan antara dua tabel atau lebih. Bagaimana dengan mongodb? bukankah mongodb adalah nosql bukan “relational DBMS”? Ya, mongodb juga telah mengakomodasi hal tersebut walaupun tidak persis sama dengan yang dimiliki pada rdbms. Ada 2 cara untuk mengimplementasikannya di dalam mongodb.

1. Membuat field relasi langsung.

Ini sama dengan yang biasa kita lakukan pada rdbms, dimana kita membuat field pengubung (foreign key) pada suatu tabel untuk membuat hubungan antar tabel.

2. Memasukkan data ke dalam document langsung.

Sebenarnya ini bukanlah membuat relation ke dalam tabel, tapi kita memasukkan langsung data-data ke dalam sebuah document. Sebagai contoh dalam mysql kita memiliki tabel “berita” dan “komentar” dimana berita dapat memiliki banyak komentar. Hubungan antara keduanya berita dapat memiliki lebih dari satu komentar, dan komentar hanya memiliki satu buah berita. Pada rdbms kita membuatnya dengan dua buah tabel seperti berikut :

– tabel 1 = > berita : id, judul, isi berita

– tabel 2 => komentar : id, judul komentar, isi komentar, berita_id (foreign key)

pada mongodb, kita dapat memasukkannya langsung ke dalam document berita menjadi seperti berikut :

– document berita : id, judul, isi berita, komentar [id, judul, isi komentar]

Tetapi perlu dipahami kasus-kasus dimana kita lebih baik menggunakan cara 1 atau cara 2.

Ok, sekarang kita coba langsung implementasinya. Pada postingan kali ini akan dibahas penggunaan cara 1, maybe next time akan membahas cara 2.  Kita memiliki 3 buah document :

– siswa : id, nama

– pelajaran : id, nama pelajaran

– nilai : id, siswa_id, pelajaran_id, nilai

Anggaplah kita sudah membuat operasi CRUD untuk document “siswa” dan “pelajaran” (if you dont know how to do it, search it here https://sabitlabscode.wordpress.com/tag/mongodb/). Okeh, sekarang buatlah sebuah model nilai seperti berikut :

 <?php

class NilaiForm extends CFormModel
{
    //define variable in 
    public $pelajaran_id;
    public $siswa_id;
    public $nilai;

    // rule validation
    public function rules()
    {
        return array(
            array('pelajaran_id, siswa_id, nilai', 'required'),
        );
    }

    //attribute label in form
    public function attributeLabels()
    {
        return array(
            'pelajaran_id'=>'Pelajaran',
            'siswa_id'=>'Siswa',
            'nilai'=>'Nilai'
        );
    }

    //run it for save data
    public function savemongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $varsiswa = array(
                'pelajaran_id' => new MongoId($this->pelajaran_id),
                'siswa_id' => new MongoId($this->siswa_id),
                'nilai'=>$this->nilai
            );
            $collection->insert($varsiswa,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for update data
    public function editmongo($id)
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $varsiswa = array(
                'pelajaran_id' => $this->pelajaran_id,
                'siswa_id' => $this->siswa_id,
                'nilai'=>$this->nilai
            );
            $collection->update(array('_id' => new MongoId($id)),$varsiswa);
            //$collection->insert($varsiswa,array('safe'=>true));
            return true;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die('Failed to insert data '.$e->getMessage());
        }
    }

    //run it for delete data
    public function deletemongo($id)
    {    
        try {
            $connection = new Mongo();
            $collection = $connection->belajar->nilai;
            $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());
        }
    }

    // this will return all data from document nilai
    public function findallmongo()
    {
        try {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            $result= $collection->find();

            return $result;
        }
        catch(MongoConnectionException $e) {
            die("Failed to connect to database ".$e->getMessage());
        }
        catch(MongoException $e) {
            die($e->getMessage());
        }    
    }

    public function findOneById($id)
    {
        try 
        {
            $connection = new Mongo();
            $database = $connection->selectDB('belajar');
            $collection = $database->selectCollection('nilai');
            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());
        }    
    }
}

Setelah itu, buatlah controller untuk request pada aplikasi :

 <?php

class NilaiController extends Controller
{
    // action index to see all data in document nilai
    public function actionIndex()
    {
        $model=new NilaiForm;
        $data=$model->findallmongo();

        // mongodb cant do join, so we need to call model "pelajaran" and "siswa"
        // to show all field that owned by "pelajaran" and "siswa" 
        $m1=new PelajaranForm; 
        $m2=new SiswaForm;
        $this->render('index',array(
            'data'=>$data,
            'm1'=>$m1,
            'm2'=>$m2,
        ));
    }

    // it will show detail data from tabel "nilia"
    public function actionView($id)
    {
        $model=new NilaiForm;
        // call a data from model "nilai"
        $data=$model->findOneById($id);
        $m1=new PelajaranForm;
        $m2=new SiswaForm;

        $this->render('view',array(
            'data'=>$data,
            'm1'=>$m1,
            'm2'=>$m2,
        ));

    }

    // it use for create new data
    public function actionCreate()
    {
        $model=new NilaiForm;
        if(isset($_POST['NilaiForm']))
        {
            $model->pelajaran_id=$_POST['NilaiForm']['pelajaran_id'];
            $model->siswa_id=$_POST['NilaiForm']['siswa_id'];
            $model->nilai=$_POST['NilaiForm']['nilai'];
            if($model->validate())
            {
                if($model->savemongo())
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('Nilai',array('model'=>$model));
    }

    // update data
    public function actionUpdate($id)
    {
        $model=new NilaiForm;
        $data=$model->findOneById($id);
        $model->name=$data['name'];

        $model->pelajaran_id=$data['pelajaran_id'];
        $model->siswa_id=$data['siswa_id'];
        $model->nilai=$_POST['NilaiForm']['nilai'];

        if(isset($_POST['NilaiForm']))
        {
            $model->pelajaran_id=$_POST['NilaiForm']['pelajaran_id'];
            $model->siswa_id=$_POST['NilaiForm']['siswa_id'];

            if($model->validate())
            {
                if($model->editmongo($id))
                {
                    $this->redirect(array('index'));
                }
            }
        }
        $this->render('Nilai',array('model'=>$model));    
    }

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

Kemudian aturlah tampilan datanya. Ini adalah tampilan untuk actionIndex,

 <h1>Test Mongo - Nilai</h1>
<?php 
    while ($data->hasNext()):
        $siswa = $data->getNext(); 

$pelajaran=$m1->findOneById($siswa['pelajaran_id']);
$sisw=$m2->findOneById($siswa['siswa_id']);
?>

<b>
<?php echo CHtml::link($pelajaran['name'],array('view','id'=>$siswa['_id'])); ?> | 
<?php echo CHtml::link($sisw['name'],array('view','id'=>$siswa['_id'])); ?>
</b>
[[
<?php echo CHtml::link('Update',array('update','id'=>$siswa['_id'])) ?> |
<?php echo CHtml::link('Delete',array('delete','id'=>$siswa['_id'])) ?>
]]<br/>
<?php endwhile; ?>

Ini tampilan untuk actioncreate dan actionupdate

 <h1>Test Mongo - Pelajaran</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,'pelajaran_id'); ?>
        <?php echo $form->dropDownList($model,'pelajaran_id',PelajaranForm::dropdown(),array('empty'=>'- Select Pelajaran-')); ?>
        <?php echo $form->error($model,'pelajaran_id'); ?>
    </div>

    <div>
        <?php echo $form->labelEx($model,'siswa_id'); ?>
        <?php echo $form->dropDownList($model,'siswa_id',SiswaForm::dropdown(),array('empty'=>'- Select Pelajaran-')); ?>
        <?php echo $form->error($model,'siswa_id'); ?>
    </div>

    <div>
        <?php echo CHtml::submitButton('Submit'); ?>
    </div>
<?php $this->endWidget(); ?>
</div>

dan ini adalah tampilan untuk actionView

 <h1>Test Mongo - Nilai</h1>
<?php
$pelajaran=$m1->findOneById($data['pelajaran_id']);
$sisw=$m2->findOneById($data['siswa_id']);
echo $pelajaran['name'];
echo $sisw['name'];
?>

Anda dapat pelajari penjelasan code-code tersebut dari komentar yang ada pada code dan postingan sebelumnya tentang mongodb..

Selesai.. Hope it help..

Happy coding.. 😀

[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

%d bloggers like this: