-->

Membangun CMS dengan PHP

Membangun CMS dengan PHP [Bag. 1]




  • Sumo
Content Management System (CMS) merupakan sekumpulan script dan sebuah database yang dapat dijalankan pada banyak website yang sama sekali berbeda walaupun berjalan secara bersamaan. Atau dengan kata lain, menggunakan kode yang sama, tapi terpisah antara satu dengan yang lain. CMS sangat memudahkan seseorang untuk mengatur situsnya. Ada banyak CMS yang dikembangkan oleh para developer, baik yang berlisensi GPL ataupun yang bersifat komersial. Detail mengenai beberapa CMS yang berlisensi GPL, dapat dilihat http://www.blogasal.cf/
Kali ini kita akan mencoba membangun sebuah CMS, dengan menggunakan bahasa pemrograman PHP dan database MySQL.
Artikel ini akan dibagi kedalam 5 bagian, dan di bagian pertama kita akan membahas dasar dari sebuah CMS secara umum, dan persiapan-persiapan apa saja yang akan dibutuhkan.
Permulaan
Langkah pertama yang harus dilakukan adalah menulis. Coding? Oh, tentu saja bukan. Ingat, dalam projet apapun, perencanaan adalah sebuah hal yang mutlak dilakukan. Makanya sekarang kita tidak akan memulai dengan coding, tapi kita akan mulai dengan selembar kertas dan pensil untuk menggambarkan diagram yang kira2 akan menjadi dasar untuk coding kita nantinya.
Kira2 yang akan dibutuhkan adalah sbb:
  • Database
  • Halaman index
  • Plugin
  • Module
  • Blok Content          


Hehe… bagus bukan gambar diatas? Itu merupakan gambaran dari sistem yang akan kita buat. Hmm, kalau dijelaskan, maka kurang lebih akan seperti ini: Halaman index akan melakukan koneksi ke database, komudian akan memilih plugin yang digunakan, lalu plugin akan memilih modul yang digunakan pada tiap2 plugin, lalu modul akan memilih blok content yang akan digunakan (dengan beberapa syarat, antara lain: tingkat autentikasi). Terakhir, semuanya akan dikembalikan ke halaman index yang akan membentuk sebuah website.
Plugin memegang peranan penting pada sebuah CMS. Begitu juga dengan yang akan kita buat, jika sebuah plugin tidak digunakan, maka mudol yang mengisi plugin tersebut juga tidak akan digunakan. Dan pada akhirnya, blok content yang mengisi modul juga tidak akan di-load.
Authentikasi
Authentikasi sangat menentukan boleh tidaknya seorang user memasuki halaman tertentu. Logikanya, seorang user biasa tentu tidak akan dapat (dan tidak diperkenankan) memasuki admin area dari sebuah situs, bukan? Yang berhak, tentu saja sang administrator dari situs tersebut.
Lalu bagaimana cara menentukan apakah user tersebut administrator atau bukan?
Authentikasi yang kita buat, akan menggunakan sebuah plugin yang akan mencocokkan username dan password -dari user yang melakukan login- dengan yang ada di database. Dan jika cocok, maka plugin akan memilih no ID, dan Group ID dimana user tersebut terdaftar.
Data yang didapat dari plugin tsb kemudian akan disimpan kedalam sebuah multi-dimensional array (cari pengertian di net) yang siap digunakan dibagian mana saja dari website
Setelah semua proses login selesai, username akan di simpan kedalam sebuah cookie bersamaan password yang telah dienkripsi dengan menggunakan MD5
Dan bagaimana jika username dan password yang dimasukkan salah?
Plugin akan tetap membuat array yang berisi informasi user dan dianggap sebagai bad login. Pada akhirnya, user akan tetap dianggap sebagai pengunjung biasa, dan tidak ada cookies yang akan dihasilkan dari proses ini.
Kenapa menggunakan cookie?
Cookie akan diload pada setiap halaman, dan masih ingatkan isi dari cookie kita tadi?Artinya, user tidak perlu melakukan proses login dua kali (atau lebih), kecuali jika user tersebut logout yang berarti akan menghapus informasi username dan passwordnya dari dalam cookie.
Lalu multi-dimensional array yang disimpan akan digunakan untuk apa?
Informasi yang terdapat pada array tersebut akan digunakan untuk memilih blok content yang akan digunakan. Blok content akan dipilih berdasarkan plugin, modul, Id user dan Group dimana user tersebut terdaftar.
Contoh nih:
Seorang admin, tentu akan memiliki blok content yang lebih banyak dari pada user yang terdaftar sebagai member biasa. Dalam hal ini, pemilihan blok dilihat dari group dimana user tersebut terdaftar, admin dan member biasa. Sehingga blok content yang di-load juga akan berbeda.
Template
Template akan mengatur tampilan dari blok content yang telah di-load. Apakah polling akan diletakkan disebelah kiri atau disebelah kanan?atau shoutbox ditaruh dibagian mana?Nah kurang lebih seperti itu masalah yang akan dihadapi jika tidak menggunakan template system untuk CMS yang akan kita bangun.
Template dibuat dengan menggunakan XML yang tujuannya adalah untuk mempercepat waktu parsing. Langkah awal untuk pembuatan template adalah menentukan bagaimana kira2 tampilan website yang diinginkan.Menggunakan 2 kolom atau 3 kolom?
Blok yang akan digunakan kurang lebih dibuat seperti ini:
$blok[1] : semua blok yang terdapat pada kolom 1
$blok[2] : semua blok yang terdapat pada kolom 2
$blok[3] : semua blok yang terdapat pada kolom 3
dst.
Penggunaan array sangat menentukan di kolom berapa sebuah blok akan dimunculkan. Dan jika pada satu kolom terdapat lebih dari stu blok, maka kemungkinan array yang dibuat adalah sbb:
$blok[1][1] : blok pertama pada kolom pertama
$blok[2][3] : blok ketiga pada kolom kedua
$blok[3][1] : blok pertama pada kolom ketiga
Dan bentuk jadinya akan seperti ini,
Admin area
Admin area pada dasarnya akan memudahkan administrator untuk melakukan semua hal yang berkaitan dengan website. Mulai dari tampilan (cth: memilih template), mengatur user, hingga menentukan blok2 apa saja yang akan digunakan.

Membangun CMS dengan PHP [Bag.2]




  • Sumo
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.

Membangun CMS dengan PHP [Bag.3]




  • Sum
Penamaan Direktori
Penamaan pada file dan folder merupakan sebuah hal yang sangat penting dalam CMS yang kita bangun. Jika sebuah folder tidak diberi nama dengan benar, maka file-file yang terdapat di dalam folder tersebut tidak akan dapat di-load.
Direktori
Untuk mudahnya:
Direktori yang ditulis dengan warna hitam, adalah direktori yang tidak boleh diganti namanya. Biarkan saja seperti yang terdapat pada gambar.
Direktori yang ditulis dengan warna merah adalah direktori yang penamaannya tergantung dari isi didalam direktori tersebut.
Sedangkan untuk yang berwarna biru, adalah direktori optional. Biasanya digunakan untuk gambar(images), CSS, Javascript. Penamaannya terserah saja, asal template dari CMS dapat menemukan direktori ini.
• Direktori “ROOT_DIR” dapat diberi nama apa saja, asalkan server dapat mengetahui dimana letak file dari CMS yang kita buat. Penamaan ini juga tergantung dari konfigurasi server yang ada.
• Direktori “inc” tidak boleh diganti. Di dalam direktori ini terdapat file-file penting dari CMS.
• Direktori “plug-ins” juga tidak boleh diganti. Di dalam direktori ini akan diletakkan plug-in2 untuk CMS.
• Direktori “plug-in_name” harus diganti namanya berdasarkan nama plug-in yang terdapat didalamnya. Bingung?
Misal saja : kita membuat plugin untuk gallery, maka untuk direktori”plug-in_name” diganti menjadi “gallery”. Dan didalam “gallery” tadilah kita letakkan file-file diperlukan untuk plugin gallery tsb. CMS akan mengetahui nama plug-in yang dibuat berdasarkan nama direktori dimana lugin tersebut diletakkan.
• Direktori “blocks” tidak boleh diganti namanya. Di dalam direktori ini terdapat blok yang digunakan oleh plugin. Setiap plugin memiliki sebuah direktori “block”.
• Direktori “modules” juga tidak boleh diganti. Terdapat module2 yang akan digunakan pada plugin, dan tentu saja setiap direktori “plug-in’ memiliki direktori “modules” didalamnya.
• Didalam direktori “templates” terdapat file yang akan digunakan untuk tampilan dari CMS. Nama direktori ini tidak boleh diganti
• Direktori ”site_name” diubah namanya berdasarkan host. Misalkan host dari situs ini ada di subdomain.url.com, maka “site_name” akan diganti menjadi “subdomain”, atau jika di host di www.url.com, maka nama direktorinya diubah menjadi “url”. Satu direktori digunakan untuk satu website
• Direktori “template_name” harus diganti namanya berdasarkan nama template yang digunakan. Contoh: jika template yang dibuat diberi nama “apple”, maka direktori “template_name” harus diganti namanya menjadi “apple”.
• Nama direktori “images” dapat diganti apapun. Direktori ini berisi gambar (image), CSS, Javascript atau hal lain yang akan digunakan oleh template.
Contoh dari penamaan direktori, dapat dilihat dibawah ini:
Database
Sebagai permulaan untuk database, ada baiknya kita me-review table yang akan dibuat, dan apa saja kegunaannya.
Block_location: Tabel ini berisi data yang akan mengatur blok. Dimana dan kapan sebuah blok akan di-load.
Blocks: Table ini berisi data mengenai blok. Title, filename, plugin, module, level authentikasi, dan verifikasi di situs mana blok akan di-load
Group_users: Berisi data mengenai di group mana sorang user terdaftar.
Groups: Berisi data tentang nama group
Module_status: tabel ini berisi data yang mengatur module apa yang akan di gunakan, dan digunakan pada site yang mana.
Modules: Berisi keterangan sebuah modul yang berupa nama, file, direktori, pembuat, versi, type, dan plugin mana yang membutuhkannya.
Plugin_status: tabel ini berisi data yang mengatur plugin apa yang akan di gunakan, dan digunakan pada site yang mana.
Plugins: Berisi keterangan sebuah modul yang berupa nama, file, direktori, pembuat, versi, type, dan loading priority
Sites: Berisi data tentang nama site dan host
Template_users: Berisi data tentang template yang sedang digunakan oleh user, dan siapa nama user yang menggunakannya
Templates: This table contains all the data that defines each template’s name, site, file, and status.
Users: Berisi data tentang user yang berupa username, password, dan di site mana user tersebut terdaftar
Dibawah ini adalah hasil dari MySQLdump-nya.

# Table: ‘block_location’
#
CREATE TABLE block_location (
bl_ID int(11) NOT NULL auto_increment,
block_ID int(11) default ‘0’,
block_row int(11) default ‘0’,
block_col int(11) default ‘0’,
block_page varchar(255) default ‘all’,
site_ID int(11) default ‘1’,
user_ID int(11) default ‘0’,
PRIMARY KEY (bl_ID),
UNIQUE KEY bl_ID (bl_ID),
KEY bl_ID_2 (bl_ID)
) TYPE=MyISAM;
# Table: ‘blocks’
#
CREATE TABLE blocks (
block_ID int(11) NOT NULL auto_increment,
block_title varchar(255) default ‘Block Title’,
block_file varchar(255) default ‘0’,
plugin_ID int(11) default ‘0’,
group_ID int(11) default ‘0’,
site_ID int(11) default NULL,
mod_ID int(11) default NULL,
PRIMARY KEY (block_ID),
UNIQUE KEY block_ID (block_ID),
KEY block_ID_2 (block_ID)
) TYPE=MyISAM;
# Table: ‘group_users’
#
CREATE TABLE group_users (
gu_ID int(11) NOT NULL auto_increment,
group_ID int(11) default ‘0’,
user_ID int(11) default ‘0’,
site_ID int(11) default ‘0’,
PRIMARY KEY (gu_ID),
UNIQUE KEY gu_ID (gu_ID),
KEY gu_ID_2 (gu_ID)
) TYPE=MyISAM;
# Table: ‘groups’
#
CREATE TABLE groups (
group_ID int(11) NOT NULL auto_increment,
group_name varchar(255) default NULL,
PRIMARY KEY (group_ID),
UNIQUE KEY group_ID (group_ID),
KEY group_ID_2 (group_ID)
) TYPE=MyISAM;
# Table: ‘module_status’
#
CREATE TABLE module_status (
ms_ID int(11) NOT NULL auto_increment,
mod_ID int(11) default ‘0’,
mod_status varchar(255) default ‘not_initialized’,
site_ID int(11) default ‘0’,
PRIMARY KEY (ms_ID),
UNIQUE KEY ms_ID (ms_ID),
KEY ms_ID_2 (ms_ID)
) TYPE=MyISAM;
# Table: ‘modules’
#
CREATE TABLE modules (
mod_ID int(11) NOT NULL auto_increment,
mod_name varchar(255) default NULL,
mod_dir varchar(255) default NULL,
mod_file varchar(255) default NULL,
mod_author varchar(255) default NULL,
mod_version varchar(255) default ‘1.0’,
mod_type varchar(255) default ‘public’,
plugin_ID int(11) default NULL,
PRIMARY KEY (mod_ID),
UNIQUE KEY mod_ID (mod_ID),
KEY mod_ID_2 (mod_ID)
) TYPE=MyISAM;
# Table: ‘plugin_status’
#
CREATE TABLE plugin_status (
ps_ID int(11) NOT NULL auto_increment,
plugin_ID int(11) default ‘0’,
plugin_status varchar(255) default ‘not_initialized’,
site_ID int(11) default ‘0’,
PRIMARY KEY (ps_ID),
UNIQUE KEY ps_ID (ps_ID),
KEY ps_ID_2 (ps_ID)
) TYPE=MyISAM;
# Table: ‘plugins’
#
CREATE TABLE plugins (
plugin_ID int(11) NOT NULL auto_increment,
plugin_name varchar(255) default ‘0’,
plugin_dir varchar(255) default ‘plugins’,
plugin_file varchar(255) default ‘0’,
plugin_author varchar(255) default ‘0’,
plugin_version varchar(255) default ‘0’,
plugin_type varchar(255) default ‘private’,
plugin_priority int(11) default ‘0’,
PRIMARY KEY (plugin_ID),
UNIQUE KEY plugin_ID (plugin_ID),
KEY plugin_ID_2 (plugin_ID)
) TYPE=MyISAM;
# Table: ‘sites’
#
CREATE TABLE sites (
site_ID int(11) NOT NULL auto_increment,
site_name varchar(255) NOT NULL default ‘0’,
site_host varchar(255) default ‘0’,
PRIMARY KEY (site_ID),
UNIQUE KEY site_ID (site_ID),
KEY site_ID_2 (site_ID)
) TYPE=MyISAM;
# Table: ‘template_users’
#
CREATE TABLE template_users (
tu_ID int(11) NOT NULL auto_increment,
user_ID int(11) default ‘0’,
t_ID int(11) default ‘0’,
site_ID int(11) default ‘0’,
PRIMARY KEY (tu_ID),
UNIQUE KEY tu_ID (tu_ID),
KEY tu_ID_2 (tu_ID)
) TYPE=MyISAM;
# Table: ‘templates’
#
CREATE TABLE templates (
t_ID int(11) NOT NULL auto_increment,
t_name varchar(255) default NULL,
t_file varchar(255) default NULL,
t_status varchar(255) default ‘0’,
site_ID int(11) default NULL,
PRIMARY KEY (t_ID),
UNIQUE KEY t_ID (t_ID),
KEY t_ID_2 (t_ID)
) TYPE=MyISAM;
# Table: ‘users’
#
CREATE TABLE users (
user_ID int(11) NOT NULL auto_increment,
user_name varchar(255) default NULL,
user_pass varchar(255) default NULL,
site_ID int(11) default ‘1’,
PRIMARY KEY (user_ID),
UNIQUE KEY user_ID (user_ID,user_name),
KEY user_ID_2 (user_ID)
) TYPE=MyISAM;
Block System
Langsung aja yuk.
Variabel yang akan kita gunakan disini adalah:
public $bcount;
public $blocks_list;
public $columns;
public $rows;
public $cur_block;
public $cur_tags;
$bcount adalah variabel yang akan menyimpan informasi tentang berapa banyak blok yang telah di-load.
$columns menunjukkan array yang di setiap kolom pada template yang digunakan.
$rows hampir sama seperti $columns. Bedanya, $rows akan menujukkan baris bukan kolom
$cur_block akan menyimpan data tentang berapa blok yang telah diuraikan pada script
$cur_tags menyimpan informasi blok yang akan menggantikan tag pada template
$blocks_list menyimpan informasi title, content, kolom yang akan digunakan
Sekarang, jalankan query SQL untuk memilih semua blok yang akan di perlihatkan pada halaman web. Dimulai dengan membuat function, dan namai dengan blocks(), jadi begitu class dari blok dipanggil, maka function block tadi juga akan berjalan secara otomatis.
function blocks(){
Variabel global yang akan digunakan adalah :
global $sql,$plugins,$modules,$site,$user;
$this->bcount=0;
bcount diberi nilai 0, karena belum ada satupun blok yang di-load.
Untuk menghitung jumlah group yang dimiliki oleh seorang user, kita menggunakan variabel $user->user[‘gids’]. Tugas variabel tersebut nantinya adalah untuk mendapatkan ID group (dimana saja dia terdaftar):
$i=0;
$b_grp=””;
while($i< $count=count($user->user[‘gids’])){
$b_grp.=”blocks.group_ID = ‘{$user->user[‘gids’][$i]}'”;
$i++;
if($i==$count){
$b_grp.=” “;
}else{
$b_grp.=” OR “;
}
}
Lanjut..
Pada sebuah halaman, CMS harus mengetahui blok apa saja yang akan di-load. Agar sebuah blok dapat dipilih, blok tersebut harus memiliki plugin dan module yang telah diinisialisasikan, harus memiliki site ID yang sama dengan ID dari website yang me-request, harus berada di tingkat autentikasi yang sama dengan user yang me-request, dan harus diatur bagaimana pemunculan blok tsb di suatu halaman, atau bahkan semua halaman.
Pada query-nya, kita akan gunakan $b_grp:
$blocks=$sql->_query(“SELECT
blocks.block_ID,
blocks.block_title,
blocks.block_file,
block_location.block_col,
block_location.block_row,
plugins.plugin_dir,
plugins.plugin_file
FROM
block_location,
blocks,
plugin_status,
plugins,
module_status,
modules
WHERE
(blocks.block_ID = block_location.block_ID) AND
(blocks.plugin_ID = plugin_status.plugin_ID) AND
(plugins.plugin_ID = plugin_status.plugin_ID) AND
(plugin_status.plugin_status = ‘initialized’) AND
(blocks.mod_ID = module_status.mod_ID) AND
(modules.mod_ID = module_status.mod_ID) AND
(module_status.mod_status = ‘initialized’) AND
$bgs
(block_location.site_ID = ‘{$site->site[‘ID’]}’) AND
((block_location.block_page = ‘all’) OR
(block_location.block_page = ‘{$site->site[‘page’]}’))
ORDER BY
block_location.block_col,
block_location.block_row“);
Setelah query meberikan hasil pada variabel $blocks variable, dapat informasinya melalui function _fetch_object() yang telah kita buat pada SQL class; Hal ini akan memudahkan kita untuk mendapatkan hasil dari query tersebut sebagai sebuah objek. Lalu kita akan membangun kembali objek tersebut kedalam sebuah array yang lebih user friendly. Alasan kenapa lebih mudah menggunakan array adalah karena kita kita dapat mengatur key dari array tersebut untuk mengkoordinasikan blok; misalnya $blocks_list[1][2] (baca: block list kolom 1 baris 2).
while($block=$sql->_fetch_object($blocks)){
if(file_exists(“{$block->plugin_dir}/{$block->plugin_file}/blocks/{$block->block_file}.blk.php”)){
$this->blocks_list[‘column’.$block->block_col][$block->block_row][‘block_path’]=”{$block->plugin_dir}/{$block->plugin_file}/blocks/{$block->block_file}.blk.php”;
$this->blocks_list[‘column’.$block->block_col][$block->block_row][‘block_ID’]=$block->block_ID;
$this->blocks_list[‘column’.$block->block_col][$block->block_row][‘block_title’]=$block->block_title;
}else{
$this->blocks_list[‘column’.$block->block_col][$block->block_row][‘block_path’]=”plugins/missing/blocks/404.blk.php”;
$this->blocks_list[‘column’.$block->block_col][$block->block_row][‘block_ID’]=$block->block_ID;
$this->blocks_list[‘column’.$block->block_col][$block->block_row][‘block_title’]=”Missing Block”;
}
}

Berlangganan update artikel terbaru via email:

0 Response to "Membangun CMS dengan PHP"

Post a Comment

Iklan Atas Artikel

Iklan Tengah Artikel 1

Iklan Tengah Artikel 2

Iklan Bawah Artikel