Membangun CMS dengan PHP [Bag.2]

Di artikel sebelumnya, kita sudah membahas tentang sistem module dan plugin yang bekerja di CMS yang akan kita bangun. Sekarang, kita masih akan membahas tentang sistem module dan plugin serta beberapa function yang akan dibuat.
Kali ini, kita akan menggunakan PHP5rc2 dan database MySQL

Classes
Untuk memudahkan pekerjaan kita, ada baiknya kita siapkan beberapa class yang kira-kira akan banyak digunakan nantinya.
1. Class untuk SQL
“your_site_dir/inc/sql.inc.php”

< ?PHP class sql{ public $qcount; //menghitung banyaknya query yang kita buat function sql(){ $this->qcount=0; //diberi nilai 0 karena kita belum memiliki satu query pun $db=@mysql_connect($host,$user,$pass,$dbname); //membuat string yang siap menerima parameter yang dibutuhkan untuk koneksi ke database

if($db){ // memeriksa koneksi yang dibuat
return $db; //koneksi valid
}else{
die(“Gagal:
“.mysql_error() ); //Koneksi tidak valid, dan tampilkan pesan kesalahan
}
}

function pilih_db($dbname){
return mysql_select_db($dbname); //memilih database yang akan digunakan
}

function perintah($query){
$this->qcount++; //menambah jumlah query pada $qcount tiap kali function perintah dipanggil
return mysql_query($query); //mengeksekusi query ke database
}

function _fetch_row($id){
return mysql_fetch_row($id); //mengambil 1 baris data, hasil dari pemanggilan function perintah
}

function _fetch_array($id){
return mysql_fetch_array($id); //function hampir sama dengan _fetch_row. perbedaannya hanya terletak pada data yang ditampilkan
}

function _insert_id(){
return mysql_insert_id(); //mengembalikan nilai ID yang dibuat untuk kolom AUTO_INCREMENT dari perintah INSERT
}

function _affected_rows($id){
return mysql_affected_rows($id); //memperlihatkan banyak baris yang berubah akibat perintah INSERT, UPDATE atau DELETE yang dilakukan.
}

function _num_rows($id){
return mysql_num_rows($id); //menghitung jumlah baris, hasil dari perintah SELECT
}

function _fetch_object($id){
return mysql_fetch_object($id); //hampir sama seperti _fetch_array
}

function _mysql_error(){
return mysql_error();
}

}
?>

Simpan class diatas pada “direktori_website_anda/inc/” dengan nama “sql.inc.php”.

2. Class konfigurasi

< ?PHP class config { public $hostname; public $user; public $pass; public $namadb; function config(){ $this->hostname=”localhost”;
$this->user=”root”; //username yang digunakan pada host
$this->pass=””;
$this->namadb=”CMS”;
}
}

?>

Kemudian simpan di “direktori_website_anda/inc/” dengan nama “config.inc.php”

3. Site Class

Sekarang kita akan membuat class yang akan mendapatkan semua informasi tentang website yang akan dibangun. Dari koding dibawah kita akan melihat adanya function parse_url() yang berguna untuk medefinisikan URL dari website kemudian akan memecahnya ke dalam array. Berikut daftar elemen-elemen yang dapat ditanganinya:
* scheme – e.g. http
* host
* port
* user
* pass
* path
* query – setelah tanda tanya (?)
* fragment – setelah tanda pagar (#)

Dibawah ini adalah koding dari class site : simpan di “direktori_website_anda/inc/” dengan nama “site.inc.php”:

< ?PHP class site{ public $site; // berguna untuk mengatur informasi situs yang akan digunakan pada class function site(){ global $sql; //memanggil class $sql sebagai variabel global $purl=parse_url('http://'.$_SERVER['HTTP_HOST']); //berfungsi untuk mengatur elemen URL $purl=$purl['host']; //mengubah nilai $purl menjadi “host” $host=explode(".",$purl); //$purl dipecah menjadi array dan dibatasi dengan titik if($host[0]=='www'){ //cek nilai dari hostname $this->site[‘host’]=$host[1]; //jika elemen pertama hostname adalah www, maka $site[‘host’] akan di set menjadi elemen kedua dari hostname
}else{
$this->site[‘host’]=$host[0]; //jika bukan www, maka variabel $site[‘host’] akan di set menjadi elemen pertama dari hostname
}
$site_info=$sql->_fetch_row($sql->_query(“SELECT sites.site_ID,sites.site_nameFROMsitesWHERE(sites.site_host = ‘{$this->site[‘host’]}’) LIMIT 1″)); //memilih informasi tentang website dari database
$this->site[‘ID’] = $site_info[0]; //ID website dari $site variable
$this->site[‘name’] = $site_info[1]; //set nama website dari $site variable
$this->page(); // memanggil function page()
}

function page(){
if(isset($_REQUEST[‘page’])){
$this->site[‘page’]=$_REQUEST[‘page’];
}else{
$this->site[‘page’]=”main”;
}
}
}
?>

Class diatas akan menghasilkan array objek seperti dibawah ini:

$site->site[‘host’] – akan “menghilangkan” www dan .com/.net/.org pada URL.cth : www.rumahweb.com akan menjadi rumahweb

$site->site[‘ID’] – ID website yang terdapat pada database

$site->site[‘name’] – Nama website

$site->site[‘page’] – Halaman yang di request (www.url.com?page=thispage)

4. Class plugin

< ?PHP class plugins{ public $pcount; //akan menyatakan banyak plugin yang akan di load public $plugin_list; //memberikan informasi daftar plugin dalam array public $plugin_error; //melihat kesalahan2 apa saja yang dibuat sewaktu me-load plugin public $lcount; //jumlah plugin pada daftar plugin function plugins($site_id=""){ global $sql,$site; //memanggil $sql dan $site sebagai variabel global $this->pcount=0; //0 menyatakan bahwa belum ada plugin yang di load
$this->lcount=0; //0 menyatakan belum ada satupun plugin pada daftar plugin
if($site_id==””){ //melihat apakah admin menolak id website pada daftar plugin untuk beberapa website lain
$site_id = $site->site[‘ID’]; //jika id website diperbolehkan dilihat dari site id
}
$plugins_list=$sql->_query(“SELECT
plugins.plugin_ID,
plugins.plugin_name,
plugins.plugin_dir,
plugins.plugin_file
FROM
plugin_status,
plugins
WHERE
plugins.plugin_ID = plugin_status.plugin_ID AND
plugin_status.site_ID = ‘$site_id’ AND
plugin_status.plugin_status = ‘initialized’
ORDER BY
plugins.plugin_priority DESC”);
while($plugin=$sql->_fetch_object($plugins_list)){
$this->lcount++; // menambah nilai lcount pada setiap plugin yang di tambahkan
$this->plugin_list[‘plug_ID’][]=$plugin->plugin_ID; //menambahkan ID plugin pada daftar
$this->plugin_list[‘plug_name’][]=$plugin->plugin_name; //menambah nama plugin pada daftar
$this->plugin_list[‘plug_dir’][]=$plugin->plugin_dir; //menambah direktori plugin pada daftar
$this->plugin_list[‘plug_file’][]=$plugin->plugin_file; //menambah file plugin pada daftar
}
if($this->pcount==0){ //melihat apakah ada plugin yang telah di load
$this->load(); //jika tidak ada, maka function load() akan dipanggil untuk me-load plugin
}
}

function load(){ //me-load plugin dari daftar plugin
if(is_array($this->plugin_list)){ //memastikan bahwa daftar plugin tersedia dalam array, untuk menghindari kesalahan
for($i=0;$i< $this->lcount;$i++){
if(file_exists(“{$this->plugin_list[‘plug_dir’][$i]}/{$this->plugin_list[‘plug_file’][$i]}/main.plug.php”)){ //memastikan file plugin benar-benar ada
@include(“{$this->plugin_list[‘plug_dir’][$i]}/{$this->plugin_list[‘plug_file’][$i]}/main.plug.php”);
$this->pcount++; //menambah nilai pcount untuk setiap plugin yang telah di-load
}else{
$this->plugin_error[]=”The plug-in file: /{$this->plugin_list[‘plug_dir’][$i]}/{$this->plugin_list[‘plug_file’][$i]}/main.plug.php Does not exist”; //jika plugin tidak dapat di load, maka pesan kesalahan akan ditambahkan pada daftar error
}
}
}
}
}
?>

Simpan ke dalam “direktori_website_anda/inc” dengan nama “plugins.inc.php”.

5. Class modules

< ?PHP class modules{ public $lcount; //akan menyatakan banyak module yang akan di-load ke dalam daftar module public $mcount; //akan menyatakan banyak module yang akan di load ke website public $module_list; //akan memberikan informasi ttg module dalam array public $module_error; //akan melihat kesalahan ketika module di load public $module_load; //akan memberikan informasi nama2 module yang telah diload function modules($site_id=""){ global $sql, $site, $plugins; //memanggil class $sql, $site dan $plugin sebagai variabel global $this->lcount=0;
$this->mcount=0;
if($site_id==””){
$site_id = $site->site[‘ID’];
}
$modules_list=$sql->_query(“SELECT
DISTINCT
modules.mod_ID,
modules.mod_name,
modules.mod_dir,
modules.mod_file,
modules.plugin_ID
FROM
module_status,
plugin_status,
modules
WHERE
modules.mod_ID = module_status.mod_ID AND
modules.plugin_ID = plugin_status.plugin_ID AND
module_status.mod_status = ‘initialized’ AND
plugin_status.plugin_status = ‘initialized’ AND
module_status.site_ID = ‘$site_id'”);
while($module=$sql->_fetch_object($modules_list)){
$this->module_list[‘mod_ID’][]=$module->mod_ID; //memambah ID module ke daftar plugin
$this->module_list[‘mod_name’][]=$module->mod_name; //menambah nama module ke dalam daftar plugin
$this->module_list[‘mod_dir’][]=$module->mod_dir; //menambah direktori module ke dalam daftar plugin
$this->module_list[‘mod_file’][]=$module->mod_file; //menambah nama file dari module ke dalam daftar plugin
$plug_key=array_keys($plugins->plugin_list[‘plug_ID’],$module->plugin_ID); //memilih plugin ID dari daftar plugin dengan menggunakan function array_keys() dan module “plugin_id” sebagai parameter pencarian
$this->module_list[‘plug_dir’][]=$plugins->plugin_list[‘plug_dir’][$plug_key[0]];
$this->module_list[‘plug_file’][]=$plugins->plugin_list[‘plug_file’][$plug_key[0]];
$this->lcount++;
}
if($this->mcount==0){
$this->load();
}
}

function load(){
if(is_array($this->module_list)){
for($i=0;$i< $this->mcount;$i++){
if(file_exists(“/{$this->module_list[‘plug_dir’][$i]}/{$this->module_list[‘plug_file’][$i]}/{$this->module_list[‘mod_dir’][$i]}/{$this->module_list[‘mod_file’][$i]}.mod.php”)){
include(“/{$this->module_list[‘plug_dir’][$i]}/{$this->module_list[‘plug_file’][$i]}/{$this->module_list[‘mod_dir’][$i]}/{$this->module_list[‘mod_file’][$i]}.mod.php”);
$this->module_load[]=$this->module_list[‘mod_name’][$i]; //add the modules name to list of loaded modules
$this->mcount++;
}else{
$this->module_error[]=”The module file: /{$this->module_list[‘plug_dir’][$i]}/{$this->module_list[‘plug_file’][$i]}/{$this->module_list[‘mod_dir’][$i]}/{$this->module_list[‘mod_file’][$i]}.mod.php Does not exist”;
}
}
}
}

}
?>

Simpan ke “direktori_website_anda/inc” dengan nama “modules.inc.php”. Bentuk dari class module tidak terlalu berbeda dengan class plugin.
Coba perhatikan baris dibawah ini:

$plug_key=array_keys($plugins->plugin_list[‘plug_ID’],$module->plugin_ID);

Baris diatas memperlihatkan kelebihan dari function array_keys(). Pencarian module dapat dilakukan dari daftar plugin kemudian melihat module apa saja yang didukung oleh plugin tersebut

6. Class core

< ?PHP @include('inc/config.inc.php'); $config = new config(); @include('inc/sql.inc.php'); $sql = new sql($config->dbhost,$config->dbuser,$config->dbpass);
$sql->_select_db($config->dbname);

@include(‘inc/site.inc.php’);
$site = new site();

@include(‘inc/plugins.inc.php’);
$plugins = new plugins(“1”);

@include(‘inc/modules.inc.php’);
$modules = new modules(“1”);

?>
Merupakan class terakhir yang kita butuhkan. Berfungsi untuk menyatukan semua class yang ada pada CMS yang kita bangun.
Simpan pada “direktori_website_anda/inc” dengan nama “core.inc.php”

Selanjutnya kita akan membuat halaman index.php.

< ?PHP function getmicrotime() { $temparray=split(" ",microtime()); $returntime=$temparray[0]+$temparray[1]; return $returntime; } $stime=getmicrotime(); @include('inc/core.inc.php'); $etime=getmicrotime(); $ftime=round($etime-$stime,6); ?>

Simpan di “direktori_website_anda/” dengan nama “index.php”

Selesai deh dibagian kedua. Pada bagian ketiga, kita akan membahas tentang authentikasi dan block system.

Sampai jumpa pada bagian ke 3!!

Be Sociable, Share!

Leave a Reply

Your email address will not be published. Required fields are marked *