• Tidak ada hasil yang ditemukan

Menjadi Pembangun CakePHP~Bazet

N/A
N/A
Protected

Academic year: 2021

Membagikan "Menjadi Pembangun CakePHP~Bazet"

Copied!
176
0
0

Teks penuh

(1)

Menjadi Pembangun CakePHP

Penulis : Azril Nazli Alias

Kerjaya : Trainer PHP/MySQL, CakePHP, Linux System Administration, E Commerce / Marketing, Freelance Web Developer

Pengalaman Programming : Sejak 1998 Email : azril.nazli@gmail.com

Facebook : http://facebook.com/azrilnazli Tarikh : 1 January 2010

(2)

Menjadi Pembangun Laman Web Open Source

Pembangunan laman web ialah satu kerja yang memerlukan anda tahu banyak teknologi dan juga berbagai bahasa aturcara. Membangunkan laman web ialah satu kerjaya yang menyeronokkan dan juga memberi pendapatan lumayan disebabkan oleh permintaan tinggi dari sektor swasta dan juga awam tetapi dengan syarat anda perlulah kemaskini pengetahuan dengan teknologi terkini.

Tugas-tugas am pembangun laman web adalah seperti berikut

1. Memahami kehendak pelanggan dan membantu mereka membuat URS ( User Requirement Spec )

2. Memastikan server mengikuti spec untuk development dan juga production 3. Membina skema pengkalan data ( database schema )

4. Memastikan kod-kod dibackup dan mempunyai sistem versioning . 5. Mencari bugs di dalam sistem

6. Membuat Unit Test terhadap sistem 7. Memilih bahasa aturcara yang sesuai

( PHP,Ruby,Java,Perl,Coldfusion,ASP )

8. Memilih perisian pengkalan data yang sesuai ( MySQL, Oracle,PostgreSQL )

9. Memilih sistem operasi yang sesuai ( Linux, Windows, FreeBSD ) 10.Membina kod asas HTML dan membantu Pereka Laman Web ( Web

Designer )

11.Menentukan sistem navigasi dan kepuasan pengguna. ( User Experience & Usability )

12.Berupaya menyelesaikan masalah dalam masa yang singkat 13.Memastikan sistem boleh dikemaskini dikemudian hari

14.Membina dokumentasi lengkap untuk manual pembangun ( API Documentation )

15.Memastikan keselamatan laman web di peringkat tertinggi

Jelas di sini, tugas seorang pembangun laman web merangkumi banyak aspek. Tidak terhad kepada aturcara semata-mata, seorang pembangun perlu mengetahui selok belok server, pengetahuan asas tentang rangkaian dan juga web design.

(3)

Cabaran utama pembangun laman web semakin hari ialah untuk deliver hasil kerja mereka dalam masa yang singkat dan mudah untuk diubahsuai mengikut kehendak pelanggan. Contohnya jika pelanggan tiba-tiba ingin menambah feature seperti search engine dan ianya perlu disiapkan dalam masa 1 jam.

Buku ini akan mengubah cara anda membina laman web. Secara tradisionalnya, pembangun laman web yang menggunakan PHP dan MySQL akan membuat sistem tanpa menggunakan framework. Memang benar, kelajuan aturcara anda memang laju disebabkan anda tidak perlu mengikut undang-undang dalam membina laman web. Anda boleh letak fail secara sesuka hati anda, membuat panggilan database di setiap fail, malah anda tidak perlu risau dengan struktur sistem anda. Tetapi, ianya akan menjadi masalah yang besar jika sistem anda perlu dinaik taraf di kemudian hari dan ianya sudah tentu memerlukan ramai

pengaturcara untuk memahami cara anda membuat sistem. Lebih teruk lagi jika sistem anda perlu dimigrate ke pengkalan data Oracle dari MySQL dan bayangkan anda ada beribu-ribu fail yang memerlukan perubahan dan di ketika itu anda

mungkin rasa menyesal dan ingin berubah ke kerjaya yang tidak memeningkan kepala anda.

Membina laman web menggunakan framework akan menjimatkan masa anda dalam jangka masa yang panjang dan buku ini akan membuatkan anda gembira dengan tugas sebagai pembina laman web.

Bagaimana untuk menjadikan elemen kegembiraan wujud di dalam dunia aturcara ?

(4)

2. Terdapat 5 juta result dari hasil carian Google berkaitan ‘CakePHP’ 3. Terdapat lebih kurang14,000 ahli yang aktif di CakePHP Google Group 4. Boleh generate code secara automatik menggunakan command line

5. Mempunyai berbagai Helpers seperti Form,HTML,Ajax,Javascript,XML dan banyak lagi

6. Menggunakan SEF URL ( Search Engine Friendly ) 7. Struktur yang hampir sama dengan Ruby On Rails

Oh ya, saya lupa bercerita tentang Ruby On Rails atau RoR. Ianya mula popular sekitar tahun 2006 disebabkan menggunakan konsep MVC ( Model View

Controller ) dan tujuan utama menggunakan RoR ialah untuk membuatkan pembangun laman web gembira semasa membina sistem. ( sila google Ruby On Rails )

Secara teknikalnya, CakePHP ialah

“ CakePHP is a rapid development framework for PHP which uses commonly known design patterns like ActiveRecord, Association Data Mapping, Front Controller and MVC. The primary goal is to provide a structured framework that enables PHP users at all

levels to rapidly develop robust web applications, without any loss to flexibility. “

Pengetahuan Asas

Buku ini ditujukan kepada semua orang dengan syarat anda mempunyai minat untuk menjadi pembangun laman web. Ya, buku di tujukan untuk semua peringkat masyarakat di luar sana dengan pengetahuan asas menggunakan komputer dan

(5)

internet. Sepantas harimau kumbang berlari, dia perlu belajar berjalan dahulu sebelum belajar berlari. Tapi sebaiknya jika ada mempunyai asas-asas berikut

– PHP dan SQL programming

– HTML, CSS dan Javascript scripting

– Apache dan MySQL system administration Apa yang kita bina ?

Bayangkan membuat sesuatu yang mengembirakan contohnya buat blog. Blog ialah satu medium di mana anda boleh mengasah bakat anda sebagai pembangun laman web. Jadi kita akan membina sistem blog yang mempunyai elemen-elemen seperti berikut :

1. Senarai posting anda 2. Komen untuk setiap post

3. Sistem login untuk admin , editor dan pelawat 4. Search engine

5. Sistem rating untuk post dan juga komen

6. Statistik pelawat dan juga posting yang popular 7. Sistem tag & kategori untuk setiap post

8. Sistem RSS ( Really Simple Syndication ) 9. Dwi bahasa ( Bahasa Inggeris dan Melayu ) 10.Sistem penunjuk status pemilik blog ala Twitter Teknologi yang terlibat

Sekarang adalah zaman Web 2.0 dan skill-skill baru yang akan dipelajari adalah seperti berikut 1. HTML 2. CSS 3. Javascript 4. AJAX 5. PHP

(6)

cuba cari maksudnya.

Perisian yang perlu anda download

Saya adalah pengguna sistem operasi Linux sejak tahun 1998 dan sehingga kini kesemua hasil kerja saya adalah menggunakan Linux sepenuhnya. Tetapi di dalam, buku ini saya akan menggunakan platform Windows ( Windows Vista Home ). Jadi perisian yang saya senaraikan di bawah adalah untuk platform Windows sahaja.

# Kategori Nama URL

1 Development Server

XAMPP Lite http://www.apachefriends.org

2 Text Editor Crimson Text Editor http://www.crimsoneditor.com

3 Version Control Tortoise SVN http://tortoisesvn.net 4 Ajax Framework ScriptAculoUs http://script.aculo.us 5 Ajax Framework Prototype http://www.prototypejs.org 6 PHP Framework

CakePHP 1.2.5 Stable http://www.cakephp.org

7 Browser Mozilla Firefox http://getmozilla.com 8 Browser

Debugger

(7)

Sila download kesemua fail di atas dan simpan di dalam satu folder. Apa itu XAMPP ?

XAMPP ialah koleksi perisian asas untuk membolehkan saya menjalankan Apache web server dan juga MySQL database server di dalam persekitaran sistem operasi Windows. Secara amnya, Apache web server akan menggunakan port 80 di dalam komputer kita dan MySQL akan menggunakan port 3306. Untuk memastikan web server kepunyaan saya berjaya di install, saya cuma perlu buka alamat web

http://localhost:80 atau secara singkatnya http://localhost dan web server akan memaparkan website. Disamping itu, XAMPP datang sekali dengan bahasa

perisian PHP yang akan digunakan oleh framework CakePHP di dalam projek blog ini nanti.

Install XAMPP

Saya menggunakan XAMPP versi lite. Untuk install, sila ikuti cara-caranya di http://www.apachefriends.org/en/xampp-windows.html . Untuk PATH

installation, saya gunakan c:\xampp. Setelah anda install xampp, klik ikon XAMPP di Desktop anda dan jangan tick running sebagai service. Cuma start 2 service sahaja, iaitu Apache dan MySQL. Klik menu start dan jika Windows Vista tanya soalan untuk block/unblock service berikut, pilih unblock. Setelah anda berjaya running 2 service itu ( Apache & MySQL ), gunakan Mozilla Firefox dan buka alamat http://localhost atau http://127.0.0.1. Anda akan nampak XAMPP default page seperti gambar rajah di bawah.

(8)

Pastikan perkataan ‘Running’ dipaparkan disebelah Apache dan MySql

Muka hadapan jika anda membuka alamat http://localhost atau http://127.0.0.1 di browser Mozilla Firefox anda.

(9)

Pengenalan kepada CakePHP Framework URL : http://www.cakephp.org

CakePHP ialah satu framework yang menggunakan PHP sebagai bahasa aturcara sokongan. Ia mengambil inspirasi Rapid Application Development yang

diperkenalkan older framework Ruby On Rails. CakePHP boleh dijalankan di dalam persekitaran Windows, Linux,Freebsd dan Mac OS.

CakePHP menggunakan konsep MVC dalam pembinaan laman web. MVC bermaksud Model, View dan Controller

Apa itu Model ?

Model ialah gateway untuk akses data. Data boleh berbagai bentuk seperti fail CSV, database, LDAP. Contoh fail untuk Post Model ialah

(10)

Apa itu Controller ?

Sesudah data dipanggil dari sumber, tugas Controller ialah untuk memanipulasi data sebelum di hantar ke View. Di dalam Controller, saya boleh panggil data dari berbagai sumber seperti User,Post,Comment dan kemudiannya digabungkan untuk di hantar ke View. Contoh fail untuk Post Controller ialah

/app/controllers/posts_controller.php

Apa itu View ?

View ialah tempat data dipersembahkan kepada client. Persembahan data boleh berbagai bentuk seperti HTML,JSON,Javascript,XML malah text sahaja. View ialah tempat di mana CakePHP berinteraksi dengan pengguna. Setiap action akan mempunyai viewnya sendiri, contohnya Add Action, ianya merujuk kepada satu method untuk Post Controller bernama Add dan akan mempunyai satu fail View bernama /app/views/posts/add.ctp. Extension .ctp bermaksud Cake Template.

(11)

Struktur direktori Projek CakePHP

Contoh Struktur folder projek bernama Engineering di dalam CakePHP. CakePHP mempunyai struktur direktorinya sendiri.

Engineering/ ~ mewakili nama projek

Engineering/app/ ~ folder aplikasi utama untuk projek Engineering

(12)

Engineering/app/models/ ~ menyimpan fail-fail Model

Engineering/app/plugins/ ~ menyimpan fail-fail untuk Plugin Engineering/app/tests/ ~ menyimpan fail-fail untuk Unit Test Engineering/app/tmp ~ folder sementara. Perlu writable

Engineering/app/vendors/ ~ folder untuk menyimpan 3r party vendor script. Contohnya phpThumb, Zend library ,Pear library

Engineering/app/views/ ~ folder untuk menyimpan views untuk setiap action dalam controller. Setiap views akan disimpan dalam foldernya sendiri contohnya views/posts akan menyimpan semua fail view untuk model posts.

Engineering/app/webroot ~ folder untuk public dan menyimpan fail-fail untuk image,css dan javascript.

Engineering/cake ~ folder untuk libray core CakePHP. Install CakePHP di dalam XAMPP

Sebelum itu, baik saya terangkan bagaimana struktur direktori sistem blog ini. Sepertimana yang kita tahu, XAMPP akan diinstall di c:\xampp dan directory c:\xampp\htdocs akan menyimpan kesemua fail-fail yang boleh diakses melalui web server. Jika PC anda mempunyai alamat 10.0.0.1 dan anda berada di dalam rangkaian, rakan anda boleh mengakses fail-fail dan direktory menerusi alamat http://10.0.0.1 dengan syarat Apache web server sedang berjalan.

Jadi di dalam kes ini, saya akan download CakePHP 1.2.5 stable ( .zip ) dan extract sebagai folder c:\xampp\htdocs\cake_projects\

(13)
(14)
(15)

Extrak fail tersebut ke folder folder cake_1.2.5/ di dalam Desktop

Masuk ke dalam folder cake_1.2.5/ dan akan jumpa satu folder bernama cake_1.2.5/ . Rename folder tersebut menjadi cake_projects. Copy/cut folder tersebut ke dalam folder c:\xampp\htdocs

(16)

Konfigurasi CakePHP

Untuk memastikan anda berjaya install CakePHP dengan jayanya, sila buka alamat http://localhost/cake_projects/ menggunakan Mozilla Firefox, dan anda akan dapat melihat page seperti berikut :

Jelas di sini anda perlu membetulkan 2 perkara iaitu : 1. Betulkan nilai Security.salt di dalam fail

c:\xampp\htdocs\cake_projects\app\config\core.php ( line 151 ) kepada nilai lain ( asalkan bukan default )

2. Bina database bernama blog_development dan rename fail bernama c:\xampp\htdocs\cake_projects\config\database.php.default kepada

database.php di dalam folder yang sama. Masukkan nilai yang betul untuk username,password dan nama database di dalam fail database.php.

(17)

Ubah nilai Security.salt kepada nilai ‘projek_blog_cakephp_2010’ Buat database bernama blog_development

MySQL database adalah pilihan utama di dalam projek ini. Untuk memanipulasi pengkalan data MySQL, saya akan gunakan perisian PHPMyAdmin yang telah datang sekali dengan XAMPP. Untuk akses ke PHPMyAdmin, sila ke alamat berikut

http://localhost/phpMyAdmin dan anda akan dapat paparan panel PHPMyAdmin. Sila cari fungsi untuk create database dan masukkan nilai ‘blog_development’

Klik create setelah memasukkan nilai blog_development.

Kini , untuk membolehkan CakePHP berhubung dengan MySQL database, settingnya adalah seperti berikut

– Username : root

– Password : < tiada password > – Host : localhost

(18)

Dengan menggunakan Crimson Editor, edit fail database.php yang terletak di c:\xampp\htdocs\cake_projects\app\config\database.php dan ubah nilai seperti di atas. Save fail tersebut sebagai database.php dan buka alamat

(19)

Kemudian, sila refresh browser anda di alamat http://localhost/cake_projects, dan sepatutnya anda akan mendapat 4 baris hijau seperti di atas.

Maksud baris hijau mengikut urutan

1. Baris pertama berkisar berkenaan temporary folder. CakePHP memerlukan satu folder tmp/ yang terletak di /app/tmp . Pastikan folder ini writable dan jika membuat dalam Linux, pastikan anda set kan permission chmod 777 2. Baris ke 2 bercerita tentang CacheEngine. Cakephp menyokong perisian

caching untuk melajukan sistem. FileEngine digunakan secara default. Antara perisian cache engine yang disokong ialah APC, MemCache dan XCache

3. Baris ke 3 pula memberitahu anda fail konfigurasi /app/config/database.php telah wujud dan boleh digunakan

(20)

Antara satu kelebihan CakePHP, ia mempunyai CLI ( command line interface ) yang akan membantu pembangun laman web dengan menggunakan MS-DOS command line.

Seterusnya, cipta satu fail bernama cake.bat ( windows batch file) di lokasi c:\xampp\htdocs\cake_projects\cake.bat . Sila tulis kod seperti di bawah.

Contoh kandungan kod fail cake.bat

Save fail tersebut dan kemudian buka terminal MS-DOS anda dan pergi ke folder c:\xampp\htdocs\cake_projects\

Arahan : cd c:\xampp\htdocs\cake_projects

Sekarang, anda sudah boleh menggunakan cake CLI . Cuba taip arahan: cake dan tekan [ENTER].

(21)

Paparan seperti di atas akan muncul. Saya ingin membina satu projek bernama blog dan ianya akan disimpan dalam folder c:\xampp\htdocs\cake_projects\blog . Sistem ini akan diakses melalui alamat http://localhost/cake_projects/blog

Jadi untuk membina projek bernama blog arahan berikut akan dilaksanakan arahan: cake bake project

Kemudian paparan seperti di bawah akan ditunjukkan dan anda perlu isi lokasi projek blog anda

(22)

Saya memberi nilai c:\xampp\htdocs\cake_projects\blog dan tekan [ENTER] Seterusnya anda akan ditanya 2 soalan. Sila tekan Y untuke kedua-dua soalan dan cake CLI akan membina projek blog anda dan output seperti di bawah akan

(23)
(24)

Paparan selepas cake CLI berjaya bina projek blog

Kemudian cake CLI akan bertanya soalan tentang konfigurasi database. Kita akan menggunakan objek default untuk menyimpan setting database. Sila ikut

konfigurasi seperti di atas. Tekan y jika anda bersetuju dengan konfigurasi yang disediakan.

(25)

Paparan setelah berjaya membuat konfigurasi database untuk projek blog dengan menggunakan cake CLI.

Menguji sistem blog

Sila buka alamat http://localhost/cake_projects/blog, dan anda akan dapat papar seperti di bawah,

(26)

Ringkasan Bab 1

Dalam buku anda akan membina berbagai-bagai projek, tidak terhad hanya membina blog sahaja. Contohnya anda membina sistem bernama Event, untuk mengaksesnya hanya perlu membina projek di folder

c:\xampp\htdocs\cake_projects\ dan http://localhost/cake_projects/event

Folder c:\xampp\htdocs\cake_projects\ akan menjadi placeholder untuk berbagai-bagai jenis projek yang saya akan tulis dalam buku ini.

Bab 2 : Membina sistem Posting

Jika anda melihat sistem blog seperti di blogspot atau wordpress, elemen utama yang anda nampak ialah tajuk , isi, komen dan tarikh blog dicipta.

(27)

Tugas pertama kita ialah membina satu sistem di mana kita boleh: 1. Baca posting secara detail

2. Edit posting

3. Senaraikan semua posting 4. Padam posting

5. Search posting

Struktur table posts

Sistem Blog yang akan dibina, akan menggunakan database table bernama posts yang akan dibina di dalam database blog_development. Table posts ini akan mempunyai kolum seperti berikut:

Nama Jenis Fungsi

id Integer,

auto_increment

Menyimpan no rujukan setiap posting

Title Varchar Menyimpan tajuk posting

Summary Text Menyimpan summary setiap posting

Content Text Menyimpan kandungan posting

Created Datetime Menyimpan tarikh posting dibina Updated Datetime Menyimpan tarikh akhir ubahsuai

posting

Is_published Integer Flag yang akan menentukan blog boleh dipaparkan kepada pembaca.

(28)

Save fail tersebut sebagai blog.php di dalam folder /blog/config/sql/

Seterusnya, jalankan arahan berikut menggunakan cake CLI di dalam MS-DOS. Kita akan gunakan dry mode untuk memastikan kod SQL yang dihasilkan

memenuhi kehendak sistem blog. Flag --dry akan menyebabkan CakePHP tidak melaksanakan arahan untuk membina table posts di dalam database

blog_development.

Arahan : cake –app blog schema run create blog -dry

(29)

Contoh SQL script yang dijana oleh arahan cake CLI. Untuk veteran SQL, anda sudah tentu dapat membaca maksud kod SQL di atas. Jika dilaksanakan, satu table bernama posts dengan field id,title,summary,content,updated,created dan

is_publish akan dibina di dalam database blog_development.

Tetapi command di atas tidak akan membina table bernama posts di dalam

database blog_development, anda perlu laksanakan arahan yang sama tetapi tanpa flag --dry. Setelah anda berpuashati dengans struktur table posts, sila laksanakan arahan berikut.

(30)

blog_development secara automatik.

Sekarang cuba anda buka perisian PHPMyAdmin di

http://localhost/phpMyAdmin. Pilih database blog_development di menu sebelah kiri dan paparan berikut akan terpapar.

Dengan mengunakan cake schema, saya dapat membina table secara automatik tanpa perlu menaip arahan SQL di dalam perisian phpMyAdmin.

Seterusnya, kita akan membina antaramuka sementara untuk table posts. Ianya akan dibina juga menggunakan cake bake cli. Antaramuka ini akan membolehkan saya menguji sistem blog yang asas dengan feature seperti

– Masukkan post – Senaraikan post – Kemaskini post – Padam post

Arahan cake –app blog bermaksud, saya menggunakan cakephp akan

menggunakan projek folder blog di dalam c:\xampp\htdocs\cake_projects. Flag – app akan memberitahu kepada CakePHP supaya menggunakan folder/projek blog. Saya akan membina Model dan Controller untuk table posts.

(31)

CakePHP Model

Model di dalam CakePHP adalah sumber data, dalam kes ini table posts akan diwakili oleh model bernama Post. Segala operasi untuk mengeluarkan dan

memasukkan data ke dalam table posts akan dilakukan oleh model bernama Post. Untuk itu saya perlu bina model bernama Post sebagai /blog/models/post.php

Save fail di atas sebagai post.php di dalam folder

c:\xampp\htdocs\cake_projects\blog\models. Sperti penerangan saya di atas, Model ialah kawasan di mana CakePHP bercakap dengan database MySQL. Dalam kes ini, Post merujuk kepada Model. Untuk membina model, struktur berikut perlu dipatuhi

1. Nama model mesti dimulakan dengan huruf besar seperti Post, User, Location

2. Nama model mesti singular ( tanpa penambahan s ) dan bukannya plural seperti Posts,Users

3. Nama model mesti dalam format CamelCase. Yakni dimulakan dengan huruf besar dan diikuti dengan huruf kecil

4. Jika anda ingin menggunakan 2 patah perkataan sebagai mode, gunakan CamelCase. Contohnya anda mempunyai table bernama user_settings, dan ingin membina model untuk table tersebut. Nama model yang perlu anda guna ialah UserSetting

5. Nama fail untuk Model mesti sama dengan nama model yang ditakrifkan di dalam kod. Nama fail mestilah berhuruf kecil dan jika mempunyai 2

(32)

Location ~ location.php

6. Fail model perlu disimpan di dalam folder /blog/models/* CakePHP Controller

Controller dalam CakePHP berfungsi untuk menerima data dari Post Model dan data akan dimanipulasi di Controller sebelum di hantar ke View. Fungsi Scaffold digunakan untuk melihat struktur table posts dengan menggunakan interface yang digenerate oleh CakePHP. Untuk membina Post Controller, fail bernama

posts_controller.php perlu dicipta dan diletakkan di dalam folder /blog/controllers.

Save fail di atas sebagai posts_controller.php di dalam folder c:\xampp\htdocs\cake_projects\blog\controllers.

Untuk membuat controller, proses di bawah perlu dipatuhi.

1. Controller akan menggunakan nama plural dari model. Jika kita

menggunakan model Post, controller akan menggunakan nama Posts dan diakhiri dengan ayat ‘Controller’.

2. Jika anda hendak membuat Controller untuk Model UserSetting, failnya akan bernama user_settings_controller.php

3. Nama Class mestilah dalam bentuk CamelCased dan disambung dengan ayat ’Controller’. Contohnya UserSettingsController extends AppController 4. Fail Controller mesti disimpan di dalam folder /blog/controllers/

Seterusnya saya ingin menguji fungsi Scaffold. Oleh itu saya akan buka alamat http://localhost/cake_projects/blog/posts

(33)

Seterusnya saya akan mencuba mengisi table posts dengan menggunakan interface CRUD yang disediakan. Hasilnya seperti berikut.

(34)

lengkap CRUD pertama anda. Maksud CRUD ?

C – Create ~ untuk cipta post R – Read ~ untuk membaca post U – Update ~ untuk kemaskini post D – Delete ~ untuk padam post

Apa itu Scaffold ?

Scaffold ialah satu fungsi di mana CakePHP akan membina interface untuk operasi CRUD yang menggunakan table posts sebagai sumber data. Kegunaan Scaffold ialah untuk melihat struktur table yang dibina menepati kehendak sistem.

Ciri-ciri Sistem Blog : versi 1

Seterusnya kita akan membuat aplikasi kita yang pertama dengan ciri-ciri berikut 1. Sistem perlu mempunyai index dan view untuk senaraikan Posting dan

untuk paparkan Posting mengikut id

2. Perlu mempunyai mekanisma CRUD untuk admin

3. Setiap Posting perlu disenaraikan di hadapan , contohnya alamat http://localhost/cake_projects/blog perlu memaparkan Posting terkini. 4. Posting di muka hadapan mesti menyenaraikan Posting terakhir dahulu 5. Hanya tajuk,tarikh dan ringkasan Posting sahaja di paparkan

6. Mesti ada link untuk membaca Posting yang lengkap.

7. Perlu ada link navigasi yang ringkas untuk panduan pembaca blog 8. Hanya paparkan Posting yang disahkan sahaja ( is_published = 1 ) 9. Hanya paparkan 10 Posting dan selebihnya boleh disenaraikan

menggunakan Pagination.

10.Blog perlu menggunakan Search Engine Friendly URL untuk memudahkan user memahami tajuk blog dia mereka terjumpa link di dalam hasil carian.

(35)

Kehendak : Sistem perlu mempunyai index dan view untuk senaraikan Posting dan untuk paparkan Posting mengikut id

Untuk memenuhi kehendak di atas, saya akan membina 2 action bernama index dan view di dalam Post Controller ).

Action index tugasnya ialah:

– Senaraikan posting mengikut format blog dan disusun mengikut tarikh. Blog yang terakhir akan dipaparkan dahulu

– Hanya senaraikan Tajuk, Ringkasan,Tarikh sahaja

– Mempunyai Pautan untuk membaca blog dengan lengkap

– Mempunyai navigasi untuk membantu pembaca menggunakan blog

Tugasan : Senaraikan posting mengikut format blog dan disusun mengikut tarikh. Blog yang terakhir akan dipaparkan dahulu.

• Pastikan anda telah menambah sekurang-kurangnya 10 posting menggunakan Post Scaffold sebelum meneruskan langkah di bawah. Penyelesaian : Untuk menyenaraikan posting, saya akan menggunakan action index dan boleh diakses melalui http://localhost/cake_projects/posts/index . Untuk itu saya akan menambah function index() di dalam Posts Controller dan akan membina index.ctp di dalam folder /blog/views/posts.index.ctp . Untuk memanggil data dari table posts, saya akan membuat function bernama getLatestPost() dalam fail Post Model.

(36)

/blog/model/post.php

Function atau dikenali sebagai method getLatestPost() akan mendapatkan kesemua data dari table posts menggunakan arahan $this->find(‘all’). Jika saya Cuma ingin mendapatkan satu data sahaja, arahan $this->find(‘first’) boleh digunakan. Untuk rujukan lanjut mengenai arahan $this->find, sila rujuk laman web :

http://book.cakephp.org/view/449/find

Seterusnya hasil carian akan dihantar menggunakan arahan return.

(37)

Tambah method index() dari baris 12 hingga ke 16. Variable $posts akan mendapat data dari arahan $this->Post->getLatestPost(). $this->Post merujuk kepada model Post, yakni sumber data yang digunakan untuk mendapatkan maklumat dari table posts. Method getLatestPost() pula merujuk kepada method yang kita bina sebelum ini di dalam fail /blog/models/post.php.

Memperkenalkan debug();

Di dalam programming, jadikan amalan untuk melihat struktur data dahulu sebelum dipersembahkan ke dalam View. Untuk itu, saya akan menggunakan fungsi debug() seperi di baris 15. Dalam kes ini variable $posts mempunyai data, dan saya akan gunakan debug($posts); untuk melihat data yang terkandung di dalamnya.

Untuk melihat hasilnya, sila ke alamat

(38)

Hasilnya adalah seperti di dalam screenshot di atas. Data disusun dalam bentuk Array() yang ditentukan oleh CakePHP. Setiap gugusan data dikumpulkan

mengikut model, dalam kes ini Post. Jika saya ingin mengeluarkan title blog dari variable $posts, saya akan melakukan arahan berikut

Echo $posts[0[‘Post’][‘title’]; /

Tetapi, saya akan menggunakan Foreach Loop untuk menyenaraikan kesemua data posts. Contoh :

<?php Foreach( $posts as $key=> $value ): ?>

…kesemua data akan dipaparkan di sini menggunakan variable $key atau $value <?php EndForeach; ?>

Apa itu $key=> $value ?

Ok, bayangkan anda ingin mengumpulkan data seperti nama pelara dalam kelas di dalam satu variable $nama, apa yang anda perlu buat ialah

(39)

<?php

$nama[] = ‘Ahmad’; $nama[] = ‘Raju’; $nama[] = ‘Ah Chong’; ?>

$nama ialah key,

Ahmad,Raju dan Ah Chong ialah value

Untuk mengeluarkan data di atas, anda perlu menggunakan Foreach Loop <?php

Foreach($nama as $key=>$value): Echo $key . ‘ = ’ . $value . ‘<br />’; Endforeach;

?>

Dan hasilnya seperti berikut nama = Ahmad

nama = Raju nama = Ah Chong

(40)

dahulu di dalam index action sebelum ianya boleh digunakan di dalam View index.ctp

Hanya perlu tambah kod di bari 18. Arahan $this->set(compact(‘posts’)); akan megambil nilai $posts dan terus boleh digunakan di dalam View.

Rujukan cuntuk compact() : http://php.net/manual/en/function.compact.php

Post Views

Views adalah tempat dimana persembahan data dilakukan, folder bernama posts perlu dibina di dalam folder /blog/views/ . Kemudian saya akan save fail bernama index.ctp di /blog/views/posts/index.ctp . Nama folder biasanya adalah plural kepada nama model. Contohnya jika model Post, nama folder ialah views. Jika nama model UserSetting, nama folder view ialah user_settings

(41)

Contoh bagaimana saya cipta folder posts di dalam folder

c:\xampp\htdocs\cake_projects\blog\views\ menggunakan MD-DOS. Anda boleh menciptanya guna Windows Explorer

Seterusnya buka fail baru di dalam Crimson Editor dan tulis kod seperti di bawah:

Save fail ini sebagai index.ctp di dalam folder /blog/views/posts/index.ctp . Fail View mesti diakhiri dengan extension .ctp ( Cake Template ) dan pastikan nama fail sama dengan nama method yang digunakan dalam Post Controller. Dalam kes ini, index(), maka nama view untuk action index() ialah index.ctp.

(42)

Untuk melihat hasilnya, sila buka alamat http://localhost/cake_projects/blog, dan papar berikut akan muncul.

Jika anda perhatikan, di bawah page tersebut, debug arahan SQL dipaparkan. Ada beberapa perkara lagi yang perlu dibetulkan dengan paparan index di atas.

– Susunan blog sepatutnya diterbalikkan dengan Posting terakhir akan dipaparkan dahulu

– Link untuk membaca kandungan blog

– Panel navigation untuk memudahkan pembaca pergi ke index semua setelah membaca blog.

(43)

CSS Untuk Navigation

Sila cipta fail bernama /blog/webroot/css/blog.css

CSS untuk DOM id navigation. Kod di atas ialah kod CSS ( Cascading Style Sheets ) yang digunakan untuk mengawal warna,saiz,kedudukan panel navigasi blog kita nanti.

Seterusnya, CakePHP perlu diberitahu untuk memanggil fail ini. Memperkenalkan LAYOUTS

Di dalam folder /blog/views/layout, ada terdapat satu fail bernama default.ctp. Fail ini berfungsi sebagai placeholder untuk keseluruhan projek blog saya ini. Jika saya melakukan perubahan di fail default.ctp, ianya akan diapply ke seluruh projek.

(44)

Tambah kod di line 38, dan save fail tersebut.

Seterusnya saya ingin menambah panel navigasi di dalam View index.

(45)

Refresh kembali action index anda, dan anda akan dapat paparan seperti di bawah

(46)

Betulkan Susunan Posting

Buka fail /blog/models/post.php dan letak kod di bawah:

Tambah kod seperti di baris ke 11 dan save fail post.php. Cuba refresh semula action index() dan kedudukan susunan akan berubah.

Title website adalah satu elemen penting dalam pembinaan blog, kerana jika pembaca ingin Bookmark page disukai, Browser akan mengambil nilai tag title. Contoh

<html> <head>

<title>Senarai Posting</title> </head>

Tag title di atas akan dibaca oleh browser dan juga search engine. Jadi adalah penting untuk saya ubahsuai layout default.ctp seperti di bawah :

(47)

Sila ubah fail /blog/views/layouts/default.ctp dan ubahsuai kod di baris 30

Ubah fail /blog/controllers/posts_controller.php. Tambah kod di baris 14. Save fail tersebut dah refresh action index anda. Cuba bookmark page tersebut dengan tekan CTRL + D di Mozilla.

Secara automatik satu popup akan terbuka dan nilai Page Title berjaya dibawa sebagai title.

(48)

Membina action view ( untuk melihat kandungan lengkap blog )

Kehendak : Di dalam action index, hanya senarai ringkasan blog sahaja yang dipaparkan. Bagaimana jika pembaca blog anda ingin membaca blog anda dengan lebih lengkap ?

Penyelesaian : Bina satu action bernama view dan hanya menerima 1 argumen sahaja, iaitu nilai $id. HTML link yang dijana di dalam index perlu membawa nilai $id supaya CakePHP dapat retrieve data berdasarkan nilai $id yang diberi. Nilai $id mesti dibawa menggunakan method http get. Contoh :

http://localhost/cake_projects/posts/view/13

Nilai 13 di atas adalah nilai $id yang dibawa menggunakan method http get. Langkah 1 : Bina method getPost() di dalam Model Post

(49)

Langkah 2: Bina action view() dalam Post Controller

Baris 24 hingga 34

Tambah function view() di bawah function index() dan sebelum penutup class. Save action view di dalam fail /blog/controllers/posts_controller.php.

(50)

Langkah 3 : Tambah View view.ctp untuk action view di dalam folder /blog/views/posts/

Save fail ini sebagai view.ctp di dalam folder /blog/views/posts/ Langkah 4 : Ubahsuai view index.ctp untuk tambah link

(51)

Baris 17 hingga 23

Tambah kod dari baris 17 hingga 23 di dalam fail /blog/views/posts/index.ctp. Langkap 5 : Uji sistem blog anda

Buka alamat http://localhost/cake_projects/blog/posts/ , paparan adalah seperti berikut

(52)

Blog boleh dibaca dengan sepenuhnya. Perhatikan juga link navigation di atas dan juga back link di bawah. Dengan design sebegini, pembaca blog saya boleh

menggunakan sistem navigasi untuk kemudahan mereka membaca blog. Apa yang berlaku jika tidak passing $id ?

Jika anda perhatikan kod untuk action view() dalam Post Controller,

Saya membuat checking untuk mengesan kehadiran nilai $id. Jika $id tidak wujud, arahan redirect() akan dilaksanakan ke action index() dan disertakan dengan mesej.

(53)

Jika saya memasukkan alamat http://localhost/cake_projects/blog/posts/view , sistem akan redirect ke index dan memberi mesej ‘Invalid ID’.

Bagaimana pula jika pembaca menghantar $id yang tidak wujud di dalam database ?. Untuk mengesan data yang tidak wujud, saya akan membuat code seperti di bawah

(54)

Data yang tidak wujud akan memberikan nilai empty kepada variable $post. Jadi saya Cuma perku periksa samaada nilai $post adalah empty, jika benar, redirect ke index dan beri mesej ‘Post not exist’ kepada pembaca. Senario ini biasanya berlaku jika search engine capture data yang lama dan pemilik blog telah padam daripada database.

Pagination

Bagaimana jika Posting anda sudah terlalu banyak ? Gunakan Pagination Helper untuk memudahkan pembaca blog membaca posting-posting lama anda. Saya akan membuat blog pagination dengan 10 posting setiap page.

*Buka alamat http://localhost/cake_projects/blog/posts/add untuk tambah data Ubahsuai index action di dalam Post Controller seperti berikut

(55)

Baris 19 hingga 22

Perhatikan saya ‘matikan’ baris 17 untuk memberi laluan kepada Pagination Helper. Baris ke 20 ialah untuk memberi nilai jumlah post yang perlu dipaparkan.

(56)

Salin kod di atas ke dalam fail View index di /blog/views/posts/index.ctp. Salin di bahagian bawah fail tersebut.

Buka alamat http://localhost/cake_projects/blog/posts, dan blog anda kini sudah mempunyai pagination di bahagian bawah.

Rujukan lanjut mengenai Pagination :

(57)

Helper Time dan Text

CakePHP mempunyai berbagai-bagai helper yang boleh kita guna untuk membantu membuat coding dengan cepat dan kemas. Contohnya, saya ingin

– mengubah tarikh ~Time Helper

– membuat autolink supaya URL dalam post ~ Text Helper – keluarkan tempoh masa blog di hantar ~ Time Helper

Buka fail Post Controller anda, /blog/controllers/posts_controller.php, dan tambah kod Helpers seperti berikut. Saya akan menggunakan 2 Helpers, Text dan Time

Baris 10

Nilai var $helpers mesti dimulai dengan huruf besar dan diletakkan di dalam

format array();. Seterusnya ubahsuai fail Index View di /blog/views/posts/index.ctp dan ubahsuai kod seperti di bawah :

Ba ris 12,13 dah 15

(58)

dan perhatikan perubahan.

Action untuk Add,Edit dan Delete

Setakat ini, saya telah membuat 2 action, iaitu Index dan juga View. Untuk Add ( Tambah ) Post, saya akan gunakan admin routing dengan beranggapan hanya admin sahaya yang boleh melakukan operasi add,edit dan juga delete. Jadi, untuk manage blog, saya akan menggunakan URL seperti berikut :

http://localhost/cake_projects/blog/admin/posts/index ~ Index http://localhost/cake_projects/blog/admin/posts/add ~ Add http://localhost/cake_projects/blog/admin/posts/edit/12 ~ Edit http://localhost/cake_projects/blog/admin/posts/delete/12 ~ Delete

Untuk membolehkan saya menggunakan admin routing, saya perlu mengubahsuai fail /blog/config/core.php dan enablekan admin routing seperti berikut :

(59)

Save fail tersebut, dan edit semua fail Post Controller di

/blog/controllers/posts_controller.php dan tambah kod berikut :

Seterusnya, bina fail View untuk action admin_index() di dalam sebagai /blog/views/posts/admin_index.ctp

Mari kita cuba admin routing. Buka alamat

http://localhost/cake_projects/blog/admin/posts/index. Paparan seperti berikut akan keluar.

Seterusnya, kita akan bina sistem index untuk menyenaraikan kesemua posting blog kita. Kembali semua ke action admin_index()

(60)

limit anda boleh letak nilai selain dari 2 contohnya 10. Elements

Element di dalam CakePHP ialah satu fail yang diguna berulangkali. Dalam kes ini, kod HTML/PHP untuk Pagination akan digunakan banyak kali di dalam sistem. Oleh itu saya akan mencipta satu fail bernama paging.ctp di dalam folder /blog/views/elements/ .

Save sebagai /blog/views/elements/paging.ctp

Untuk memanggil fail paging.ctp di dalam admin_index.ctp, saya akan buat kod seperti di bawah

<?php echo $this->element(‘paging’); ?>

CakePHP akan secara automatik mencari fail bernama paging.ctp di dalam folder tersebut. Seterusnya, ubahsuai fail admin_index.ctp seperti kod di bawah :

(61)
(62)

Sekarang, anda telah mempunyai antara muka admin index. Antara muka ini khas untuk admin mengawal Posting blog anda seperti tambah,edit dan juga padam Post. Jika anda perhatikan, link untuk Edit dan Delete, mempunyai flag admin => true. Kod ini bermaksud untuk mengarahkan CakePHP supaya menghasilkan link seperti

http://localhost/cake_projects/blog/admin/posts/edit/1 http://localhost/cake_projects/blog/admin/posts/delete/1 Manakala link untuk view pula, berbentuk seperti : http://localhost/cake_projects/blog/posts/view/1

Dengan cara ini, saya boleh membuat pemeriksaan, hanya usergroup admin sahaja yang boleh mengakses fungsi tambah,padam dan edit di dalam sistem.

(63)

Tugasan : Sila tambah navigation dengan menggunakan BreadCrumb dari Hml Helper.

Action Add

Untuk menambah Posting ke dalam sistem, saya perlukan satu action yang akan menerima data dari HTML Form dan akan melakukan proses validation sebelum data boleh dimasukkan ke dalam database dan memberi mesej error jika ada masalah. Saya akan bina skeleton untuk action dan view untuk add

(64)

Tambah kod di atas di baris akhir fail /blog/views/posts/admin_index.ctp

Seterusnya ubah Post Controller anda dan tambah kod berikut di dalam action admin_add()

Save Post Controller.

Cuba buka alamat http://localhost/cake_projects/blog/admin/posts, anda akan nampak link Add New Post di sebelah bawah kanan, klik link tersebut, dan paparan berikut akan keluar.

(65)

http://localhost/cake_projects/blog/admin/posts/add . Cuba isi data seperti di atas dan klik button Submit.

Anda akan dipaparkan nilai yang dihantar oleh action Add dengan menggunakan fungsi debug($this->data) di dalam action Add()

(66)

key adalah berdasarkan nama table field sepertimana yang terdapat di dalam database. Data yang dihantar oleh Form, disimpan di dalam satu array value bernama $this->data. Jadi, saya boleh anggap variable $this->data ialah satu array() yang sepatutnya penuh dengan data. Dan saya boleh membuat checking dengan kod if(!empty($this->data)) untuk memastikan variable $this->data dipenuhi dengan nilai yang sepatutnya.

Form Helper

Rujukan : http://book.cakephp.org/view/182/Form

CakePHP secara automatik dapat mengesan jenis Form Field yang dikeluarkan berdasarkan jenis field di dalam table. ( Convention over Configuration )

Tetapi ada ketikanya anda ingin membina Form dengan setting anda sendiri seperti Ingin bina form header dengan method = get dan action ke /users/info

(67)

Akan hasilkan kod Form Header seperti

Untuk jenis-jenis Form Field pula, anda boleh melihat di sini , http://book.cakephp.org/view/204/Form-Element-Specific-Methods

Sila cuba setiap Form Helper method yang disediakan oleh CakePHP. Contoh di bawah ialah saya ingin membina dropdown menu menggunakan data yang saya bina sendiri.

(68)

Hasilnya di dalam Mozilla,

Save data ke dalam database

Untuk save data yang dihantar dari CakePHP Form Helper, arahan berikut akan dilaksanakan jika controller berjaya detect kehadiran variable $this->data , contohnya

$this->Post->create(); // initiate ada record baru

$this->Post->save( $this->data ); // save ke dalam table posts

Post Model akan digunakan untuk melakukan operasi ini dan ianya akan di panggil di dalam Post Controller. Kod $this->Post bermaksud, menggunakan objek Post Model. Seterusnya, saya akan mengubah admin_add() action supaya data berjaya disimpan di dalam database.

(69)

Baris 65 - 70

Ubahsuai action admin_add() untuk menambah fungsi save. Jika berjaya save, bagi mesej ‘Post successfully added’ dan redirect ke action index(). Seterusnya cuba anda klik link Add New Post di index ( di dalam Mozilla ) dan tambah data dengan klik submit.

(70)

sahaja, anda sudah berjaya membuat sistem untuk menambah data ke dalam database.

Form Validation

Rujukan : http://book.cakephp.org/view/125/Data-Validation

Form Validation ialah satu mekanisme di mana saya perlu menapis dahulu input dari user sebelum data di simpan di dalam database. Untuk membuat form

validation di dalam sistem blog, saya perlu meletakkan rules di dalam fail /blog/models/post.php .

Buat masa ini saya hanya mempunyai 1 rule sahaja untuk setiap field di dalam table posts, iaitu data untuk title,summary dan content tidak boleh kosong ( empty ).

(71)

Baris 13 - 18

(72)

Skrg, cuba anda hantar Post tanpa mengisi apa-apa nilai di dalam form field. CakePHP akan memaparkan error untuk setiap field.

Edit Post

Seterusnya, saya akan membuat mekanisme untuk edit Post. Secara amnya,

pemilik blog akan buka paparan admin_index() dan akan klik link Edit di sebelah kanan setiap row untuk Post. Link Edit tersebut sepatutnya membawa nilai $id seperti di bawah

(73)

Link di atas bermaksud, saya ingin edit Post yang menggunakan $id = 12. Action admin_edit() perlu menerima nilai $id tersebut supaya boleh digunakan di dalam action untuk manipulasi data Post = 12.

Pastikan link Edit di admin_index() adalah seperti kod di bawah :

Nilai $id telah diassign semasa di dalam Foreach Loop. Setkan ‘admin’ => ‘true’ untuk memberitahu CakePHP anda berada dalam mode Admin.

Kemudian, edit Post Controller anda dan tambah action admin_edit() seperti berikut

(74)

Penerangan

Barus 79 hingga 87 adalah kod untuk kemaskinikan data di dalam table posts. Form data akan dihantar menggunakan variable $this->data dan di dalamnnya terkandung nilai id Post yang ingin dikemaskini. Arahan $this->Post->save($this->data) akan kemaskinikan data yang dihantar terus ke dalam table posts.

Baris 91 pula ialah kod yang mengeluarkan data Post berdasarkan nilai $id yang diberi. $this->Post->read(null,$id) akan mengambil nilai Post berdasarkan $id di dalam table posts, dan akan diberi kepada variable $this->data. Seterusnya Form Helper akan menggunakan niali di dalam variable $this->data untuk keluarkan data di dalam Edit Form.

Akhir sekali, cipta fail baru bernama /blog/views/posts/admin_edit.ctp dan tambah kod seperti berikut :

Kod fail admin_edit.ctp hampir sama dengan admin_add.ctp, cuba ada

(75)

adalah key untuk memberitahu untuk update rekod berdasarkan nilai ID di dalam database. Seterusnya, cuba anda edit mana-mana Post di dalam senarai index, dan anda akan dipaparkan dengan interface seperti berikut :

(76)

admin_delete(). Tambah kod untuk admin_delete() seperti kod di bawah di dalam Post Controller,

Kod baris 101, $this->Post->del($id) adalah arahan untuk memadam rekod di dalam database. Selebihnya hanya fungsi checking sahaja. Save Post Controller, dan cuba Delete Post.

(77)

Contoh kod Delete di dalam admin_index.ctp. Latihan :

1. Buat action dan controller untuk admin_view di dalam Post Controller

Ubah Default Route ke Blog index

Secara default,CakePHP akan routekan hompeage anda (

(78)
(79)

Saya ingin mengubah default page ke Controller : posts Action : index. Untuk itu saya akan mengubah fail Route, /blog/config/routes.php

(80)

menjadi default page.

Sistem Administration

Buat masa ini ,untuk akses ke sistem Admin, saya akan menggunakan alamat http://localhost/cake_projects/blog/admin/posts.

(81)

Alhamdulillah, kita berjaya tamatkan tutorial peringkat pertama. Dalam tutorial seterusnya, kita akan buat modul-modul berikut

1. Blog Authentication ( Admin perlu login dahulu sebelum boleh akses modul Admin )

2. Search Engine untuk carian Post

3. Tingkatkan sekuriti Form menggunakan Sanitize 4. Update status menggunakan Ajax

5. Sistem Komen.

6. User registration & User management 7. Sistem Attachment untuk gambar-gambar 8. Gabungkan TinyMCE HTML Editor 9. Sistem RSS ( Really Simple Syndication )

Azril Nazli Alias azril.nazli@gmail.com - CakePHP

- Ruby On Rails - LAMP

(82)

Helpers untuk SideBar

Sidebar ialah kawasan di mana saya boleh meletakkan berbagai-bagai elemen seperti :

– Menu untuk pembaca – Menu untuk admin – Senarai Posting terkini – Senarai Komen terkini

Jadi untuk itu, saya akan membuat Helpers bernama Sidebar. Untuk memastikan Helper Sidebar sentiasa dipanggil, saya akan membuat satu master controller yang di panggil AppController. Fail ini membolehkan arahan dilakukan secara global. Contohnya jika anda ingin membuat statistik pelawat, anda boleh meletakkan kod tersebut di AppController tanpa mengulangnya di setiap Controller yang ada dalam sistem anda. AppController ini telah dibina secara default oleh CakePHP dan

lokasinya terletak di /blog/app_controller.php.

Saya cuma ingin mendapatkan 10 posting terakhir sahaja. Jadi fungsi $this->Post->getLatestPost() di dalam Post Model perlu diubah supaya menerima variable $limit. Variable $limit ini yang menentukan jumlah data yang akan ditarik dari database.

Buka fail /blog/models/post.php dan ubahsuai method getLatestPost() seperti berikut :

(83)

Kali ini saya telah mengubahsuai panggilan $this->find dengan meletak argumen $options. Variable $options ialah array yang menyimpan settings supaya CakePHP boleh mencipta script SQL yang sesuai untuk memanggil hanya 10 data sahaja dari table posts dan Cuma field id,title dan created sahaja yang direturn.

Kod di atas akan menghasilkan script SQL seperti berikut :

SELECT `Post`.`id`, `Post`.`title`, `Post`.`created` FROM `posts` AS `Post` WHERE 1 = 1 ORDER BY `Post`.`id` DESC LIMIT 10

Sekarang, $this->Post->getLatestPost() telah diubahsuai dan saya ingin aplikasi blog saya sentiasa mendapatkan 10 posting terakhir di keseluruhan sistem. Untuk itu saya akan ubahsuai AppController di /blog/app_controller.php dan tambah kod berikut :

beforeRender() ialah satu ciri CakePHP yang amat penting. Saya memanggil fungsi beforeRender() selepas logik di dalam Controller di jalankan dan sebelum CakePHP memaparkan View. Di antara fasa tersebut, saya menyuruh

AppController untuk dapatkan 10 Posting terakhir dan didaftarkan ke dalam View menggunakan variable $latest_posts. Dengan cara ini, saya boleh menggunakan variable $latest_posts untuk di gunakan di dalam Helper Sidebar.

(84)

/blog/views/helpers/sidebar.php

Fungsi $sidebar->getLatestPost() akan memaparkan 10 Posting terakhir di dalam sidebar aplikasi blog kita nanti. Untuk membina Helper :

1. Nama Helper perlu dalam singular seperti TimeHelper, GenerateXmlHelper dan diikuti dengan ayat Helper dalam bentuk CamelCased

2. Lokasi untuk menyimpan Helper ialah di dalam folder /blog/views/helpers/ 3. Helper perlu dipanggil di dalam Controller barulah ia boleh digunakan di

dalam View. Contohnya var $helpers = array(‘Sidebar’, ‘Time’, ‘Ajax’) 4. Kebiasaannya, Helper adalah pembantu kita di dalam View untuk

menghasilkan kod yang kompleks.

Seterusnya, saya perlu panggil Helper Sidebar di dalam AppController. Dan disebabkan saya perlu menggunakan model Post untuk memanggil method getLatestPost(), saya perlu juga panggil model Post di dalam AppController dengan menggunakan $uses.

(85)

Sila ubah AppController anda di /blog/app_controller.php dan salin kod seperti di bawah :

Contoh lengkap AppController seperti di bawah :

Perlu diingatkan, selepas bari ke 15, jangan ada whitespace yang terhasil. Untuk untuk, anda tidak perlu tutup kod php dengan tanda ?> seperti kebiasaan untuk mengelakkan masalah whitespace.

(86)

/blog/views/layouts/default.ctp

Hanya perlu ubah kod di dalam DIV = content. Baris ke 68 adalah penggilan Helper Sidebar untuk hasilkan kod yang memaparkan 10 posting terakhir di dalam aplikasi blog. Save fail default.ctp dan buka alamat

(87)

Di sebelah kanan aplikasi kini sudah ada senarai posting terakhir. Authentication

Kini tiba masanya saya ingin membuat sistem Auth di mana hanya admin sahaja yang boleh akses untuk manage blog admin. Untuk itu, saya perlukan table bernama users dicipta di dalam database blog_development. Buka kembalik fail Blog Schema yang terletak di /blog/config/sql/blog.php dan tambah kod untuk table users :

*ralat : length untuk password sepatutnya 255 bukan 10 ( baris 25 )

(88)

Seterusnya saya hanya ingin mencipta table users sahaja. Untuk itu jalankan arahan berikut di dalam MS – DOS

cake schema run create blog users bermaksud CakeSchema akan create table bernama users di dalam skema blog.

(89)

Seterusnya anda akan ditanya 2 soalan – Drop table users ? [ y ]

– Create table users ? [ y ]

Saya secara tidak sengaja telah meletak length untuk field password = 10.

Sepatutnya ialah 255 disebabkan komponen Auth akan seara automatik hashedkan password yang dihantar dan ianya memerlukan 64 aksara . Jadi saya perlu ubah fail skema blog dan perlu update table users.

(90)

Anda boleh taip cake schema help untuk arahan-arahan lain seperti update table, cipta schema utama, cipta snapshot dan berbagai arahan lagi.

Table users sudah dicipta. Seterusnya saya perlu bina Model, Views dan Controller untuk User. Disebabkan saya cukup malas untuk taip satu-persatu kod untuk

Model,View dan Controller, saya akan gunakan cake bake CLI untuk membuat fail-fail tersebut secara automatik.

Cipta User Model : cake bake model User

(91)

User Controller akan dicipta dengan fungsi $scaffold terbina dalam. Cipta User View : cake bake view User

CakePHP akan mencipta fail skeleton untuk CRUD ( index,view,add dan edit ) di dalam /blog/views/user/*

Sila lawati http://localhost/cake_projects/blog/user ( User singular bukan plural ). Dan anda akan dapati paparan seperti di atas.

(92)

URL : http://www.littlehart.net/atthekeyboard/2007/09/11/a-hopefully-useful-tutorial-for-using-cakephps-auth-component/

Saya akan menggunakan Component Auth yang didatangkan khas bersama CakePHP untuk melindungi sistem Admin aplikasi blog. Komponen Auth secara default akan mengambil kira konfigurasi berikut :

– Table bernama ‘users’ dicipta di dalam database

– Field bernama ‘username’ dan ‘password’ di dalam table users

Edit fail AppController untuk menambah var $components = array(‘Auth’); supaya Auth Component dapat digunakan.

(93)

Ubahsuai AppController anda dan tambah kod seperti di bawah :

(94)

Tambah kod di baris 64 di dalam method beforeRender(). Untuk register $Auth di dalam View.

Save fail AppController dan sekarang tambah satu user di alamat http://localhost/cake_projects/user/add

(95)

Klik button submit. Sila tick checkbox Is Admin. Kemudian buat satu lagi user, tetapi jangan tick checkbox is_admin. Jadi anda akan mempunyai 2 user,iaitu admin dan bukan admin.

(96)

Jika Auth Component berfungsi dengan betul, nilai Password untuk User anda sepatutnya berbentuk hashed seperti di atas.

Bina action untuk login() dan logout() dalam User Controller

(97)

Baris 1 – 21 ( 4 methods, login,logout, admin_login dan admin_logout ) Saya membina action untuk normal login/logout dan juga untuk admin login/logout.

(98)

Untuk menguji sistem Auth, saya perlu ubahsuai kod AppController ( /blog/app_controller.php ) dan matikan kod $this->Auth->allow(array(‘*’));

Baris 21 di dalam /blog/app_controller.php

Kemudian saya akan allow action Post Index dan Post View. Ini bermaksud, pembaca tidak perlu login untuk akses action index() dan view() di dalam Post Controller. Tambah method beforeFilter dalam Post Controller (

(99)

Kalau anda masih ingat, di dalam AppController, saya telah menambah kod

Baris 64.

Dengan menggunakan $this->Auth->user(), saya boleh akses maklumat user yang telah login dengan mudah sekali. Jika anda debug($Auth) di dalam View

default.ctp, data berikut akan diperolehi :

(100)

Hasil debug($Auth) di dalam default.ctp. Dengan menggunakan variable $Auth di dalam view, saya boleh mengesan user yang login ialah admin atau tidak dengan menggunakan $Auth[‘User’][‘is_admin’]. Nilai 1 adalah admin dan 0 adalah sebaliknya.

(101)

Jadi saya boleh membuat menu yang ringkas untuk Admin di dalam Helper Sidebar. Edit fail /blog/views/helpers/sidebar.php dan tambah 2 method berikut :

Ralat ! : Baris 32, sila setkan ‘admin’ => FALSE

Method admin_login() untuk cipta link login ke Admin Post dan method admin() untuk senaraikan modul-modul untuk Admin.

Seterusnya, di dalam Default Layout, /blog/views/layouts/default.ctp, sila tambah kod berikut :

(102)

Sekarang, mari kita uji sistem Auth. Sila buka browser ke alamat http://localhost/cake_projects/blog

Anda akan nampak link Administration di sidebar belah kanan, klik link tersebut dan paparan login akan dipaparkan. Cuba login sebagai user yang mempunyai akses admin.

(103)

Secara automatik, CakePHP Auth akan redirect anda ke muka hadapan blog dan cuba klik menu Manage Post di sebelah kanan.

Paparan admin_index untuk Post. Kemudian cuba klik link Logout dan cuba login sebagai user yang tidak mempunyai akses admin.

(104)

Menu Administration tidak kelihatan di sebelah kanan.

Cuba anda pergi ke alamat admin secara manual, http://localhost/cake_projects/blog/admin/posts

Amaran Unauthorized Access akan diberikan. Taip

(105)

Ubahsuai User Controller menjadi Admin Scaffold

Jika anda malas untuk menaip semula kesemua Controller Action untuk CRUD dan view, anda boleh menggunakan satu ciri $scaffold untuk Admin. Sila buka User Controller dan update menjadi kod berikut

(106)

di dalam action index dan juga edit. Jadi tidak kesemua field akan dipaparkan. Kod untuk paparan Edit mempunyai field tambahan bernama change_password. Jika admin ingin menukar password user, dia boleh menggunakan field ini. Mengapa guna change_password tetapi tidak terus field password sahaja ?

Componen Auth di dalam CakePHP akan mengambil apa sahaja nilai termasuk whitespace ( blank ) dan akan convert ke format hashed password jika ia detect field bernama ‘password’ digunakan. Bayangkan admin Cuma ingin mengubah data email , tetapi bila admin submit data, CakePHP akan mengambil nilai whitespace / blank dan terus hashed kan data untuk password dan save ke dalam database. Seterusnya, user tersebut tidak dapat login kerana hashed password sudah bertukar. Untuk mengatasi masalah ini, saya menggunakan custom field yang bernama change_password. Dalam callback beforeFilter(), saya akan membuat checking samaada data change password wujud atau tidak. Jika wujud, assignkan $this->data[‘User’][‘password’] kepada nilai change_password dan secara automatik CakePHP akan mengubah password tersebut di dalam database. Kemudian update fail Sidebar Helper untuk letak link Manage User

(107)

Buka semua aplikasi blog di dalam Firefox , dan klik menu Manage User di sebelah kanan, paparan berikut akan terhasil

Dengan masa tidak sampai 5 minit, anda telah berjaya membuat Admin Modul untuk Model User . Module ini menggunakan $scaffold yang telah dicustomkan. Cuba klik Edit salah satu user,

(108)

Callback AfterFind

Bagaimana jika saya tidak suka format date Created dalam Scaffold ? Dan saya ingin dalam format TimeAgoInWords() ? Untuk mengubah data yang telah ditarik dari dalam database, saya akan menggunakan callback AfterFind() di dalam User Model. Buka fail /blog/models/user.php dan tambah kod berikut :

$results adalah array() data yang direturn dari database.

Refresh semua paparan Manage User dan format Created telah berubah. AfterFind sangat berguna jika anda ingin mengubah data yang dikeluarkan dari database seperti untuk kegunaan drop down menu.

(109)

Model Relation

url : http://book.cakephp.org/view/79/Relationship-Types

Dalam CakePHP, table join dipersembahkan dalam bentuk Model Relation seperti – User hasMany Post

– User hasMany Comment – Post belongsTo User – Post hasMany Comment – Comment belongsTo Post – Comment belongsTo User

– Tag hasAndBelongsToMany Post – Post hasAndBelongsToMany Tag

Konsep blog yang saya bina ialah setiap User akan mempunyai Post mereka sendiri. Jadi relationship yang ingin saya bina ialah berupa :

– User hasMany Post – Post belongsTo User

Disebabkan setiap Post dimiliki oleh seorang User, di dalam table posts saya perlu menambah kolum bernama user_id ( integer ). Untuk itu saya perlu ubahsuai fail /blog/config/sql/schema/blog.php dan menambah field user_id

(110)

Jalankan arahan Cake Schema : cake schema run update blog posts Ubah Post Controller

Method admin_add() dan admin_edit() perlu diubahsuai untuk membolehkan nilai user_id di dalam table posts diberi nilai $id user yang sedang login. Buka fail /blog/controllers/posts_controller.php dan ubahsuai kod :

(111)

Tambah baris 88

Variable $this->data[‘Post’][‘user_id’] akan diberi nilai $id user yang sedang login dengan menggunakan panggilan $this->Auth->user(‘id’);

Ubahsuai Model Post dan User untuk tambah Model Relation User Model : /blog/models/user.php

(112)

Post Model : /blog/models/post.php

Hanya tambah baris 11.

Seterusnya, edit Post terkini atau tambah Post baru menggunakan fungsi admin Manage Post. Pastikan nilai user_id diisi secara automatik dengan melihat data di dalam phpMyAdmin

(113)

Ubahsuai fail View Index di /blog/views/posts/index.ctp untuk tambah nama User di dalam Posting

Baris 13. Cuba debug() nilai $value di baris 9. Anda akan lihat CakePHP akan return data User yang memiliki Post tersebut.

(114)

Ralat

Ralat dalam format kolum Post.created,Post.updated,User.created dan

User.updated. Sepatutnya, jenis kolum ialah datetime dan bukannya date. Untuk membetulkan format kolum tersebut, saya akan mengubah fail Blog Schema dan akan laksanakan arahan cake schema

(115)
(116)

Laksanakan arahan : cake schema run update blog posts. Cuba tambah Post lihat kembali format data di browser.

Sekarang format Date untuk Created telah berjaya dipaparkan dengan betul.

Latihan

1. Gunakan field Updated untuk paparkan bilakah Post tersebut kali terakhir dikemaskini.

2. Paparkan nama User di dalam admin_index Manage Post

(117)

Search Engine untuk Post

(118)

penerangan.

Bina view untuk function search().

Header search.ctp untuk menu dan CSS untuk highlight keyword.

(119)

Search Result. Untuk paparkan hasil carian

Salin kesemua kod di atas dan save sebagai /blog/views/posts/search.ctp Seterusnya, mari kita cuba sistem carian, layari

http://localhost/cake_projects/blog/posts/search dan mulakan carian berkaitan ‘php’ dan tekan Search.

(120)

Screenshot di atas adalah bila saya cuba mencari Post dari pada User bernama ‘bazet’

Melihat SQL yang dijana oleh CakePHP, ia berjaya fetch 5 row data yang berkaitan dengan search term di atas.

(121)

Seterusnya saya ingin membuat search field di dalam Helper Sidebar. Oleh itu saya akan menambah Helper Form di dalam fail /blog/views/helpers/sidebar.php seperti berikut :

Kemudian, saya akan bina method bernama search() supaya ianya boleh digunakan di dalam Default Layout untuk generate Search Form :

Save fail Sidebar Helper, dan buka Default Layout, /blog/views/layouts/default.ctp dan tambah kod berikut;

(122)

Refresh kembali aplikasi Blog anda dan sistem carian telah terpapar di sebelah atas kanan sidebar. Cuba buat carian dan tekan [ENTER]

(123)

Hasil carian anda telah berjaya dipaparkan. Penerangan untuk Search Engine.

Ianya nampak kompleks kerana kriteria saya ialah mencari keyword match di setiap field yang terlibat di dalam table Posts dan Users.

Saya gunakan array $options untuk membina dahulu kriteria carian. – Fields : untuk tentukan field yang direturn ke View

– Limit : limit data yang dikeluarkan

(124)

oleh Search Form sesudah user menekan button Search.

Action Search adalah fungsi untuk Public User dan tidak perlu Login ke dalam sistem untuk menggunakannya. Jadi sila allow action Search dalam Post Controller beforeFilter.

Menggunakan $postConditions

url : http://code.hexflux.com/2009/06/easier-searchfiltering-with-controllerpostconditions/

Seterusnya saya ingin membuat Admin Search. Fungsinya untuk membuat simple Search Filter untuk Admin Post. Sayacuma ingin membuat Post Filter dengan menggunakan 2 fields sahaja iaitu Post.title dan Post.summary. Buka fail Post Controller, dah tambah kod berikut

(125)

Untuk admin_search.ctp di dalam folder /blog/views/posts/ pula, sila tulis kod berikut,

(126)

Kod di atas untuk menjana hasil carian.

Buka alamat http://localhost/cake_projects/blog/admin/posts/search. Mari kita filter Post dengan keyword Post.title = ‘cakephp’ dan Post.summary = ‘skeleton’ ( gunakan keyword anda )

(127)

Hasil carian terpapar di atas.

Kod SQL untuk Filter dijana oleh CakePHP

Kod $this->postConditions memudahkan anda menjana kod conditions untuk di gunakan dengan $this->Model->find(‘all’, $options). Untuk bacaan lanjut dan contoh, sila ke http://code.hexflux.com/2009/06/easier-searchfiltering-with-controllerpostconditions/

Latihan :

(128)

Ajax, saya boleh menggunakan Helper tersebut. Cake 1.2.5 menggunakan Ajax Prototype dan ScriptAculoUs. Untuk menggunakan Ajax, sila download

prototype.js dari website http://prototypejs.org/download dahulu dan save sebagai /blog/webroot/js/prototype.js.

Kemudian ubah AppController untuk memasukkan Helper Javascript dan Ajax.

Baris 4 : /blog/app_controller.php

Seterusnya, include prototype.js dalam Default Layout di /blog/views/layouts/default.ctp

Baris 35

Untuk sistem komen, Model Relation adalah seperti berikut : – Post hasMany Comment

– Comment belongsTo Post

(129)

Seterusnya, buka fail Skema Blog di /blog/config/sql/blog.php dan tambah skema untuk table comments :

(130)

Bina Model untuk Comment

(131)

Hasil Comment Model yang dicipta oleh Cake Bake CLI Bina Controller untuk Comment

(132)
(133)

Sila buka alamat http://localhost/cake_projects/comments

CakePHP secara automatik membuat dropdown Post. Sekarang saya sudah

(134)

ditujukan.

Untuk menghantar komen, pembaca perlu klik Post View dahulu dan di bawah setiap Post akan ada ruangan untuk menambah komen. Saya akan menggunakan teknologi Ajax untuk user menghantar komen.

Baris 11 ( Pastikan Post hasMany Comment )

Controller Comment Add akan menguruskan tugas memasukkan data komen ke dalam table comments beserta post_id. Validation yang asas akan digunakan dalam Comment Model.

Validation dalam Comment Model, /blog/models/comment.ctp

(135)

Seterusnya, saya akan tambah $components bernama ‘RequestHandler’ di dalam Comment Controller. Dan bina action untuk beforeFilter() dan add().

Gambar

Gambar di atas adalah contoh tipikal satu posting blog.
Table users sudah dicipta. Seterusnya saya perlu bina Model, Views dan Controller  untuk User

Referensi

Dokumen terkait

Kabar Baik telah diberitakan kepada mereka supaya mereka dapat hidup dalam roh, sama se- perti Allah hidup.. Pakailah Pemberian Allah dengan Bijaksana 7 Kesudahan dari

Setelah dilakukan pencatatan tinggi badan dan berat badan, dilakukanlah pemeriksaan fisik secara umum yang kemudian dilanjutkan pemeriksaan fisik khusus untuk

Untuk melakukan pengamatan pada penelitian ini agar terarah dan terstruktur, maka peneliti menyusun lembar observasi dengan beberapa dimensi yaitu melakukan pengamatan

Pada kegiatan pengabdian masyarakat ini, metode penerapan iptek yang digunakan adalah dengan memberikan intervensi keperawatan berupa edukasi tentang kesehatan

Skema sistem udara bertekanan yang digunakan di plant yaitu udara dari kompresor dialirkan ke tengki udara lalu setelah itu udara dikeringkan di air dryer lalu udara

Dalam konteks ini organisasi harus memiliki pimpinan yang efektif dalam menjalankan manajemen untuk mengelola perubahan yang ada dalam berkelanjutan, tantangan bagi seorang

Letak persamaan pemikiran antara Muhammad bin Abdul Wahhab dan Muhammad Ali Pasha, adalah sama-sama menyumbangkan gagasan pemikiran mereka terhadap perkembangan pembaharuan dalam dunia

Target Manager merupakan aplikasi web dari Vuforia Qualcomm yang menyediakan fasilitas untuk mengubah gambar atau foto menjadi image target atau marker yang