diff options
-rw-r--r-- | config/config.default.php | 5 | ||||
-rw-r--r-- | includes/pages/admin_import.php | 288 | ||||
-rw-r--r-- | includes/sys_template.php | 40 | ||||
-rw-r--r-- | templates/admin_import_check.html | 106 | ||||
-rw-r--r-- | templates/admin_import_import.html | 3 | ||||
-rw-r--r-- | templates/admin_import_input.html | 33 |
6 files changed, 159 insertions, 316 deletions
diff --git a/config/config.default.php b/config/config.default.php index 6db1441a..1c0da7fc 100644 --- a/config/config.default.php +++ b/config/config.default.php @@ -32,11 +32,6 @@ $max_freeloadable_shifts = 2; // local timezone date_default_timezone_set("Europe/Berlin"); -// Pentabarf ConferenzDI für UpdateDB -$PentabarfXMLhost = "cccv.pentabarf.org"; -$PentabarfXMLpath = "Xcal/conference/"; -$PentabarfXMLEventID = "31"; - // multiply "night shifts" and freeloaded shifts (start or end between 2 and 6 exclusive) by 2 $shift_sum_formula = "SUM( (1+( diff --git a/includes/pages/admin_import.php b/includes/pages/admin_import.php index 1238076e..8b65f7a4 100644 --- a/includes/pages/admin_import.php +++ b/includes/pages/admin_import.php @@ -4,15 +4,14 @@ function admin_import_title() { } function admin_import() { - global $PentabarfXMLhost, $PentabarfXMLpath; global $rooms_import; global $user; $html = ""; - + $step = "input"; - if (isset ($_REQUEST['step'])) + if (isset($_REQUEST['step'])) $step = $_REQUEST['step']; - + $html .= '<p>'; $html .= $step == "input" ? '<b>1. Input</b>' : '1. Input'; $html .= ' » '; @@ -20,11 +19,11 @@ function admin_import() { $html .= ' » '; $html .= $step == "import" ? '<b>3. Import</b>' : '3. Import'; $html .= '</p>'; - + $import_file = '../import/import_' . $user['UID'] . '.xml'; - + switch ($step) { - case "input" : + case "input": $ok = false; if ($test_handle = fopen('../import/tmp', 'w')) { fclose($test_handle); @@ -32,64 +31,10 @@ function admin_import() { } else { error("Webserver has no write-permission on import directory."); } - - if (isset ($_REQUEST['submit'])) { + + if (isset($_REQUEST['submit'])) { $ok = true; - if (isset ($_REQUEST['user']) && $_REQUEST['user'] != "" && isset ($_REQUEST['password']) && $_REQUEST['password'] != "") { - $fp = fsockopen("ssl://$PentabarfXMLhost", 443, $errno, $errstr, 5); - - if (!$fp) { - $ok = false; - error("File 'https://$PentabarfXMLhost/$PentabarfXMLpath" . $_REQUEST["url"] . "' not readable!" . "[$errstr ($errno)]"); - } else { - $fileOut = fopen($import_file, "w"); - $head = 'GET /' . $PentabarfXMLpath . $_REQUEST["url"] . ' HTTP/1.1' . "\r\n" . - 'Host: ' . $PentabarfXMLhost . "\r\n" . - 'User-Agent: Engelsystem' . "\r\n" . - 'Authorization: Basic ' . - base64_encode($_REQUEST["user"] . ':' . $_REQUEST["password"]) . "\r\n" . - "\r\n"; - fputs($fp, $head); - $Zeilen = -1; - echo "<pre>"; - while (!feof($fp)) { - $Temp = fgets($fp, 1024); - - // show header - if ($Zeilen == -1) { - echo $Temp; - } - - // ende des headers - if ($Temp == "\r\n") { - echo "</pre>\n"; - $Zeilen = 0; - $Temp = ""; - } - - //file ende? - if ($Temp == "0\r\n") - break; - - if (($Zeilen > -1) && ($Temp != "ffb\r\n")) { - //steuerzeichen ausfiltern - if (strpos("#$Temp", "\r\n") > 0) - $Temp = substr($Temp, 0, strlen($Temp) - 2); - if (strpos("#$Temp", "1005") > 0) - $Temp = ""; - if (strpos("#$Temp", "783") > 0) - $Temp = ""; - //schreiben in file - fputs($fileOut, $Temp); - $Zeilen++; - } - } - fclose($fileOut); - fclose($fp); - success("Es wurden $Zeilen Zeilen eingelesen."); - } - } - elseif (isset ($_FILES['xcal_file']) && ($_FILES['xcal_file']['error'] == 0)) { + if (isset($_FILES['xcal_file']) && ($_FILES['xcal_file']['error'] == 0)) { if (move_uploaded_file($_FILES['xcal_file']['tmp_name'], $import_file)) { libxml_use_internal_errors(true); if (simplexml_load_file($import_file) === false) { @@ -106,157 +51,180 @@ function admin_import() { error("Please provide some data."); } } - + if ($ok) redirect(page_link_to('admin_import') . "&step=check"); - else - $html .= template_render('../templates/admin_import_input.html', array ( - 'link' => page_link_to('admin_import'), - 'msg' => msg(), - 'url' => "https://$PentabarfXMLhost/$PentabarfXMLpath" + else { + $html .= form(array( + form_info('', _("This import will create/update/delete rooms and shifts by given FRAB-export file. The needed file format is xcal.")), + form_file('xcal_file', _("xcal-File (.xcal)")), + form_submit('submit', _("Import")) )); + } break; - - case "check" : - if (!file_exists($import_file)) + + case "check": + if (! file_exists($import_file)) redirect(page_link_to('admin_import')); - - list ($rooms_new, $rooms_deleted) = prepare_rooms($import_file); - list ($events_new, $events_updated, $events_deleted) = prepare_events($import_file); - - $html .= template_render('../templates/admin_import_check.html', array ( - 'link' => page_link_to('admin_import'), - 'rooms_new' => count($rooms_new) == 0 ? "<tr><td>None</td></tr>" : table_body($rooms_new), - 'rooms_deleted' => count($rooms_deleted) == 0 ? "<tr><td>None</td></tr>" : table_body($rooms_deleted), - 'events_new' => count($events_new) == 0 ? "<tr><td>None</td><td></td><td></td><td></td><td></td></tr>" : table_body(shifts_printable($events_new)), - 'events_updated' => count($events_updated) == 0 ? "<tr><td>None</td><td></td><td></td><td></td><td></td></tr>" : table_body(shifts_printable($events_updated)), - 'events_deleted' => count($events_deleted) == 0 ? "<tr><td>None</td><td></td><td></td><td></td><td></td></tr>" : table_body(shifts_printable($events_deleted)) - )); + + list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); + list($events_new, $events_updated, $events_deleted) = prepare_events($import_file); + + $html .= form(array( + '<h3>' . _("Rooms to create") . '</h3>', + table(_("Name"), $rooms_new), + '<h3>' . _("Rooms to delete") . '</h3>', + table(_("Name"), $rooms_deleted), + '<h3>' . _("Shifts to create") . '</h3>', + table(array( + 'day' => _("Day"), + 'start' => _("Start"), + 'end' => _("End"), + 'name' => _("Name"), + 'room' => _("Room") + ), shifts_printable($events_new)), + '<h3>' . _("Shifts to update") . '</h3>', + table(array( + 'day' => _("Day"), + 'start' => _("Start"), + 'end' => _("End"), + 'name' => _("Name"), + 'room' => _("Room") + ), shifts_printable($events_updated)), + '<h3>' . _("Shifts to delete") . '</h3>', + table(array( + 'day' => _("Day"), + 'start' => _("Start"), + 'end' => _("End"), + 'name' => _("Name"), + 'room' => _("Room") + ), shifts_printable($events_deleted)), + form_submit('submit', _("Import")) + ), page_link_to('admin_import') . '&step=import'); break; - - case "import" : - if (!file_exists($import_file)) + + case "import": + if (! file_exists($import_file)) redirect(page_link_to('admin_import')); - - list ($rooms_new, $rooms_deleted) = prepare_rooms($import_file); + + list($rooms_new, $rooms_deleted) = prepare_rooms($import_file); foreach ($rooms_new as $room) { sql_query("INSERT INTO `Room` SET `Name`='" . sql_escape($room) . "', `FromPentabarf`='Y', `Show`='Y'"); $rooms_import[trim($room)] = sql_id(); } foreach ($rooms_deleted as $room) sql_query("DELETE FROM `Room` WHERE `Name`='" . sql_escape($room) . "' LIMIT 1"); - - list ($events_new, $events_updated, $events_deleted) = prepare_events($import_file); + + list($events_new, $events_updated, $events_deleted) = prepare_events($import_file); foreach ($events_new as $event) - sql_query("INSERT INTO `Shifts` SET `name`='" . - sql_escape($event['name']) . "', `start`=" . sql_escape($event['start']) . ", `end`=" . sql_escape($event['end']) . ", `RID`=" . sql_escape($event['RID']) . ", `PSID`=" . sql_escape($event['PSID']) . ", `URL`='" . sql_escape($event['URL']) . "'"); - + sql_query("INSERT INTO `Shifts` SET `name`='" . sql_escape($event['name']) . "', `start`=" . sql_escape($event['start']) . ", `end`=" . sql_escape($event['end']) . ", `RID`=" . sql_escape($event['RID']) . ", `PSID`=" . sql_escape($event['PSID']) . ", `URL`='" . sql_escape($event['URL']) . "'"); + foreach ($events_updated as $event) - sql_query("UPDATE `Shifts` SET `name`='" . - sql_escape($event['name']) . "', `start`=" . sql_escape($event['start']) . ", `end`=" . sql_escape($event['end']) . ", `RID`=" . sql_escape($event['RID']) . ", `PSID`=" . sql_escape($event['PSID']) . ", `URL`='" . sql_escape($event['URL']) . "' WHERE `PSID`=" . sql_escape($event['PSID']) . " LIMIT 1"); - + sql_query("UPDATE `Shifts` SET `name`='" . sql_escape($event['name']) . "', `start`=" . sql_escape($event['start']) . ", `end`=" . sql_escape($event['end']) . ", `RID`=" . sql_escape($event['RID']) . ", `PSID`=" . sql_escape($event['PSID']) . ", `URL`='" . sql_escape($event['URL']) . "' WHERE `PSID`=" . sql_escape($event['PSID']) . " LIMIT 1"); + foreach ($events_deleted as $event) - sql_query("DELETE FROM `Shifts` WHERE `PSID`=" . - sql_escape($event['PSID']) . " LIMIT 1"); - + sql_query("DELETE FROM `Shifts` WHERE `PSID`=" . sql_escape($event['PSID']) . " LIMIT 1"); + engelsystem_log("Pentabarf import done"); - + unlink($import_file); - - $html .= template_render('../templates/admin_import_import.html', array ()); + + $html .= success(_("It's done!"), true); break; + default: + redirect(page_link_to('admin_import')); } - + return $html; } function prepare_rooms($file) { global $rooms_import; $data = read_xml($file); - + // Load rooms from db for compare with input $rooms = sql_select("SELECT * FROM `Room` WHERE `FromPentabarf`='Y'"); - $rooms_db = array (); - $rooms_import = array (); + $rooms_db = array(); + $rooms_import = array(); foreach ($rooms as $room) { - $rooms_db[] = $room['Name']; + $rooms_db[] = (string) $room['Name']; $rooms_import[$room['Name']] = $room['RID']; } - + $events = $data->vcalendar->vevent; - $rooms_pb = array (); + $rooms_pb = array(); foreach ($events as $event) { - $rooms_pb[] = $event->location; - if (!isset ($rooms_import[trim($event->location)])) + $rooms_pb[] = (string) $event->location; + if (! isset($rooms_import[trim($event->location)])) $rooms_import[trim($event->location)] = trim($event->location); } $rooms_pb = array_unique($rooms_pb); - + $rooms_new = array_diff($rooms_pb, $rooms_db); $rooms_deleted = array_diff($rooms_db, $rooms_pb); - - return array ( - $rooms_new, - $rooms_deleted + + return array( + $rooms_new, + $rooms_deleted ); } function prepare_events($file) { global $rooms_import; $data = read_xml($file); - + $rooms = sql_select("SELECT * FROM `Room`"); - $rooms_db = array (); + $rooms_db = array(); foreach ($rooms as $room) $rooms_db[$room['Name']] = $room['RID']; - + $events = $data->vcalendar->vevent; - $shifts_pb = array (); + $shifts_pb = array(); foreach ($events as $event) { $event_pb = $event->children("http://pentabarf.org"); - $event_id = trim($event_pb-> { + $event_id = trim($event_pb->{ 'event-id' }); - $shifts_pb[$event_id] = array ( - 'start' => DateTime :: createFromFormat("Ymd\THis", $event->dtstart)->getTimestamp(), - 'end' => DateTime :: createFromFormat("Ymd\THis", $event->dtend)->getTimestamp(), + $shifts_pb[$event_id] = array( + 'start' => DateTime::createFromFormat("Ymd\THis", $event->dtstart)->getTimestamp(), + 'end' => DateTime::createFromFormat("Ymd\THis", $event->dtend)->getTimestamp(), 'RID' => $rooms_import[trim($event->location)], 'name' => trim($event->summary), 'URL' => trim($event->url), - 'PSID' => $event_id - ); + 'PSID' => $event_id + ); } - + $shifts = sql_select("SELECT * FROM `Shifts` WHERE `PSID` IS NOT NULL ORDER BY `start`"); - $shifts_db = array (); + $shifts_db = array(); foreach ($shifts as $shift) $shifts_db[$shift['PSID']] = $shift; - - $shifts_new = array (); - $shifts_updated = array (); + + $shifts_new = array(); + $shifts_updated = array(); foreach ($shifts_pb as $shift) - if (!isset ($shifts_db[$shift['PSID']])) - $shifts_new[] = $shift; - else { - $tmp = $shifts_db[$shift['PSID']]; - if ($shift['name'] != $tmp['name'] || $shift['start'] != $tmp['start'] || $shift['end'] != $tmp['end'] || $shift['RID'] != $tmp['RID'] || $shift['URL'] != $tmp['URL']) - $shifts_updated[] = $shift; - } - - $shifts_deleted = array (); + if (! isset($shifts_db[$shift['PSID']])) + $shifts_new[] = $shift; + else { + $tmp = $shifts_db[$shift['PSID']]; + if ($shift['name'] != $tmp['name'] || $shift['start'] != $tmp['start'] || $shift['end'] != $tmp['end'] || $shift['RID'] != $tmp['RID'] || $shift['URL'] != $tmp['URL']) + $shifts_updated[] = $shift; + } + + $shifts_deleted = array(); foreach ($shifts_db as $shift) - if (!isset ($shifts_pb[$shift['PSID']])) - $shifts_deleted[] = $shift; - - return array ( - $shifts_new, - $shifts_updated, - $shifts_deleted + if (! isset($shifts_pb[$shift['PSID']])) + $shifts_deleted[] = $shift; + + return array( + $shifts_new, + $shifts_updated, + $shifts_deleted ); } function read_xml($file) { global $xml_import; - if (!isset ($xml_import)) + if (! isset($xml_import)) $xml_import = simplexml_load_file($file); return $xml_import; } @@ -264,22 +232,22 @@ function read_xml($file) { function shifts_printable($shifts) { global $rooms_import; $rooms = array_flip($rooms_import); - + uasort($shifts, 'shift_sort'); - - $shifts_printable = array (); + + $shifts_printable = array(); foreach ($shifts as $shift) - $shifts_printable[] = array ( - 'day' => date("l, Y-m-d", $shift['start']), - 'start' => date("H:i", $shift['start']), - 'name' => shorten($shift['name']), - 'end' => date("H:i", $shift['end']), - 'room' => $rooms[$shift['RID']] + $shifts_printable[] = array( + 'day' => date("l, Y-m-d", $shift['start']), + 'start' => date("H:i", $shift['start']), + 'name' => shorten($shift['name']), + 'end' => date("H:i", $shift['end']), + 'room' => $rooms[$shift['RID']] ); return $shifts_printable; } function shift_sort($a, $b) { - return ($a['start'] < $b['start']) ? -1 : 1; + return ($a['start'] < $b['start']) ? - 1 : 1; } ?> diff --git a/includes/sys_template.php b/includes/sys_template.php index dab30d13..409ecbe1 100644 --- a/includes/sys_template.php +++ b/includes/sys_template.php @@ -4,13 +4,13 @@ * Liste der verfügbaren Themes */ $themes = array( - "1" => "Engelsystem default" + "1" => "Engelsystem default" ); /** * Render a toolbar. * - * @param array $items + * @param array $items * @return string */ function toolbar($items = array()) { @@ -19,10 +19,11 @@ function toolbar($items = array()) { /** * Render a link for a toolbar. - * @param string $href - * @param string $class - * @param string $label - * @param bool $selected + * + * @param string $href + * @param string $class + * @param string $label + * @param bool $selected * @return string */ function toolbar_item_link($href, $class, $label, $selected = false) { @@ -116,6 +117,13 @@ function form_text($name, $label, $value, $disabled = false) { } /** + * Rendert ein Formular-Dateifeld + */ +function form_file($name, $label) { + return form_element($label, '<input id="form_' . $name . '" type="file" name="' . $name . '" />', 'form_' . $name); +} + +/** * Rendert ein Formular-Passwortfeld */ function form_password($name, $label, $disabled = false) { @@ -163,7 +171,21 @@ function page($elements) { /** * Rendert eine Datentabelle */ -function table($columns, $rows, $data = true) { +function table($columns, $rows_raw, $data = true) { + // If only one column is given + if (! is_array($columns)) { + $columns = array( + 'col' => $columns + ); + + $rows = array(); + foreach ($rows_raw as $row) + $rows[] = array( + 'col' => $row + ); + } else + $rows = $rows_raw; + if (count($rows) == 0) return info(_("No data found."), true); $html = ""; @@ -240,7 +262,7 @@ function html_options($name, $options, $selected = "") { $html = ""; foreach ($options as $value => $label) $html .= '<input type="radio"' . ($value == $selected ? ' checked="checked"' : '') . ' name="' . $name . '" value="' . $value . '"> ' . $label; - + return $html; } @@ -282,7 +304,7 @@ function ReplaceSmilies($neueckig) { $neueckig = str_replace(";P", "<img src=\"pic/smiles/icon_mad.gif\">", $neueckig); $neueckig = str_replace(";oP", "<img src=\"pic/smiles/icon_mad.gif\">", $neueckig); $neueckig = str_replace("?)", "<img src=\"pic/smiles/icon_question.gif\">", $neueckig); - + return $neueckig; } ?> diff --git a/templates/admin_import_check.html b/templates/admin_import_check.html deleted file mode 100644 index 788ea58e..00000000 --- a/templates/admin_import_check.html +++ /dev/null @@ -1,106 +0,0 @@ -<form action="%link%&step=import" method="post"> - <fieldset> - <h3>Rooms to create</h3> - <table> - <thead> - <tr> - <th> - Name - </th> - </tr> - </thead> - <tbody> - %rooms_new% - </tbody> - </table> - <h3>Rooms to delete</h3> - <table> - <thead> - <tr> - <th> - Name - </th> - </tr> - </thead> - <tbody> - %rooms_deleted% - </tbody> - </table> - <h3>Shifts to create</h3> - <table> - <thead> - <tr> - <th> - Day - </th> - <th> - Start - </th> - <th> - End - </th> - <th> - Name - </th> - <th> - Room - </th> - </tr> - </thead> - <tbody> - %events_new% - </tbody> - </table> - <h3>Shifts to update</h3> - <table> - <thead> - <tr> - <th> - Day - </th> - <th> - Start - </th> - <th> - End - </th> - <th> - Name - </th> - <th> - Room - </th> - </tr> - </thead> - <tbody> - %events_updated% - </tbody> - </table> - <h3>Shifts to delete</h3> - <table> - <thead> - <tr> - <th> - Day - </th> - <th> - Start - </th> - <th> - End - </th> - <th> - Name - </th> - <th> - Room - </th> - </tr> - </thead> - <tbody> - %events_deleted% - </tbody> - </table> - <input type="submit" name="submit" value="Submit" /> - </fieldset> -</form>
\ No newline at end of file diff --git a/templates/admin_import_import.html b/templates/admin_import_import.html deleted file mode 100644 index 4f2905be..00000000 --- a/templates/admin_import_import.html +++ /dev/null @@ -1,3 +0,0 @@ -<p class="success"> - It's done! -</p> diff --git a/templates/admin_import_input.html b/templates/admin_import_input.html deleted file mode 100644 index ac11c766..00000000 --- a/templates/admin_import_input.html +++ /dev/null @@ -1,33 +0,0 @@ -<form action="%link%" method="post" enctype="multipart/form-data"> - <fieldset> - %msg% - <p> - For Pentabarf import provide user/password and url-completion. - </p> - <p><label>Location:</label> %url%<input type="text" name="url" /></p> - <p> - <label> - User: - </label> - <input type="text" name="user" value="" /> - </p> - <p> - <label> - Password: - </label> - <input type="password" name="password" /> - </p> - <p> - Or provide a Xcal-file from pentabarf manually: - </p> - <p> - <label> - Xcal-file: - </label> - <input type="file" name="xcal_file" /> - </p> - <p> - <input type="submit" name="submit" value="Submit" /> - </p> - </fieldset> -</form>
\ No newline at end of file |