File: 0.00.1a/core/DataDictionary.php (View as Code)

1: 2: /* ------------------------------------------------------------- 3: This file is part of FreeDESK 4: 5: FreeDESK is (C) Copyright 2012 David Cutting 6: 7: FreeDESK is free software: you can redistribute it and/or modify 8: it under the terms of the GNU General Public License as published by 9: the Free Software Foundation, either version 3 of the License, or 10: (at your option) any later version. 11: 12: FreeDESK is distributed in the hope that it will be useful, 13: but WITHOUT ANY WARRANTY; without even the implied warranty of 14: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15: GNU General Public License for more details. 16: 17: You should have received a copy of the GNU General Public License 18: along with FreeDESK. If not, see www.gnu.org/licenses 19: 20: For more information see www.purplepixie.org/freedesk/ 21: -------------------------------------------------------------- */ 22: 23: /** 24: * Data Dictionary Types of Field 25: **/ 26: abstract class DD_FieldType 27: { 28: /** 29: * Integer 30: **/ 31: const Int = 0; 32: /** 33: * Unsigned Int 34: **/ 35: const UnsignedInt = 1; 36: /** 37: * Char 38: **/ 39: const Char = 2; 40: /** 41: * Float 42: **/ 43: const Float = 3; 44: /** 45: * Datetime 46: **/ 47: const DateTime = 4; 48: /** 49: * Text (large multi-line block) 50: **/ 51: const Text = 5; 52: /** 53: * Password (textual) 54: **/ 55: const Password = 6; 56: } 57: 58: /** 59: * Data Dictionary Types of Relationship 60: **/ 61: abstract class DD_RelationshipType 62: { 63: /** 64: * One to One 65: **/ 66: const OTO = 0; 67: /** 68: * One to Many 69: **/ 70: const OTM = 2; 71: /** 72: * Many to Many 73: **/ 74: const MTM = 3; 75: } 76: 77: /** 78: * Data Dictionary Table class holds information about a table 79: **/ 80: class DD_Table 81: { 82: /** 83: * Table name (human form) 84: **/ 85: var $name = ""; 86: /** 87: * Table entity name (database) 88: **/ 89: var $entity = ""; 90: /** 91: * Fields 92: **/ 93: var $fields = array(); 94: /** 95: * Entity class - for EntityFactory use 96: **/ 97: var $class = ""; 98: /** 99: * Keyfield 100: **/ 101: var $keyfield = ""; 102: /** 103: * Entity Directly Editable 104: **/ 105: var $editable = false; 106: /** 107: * Add a field to the table 108: * @param mixed $field Field data of type DD_Field 109: **/ 110: function Add($field) 111: { 112: $this->fields[$field->field] = $field; 113: if ($field->keyfield) 114: $this->keyfield = $field->field; 115: } 116: /** 117: * Get a field or return boolean false if not found 118: * @param string $field Name of field 119: * @return mixed False on fail or DD_Field of field 120: **/ 121: function GetField($field) 122: { 123: if (isset($this->fields[$field])) 124: return $this->fields[$field]; 125: else 126: return false; 127: } 128: 129: /** 130: * Set a field value 131: * @param string $field Field name 132: * @param string $item Item/member name 133: * @param mixed $value Value to set item to 134: **/ 135: function SetVal($field, $item, $value) 136: { 137: if (isset($fields[$field])) 138: $fields[$field]->$item = $value; 139: } 140: } 141: 142: /** 143: * Data Dictionary Field class holds information about a field 144: **/ 145: class DD_Field 146: { 147: /** 148: * Field name (human) 149: **/ 150: var $name = ""; 151: /** 152: * Field column name (database) 153: **/ 154: var $field = ""; 155: /** 156: * Field type (int, char, text, datetime) 157: **/ 158: var $type = ""; 159: /** 160: * Size (length for char/text or range for int) 161: **/ 162: var $size = 0; 163: /** 164: * Searchable (bool) 165: **/ 166: var $searchable = false; 167: /** 168: * Keyfield flag (bool) 169: **/ 170: var $keyfield = false; 171: /** 172: * Display in standard results flag (bool) 173: **/ 174: var $display = true; 175: /** 176: * Is a foreign key flag (bool) 177: **/ 178: var $foreignkey = false; 179: /** 180: * Binding for foreign key - entity 181: **/ 182: var $foreignentity = ""; 183: /** 184: * Binding for foreign key - field 185: **/ 186: var $foreignfield = ""; 187: /** 188: * Is read-only 189: **/ 190: var $readonly = false; 191: } 192: 193: /** 194: * Data Dictionary Relationship class holds information about inter-entity relationships 195: **/ 196: class DD_Relationship 197: { 198: /** 199: * Relationship type (1t1, 1tm, m2m) 200: **/ 201: var $type = ""; 202: /** 203: * First entity 204: **/ 205: var $firstentity = ""; 206: /** 207: * First field 208: **/ 209: var $firstfield = ""; 210: /** 211: * Second entity 212: **/ 213: var $secondentity = ""; 214: /** 215: * Second field 216: **/ 217: var $secondfield = ""; 218: /** 219: * Link Table (for m2m) 220: **/ 221: var $linktable = ""; 222: /** 223: * Link table first field (blank uses same name as firstfield) 224: **/ 225: var $linkfirst = ""; 226: /** 227: * Link table second field (blank uses same name as secondfield) 228: **/ 229: var $linksecond = ""; 230: } 231: 232: /** 233: * DataDictionary class for FreeDESK - holds all DD information for the system 234: **/ 235: class DataDictionary 236: { 237: /** 238: * FreeDESK instance 239: **/ 240: private $DESK = null; 241: /** 242: * Tables 243: **/ 244: var $Tables = array(); 245: /** 246: * Relationships 247: **/ 248: var $Relationships = array(); 249: 250: /** 251: * Constructor 252: * @param mixed $freeDESK FreeDESK instance 253: **/ 254: function DataDictionary(&$freeDESK) 255: { 256: $this->DESK = &$freeDESK; 257: $this->DESK->PluginManager->Register(new Plugin( 258: "Data Dictionary", "0.01", "Core" )); 259: } 260: 261: /** 262: * Add a table 263: * @param mixed $table Table of type DD_Table 264: **/ 265: function AddTable($table) 266: { 267: $this->Tables[$table->entity] = $table; 268: } 269: 270: /** 271: * Get a table 272: * @param string $table Entity name 273: * @return mixed DD_Table if set otherwise bool false 274: **/ 275: function GetTable($table) 276: { 277: if (isset($this->Tables[$table])) 278: return $this->Tables[$table]; 279: else 280: return false; 281: } 282: 283: /** 284: * Add TO a table (add a field to an existing table) 285: * @param string $table Table entity 286: * @param mixed $field Field (of form DD_Field) 287: **/ 288: function AddToTable($table, $field) 289: { 290: if (isset($this->Tables[$table])) 291: $this->Tables[$table]->Add($field); 292: } 293: 294: /** 295: * Set a field value in a table 296: * @param string $table Table entity 297: * @param string $field Field name 298: * @param string $item Item to set 299: * @param mixed $value Value to set item to 300: **/ 301: function SetFieldVal($table, $field, $item, $value) 302: { 303: if (isset($this->Tables[$table])) 304: $this->Tables[$table]->SetVal($field, $item, $value); 305: } 306: 307: /** 308: * Set a table value 309: * @param string $table Table entity 310: * @param string $item Item to set 311: * @param mixed $value Value to set item to 312: **/ 313: function SetTableVal($table, $item, $value) 314: { 315: if (isset($this->Tables[$table])) 316: $this->Tables[$table]->$item = $value; 317: } 318: 319: /** 320: * Add a relationship 321: * @param mixed $relationship Data of type DD_Relationship 322: **/ 323: function AddRelationship($relationship) 324: { 325: $this->Relationships[] = $relationship; 326: } 327: 328: /** 329: * Add an item - uses RTTI to discover if a table or a relationship 330: * @param mixed $data Data (of type DD_Table or DD_Relationship) 331: **/ 332: function Add($data) 333: { 334: $class = get_class($data); 335: if ($class == "DD_Table") 336: $this->AddTable($data); 337: else if ($class == "DD_Relationship") 338: $this->AddRelationship($data); 339: // Otherwise we have no idea... 340: } 341: } 342: 343: 344: ?> 345: 346: