Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1147232
  • 博文数量: 53
  • 博客积分: 10025
  • 博客等级: 上将
  • 技术积分: 1640
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-15 17:05
文章分类

全部博文(53)

文章存档

2011年(1)

2010年(3)

2009年(25)

2008年(24)

我的朋友

分类:

2008-11-20 18:26:51

大部分站点拥有一个 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 );

?>

阅读(1859) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2008-11-22 21:00:54

呵呵,师傅有空研究一下RoR吧,我随便HelloWorldl了一下,很是不错的说 :-)