Versi 2.5.7

Bab Pengenalan : Objektif

Objektif modul panduan ini adalah untuk memberi panduan kepada para pembangun PHP yang baru bermula menggunakan CakePHP Framework untuk membina sebuah aplikasi web yang mempunyai fungsi Bina(Create), Baca(Read), Kemaskini(Update), Padam(Delete) atau pendek kata CRUD.

Modul panduan ini merangkumi:

  1. Pengenalan ringkas CakePHP Framework.
  2. Pemasangan CakePHP pada stesen kerja local.
  3. Pemasangan CakePHP Console & Shell.
  4. Membina sebuah aplikasi CakePHP - Project Management System.
  5. Menjana struktur aplikasi dan kod sumber (Source Code) menggunakan Cake Bake Console.
  6. Membina fungsi log masuk dan log keluar

Bab Pengenalan : Keperluan

Untuk mengikuti panduan ini. Anda perlu mempunyai asas dan pengalaman dalam pembangunan web seperti :

  • Mempunyai asas HTML,CSS,dan Javascript.
  • Mempunyai asas OOP (Object Oriented Programming).
  • Boleh membina modul Create Read Update Delete (CRUD)
    menggunakan PHP dan MySQL
  • Boleh mereka bentuk struktur dan skema pengkalan data (Databases) menggunakan SQL.
  • Boleh menggunakan alat pengurusan pengkalan data
    (Database Administration Tools) seperti PhpMyAdmin, Adminer, PhpMiniAdmin, Sqlyog, Sequel Pro, dll.

Bab 1. Pengenalan ringkas CakePHP Framework.

Bab 1.1. Model

Fungsi model secara ringkas adalah komponen yang akan berinteraksi dengan pangkalan data. Model ditugaskan untuk menerima, menghantar, dan memanipulasi bisnes data logik diantara pangkalan data dan controller. Sebagai contoh, setiap SQL query yang dijalankan haruslah diletakkan didalam model supaya informasi data dapat dikapsulkan dan disembunyikan (Data encapsulation and information hiding).

Bab 1.2. Controller

Fungsi controller secara ringkas adalah komponen untuk mengawal permintaan dan perjalanan sesuatu aplikasi. Controller ditugaskan untuk mengawal atau menjadi "orang tengah" antara view dan model. Sebagai contoh, apabila anda membuka url facebook.com, komponen controller akan memproses dan menghantar permintaan anda, dan paparan Home Page facebook.com akan muncul.

Bab 1.3. View.

Fungsi view secara ringkas adalah komponen untuk memaparkan data dan paparan antaramuka grafikal (GUI). View ditugaskan untuk memaparkan paparan data atau paparan antaramuka grafikal yang dihantar melalui controller yang kemudiannya membolehkan pengguna berinteraksi dengan aplikasi. Sebagai contoh, anda mengisi borang daftar di facebook.com, borang itu adalah elemen HTML yang dipaparkan dari komponen view.

Bab 2. Pemasangan CakePHP pada stesen kerja local

(Local Workstation/Localhost)

Untuk memulakan pembelajaran anda perlu memuat turun CakePHP Framework versi 2.0 dan ke atas. Muat turun CakePHP Framework di https://github.com/cakephp/cakephp/tags. Modul panduan ini akan menggunakan CakePHP 2.5.7.

Gambar rajah di bawah menunjukkan struktur direktori CakePHP yang dimuat turun tadi

Direktori Penerangan
app Fail aplikasi anda
lib Kod sumber atau enjin CakePHP tersimpan disini.
plugins Untuk menyimpan CakePHP plugins
vendors Untuk menyimpan third-party PHP Libraries

Bab 2.1.1 Pemasangan di Windows

Jika anda menggunakan XAMPP sila ikut langkah di bawah:

Pergi ke fail zip cakephp yang anda muat turun tadi. Ekstrak dan copy direktori cakephp ke direktori htdocs

Contoh :
C:\xampp\htdocs\cakephp Direktori Cake anda
atau
C:\xampp\htdocs\cakephp-2.5.7 Direktori Cake anda

Bab 2.1.2 Pemasangan di Windows

Jika anda menggunakan WAMP sila ikut langkah di bawah:

Pergi ke fail zip cakephp yang anda muat turun tadi. Ekstrak dan copy direktori cakephp ke direktori www

Contoh :
C:\xampp\htdocs\cakephp Direktori Cake anda
atau
C:\xampp\htdocs\cakephp-2.5.7 Direktori Cake anda

Bab 2.1.3 Pemasangan di Windows

Jika anda menggunakan pakej server selain dari yang diatas, anda cuma perlu mencari document root directory server anda dan copy & paste direktori cakephp tadi.

Bab 2.2. Pemasangan di Linux/*nix.

Pergi ke fail zip cakephp yang anda muat turun tadi. Ekstrak dan copy direktori cakephp ke direktori Document Root .

Contoh:
RHEL/Fedora/Centos: /var/www/html/cakephp Direktori Cake anda
Debian/Ubuntu : /var/www/cakephp Direktori Cake anda

Bab 2.3. Pemasangan di OSX.

Jika anda pengguna XAMPP sila ikut langkah di bawah:

Pergi ke fail zip cakephp yang anda muat turun tadi. Ekstrak dan copy direktori cakephp ke direktori htdocs.

Contoh:
/Applications/XAMPP/htdocs/cakephp Direktori Cake anda

Jika anda menggunakan pakej server selain dari yang diatas, anda cuma perlu mencari document root directory server anda dan copy & paste direktori cakephp tadi.

Bab 3. Pemasangan CakePHP Console & Shell.

Kelebihan CakePHP Framework bukan sahaja untuk digunakan sebagai web framework tetapi ia juga boleh digunakan untuk membina Console Application. Kelebihan konsol ini adalah seperti mengendalikan pelbagai tugasan seperti penyelenggaraan, dan menjana kod sumber untuk HTTP request & response cycle.

Bab 3. Pemasangan CakePHP Console & Shell.

Shell-shell yang terdapat di dalam aplikasi konsol ini antaranya adalah bake,acl,api,i18n,schema,dan banyak lagi. Anda juga boleh membina shell anda sendiri kelak.

Peringatan!
Untuk menggunakan CakePHP Console & Command , anda perlu memasang PHP CLI terlebih dahulu.
Rujuk: http://www.php-cli.com/

Bab 3.1. Windows

Cara memasang Cake Console CLI

1.Pergi ke Start Control Panel System and Security Advanced system settings Advanced Enviroment Variables cari PATH dan klik Edit.

Cara memasang Cake Console CLI

2. Anda perlu menambah path ke direktori CakePHP yang muat turun tadi ke Variable Value. Contoh path: C:\xampp\htdocs\cakephp-2.5.7\lib\Cake\Console

Bab 3.2. Linux/*nix.

Cara memasang Cake Console CLI

1.Buka terminal dan jalankan arahan(command) ini:

~$ vi ~/.bashrc
Cara memasang Cake Console CLI

2. Tambahkan kod ini :

export PATH="$PATH:/var/www/html/cakephp/lib/Cake/Console"
// atau
export PATH="$PATH:/var/www/cakephp/lib/Cake/Console"

Bab 3.3. OSX.

Cara memasang Cake Console CLI

1.Buka terminal dan jalankan arahan(command) ini:

~$ vi ~/.bashrc
// atau
~$ vi ~/.bash_profile
Cara memasang Cake Console CLI

2. Tambahkan kod ini :

export PATH="$PATH:/var/www/html/cakephp/lib/Cake/Console"
// atau
export PATH="$PATH:/var/www/cakephp/lib/Cake/Console"
Cara memasang Cake Console CLI

Untuk mengetahui samada cake console berjaya dipasang pada variable path, jalankan command berikut:

cake

Bab 4. Membina sebuah aplikasi CakePHP.

Kita akan membina sebuah aplikasi web iaitu Sistem Pengurusan Projek atau Project Management System. Ciri-ciri dan fungsi yang ada pada sistem adalah:

  1. Menambah,kemaskini, dan menghapus Projek.
  2. Membuat perhubungan antara ahli(Users) untuk setiap satu projek.
  3. Seorang ahli akan mempunyai banyak projek.
  4. Satu projek akan mempunyai banyak ahli yang menyertai.
  5. Fungsi Log keluar & Log masuk (Login & Logout Function)
Bab 4. Membina sebuah aplikasi CakePHP.

Untuk modul panduan ini,kita akan menggunakan kelebihan CakePHP Console & Shell untuk mencipta prototaip aplikasi CakePHP ini dengan lebih pantas dan berkualiti.

Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console.

CakePHP Bake Console adalah satu lagi usaha untuk mencipta aplikasi CakePHP dengan pantas. Bake dapat membina satu aplikasi yang boleh terus berfungsi dalam masa beberapa minit sahaja. Bake console akan mencipta fail untuk model,view dan controller beserta kod sumber fungsi asas seperti index,view,add,edit,dan delete di dalam controller.

Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console.

Untuk menjana atau mencipta struktur aplikasi Cake menggunakan Bake Console, sila taip arahan di bawah di terminal/cmd anda.

cake bake

Paparan seperti dibawah akan muncul

Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console.

*Sila pastikan anda berada di dalam document root server yang betul.
Contoh:
Jika anda menggunakan Linux, anda perlu berada di /var/www/html/ atau /var/www/.
Jika anda menggunakan XAMPP di OSX, anda perlu berada di /Applications/XAMPP/htdocs/.
Jika anda menggunakan XAMPP di windows, anda perlu berada di C:\xampp\htdocs.

Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console.

Ikut arahan di bawah ini untuk langkah seterusnya.
S = Soalan | J = Jawapan
S:What is the path to the project you want to bake?
Jika anda menggunakan Linux/OSX, sila letakkan nama aplikasi yang anda mahu.
Untuk modul panduan ini saya menggunakan nama pms untuk aplikasi pengurusan projek ini.

Skel Directory: /Aplications/XAMPP/xamppfiles/htdocs/cakephp/lib/Cake/Console/Templates/skel
Will be copied to: /var/www/html/pms
-------------------------------------------------------
Look okay? (y/n/q) 
[y] > _ 

J: Taip "y" untuk yes.

Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console.

Tukar lokasi direktori anda sekarang dan masuk ke direktori aplikasi yang baru kita cipta tadi iaitu direktori pms

cd pms
lihat senarai direktori dan fail dengan menggunakan arahan ini.
// Linux/OSX
ls –la
// Windows
dir
Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console. Hasilnya adalah seperti di bawah ini:
Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console.
Penerangan struktur direktori dan fail.
Config Menyimpan (beberapa) fail konfigurasi CakePHP , maklumat sambungan pangkalan data,dan beberapa fail yang penting.
Console Mengandungi arahan dan tugas untuk Cake Console & Shell.
Controller Mengandungi fail controller untuk aplikasi anda
Index.php Fail untuk bootstrapping aplikasi anda.
Lib Mengandungi libraries yang bukan dari 3rd parties vendor.
Locale Menyimpan baris bahasa untuk tujuan pelbagai bahasa dalam satu aplikasi
Model Mengandungi fail model untuk aplikasi anda
Plugin Pakej plugin disimpan disini
Test Menyimpan fail test case dan test fixtures untuk tujuan unit test ke atas aplikasi anda
tmp Disini CakePHP menyimpan data sementara(temporary data) seperti error log,cookies,session,dll.
Vendor 3rd parties class atau libraries disimpan disini
View Mengandungi fail view untuk aplikasi anda
webroot Menyimpan fail CSS,Javascript,Image,dll
.htaccess Untuk melakukan apache url rewriting.
Bab 5. Menjana struktur aplikasi menggunakan Cake Bake Console.

Nota peringatan !
Jika anda sudah mempunyai direktori aplikasi, anda harus menggunakan Cake Console & Command didalam direktori aplikasi anda. Sebagai contoh,jika direktori aplikasi anda bernama "pms", anda perlu menjalankan arahan cake bake didalam direktori "pms" bukan di luar dari direktori "pms".

Bab 5.1. CakePHP Skema & Model

Kelebihan model didalam cakephp adalah ia kemampuan model membuat perhubungan dan pemetaan objek atau Object Relational Mapping(ORM). Untuk melakukan perhubungan ini, kita perlu menggunakan penyatuan model (Association).

Bab 5.1. CakePHP Skema & Model

Jenis Perhubungan (Relationship Type)

Perhubungan(Relationship) Jenis Penyatuan (Association Type) Contoh
one to one hasOne Satu pengguna sistem mempunyai satu projek.
one to many hasMany Satu projek mempunyai banyak ahli.
many to one belongsTo 10 projek mempunyai satu ahli.
many to many hasAndBelongsToMany (HABTM) 10 projek mempunyai 10 ahli dan sebaliknya.
Bab 5.1. CakePHP Skema & Model

Untuk aplikasi pengurusan projek ini kita akan menggunakan perhubungan belongsTo, dan hasMany. Perhubungan model ini adalah seperti berikut:

Projects hasMany Project Applicants
Users hasMany ProjectApplicants

Project Applicants belongsTo Projects
Project Applicants belongsTo Users

Table yang perlu ada :-
projects : untuk menyimpan data projek.
users : untuk menyimpan data pengguna/ahli.
project_applicants : untuk menyimpan data ahli yang menyertai projek.

Bab 5.1. CakePHP Skema & Model

Rujuk gambarajah dibawah untuk memahami ERD pangkalan data aplikasi ini.

Entity Relationship Diagram(ERD) untuk aplikasi Pengurusan Projek.
Bab 5.1. CakePHP Skema & Model

Untuk membina table pangkalan data tadi. Sila copy skrip arahan MySQL di bawah & paste ke MySQL DBA Tool yang anda gunakan contohnya phpmyadmin:

CREATE TABLE `projects` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`name` varchar(255) NOT NULL DEFAULT '',
`details` varchar(255) NOT NULL DEFAULT '',
`start_date` datetime NOT NULL,
`end_date` datetime NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
CREATE TABLE `project_applicants` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`project_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
`created_by` int(11) DEFAULT NULL,
`modified_by` int(11) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE `users` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`username` varchar(255) NOT NULL DEFAULT '',
`role` varchar(255) NOT NULL,
`password` varchar(255) NOT NULL,
`created` datetime DEFAULT NULL,
`modified` datetime DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=latin1;
Bab 5.1. CakePHP Skema & Model

Anda juga boleh mencipta skema data dengan menggunakan php skrip. Caranya adalah dengan mencipta satu fail schema.php didalam direktori Config/Schema.

<?php 
// Skrip fail Config/Schema/schema.php
class AppSchema extends CakeSchema 
{
	public function before($event = array()) 
	{
		return true;
	}
	
	public function after($event = array()) {}
	
	public $project_applicants = array(
	'id' => array('type' => 'integer', 'null' => false, 'default'=> null, 'unsigned' => true, 'key' => 'primary'),
	'project_id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false),
	'user_id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false),
	'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
	'modified' => array('type' => 'datetime', 'null' => true, 'default' => null),
	'user_id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false),
	'indexes' => array(	'PRIMARY' => array('column' => 'id', 'unique' => 1)	),
	'tableParameters' => array('charset' => 'latin1', 'collate' =>	' latin1_swedish_ci', 'engine' => 'InnoDB')
	);
	
	public $projects = array(
	'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => true, 'key' => 'primary'),
	'name' => array('type' => 'string', 'null' => false, 'collate' => 'latin1_swedish_ci', 'charset' => 'latin1'),
	'details' => array('type' => 'string', 'null' => false, 'collate' => 'latin1_swedish_ci', 'charset' => 'latin1'),
	'start_date' => array('type' => 'datetime', 'null' => false, 'default' => null),
	'end_date' => array('type' => 'datetime', 'null' => false, 	'default' => null),
	'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
	'modified' => array('type' => 'datetime', 'null' => true, 'default' => null),
	'user_id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => false),
	'indexes' => array(	'PRIMARY' => array('column' => 'id', 'unique' => 1)	),
	'tableParameters' => array('charset' => 'latin1',
	'collate' => 'latin1_swedish_ci', 'engine' => 'InnoDB')
	);
	
	public $users = array(
	'id' => array('type' => 'integer', 'null' => false, 'default' => null, 'unsigned' => true, 'key' => 'primary'),
	'name' => array('type' => 'string', 'null' => false, 'collate' => 'latin1_swedish_ci', 'charset' => 'latin1'),
	'username' => array('type' => 'string', 'null' => false, 'collate' => 'latin1_swedish_ci', 'charset' => 'latin1'),
	'password' => array('type' => 'string', 'null' => false, 'collate' => 'latin1_swedish_ci', 'charset' => 'latin1'),
	'created' => array('type' => 'datetime', 'null' => true, 'default' => null),
	'modified' => array('type' => 'datetime', 'null' => true, 'default' => null),
	'indexes' => array(	'PRIMARY' => array('column' => 'id', 'unique' => 1)	),
	'tableParameters' => array('charset' => 'latin1', 'collate' =>'latin1_swedish_ci', 'engine' => 'InnoDB')
	);
}
?>

Bab 5.2. Cara untuk membina skema pangkalan data menggunakan Cake Schema Console.

Schema shell berfungsi untuk membina skema objek dan juga skema MySQL dump. Schema shell juga boleh digunakan untuk mengemaskini atau mengubah skema pangkalan data. Rujuk http://book.cakephp.org/2.0/en/console-and-shells/schema-management-and-migrations.html

Bab 5.2.1. Cara untuk membina skema pangkalan data menggunakan Cake Schema Console.
// Untuk mengetahui arahan-arahan yang ada didalam Schema Console, gunakan arahan ini
cake schema
// Paparan seperti dibawah akan muncul
Bab 5.2.2. Cara untuk membina skema pangkalan data menggunakan Cake Schema Console.

Sebentar tadi anda telah mencipta fail schema.php. Oleh itu gunakan arahan dibawah ini untuk membina skema objek di pangkalan data MySQL.

cake schema create

Hasil daripada arahan di atas adalah, ia akan mencipta table di pangkalan data MySQL.

Bab 5.2.3. Cara untuk membina skema pangkalan data menggunakan Cake Schema Console.

Jadual dibawah menerangkan kegunaan arahan Schema Console.

Arahan Fungsi
view Memaparkan kandungan fail skema.
generate Menjana skema berdasarkan model yang dicipta. Untuk memproses kesemua data yang ada didalam table sql gunakan parameter –f .
dump Menjana/mencipta SQL dump fail. contoh : schema.sql.
create Memadam dan menjana semula skema berdasarkan fail skema yang dicipta.
update Mengubah table data berdasarkan fail skema yang dicipta.
Bab 5.2.4. Cara untuk membina skema pangkalan data menggunakan Cake Schema Console. Contoh pangkalan data MySQL yang telah dicipta dan dibuka menggunakan perisian Sequel Pro.

Bab 5.3. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).

Untuk membuat penyambungan antara MySQL dan CakePHP dengan mudah, anda boleh menggunakan arahan cake bake. Pastikan anda berada didalam direktori aplikasi anda iaitu direktori pms & jalankan arahan cake bake sekali lagi.

Bab 5.3.1. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).
// J: Jawapan
Your database configuration was not found. Take a moment to create one
----------------------------------------------------------------------
Database Configuration
----------------------------------------------------------------------
Name:
[default] > _
// J: Tekan "enter" .Kita akan gunakan tetapan default .
Datasource: (Mysql/Postgress/Sqlite/Sqlserver)
[Mysql] > _
// J: Tekan "enter". Kita akan gunakan MySQL untuk datasource/database.
Persistent Connection?
// J: Taip "y" jika hendak mengaktifkan,Tekan "enter" jika tidak.
Database Host
// J: Tekan "enter" jika localhost,isikan host anda jika ia berlainan dari localhost.
Port?
// J: Taipkan nombor MySQL jika anda menggunakan port untuk melakukan 
// penyambungan MySQL, Tekan "enter" jika tidak.
Bab 5.3.2. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).
// J: Jawapan
User
// J: Taipkan nama pengguna(username) MySQL anda,jika ia adalah "root" tekan "enter".
Password
// J: Taipkan kata laluan(password) MySQL anda,
// jika tiada tekan "enter" dan taip "y" untuk soalan seterusnya.
Database Name
// J: Taipkan nama pangkalan data yang kita cipta tadi iaitu "pms"
Table Prefix?
// J: Taipkan nama table prefix jika anda mahu.
Table encoding
// J: Taipkan nama table encoding jika anda mahu ubah.
Bab 5.3.3. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).
// J: Jawapan
-------------------------------------------------------------------------------------------
The following database configuration will be created
-------------------------------------------------------------------------------------------
Name: 		default
Datasource: 	Mysql
Persistent: 	false
Host: 		localhost
User: 		root
Pass: 		*******
Database: 	pms
-------------------------------------------------------------------------------------------
Look okay (y/n)
[y] > _
// J: Taip "y" jika anda berpuashati,taip "n" jika anda ingin mengulangi proses semula.
Do you wish to add another database configuration?
// J: Taip "y" jika anda mahu menambah penyambungan 
// pangkalan data, tekan "enter" jika tidak.
Bab 5.3.4. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).

Untuk mengetahui sama ada penyambungan tadi berjaya atau tidak, buka browser dengan url ini, http://localhost/pms

Bab 5.3.4. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).

Jika anda mendapat mesej seperti ini

CakePHP is NOT able to connect to the database
Database connection "Mysql" is missing, or could not be created

Bermakna anda mempunyai masalah dengan penyambungan yang dibuat sebentar tadi.

Bab 5.3.5. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).

Anda boleh melakukan pengubahan tetapan dengan membuka fail database.php di dalam direktori Config/Schema/database.php

Bab 5.3.6. Penyambungan pangkalan data menggunakan Cake Bake Console (MYSQL & CakePHP Connection).

Anda perlu menambah variable ‘unix_socket’ ke dalam $default = array() dan tetapkan nilainya.

// Contoh:
public $default = array(
'datasource' => 'Database/Mysql',
'persistent' => false,
'host' => 'localhost',
'login' => 'root',
'password' => 'admin321',
'database' => 'pms',
'unix_socket' => '/var/mysql.sock', //unix socket
);

Bab 6. Menjana kod sumber (Source Code) menggunakan Cake Bake Console.

Bab 6.1. Penerangan Interactive Bake Shell.

Arahan Fungsi
cake bake db_config Membuat tetapan untuk konfigurasi pangkalan data
cake bake model Menjana kod sumber untuk model yang akan mengandungi validation & association.
cake bake view Menjana kod sumber HTML untuk paparan pengguna.
cake bake controller Menjana kod sumber untuk model yang akan mengandungi fungsi seperti index,view,add,edit, dan delete.
cake bake project Untuk membina struktur aplikasi CakePHP yang baru.
cake bake fixture Untuk menjana kod sumber untuk test fixture.
cake bake test Untuk menjana kod sumber untuk CakePHP unit test.
cake bake plugin plugin_name Menjana kod sumber untuk plugin mengikut struktur direktori CakePHP
cake bake all Menjana kod sumber untuk model,view,controller,test, sekaligus.

Bab 6.2. Menjana kod sumber untuk MVC.

Pastikan anda berada di dalam direktori aplikasi anda iaitu "pms". Sekarang taipkan arahan di bawah.

cake bake all
Bab 6.2.1. Menjana kod sumber untuk MVC.

Sekarang apa yang perlu anda lakukan adalah, masukkan nombor mengikut urutan. Kita akan bake ProjectApplicant dahulu. Jadi masukkan nombor 1 pada terminal/cmd.

Bab 6.2.2. Menjana kod sumber untuk MVC.

Anda akan mendapat paparan seperti ini apabila ia console bake berjaya menjana kod sumber untuk Model,View & Controller. Rujuk gambar.

Proses bake selesai untuk ProjectApplicant.
Bab 6.2.3. Menjana kod sumber untuk MVC.

Seterusnya, untuk bake model Project & User, anda cuma perlu mengulangi langkah di atas. Untuk mengetahui sama ada cake menjana & mencipta kod sumber tadi,kita buka folder Model,View & Controller

Bab 6.2.4. Menjana kod sumber untuk MVC.

Fail view
yang telah dicipta

Fail model
yang telah dicipta

Fail controller
yang telah dicipta
Bab 6.2.5. Menjana kod sumber untuk MVC.

Kita akan cuba menambah user ke dalam sistem kita dengan membuka url http://localhost/pms/users/add.
Sila cuba tambah user dan submit.

Bab 6.2.6. Menjana kod sumber untuk MVC.

Kemudian ia akan membawa kita ke url http://localhost/pms/users dan menyenaraikan users yang ada didalam pangkalan data.

Sekarang ini anda sudah pun mempunyai kod sumber asas untuk sistem pengurusan projek ini. Jika anda buka fail Controller/UsersController.php, anda akan melihat fungsi index,view,add,edit dan delete sudah terbina. Fungsi inilah yang memainkan peranan untuk mengawal perjalan sistem anda.

Bab 6.2.7. Menjana kod sumber untuk MVC.

Jika anda buka fail Model/User.php, anda akan melihat validation rules & association telah terbina dan ia akan mengawal bisnes logik aplikasi anda.

Jika anda buka fail View/Users/index.ctp, anda akan melihat kod HTML bersama PHP yang digunakan untuk memapar data dari pangkalan data. Disini jugalah anda akan menghias dan mereka bentuk paparan antaramuka pengguna (User Interface) sistem anda.

Mudah kan?

Bab 6.3. Route

Routing adalah salah satu kelebihan yang berfungsi untuk mencantikkan url sebuah sistem web.

Route dapat menukarkan url anda dari begini:
http://localhost/pms/projects/view/1

kepada
http://localhost/pms/projek/tunjuk/1

Untuk mengemaskini route, anda perlu melakukannya pada fail Config/route.php. Kesemua route akan dikawal disini.

Bab 6.3.1. Route.

Ok mari kita cuba tukar url untuk bahagian projects pada bahasa melayu.

Copy & paste kod dibawah ini ke dalam fail Config/route.php

Router::connect('/senarai-projek', array('controller' => 'projects', 'action' => 'index'));
Router::connect('/projek/tambah', array('controller' => 'projects', 'action' => 'add'));
Router::connect('/senarai-pengguna', array('controller' => 'users', 'action' => 'index'));
Router::connect('/pengguna/tambah', array('controller' => 'users', 'action' => 'add'));
Router::connect('/senarai-peserta-projek', array('controller' => 'project_applicants', 'action' => 'index'));
Router::connect('/peserta-projek/tambah', array('controller' => 'project_applicants', 'action' => 'add'));

Bab 7. Membina fungsi log masuk dan log keluar


(Login & Logout with Simple Authentication and Authorization Application)
Rujukan : http://book.cakephp.org/2.0/en/tutorials-and-examples/blog-auth-example/auth.html

Bab 7.1. Membuat Tetapan dan Kemaskini

Kita perlu menambah satu lagi field di table users,iaitu field "role". Untuk melakukan pengubahan ini,kita cuma perlu menambah key dan value seperti dibawah ini pada array $users di dalam fail Config/Schema/schema.php.

'role' => array('type'=> 'string', 'null' => false, 'collate'=>
'latin1_swedish_ci', 'charset'=> 'latin1'),
Bab 7.1.1. Membuat Tetapan dan Kemaskini

untuk mengemaskini skema pangkalan data yang baru kita tambah tadi,taip arahan di bawah ini pada terminal/cmd.

cake schema update

skema pangkalan data akan dikemaskini mengikut field table yang kita tambah tadi.

Bab 7.1.2. Membuat Tetapan dan Kemaskini

Seterusnya, buka fail Model/User.php Tambahkan index array dibawah ini ke dalam array $validate.

Bab 7.1.3. Membuat Tetapan dan Kemaskini

Seterusnya buka fail View/Users/add.ctp dan tambahkan kod dibawah ini selepas kod echo $this->Form->input('password);

echo $this->Form->input('role', 
	array(options' => array('admin' => 'Admin', 'staff' => 'Staff'))
);
//Rujuk gambar dibawah.
echo $this->Form->input('password); 
echo $this->Form->input('role', 
	array(options' => array('admin' => 'Admin', 'staff' => 'Staff'))
);

Bab 7.2. Pengesahan Log Masuk & Log Keluar

(Login & Logout Authentication)

Kita sekarang sudah boleh bermula untuk membina fungsi pengesahan log masuk dan log keluar untuk sistem pengurusan projek ini.

Kita akan menggunakan 2 komponen yang telah terbina bersama CakePHP iaitu Komponen Session & Auth.

Bab 7.2.1. Pengesahan Log Masuk & Log Keluar

Buka fail Controller/AppController.php dan tambahkan kod dibawah ini ke dalam class AppController.

public $components = array(
'Session','Auth' => array(
	'loginRedirect' => array('controller' => 'projects','action' => 'index',),
	'logoutRedirect' => array('controller' => 'users','action' => 'login'),
	'authenticate' => array('Form' => array('passwordHasher' => 'Blowfish')))
);
Bab 7.2.2. Pengesahan Log Masuk & Log Keluar

Kita perlu menambah dua fungsi pada UsersController iaitu fungsi login() dan fungsi logout() untuk mengawal perjalanan log masuk dan log keluar sistem ini. Buka fail Controller/UsersController.php dan tambahkan kod dibawah ini pada class UsersController

public function login() 
{
	if ($this->request->is('post')) 
	{
		if ($this->Auth->login()) {return $this->redirect($this->Auth->redirectUrl());}
		$this->Session->setFlash(__('Maaf ada sila cek semula username & password anda.'));
	}
}
public function logout() {return $this->redirect($this->Auth->logout());}
Bab 7.2.3. Pengesahan Log Masuk & Log Keluar

Fungsi login akan mengesan sama ada pengguna telah memasukkan data yang sah atau tidak.
Jika data yang diberi adalah sah, ia akan membenarkan pengguna mengakses url yang diminta.
Fungsi logout akan memadam sesi (Session) pengguna yang telah mengakses sistem dan terus dibawa keluar dari sistem.

Bab 7.2.4. Pengesahan Log Masuk & Log Keluar

Seterusnya kita akan membuat paparan untuk fungsi login. Untuk membuat paparan login, anda perlu membuka direktori View/Users/ dan cipta satu fail bernama login.ctp. Tambahkan kod dibawah ini pada fail login.ctp tadi.

<div class="users form">
<?php echo $this->Session->flash('auth'); ?>
<?php echo $this->Form->create('User'); ?>
<fieldset>
<legend>
<?php echo __('Sila isikan Username & password'); ?>
</legend>
<?php echo $this->Form->input('username');
echo $this->Form->input('password');
?>
</fieldset>
<?php echo $this->Form->end(__('Login')); ?>
</div>
Bab 7.2.5. Pengesahan Log Masuk & Log Keluar
Untuk mengetahui sama ada fungsi ini berjaya atau tidak, sila buka browser dan akses sistem kita. Jika anda berjaya, anda akan mendapat paparan seperti dibawah
Bab 7.2.6. Pengesahan Log Masuk & Log Keluar
Seterusnya kita akan menambah hyperlink untuk fungsi logout & login pada header page sistem pms ini. Buka fail View/Layouts/default.ctp, copy kod dibawah ini dan paste ke dalam elemen <header>.
<?php
// Membaca sesi pengguna sistem menggunakan Session Helper.
$userDetails = $this->Session->read('Auth.User'); 
// Memeriksa sama ada sesi pengguna wujud atau tidak.
if(isset($userDetails)):
	echo $this->Html->link('Log Masuk',array('controller'=>'users','action'=>'logout'));
else:
	echo $this->Html->link('Log Keluar',array('controller'=>'users','action'=>'logout'));
endif;
?>
Bab 7.2.7. Pengesahan Log Masuk & Log Keluar
Jika sesi pengguna wujud, hyperlink akan bertukar kepada teks "Log Keluar" untuk fungsi Logout.
Jika tidak, teks hyperlink akan bertukar kepada "Log Masuk" untuk fungsi login.

Jika anda berjaya,paparannya adalah seperti di bawah ini.

Bab 7.3. Penggunaan fungsi beforeFilter.

Rujukan : http://book.cakephp.org/2.0/en/controllers.html#request-life-cycle-callbacks

Fungsi beforeFilter adalah fungsi callback yang telah terbina bersama CakePHP .
Apa itu fungsi callback (Callback function) ?
Secara ringkas fungsi callback ini adalah fungsi yang akan berjalan selepas fungsi yang dipilih telah dijalankan.
Contoh callback: beforeFilter akan berfungsi sebelum fungsi yang ada didalam sesebuah controller dijalankan dan selepas fungsi didalam komponen Auth berjaya dijalankan.

Bab 7.3.1. Penggunaan fungsi beforeFilter
Contoh situasi :
Anda membuka sistem anda seperti biasa untuk melihat senarai projek di url http://localhost/pms/projects/index. Akan tetapi,anda telah dibawa ke url http://localhost/pms/users/login.
Bab 7.3.1. Penggunaan fungsi beforeFilter
Ini kerana fungsi loginRedirect didalam komponen Auth telah berjalan dan menapis akses anda ke url yang anda minta kerana untuk melihat isi kandungan url http://localhost/pms/projects/index anda perlu log masuk terlebih dahulu. Bagaimana pula jika anda hendak melihat senarai projek tanpa perlu log masuk?

Anda hanya perlu menambah kod seperti dibawah ini bersama fungsi beforeFilter ke dalam ProjectsController. Buka fail Controller/ProjectsController.php dan tambah kod dibawah didalam class ProjectsController.
public function beforeFilter() 
{
	parent::beforeFilter();
	$this->Auth->allow('index');
	// $this->Auth->allow akan membenarkan fungsi yang dinyatakan didalam parameter allow()
	// berjalan tanpa dihalang oleh Auth.
}
Bab 7.3.1. Penggunaan fungsi beforeFilter
Dan sekarang anda buka semula url http://localhost/pms/projects/index. Anda sudah boleh melihat senarai projek seperti paparan dibawah ini.
Bab 7.3.1. Penggunaan fungsi beforeFilter
Anda boleh menambah seberapa banyak fungsi yang anda mahu penggunaannya diakses tanpa log masuk ke dalam sistem.
//Contoh kod:
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('index',’add’,’view’);
}
Contoh kod diatas akan membenarkan fungsi index,add dan view pada class ProjectsController diakses tanpa pengguna perlu log masuk ke dalam sistem.
Bab 7.3.1. Penggunaan fungsi beforeFilter
Mari teruskan dengan membenarkan fungsi login,logout dan add di UsersController dapat diakses sebelum ditapis oleh Auth komponen.Ini membolehkan pengguna mendaftar/menambah pengguna baru .

Tambah kod dibawah ini ke dalam fail Controller/UsersController.php
public function beforeFilter() {
parent::beforeFilter();
$this->Auth->allow('login', 'logout','add');
}

Bab 7.4. Password Hashing.

Untuk password hashing kita akan gunakan BlowFishPasswordHasher yang terbina bersama CakePHP 2.

Untuk mengetahui lebih lanjut tentang Blowfish Encryption sila rujuk: http://en.wikipedia.org/wiki/Blowfish_%28cipher%29

Untuk menggunakan class BlowFishPasswordHasher kita perlu memanggil class tersebut dengan menggunakan kod dibawah ini ke dalam fail Model/User.php:

App::uses('BlowfishPasswordHasher', 'Controller/Component/Auth');
// Letak kod diatas selepas kod App::uses('AppModel', 'Model');.
Bab 7.4.1 Password Hashing

Seterusnya tambahkan fungsi callback beforeSave ke dalam model User

public function beforeSave($options = array()) 
{
	if (isset($this->data[$this->alias]['password'])) 
	{
		$passwordHasher = new
		BlowfishPasswordHasher();
		$this->data[$this->alias]['password'] = $passwordHasher->
			hash($this->data[$this->alias]['password']);
	}
	return true;
};
Bab 7.4.1 Password Hashing
Sekarang ini,apabila anda menambah pengguna baru,setiap password akan disulitkan dengan beberapa unik karakter yang dipilih secara rawak.

Contoh password yang telah menggunakan BlowFishPasswordHasher
id username role password
1 malik admin `1234567890-=+_)(*&^%$#@!)

Bab 7.5. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization).

Sekarang ini,kita akan menambah penapisan bagi setiap pengguna yang akan mengakses sistem ini supaya mereka berada di kawasan yang sepatutnya.

Contohnya pengguna di dalam kategori staff tidak dibenarkan untuk edit atau delete projek yang telah dicipta oleh admin.

Untuk menjayakan kaedah ini,anda perlu mengubah beberapa kod di model,view,dan controller.
Bab 7.5.1. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)
Kita akan buat pada satu seksyen dahulu iaitu seksyen projects. Untuk seksyen seterusnya (seksyen users,sekysen project applicants), anda cuma perlu mengikuti langkah-langkah dibawah ini semula dan ubah kod mengikut nama controller/model seksyen yang anda ubah. Kita mula dengan mengubah kod di dalam fail View/Projects/add.ctp.
Bab 7.5.2. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)

Sila buang kod dibawah ini dari fail View/Projects/add.ctp

echo $this->Form->input('user_id');

Kemudian buka fail Controller/ProjectsController.php dan tambahkan kod dibawah ini didalam fungsi add.

$this->request->data['Project']['user_id'] = $this->Auth->user('id');
Bab 7.5.3. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)

Kod fungsi add anda haruslah seperti dibawah ini

public function add() 
{
	if ($this->request->is('post')) 
	{
		$this->request->data['Project']['user_id'] = 
			$this->Auth->user('id');
			// Fungsi $this->Auth->user() akan membaca data pengguna yang telah log masuk kedalam sistem. 
			// Jika anda mengisi parameter id seperti $this->Auth->user('id'),
			// ia akan mengambil id pengguna tersebut sahaja.
		$this->Project->create();
		if ($this->Project->save($this->request->data)) 
		{
			$this->Session->setFlash(__('Projek berjaya disimpan!'));
			return $this->redirect(array('action' => 'index'));
		} else 
		{
			$this->Session->setFlash(__('Maaf projek tidak '
			. 'berjaya disimpan,sila cuba sekali lagi'));
		}
	}
	
	$users = $this->Project->User->find('list');
	$this->set(compact('users'));
}
Bab 7.5.4. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)

Seterusnya buka fail Controller/AppController.php dan tambah kod dibawah ini pada array komponen Auth.

'authorize' => array('Controller')

dan tambahkan fungsi isAuthorized() untuk mengesan kategori pengguna yang log masuk ke sistem.


public function isAuthorized($user) {
// Admin boleh akses semua fungsi
if (isset($user['role']) && $user['role'] === 'admin') {
return true;
}
// Jika bukan admin,tidak dibenarkan akses
return false;
}
Bab 7.5.5. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)

Kod anda haruslah seperti dibawah ini.

Bab 7.5.6. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)
Kita baru sahaja membina mekanisma pengesahan yang mudah dalam masa yang singkat. Dengan ini,pengguna yang didalam kategori admin akan dapat mengakses kesemua lokasi sistem tetapi tidak pada staff.

Untuk membenarkan staff atau pengguna lain yang sudah log masuk mengakses pada lokasi tertentu (contoh: http://localhost/pms/projects/add), ianya amat mudah. Kita akan gunakan fungsi isAuthorized sekali lagi tetapi pada kali ini kita tambah pada controller Projects.
Bab 7.5.7. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)

Buka fail Controller/ProjectsController.php dan tambah kod dibawah ini,

public function isAuthorized($user) 
{
	//akan memberi akses kepada pengguna yang sudah log masuk
	//supaya dapat menambah projek baru
	if ($this->action === 'add') {return true;}
}
//Dengan fungsi di atas ini, kita akan membenarkan staff untuk menambah projek baru.
Bab 7.5.8. Penapisan akses kandungan mengikut kategori pengguna sistem (Authorization)
Baiklah,mari kita cuba apa yang kita sudah buat. Anda akan mendapat paparan seperti dibawah ini jika anda berjaya.

Rujukan Kod Sumber

Github : https://github.com/malikperang/pms.
Jika anda mengalami sebarang masalah, anda perlu mengulangi dan mengikut langkah-langkah yang diberi dengan teliti.

Jika anda mengalami masalah dengan konfigurasi database atau konfigurasi CakePHP,
Pergi ke https://github.com/malikperang/pms/tree/master/Config.

Jika anda mengalami masalah dengan Model,
Pergi ke https://github.com/malikperang/pms/tree/master/Model.

Jika anda mengalami masalah dengan Controller,
Pergi ke https://github.com/malikperang/pms/tree/master/Controller.

Jika anda mengalamai masalah dengan View
Pergi ke https://github.com/malikperang/pms/tree/master/View.

Kredit aka Penghargaan

Fariz Izwan Kamaruzzaman
malikperang{dekat}gmail{titik}com)
https://github.com/malikperang/pms

SUDAH HABIS DAA

  • : www.amin007.org
  • : al.amin007@yahoo.com
  • : amin007.ledang
  • : amin007_ledang
  • : abdulmuhaiminabdulghaniamin007ledang
  • :
  • : amin007
  • : aminledang
  • : amin800507
  • : user/abdmuhaimin
Fork me on GitHub