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

  1: <?php 
  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: