Version: 1.1
Type: Full Script
Category: Graphics
License: Other
Description: Tables and other types of page elements may have borders that may be presented in different styles. Rounded borders are often interesting to provide page elements the sense of three dimensional depth. Rounded borders styles are being introduced with CSS 3 standard. However, this version of CSS standard is not yet being supported by most of the current browsers in use. This class provides an alternative solution that uses images to render rounded borders of configurable size and presentation style. Dynamic generation of border images is usually an heavy task, especially for busy sites. This class employs caching to reduce the border image generation overhead. PS! version 2.0 is available at http://www.phpmyborder.com
<?
define("PATH_PHPMYBORDER", "/phpMyBorder/"); // path from doc_root
// e.g if this script is accessable via
// www.domain.com/scripts/phpMyborder.php
// PATH_PHPMYBORDER = "/scripts/"
/*
___[ PhpMyBorder v1.1 ]__________
/ \
| Created by |
| Vidar Vestnes |
| (c)2005 |
| |
\___[ Norway ]___________________/
Licence: Freely distributed
Check for new version
http://www.phpmyborder.com
HOW TO USE:
include this file in your script
include_once("phpMyBorder1.class.php");
add a bordergenerator
$pmb = new PhpMyBorder();
Now you are ready to output borders.
Use the function border_start to begin the border
echo $pmb->border_start(); // using the defaults
echo "Your content here..."";
echo $pmb->border_end();
border_start have these attributes to help you customize your border.
border_start(
$width = false, // pixel e.g. "250px"
$color = false, // hex e.g "DDEEFF"
$cornersize = false, // 5-50
$borderthickness = false, // 1-3
$style = false // 1 or 2 (1=filled, 2=outline)
)
always remember to close your border by calling border_end()
Example: test.php
<html>
<head>
<title>PhpMyBorder Demo</title>
</head>
<body>
<?php
require_once('phpMyBorder1.class.php');
$pmb = new PhpMyBorder();
echo $pmb->border_start();
echo "Test1 - Default border";
echo $pmb->border_end();
echo "<br>";
echo $pmb->border_start("300px","FF0000",20);
echo "Test2 - width: 300px, fillcolor: FF0000 (red), cornersize : 20px (radius);";
echo $pmb->border_end();
echo "<br>";
echo $pmb->border_start("250px","FF5500",7,2,2);
echo "Test2 - width: 250px, fillcolor: FF5500 (orange), cornersize : 7px (radius), borderthickness: 2px, style : 2 (outlined);";
echo $pmb->border_end();
?>
</body>
</html>
*/
class PhpMyBorder{
//part of the border to painted
var $paint;
//properies of the border
var $property;
//gif which is rendered, a part of the border.
var $image;
//width of the complete border
var $width;
// constructor of the class
function PhpMyBorder(){
$this->checkFunctions();
$this->checkCacheDir();
//creates a dummy picutre
$this->image = imagecreatetruecolor(1, 1);
//set defaults
$this->setStyle (1); // 1 = FILLED, 2 = OUTLINE
$this->setColor ('DDEEFF'); // fill and outlined border color
$this->setCornerSize (5); // integer 5-50
$this->setBorderThickness (2); // integer 1-3
}
function checkFunctions(){
$functions = array(
"imagegif",
"sscanf",
"imagecopymerge",
"imagerotate",
"imagecreatetruecolor",
"ob_start",
"imagefill"
);
for($i=0;$i<count($functions);$i++){
$func = $functions[$i];
if(!function_exists($func)) {
$msg = "
PHP function <B>$func</B> is missing.<BR>
<BR>
<i>
This function is requiered by phpMyBorder. This version of PHP does not support phpMyBorder.<BR>
Try uppgrading you PHP installation.
</i>
";
$this->fatal_error($msg,1);
}
}
}
//sets the border color
function setColor($color){
$this->setProp('color', $color."000000");
}
//gets the color (HTML hex format)
function getColor(){
return substr($this->getProp('color'),0,6);
}
function getColorAllocate(){
sscanf($this->getColor(), "%2x%2x%2x", $red, $green, $blue);
return imagecolorallocate($this->image, $red, $green, $blue );
}
//gets the color which to be transparent
function getTransparentAllocate(){
sscanf("FF0000", "%2x%2x%2x", $red, $green, $blue);
$transparent = imagecolorallocate($this->image, $red, $green, $blue );
if($this->getColorAllocate() == $transparent){
sscanf("0000FF", "%2x%2x%2x", $red, $green, $blue);
$transparent =imagecolorallocate($this->image, $red, $green, $blue );
}
return $transparent;
}
function checkCacheDir(){
$dir_script = dirname(__FILE__);
$dir_cache = $this -> getPathCache();
$dir_abs = $dir_script."/".$this -> getPathCache();
if(is_writable($dir_abs)) return true;
clearstatcache();
if(!is_writeable($dir_script)){
$error = "
Directory <B>$dir_script</b> is not writable. <BR>
<BR>
<i>
The directory which you have put the phpMyBorder script is not writable.<BR>
Make sure that PHP has write permission to this path to be able to cache borders (gifs images)<BR>
Use chmod to solve the problem ( Unix and Linux ).
</i>
";
$this->fatal_error($error, 2);
}
if(is_dir($dir_abs) && !is_writeable($dir_abs) ) {
$error = "
Directory <B>$dir_abs</b> is not writable. <BR>
<BR>
<i>
The cachedir is not writable.<BR>
Make sure that PHP has write permission to this path to be able to cache borders (gifs images)<BR>
Use chmod to solve the problem ( Unix and Linux ).
</i>
";
$this->fatal_error($error, 2);
}
if(!@mkdir($dir_abs)){
$error = "
Failed to create directory <B>$dir_abs</b>. <BR>
<BR>
<i>
This directory is needed to cache borders (gifs images)<BR>
</i>
";
$this->fatal_error($error,3);
}
clearstatcache();
if(!is_writeable($dir_abs)){
$error = "
Cache directory does not exist : <B>$dir_abs</b>. <BR>
<BR>
<i>
This directory is needed to cache borders (gifs images)<BR>
</i>
";
$this->fatal_error($error , 4);
}
return true;
}
function fatal_error($error,$nr = false){
$msg =
"
<HTML>
<BODY style=\"font-family: Microsoft Sans Serif,helvetica, arial; font-size:14; \">
<H1 style=\"color:#FF0000; font-size:15px;margin:0px;\">PhpMyBorder failure :</H1><BR>
<BR>
ErrorMessage [ $nr ] : <BR>
<BR>
$error
<BR>
<BR>
- phpMyBorder
</BODY>
</HTML>
";
die($msg);
}
//gets scriptpath
function getPathScript(){
$path = str_replace("\\","/",PATH_PHPMYBORDER);
$path = substr($path,-1 )!= "/" ? $path."/" : $path;
return $path;
}
function getPathCache(){
return "cache";
}
function getAbsolutePathCache(){
$path = dirname(__FILE__)."/".$this->getPathCache();
$path = str_replace("\\","/",$path);
$path = str_replace("//","/",$path);
return $path;
}
//checks if a part (gif) is cached
function isCached(){
$path = $this->getAbsolutePathCache()."/".$this->getFileName();
return is_file($path);
}
//sets which part of the table to be paintet 1-9 (1 is upper left, 9 is bottom right)
function paint($paint){
$this->paint = $paint;
}
//setting style, (outlined or filled)
function setStyle($style = 1){
$this->setProp('style',$style);
}
//return choosen style
function getStyle(){
return $this->getProp('style');
}
function setBorderWidth($width){
$this->width = $width;
}
function getBorderWidth(){
return $this->width;
}
//sets the corersize (pixel)
function setCornerSize($size){
$size = $size<5 ? 5 : $size;
$size = $size>50 ? 50 : $size;
$this->setProp('cornersize',$size);
}
//gets the cornersize
function getCornerSize(){
return $this->getProp('cornersize');
}
//sets the boderthickness
function setBorderThickness($thick) {
$thick = $thick<1 ? 1 : $thick;
$thick = $thick>3 ? 3 : $thick;
$this->setProp('thick',$thick);
}
// gets the borderthickness
function getThick(){
return $this->getProp('thick');
}
// checks if the current part is a tablecorner or an edge
function isCorner(){
return $this->paint % 2 == 1;
}
//store a property about the gif
function setProp($prop,$value){
return $this->property[$prop] = $value;
}
//returns a property
function getProp($prop){
return $this->property[$prop];
}
// flips a image
function ImageFlip($type){
$imgsrc = $this->image;
$width = imagesx($imgsrc);
$height = imagesy($imgsrc);
$imgdest = imagecreatetruecolor($width, $height);
ImageAlphaBlending($imgdest, false);
switch( $type ) {
case 1:
for( $y=0 ; $y<$height ; $y++ )
imagecopymerge($imgdest, $imgsrc, 0, $height-$y-1, 0, $y, $width, 1,100);
break;
case 2:
for( $x=0 ; $x<$width ; $x++ )
imagecopymerge($imgdest, $imgsrc, $width-$x-1, 0, $x, 0, 1, $height,100);
break;
case 3:
for( $x=0 ; $x<$width ; $x++ )
imagecopymerge($imgdest, $imgsrc, $width-$x-1, 0, $x, 0, 1, $height,100);
$rowBuffer = imagecreatetruecolor($width, 1);
for( $y=0 ; $y<($height/2) ; $y++ )
{
imagecopymerge($rowBuffer, $imgdest , 0, 0, 0, $height-$y-1, $width, 1,100);
imagecopymerge($imgdest , $imgdest , 0, $height-$y-1, 0, $y, $width, 1,100);
imagecopymerge($imgdest , $rowBuffer, 0, $y, 0, 0, $width, 1,100);
}
imagedestroy( $rowBuffer );
break;
}
$this->image = $imgdest;
}
// caches the image
function save(){
imagegif($this->image, $this->getAbsolutePathCache()."/".$this->getFilename());
}
//render the actual gif with assigned setting
function render(){
$line = $this->getThick();
//creates the real imagesize
$this->image = imagecreatetruecolor($this->getCornerSize(), $this->getCornerSize());
//fill the complete image with a transparent color
imagefill($this->image, 0, 0, $this->getTransparentAllocate());
//paints
if($this->isCorner()){
imagefilledellipse($this->image, $this->getCornerSize(), $this->getCornerSize(), $this->getCornerSize()*2, $this->getCornerSize()*2, $this->getColorAllocate());
if($this->getStyle() == 2){
//paints another ellipse with transparent-color to make it look like outlined
imagefilledellipse($this->image, $this->getCornerSize(), $this->getCornerSize(), ($this->getCornerSize()-$line)*2, ($this->getCornerSize()-$line)*2, $this->getTransparentAllocate());
}
}else{
imagefilledrectangle( $this->image, 0, 0, $this->getCornerSize() ,$this->getCornerSize(), $this->getColorAllocate() );
if($this->getStyle() == 2){
imagefilledrectangle( $this->image, 0, $line, $this->getCornerSize() ,$this->getCornerSize(), $this->getTransparentAllocate() );
}
}
//rotates or flips the image to fit part
switch($this->paint){
CASE 6 : $this->rotate(90) ; break;
CASE 4 : $this->rotate(270) ; break;
CASE 8 : $this->rotate(180) ; break;
CASE 3 : $this->imageFlip(2) ; break;
CASE 7 : $this->imageFlip(1) ; break;
CASE 9 : $this->imageFlip(3) ; break;
}
imagecolortransparent($this->image, $this->getTransparentAllocate());
ImageTrueColorToPalette( $this->image, TRUE, 256 );
}
//rotate the gif
function rotate($degree){
$this->image = imagerotate($this->image,360-$degree,0);
}
//get filename based on properties
function getFilename(){
return implode("_", $this->property)."_".$this->paint.".gif";
}
//generate the url to be set as (tablecell) background
function getUrl($paint){
$this->paint($paint);
if(!$this->isCached()){
$this->render();
$this->save();
}
return PATH_PHPMYBORDER.$this->getPathCache()."/".$this->getFilename();
}
//starts printing the border
function border_start($width = false,$color = false, $cornersize = false, $borderthickness = false,$style = false){
if($color) $this->setColor ($color);
if($cornersize) $this->setCornerSize ($cornersize);
if($borderthickness) $this->setBorderThickness ($borderthickness);
if($style) $this->setStyle ($style);
$style = "";
if($width) $style.="width : $width ;";
if($style != "") $style = "style=\"$style\"";
?>
<TABLE cellSpacing=0 cellPadding=0 <?=$style?> >
<TR>
<TD style="width:<?=$this->getCornerSize()?>px; height:<?=$this->getCornerSize()?>px; background : url(<?=$this->getUrl(1)?>);"></TD>
<TD style="background-image:url(<?=$this->getUrl(2)?>); background-repeat:repeat-x;"></TD>
<TD style="width:<?=$this->getCornerSize()?>px; height:<?=$this->getCornerSize()?>px; background-image: url(<?=$this->getUrl(3)?>);"></TD>
</TR>
<TR>
<TD style="background-image:url(<?=$this->getUrl(4)?>); background-repeat:repeat-y ;"></TD>
<TD style="background: <?= $this->getStyle() == 1 ? "#".$this->getColor() : "transparent";?>;">
<?
}
//end the border...
function border_end(){
?>
</TD>
<TD style="background-image:url(<?=$this->getUrl(6)?>); background-repeat:repeat-y;"></TD>
</TR>
<TR>
<TD style="width:<?=$this->getCornerSize()?>px; height:<?=$this->getCornerSize()?>px; background-image: url(<?=$this->getUrl(7)?>);"></TD>
<TD style="background-image:url(<?=$this->getUrl(8)?>); background-repeat:repeat-x;"></TD>
<TD style="width:<?=$this->getCornerSize()?>px; height:<?=$this->getCornerSize()?>px; background-image: url(<?=$this->getUrl(9)?>);"></TD>
</TR>
</TABLE>
<?
}
}
?>