} /**生成top*/ class maketop implements iobserver { function update($sender,$args){ //约150行代码......实现某个生成个人顶部导航文件 配置静态数据的代码. } }class make_left { static $left_bar = "outlookbar=new outlook(); var t;"; //CI对象的实例
function update($sender,$args){ //约200行代码......实现某个生成左侧导航菜单配置静态数据的代码. } }} /** * 数据库日志观察者 */ class dblog_ob implements iobserver{ function update($sender,$args){
建一个 全局functionfunction(id) {
switch(id) {
case 1:
title='login';
}
insert to table title
}
用户登陆后,执行function ,并传递定义好的行为内容
架设是用 单一的入口(比如index.php) 使用类似index.php?module=xxx&action=xxx的url访问。。
建立一个哈希表 module + action -> "具体的操作信息"
然后 将日志操作添加到入口文件。。
/*************************
*@param 功能描述:記錄管理員的所有操作.
*@param 每個頁面都存在:操作記錄有:增刪改差.
*@param time 2009-11-16
*@param $oper_content:操作內容
*@param $error:失敗原因
*@param 是否成功:操作內容
*************************/
function Operation_Log($oper_content,$is_true,$error="",$admin_id)
{
$operation_url=getenv('REQUEST_URI'); //操作頁面
$current_time = time();
$sql_insert_operations_log="INSERT INTO `operation_logs` ( `operation_id` , `operation_admin_id` , `operation_time` , `operation_page` , `operation_content` , `operation_is_true` , `operation_error` )
VALUES (NULL , $admin_id , '$current_time' , '$operation_url' , '$oper_content', '$is_true', '$error');";
$a=mysql_query($sql_insert_operations_log) or die ("insert operation_log error".mysql_error());
}
interface iobserver
{
function update($sender,$args);
}
class ob
{
function ob(){}
}/**
* 文本日志观察者
* */
class log_ob implements iobserver{
function update($sender,$args){
$log_file = $_SERVER['DOCUMENT_ROOT']."/logs/".$args[action].date("Y-m-dH").".html";
$text = "{action:$args[action],adminName:".$args["session"]->user_username.",title:$sender[title],info:$sender[info]}";
CS_log($text,$log_file);
}
}/**
* *刷my fav 数据
*/
class make_fav implements iobserver
{
function update($sender,$args)
{
//约150行代码......实现某个生成个人fav 配置静态数据的代码.
}
/**
* *
*
* @param 将表达式解析 $str
* @return 解析后的表达式的值
*/
function get_eval($str)
{
return eval($str);
}
}
/**生成top*/
class maketop implements iobserver
{
function update($sender,$args){
//约150行代码......实现某个生成个人顶部导航文件 配置静态数据的代码.
}
}class make_left
{
static $left_bar = "outlookbar=new outlook(); var t;"; //CI对象的实例
function update($sender,$args){
//约200行代码......实现某个生成左侧导航菜单配置静态数据的代码.
}
}}
/**
* 数据库日志观察者
*/
class dblog_ob implements iobserver{
function update($sender,$args){
$CI = &get_instance();
$model_name = CS_get_model_name("ylog");
$CI->load->model($model_name); //载入后台用户模型
$data["ylog_cate"] = $args["action"];
$data["ylog_vtitle"] = $args["session"]->user_username;
$data["ylog_title"] = $sender["title"];
$data["ylog_cid"] = $sender["ylog_cid"];
$data["ylog_info"] = $sender["info"];
$CI->$model_name->insert($data);
}
}主题相关./***
* 主题
*/
abstract class subject
{
public $ob_array;
public $sender;
public $args;
function addOb($ob)
{
$this->ob_array[]=$ob;
}
function set_obj($obj,$args = array(""))
{
$this->sender = $obj;
$this->args = $args;
}
function delOb($ob)
{
}
function notify()
{
foreach ($this->ob_array as $val)
{
$val->update($this->sender,$this->args);
}
}
}
/**
* * 管理员行为主题
*
*/
class adminAction extends subject
{
function adminAction()
{
$this->addOb(new log_ob());
}
}//用法
/**
* *
*
* @param 标题 $title
* @param 数据 $data
* @param 类别 $cid
* @param 处理表格 $table
* @param 行为 $action
* @param 观察者列表 $array_observer
*/
function log_db($title,$data,$cid,$table,$action,$array_observer_entend = array(''))
{
load_class("ob"); //加载观察者类和主题类
$me = new adminAction();
$me->addOb(new dblog_ob());
if(is_array($array_observer) && sizeof($array_observer))
{
foreach ($array_observer as $observer)
{
$me->addOb(new $observer());
}
}
$sender["table"] = $table;
$sender["ylog_cid"] = $cid;
$sender["title"] = "<font color = 'blue'>".$_SESSION['admin_user_data']->user_username."</font>于".date("Y-m-d H:i:s")."<font color=green>$title</font>";
foreach ( $data as $key=>$val):
$str_data_array[]="$key=>$val";
endforeach;
$str_data = implode(",",$str_data_array);
$sender["info"] = "$str_data";
$me->set_obj($sender,array("action"=>"$action","session"=>$_SESSION['admin_user_data']));
$me->notify();
}当有各种新的变化时.
log_db($title,$data,$cid,$table,$action,$array_observer_entend = array('')
往$array_observer_entend 里面塞。
例如,当修改菜单数据时,需要进行日志记录,同时也需要刷菜单文件。则
log_db('修改菜单'.$this->description.':'.$data[$title_name],$data,2,$this->tableName,'insert',array("maketop","make_left"));
则会在调用 dblog_ob 观察者进行日志记录后,再调用make_left 观察者进行刷静态文件。
能表达出来的,就这么多了,真正的代码,还有很多要理清的东西,我的感觉是,不实践,很难体会那种为了交互对象之间的松耦合设计而努力的设计原则。的感觉。