Tampilkan postingan dengan label cakePHP. Tampilkan semua postingan
Tampilkan postingan dengan label cakePHP. Tampilkan semua postingan

Bake Cakephp dengan variasi.

ayampanggangmerah

  cakePhp sangat mencengangkan, dalam perjalanan menggunakan dan berexplorasi sambil bisnis, sayapun melakukan percobaan-percobaan yang sebenarnya tidak baik untuk di lakukan. Keterbatasan saya untuk mencari-cari referensi menjadikan hal ini terjadi. Sebenarnya hal ini bukan barang baru. Namun inilah yang saya coba. Okay.. untuk yang baru belajar cakephp jangan ikutin jejak ini, walaupun saya juga pemula tapi ini sangat tidak baik....(children don't try this at home!)

Buka direktory dalam installan cake kamu:

cake/console/libs/tempates/view

anda akan dapatkan form.ctp , index.ctp, view.ctp, dll..

Inilah sepertinya.. (kalau gak salah) file yang akan membuat template kalau kita mempergunakan bake dari console .. seperti yang ada disini.

Disini saya berekperimen untuk menambahkan file.

excel.ctp -> untuk langsung membuat export ke excel. Berguna untuk mengexport tabel html dari tampilan cake ke excel.

listpdf.ctp -> untuk mengexport tabel ke format pdf.

viewpdf.ctp -> untuk mengexport 'VIEW' ke format PDF

silahkan gila-gilaan merombak file-file tsb.. hasilnya saya gak tanggung jawab. he he..

tapi ide dasarnya adalah apabila kita ngebake 1 controller (satu tabel).. langsung ada fungsi tambahan seperti export ke excel dan PDF.

bayangkan penghematan coding kalau kita membuat ERP untuk 300 tabel.

form yang lainnya pun saya ubah untuk memenuhi kebutuhan AJAX. Supaya bisa langsung format ajax yang sekarang lagi trend.

untuk file yang mencetak controller nya sewaktu ngebake, adalah:

cake/console/libs/tasks/controller.php

ada di function bakeActions

tambahkan fungsi-fungsi yang elo mau... happy baking cakephp.

Nge-bake CakePhp = manggang kue.

Coding php memang membutuhkan waktu dan cukup melelahkan kalau kita berurusan dengan database, terutama untuk membuat semua link-linknya. Satu tabel saja sudah kedodoran untuk meriksa link delete, create, view, add..(CRUD) belum lagi kalo tabelnya ada ratusan.. udah bisa di bayangkan pedesnya mata meriksa link-link itu di HTML.

Untungnya, di framework cakephp hal ini menjadi lebih ringan, karena untuk membuat function CRUD sudah build-in di cakephp.

Mari kita coba mainkan..

Untuk developping aplikasi php saya menggunakan xampp sebagai server karena sudah terinstall apache, php dan mysql dalam satu direktori, ini sangat memudahkan untuk yang belum terbiasa menginstall ke tiga program tsb. Disini saya sudah menganggap anda sudah berhasil menginstall cake php dan sudah bisa connect ke database MySqlnya.

Kalau juga udah bosen, enaknya tinggal delete direktory xampp nya aja.. beres udah.. karena nggak ninggalin apa-apa di registry windows.

Nah untuk ini kita perlu nge-set path php kita agar kita bisa manggil php dari command line. Bisa di set di my Computer-> klik tombol kanan -> properties -> Advanced -> Environnement Variables -> System Variables -> path.

nah kita tambahkan lah direktori php kita.. untuk contoh kita ini, saya menginstall xampp di direktori E:\xampp

jadi path php saya menjadi e:\xampp\php, nah tambahin aja di belakangnya..

far[6]

kalo sudah siap mari kita bikin tabel di mySQL dengan menggunakan phpMyAdmin. Saya nggak panjang-panjang menguraikan buat tabel ini, silahkan baca tutorial mysql kalau ingin lebih mendetail.

di konvensi cake mengharuskan kita untuk memakai bentuk jamak dari nama tabel. misalnya kita ingin buat tabel company maka kita harus menamakan tabelnya companies.

buat tabel 'companies' tapi jangan lupa salah satu fieldnya namanya harus 'id',

field 'id' ini harus berattribut INT dan Auto Increment, far[8]

salah satu yang paling asik dari cake adalah kalau kita tambahin field, created dan modified, nanti automatis di aplikasi kita langsung di pakai oleh cakephp tanpa harus koding macem-macem.

Nah kalo tabel itu sudah siap mari kita mulai 'bake', beginilah kira kira caranya.. panggil command prompt.. Run->cmd.exe lalu pindah ke direktory cake/console di dalam direktori dimana anda sudah mengekstrak cakephp anda.

far[4] 

Nah dari command prompt ini yang saya ketik adalah:

CAKE BAKE ALL -WORKING E:\XAMPP\HTDOCS\PRA\APP\

(silahkan di sesuaikan dengan direktori dimana anda menginstall cake)

kalau setup anda sudah sesuai semua nanti cake akan menampilkan list tabel yang sudah pernah anda buat, masukkan angka tabel anda. misalnya 7.

nah kalo abis itu bingung.. pilih aja yes yes semua sampai pertanyaannya habis.

Karena pilihan command tadi adalah CAKE BAKE ALL maka secara automatis cake akan membuat model, controller, sekaligus viewnya tanpa kita perlu ngetik repot-repot lagi.

Saya berfilosofi lebih gampang ngapus dari pada ngetiknya.. nah brangkat dari situ hapus aja semua function-function yang nggak cocok atau perlu modifikasi.

Di lain waktu saya akan bahas option-option yang ada di CAKE BAKE

salam.

Memeriksa pekerjaan yang masih pending

Setelah login saya selalu ingin melihat daftar pekerjaan yang masih 'pending' untuk itu saya selalu memanggil function settodo untuk mempersiapkan list yang harus di kerjakan.

Begini saya buatnya.

di buat di todos_controller.php

function settodo(){

$this->layout = 'blank';
App::import('Model', 'Project');

$tmpProject = new Project();
$this->set('entry',$tmpProject->findAll("valuation_date = '0000-00-00'",array('id','engagement_code')));

App::import('Model', 'Todo');
$tmpTodo = new Todo();

// erase all the list.
$tmpTodo->query('delete from todos');


arch project without valuation date
$entry=$tmpProject->findAll("valuation_date = '0000-00-00'",array('id','engagement_code'),null,null) ;
foreach ($entry as $e){
$tmpTodo->save(array('id' => '', 'notes'=> 'Project '.$e['Project']['engagement_code'].' has no valuation date', 'url' => '/projects/view/'.$e['Project']['id'],'role_id'=>'3'));
}
arch projects without leaders
$entry=$tmpProject->findAll("leader_id = '1'",array('id','engagement_code'),null,null);
foreach ($entry as $e){
$tmpTodo->save(array('id' => '', 'notes'=> 'Project '.$e['Project']['engagement_code'].' has no leaders assigned', 'url' => '/projects/view/'.$e['Project']['id']));
}
arch projects without piccalc
$entry=$tmpProject->findAll("leader_id <> '1' and piccalc_id = '1'",array('id','engagement_code'),null,null);
foreach ($entry as $e){
$tmpTodo->save(array('id' => '', 'notes'=> 'Project '.$e['Project']['engagement_code'].' has no p.i.c of calculation assigned', 'url' => '/projects/view/'.$e['Project']['id']));
}

arch projects without picprop
$entry=$tmpProject->findAll("leader_id <> '1' and picprop_id = '1'",array('id','engagement_code'),null,null);
foreach ($entry as $e){
$tmpTodo->save(array('id' => '', 'notes'=> 'Project '.$e['Project']['engagement_code'].' has no p.i.c of proposal assigned', 'url' => '/projects/view/'.$e['Project']['id']));
}

arch projects without proposed fee
$entry=$tmpProject->findAll("proposed_fee = 0",array('id','engagement_code'),null,null);
foreach ($entry as $e){
$tmpTodo->save(array('id' => '', 'notes'=> 'Project '.$e['Project']['engagement_code'].' dont have proposed fee', 'url' => '/projects/view/'.$e['Project']['id']));
}

unset($tmpProject);
unset($tmpTodo);
$this->redirect(array('action'=>'index'));
}

Logging activities - (not pretty!!)

ini saya buat untuk logging, di taruh di app_controller.php.. sangat buruk..tapi jalan.

function afterFilter() {


     // this is a call for logging -- not very pretty. - but it works     


     App::import('Model', 'Entry');    


     $tmpEntry = new Entry();    


     $logthis = $this->Auth->user('username').' is accessing '.$this->params['action'].' in module '.$this->params['controller'].'-'.Router::url();    


     $this->set('accessme',$tmpEntry->query("insert into actlogs values ('','$logthis',now())"));


     unset($tmpEntry); 


     }




 



ini kalau mau di setiap controller.





$logthis = $this->Auth->user('username').' is accessing '.$this->params['action'].' in module '.$this->params['controller'].'- id number:'.$id; 


$this->Log($logthis,'Activity');


Vendor stuff

direktory vendor merupakan satu cara yang baik untuk memasukkan sesuatu..

1. Cemplungin php file anda di /app/vendors

2. Panggil di cake dengan vendor('nama_file_anda');

teknik lain untuk memakai global variables... yukesss lagi

Global Variables Yikes!

Anda bisa menulis hal-hal berikut ini di bootstrap.php

   1:  global $abc, $def;


   2:  $abc = true;


   3:  $def = 'XXX';




Dan setelah itu akses dari Controller::beforeFilter() dengan cara





global $def; 


$this->set('def', $def);





banyak cara yang bisa di gunakan sebagai trick tapi ini sama sekali tidak bersih, melakukannya sebagai komponen jauh lebih baik

Mengambil informasi user pada komponen Auth 1.2.xx

kalau anda menggunakan auth pada cake 1.2.xx anda bisa mengambil informasi user dengan cara.

$this->Auth->user()

untuk mengambil seluruh data atau:

$this->Auth->user('field_name')

untuk mengetahui satu field saja

gunakan juga

$session->read('Auth.UserModelName') untuk mengambil data tsb

(gantu UserModelName sesuai kebutuhan)

atau $session->read('Auth.UserModelName.field_name')

khusus mengambil satu data

Auth component in cake 1.2.6311

 

di User model di tambahkan baris seperti ini.

 

function validLogin($data)
   {

       $user = $this->find(array('username' => $data['User']['username'], 'password' => ($data['User']['password'])), array('id', 'username', 'password'));
       if(!empty($user)){
           $this->user = $user['User'];
           return TRUE;
       }
       else {
           return FALSE;
       }

   }

 

Di atas user_controller.php di tambahkan

var $components = array('Auth','Session');
var $layout = "login";

dan di bawah index tambahkan prosedur login.

   function login()
    {
        //user already logged in?
        //checking if session has been written
        $user_id = $this->Auth->user('id');
        if (!empty($user_id) && $this->Session->valid())
        {
            $this->Session->setFlash('You are already logged in');
            $this->redirect(array('action'=>''), null, true);
        }
        else
        {
            if(!empty($this->data))
            {
                //calling login validation validLogin() in model
                if($this->User->validLogin($this->data))
                {
                    if($this->Auth->login($this->User->user))
                    {
                        $this->Session->setFlash('You have successfully logged in');
                           $this->Session->write('LoggedIn',$this->Auth->user());

                        $this->redirect('/projects');
                    }

                } else {
                $this->Session->setFlash('Invalid login, try again!');
                $this->set('auth_msg', 'Invalid login, try again!');
                $this->set('password', null);                   
                }
            }
            else
            {
                $this->Session->setFlash('Please enter your username and password!');
                $this->set('auth_msg', 'Please enter your username and password');
                $this->set('password', null);
            }
        }

    }

    function logout()
    {
        $this->Session->destroy('user');
        $this->Session->setFlash('You\'ve successfully logged out.');
        $this->redirect('/users/login');
    }    
    function view($id = null) {
        if (!$id) {
            $this->Session->setFlash(__('Invalid User.', true));
            $this->redirect(array('action'=>'index'));
        }
        $this->set('user', $this->User->read(null, $id));
    }

 

Pada view tambahkan satu file lagi. login.ctp

 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>
        <?php __('Please Log-In'); ?>
        <?php echo $title_for_layout;?>
    </title>
    <?php
        echo $html->charset();
        echo $html->meta('icon');

        echo $html->css('cake.generic');

        echo $scripts_for_layout;
    ?>
</head>
<body>
    <div id="container">
        <div id="header">
            <h1><?php echo $html->link(__('Please Log-In', true), '');?></h1>
        </div>
        <div id="content">
            <?php
                if ($session->check('Message.flash')):
                        $session->flash();
                endif;
            ?>

            <?php echo $content_for_layout;?>

        </div>
        <div id="footer">
            <?php echo $html->link(
                            $html->image('cake.power.gif', array('alt'=> __("CakePHP: the rapid development php framework", true), 'border'=>"0")),
                            'http://www.cakephp.org/',
                            array('target'=>'_new'), null, false
                        );
            ?>
        </div>
    </div>
    <?php echo $cakeDebug?>
</body>
</html>

 

file ini di modifikasi dari default.ctp pada cake template skel

 

pada app_controller.php ada prosedur-prosedur yang membantu proses login. saya masukkan juga yang lainnya terutama untuk hal-hal yang membantu dalam penanganan session.

 

class AppController extends Controller {

    var $helper = array('Form','Session','Ajax','Javascript','Html');
    var $components = array('Auth','Session');

        function beforeFilter()
    {
        //actions we allow without authentication, you can also put them in the app_controller.php
       $this->Auth->allow('register', 'login', 'logout','add');
       $this->Session->write('params',$this->params);
       $this->set('mysession',$this->Session->read());  //this is for the ACL phpGACL
       $this->set('username',$this->Auth->user('username'));
       $this->set('controller_action',$this->params['controller'].'_'.$this->params['action'])        ;
       $this->set('refer',Controller::referer()); //referer

       $username = $this->Auth->user('username');
       $controller_action = $this->params['controller'].'_'.$this->params['action'];
    }
}

Merubah isi dari SELECT tag.

Di controller di tambahkan di bagian atas…

var $uses = array('Employee','Entry');

di dalam function controllernya menggunakan standard php trick aja.. kayaknya lebih gampang.

$tmpentry = $this->Entry->find('all');

$test = array('0'=>""); // untuk mengosongkan field no. 0 (karena id = 1)

foreach ($tmpentry as $item){

array_push($test, $item['Entry']['entry_name']);

}

$this->set('entry',$test);

Di View bisa di panggil dengan:

Echo $form->select(‘field_name’, $entry);

Sorry ini hanya akal-akalan untuk mempercepat proses design

Another Select Tag

Ini Juga bisa di pakai dalam controller apabila kepepet harus me-load model yang tidak berhubungan dengan yang seharusnya di pakai controller

App::import('Model', 'Entry');

$tmpEntry = new Entry();

$this->set('test',$tmpEntry->findAll());

Model tanpa tabel

Kadang kita memerlukan sebuah model tapi tidak mempunyai koneksi ke database atau tidak menggunakan tabel

class ModelWithoutTable extends AppModel


{


    var $useTable = false;


}

Query tanpa di pengaruhi model

Trick lain untuk mengambil data dari tabel mysql

$this->NamaModel_di_Controller->query(‘select * from table_name’);

Langsung ngebypass seluruh model yang di pakai.

Nge Baca Session

ini bisa di lakukan:

di controller:

$this->set('mysession',$this->Session->read());

Di view : print_r($mysession);

Di process loginnya di tambahkan..

Kalau mau menulis macam-macam.

$this->Session->write('Hello','hellos');

Atau tulis juga

$this->Session->write('LoggedIn',$this->Auth->user());

Mengeluarkan data dari controller ke view

Kadang kita memerlukan mengeluarkan value dari controller ke view, beginilah caranya.

$this->set('key', 'value');


Tidak terlampau aneh, tapi bisa juga dengan cara berikut ini.



$this->set(array('key1' => 'value1', 'key2' => 'value2'));


Secara explisit kita dapat mengambil data di view dengan cara print_r($key1)

beforeFilter untuk action tertentu

Kalau anda ingin membuah sebuah prosedur tepat sebelum untuk controller tertentu saja juga ingin di taruh sebelum beforeFilter. coba tips saya di bawah ini.



// app/controllers/users_controller.php


class UsersController extends AppController


{


    function beforeFilter()


    {


        if ($this->action != 'login')


        {


            // execute beforeFilter logic


        }


    }


 


    function login()


    {


        // do login


    }


 


    function edit($id)


    {


        // do edit


    }


 


    function delete($id)


    {


        // do delete


    }


}

Model berkaitan

Apabila anda mempunyai Model2 yang berkaitan dengan Model1 anda bisa menggunakan command di bawah ini untuk khusus save model2

$this->Model1->date($this->data);
$this->Model1->Model2->save($this->data);

Bake lebih cepat

Bake lebih cepat dengan:



cake bake model User
cake bake controller Users scaffold
cake bake view Users



Untuk melihat command-command apa saja yang tersedia, gunakan:



cake bake model help



bisa juga dengan



cake bake all 
cake bake all User