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 ?>