Membangun CMS dengan PHP [Bag.3]

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:
penamaan direktori
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”;
}
}

Bersambung ke bagian 4

Be Sociable, Share!

5 Replies to “Membangun CMS dengan PHP [Bag.3]”

  1. hmmm bagus tutorialnya..
    tapi blm bisa paham sampe skarang.. mungkin pengantarnya kuran detail ap sayanya yg msh awam ya? …….;(
    ditunggu tutorial ke 4 nya ya

    makasih

  2. Saya pemula yang ingin belajar membuat CMS sendiri, saya hanya sedikit menguasai mysql dan php. Artikel ini amat membantu saya.
    Hanya saja mana nich sambungan bagian 4 dan lain-laian. Kok cuma sampai bagian 3 saja.

Leave a Reply

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