$row['id'], 'name' => $row['name'], 'is_active' => ($row['id'] == $activeId), 'has_timer' => $row['timer_id'] ); } } return array ( 'main' => true, 'changed' => (Group::getEditMode () & Base::MODE_ONLINE), 'symbol' => ((Group::getEditMode () & Base::MODE_EDIT) ? "open" : "close") . "_light", 'title' => I18n::tr ("cms", "edit all"), 'left' => 0, 'top' => 0, 'ticket' => $tickets, ); } if (!Group::getSiteGroup ($site_number, $group_number)) { return array (); } $db = new Database (); $group = Group::getSiteGroup ($site_number, $group_number); $group_id = $group['id']; $group_name = $group['name']; $parent_id = $group['parent_id']; $edit_right = $group['edit_right']; $link_id = $group['link_id']; $link_name = $group['link_name']; $online_id = $group_id; $style = isset ($_SESSION['cms']['style']) ? $_SESSION['cms']['style'] : ""; $lc = isset ($_SESSION['cms']['lc']) ? $_SESSION['cms']['lc'] : ""; $default_lc = isset ($_SESSION['cms']['default_lc']) ? $_SESSION['cms']['default_lc'] : ""; $names = Setting::get ("group/$group_name/$style$name", "names"); $names = $names ? $names : $name; $names_list = "'".implode ("','", explode (",", $names))."'"; $online = false; // dieser Eintrag ist online $changed = false; // dieser eintrag ist online, wurde jedoch geändert (dadurch ist das momentan sichtbare nicht online) $offline = false; // dieser Eintrag ist online, jedoch ist ein Parent offline (wodurch dieser Eintrag auch offline ist) $order = false; // die Reihenfolge der Einträge hat sich geändert $link = 0; // ID des linkzieles, wenn dieser Eintrag ein Link ist $link_to_list = 0; // ID des linkzieles, wenn dieser Eintrag ein Link auf eine Liste ist $symbol = ""; // name des Symbols das dieses Element hat $title = ""; // der Titel des Elementes $left = 0; // Position des Dots (offset) $top = 0; // Position des Dots (offset) $may_set_online = false; // der angemeldete User darf diesen Eintrag online stellen $history = array (); // Liste der History Einträge $linked = array (); // Liste der Einträge die auf diesen verlinken $timer = array (); // liste der Timer die bei diesem Eintrag gesetzt sind $element_id = 0; // Daten ID, nur für die Anzeige im Titel (nur für Admins) $disable_list = true; // es sind keine Grupen in dieser Liste $enable_deleted = false; // es wurde eine Gruppe gelöscht/ausgeschnitten $showvalue = ""; if ($name) { // Edit Dot // Gruppe auf online prüfen if ($group_id && $db->query ("SELECT online_group_id, status FROM `{prefix}group` WHERE id={$group_id}")) { $online_id = $db['online_group_id'] ? $db['online_group_id'] : $group_id; $online = $db['status'] & Base::STATUS_ONLINE; } // Gruppe auf geändert prüfen if (!$online && $group_id != $online_id && $db->query ("SELECT status FROM `{prefix}group` WHERE id={$online_id}")) { $changed = ($db['status'] & Base::STATUS_ONLINE); } // prüfen ob dieser Eintrag verlinkt (ein Linkziel) ist, und sucht die Link quellen zusammensuchen if ($group_id && $db->query ("SELECT DISTINCT id, url FROM `{prefix}group` WHERE (link_group_id=$online_id AND link_group_name='' OR link_group_id=$parent_id AND link_group_name='$group_name') AND id!=$online_id AND (parent_group_id!=$link_id OR name!='$link_name') AND (ticket_id=0 OR ticket_id=".Ticket::SERVER_ID." OR ticket_id=".Ticket::selected ().") AND !(status&".(Base::STATUS_ERASED | Base::STATUS_ARCHIVED).") GROUP BY url ORDER BY id")) { $linked = $db->result; } // Link auf online prüfen if ($link_id && $db->query ("SELECT online_group_id, status, name FROM `{prefix}group` WHERE id={$link_id}")) { $online_id = $db['online_group_id'] ? $db['online_group_id'] : $link_id; $online &= $db['status'] & Base::STATUS_ONLINE; $group_name = $db['name']; } // add language specific names to list of element names for this dot if ($lc) { foreach (explode (",", $names) as $n) { if ($db->query ("SELECT DISTINCT name FROM {prefix}element WHERE group_id={$online_id} AND name LIKE '$n/%' AND (ticket_id=0 OR ticket_id=".Ticket::SERVER_ID." OR ticket_id=".Ticket::selected ().") AND status!=".Base::STATUS_ERASED)) { foreach ($db as $row) { $names_list .= ",'{$row['name']}'"; } } } } // Elemente auf online prüfen if ($online && $db->query ("SELECT status FROM {prefix}element WHERE group_id=$online_id AND name IN ($names_list) AND ticket_id=0 AND status!=".Base::STATUS_ERASED."")) { foreach ($db as $row) { $online &= $row['status'] & Base::STATUS_ONLINE; } } else { $online = false; } // alle Elemente auf online oder geändert prüfen if ($online && $db->query ("SELECT status, name FROM {prefix}element WHERE group_id=$online_id AND name IN ($names_list) AND (ticket_id=".Ticket::SERVER_ID." OR ticket_id='".Ticket::selected ()."') AND status!=".Base::STATUS_ERASED." ORDER BY name, ticket_id DESC")) { $lastname = ""; foreach ($db as $row) { if ($lastname != $row['name']) { $online &= $row['status'] & Base::STATUS_ONLINE; } $lastname = $row['name']; } $changed = (!$online); } // Werte im Titel anzeigen if ($db->query ("SELECT name, text FROM {prefix}element WHERE group_id={$online_id} AND name IN ($names_list) AND (ticket_id=0 OR ticket_id=".Ticket::SERVER_ID." OR ticket_id=".Ticket::selected ().") AND status!=".Base::STATUS_ERASED." ORDER BY ticket_id ASC")) { $values = array (); foreach ($db as $row) { $values[$row['name']] = $row['text']; } foreach ($values as $key => $row) { $setting = Setting::get ("group/$group_name/$style$key"); if (!empty ($setting['showvalue'])) { if ($setting['type'] == "select" && isset ($setting['selections'])) { $showvalue .= " (".preg_replace ("/.*(^|\n)".preg_quote ($row, '/')." *<([^>]*)>.*|.*/s", "\\2", $setting['selections']).")"; } else { $showvalue .= " ($row)"; } } } } // element ID holen if ($db->query ("SELECT id FROM {prefix}element WHERE group_id={$online_id} AND (name='$name' OR name LIKE '$name/%') AND (ticket_id=0 OR ticket_id=".Ticket::SERVER_ID." OR ticket_id=".Ticket::selected ().") ORDER BY ticket_id DESC, name='$name' DESC, name='$name/$lc' DESC, name='$name/$default_lc' DESC LIMIT 1")) { $element_id = $db['id']; } if ($group_id) { // prüfen ob dieser Eintrag einen Timer hat if ($db->query ("SELECT t.id, time, g.timer_id FROM `{prefix}group` g, {prefix}timer t WHERE (g.id={$online_id} OR g.id={$group_id}) AND (t.id=g.timer_id OR t.id=-g.timer_id) AND (t.ticket_id=0 OR t.ticket_id=".Ticket::SERVER_ID." OR t.ticket_id=".Ticket::selected ().") ORDER BY time")) { foreach ($db as $row) { $timer[] = Array ('id' => $row['id'], 'time' => $row['time'], 'action' => I18n::tr ("cms", ($row['timer_id']>0) ? "set online" : "set offline")); } } // History Liste $history = History::getList ($group_id, "group", true, 5); } else { // prüfen ob dieser Eintrag einen Timer hat if ($db->query ("SELECT t.id, time, g.timer_id FROM `{prefix}group` g, {prefix}timer t WHERE g.parent_group_id={$parent_id} AND g.name='{$group_name}' AND (g.status&".(Base::STATUS_ERASED | Base::STATUS_ARCHIVED).") AND (t.id=g.timer_id OR t.id=-g.timer_id) AND (t.ticket_id=0 OR t.ticket_id=".Ticket::SERVER_ID." OR t.ticket_id=".Ticket::selected ().") ORDER BY time")) { foreach ($db as $row) { $timer[$row['id']] = Array ('id' => $row['id'], 'time' => $row['time'], 'action' => I18n::tr ("cms", ($row['timer_id']>0) ? "set online" : "set offline")); } } // History Liste der gelöschten Gruppen $count = 0; foreach (History::getList (0, "group", true, 0, "group delete") as $action) { if ($action['status'] != History::STATUS_ERASED) { $parent = Group::getParent ($action['row_id']); if ($parent && $parent['id'] == $parent_id) { // nur Undos zu diesem Parent if ($undo = History::getUndo ($action['id'])) { $history[] = $undo; if (++$count == 5) { break; } } } } } // History Liste der durch undo entfernten Gruppen $count = 0; foreach (History::getList (0, "group", true, 50, "group no changes") as $action) { $parent = Group::getParent ($action['row_id']); if ($parent && $parent['id'] == $parent_id) { // nur Redos zu diesem Parent if ($redo = History::getRedo ($action['id'])) { $history[] = $redo; if (++$count == 5) { break; } } } } $count = 0; foreach (History::getList (0, "group", true, 50, "group no changes all") as $action) { $parent = Group::getParent ($action['row_id']); if ($parent && $parent['id'] == $parent_id) { // nur Redos zu diesem Parent if ($redo = History::getRedo ($action['id'])) { $history[] = $redo; if (++$count == 5) { break; } } } } } foreach ($history as $key => $row) { $history[$key]['name'] = I18n::tr ("history", $history[$key]['name']); $history[$key]['deleted'] = $history[$key]['status']==History::STATUS_ERASED; $history[$key]['is_active'] = $history[$key]['status']==History::STATUS_ACTIVE; } $link = $link_id; $link_to_list = $link_id && $link_name; $symbol = Setting::get ("group/$group_name/$style$name", "symbol"); $title = I18n::tr ("dot", Setting::get ("group/$group_name/$style$name", "name", $name)) . $showvalue . ((User::get ('is_admin')) ? " #{$group_number} / $element_id" : ""); } else { // Edit Mode Dot $all_online = Base::STATUS_ONLINE; // Alle Gruppen $groups = Group::getChildList ($parent_id, $group_name); foreach ($groups as $row) { // Alle durch Links eingebundene Gruppen if ($row['link_group_id'] && !$row['link_group_name']) { // Einzelne Gruppe verlink $parent = Group::getParent ($row['link_group_id']); foreach (Group::getParent ($parent['id'], $parent['name']) as $row2) { if ($row2['id'] == $row['link_group_id'] || $row2['online_group_id'] == $row['link_group_id']) { $groups[] = $row2; } } } else if ($row['link_group_id'] && $row['link_group_name']) { // Komplette Liste verlink array_splice ($groups, 0, 0, Group::getChildList ($row['link_group_id'], $row['link_group_name'])); } } foreach ($groups as $row) { $id = $row['id']; $online_id = $row['online_group_id'] ? $row['online_group_id'] : $id; $online = $row['status'] & Base::STATUS_ONLINE; $link_id = $row['link_group_id']; $link_name = $row['link_group_name']; $row_parent_id = $row['parent_group_id']; // Gruppen auf geänderte Reihenfolge prüfen if (!$online && $id != $online_id && $db->query ("SELECT status FROM `{prefix}group` WHERE id=$online_id")) { // Reihenfolge hat sich eventuell geändert $changed |= ($db['status'] & Base::STATUS_ONLINE); } // alle Elemente auf online prüfen if ($online && $db->query ("SELECT status FROM {prefix}element WHERE group_id=$online_id AND ticket_id=0")) { foreach ($db as $row) { $online &= $row['status'] & Base::STATUS_ONLINE; } } else if (!$link_id) { $online = false; } // alle Elemente auf online oder geändert prüfen if ($online && $db->query ("SELECT status, name FROM {prefix}element WHERE group_id=$online_id AND (ticket_id=".Ticket::SERVER_ID." OR ticket_id='".Ticket::selected ()."') AND status!=".Base::STATUS_ERASED." ORDER BY name, ticket_id DESC")) { $lastname = ""; foreach ($db as $row) { if ($lastname != $row['name']) { $online &= $row['status'] & Base::STATUS_ONLINE; } $lastname = $row['name']; } } $all_online &= $online; $changed |= $online; // prüfen ob diese Gruppe einen Timer hat if ($db->query ("SELECT t.id, time, g.timer_id FROM `{prefix}group` g, {prefix}timer t WHERE (g.id={$online_id} OR g.id={$group_id}) AND (t.id=g.timer_id OR t.id=-g.timer_id) ORDER BY time")) { foreach ($db as $row2) { $timer[$row['id']] = Array ('time' => $row['time'], 'action' => I18n::tr ("cms", ($row['timer_id']>0) ? "set online" : "set offline")); } } // prüfen ob diese Gruppe verlinkt (ein Linkziel) ist, und die Link quellen zusammensuchen if ($row_parent_id == $parent_id && $db->query ("SELECT DISTINCT id, url FROM `{prefix}group` WHERE link_group_id=$parent_id AND link_group_name='$name' AND id!=$link_id AND (ticket_id=0 OR ticket_id=".Ticket::SERVER_ID." OR ticket_id='".Ticket::selected ()."') AND !(status&".(Base::STATUS_ERASED | Base::STATUS_ARCHIVED).") ORDER BY id")) { $linked = $db->result; } } $online &= $all_online; $changed &= (!$online); $symbol = ((Group::getEditMode ("{$parent_id}_{$group_name}") & Base::MODE_EDIT) ? "open" : "close"); $title = I18n::replace (I18n::tr ("cms", "edit [group]"), array ('group' => I18n::tr ("dot", $group_name))) . ((User::get ('is_admin')) ? " #{$parent_id}" : ""); } // auf offline prüfen (testet ob ein übergeordnetes Element offline ist) if (($online || $changed) && isset ($group['ancestors'])) { foreach ($group['ancestors'] as $parent) { if ($id = Group::getSiteGroup ($site_number, $parent, 'id')) { if ($db->query ("SELECT status FROM `{prefix}group` WHERE id=$id")) { if (!($db['status'] & Base::STATUS_ONLINE)) { if ($online) { $offline = true; } else { $changed = false; } break; } } } } } // Auf gelöschte aber noch online stehende Einträge testen if ($db->query ("SELECT g1.id FROM `{prefix}group` g1, `{prefix}group` g2 WHERE g1.parent_group_id={$parent_id} AND g1.name='{$group_name}' AND (g1.status&".(Base::STATUS_ERASED | Base::STATUS_ARCHIVED).") AND g2.id=g1.online_group_id AND !(g2.status&".(Base::STATUS_ERASED | Base::STATUS_ARCHIVED).")")) { $enable_deleted = true; } // Auf ausgeschnittene aber noch online stehende Einträge testen if ($db->query ("SELECT g1.id FROM `{prefix}group` g1, `{prefix}group` g2 WHERE g1.parent_group_id={$parent_id} AND (g1.status&".Base::STATUS_ONLINE.") AND g2.online_group_id=g1.id AND g2.parent_group_id!={$parent_id} AND (g2.ticket_id=".Ticket::SERVER_ID." OR g2.ticket_id=".Ticket::selected ().")")) { $enable_deleted = true; } if ($enable_deleted && (!$group_id || !$name)) { $changed = true; $online = false; } if ($db->query ("SELECT id FROM `{prefix}group` WHERE parent_group_id=$parent_id AND (ticket_id=0 OR ticket_id=".Ticket::SERVER_ID." OR ticket_id='".Ticket::selected ()."')")) { // es gibt gruppen in dieser Liste $disable_list = false; } $left = Setting::get ("group/$group_name/$style$name", "left", 0); $top = Setting::get ("group/$group_name/$style$name", "top", 0); $hide_list = Setting::get ("list/$parent_id/$name", "max", 0) == 1 || !$_SESSION['cms']['list'][$parent_id][$group_name]['is_list']; $may_set_online = ($edit_right & Base::MODE_ONLINE); $disable_element = ($element_id == 0 || $link_id); $disable_group = ($group_id == 0); $haslink = ($link || $linked); return array ( 'names' => $names, 'online' => $online, 'changed' => $changed, 'offline' => $offline, 'order' => $order, 'symbol' => $symbol, 'title' => $title, 'left' => $left, 'top' => $top, 'may_set_online' => $may_set_online, 'disable_element' => $disable_element, 'disable_group' => $disable_group, 'disable_list' => $disable_list, 'enable_deleted' => $enable_deleted, 'hide_list' => $hide_list, 'has_link' => $haslink, 'link' => $link, 'link_to_list' => $link_to_list, 'linked' => $linked, 'history' => $history, 'timer' => $timer ); } /** * Ermittelt den Typ eines Elementes * * \param site_number Nummer der Seite * \param group_number Nummer der Gruppe * \param name Name des Elementes * * \return Der Typ als String */ public static function getType ($site_number, $group_number, $name) { $style = isset ($_SESSION['cms']['style']) ? $_SESSION['cms']['style'] : ""; return Setting::get ("group/".Group::getSiteGroup ($site_number, $group_number, 'name')."/".$style.$name, "type"); } // alle Kinder und Kindes-Kinder des angegebenen Eintrages, die einen editierdot haben können und nicht auf folgeseiten sind (deren Name also nicht mit "/" beginnt) /** * Liefert alle Kinder und Kindes-Kinder der angegebenen Gruppe, die einen editierdot haben können und nicht auf folgeseiten sind (deren Name also nicht mit "/" beginnt) * * \param id ID der Gruppe * \param name Name der Gruppe * \param src_id ID der Linkquelle wenn id ein Link oder deren Untergruppe ist * * \return Array mit gefundenen Gruppen */ private static function getDescendantList ($id, $name="", $src_id=0) { $groups = array (); foreach (Group::getChildList ($id, $name) as $row) { if ($row['name'][0] != "/") { if ($row['link_group_id'] && !$row['link_group_name']) { $row['link_parent'] = $row['id']; $row['online_group_id'] = $row['link_group_id']; $groups[] = $row; $groups = array_merge ($groups, self::getDescendantList ($row['online_group_id'])); } else if ($row['link_group_id'] && $row['link_group_name']) { $groups = array_merge ($groups, self::getDescendantList ($row['link_group_id'], $row['link_group_name'], $row['id'])); } else { $row['link_parent'] = $src_id; $row['online_group_id'] = ($row['online_group_id']) ? $row['online_group_id'] : $row['id']; $groups[] = $row; $groups = array_merge ($groups, self::getDescendantList ($row['online_group_id'])); } } } return $groups; } /** * Abhängigkeiten zur angegebenen Gruppe ermitteln (abhängige von der angegebenem Gruppe) * Ermittelt also welche Gruppen ebenfalls bertoffen sind, wenn die angegebene Gruppe verändert wird (online, löschen, kopieren,...) * * \param site_number Nummer der Seite * \param group_number Nummer des Eintrages */ public static function getDependency ($site_number, $group_number) { $deps['element'] = Array (); $deps['group'] = Array (); $deps['list'] = Array (); $site_group = Group::getSiteGroup ($site_number, $group_number); if (!empty($site_group['id'])) { // element $deps['element'][] = $group_number; if ($site_group['link_id'] && $site_group['link_name']) { // link to list $link_group_parent = Group::getParent($site_group['link_id']); foreach (self::getDescendantList ($link_group_parent['id'], $link_group_parent['name'], $site_group['id']) as $group) { $id = $group['online_group_id'] . (($group['link_parent']) ? "_{$group['link_parent']}" : ""); $deps['group'][] = $id; if (User::getEditRight ($group['edit_groups']) & Base::MODE_ONLINE) { $deps['group online'][] = $id; } } } else { // group $deps['group'][] = $group_number; $deps['group online'][] = $group_number; foreach (self::getDescendantList ($group_number) as $group) { $id = $group['online_group_id'] . (($group['link_parent']) ? "_{$group['link_parent']}" : ""); $deps['group'][] = $id; if (User::getEditRight ($group['edit_groups']) & Base::MODE_ONLINE) { $deps['group online'][] = $id; } } } } if (!empty($site_group['parent_id'])) { // list foreach (self::getDescendantList ($site_group['parent_id'], $site_group['name']) as $group) { $id = $group['online_group_id'] . (($group['link_parent']) ? "_{$group['link_parent']}" : ""); $deps['list'][] = $id; if (User::getEditRight ($group['edit_groups']) & Base::MODE_ONLINE) { $deps['list online'][] = $id; } } } if (!$deps['element'] && $group_number) { $deps['element'][] = $group_number; $deps['group'][] = $group_number; $deps['list'][] = $group_number; } return $deps; } } ?>