diff options
-rw-r--r-- | db/update.d/21_Atom.php | 4 | ||||
-rw-r--r-- | includes/pages/user_atom.php | 39 | ||||
-rw-r--r-- | public/index.php | 5 | ||||
-rw-r--r-- | templates/layout.html | 1 |
4 files changed, 49 insertions, 0 deletions
diff --git a/db/update.d/21_Atom.php b/db/update.d/21_Atom.php new file mode 100644 index 00000000..f592e0e6 --- /dev/null +++ b/db/update.d/21_Atom.php @@ -0,0 +1,4 @@ +<?php +mysql_query("INSERT IGNORE INTO `Privileges` (`name`, `desc`) VALUES ('atom', ' Atom news export')"); +$applied = mysql_affected_rows() > 0; +?> diff --git a/includes/pages/user_atom.php b/includes/pages/user_atom.php new file mode 100644 index 00000000..fd28510f --- /dev/null +++ b/includes/pages/user_atom.php @@ -0,0 +1,39 @@ +<?php + +// publically available page to feed the news to feedreaders +function user_atom() { + global $ical_shifts, $user, $DISPLAY_NEWS; + + if (isset ($_REQUEST['key']) && preg_match("/^[0-9a-f]{32}$/", $_REQUEST['key'])) + $key = $_REQUEST['key']; + else + die("Missing key."); + + $user = sql_select("SELECT * FROM `User` WHERE `ical_key`='" . sql_escape($key) . "' LIMIT 1"); + if (count($user) == 0) + die("Key invalid."); + + $user = $user[0]; + $news = sql_select("SELECT * FROM `News` " . (empty($_REQUEST['meetings'])? '' : 'WHERE `Treffen` = 1 ') . "ORDER BY `ID` DESC LIMIT " . sql_escape($DISPLAY_NEWS)); + + header('Content-Type: application/atom+xml; charset=utf-8'); + $html = '<?xml version="1.0" encoding="utf-8"?> +<feed xmlns="http://www.w3.org/2005/Atom"> + <title>Engelsystem</title> + <id>' . $_SERVER['HTTP_HOST'] . htmlspecialchars(preg_replace('#[&?]key=[a-f0-9]{32}#', '', $_SERVER['REQUEST_URI'])) . '</id> + <updated>' . date('Y-m-d\TH:i:sP', $news[0]['Datum']) . "</updated>\n"; + foreach ($news as $news_entry) { + $html .= " <entry> + <title>" . htmlspecialchars($news_entry['Betreff']) . "</title> + <link href=\"" . page_link_to_absolute("news_comments&nid=") . "${news_entry['ID']}\"/> + <id>" . preg_replace('#^https?://#', '', page_link_to_absolute("news")) . "-${news_entry['ID']}</id> + <updated>" . date('Y-m-d\TH:i:sP', $news_entry['Datum']) . "</updated> + <summary type=\"html\">" . htmlspecialchars($news_entry['Text']) . "</summary> + </entry>\n"; + } + $html .= "</feed>"; + header("Content-Length: " . strlen($html)); + echo $html; + die(); +} +?> diff --git a/public/index.php b/public/index.php index 1773b54b..bd7e552d 100644 --- a/public/index.php +++ b/public/index.php @@ -40,6 +40,10 @@ if ($p == "ical") { require_once ('includes/pages/user_ical.php'); user_ical(); } +elseif ($p == "atom") { + require_once ('includes/pages/user_atom.php'); + user_atom(); +} // Recht dafür vorhanden? elseif (in_array($p, $privileges)) { if ($p == "news") { @@ -185,6 +189,7 @@ if (isset ($user) && $p != "admin_user_angeltypes") echo template_render('../templates/layout.html', array ( 'theme' => isset ($user) ? $user['color'] : $default_theme, 'title' => $title, + 'atom_link' => ($p == 'news' || $p == 'user_meetings')? '<link href="' . page_link_to('atom') . (($p == 'user_meetings')? '&meetings=1' : '') . '&key=' . $user['ical_key'] . '" type="application/atom+xml" rel="alternate" title="Atom Feed">' : '', 'menu' => make_menu(), 'content' => $content )); diff --git a/templates/layout.html b/templates/layout.html index 695b6c9c..f6d19c6f 100644 --- a/templates/layout.html +++ b/templates/layout.html @@ -14,6 +14,7 @@ <script type="text/javascript" src="css/forms.js"></script> <link rel="stylesheet" type="text/css" href="css/base.css" /> <link rel="stylesheet" type="text/css" href="css/style%theme%.css" /> + %atom_link% </head> <body class="background"> <header> |