Nandha6389’s Weblog

Just another WordPress.com weblog

MEMBANGUN CMS DENGAN PHP

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 http://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”;
}
}

Desember 23, 2008 Posted by | Uncategorized | Tinggalkan komentar

PHP/MySQL

Mengirim email dengan PHP, mulai dari email biasa, email HTML sampai email dengan attachment
Mengirim email dengan PHP bukan merupakan hal yang sulit, PHP telah menyediakan fungsi mail() untuk mengirim email dengan PHP. Anda dapat mengirim email teks biasa, email HTML bahkan email dengan attachment dengan mudah.
Fungsi mail()
Pertama-tama kita pelajari dulu fungsi mail(). Sintaksnya seperti ini:
mail ( string to, string subject, string message [, string additional_headers [, string additional_parameters]])

Fungsi mail() memiliki 3 parameter wajib dan satu parameter opsional. Ke 3 parameter tersebut adalah email tujuan, judul email dan isi email, serta 1 parameter opsional yaitu header email.
Upload file ke server dengan menggunakan PHP

Kali ini saya akan membahas tentang upload file menggunakan PHP. Tentu menyenangkan jika pengguna website anda dapat melakukan upload gambar, dokumen atau video kedalam website anda. Artikel ini akan menerangkan cara mengupload file keserver anda dengan PHP.

PHP membuat semuanya menjadi lebih mudah dalam menangani upload file. Untuk membuat form upload pastikan kita menyertakan atribut enctype=”multipart/form-data” dan pastikan methodnya adlaha post. Oke langsung saja kita lihat kode HTML berikut ini:

<form method=”post” action=”<?=$PHP_SELF?>” enctype=”multipart/form-data”>
<input type=”file” name=”myfile”>
<input type=”submit” name=”Submit” value=”Submit”>
</form>

Seperti yang kita lihat, kita me,mberi nama pada field upload kita “myfile”. Nama ini sangat penting, karena ketika file telah diupload maka file tersebut otomatis diberi nama yang unik dan disimpan di temporary direktori. Tentu saja url path ke filenya bisa diakses, karena otomatis akan muncul variabel global yang memiliki nama yang sama dengan field upload kita, dalam hal ini myfile. Akan ada 4 variabel baru yang semuanya diawali dengan myfile dan diikuti dengan garis bawah (underscore), yaitu:
$myfile. Variabel ini berisi informasi lokasi file di server.
$myfile_name. Nama file asli ketika masih dikomputer klien.
$myfile_size. Ukuran dari file (dalam satuan bytes).
$myfile_type. Tipe file.
Upload sederhana

Langsung saja kita coba contoh upload berikut ini, simpan dengan nama upload.php:

<html>
<head>
<title>Upload file</title>
</head>
<body>
<?
if ( isset( $upload ) ) {
echo “Lokasi File: $myfile<br>”;
echo “Nama File: $myfile_name<br>”;
echo “Ukuran: $myfile_size bytes<br>”;
echo “Tipe File: $myfile_type<br>”;
copy ( $myfile, “$myfile_name”) or die (”Gagal mengupload”);
}
?>
<form enctype=”multipart/form-data” action=”<?=$PHP_SELF?>” method=”post”>
<input type=”file” name=”myfile”><br>
<input type=”submit” value=”upload” name=”upload”>
</form>
</body>
</html>

Ketika tombol upload ditekan, maka url path file tersebut akan disimpan di variabel $myfile dan kita tampilkan dibrowser. Kita juga menampilkan nama file yang tersimpan pada variabel $myfile_name, ukuran file di variabel $myfile_size dan tipe file di variabel $myfile_type.

Kita menggunakan fungsi copy() untuk memindahkan file dari komputer kita direktori sementara di server kita. Fungsi copy() membutuhkan dua argumen yaitu lokasi awal file dan lokasi baru diserver. Jika kita ingin mengupload nya ke suatu folder diserver (katakanlah kita simpan difolder images) maka kita perlu mengubahnya menjadi: copy ( $myfile, “images/$myfile_name”)
Upload yang lebih kompleks

Sekarang mari kita coba membuat fungsi upload yang jauh lebih rumit. Misalkan kita ingin membuat fungsi upload dimana file yang diupload harus file jpg, dan ukurannya tidak boleh lebih besar dari 100Kb serta panjang dan lebar gambar tidak boleh lebih dari 100 piksel. Kelihatannya rumit kan? Mari kita coba kode berikut dan simpan dengan nama upload2.php:

<html>
<head>
<title>Upload file</title>
</head>
<body>
<?
if ( isset( $upload ) ) {
echo “Lokasi File: $myfile<br>”;
echo “Nama File: $myfile_name<br>”;
echo “Ukuran: $myfile_size bytes<br>”;
echo “Tipe File: $myfile_type<br>”;
if ( $myfile_type == “image/pjpeg” ) {
if ($myfile_size <= 102400 ) {
list($width, $height) = @getimagesize(”$myfile”);
if ( $width <= 100 && $height <= 100 ) {
copy ( $myfile, “$myfile_name”) or die (”Couldn’t copy”);
echo “File anda telah sukses diupload”;
} else {
echo “Ukuran panjang dan lebar gambar terlalu besar”;
}
} else {
echo “Ukuran file tidak boleh lebih dari 100Kb”;
}
} else {
echo “File harus JPG!!”;
}
}
?>
<form enctype=”multipart/form-data” action=”<?=$PHP_SELF?>” method=”post”>
<input type=”file” name=”myfile”><br>
<input type=”submit” value=”upload” name=”upload”>
</form>
</body>
</html>

PHP tidak memiliki kemampuan untuk membuat progress bar ketika file diupload. Karena PHP tidak dapat mengetahui berapa bagian yang telah diupload dan berapa yang belum. Kita perlu menggunakan CGI. Tetapi entah dengan PHP terbaru, siapa tau sudah memiliki class atau fungsi untuk membuat progress bar.

Pertama-tama yang kita lakukan adalah mengecek apakah file kita jpg dengan cara mengecek $myfile_type. Jika hasil dari variabel $myfile_type adalah “image/pjpeg”, maka bisa dipastikan bahwa file kita adalah jpg. Berikutnya kita melakukan pengecekan apakah ukuran filenya tidak lebih besar dari 100Kb dengan mengecek variabel $myfile_size. Ingat bahwa 100Kb = 102400Bytes(Rumusnya 1Kb=1024Bytes). Kemudian kita menggunakan fungsi getimagesize() untuk menemukan panjang dan lebar dari gambar yang kita simpan dengan array menggunakan fungsi list(). Kemudian kita cek panjang dan lebar dari gambar apakah tidak lebih dari 100 piksel. Jika semuanya terpenuhi maka filenya tinggal kita copy. Cukup mudah kan? gampang… anda pasti bisa.

Desember 15, 2008 Posted by | Uncategorized | Tinggalkan komentar