基于文件系统的多style网站实现php版本

大部分站点拥有一个 style的.css文件,但是一些 blog之类的多用户程序,支持不同用户不同样式,这种一般是基于模板来实现的。

根据 css中的url 一文中,.css中出现的 url是相对 .css文件的,而不是全局的。那么我们可以在不同文件夹里面,放置不同"样式"的 .css文件,以及 .css中使用到的图片们(url是相对的,只需要写类似./images/logo.gif,移动到任何目录下,.css都能对应到图片)

下面一个php类,它基于文件系统来实现多 style并且供用户自由选择。
dstyle首先声明了默认配置,look:
... ...
define( 'DSTYLE_DEFAULT_DIR', "/style/" );
define( 'DSTYLE_DEFAULT_INI', "style.ini" );
define( 'DSTYLE_DIR', "dir" );
define( 'DSTYLE_NAME', "name" );
define( 'DSTYLE_CSS', "css" );
... ...

默认情况下,dstyle读取 "/style/"目录,并且以目录中的子文件夹来区分各个"样式",读取相应的子文件夹中的 style.ini为该"样式"的配置信息,其中 name字段是该"样式"的名称,css字段是该"样式"的css文件。
比如当前如此目录

style/
+--- +red/
| +--- style.ini(name=Apple style=red.css ...)
| +--- red.css
| +--- images/
| + ... ...
|
+--- +blakc/
| +--- style.ini(name=Night style=night.css ...)
| +--- night.css
| +--- images/
| + ... ...
+--- +green/(name=Tree style=grass.css ...)
| +--- style.ini
| +--- grass.css
| +--- images/
| + ... ...
|
+... ...

dstyle将读取默认的 style文件夹,获取到3个目录,读取相应目录里面默认的配置文件信息 style.ini,将获得3个样式的配置信息,存放在 dstyle->styles里面。当然,dstyle->dirs保存着目录们的数组,dstyle->names里面保存着样式名称的数组,在程序里面可以当作列表来显示出来,供用户们选择。

一旦用户选种了某个样式,比如第2个,保存在 dstyle->style里面。那么按照style.ini的配置,我们写link样式文件时候,用 dstyle->style['css']或者 dstyle->css,就link相应的 night.css了。

比较忙,不再描述也不写演示代码了,自己看源码吧。


?php

define( 'DSTYLE_DEFAULT_DIR', "/style/" );
define( 'DSTYLE_DEFAULT_INI', "style.ini" );
define( 'DSTYLE_DIR', "dir" );
define( 'DSTYLE_NAME', "name" );
define( 'DSTYLE_CSS', "css" );

class DSTYLE
{
public $style;
public $count;

public $styles;
public $dirs;
public $names;

function __construct( $_dir=null, $_selected=1, $_inifile=null )
{
if( empty($_dir) || !is_dir($_dir) )
{
$this->dir = dirname(__FILE__).DSTYLE_DEFAULT_DIR;
}
else
{
$this->dir = $_dir;
}

if( empty($_inifile) )
{
$this->inifile = DSTYLE_DEFAULT_INI;
}
else
{
$this->inifile = $_inifile;
}

$this->count = 0;
$this->names = null;
$this->dirs = null;
$this->styles = null;
$this->lists();
if( $this->count>=$_selected )
{
$this->style = $this->styles[$_selected];
foreach( $this->style as $key => $value )
{
$this->$key = $value;
}
return true;
}
else
{
return false;
}
}

private function read( $name )
{
if( is_numeric($name) )
{
$name = $this->lists[$name];
}
if( !is_dir($this->dir.$name) || $name=="." || $name==".." )
{
return false;
}

$fp = fopen( $this->dir.$name."/".$this->inifile, "r" );
if( ! $fp )
{
return false;
}

$retval = null;
$retval['dir'] = $name;
while( !feof($fp) )
{
$lines = trim( fgets( $fp ) );
$array = explode( '=', $lines, 2 );
if( count($array)==2 )
{
$retval[$array[0]] = $array[1];
}
}
fclose( $fp );

//$this->name = $name;

return $retval;
}

private function lists()
{
if( ! $dirs = opendir( $this->dir ) )
{
return 0;
}

while( $filename=readdir($dirs) )
{
if( filetype($this->dir.$filename)=="dir" ||
!preg_match( '/\.(|\.)$/', $filename ) )
{
if( $style = $this->read( $filename ) )
{
$this->count++;
$this->styles[$this->count] = $style;
$this->styles[$style['dir']] = $style;
$this->styles[$style['name']] = $style;
$this->dirs[$this->count] =
$style['dir'];
$this->names[$this->count] =
$style['name'];
}
}
}
return $this->count;
}
}

//$STYLE = new DSTYLE();

//print_r( $STYLE );

?>

发表评论