Stellt die grundlegendste Stufe der Hausklassen dar * -> Speichert alle bekannten Daten ausser der $id im $data array * -> Ist in der Lage, Informationen einzulesen * -> Wird von allen höheren Schichten als gemeinsame Datenverwaltung verwendet und beim erzeugen von spezialisierten * Unterklassen gefressen [eat()] * -> Stellt Speicherfunctionalität für die haus-Klasen zur Verfügung * -> Bietet die Möglichkeit, auftretende Eigenschaftsveränderungen in zu speichern * -> Handhabt die Prüfung auf Änderungen */ class haus_basic { /** * Container für alle vorhenden, in dieser Stufe allerdings unwichtigen Informationen * @var array Datencontainer */ var $data; /** * Liste aller veränderten Datensätze. Für den Update-Vorgang interessant * @var array Changes-Liste */ var $changes; /** * Erzeugt ein Basis-Haus zur weiteren Verwenung * Kann eine höhere Instanz fressen und deren Daten wieder in den Pool einlesen. * Soll keine höhere instanz gefressen werden, so werden standardmäßig alle daten aus der DB gelesen * Dies kann durch den Zweiten Parameter unterbunden oder im dritten Parameter spezifiziert werden * * @param haus_basic or int $eat Zu fressende Daten oder ID * @param bool $elseread Daten aus der DB lesen wenn kein $eat * @param array $toread Zu lesende Felder aus der DB * @return haus_basic */ function haus_basic($in=false,$elseread=true,$toread=array("*")) { if(is_object($in)) { $this->eat($in); } elseif (is_array($in)) { $this->load($in); } elseif($elseread && (is_numeric($in) || is_numeric((int) $in))) { $this->set(HAUS_ID_FIELD,(int) $in); $this->read($toread); } else { stirb("Fehler beim erzeugen einer Haus-Instanz",$in,__FILE__,__LINE__); } } /** * [eat()]-Implementierung unterster Stufe * Liest alle Datein eines Objekts ein und speichert diese in $data * Nur die $id wird direkt als Attribut abgelegt * * @param haus_basic $eat Zu fressendes Objekt */ function eat($eat) { if (!is_a($eat,"haus_basic")) stirb("Es wurde ein falsches Objekt zum fressen übergeben",$this,__FILE__,__LINE__); $d = get_object_vars($eat); $this->set(HAUS_ID_FIELD,$d['id']); $new = array_merge($d['data'],$d); unset($new['data']); $this->data = array_merge($this->data,$new); } /** * Liest die gewünschten Felder aus der Datenbank ein * Über den Parameter können die gewünschten Parameter spezifiziert werden * * @param array $toread Gewünschte Felder */ function read($toread) { $instr = strpos(HAUS_DATA_CLASSES,get_class($this)) !== false ? 'INNER JOIN `'.HAUS_DATA_TABLE.'` `d` USING(`'.HAUS_ID_FIELD.'`)' : ''; $sql = "SELECT ".implode(', ',$toread)." FROM ".HAUS_TABLE." `h` ".$instr." WHERE `".HAUS_ID_FIELD."` = ".$this->get(HAUS_ID_FIELD)." LIMIT 1"; $result = dying_query($sql,"Fehler beim Einlesen von Hausdaten aus der Datenbank",__FILE__,__LINE__); $this->load(db_fetch_assoc($result)); } /** * Läd Daten aus einem Assioziativem Array ein * @param array $indata Einzulesende Daten */ function load($indata) { $id = $this->get(HAUS_ID_FIELD); if(!empty($indata[HAUS_ID_FIELD]) && (empty($id))) $this->set(HAUS_ID_FIELD,$indata[HAUS_ID_FIELD]); if(!empty($indata['changes'])) $this->changes = $indata['changes']; $this->data = $indata; } /** * Allgemeine Speicherfunktion zum persistentmachen des Objektes * Speichert nur die veränderten Werten */ function save() { if(!empty($this->changes)) { // Multi-Update, wenn das Objekt einer der gelisteten Klassen angehört $instr = strpos(HAUS_DATA_CLASSES,get_class($this)) !== false ? 'INNER JOIN `'.HAUS_DATA_TABLE.'` `d` USING(`'.HAUS_ID_FIELD.'`)' : ''; $sql = 'UPDATE `' . HAUS_TABLE . '` `h` '.$instr.' SET '; $notfirst = false; foreach($this->changes as $key) { if($notfirst) $sql .= ', '; $sql .= sprintf("`%s`='%s'", $key, $this->get($key)); $notfirst = true; } $sql .= ' WHERE `' . HAUS_ID_FIELD . '` = ' . $this->get(HAUS_ID_FIELD); dying_query($sql,"Fehler beim Speichern des Hauses", __FILE__, __LINE__); } } /** * Allgemeiner Setter für alle Eigenschaften * Speichert Daten als Variable so vorhanden, sonst im Data-Array * Braucht daher normalerweise nicht Überschrieben werden * @param string $key Variablenname * @param mixed $val Neuer Wert */ function set($key,$val) { if(isset($this->$key)) { $this->$key = $val; } else $this->data[$key] = $val; $this->changes[] = $key; } /** * Allgemeiner Getter für alle Eigenschaften * Liest Daten aus Variable so vorhanden, sonst aus dem Data-Array * Braucht daher normalerweise nicht Überschrieben werden * @param string $key Variablenname * @return mixed */ function get($key) { if(isset($this->$key)) return $this->$key; else return $this->data[$key]; } function find($whereclause='1',$asid=true,$order_by=HAUS_ID_FIELD) { $sql = 'SELECT '.($asid?'`'.HAUS_ID_FIELD.'`':'*').' FROM `'.HAUS_TABLE.'` WHERE '.$whereclause.' ORDER BY '.$order_by; $res = db_query($sql) or stirb("Fehler beim Suchen von Häusern nach bestimmten Kriterien",null,__FILE__,__LINE__); $ret =array(); for($i=0,$max=db_num_rows($res);$i<$max;$i++) { $row = db_fetch_assoc($res); $ret[] = $asid ? $row[HAUS_ID_FIELD] : new haus_basic($row); } return $ret; } /** * Sucht nach dem Haus eines bestimmten Users und erzeugt direkt ein haus_basic Objekt * * @param int $userid * @return haus_basic */ function findByUser($userid,$asid=true,$wherelevel=false) { $sql ='SELECT `h`.'.($asid?'`'.HAUS_ID_FIELD.'`':'*').' FROM `'.HAUS_TABLE.'` `h` INNER JOIN `'.HAUS_KEY_TABLE.'` `k` USING(`'.HAUS_ID_FIELD.'`) WHERE `k`.`acctid`='.$userid; if ($wherelevel) $sql .= ' AND `h`.`level` = '.$wherelevel; $sql .= ' GROUP BY `house_id`'; $res = db_query($sql) or stirb("Fehler beim Lesen der Häuser für den User '".$userid."'",null,__FILE__,__LINE__); $ret = array(); for($i=0,$max=db_num_rows($res);$i<$max;$i++) { $row = db_fetch_assoc($res); $ret[] = $asid ? $row[HAUS_ID_FIELD] : new haus_basic($row); } return $ret; } } ?>