aggregator.module 29.1 KB
Newer Older
1
<?php
2
// $Id$
3

Dries Buytaert's avatar
   
Dries Buytaert committed
4
function import_help() {
5
 ?>
Dries Buytaert's avatar
   
Dries Buytaert committed
6
7
  <p>In Drupal you have <i>feeds</i> and <i>bundles</i>.   Feeds define news sources and bundles categoriz syndicated content by source, topic or any other heuristic.   Bundles provide a generalized way of creating composite feeds.  They allow you, for example, to combine various sport-related feeds into one bundle called "Sport".</p>
  <p>You can have several providers of news feeds.  You can add a feed by clicking the "add feed" link on the import administration pages.  Give the feed a name, supply the URI and a comma-separated list of attributes that you want to associate the feed with.  The update interval defines how often Drupal should go out to try and grab fresh content.  The expiration time defines how long syndicated content is kept in the database.  So set the update and expiration time and save your settings.  You have just defined your first feed.  If you have more feeds repeat as necessary.</p>
Dries Buytaert's avatar
   
Dries Buytaert committed
8
  <p>To verify whether your feed works, press "update items" at the overview page.  The number of news items that have been sucessfully fetched, should then become visible in the third column of the feed overview.</p>
Dries Buytaert's avatar
   
Dries Buytaert committed
9
10
  <p>Now you have to define some bundles.  Bundles look for feeds that contain one of the keywords associated with the bundle and display those feeds together.  To define a bundle you have to give it a name and a comma-separated list of keywords just like this is the case for feeds.</p>
  <p>Your newly created bundle will now show up in the list of blocks that you can see at the block related administration pages.  There you can customize where and when your bundles will be displayed.</p>
11
12
13
 <?php
}

14
function import_system($field){
15
  $system["description"] = t("Used to import syndicated content (ie. news feeds)");
16
17
18
  return $system[$field];
}

Dries Buytaert's avatar
   
Dries Buytaert committed
19
20
function import_conf_options() {
  $number = array(5 => 5, 10 => 10, 15 => 15, 20 => 20, 25 => 25, 30 => 30, 35 => 35, 40 => 40, 45 => 45, 50 => 50, 55 => 55, 60 => 60, 65 => 65, 70 => 70, 75 => 75, 80 => 80, 85 => 85, 90 => 90, 95 => 95, 100 => 100);
Dries Buytaert's avatar
   
Dries Buytaert committed
21
22
  $output .= form_select("Items per block", "import_block_limit", variable_get("import_block_limit", 15), $number, "The maximum number of news items displayed in one block.");
  $output .= form_select("Items per page", "import_page_limit", variable_get("import_page_limit", 75), $number, "The maximum number of news items displayed on one page.");
Dries Buytaert's avatar
   
Dries Buytaert committed
23

Dries Buytaert's avatar
   
Dries Buytaert committed
24
25
26
  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
27
function import_perm() {
Dries Buytaert's avatar
   
Dries Buytaert committed
28
  return array("administer news feeds", "access news feeds");
Dries Buytaert's avatar
   
Dries Buytaert committed
29
30
31
}

function import_link($type) {
Dries Buytaert's avatar
   
Dries Buytaert committed
32
  if ($type == "admin" && user_access("administer news feeds")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
33
    $links[] = la(t("news feeds"), array("mod" => "import"));
Dries Buytaert's avatar
   
Dries Buytaert committed
34
35
36
  }

  if ($type == "page" && user_access("access news feeds")) {
Kjartan Mannes's avatar
Kjartan Mannes committed
37
    $links[] = lm(t("news feeds"), array("mod" => "import"), "", array("title" => t("Read the latest news from syndicated websites.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
38
39
40
  }

  return $links ? $links : array();
Dries Buytaert's avatar
   
Dries Buytaert committed
41
42
}

Dries Buytaert's avatar
   
Dries Buytaert committed
43
function import_cron() {
Dries Buytaert's avatar
   
Dries Buytaert committed
44
45
46
47
48
49
50
  $result = db_query("SELECT * FROM feed WHERE timestamp + refresh < ". time());
  while ($feed = db_fetch_array($result)) {
    import_refresh($feed);
  }
}

function import_update() {
51
52
  $result = db_query("SELECT * FROM feed");
  while ($feed = db_fetch_array($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
53
54
55
56
    import_refresh($feed);
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
57
58
function import_format_item($item, $feed = 0) {
  global $theme, $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
59

Dries Buytaert's avatar
   
Dries Buytaert committed
60
  if ($user->uid && user_access("post blogs")) {
Kjartan Mannes's avatar
Kjartan Mannes committed
61
    $output .= lm("<img src=\"". $theme->image("blog.gif") ."\" border=\"0\" width=\"12\" height=\"16\" alt=\"". t("Blog this item") ."\" />", array("mod" => "node", "op" => "add", "type" => "blog", "iid" => $item->iid), "", array("title" => t("Comment on this news item in your personal blog.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
62
63
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
64
  // external link
Dries Buytaert's avatar
   
Dries Buytaert committed
65
  $output .= "<a href=\"". check_output($item->link) ."\" target=\"new\">". check_output($item->title) ."</a>";
66

Dries Buytaert's avatar
   
Dries Buytaert committed
67
  return $output ."<br />";
68
69
}

Dries Buytaert's avatar
   
Dries Buytaert committed
70
71
function import_bundle_block($attributes) {

72
73
74
  if ($attributes) {
    $keys = explode(",", $attributes);
    foreach ($keys as $key) $where[] = "attributes LIKE '%". trim($key) ."%'";
75

Dries Buytaert's avatar
   
Dries Buytaert committed
76
    $result = db_query("SELECT * FROM item WHERE ". implode(" OR ", $where) ." ORDER BY iid DESC LIMIT ". variable_get("import_block_limit", 15));
Dries Buytaert's avatar
   
Dries Buytaert committed
77
  }
78

Dries Buytaert's avatar
   
Dries Buytaert committed
79
80
  while ($item = db_fetch_object($result)) {
    $output .= import_format_item($item);
81
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
82
83

  return $output;
84
85
}

Dries Buytaert's avatar
   
Dries Buytaert committed
86
function import_feed_block($feed) {
Dries Buytaert's avatar
   
Dries Buytaert committed
87
  $result = db_query("SELECT * FROM item WHERE fid = '%s' ORDER BY iid DESC LIMIT ". variable_get("import_block_limit", 15), $feed->fid);
88

Dries Buytaert's avatar
   
Dries Buytaert committed
89
  while ($item = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
90
    $output .= import_format_item($item);
Dries Buytaert's avatar
   
Dries Buytaert committed
91
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
92

Dries Buytaert's avatar
   
Dries Buytaert committed
93
94
95
  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
96
function import_block() {
Dries Buytaert's avatar
   
Dries Buytaert committed
97
  return array_merge(import_get_bundles(), import_get_feeds());
Dries Buytaert's avatar
   
Dries Buytaert committed
98
99
}

Dries Buytaert's avatar
   
Dries Buytaert committed
100
function import_get_bundles($attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
101
  $result = db_query("SELECT * FROM bundle ORDER BY title");
Dries Buytaert's avatar
   
Dries Buytaert committed
102

Dries Buytaert's avatar
   
Dries Buytaert committed
103
  $i = 0;
Dries Buytaert's avatar
   
Dries Buytaert committed
104
  while ($bundle = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
105
    $block[$i]["subject"] = $bundle->title;
Kjartan Mannes's avatar
Kjartan Mannes committed
106
    $block[$i]["content"] = import_bundle_block($bundle->attributes) ."<p><div align=\"right\">". lm(t("more"), array("mod" => "import", "op" => "bundle", "id" => $bundle->bid), "", array("title" => t("View this bundle's recent news."))) ."</div></p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
107
    $block[$i]["info"] = "$bundle->title bundle";
Dries Buytaert's avatar
   
Dries Buytaert committed
108

Dries Buytaert's avatar
   
Dries Buytaert committed
109
110
    $i++;
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
111

Dries Buytaert's avatar
   
Dries Buytaert committed
112
  return $block;
Dries Buytaert's avatar
   
Dries Buytaert committed
113
114
}

Dries Buytaert's avatar
   
Dries Buytaert committed
115
function import_get_feeds($attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
116
  $result = db_query("SELECT * FROM feed ORDER BY fid");
Dries Buytaert's avatar
   
Dries Buytaert committed
117
118
119

  $i = 0;
  while ($feed = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
120
    $block[$i]["subject"] = $feed->title;
Kjartan Mannes's avatar
Kjartan Mannes committed
121
    $block[$i]["content"] = import_feed_block($feed) ."<p><div align=\"right\">". lm(t("more"), array("mod" => "import", "op" => "feed", "id" => $feed->fid), "", array("title" => t("View this feed's recent news."))) ."</div></p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
122
    $block[$i]["info"] = "$feed->title feed";
Dries Buytaert's avatar
   
Dries Buytaert committed
123
124
125
126

    $i++;
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
127
  return $block;
Dries Buytaert's avatar
   
Dries Buytaert committed
128
129
}

Dries Buytaert's avatar
   
Dries Buytaert committed
130
function import_remove($feed) {
Dries Buytaert's avatar
   
Dries Buytaert committed
131
  db_query("DELETE FROM item WHERE fid = '%s'", $feed["fid"]);
Dries Buytaert's avatar
   
Dries Buytaert committed
132
  return "feed '". $feed["title"] ."' reset.";
Dries Buytaert's avatar
   
Dries Buytaert committed
133
134
}

Dries Buytaert's avatar
   
Dries Buytaert committed
135
function import_refresh($feed) {
136

Dries Buytaert's avatar
   
Dries Buytaert committed
137
138
139
140
  /*
  ** Check whether the feed is properly configured:
  */

Dries Buytaert's avatar
   
Dries Buytaert committed
141
142
  if (!ereg("^http://|ftp://", $feed["url"])) {
    watchdog("warning", "import: invalid or missing URL for '". $feed["title"] ."'");
Dries Buytaert's avatar
   
Dries Buytaert committed
143
144
145
  }

  /*
Dries Buytaert's avatar
   
Dries Buytaert committed
146
  ** Grab the news items:
Dries Buytaert's avatar
   
Dries Buytaert committed
147
148
  */

Dries Buytaert's avatar
   
Dries Buytaert committed
149
  if ($fp = @fopen($feed["url"], "r")) {
150
    // fetch data:
Dries Buytaert's avatar
   
Dries Buytaert committed
151
152
153
    while (!feof($fp)) {
      $data .= fgets($fp, 128);
    }
Dries Buytaert's avatar
Dries Buytaert committed
154
    fclose($fp);
Dries Buytaert's avatar
   
Dries Buytaert committed
155
156
157
158
159

    // initialize the translation table:
    $tt = array_flip(get_html_translation_table(HTML_ENTITIES));
    $tt["&apos;"] = "'";

Dries Buytaert's avatar
   
Dries Buytaert committed
160
161
162
    /*
    ** Remove unsupported tags or sub-elements:
    */
Dries Buytaert's avatar
   
Dries Buytaert committed
163

Dries Buytaert's avatar
   
Dries Buytaert committed
164
165
    $data = ereg_replace("<textinput([^s].*)</textinput>", "", $data);
    $data = ereg_replace("<image([^s].*)</image>", "", $data);
Dries Buytaert's avatar
   
Dries Buytaert committed
166

Dries Buytaert's avatar
   
Dries Buytaert committed
167
168
169
    /*
    ** Extract and process channel information:
    */
170

Dries Buytaert's avatar
   
Dries Buytaert committed
171
    $channel = ereg_replace("<item([^s].*)</item>", "", $data);
Dries Buytaert's avatar
   
Dries Buytaert committed
172

Dries Buytaert's avatar
   
Dries Buytaert committed
173
174
175
    eregi("<title>(.*)</title>", $channel, $title);
    eregi("<link>(.*)</link>", $channel, $link);
    eregi("<description>(.*)</description>", $channel, $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
176

Dries Buytaert's avatar
   
Dries Buytaert committed
177
178
179
180
181
182
183
    /*
    ** Strip invalid tags and provide default values (if required):
    */

    $link = strip_tags($link[1]);
    $description = filter(strtr($description[1], $tt));

Kjartan Mannes's avatar
Kjartan Mannes committed
184
    db_query("UPDATE feed SET timestamp = '%s', link = '%s', description = '%s' WHERE fid = '%s'", time(), $link, $description, $feed["fid"]);
Dries Buytaert's avatar
   
Dries Buytaert committed
185

Dries Buytaert's avatar
   
Dries Buytaert committed
186
187
188
    /*
    ** Extract and process individual items:
    */
Dries Buytaert's avatar
   
Dries Buytaert committed
189

Dries Buytaert's avatar
   
Dries Buytaert committed
190
191
    eregi("<item([^s].*)</item>", $data, $data);
    // print "<pre>". htmlentities($data[0]) ."</pre>";
192

Dries Buytaert's avatar
   
Dries Buytaert committed
193
    $items = array_reverse(explode("</item>", $data[0]));
Dries Buytaert's avatar
   
Dries Buytaert committed
194

Dries Buytaert's avatar
   
Dries Buytaert committed
195
196
    foreach ($items as $item) {
      unset($title, $link, $author, $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
197

Dries Buytaert's avatar
   
Dries Buytaert committed
198
199
200
201
      $t = eregi("<title>(.*)</title>", $item, $title);
      $l = eregi("<link>(.*)</link>", $item, $link);
      $a = eregi("<author>(.*)</author>", $item, $author);
      $d = eregi("<description>(.*)</description>", $item, $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
202

Dries Buytaert's avatar
   
Dries Buytaert committed
203
      if ($t || $l || $a || $d) {
204

Dries Buytaert's avatar
   
Dries Buytaert committed
205
206
207
        /*
        ** Strip invalid tags and provide default values (if required):
        */
Dries Buytaert's avatar
Dries Buytaert committed
208

Dries Buytaert's avatar
   
Dries Buytaert committed
209
        $title = strip_tags(strtr($title[1] ? $title[1] : substr(strip_tags(strtr($description[1], $tt)), 0, 30), $tt));
Dries Buytaert's avatar
   
Dries Buytaert committed
210
211
212
        $link = strip_tags($link[1] ? $link[1] : $feed["link"]);
        $author = strip_tags($author[1]);
        $description = filter(strtr($description[1], $tt));
Dries Buytaert's avatar
Dries Buytaert committed
213

Dries Buytaert's avatar
   
Dries Buytaert committed
214
        // print "<pre>title = ". htmlentities($title) ."\n\ndescription = ". htmlentities($description) ."\n\nlink = ". htmlentities($link) ."</pre><hr />";
Dries Buytaert's avatar
   
Dries Buytaert committed
215

Dries Buytaert's avatar
   
Dries Buytaert committed
216
        /*
Dries Buytaert's avatar
   
Dries Buytaert committed
217
218
219
        ** Save this item.  Try to avoid duplicate entries as much as
        ** possible.  If we find a duplicate entry, we resolve it and
        ** pass along its ID such that we can update it (when needed).
Dries Buytaert's avatar
   
Dries Buytaert committed
220
        */
Dries Buytaert's avatar
   
Dries Buytaert committed
221

Dries Buytaert's avatar
   
Dries Buytaert committed
222
        if ($link && $link != $feed["link"] && $link != $feed["url"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
223
          $entry = db_fetch_object(db_query("SELECT iid FROM item WHERE fid = '%s' AND link = '%s'", $feed["fid"], $link));
Dries Buytaert's avatar
   
Dries Buytaert committed
224
225
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
226
          $entry = db_fetch_object(db_query("SELECT iid FROM item WHERE fid = '%s' AND title = '%s'", $feed["fid"], $title));
Dries Buytaert's avatar
   
Dries Buytaert committed
227
228
229
        }

        import_save_item(array(iid => $entry->iid, fid => $feed["fid"], title => $title, link => $link, author => $author, description => $description, attributes => $feed["attributes"]));
230
231
      }
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
232
233

    /*
Dries Buytaert's avatar
   
Dries Buytaert committed
234
    ** Remove all the old, expired items:
Dries Buytaert's avatar
   
Dries Buytaert committed
235
236
237
238
    */

    unset($items);

Dries Buytaert's avatar
   
Dries Buytaert committed
239
    $result = db_query("SELECT iid FROM item WHERE fid = '%s' ORDER BY timestamp", $feed["fid"]);
Dries Buytaert's avatar
   
Dries Buytaert committed
240
241
242
243
244

    while ($item = db_fetch_object($result)) {
      $items[] = "iid = '$item->iid'";
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
245
    if (sizeof($items) > 50) {
Dries Buytaert's avatar
   
Dries Buytaert committed
246
247
248
      db_query("DELETE FROM item WHERE ". implode(" OR ", array_slice($items, 0, - 50)));
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
249
250
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
251
    watchdog("warning", "import: failed to syndicate from '". $feed["title"] ."'". ($errstr ? ": $errstr" : ""));
252
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
253

Dries Buytaert's avatar
   
Dries Buytaert committed
254
  return "feed '". $feed["title"] ."' updated.";
255
256
}

Dries Buytaert's avatar
   
Dries Buytaert committed
257
function import_save_item($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
258
  if ($edit["iid"] && $edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
259
    db_query("UPDATE item SET title = '%s', link = '%s', author = '%s', description = '%s', attributes = '%s' WHERE iid = '%s'", $edit["title"], $edit["link"], $edit["author"], $edit["description"], $edit["attributes"], $edit["iid"]);
260
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
261
  else if ($edit["iid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
262
    db_query("DELETE FROM item WHERE iid = '%s'", $edit["iid"]);
263
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
264
  else if ($edit["title"] && $edit["link"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
265
    db_query("INSERT INTO item (fid, title, link, author, description, attributes, timestamp) VALUES ('%s', '%s', '%s', '%s', '%s', '%s', '%s')", $edit["fid"], $edit["title"], $edit["link"], $edit["author"], $edit["description"], $edit["attributes"], time());
266
267
268
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
269
function import_form_bundle($edit = array()) {
270

Dries Buytaert's avatar
   
Dries Buytaert committed
271
272
  $form .= form_textfield("Title", "title", $edit["title"], 50, 64, "The name of the bundle.");
  $form .= form_textfield("Attributes", "attributes", $edit["attributes"], 50, 128, "A comma-seperated list of keywords describing the bundle.");
273
274
275

  $form .= form_submit("Submit");

Dries Buytaert's avatar
   
Dries Buytaert committed
276
  if ($edit["bid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
277
    $form .= form_submit("Delete");
Dries Buytaert's avatar
   
Dries Buytaert committed
278
    $form .= form_hidden("bid", $edit["bid"]);
279
280
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
281
  return form($form);
282
283
}

Dries Buytaert's avatar
   
Dries Buytaert committed
284
function import_save_bundle($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
285
  if ($edit["bid"] && $edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
286
    db_query("UPDATE bundle SET title = '%s', attributes = '%s' WHERE bid = '%s'", $edit["title"], $edit["attributes"], $edit["bid"]);
287
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
288
  else if ($edit["bid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
289
    db_query("DELETE FROM bundle WHERE bid = '%s'", $edit["bid"]);
290
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
291
  else if ($edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
292
    db_query("INSERT INTO bundle (title, attributes) VALUES ('%s', '%s')", $edit["title"], $edit["attributes"]);
293
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
294
295

  module_rehash_blocks("import");
296
297
}

Dries Buytaert's avatar
   
Dries Buytaert committed
298
function import_form_feed($edit = array()) {
299
300
301

  $period = array(900 => format_interval(900), 1800 => format_interval(1800), 3600 => format_interval(3600), 7200 => format_interval(7200), 10800 => format_interval(10800), 21600 => format_interval(21600), 32400 => format_interval(32400), 43200 => format_interval(43200), 64800 => format_interval(64800), 86400 => format_interval(86400), 172800 => format_interval(172800), 259200 => format_interval(259200), 604800 => format_interval(604800), 1209600 => format_interval(1209600), 2419200 => format_interval(2419200));

Dries Buytaert's avatar
   
Dries Buytaert committed
302
303
304
  if ($edit["refresh"] == "") {
    $edit["refresh"] = 3600;
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
305

Dries Buytaert's avatar
   
Dries Buytaert committed
306
307
308
309
  $form .= form_textfield("Title", "title", $edit["title"], 50, 64, "The name of the feed; typically the name of the website you syndicate content from.");
  $form .= form_textfield("Url", "url", $edit["url"], 50, 128, "The fully-qualified URL of the feed.");
  $form .= form_textfield("Attributes", "attributes", $edit["attributes"], 50, 128, "A comma-seperated list of keywords describing the feed.");
  $form .= form_select("Update interval", "refresh", $edit["refresh"], $period, "The refresh interval indicating how often you want to update this feed.  Requires crontab.");
310
311
312

  $form .= form_submit("Submit");

Dries Buytaert's avatar
   
Dries Buytaert committed
313
  if ($edit["fid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
314
    $form .= form_submit("Delete");
Dries Buytaert's avatar
   
Dries Buytaert committed
315
    $form .= form_hidden("fid", $edit["fid"]);
316
317
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
318
  return form($form);
319
320
}

Dries Buytaert's avatar
   
Dries Buytaert committed
321
function import_save_feed($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
322
  if ($edit["fid"] && $edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
323
324
    db_query("UPDATE feed SET title = '%s', url = '%s', attributes = '%s', refresh = '%s' WHERE fid = '%s'", $edit["title"], $edit["url"], $edit["attributes"], $edit["refresh"], $edit["fid"]);
    db_query("DELETE FROM item WHERE fid = '%s'", $edit["fid"]);
325
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
326
  else if ($edit["fid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
327
328
    db_query("DELETE FROM feed WHERE fid = '%s'", $edit["fid"]);
    db_query("DELETE FROM item WHERE fid = '%s'", $edit["fid"]);
329
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
330
  else if ($edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
331
    db_query("INSERT INTO feed (title, url, attributes, refresh) VALUES ('%s', '%s', '%s', '%s')", $edit["title"], $edit["url"], $edit["attributes"], $edit["refresh"]);
332
333
334
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
335
function import_save_attributes($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
336
  foreach ($edit as $iid => $value) {
Dries Buytaert's avatar
   
Dries Buytaert committed
337
    db_query("UPDATE item SET attributes = '%s' WHERE iid = '%s'", $value, $iid);
338
339
340
341
  }
  return "attributes has been saved";
}

Dries Buytaert's avatar
   
Dries Buytaert committed
342
function import_get_feed($fid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
343
  return db_fetch_array(db_query("SELECT * FROM feed WHERE fid = '%s'", $fid));
344
345
}

Dries Buytaert's avatar
   
Dries Buytaert committed
346
function import_get_bundle($bid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
347
  return db_fetch_array(db_query("SELECT * FROM bundle WHERE bid = '%s'", $bid));
348
349
}

Dries Buytaert's avatar
   
Dries Buytaert committed
350
function import_view() {
Dries Buytaert's avatar
   
Dries Buytaert committed
351
  $result = db_query("SELECT f.*, COUNT(i.iid) AS items FROM feed f LEFT JOIN item i ON f.fid = i.fid GROUP BY f.fid, f.title, f.url, f.refresh, f.timestamp, f.attributes, f.link, f.description ORDER BY f.title");
352

Dries Buytaert's avatar
   
Dries Buytaert committed
353
354
  $output .= "<h3>Feed overview</h3>";
  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
355
  $output .= " <tr><th>title</th><th>attributes</th><th>items</th><th>last update</th><th>next update</th><th colspan=\"3\">operations</th></tr>\n";
356
  while ($feed = db_fetch_object($result)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
357
    $output .= " <tr><td>". check_output($feed->title) ."</td><td>". check_output($feed->attributes) ."</td><td>". format_plural($feed->items, "item", "items") ."</td><td>". ($feed->timestamp ? format_interval(time() - $feed->timestamp) ." ago" : "never") ."</td><td>". ($feed->timestamp ? format_interval($feed->timestamp + $feed->refresh - time()) ." left" : "never") ."</td><td>". la(t("edit feed"), array("mod" => "import", "type" => "feed", "op" => "edit", "id" => $feed->fid)) ."</td><td>". la(t("remove items"), array("mod" => "import", "type" => "feed", "op" => "remove", "id" => $feed->fid)) ."</td><td>". la(t("update items"), array("mod" => "import", "type" => "feed", "op" => "update", "id" => $feed->fid)) ."</td></tr>\n";
358
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
359
  $output .= "</table>\n";
360
361
362

  $result = db_query("SELECT * FROM bundle ORDER BY title");

Dries Buytaert's avatar
   
Dries Buytaert committed
363
364
365
  $output .= "<h3>Bundle overview</h3>";
  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">\n";
  $output .= " <tr><th>title</th><th>attributes</th><th>operations</th></tr>\n";
366
  while ($bundle = db_fetch_object($result)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
367
    $output .= " <tr><td>". check_output($bundle->title) ."</td><td>". check_output($bundle->attributes) ."</td><td>". la(t("edit bundle"), array("mod" => "import", "type" => "bundle", "op" => "edit", "id" => $bundle->bid)) ."</td></tr>\n";
368
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
369
  $output .= "</table>\n";
370
371
372
373

  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
374
375
function import_fd_form() {

Dries Buytaert's avatar
   
Dries Buytaert committed
376
  $form .= form_textfield("Feed directory file", "url", "http://", 64, 128, "The fully-qualified URL of the feed directory file.");
Dries Buytaert's avatar
   
Dries Buytaert committed
377
378
  $form .= form_submit("Collect feeds");

Dries Buytaert's avatar
   
Dries Buytaert committed
379
  return form($form);
Dries Buytaert's avatar
   
Dries Buytaert committed
380
381
382
383
384
385
}

function import_fd_collect($edit) {

  set_time_limit(180);

Dries Buytaert's avatar
   
Dries Buytaert committed
386
  if ($fp = @fopen($edit["url"], "r")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
387
388
389
390
    // fetch data:
    while (!feof($fp)) {
      $data .= fgets($fp, 128);
    }
Dries Buytaert's avatar
Dries Buytaert committed
391
    fclose($fp);
Dries Buytaert's avatar
   
Dries Buytaert committed
392
393
394
395
396
397
398
399

    // initialize the translation table:
    $tt = array_flip(get_html_translation_table(HTML_ENTITIES));
    $tt["&apos;"] = "'";

    $items = explode("</channel>", $data);

    foreach ($items as $item) {
Dries Buytaert's avatar
   
Dries Buytaert committed
400
      unset($link, $title);
Dries Buytaert's avatar
   
Dries Buytaert committed
401
402
403
404
405
406
407
408
409
410

      // print "<pre>item = ". htmlentities($item) ."\n\n</pre>";

      eregi("<link>(.*)</link>", $item, $link);
      eregi("<title>(.*)</title>", $item, $title);

      $link = strip_tags(strtr($link[1], $tt));
      $title = strip_tags(strtr($title[1], $tt));

      // print "<b>title = $title, link = $link<br /></b>";
Dries Buytaert's avatar
   
Dries Buytaert committed
411
      if ($link && $link && !db_fetch_array(db_query("SELECT * FROM feed WHERE url = '%s'", $link))) {
Dries Buytaert's avatar
   
Dries Buytaert committed
412
413
414
415
416
417
        $output .= "<input type=\"checkbox\" name=\"edit[$title]\" value=\"$link\"> ". strtr($title, $tt) ."<br />";
      }
    }

    $output .= "<input type=\"submit\" name=\"op\" value=\"Import feeds\" />\n";

Dries Buytaert's avatar
   
Dries Buytaert committed
418
    return form($output);
Dries Buytaert's avatar
   
Dries Buytaert committed
419
420
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
421
    print status("failed to open '". $edit["url"] ."': $errstr.");
Dries Buytaert's avatar
   
Dries Buytaert committed
422
423
424
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
425
function import_fd_import($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
426
427
  if ($edit) {
    foreach ($edit as $title => $link) {
Dries Buytaert's avatar
   
Dries Buytaert committed
428
      import_save_feed(array("title" => $title, "url" => $link, "refresh" => 3600));
Dries Buytaert's avatar
   
Dries Buytaert committed
429
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
430
431
432
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
433
function import_tag() {
434

Dries Buytaert's avatar
Dries Buytaert committed
435
  $result = db_query("SELECT i.*, f.title AS feed FROM item i LEFT JOIN feed f ON i.fid = f.fid ORDER BY i.iid DESC LIMIT 50");
436

Dries Buytaert's avatar
   
Dries Buytaert committed
437
438
  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">\n";
  $output .= " <tr><th>time</th><th>feed</th><th>item</th></tr>\n";
439
  while ($item = db_fetch_object($result)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
440
    $output .= " <tr><td valign=\"top\" nowrap=\"nowrap\">". format_date($item->timestamp, "custom", "m/d/y") ."<br />". format_date($item->timestamp, "custom", "H:i") ."</td><td align=\"center\" valign=\"top\" nowrap=\"nowrap\">". la(check_output($item->feed), array("mod" => "import", "type" => "feed", "op" => "edit", "id" => $item->fid)) ."</td><td><a href=\"". check_output($item->link) ."\">". check_output($item->title) ."</a>". ($item->description ? "<br /><small><i>". check_output($item->description, 1) ."</i></small>" : "") ."<br /><input type=\"text\" name=\"edit[$item->iid]\" value=\"". check_form($item->attributes) ."\" size=\"50\" /></td></tr>\n";
441
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
442
443
  $output .= "</table>\n";
  $output .= "<input type=\"submit\" name=\"op\" value=\"Save attributes\" />\n";
444

Dries Buytaert's avatar
   
Dries Buytaert committed
445
  return form($output);
446
447
}

Dries Buytaert's avatar
   
Dries Buytaert committed
448
function import_admin() {
Dries Buytaert's avatar
   
Dries Buytaert committed
449
  global $op, $id, $type, $edit;
Dries Buytaert's avatar
   
Dries Buytaert committed
450

Dries Buytaert's avatar
   
Dries Buytaert committed
451
  if (user_access("administer news feeds")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
452

Dries Buytaert's avatar
   
Dries Buytaert committed
453
454
455
456
457
458
459
    $links[] = la(t("add new feed"), array("mod" => "import", "type" => "feed", "op" => "add"));
    $links[] = la(t("add new bundle"), array("mod" => "import", "type" => "bundle", "op" => "add"));
    $links[] = la(t("import feeds"), array("mod" => "import", "op" => "fd"));
    $links[] = la(t("tag items"), array("mod" => "import", "op" => "tag"));
    $links[] = la(t("overview"), array("mod" => "import", "op" => "view"));
    $links[] = la(t("help"), array("mod" => "import", "op" => "help"));

Kjartan Mannes's avatar
Kjartan Mannes committed
460
    print "<small>". implode(" | ", $links) ."</small><hr />";
Dries Buytaert's avatar
   
Dries Buytaert committed
461

Dries Buytaert's avatar
   
Dries Buytaert committed
462
    switch ($op) {
Dries Buytaert's avatar
   
Dries Buytaert committed
463
464
465
466
      case "help":
        print import_help();
        break;
      case "add":
Dries Buytaert's avatar
   
Dries Buytaert committed
467
        if ($type == "bundle") {
Dries Buytaert's avatar
   
Dries Buytaert committed
468
          print import_form_bundle();
Dries Buytaert's avatar
   
Dries Buytaert committed
469
470
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
471
          print import_form_feed();
Dries Buytaert's avatar
   
Dries Buytaert committed
472
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
473
474
        break;
      case "edit":
Dries Buytaert's avatar
   
Dries Buytaert committed
475
        if ($type == "bundle") {
Dries Buytaert's avatar
   
Dries Buytaert committed
476
          print import_form_bundle(import_get_bundle($id));
Dries Buytaert's avatar
   
Dries Buytaert committed
477
478
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
479
          print import_form_feed(import_get_feed($id));
Dries Buytaert's avatar
   
Dries Buytaert committed
480
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
481
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
482
483
484
485
486
487
488
489
490
491
      case "fd":
        print import_fd_form();
        break;
      case "Collect feeds":
        print import_fd_collect($edit);
        break;
      case "Import feeds":
        print import_fd_import($edit);
        print import_view();
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
492
493
      case "remove":
        print status(import_remove(import_get_feed($id)));
Dries Buytaert's avatar
   
Dries Buytaert committed
494
        print import_view();
Dries Buytaert's avatar
   
Dries Buytaert committed
495
496
        break;
      case "update":
Dries Buytaert's avatar
   
Dries Buytaert committed
497
498
        print status(import_refresh(import_get_feed($id)));
        print import_view();
Dries Buytaert's avatar
   
Dries Buytaert committed
499
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
500
501
502
      case "tag":
        print import_tag();
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
503
504
      case "Save attributes":
        print status(import_save_attributes($edit));
Dries Buytaert's avatar
   
Dries Buytaert committed
505
        print import_tag();
Dries Buytaert's avatar
   
Dries Buytaert committed
506
507
        break;
      case "Delete":
Dries Buytaert's avatar
   
Dries Buytaert committed
508
        $edit["title"] = 0;
Dries Buytaert's avatar
   
Dries Buytaert committed
509
510
        // fall through:
      case "Submit":
Dries Buytaert's avatar
   
Dries Buytaert committed
511
        if ($type == "bundle") {
Dries Buytaert's avatar
   
Dries Buytaert committed
512
          print status(import_save_bundle($edit));
Dries Buytaert's avatar
   
Dries Buytaert committed
513
514
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
515
          print status(import_save_feed($edit));
Dries Buytaert's avatar
   
Dries Buytaert committed
516
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
517
518
        // fall through:
      default:
Dries Buytaert's avatar
   
Dries Buytaert committed
519
        print import_view();
Dries Buytaert's avatar
   
Dries Buytaert committed
520
521
522
523
    }
  }
  else {
    print message_access();
524
525
526
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
527
528
529
function import_page_info() {
  global $theme;

Kjartan Mannes's avatar
Kjartan Mannes committed
530
531
532
533
  $links[] = lm(t("latest news"), array("mod" => "import"), "", array("title" => t("Read the latest news from syndicated websites.")));
  $links[] = lm(t("news by source"), array("mod" => "import", "op" => "feeds"), "", array("title" => t("View the latest headlines sorted by source.")));
  $links[] = lm(t("news by topic"), array("mod" => "import", "op" => "bundles"), "", array("title" => t("View the latest headlines sorted by topic.")));
  $links[] = lm(t("news sources"), array("mod" => "import", "op" => "sources"), "", array("title" => t("View a list of all the websites we syndicate from.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
534
535
536
537

  return "<div align=\"center\">". $theme->links($links) ."</div>";
}

Dries Buytaert's avatar
   
Dries Buytaert committed
538
function import_page_last() {
Dries Buytaert's avatar
   
Dries Buytaert committed
539
540
541
  global $theme;

  $result = db_query("SELECT i.*, f.title AS ftitle, f.link AS flink FROM item i LEFT JOIN feed f ON i.fid = f.fid ORDER BY i.iid DESC LIMIT ". variable_get("import_page_limit", 75));
Dries Buytaert's avatar
   
Dries Buytaert committed
542
543

  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"2\">";
Dries Buytaert's avatar
   
Dries Buytaert committed
544
  while ($item = db_fetch_object($result)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
545
546
    $links[] = lm(t("blog it"), array("mod" => "node", "op" => "add", "type" => "blog", "iid" => $item->iid), "", array("title" => t("Comment on this news item in your personal blog.")));
    $links[] = lm(t("feed"), array("mod" => "import", "op" => "feed", "id" => $item->fid), "", array("title" => t("Read more syndicated news from this feed.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
547
548

    if ($item->link) {
Kjartan Mannes's avatar
Kjartan Mannes committed
549
      $output .= "<tr><td><a href=\"$item->link\">$item->title</a> &middot; ". lm($item->ftitle, array("mod" => "import", "op" => "feed", "id" => $item->fid), "", array("title" => t("View more information about this feed."))) ."</td><td align=\"right\" nowrap=\"nowrap\" valign=\"top\">". $theme->links($links) ."</td></tr>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
550
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
551

Dries Buytaert's avatar
   
Dries Buytaert committed
552
    if ($item->description) {
Dries Buytaert's avatar
Dries Buytaert committed
553
      $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">". check_output($item->description, 1) ."</div><br /></td></tr>";
Dries Buytaert's avatar
   
Dries Buytaert committed
554
555
556
    }

    unset($links);
Dries Buytaert's avatar
   
Dries Buytaert committed
557
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
558
  $output .= "</table>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
559
560

  $theme->header();
Dries Buytaert's avatar
   
Dries Buytaert committed
561
  $theme->box(t("News feeds"), import_page_info());
Dries Buytaert's avatar
   
Dries Buytaert committed
562
  $theme->box(t("Latest news"), $output);
Dries Buytaert's avatar
   
Dries Buytaert committed
563
564
565
566
567
568
  $theme->footer();
}

function import_page_feed($fid) {
  global $theme;

Dries Buytaert's avatar
   
Dries Buytaert committed
569
  $feed = db_fetch_object(db_query("SELECT * FROM feed WHERE fid = '%s'", $fid));
Dries Buytaert's avatar
   
Dries Buytaert committed
570

Kjartan Mannes's avatar
Kjartan Mannes committed
571
  $header .= "<p><b>". t("Website") .":</b><div style=\"margin-left: 20px;\"><a href=\"$feed->link\">$feed->link</a></div></p>";
Dries Buytaert's avatar
Dries Buytaert committed
572
  $header .= "<p><b>". t("Description") .":</b><div style=\"margin-left: 20px;\">". check_output($feed->description, 1) ."</div></p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
573
  $header .= "<p><b>". t("Last update") .":</b><div style=\"margin-left: 20px;\">". format_interval(time() - $feed->timestamp) ." ". t("ago") ."<a href=\"$feed->url\"><img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" /></a><br /><br /></div></p>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
574

Dries Buytaert's avatar
   
Dries Buytaert committed
575
  $result = db_query("SELECT * FROM item WHERE fid = '%s' ORDER BY iid DESC LIMIT ". variable_get("import_page_limit", 75), $fid);
Dries Buytaert's avatar
   
Dries Buytaert committed
576
577

  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"2\">";
Dries Buytaert's avatar
   
Dries Buytaert committed
578
  while ($item = db_fetch_object($result)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
579
    $links[] = lm(t("blog it"), array("mod" => "node", "op" => "add", "type" => "blog", "iid" => $item->iid), "", array("title" => t("Comment on this news item in your personal blog.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
580
    $links[] = "<a href=\"$item->link\">". t("visit") ."</a>";
Dries Buytaert's avatar
   
Dries Buytaert committed
581

Dries Buytaert's avatar
   
Dries Buytaert committed
582
    if ($item->link) {
Kjartan Mannes's avatar
Kjartan Mannes committed
583
      $output .= "<tr><td><a href=\"$item->link\">$item->title</a></td><td align=\"right\" nowrap=\"nowrap\" valign=\"top\">". $theme->links($links) ."</td></tr>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
584
585
    }
    if ($item->description) {
Dries Buytaert's avatar
Dries Buytaert committed
586
      $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">". check_output($item->description, 1) ."</div><br /></td></tr>";
Dries Buytaert's avatar
   
Dries Buytaert committed
587
588
589
590
591
    }

    unset($links);
  }
  $output .= "</table>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
592
593

  $theme->header();
Dries Buytaert's avatar
   
Dries Buytaert committed
594
595
  $theme->box(check_output($feed->title), $header);
  $theme->box(t("Latest news"), $output);
Dries Buytaert's avatar
   
Dries Buytaert committed
596
597
598
599
600
601
  $theme->footer();
}

function import_page_bundle($bid) {
  global $theme;

Dries Buytaert's avatar
   
Dries Buytaert committed
602
  $bundle = db_fetch_object(db_query("SELECT * FROM bundle WHERE bid = '%s'", $bid));
Dries Buytaert's avatar
   
Dries Buytaert committed
603

Kjartan Mannes's avatar
Kjartan Mannes committed
604
  $header .= "<p><b>". t("Website") .":</b><div style=\"margin-left: 20px;\">". lm("", array("mod" => "import", "op" => "bundle", "id" => $bundle->bid)) ."</div></p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
605
  $header .= "<p><b>". t("Description") .":</b><div style=\"margin-left: 20px;\">". t("A composite news feed about") ." ". check_output($bundle->attributes) .".</div></p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
606
607
608
609
610

  $keys = explode(",", $bundle->attributes);
  foreach ($keys as $key) $where[] = "i.attributes LIKE '%". trim($key) ."%'";
  $result = db_query("SELECT i.*, f.title AS ftitle, f.link AS flink FROM item i, feed f WHERE (". implode(" OR ", $where) .") AND i.fid = f.fid ORDER BY iid DESC LIMIT ". variable_get("import_page_limit", 75));

Dries Buytaert's avatar
   
Dries Buytaert committed
611
  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"2\">";
Dries Buytaert's avatar
   
Dries Buytaert committed
612
  while ($item = db_fetch_object($result)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
613
614
    $links[] = lm(t("blog it"), array("mod" => "node", "op" => "add", "type" => "blog", "iid" => $item->iid), "", array("title" => t("Comment on this news item in your personal blog.")));
    $links[] = lm(t("feed"), array("mod" => "import", "op" => "feed", "id" => $item->fid), "", array("title" => t("Read more syndicated news from this feed.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
615
616
617
    $links[] = "<a href=\"$item->link\">". t("visit") ."</a>";

    if ($item->link) {
Kjartan Mannes's avatar
Kjartan Mannes committed
618
      $output .= "<tr><td><a href=\"$item->link\">$item->title</a> &middot; ". lm($item->ftitle, array("mod" => "import", "op" => "feed", "id" => $item->fid), "", array("title" => t("View more information about this feed."))) ."</td><td align=\"right\" nowrap=\"nowrap\" valign=\"top\">". $theme->links($links) ."</td></tr>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
619
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
620

Dries Buytaert's avatar
   
Dries Buytaert committed
621
    if ($item->description) {
Dries Buytaert's avatar
Dries Buytaert committed
622
      $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">". check_output($item->description, 1) ."</div><br /></td></tr>";
Dries Buytaert's avatar
   
Dries Buytaert committed
623
624
625
    }

    unset($links);
Dries Buytaert's avatar
   
Dries Buytaert committed
626
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
627
  $output .= "</table>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
628
629

  $theme->header();
Dries Buytaert's avatar
   
Dries Buytaert committed
630
631
  $theme->box(check_output($bundle->title), $header);
  $theme->box(t("Latest news"), $output);
Dries Buytaert's avatar
   
Dries Buytaert committed
632
  $theme->footer();
Dries Buytaert's avatar
   
Dries Buytaert committed
633

Dries Buytaert's avatar
   
Dries Buytaert committed
634
635
}

Dries Buytaert's avatar
   
Dries Buytaert committed
636
637
638
639
640
641
function import_page_sources() {
  global $theme;

  $result = db_query("SELECT * FROM feed ORDER BY title");

  while ($feed = db_fetch_object($result)) {
Kjartan Mannes's avatar
Kjartan Mannes committed
642
    $output .= lm("", array("mod" => "import", "op" => "feed", "id" => $feed->fid));
Dries Buytaert's avatar
   
Dries Buytaert committed
643
    $output .= "<div style=\"margin-left: 20px;\">". check_output($feed->description, 1) ."</div><br />";
Dries Buytaert's avatar
   
Dries Buytaert committed
644
645
  }

Kjartan Mannes's avatar
Kjartan Mannes committed
646
  $output .= lm("<img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" align=\"right\" border=\"0\" />", array("mod" => "import", "op" => "fd"), "", array("title" => t("View the list of syndicated websites in XML format."))) ."<br />\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
647

Dries Buytaert's avatar
   
Dries Buytaert committed
648
649
650
651
652
653
  $theme->header();
  $theme->box(t("News feeds"), import_page_info());
  $theme->box(t("News sources"), $output);
  $theme->footer();
}

Dries Buytaert's avatar
   
Dries Buytaert committed
654
655
656
657
658
function import_page_fd() {

  $result = db_query("SELECT * FROM feed ORDER BY title");

  $output .= "<?xml version=\"1.0\"?>\n\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
659
  $output .= "<rssfeeds version=\"0.1\">\n\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
660
661
662
663
664
665
666
667

  while ($feed = db_fetch_object($result)) {
    $output .= "<channel>\n";
    $output .= " <title>". htmlentities($feed->title) ."</title>\n";
    $output .= " <link>". htmlentities($feed->url) ."</link>\n";
    $output .= "</channel>\n\n";
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
668
669
  $output .= "</rssfeeds>\n";

Dries Buytaert's avatar
   
Dries Buytaert committed
670
  header("Content-Type: text/xml");
Dries Buytaert's avatar
   
Dries Buytaert committed
671
672
673
674

  print $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
675
function import_page_bundles() {
Dries Buytaert's avatar
   
Dries Buytaert committed
676
  import_page_blocks(import_get_bundles());
Dries Buytaert's avatar
   
Dries Buytaert committed
677
678
679
}

function import_page_feeds() {
Dries Buytaert's avatar
   
Dries Buytaert committed
680
  import_page_blocks(import_get_feeds());
Dries Buytaert's avatar
   
Dries Buytaert committed
681
682
683
684
685
686
687
688
689
690
691
692
693
}

function import_page_blocks($blocks) {
  global $theme;

  $count = count($blocks);
  $items = ceil($count / 3);
  $c1 = min($items, $count);
  $c2 = min(2 * $items, $count);
  $c3 = $count;
  $i = 0;

  $theme->header();
Dries Buytaert's avatar
   
Dries Buytaert committed
694
  $theme->box(t("News feeds"), import_page_info());
Dries Buytaert's avatar
   
Dries Buytaert committed
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
  print "<table cellpadding=\"0\" cellspacing=\"5\" border=\"0\" width=\"100%\">\n";
  print " <tr>\n";
  print "  <td width=\"33%\" valign=\"top\">\n";
  for ($i; $i < $c1; $i++) $theme->box($blocks[$i]["subject"], $blocks[$i]["content"]);
  print "  </td>\n";
  print "  <td width=\"33%\" valign=\"top\">\n";
  for ($i; $i < $c2; $i++) $theme->box($blocks[$i]["subject"], $blocks[$i]["content"]);
  print "  </td>\n";
  print "  <td width=\"33%\" valign=\"top\">\n";
  for ($i; $i < $c3; $i++) $theme->box($blocks[$i]["subject"], $blocks[$i]["content"]);
  print "  </td>\n";
  print " </tr>\n";
  print "</table>\n";
  $theme->footer();
}

function import_page() {
  global $op, $id;

  if (user_access("access news feeds")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
715
    switch ($op) {
Dries Buytaert's avatar
   
Dries Buytaert committed
716
717
718
719
720
721
      case "feed":
        import_page_feed($id);
        break;
      case "bundle":
        import_page_bundle($id);
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
722
723
724
      case "feeds":
        import_page_feeds();
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
725
726
727
      case "bundles":
        import_page_bundles();
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
728
729
      case "sources":
        import_page_sources();
Dries Buytaert's avatar
   
Dries Buytaert committed
730
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
731
732
733
      case "fd":
        import_page_fd();
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
734
      default:
Dries Buytaert's avatar
   
Dries Buytaert committed
735
        import_page_last();
Dries Buytaert's avatar
   
Dries Buytaert committed
736
737
738
    }
  }
}
Dries Buytaert's avatar
   
Dries Buytaert committed
739

740
?>