/**
* Zgriff auf Editierfunktionen \n
* Funktionen zur Ausgabe von Elementen sowie zur Darstellung von Dots zum Editieren von Texten, Bildern usw.
*
* \author Claus Muus
* \date 27/03/07
*/
class GroupHTML extends Group
{
public $interface = "HTML"; ///< interface typ dieser Klasse
private $viewEditDot = array (); ///< speichert ob der Dot zu einem Datensatz bereits angezeigt wurde
private $style = ""; ///< speichert den verwendeten Sytle
private static $viewEditModeDot = array (); ///< speichert ob der EditModeDot zu einem Datensatz bereits angezeigt wurde
private static $firstCall = true; ///< speichert ob bereits ein Objekt dises Types erzeugt wurde
/**
* Ruft den Konstruktor von Group auf
*
* \param values Ein assoziatives Array das optionalen Eigenschaften der Gruppe setzt (siehe @ref Group::__construct) \
* \param url URL unter welcher die Gruppe angezeigt wird
* \param frameurl URL unter welcher der Bereich angezeigt wird
* \param target Frame in den die Seite geladen werden soll
* \param popup Parameter die einem popup Window Aufruf mitgegeben werden sollen
* \param style Name des styles der für die Dot konfiguration verwendet werden soll
*/
public function __construct ($values)
{
if (isset ($values['list'])) {
parent::__construct ($values);
} else {
// dieses Objekt ist ein top Objekt, ist also das erste Objekt auf einer Website
Ticket::id (Ticket::SERVER_ID); // Der Server verwendet für seine Aktionen immer das Ticket '1', und es wird hier definiert, damit die Ticket-Session nicht überschrieben wird
$isset_parent_id = isset ($values['parent_id']);
$values['parent_id'] = isset ($values['parent_id']) ? $values['parent_id'] : (!isset ($values['id']) && isset ($_REQUEST[Group::ID_REQUEST_NAME]) ? $_REQUEST[Group::ID_REQUEST_NAME] : 0);
$values['name'] = "/" . (isset ($values['name']) ? $values['name'] : "");
$values['frameurl'] = isset ($values['frameurl']) ? $values['frameurl'] : (isset ($values['url']) ? $values['url'] : Setting::get ("config", "documentUrl"));
Base::session_open ();
if (isset ($values['id']) && self::$firstCall && isset ($_SESSION['cms']['frame'][$values['id']])) {
$values['url'] = $_SESSION['cms']['frame'][$values['id']]['parent_url'] . (strstr ($_SESSION['cms']['frame'][$values['id']]['parent_url'], "?") ? "&" : "?") . "cms_frame[".urlencode($_SESSION['cms']['frame'][$values['id']]['target'])."]=".urlencode($values['frameurl']);
$values['target'] = isset ($values['target']) ? $values['target'] : $_SESSION['cms']['frame'][$values['id']]['target'];
} else {
$values['url'] = !empty ($values['url']) ? $values['url'] : Setting::get ("config", "documentUrl");
}
parent::__construct ($values);
if ($this->edit_mode & Base::MODE_EDIT) {
// Link der im Editor für links auf diese Seite gesetzt werden soll
$site_number = Group::getSiteNumber ();
$_SESSION['cms']['group'][$site_number]['link']['url'] = $this->url;
$_SESSION['cms']['group'][$site_number]['link']['popup'] = isset ($values['popup']) ? $values['popup'] : "";
if (isset ($values['id']) && self::$firstCall) {
$_SESSION['cms']['group'][$site_number]['link']['frameurl'] = isset ($values['frameurl']) ? $values['frameurl'] : "";
$_SESSION['cms']['group'][$site_number]['link']['target'] = isset ($values['target']) ? $values['target'] : "";
$_SESSION['cms']['group'][$site_number]['id'] = isset ($values['id']) ? $values['id'] : 0;
}
}
$_SESSION['cms']['style'] = isset ($values['style']) ? ($values['style']."/") : "";
$_SESSION['cms']['referer'] = ($isset_parent_id && isset ($_SESSION['cms']['referer'])) ? $_SESSION['cms']['referer'] : $this->url;
$_SESSION['cms']['default_lc'] = isset ($values['default_lc']) ? preg_replace ("/[^a-zA-Z]/s", "", $values['default_lc']) : (isset ($_SESSION['cms']['default_lc']) ? $_SESSION['cms']['default_lc'] : "en");
$_SESSION['cms']['lc'] = isset ($values['lc']) ? preg_replace ("/[^a-zA-Z]/s", "", $values['lc']) : (isset ($_SESSION['cms']['lc']) ? $_SESSION['cms']['lc'] : $_SESSION['cms']['default_lc']);
$this->style = $_SESSION['cms']['style'];
Base::session_close ();
if (empty ($values['id'])) {
$this->createTop ();
}
if (isset ($values['id']) && self::$firstCall) {
self::$firstCall = false;
echo "";
function script ($content)
{
return "";
}
ob_start ("script");
}
}
}
/**
* Liefert einen Javascript Block der im header Bereich der Websiten eingesetzt werden muss
*
* \return Javascript Block als String
*/
public static function head ()
{
Base::session_init ();
$cmsPath = Setting::get ("config", "cmsPath");
$cmsPathAbs = Setting::get ("config", "documentRoot").$cmsPath;
$text = "";
if (self::$firstCall) {
$text .= "\n";
if (User::get ("id")) {
$text .= "\n";
$text .= "\n";
}
}
if (User::get ("id")) {
$text .= "\n";
}
$text .= "\n";
return $text;
}
/**
* Liefert ein Array mit Codeschnipseln die vor und hinter Gruppen eingefügt werden können um die Darstellung der Hervorhebung beim Rollover im Kontextmenü zu optimieren
*
* \return Array mit den Feldern before und after
*/
public function mark ()
{
return (Group::getEditMode () & Base::MODE_EDIT) ? Array ('before' => "", 'after' => "") : Array ('before' => "", 'after' => "");
}
public static function target ($name)
{
return "";
}
/**
* Gibt einen Editierdot zurück.
* Wird der Name weckgelassen wird ein Listen Dot angezeigt.
*
* \param names Name des Elementes zu dem der Dot angezeigt werden soll oder ein Array mit Namen von Elementen.
* \param attributes Assoziatives Array mit Attributen die für das Element gesetzt werden sollen
*
* \return String zum anzeigen eines Editier Dots
*/
public function edit ($names="", $attributes=NULL)
{
$this->storeAttributes ($names, $attributes);
return $this->getEditDot ($names);
}
/**
* Liefert den Wert eines Elementes.
*
* \param name Name des Elementes dessen Wert abgefragt wird
* \param attributes Assoziatives Array mit Attributen die für das Element gesetzt werden sollen
*
* \return Der Wert des Elementes
*/
public function value ($names, $attributes=NULL)
{
$name = $this->getName ($names);
if ($name) {
$this->storeAttributes ($names, $attributes);
$attributes['showName'] = Setting::get ("group/{$this->name}/{$this->style}$name", "showName");
$value = $this->element ($name)->getValue (empty ($attributes['showName']) && empty ($attributes['default']), true);
$value = ($value || empty ($attributes['showName'])) ? $value : I18n::tr ("dot", $name);
$value = ($value || empty ($attributes['default'])) ? $value : $attributes['default'];
return $value;
}
return "";
}
/**
* Gibt den Text eines Elementes und den dazugehörigen Editierdot (zum Editieren im html-Modus) zurück.
* Der Text ist von span-Tags umschlossen, damit er wehrend der Eingabe aktualisiert werden kann.
*
* \param names Name des Elementes das angezeigt werden soll oder ein Array mit Namen von Elementen (hierbei wird das erste Element angezeigt jedoch werden alle Editiert).
* \param attributes Assoziatives Array mit Attributen die für das Element gesetzt werden sollen
*
* \return Wert des Elementes, von span-Tags umschlossen, und der dazugehörige Editierdot
*/
public function html ($names, $attributes=NULL)
{
return $this->text ($names, is_array ($attributes) ? array_merge (array ('type' => "html"), $attributes) : array ('type' => "html"));
}
/**
* Gibt den Text eines Elementes und den dazugehörigen Editierdot zurück.
* Der Text ist von span-Tags umschlossen, damit er wehrend der Eingabe aktualisiert werden kann.
*
* \param names Name des Elementes das angezeigt werden soll oder ein Array mit Namen von Elementen (hierbei wird das erste Element angezeigt jedoch werden alle Editiert).
* \param attributes Assoziatives Array mit Attributen die für das Element gesetzt werden sollen \n
* attributes['showName'] zeitgt an, das der Name des Elementes zurckgegeben werden soll, wenn kein Wert gesetzt ist
*
* \return Wert des Elementes, von span-Tags umschlossen, und der dazugehörige Editierdot
*/
public function text ($names, $attributes=NULL)
{
$name = $this->getName ($names);
if ($name) {
$this->storeAttributes ($names, $attributes, "text");
$attributes['showName'] = Setting::get ("group/{$this->name}/{$this->style}$name", "showName");
$dot = $this->getEditDot ($names);
$elementid = "cms_element_".$this->group_number."_".$name;
$value = $this->element ($name)->getValue (empty ($attributes['showName']) && empty ($attributes['default']), true);
$value = ($value || empty ($attributes['showName'])) ? $value : I18n::tr ("dot", $name);
$value = ($value || empty ($attributes['default'])) ? $value : $attributes['default'];
if (!$value && !isset ($attributes['default']) && Setting::get ("group/{$this->name}/{$this->style}$name", "type") == "html") {
$value = Setting::get ("group/{$this->name}/{$this->style}$name", "tag_p") ? "
" : " ";
}
return (Group::getEditMode () & Base::MODE_EDIT) ? "$dot$value" : $value;
}
return "";
}
/**
* Gibt das eingegebene Datum (definierten Format) und den dazugehörigen Editierdot zurück.
* Das Datum ist von span-Tags umschlossen, damit er wehrend der Eingabe aktualisiert werden kann.
*
* \param names Name des Elementes das angezeigt werden soll oder ein Array mit Namen von Elementen (hierbei wird das erste Element angezeigt jedoch werden alle Editiert).
* \param attributes Assoziatives Array mit Attributen die für das Element gesetzt werden sollen
* attributes['dateformat'] legt das Ausgabeformat fest, in dem das Datum angezeigt werden soll
*
* \return Wert des Elementes im definierten datumsformat, von span-Tags umschlossen, und der dazugehörige Editierdot
*/
public function date ($names, $attributes=NULL)
{
$name = $this->getName ($names);
if ($name) {
$this->storeAttributes ($names, $attributes, "date");
$dot = $this->getEditDot ($names);
$elementid = "cms_element_".$this->group_number."_".$name;
$value = $this->element ($name)->getValue (true);
$dateformat = Setting::get ("group/{$this->name}/{$this->style}$name", "dateformat");
if ($dateformat && strtotime ($value)) {
$datelocale = Setting::get ("group/{$this->name}/{$this->style}$name", "datelocale");
if ($datelocale) {
setlocale (LC_TIME, $datelocale);
}
$value = utf8_encode (strftime ($dateformat, strtotime ($value)));
}
return (Group::getEditMode () & Base::MODE_EDIT) ? "$dot$value" : $value;
}
return "";
}
/**
* Gibt ein Element als Bild und den dazugehörigen Editierdot zurück.
*
* \param names Name des Elementes das angezeigt werden soll oder ein Array mit Namen von Elementen (hierbei wird das erste Element angezeigt jedoch werden alle Editiert).
* \param attributes Assoziatives Array mit Attributen die für das Element gesetzt werden sollen
* attributes['width'] und attributes['height'] legen die Abmessungen des Bildes fest
*
* \return Wert des Elementes im definiertem datumsformat, von span-Tags umschlossen, und der dazugehörige Editierdot
*/
public function image ($names, $attributes=NULL)
{
$name = $this->getName ($names);
if ($name) {
$this->storeAttributes ($names, $attributes, "image");
$dot = $this->getEditDot ($names);
$elementid = "cms_element_".$this->group_number."_".$name;
$src = $this->element ($name)->getValue (empty ($attributes['default']));
if ($src) {
$src = $src . ((SID && strstr ($src, "?")) ? ("&".SID) : "");
} else {
$src = isset ($attributes['default']) ? $attributes['default'] : Setting::get ('config', 'cmsPath')."/images/1x1.gif";
}
$attributes = (is_array ($attributes)) ? $attributes : array ();
$attributes['width'] = (isset ($attributes['width'])) ? $attributes['width'] : preg_replace ("/.*[&\?]width=(\d+).*|.*/", "\\1", $src);
$attributes['height'] = (isset ($attributes['height'])) ? $attributes['height'] : preg_replace ("/.*[&\?]height=(\d+).*|.*/", "\\1", $src);
$border = Setting::get ("group/{$this->name}/{$this->style}$name", "image_border");
$attributes['border'] = ($border!="") ? $border : ((isset ($attributes['border'])) ? $attributes['border'] : "");
$attrib = "";
foreach ($attributes as $key => $val) {
$attrib .= " $key='$val'";
}
if (preg_match ("/type=video\/mp4|\.mp4/", $src)) {
$value = "";
} else if ($src) {
$value = "";
} else {
$value = "";
}
return (Group::getEditMode () & Base::MODE_EDIT) ? "$dot$value" : $value;
}
return "";
}
/**
* Liefert eine ID für einen Tag dessen Attribut bei Änderungen aktualesiert werden soll
*
* \param name Name des Elementes
* \param attribute Name des Attributes das bei Änderungen aktualesiert werden soll. Wird dieser Parameter weckgelassen, wird der Inhalt des Tags aktualisiert
*
* \return Der Wert des Elementes
*/
public function updateId ($name, $attribute="")
{
$name = $this->getName ($name);
$attributes = array ();
$attributes['update_id'] = true;
$attributes['update_attribute'] = $attribute;
foreach ($attributes as $key => $value) {
Setting::initialise ("group/{$this->name}/{$this->style}$name", $key, $value, false);
}
return "cms_update_".$this->group_number."_".$name;
}
/**
* Liefert einen html-Codeschnipseln der einen Editier Dot anzeigt.
* Wird der Name weckgelassen wird ein Listen Dot angezeigt.
*
* \param names Name des Elementes zu dem der Dot angezeigt werden soll oder ein Array mit Namen von Elementen.
*
* \return String zum anzeigen eines Editier Dots
*/
private function getEditDot ($names)
{
$name = $this->getName ($names);
if ($this->parent_id && ( // Wenn ein parent Eintrag existiert
($name && ($this->edit_mode & $this->edit_right & Base::MODE_EDIT) && (!isset($this->viewEditDot[$name]))) || // und wenn der Dot mit dem gegebenem Namen noch nicht angezeigt wird
(!$name && $this->list && $this->list->parent && ($this->list->parent->edit_mode & $this->edit_right & Base::MODE_EDIT) && !isset(self::$viewEditModeDot["{$this->parent_id}_{$this->name}"])))) // oder wenn es ein EditMode-Dot ist (kein Name) und er noch nicht angezeigt wird
{
if (is_array ($names)) {
foreach ($names as $key => $value) {
$names[$key] = Element::trimmName (is_array ($value) ? $key : $value);
}
}
// Speichern das dieser Dot bereits angezeigt wird, damit jeder Dot nur einmal angezeigt wird
if ($name) {
if (is_array ($names)) {
foreach ($names as $row) {
$this->viewEditDot[Element::trimmName ($row)] = true;
}
} else {
$this->viewEditDot[$name] = true;
}
} else {
Group::initEditMode ("{$this->parent_id}_{$this->name}", Base::MODE_VIEW | ($this->id ? 0 : Base::MODE_EDIT));
self::$viewEditModeDot["{$this->parent_id}_{$this->name}"] = true;
}
if (is_array ($names)) {
Setting::set ("group/{$this->name}/{$this->style}$name", "names", implode (",", $names), false);
} else if (Setting::get ("group/{$this->name}/{$this->style}$name", "names")) {
Setting::set ("group/{$this->name}/{$this->style}$name", "names", "", false);
}
$this->setSiteGroup ($name);
$dotid = "cms_dot_".$this->group_number."_".$name;
$site_number = Group::getSiteNumber ();
return "";
}
return "";
}
private function getName ($names)
{
$name = is_array ($names) ? current ($names) : $names;
$name = is_array ($name) ? key ($names) : $name;
$name = is_string ($name) ? Element::trimmName ($name) : "";
return $name;
}
private function storeAttributes ($names, $attributes=NULL, $type="")
{
if (!$this->edit_mode) {
return "";
}
$result = array ();
$names = is_array ($names) ? $names : array ($names);
foreach ($names as $n => $a) {
if ($attributes) {
if (is_array ($a)) {
$a = array_merge ($attributes, $a);
} else {
$n = $a;
$a = $attributes;
}
$attributes = null;
}
if ($type) {
if (is_array ($a)) {
$a['type'] = isset ($a['type']) ? $a['type'] : $type;
} else {
$n = $a;
$a = array ('type'=>$type);
}
$type = null;
}
$n = (is_string ($n)) ? Element::trimmName ($n) : "";
if ($n && is_array ($a)) {
switch (isset ($a['type']) ? $a['type'] : "") {
case "text":
$a = array_merge (array ('symbol' => "text", 'left' => -15), $a);
break;
case "textarea":
$a = array_merge (array ('symbol' => "textarea", 'left' => -15), $a);
break;
case "html":
$a = array_merge (array ('symbol' => "html", 'left' => -15, 'link_this' => 1, 'link_child' => 1, 'tag_p' => 1, 'tag_br' => 1, 'tag_blockquote' => 1, 'tag_ul' => 1, 'tag_table' => 1, 'tag_strong' => 1, 'tag_em' => 1, 'tag_a' => 1, 'tag_h1' => 1, 'tag_h2' => 1, 'tag_img' => 1), $a);
break;
case "light":
case "htmllight":
case "html light":
$a = array_merge (array ('symbol' => "html", 'left' => -15, 'link_this' => 1, 'link_child' => 1, 'tag_p' => false, 'tag_br' => false, 'tag_blockquote' => false, 'tag_ul' => false, 'tag_table' => false, 'tag_strong' => 1, 'tag_em' => 1, 'tag_a' => 1, 'tag_h1' => false, 'tag_h2' => false, 'tag_img' => false), $a, array ('type' => "html"));
break;
case "date":
$a = array_merge (array ('symbol' => "date", 'left' => -15, 'datelocale' => "de_DE", 'dateformat' => "%e. %b %Y", 'set_default_date' => 1), $a);
break;
case "image":
$a = array_merge (array ('symbol' => "image", 'left' => -15), $a);
foreach (array ('width', 'height', 'border', 'align') as $key) {
if (isset ($a[$key])) {
$a["image_$key"] = $a[$key];
unset ($a[$key]);
}
}
break;
}
if (!empty ($a['showName']) && empty ($a['defaultvalue'])) {
$a['defaultvalue'] = $n;
}
foreach ($a as $key => $value) {
Setting::initialise ("group/{$this->name}/{$this->style}$n", $key, $value, false);
}
}
}
}
}
?>