db/db_itemchange.inc.php

00001 <?php if(!function_exists('startedIndexPhp')) { header("location:../index.php"); exit();}
00002 require_once ("./db/db.inc.php");
00003 # streber - a php based project management system
00004 # Copyright (c) 2005 Thomas Mann - thomas@pixtur.de
00005 # Distributed under the terms and conditions of the GPL as stated in docs/license.txt
00006 
00024 class ItemVersion extends BaseObject
00025 {
00026     public $version_number;
00027     public $date_from;
00028     public $date_to;
00029     public $author;
00030     public $values=array();                         # hash with changed fields in this version
00031     public $values_next=array();                         # hash with changed fields in this version
00032 
00033 
00034     static function getFromItem($item)
00035     {
00036 
00037         ### get changes ###
00038         $all_changes= $all_changes= ItemChange::getItemChanges(array(
00039             'item'      => $item->id,
00040         ));
00041 
00042         $versions= array( new ItemVersion(array(
00043             'version_number'=>1,
00044             'date_from'=> $item->created,
00045             'author'=> $item->created_by,
00046         )));
00047 
00048         $last_version= $versions[0];
00049 
00050 
00051         $version_number=2;
00052         $modified_last= NULL;
00053         foreach($all_changes as $cf) {
00054 
00055             $flag_new= false;
00056 
00057             if($cf->modified != $modified_last) {
00058                 $flag_new = true;
00059             }
00060             if(isset($last_version) && $last_version->author != $cf->modified_by) {
00061                 $flag_new;
00062             }
00063 
00064             if($flag_new) {
00065                 $version= new ItemVersion(array(
00066                     'version_number'=> $version_number++,
00067                     'date_from'     => $cf->modified,
00068                     'author'        => $cf->modified_by,
00069                    # 'changed_fields'=> array($cf)
00070                 ));
00071 
00072 
00073                 $modified_last = $cf->modified;
00074                 $versions[]= $version;
00075                 $last_version= $versions[count($versions)-2];
00076                 $last_version->date_to= $cf->modified;
00077 
00078             }
00079 
00080             $last_version->values[$cf->field]= $cf->value_old;
00081             #$versions[count($versions)-1]->values[$cf->field]= 'bla';
00082         }
00083 
00084         ### finally fill out latest values ###
00085         if(count($versions) > 1) {
00086             foreach($versions[count($versions)-2]->values as $fname => $value) {
00087                 $versions[count($versions)-1]->values[$fname] = $item->$fname;
00088             }
00089             $versions[count($versions)-1]->date_to= getGMTString();
00090 
00091             ### fill in next values ###
00092             $changed= array();
00093             foreach(array_reverse($versions) as $v) {
00094                 foreach($v->values as $name=>$value) {
00095                     if(isset($changed[$name])) {
00096                         $v->values_next[$name]= $changed[$name];
00097                     }
00098                     else {
00099                         $v->values_next[$name]= $item->$name;
00100                     }
00101                     $changed[$name]= $value;
00102                 }
00103             }
00104         }
00105         return $versions;
00106     }
00107 }
00108 
00109 
00110 
00111 
00112 
00113 
00114 
00115 
00116 
00117 
00118 
00119 
00120 
00121 
00122 
00123 global $g_itemchange_fields;
00124 $g_itemchange_fields=array();
00125 foreach(array(
00126             ### internal fields ###
00127             new FieldInternal  (array('name'=>'id',
00128                 'default'=>0,
00129             )),
00133             new FieldInternal  (array('name'=>'item',
00134                 'default'=>10,
00135             )),
00136             new FieldUser     (array('name'=>'modified_by',
00137                 'default'=> FINIT_CUR_USER,
00138                 'view_in_forms'=>false,
00139             )),
00140 
00141             new FieldDatetime( array('name'=>'modified',
00142                 'default'=>FINIT_NOW,
00143                 'view_in_forms'=>false,
00144             )),
00145 
00149             new FieldInternal(array(    'name'=>'field',
00150                 'view_in_forms'=>false,
00151             )),
00152 
00156             new FieldInternal  (array('name'=>'value_old',
00157                 'view_in_forms'=>false,
00158             )),
00159 
00160        ) as $f) {
00161             $g_itemchange_fields[$f->name]=$f;
00162        }
00163 
00164 
00165 
00166 class ItemChange extends DbItem
00167 {
00168 
00169     public $fields_itemchange;
00170 
00174     public function __construct($id_or_array=NULL)
00175     {
00176 
00182         $this->_type=strtolower(get_class($this));
00183 
00184 
00188         if(!$this->fields) {
00189 
00190             global $g_itemchange_fields;
00191             $this->fields=&$g_itemchange_fields;
00192         }
00193 
00194         parent::__construct();
00195 
00199         if(is_array($id_or_array)) {
00200             parent::__construct();
00201             foreach($id_or_array as $key => $value) {
00202                 is_null($this->$key); ### cause E_NOTICE on undefined properties
00203                 $this->$key=$value;
00204             }
00205         }
00206 
00212         else if(is_int($id_or_array)) {
00213             parent::__construct($id_or_array);
00214 
00215 
00216         }
00217         #--- just empty ----
00218         else {
00219             trigger_error("can't construct zero-id item",E_USER_WARNING);
00220             parent::__construct();
00221             return NULL;
00222         }
00223     }
00224 
00225 
00226 
00227 
00228     static function &getItemChanges( $args=NULL)
00229     {
00230         global $auth;
00231         $prefix = confGet('DB_TABLE_PREFIX');
00232 
00233         ### default params ###
00234         $item               = NULL;
00235         $date_min           = NULL;
00236         $date_max           = NULL;
00237         $person             = NULL;
00238         $field              = NULL;
00239         $project            = NULL;
00240         $order_by            = 'modified';
00241 
00242         ### filter params ###
00243         if($args) {
00244             foreach($args as $key=>$value) {
00245                 if(!isset($$key) && !is_null($$key) && !$$key==="") {
00246                     trigger_error("unknown parameter",E_USER_NOTICE);
00247                 }
00248                 else {
00249                     $$key= $value;
00250                 }
00251             }
00252         }
00253 
00254 
00255         $str_project= $project
00256             ? "AND c.project= $project"
00257             : '';
00258 
00259 
00260         $str_item= $item
00261             ? "AND c.item=".$item
00262             : '';
00263 
00264 
00265         $str_date_min= $date_min
00266             ? "AND c.modified >= '$date_min'"
00267             : '';
00268 
00269         $str_date_max= $date_max
00270             ? "AND c.modified <= '$date_max'"
00271             : '';
00272 
00273         $str_field= $field
00274             ? "AND c.field =`$field`"
00275             : '';
00276 
00277         $str_person= $person
00278             ? "AND c.modified_by =$person"
00279             : '';
00280 
00281 
00282         ### show all ###
00283         $str_query=
00284             "SELECT c.*  from {$prefix}itemchange c
00285             WHERE 1
00286             $str_project
00287             $str_item
00288             $str_person
00289             $str_field
00290             $str_date_max
00291             $str_date_min
00292             ". getOrderByString($order_by);
00293 
00294             ;
00295 
00296         $dbh = new DB_Mysql;
00297         $sth= $dbh->prepare($str_query);
00298 
00299         $sth->execute("",1);
00300         $tmp=$sth->fetchall_assoc();
00301         $item_changes=array();
00302         foreach($tmp as $t) {
00303             $c=new ItemChange($t);
00304             $item_changes[]=$c;
00305         }
00306         return $item_changes;
00307     }
00308 
00309 
00310 
00311 
00312 
00313 
00314 
00315 
00316 
00317 
00318 
00319 
00320 
00321 
00327     static function getById($id)
00328     {
00329         $i= new DbItemChange($id);
00330         if($i->id) {
00331             return $i;
00332         }
00333         return NULL;
00334     }
00335 }
00336 
00337 
00338 ?>

Generated on Sun Mar 4 17:19:28 2007 for streber by  doxygen 1.5.1-p1