edit_right = (isset ($values['edit_right']) && Base::is_int ($values['edit_right'])) ? $values['edit_right'] : Base::MODE_NONE; $this->group_id = (isset ($values['group_id']) && Base::is_int ($values['group_id'])) ? $values['group_id'] : 0; $this->group_name = (isset ($values['group_name']) && is_string ($values['group_name'])) ? self::trimmName ($values['group_name']) : ""; $this->id = (isset ($values['id']) && Base::is_int ($values['id'])) ? $values['id'] : 0; Base::session_init (); $this->style = isset ($_SESSION['cms']['style']) ? $_SESSION['cms']['style'] : ""; $this->lc = isset ($_SESSION['cms']['lc']) ? $_SESSION['cms']['lc'] : ""; $this->default_lc = isset ($_SESSION['cms']['default_lc']) ? $_SESSION['cms']['default_lc'] : ""; $this->basename = (isset ($values['name']) && is_string ($values['name'])) ? self::trimmName ($values['name']) : ""; $this->multilingual = $this->lc && Setting::get ("group/{$this->group_name}/{$this->style}{$this->basename}", "multilingual"); $this->name = $this->multilingual ? "{$this->basename}/{$this->lc}" : $this->basename; $this->edit_mode = (isset ($values['edit_mode']) && Base::is_int ($values['edit_mode'])) ? $values['edit_mode'] : Group::getEditMode (); if ($this->id && $db->query ("SELECT group_id, name, status, ticket_id FROM {prefix}element WHERE id={$this->id}")) { $this->group_id = $db['group_id']; $this->name = $db['name']; $this->basename = preg_replace ("/\/.*?$/", "", $db['name']); $this->status = $db['status']; $this->ticket_id = $db['ticket_id']; $this->multilingual = $this->lc && Setting::get ("group/{$this->group_name}/{$this->style}{$this->basename}", "multilingual"); } else if ($this->group_id && $this->name && $db->query ("SELECT id, status, ticket_id FROM {prefix}element WHERE group_id={$this->group_id} AND name='{$this->name}' AND (ticket_id=0 OR (".($this->edit_mode & (Base::MODE_VIEW | Base::MODE_EDIT))." AND (ticket_id=".Ticket::SERVER_ID." OR ticket_id=".Ticket::selected ()."))) ORDER BY ticket_id DESC LIMIT 1")) { $this->id = $db['id']; $this->status = $db['status']; $this->ticket_id = $db['ticket_id']; } if ($this->group_id && !$this->group_name && $db->query ("SELECT name FROM `{prefix}group` WHERE id={$this->group_id}")) { $this->group_name = $db['name']; } } /** * Gibt den Wert für einige Objekt Variablen zurück * * \param name Name der abgefragten Objekt Variable. Definierte namen sind: * - alle privaten Objekt Variablen * * \return Wert der abgefragten Objekt Variable */ public function __get ($name) { if (isset ($this->$name)) { return $this->$name; } else { Base::error ("Undefined property: Element::\$$name"); } } /** * Entfernd aus einem Namen alle für Elementnamen unerlaupten Zeichen * * \param name Name der Normiert werdn soll * * \return Normierter Elementname */ public static function trimmName ($name) { return preg_replace ("/^[^a-zA-Z]+|[^a-zA-Z0-9- \/]/s", "", $name); } /** * Liefert den Binary Dateinamen zur gegebenen id * * \param id id of element, otherwise will use id of active element * * \return filename with path */ public function fileName ($id=-1) { return Setting::get ("config", "filePath") . ($id==-1 ? $this->id : $id); } /** * Setzt Platzhalter-Wert Paare zum Element * * \param values Array mit Platzhalter-Wert Paaren */ public function setPlaceholder ($values) { $this->placeholder = $values; } /** * Ersetzt im angegebenem Text alle definierten Platzhalter durch deren Wert * * \param text Text in dem die Platzhalter ersetzt werden sollen * \param values Array mit Platzhalter-Wert Paaren * * \return Text mit ersätzten Platzhaltern */ public static function replacePlaceholder ($text, $values, $sub=false) { // Zeilenumbrche korregieren $boundary = "-****-"; $text = preg_replace ("/(\[each .+?\]|\[\/each\]|\[if .+?\]|\[else\]|\[\/if\])
/is", "\\1", $text); // '[...]' innerhalb von Links korregieren $text = preg_replace ("/%5B/i", "[", $text); $text = preg_replace ("/%5D/i", "]", $text); if (is_array ($values)) { // Platzhalter ersetzen foreach ($values as $key => $value) { if (is_array ($value)) { while (preg_match ("/(\[$key(\[.+?\]+)\])/s", $text, $erg)) { $erg[4] = self::replacePlaceholder ($erg[2], $value, true); $text = str_replace ($erg[1], $erg[4], $text); } } else { $text = str_replace ("[$key]", str_replace ("]", $boundary, $value), $text); } } // Schleifen durchlaufen (von aussen nach innen) do { $found = false; $cont = ""; while (preg_match ("/.*(\[each (.+?)\](.*?$cont)\[\/each\])/s", $text, $erg)) { $found = $erg; $cont = preg_quote ($erg[1], '/').".*?"; } if ($found) { $erg = $found; $erg[4] = ""; if (is_array ($values[$erg[2]])) { foreach ($values[$erg[2]] as $value) { if (is_array ($value)) { $erg[4] .= self::replacePlaceholder ($erg[3], $value, true); } else { $erg[4] .= self::replacePlaceholder ($erg[3], array ('value'=>$value), true); } } } $text = str_replace ($erg[1], $erg[4], $text); } } while ($found); // remove all unknown variables while (preg_match ("/(\[\w+\])/s", $text, $erg) && $erg[1]!="[else]" && $erg[1]!="[at]" && $erg[1]!="[dot]") { $text = str_replace ($erg[1], "", $text); } // Bedingtes aufl�en while (preg_match ("/.*(\[if (.*?)\](.*?)(\[else\](.*?))?\[\/if\])/s", $text, $erg)) { $erg[2] = html_entity_decode ($erg[2], ENT_QUOTES, "UTF-8"); $erg[4] = @eval ("return $erg[2];") ? $erg[3] : (isset ($erg[5]) ? $erg[5] : ""); $text = str_replace ($erg[1], $erg[4], $text); } } return $sub ? $text : str_replace ($boundary, "]", $text); } /** * Erzeugt ein neues Element falls dieses bisher nur ein Platzhalter ist, oder für das aktuelle Ticket noch keines existiert. * * \return ID des Elementes wenn erfolgreich, sonst 0 */ protected function create () { if (!Ticket::id ()) { return 0; } if ($this->group_id && (!$this->id || $this->ticket_id != Ticket::selected())) { $db = new Database (); $text = ""; $this->status = Base::STATUS_ERASED; $this->ticket_id = Ticket::selected(); if ($this->id && $db->query ("SELECT text FROM {prefix}element WHERE id={$this->id}")) { $text = Database::escape ($db['text']); $this->status = Base::STATUS_OFFLINE; } $db->query ("INSERT INTO {prefix}element (group_id, name, text, status, ticket_id) VALUES ({$this->group_id}, '{$this->name}', '$text', {$this->status}, {$this->ticket_id})"); $this->id = $db->rowid; History::storeAction ("element no changes", $this->id, "element"); } return $this->id; } /** * Dieses Element online oder offline stellen * * \param status Status der gesetzt werden soll (Base::STATUS_ONLINE, Base::STATUS_OFFLINE) * * \return true wenn erfolgreich sonst false */ public function setStatus ($status) { $db = new Database (); if ($status == Base::STATUS_ONLINE && $this->id && !($this->status & Base::STATUS_ONLINE) && $this->ticket_id) { if ($db->query ("SELECT id FROM {prefix}element WHERE group_id={$this->group_id} AND name='{$this->name}' AND ticket_id=0")) { $online_id = $db['id']; } else { $db->query ("INSERT INTO {prefix}element (group_id, name, status) VALUES ({$this->group_id}, '{$this->name}', ".Base::STATUS_ERASED.")"); $online_id = $db->rowid; History::storeAction ("element no changes", $online_id, "element"); } $history = new History ("element set online"); $this->status |= Base::STATUS_ONLINE; if ($db->query ("SELECT text FROM {prefix}element WHERE id={$this->id}")) { $text = Database::escape ($db['text']); $db->query ("UPDATE {prefix}element SET status={$this->status}, text='$text' WHERE id=$online_id"); $history->store ($online_id, "element"); if (file_exists ($this->fileName ($online_id))) { unlink ($this->fileName ($online_id)); } if (file_exists ($this->fileName ())) { copy ($this->fileName (), $this->fileName ($online_id)); } } $db->query ("UPDATE {prefix}element SET status={$this->status} WHERE id={$this->id}"); $history->store ($this->id, "element"); return true; } if ($status == Base::STATUS_OFFLINE && $this->id) { $history = new History ("element set offline"); $history->groupStart(); if ($db->query ("SELECT id, status FROM {prefix}element WHERE group_id={$this->group_id} AND name='{$this->name}'")) { foreach ($db->result as $row) { if ($row['status'] & Base::STATUS_ONLINE) { $id = $row['id']; $newStatus = $row['status'] & (~ Base::STATUS_ONLINE); $db->query ("UPDATE {prefix}element SET status=$newStatus WHERE id=$id"); $history->store ($id, "element"); } } } $history->groupEnd (); return true; } return false; } /** * Prüft ob dieses Element in der Datenbank existiert, also ob es eine ID hat und nict als gelöscht markiert ist * * \return true wenn Element existiert, sonst false */ public function exists () { return ($this->id && !($this->status & Base::STATUS_ERASED)); } /** * Prüft ob dieses Element in der Datenbank existiert, also ob es eine ID hat und nict als gelöscht markiert ist * * \return true wenn Element existiert, sonst false */ public function existsBinary () { return ($this->exists () && file_exists ($this->fileName ())); } /** * liefert den default Wert für das Element * * \return der default Wert */ public function getDefaultValue () { return Setting::get ("group/{$this->group_name}/{$this->style}{$this->basename}", "defaultvalue"); } /** * Liefert den Wert dieses Elementes * * \param default wenn true wird der defaultwert geliefert sofern kein Wert für das Element gesetzt ist * \param replace wenn true werden Platzhalter in dem Wert durch die definierten Platzhalter ersätzt * * \return Wert des Elementes */ public function getValue ($default=false, $replace=false) { $db = new Database (); $text = ""; if ($this->exists () && $db->query ("SELECT text FROM {prefix}element WHERE id={$this->id}")) { $text = $db['text']; } else if ($db->query ("SELECT text FROM {prefix}element WHERE group_id={$this->group_id} AND (name='{$this->basename}' OR name LIKE '{$this->basename}/%') AND (ticket_id=0 OR (".($this->edit_mode & (Base::MODE_VIEW | Base::MODE_EDIT))." AND (ticket_id=".Ticket::SERVER_ID." OR ticket_id=".Ticket::selected ()."))) AND (status=".Base::STATUS_OFFLINE." OR status=".Base::STATUS_ONLINE.") ORDER BY ticket_id DESC, name='{$this->basename}/{$this->default_lc}' DESC, id LIMIT 1")) { $text = $db['text']; } else if ($default) { $text = $this->getDefaultValue (); } if ($replace && $this->placeholder) { $text = self::replacePlaceholder ($text, $this->placeholder); } if (Setting::get ("config", "cmsPath") != "/cms/") { $text = preg_replace ("/\/cms\/\/?file\.php\?/", Setting::get ("config", "cmsPath")."file.php?", $text); } return $text; } /** * Liefert die zu dem Element gespeicherten Binärdaten * * \return Binärdaten des Elementes */ public function getBinary () { if ($this->exists () && file_exists ($this->fileName ())) { return file_get_contents ($this->fileName ()); } return ""; } /** * Liefert die größe der Binärdaten * * \return größe der Binärdaten */ public function getBinarySize () { if ($this->exists () && file_exists ($this->fileName ())) { return filesize ($this->fileName ()); } return 0; } /** * Setzt den Wert dieses Elementes * * \param text Text der gespeichert werden soll * \param binary Binärdaten die gespeichert werden sollen * * \return bei Erfolg die ID des Elementes, sonst 0 */ public function setValue ($text, $binary="") { $db = new Database (); // $text = html_entity_decode ($text, ENT_QUOTES, "UTF-8"); $text = Database::escape ($text); if ($this->exists () && $db->query ("SELECT text FROM {prefix}element WHERE id={$this->id}") && (!$binary && $db['text']==$text || $binary && preg_match ("/&uid=\d+".preg_quote ($text, "/")."$/", $db['text']) && $binary == $this->getBinary ()) ) { // Text und Binärdaten wurden nicht geädert return $this->id; } if ($this->create ()) { $history = new History ("element set"); $history->groupStart(); if ($binary) { if ($fp = @fopen($this->fileName (), "wb")) { fwrite ($fp, $binary); fclose ($fp); } else { return 0; } $text = Database::escape ("/cms/file.php?".Group::ID_REQUEST_NAME."={$this->group_id}&name={$this->name}&uid=".time ().$text); } $this->status = Base::STATUS_OFFLINE; $db->query ("UPDATE {prefix}element SET text='$text', status={$this->status} WHERE id={$this->id}"); $history->store ($this->id, "element"); if ($this->default_lc) { if ($this->multilingual && $this->lc!=$this->default_lc && $db->query ("SELECT id FROM {prefix}element WHERE group_id={$this->group_id} AND name='{$this->basename}' AND (status=".Base::STATUS_ONLINE." OR status=".Base::STATUS_OFFLINE.") AND ticket_id=".Ticket::selected ()." ORDER BY status")) { // rename old nonmultilingual element to default_lc element $id = $db['id']; $db->query ("UPDATE {prefix}element SET name='{$this->basename}/{$this->default_lc}', status=".Base::STATUS_OFFLINE." WHERE id='$id'"); $history->store ($id, "element"); } // del old (non)multilingual elements if ($db->query ("SELECT id FROM {prefix}element WHERE group_id={$this->group_id} AND (('{$this->multilingual}'!='' AND name='{$this->basename}') OR ('{$this->multilingual}'='' AND name LIKE '{$this->basename}/%')) AND ticket_id=".Ticket::selected ())) { foreach ($db->result as $row) { $db->query ("UPDATE {prefix}element SET status=".Base::STATUS_ERASED." WHERE id='{$row['id']}'"); $history->store ($row['id'], "element"); } } } $history->groupEnd (); } return $this->id; } /** * Kopieren eines Elementes * * \param id ID des quell Elementes * * \return bei Erfolg die ID des neuen Elementes, sonst 0 */ public function setCopy ($id) { $db = new Database (); if ($this->create ()) { // Quelle kopieren $text = ""; if ($id && Base::is_int ($id) && $db->query ("SELECT text FROM {prefix}element WHERE id=$id")) { $text = Database::escape ($db['text']); } $this->status = Base::STATUS_OFFLINE; if ($id && Base::is_int ($id) && file_exists ($this->fileName ($id))) { copy ($this->fileName ($id), $this->fileName ()); $text = preg_replace ("/\?".Group::ID_REQUEST_NAME."=[^&]+&name=[^&]+/", "?".Group::ID_REQUEST_NAME."={$this->group_id}&name={$this->name}", $text); } $db->query ("UPDATE {prefix}element SET status={$this->status}, text='$text' WHERE id={$this->id}"); History::storeAction ("element set", $this->id, "element"); } return $this->id; } /** * Löschen des Elementes */ public function del () { $db = new Database (); if ($this->id && !($this->status & Base::STATUS_ERASED) && $this->create ()) { $this->status = Base::STATUS_ERASED; $db->query ("UPDATE {prefix}element SET text='', status={$this->status} WHERE id={$this->id}"); if (file_exists ($this->fileName ())) { unlink ($this->fileName ()); } History::storeAction ("element delete", $this->id, "element"); } } } ?>