import.module 37.6 KB
Newer Older
1
<?php
2
// $Id$
3

4

Dries Buytaert's avatar
   
Dries Buytaert committed
5
function import_help($section = "admin/help#import") {
Dries Buytaert's avatar
   
Dries Buytaert committed
6
7
8
  $output = "";

  switch ($section) {
Dries Buytaert's avatar
   
Dries Buytaert committed
9
    case 'admin/help#import':
Dries Buytaert's avatar
   
Dries Buytaert committed
10
      $output .= "<p>Thousands of web sites, especially news sites and weblogs, syndicate their most recent site content for others to display. The syndicated content always includes titles, also known as headlines, for the newest published stories.  Each headline acts as a direct link to the stories on the remote site. Along with the headline, most sites typically provide either the first few paragraphs of the story or a short summary. Many individuals use client-based news aggregators on their personal computer to aggregate content, such as %amphetadesk</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
11
12
      $output .= "<p>Drupal also has a news aggregator built in as a standard feature. With it, you can subscribe to feeds from other sites and display their content for your site users. Simply enable the import module in site administration and enter the feeds that you choose.</p>";
      $output .= "<h3>What do I need to subscribe to a feed?</h3>";
Dries Buytaert's avatar
   
Dries Buytaert committed
13
      $output .= "<p>The standard method of syndication is using the XML-based %rss (RSS). To syndicate a site's content, obtain the full URL of the RSS page providing syndication. Common file tags for RSS pages are .rss, .xml and .rdf. Example: %slashdot-rss.</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
14
      $output .= "<p>Most weblog sites that offer syndication will have an obvious link on the main page. Often you need only look for an XML syndication button, such as the one Drupal uses for site syndication.</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
15
16
      $output .= "<p>But some sites do not make their RSS feeds as easy to find. Or maybe you want to find a number of feeds on a given topic, without extensively searching the web. In that case, try an RSS syndication directory such as %syndic8.</p>";
      $output .= "<p>To learn much more about RSS, read Mark Pilgrim's %rss-what and WebReference.com's %rss-evolution.</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
17
      $output .= "<p>NOTE: Enable your site's XML syndication button by turning on the Syndicate block in block management.</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
18
      $output .= "<h3>Configuring news feeds</h3>";
Dries Buytaert's avatar
   
Dries Buytaert committed
19
20
      $output .= "<p>To subscribe to an RSS feed on another site, use the %admin-news shortcut at the top of the news aggregation page. The link leads directly to the news aggregation configuration section of Drupal site administration.</p>";
      $output .= "<p>Once there, select %new-feed from the left hand menu. Drupal will then ask for the following:</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
21
      $output .= "<ul>";
22
23
24
25
      $output .= "<li><strong>Title</strong> -- The text entered here will be used in your news aggregator, within the administration configuration section, and as title for the news feed block. As a general rule, use the web site name from which the feed originates.</li>";
      $output .= " <li><strong>URL</strong> -- Here you'll enter the fully-qualified URL for the feed for the site you want to subscribe to.</li>";
      $output .= "<li><strong>Attributes</strong> -- Attributes are keywords which can be used to collect feeds into <i>bundles</i> (see below). Think of these as the means of classifying your feeds. Separate multiple attributes with commas. If you do not plan on using the specific feed in a bundle, this input field can be left blank.</li>";
      $output .= "<li><strong>Update interval</strong> -- The update interval is how often Drupal will automatically access the RSS URL for the site for fresh content. The 1 hour default is typically the minimum you will want to use. Accessing another site's RSS page more frequently can be considered impolite. After all, it does require the other site's server handle your requests. To use this feature cron.php must be called regularly, otherwise, you'll have to manually update feeds one at a time within the news aggregation administration section by using %update-items.</li>";
Dries Buytaert's avatar
   
Dries Buytaert committed
26
      $output .= "</ul>";
Dries Buytaert's avatar
   
Dries Buytaert committed
27
      $output .= "<p>Once you submit your new feed, check to see if it is working properly. Select %update-items on the %admin-news page. If you do not see any items listed for that feed, edit the feed and make sure that the URL was entered correctly.</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
28
29
30
31
      $output .= "<h3>Adding bundles</h3>";
      $output .= "<p>You may want to follow some feeds more closely than others. Or perhaps you'd like to display a select list of the titles for some feeds as a block for users.  Bundles are a way of grouping your feeds into categories. Bundles look for feeds that contain at least one of the keywords, or attributes, associated with the bundle and display those feeds together.</p>";
      $output .= "<p>When adding a bundle, Drupal will ask for:</p>";
      $output .= "<ul>";
32
33
      $output .= " <li><strong>Title</strong> -- The title will be used in the <i>news by topics</i> listing in your news aggregator and with the customized block created for the bundle.</li>";
      $output .= " <li><strong>Attributes</strong> -- Enter one or more of the attributes used to categorize the news feeds already created. Separate multiple attributes with commas.  Be careful to use the same spelling. Don't have any feeds with attributes for the bundle? After creating the bundle, edit existing feeds or create new ones and tag them with the attribute.</li>";
Dries Buytaert's avatar
   
Dries Buytaert committed
34
35
36
37
      $output .= "</ul>";
      $output .= "<h3>Using the news aggregator</h3>";
      $output .= "<p>The news aggregator has a number of ways that it displays your subscribed content:</p>";
      $output .= "<ul>";
38
      $output .= " <li><strong>Latest news</strong> -- Displays all incoming content in the order received with:";
Dries Buytaert's avatar
   
Dries Buytaert committed
39
40
41
42
43
44
45
46
      $output .= "  <ul>";
      $output .= "   <li>The title of the original post.</li>";
      $output .= "   <li>The name of the source, which acts as a link to an individual feed page, listing information about that feed and incoming content for that feed only.</li>";
      $output .= "   <li>A description, the first few paragraphs or summary of the originating post (if any).</li>";
      $output .= "   <li>A <i>blog it</i> link. Users can select this link to have Drupal automatically prepare a blog post for the specific item.</li>";
      $output .= "   <li>A <i>feed</i> link, which acts as a link to an individual feed page, listing information about that feed and incoming content for that feed only.</li>";
      $output .= "  </ul>";
      $output .= " </li>";
47
48
49
      $output .= " <li><strong>News by source</strong> -- Organizes incoming content by feed, displaying titles which link to the originating post. Also has an icon which acts as blog it link.</li>";
      $output .= " <li><strong>News by topic</strong> -- Organizes incoming content by bundles, displaying titles which link to the originating post. Also has an icon which acts as blog it link.</li>";
      $output .= " <li><strong>News sources</strong> -- Displays an alphabetical listing of all subscribed feeds and a description. The title acts as a link to an individual feed page, listing information about that feed and incoming content for that feed only.</li>";
Dries Buytaert's avatar
   
Dries Buytaert committed
50
51
52
      $output .= "</ul>";
      $output .= "<h3>RSS feed blocks</h3>";
      $output .= "<p>In addition to providing subscribed content through the news aggregator, Drupal automatically creates a block for each subscribed feed and every bundle created.  Beside each headline in each block, Drupal includes an icon which acts a blog it link. Enable any or all of the blocks using block management.</p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
53
      $output = t($output, array("%amphetadesk" => "<a href=\"http://www.disobey.com/amphetadesk/\">AmphetaDesk</a>", "%rss" => "<a href=\"http://groups.yahoo.com/group/rss-dev/files/specification.html\">Rich Site Summary</a>", "%slashdot-rss" => "<a href=\"http://slashdot.org/slashdot.rdf\">http://slashdot.org/slashdot.rdf</a>", "%syndic8" => "<a href=\"http://www.syndic8.com/\">Syndic8</a>", "%rss-what" => "<a href=\"http://www.xml.com/pub/a/2002/12/18/dive-into-xml.html\">What is RSS</a>", "%rss-evolution" => "<a href=\"http://www.webreference.com/authoring/languages/xml/rss/1/\">The Evolution of RSS</a>", "%admin-news" => l(t("RSS/RDF"), "admin/node/syndication/news"), "%new-feed" => l(t("new feed"), "admin/node/syndication/news/add/feed"), "%update-items" => l(t("update items"), "admin/node/syndication/news")));
Dries Buytaert's avatar
   
Dries Buytaert committed
54
      break;
Dries Buytaert's avatar
   
Dries Buytaert committed
55
    case 'admin/system/modules#description':
Dries Buytaert's avatar
   
Dries Buytaert committed
56
      $output = t("Used to aggregate syndicated content (RSS and RDF).");
Dries Buytaert's avatar
   
Dries Buytaert committed
57
58
      break;
    case 'admin/system/modules/import':
Dries Buytaert's avatar
   
Dries Buytaert committed
59
      $output = t("Drupal's news aggregator controls how many RSS/RDF items from a single source are displayed in a \"Block\", and on the page that goes with that block.");
Dries Buytaert's avatar
   
Dries Buytaert committed
60
      break;
Dries Buytaert's avatar
   
Dries Buytaert committed
61
    case 'admin/node/syndication/news':
62
      $output = t("Several web sites, especially news related sites, syndicate parts of their site's content for other web sites to display. Usually, the syndicated content includes the latest headlines with a direct link to that story on the remote site. Some syndicated content also includes a description of the headline. The standard method of syndication is using the XML based Rich Site Summary (RSS). To get a feed to work you <strong>must</strong> run \"cron.php\". To display the feed in a block you must turn on the %block. <br /><ul><li>To delete a feed choose \"edit feed\"</li><li>To clear all of the entries from a feed choose \"Remove items\"</li><li>To check whether a feed is working, and to get new items <strong>now</strong> click on \"update items\"</li></ul><ul><li>To delete a bundle choose \"edit bundle\".</li></ul>", array("%block" => l(t("feed's block"), "admin/system/block")));
Dries Buytaert's avatar
   
Dries Buytaert committed
63
      break;
Dries Buytaert's avatar
   
Dries Buytaert committed
64
    case 'admin/node/syndication/news/add/feed':
Dries Buytaert's avatar
   
Dries Buytaert committed
65
      $output = t("Add a site that has an RSS/RDF feed. The URL is the full path to the RSS feed file. For the feed to update automatically you must run \"cron.php\". The \"Attributes\" are used to bundle this feed with other feeds (See %bundle), and to tag articles from this feed.<br />Note: If you already have a feed with the URL you are planning to use, the system will not accept another feed with the same URL.", array("%bundle" => l(t("add new bundle"), "admin/node/syndication/news/add/bundle")));
Dries Buytaert's avatar
   
Dries Buytaert committed
66
      break;
Dries Buytaert's avatar
   
Dries Buytaert committed
67
    case 'admin/node/syndication/news/add/bundle':
Dries Buytaert's avatar
   
Dries Buytaert committed
68
      $output = t("Bundles provide a generalized way of creating composite feeds. They allow you, for example, to combine various sport-related feeds into one bundle called <i>Sport</i>. If an article from a feed has been \"tag\"-ged (See %tag too look at and change tags.) with a matching \"Attribute\" then it will be added to the bundle.", array("%tag" => l(t("tag news item"), "admin/node/syndication/news/tag")));
Dries Buytaert's avatar
   
Dries Buytaert committed
69
      break;
Dries Buytaert's avatar
   
Dries Buytaert committed
70
    case 'admin/node/syndication/news/tag':
Dries Buytaert's avatar
   
Dries Buytaert committed
71
      $output = t("This allows you to see and change an news item's \"tag\". All articles are originally tagged with the \"Attributes\" of their feed.");
Dries Buytaert's avatar
   
Dries Buytaert committed
72
73
74
      break;
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
75
  return $output;
76
77
}

Dries Buytaert's avatar
   
Dries Buytaert committed
78
function import_help_page() {
Dries Buytaert's avatar
   
Dries Buytaert committed
79
  print theme("page", import_help());
Dries Buytaert's avatar
   
Dries Buytaert committed
80
81
}

82
function import_settings() {
Dries Buytaert's avatar
   
Dries Buytaert committed
83
  $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
84
85
  $output .= form_select(t("Items per block"), "import_block_limit", variable_get("import_block_limit", 15), $number, t("The maximum number of news items displayed in one block."));
  $output .= form_select(t("Items per page"), "import_page_limit", variable_get("import_page_limit", 75), $number, t("The maximum number of news items displayed on one page."));
Dries Buytaert's avatar
   
Dries Buytaert committed
86

Dries Buytaert's avatar
   
Dries Buytaert committed
87
88
89
  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
90
function import_perm() {
Dries Buytaert's avatar
   
Dries Buytaert committed
91
  return array("administer news feeds", "access news feeds");
Dries Buytaert's avatar
   
Dries Buytaert committed
92
93
94
}

function import_link($type) {
Dries Buytaert's avatar
   
Dries Buytaert committed
95

Dries Buytaert's avatar
   
Dries Buytaert committed
96
97
  $links = array();

Dries Buytaert's avatar
   
Dries Buytaert committed
98
  if ($type == "page" && user_access("access news feeds")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
99
    $links[] = l(t("news feeds"), "import", array("title" => t("Read the latest news from syndicated web sites.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
100
101
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
102
  if ($type == "system") {
Dries Buytaert's avatar
   
Dries Buytaert committed
103
104
105
106
    menu("aggregator", t('news aggregator'), 'import_page', 5);
    menu("aggregator/feeds", t('news by source'), 'import_page');
    menu("aggregator/bundles", t('news by topic'), 'import_page');
    menu("aggregator/sources", t('news sources'), 'import_page');
Dries Buytaert's avatar
   
Dries Buytaert committed
107

Dries Buytaert's avatar
   
Dries Buytaert committed
108
    if (user_access("administer news feeds")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
109
110
111
112
113
      menu("admin/node/syndication", t("syndication"), NULL, 5);
      menu("admin/node/syndication/news", t("RSS/RDF"), "import_admin");
      menu("admin/node/syndication/news/add/feed", t("new feed"), "import_admin", 2);
      menu("admin/node/syndication/news/add/bundle", t("new bundle"), "import_admin", 3);
      menu("admin/node/syndication/news/tag", t("tag items"), "import_admin", 4);
Dries Buytaert's avatar
   
Dries Buytaert committed
114
115
116
      menu("admin/node/syndication/news/help", t("help"), "import_help_page", 9);
    }
    if (user_access("access news feeds")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
117
      menu("import", t("news feeds"), "import_page", 0, MENU_HIDE);
Dries Buytaert's avatar
   
Dries Buytaert committed
118
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
119
120
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
121
  return $links;
Dries Buytaert's avatar
   
Dries Buytaert committed
122
123
}

Dries Buytaert's avatar
   
Dries Buytaert committed
124
function import_cron() {
Dries Buytaert's avatar
   
Dries Buytaert committed
125
  $result = db_query("SELECT * FROM {feed} WHERE timestamp + refresh < ". time());
Dries Buytaert's avatar
   
Dries Buytaert committed
126
127
128
129
130
131
  while ($feed = db_fetch_array($result)) {
    import_refresh($feed);
  }
}

function import_update() {
Dries Buytaert's avatar
   
Dries Buytaert committed
132
  $result = db_query("SELECT * FROM {feed} ");
133
  while ($feed = db_fetch_array($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
134
135
136
137
    import_refresh($feed);
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
138
function theme_import_format_item($item, $feed = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
139
  global $user;
Dries Buytaert's avatar
   
Dries Buytaert committed
140

141
  if ($user->uid && module_exist("blog") && user_access("maintain personal blog")) {
Kjartan Mannes's avatar
Kjartan Mannes committed
142
    $output .= "<div class=\"icon\">". l("<img src=\"". theme("image", "blog.gif") ."\" alt=\"". t("blog it") ."\" title=\"". t("blog it") ."\" />", "node/add/blog", array("title" => t("Comment on this news item in your personal blog."), "class" => "blog-it"), "iid=$item->iid") ."</div>";
Dries Buytaert's avatar
   
Dries Buytaert committed
143
144
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
145
  // external link
Dries Buytaert's avatar
   
Dries Buytaert committed
146
  $output .= "<a href=\"$item->link\">$item->title</a>";
147

Dries Buytaert's avatar
   
Dries Buytaert committed
148
  return $output;
149
150
}

Dries Buytaert's avatar
   
Dries Buytaert committed
151
152
function import_bundle_block($attributes) {

153
154
155
  if ($attributes) {
    $keys = explode(",", $attributes);
    foreach ($keys as $key) $where[] = "attributes LIKE '%". trim($key) ."%'";
156

Dries Buytaert's avatar
   
Dries Buytaert committed
157
    $result = db_query_range("SELECT * FROM {item} WHERE ". implode(" OR ", $where) ." ORDER BY iid DESC", 0, variable_get("import_block_limit", 15));
Dries Buytaert's avatar
   
Dries Buytaert committed
158
  }
159

Dries Buytaert's avatar
   
Dries Buytaert committed
160
  $items = array();
Dries Buytaert's avatar
   
Dries Buytaert committed
161
  while ($item = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
162
    $items[] = theme("import_format_item", $item);
163
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
164

Dries Buytaert's avatar
   
Dries Buytaert committed
165
  return theme("item_list", $items);
166
167
}

Dries Buytaert's avatar
   
Dries Buytaert committed
168
function import_feed_block($feed) {
Dries Buytaert's avatar
   
Dries Buytaert committed
169
  $result = db_query_range("SELECT * FROM {item} WHERE fid = %d ORDER BY iid DESC ", $feed->fid, 0, variable_get("import_block_limit", 15));
Dries Buytaert's avatar
   
Dries Buytaert committed
170
171

  $items = array();
Dries Buytaert's avatar
   
Dries Buytaert committed
172
  while ($item = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
173
    $items[] = theme("import_format_item", $item);
Dries Buytaert's avatar
   
Dries Buytaert committed
174
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
175

Dries Buytaert's avatar
   
Dries Buytaert committed
176
  return theme("item_list", $items);
Dries Buytaert's avatar
   
Dries Buytaert committed
177
178
}

Dries Buytaert's avatar
   
Dries Buytaert committed
179
180
function import_block($op, $delta) {
  if ($op == "list") {
Dries Buytaert's avatar
   
Dries Buytaert committed
181
    $result = db_query("SELECT * FROM {bundle} ORDER BY title");
Dries Buytaert's avatar
   
Dries Buytaert committed
182
    while ($bundle = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
183
      $block["bundle:$bundle->bid"]["info"] = "$bundle->title bundle";
Dries Buytaert's avatar
   
Dries Buytaert committed
184
185
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
186
    $result = db_query("SELECT * FROM {feed} ORDER BY fid");
Dries Buytaert's avatar
   
Dries Buytaert committed
187
    while ($feed = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
188
      $block["feed:$feed->fid"]["info"] = "$feed->title feed";
Dries Buytaert's avatar
   
Dries Buytaert committed
189
190
191
192
193
    }

    return $block;
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
194
195
196
    list($type, $id) = split(":", $delta);
    switch ($type) {
      case "feed":
Dries Buytaert's avatar
   
Dries Buytaert committed
197
        $feed = db_fetch_object(db_query("SELECT * FROM {feed} WHERE fid = %d", $id));
Dries Buytaert's avatar
   
Dries Buytaert committed
198
        $block["subject"] = $feed->title;
Dries Buytaert's avatar
   
Dries Buytaert committed
199
        $block["content"] .= import_feed_block($feed) ."<div class=\"more-link\">".  l(t("more"), "import/feed/$feed->fid", array("title" => t("View this feed's recent news."))) ."</div>";
Dries Buytaert's avatar
   
Dries Buytaert committed
200
201
202
        break;

      case "bundle":
Dries Buytaert's avatar
   
Dries Buytaert committed
203
        $bundle = db_fetch_object(db_query("SELECT * FROM {bundle} WHERE bid = %d", $id));
Dries Buytaert's avatar
   
Dries Buytaert committed
204
        $block["subject"] = $bundle->title;
Dries Buytaert's avatar
   
Dries Buytaert committed
205
        $block["content"] .= import_bundle_block($bundle->attributes) ."<div class=\"more-link\">". l(t("more"), "import/bundle/$bundle->bid", array("title" => t("View this bundle's recent news."))) ."</div>";
Dries Buytaert's avatar
   
Dries Buytaert committed
206
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
207
208
209
210
    }

    return $block;
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
211
212
}

Dries Buytaert's avatar
   
Dries Buytaert committed
213
function import_get_bundles($attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
214

Dries Buytaert's avatar
   
Dries Buytaert committed
215
216
  $block = array();

Dries Buytaert's avatar
   
Dries Buytaert committed
217
  $result = db_query("SELECT * FROM {bundle} ORDER BY title");
Dries Buytaert's avatar
   
Dries Buytaert committed
218
  while ($bundle = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
219
    $block["bundle:$bundle->bid"]["subject"] = $bundle->title;
Dries Buytaert's avatar
   
Dries Buytaert committed
220
    $block["bundle:$bundle->bid"]["content"] = import_bundle_block($bundle->attributes) ."<div class=\"more-link\">". l(t("more"), "import/bundle/$bundle->bid", array("title" => t("View this bundle's recent news."))) ."</div>";
Dries Buytaert's avatar
   
Dries Buytaert committed
221
    $block["bundle:$bundle->bid"]["info"] = "$bundle->title bundle";
Dries Buytaert's avatar
   
Dries Buytaert committed
222
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
223

Dries Buytaert's avatar
   
Dries Buytaert committed
224
  return $block;
Dries Buytaert's avatar
   
Dries Buytaert committed
225
226
}

Dries Buytaert's avatar
   
Dries Buytaert committed
227
function import_get_feeds($attributes = 0) {
Dries Buytaert's avatar
   
Dries Buytaert committed
228

Dries Buytaert's avatar
   
Dries Buytaert committed
229
230
  $block = array();

Dries Buytaert's avatar
   
Dries Buytaert committed
231
  $result = db_query("SELECT * FROM {feed} ORDER BY fid");
Dries Buytaert's avatar
   
Dries Buytaert committed
232
  while ($feed = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
233
    $block["feed:$feed->fid"]["subject"] = $feed->title;
Dries Buytaert's avatar
   
Dries Buytaert committed
234
    $block["feed:$feed->fid"]["content"] = import_feed_block($feed) ."<div class=\"more-link\">". l(t("more"), "import/feed/$feed->fid", array("title" => t("View this feed's recent news."))) ."</div>";
Dries Buytaert's avatar
   
Dries Buytaert committed
235
    $block["feed:$feed->fid"]["info"] = "$feed->title feed";
Dries Buytaert's avatar
   
Dries Buytaert committed
236
237
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
238
  return $block;
Dries Buytaert's avatar
   
Dries Buytaert committed
239
240
}

Dries Buytaert's avatar
   
Dries Buytaert committed
241
function import_remove($feed) {
Dries Buytaert's avatar
   
Dries Buytaert committed
242
  db_query("DELETE FROM {item} WHERE fid = %d", $feed["fid"]);
243
  return t("removed news items from '%site'.", array("%site" => $feed["title"]));
Dries Buytaert's avatar
   
Dries Buytaert committed
244
245
}

246
247
// Call-back function used by XML parser:
function import_element_start($parser, $name, $attributes) {
Dries Buytaert's avatar
   
Dries Buytaert committed
248
249
250
251
252
253
254
255
256
257
  global $item, $element, $tag;

  switch ($name) {
    case "IMAGE":
    case "TEXTINPUT":
      $element = $name;
      break;
    case "ITEM":
      $element = $name;
      $item += 1;
258
259
260
261
262
263
264
  }

  $tag = $name;
}

// Call-back function used by XML parser:
function import_element_end($parser, $name) {
Dries Buytaert's avatar
   
Dries Buytaert committed
265
266
267
268
269
270
271
272
  global $element;

   switch ($name) {
    case "IMAGE":
    case "TEXTINPUT":
    case "ITEM":
      $element = "";
  }
273
274
275
276
}

// Call-back function used by XML parser:
function import_element_data($parser, $data) {
Dries Buytaert's avatar
   
Dries Buytaert committed
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
  global $channel, $element, $items, $item, $tag;

  switch ($element) {
    case "ITEM":
      $items[$item][$tag] .= $data;
      break;
    case "IMAGE":
    case "TEXTINPUT":
      /*
      ** The sub-elements "image" and "textinput" are not supported
      ** but we have recognize them or their content will end up in
      ** the items-array.
      */
      break;
    default:
      $channel[$tag] .= $data;
293
294
295
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
296
function import_refresh($feed) {
297

Dries Buytaert's avatar
Dries Buytaert committed
298
299
300
301
  // unset the global variables before we use them:
  unset($GLOBALS["channel"], $GLOBALS["element"], $GLOBALS["item"], $GLOBALS["items"], $GLOBALS["tag"]);

  // after we unset the variables, we can global them again:
302
303
  global $items, $channel;

Dries Buytaert's avatar
   
Dries Buytaert committed
304
305
306
307
  /*
  ** Check whether the feed is properly configured:
  */

Dries Buytaert's avatar
   
Dries Buytaert committed
308
  if (!ereg("^http://|ftp://", $feed["url"])) {
Dries Buytaert's avatar
   
Dries Buytaert committed
309
    return t("failed to parse RSS feed '%site': incorrect or missing URL.", array("%site" => $feed["title"]));
Dries Buytaert's avatar
   
Dries Buytaert committed
310
311
312
  }

  /*
Dries Buytaert's avatar
   
Dries Buytaert committed
313
  ** Grab the news items:
Dries Buytaert's avatar
   
Dries Buytaert committed
314
315
  */

Dries Buytaert's avatar
   
Dries Buytaert committed
316
  if ($fp = @fopen($feed["url"], "r")) {
317
    // fetch data:
Dries Buytaert's avatar
   
Dries Buytaert committed
318
319
320
    while (!feof($fp)) {
      $data .= fgets($fp, 128);
    }
Dries Buytaert's avatar
Dries Buytaert committed
321
    fclose($fp);
Dries Buytaert's avatar
   
Dries Buytaert committed
322

323
    // filter the input data:
Dries Buytaert's avatar
   
Dries Buytaert committed
324
325
326
    if (!valid_input_data($data)) {
      return t("failed to parse RSS feed '%site': suspicious input data.", array("%site" => $feed["title"]));
    }
327

328
    // extract the XML file's encoding (the XML parser in PHP4 doesn't do this by itself):
329
    if (ereg('^<\?xml[^>]+encoding="([^"]+)"', $data, $match)) {
330
331
332
      $encoding = $match[1];
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
333
    // parse the data:
334
    $xml_parser = xml_parser_create($encoding);
335
336
    xml_set_element_handler($xml_parser, "import_element_start", "import_element_end");
    xml_set_character_data_handler($xml_parser, "import_element_data");
Dries Buytaert's avatar
   
Dries Buytaert committed
337
338
    xml_parser_set_option($xml_parser, XML_OPTION_TARGET_ENCODING, "utf-8");

339
340
341
342
343
    if (!xml_parse($xml_parser, $data, 1)) {
      return t("failed to parse RSS feed '%site': %error at line %line.", array("%site" => $feed["title"], "%error" => xml_error_string(xml_get_error_code($xml_parser)), "%line" => xml_get_current_line_number($xml_parser)));
    }
    xml_parser_free($xml_parser);

Dries Buytaert's avatar
   
Dries Buytaert committed
344
345
346
347
    // initialize the translation table:
    $tt = array_flip(get_html_translation_table(HTML_ENTITIES));
    $tt["&apos;"] = "'";

Dries Buytaert's avatar
   
Dries Buytaert committed
348
    db_query("UPDATE {feed} SET timestamp = %d, link = '%s', description = '%s' WHERE fid = %d", time(), $channel["LINK"], $channel["DESCRIPTION"], $feed["fid"]);
Dries Buytaert's avatar
   
Dries Buytaert committed
349

Dries Buytaert's avatar
   
Dries Buytaert committed
350
    /*
351
352
353
    ** We reverse the array such that we store the first item last,
    ** and the last item first.  In the database, the newest item
    ** should be at the top.
Dries Buytaert's avatar
   
Dries Buytaert committed
354
    */
Dries Buytaert's avatar
   
Dries Buytaert committed
355

356
    $items = array_reverse($items);
Dries Buytaert's avatar
   
Dries Buytaert committed
357

Dries Buytaert's avatar
   
Dries Buytaert committed
358
359
    foreach ($items as $item) {
      unset($title, $link, $author, $description);
Dries Buytaert's avatar
   
Dries Buytaert committed
360

Dries Buytaert's avatar
   
Dries Buytaert committed
361
362
      // Prepare the item:
      foreach ($item as $key => $value) {
363
        $item[$key] = node_filter(strtr(trim($value), $tt));
Dries Buytaert's avatar
   
Dries Buytaert committed
364
      }
365

366
      if ($item["TITLE"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
367
        $title = $item["TITLE"];
368
369
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
370
        /*
Dries Buytaert's avatar
   
Dries Buytaert committed
371
         ** Use up to 40 characters of the description, ending at
372
373
         ** word boundary, but don't split potential entities.
         */
Dries Buytaert's avatar
   
Dries Buytaert committed
374
        $title = preg_replace('/^(.*)[^\w;&].*?$/', "\\1", substr($item["DESCRIPTION"], 0, 40));
375
      }
Dries Buytaert's avatar
   
Dries Buytaert committed
376

377
      if ($item["LINK"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
378
        $link = $item["LINK"];
379
380
      }
      elseif ($item["GUID"] && (strncmp($item["GUID"], "http://", 7) == 0)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
381
        $link = $item["GUID"];
382
383
384
385
      }
      else {
        $link = $feed["link"];
      }
Dries Buytaert's avatar
Dries Buytaert committed
386

387
      /*
Dries Buytaert's avatar
   
Dries Buytaert committed
388
389
390
391
      ** Save this item.  Try to avoid duplicate entries as much as
      ** possible.  If we find a duplicate entry, we resolve it and
      ** pass along it's ID such that we can update it if needed.
      */
Dries Buytaert's avatar
   
Dries Buytaert committed
392

393
      if ($link && $link != $feed["link"] && $link != $feed["url"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
394
        $entry = db_fetch_object(db_query("SELECT iid FROM {item} WHERE fid = %d AND link = '%s'", $feed["fid"], $link));
395
396
      }
      else {
Dries Buytaert's avatar
   
Dries Buytaert committed
397
        $entry = db_fetch_object(db_query("SELECT iid FROM {item} WHERE fid = %d AND title = '%s'", $feed["fid"], $title));
398
      }
399

Dries Buytaert's avatar
   
Dries Buytaert committed
400
      import_save_item(array(iid => $entry->iid, fid => $feed["fid"], title => $title, link => $link, author => $item["AUTHOR"], description => $item["DESCRIPTION"], attributes => $feed["attributes"]));
401
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
402
403

    /*
Dries Buytaert's avatar
   
Dries Buytaert committed
404
    ** Remove all the old, expired items:
Dries Buytaert's avatar
   
Dries Buytaert committed
405
406
407
408
    */

    unset($items);

Dries Buytaert's avatar
   
Dries Buytaert committed
409
    $result = db_query("SELECT iid FROM {item} WHERE fid = %d ORDER BY timestamp", $feed["fid"]);
Dries Buytaert's avatar
   
Dries Buytaert committed
410
411
412
413
414

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

Dries Buytaert's avatar
   
Dries Buytaert committed
415
    if (sizeof($items) > 50) {
Dries Buytaert's avatar
   
Dries Buytaert committed
416
      db_query("DELETE FROM {item} WHERE ". implode(" OR ", array_slice($items, 0, - 50)));
Dries Buytaert's avatar
   
Dries Buytaert committed
417
418
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
419
    cache_clear_all();
Dries Buytaert's avatar
   
Dries Buytaert committed
420
421
  }
  else {
422
    return t("failed to parse RSS feed '%site': no data.", array("%site" => $feed["tite"]));
423
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
424

425
  return t("syndicated content from '%site'.", array("%site" => $feed["title"]));
426
427
}

Dries Buytaert's avatar
   
Dries Buytaert committed
428
function import_save_item($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
429
  if ($edit["iid"] && $edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
430
    db_query("UPDATE {item} SET title = '%s', link = '%s', author = '%s', description = '%s', attributes = '%s' WHERE iid = %d", $edit["title"], $edit["link"], $edit["author"], $edit["description"], $edit["attributes"], $edit["iid"]);
431
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
432
  else if ($edit["iid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
433
    db_query("DELETE FROM {item} WHERE iid = %d", $edit["iid"]);
434
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
435
  else if ($edit["title"] && $edit["link"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
436
    db_query("INSERT INTO {item} (fid, title, link, author, description, attributes, timestamp) VALUES (%d, '%s', '%s', '%s', '%s', '%s', %d)", $edit["fid"], $edit["title"], $edit["link"], $edit["author"], $edit["description"], $edit["attributes"], time());
437
438
439
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
440
function import_form_bundle($edit = array()) {
441

Dries Buytaert's avatar
   
Dries Buytaert committed
442
443
  $form .= form_textfield(t("Title"), "title", $edit["title"], 50, 64, t("The name of the bundle."));
  $form .= form_textfield(t("Attributes"), "attributes", $edit["attributes"], 50, 128, t("A comma-separated list of keywords describing the bundle."));
444

Dries Buytaert's avatar
   
Dries Buytaert committed
445
  $form .= form_submit(t("Submit"));
446

Dries Buytaert's avatar
   
Dries Buytaert committed
447
  if ($edit["bid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
448
    $form .= form_submit(t("Delete"));
Dries Buytaert's avatar
   
Dries Buytaert committed
449
    $form .= form_hidden("bid", $edit["bid"]);
450
451
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
452
  return form($form);
453
454
}

Dries Buytaert's avatar
   
Dries Buytaert committed
455
function import_save_bundle($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
456
  if ($edit["bid"] && $edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
457
    db_query("UPDATE {bundle} SET title = '%s', attributes = '%s' WHERE bid = %d", $edit["title"], $edit["attributes"], $edit["bid"]);
458
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
459
  else if ($edit["bid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
460
    db_query("DELETE FROM {bundle} WHERE bid = %d", $edit["bid"]);
461
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
462
  else if ($edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
463
    // a single unique id for bundles and feeds, to use in blocks
Dries Buytaert's avatar
   
Dries Buytaert committed
464
    $next_id = db_next_id("{bundle}_bid");
Dries Buytaert's avatar
   
Dries Buytaert committed
465
    db_query("INSERT INTO {bundle} (bid, title, attributes) VALUES (%d, '%s', '%s')", $next_id, $edit["title"], $edit["attributes"]);
466
467
468
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
469
function import_form_feed($edit = array()) {
470
471
472

  $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
473
474
475
  if ($edit["refresh"] == "") {
    $edit["refresh"] = 3600;
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
476

Dries Buytaert's avatar
   
Dries Buytaert committed
477
478
479
480
  $form .= form_textfield(t("Title"), "title", $edit["title"], 50, 64, t("The name of the feed; typically the name of the web site you syndicate content from."));
  $form .= form_textfield(t("URL"), "url", $edit["url"], 50, 128, t("The fully-qualified URL of the feed."));
  $form .= form_textfield(t("Attributes"), "attributes", $edit["attributes"], 50, 128, t("A comma-separated list of keywords describing the feed."));
  $form .= form_select(t("Update interval"), "refresh", $edit["refresh"], $period, t("The refresh interval indicating how often you want to update this feed.  Requires crontab."));
481

Dries Buytaert's avatar
   
Dries Buytaert committed
482
  $form .= form_submit(t("Submit"));
483

Dries Buytaert's avatar
   
Dries Buytaert committed
484
  if ($edit["fid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
485
    $form .= form_submit(t("Delete"));
Dries Buytaert's avatar
   
Dries Buytaert committed
486
    $form .= form_hidden("fid", $edit["fid"]);
487
488
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
489
  return form($form);
490
491
}

Dries Buytaert's avatar
   
Dries Buytaert committed
492
function import_save_feed($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
493
  if ($edit["fid"] && $edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
494
495
    db_query("UPDATE {feed} SET title = '%s', url = '%s', attributes = '%s', refresh = %d WHERE fid = %d", $edit["title"], $edit["url"], $edit["attributes"], $edit["refresh"], $edit["fid"]);
    db_query("DELETE FROM {item} WHERE fid = %d", $edit["fid"]);
496
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
497
  else if ($edit["fid"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
498
499
    db_query("DELETE FROM {feed} WHERE fid = %d", $edit["fid"]);
    db_query("DELETE FROM {item} WHERE fid = %d", $edit["fid"]);
500
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
501
  else if ($edit["title"]) {
Dries Buytaert's avatar
   
Dries Buytaert committed
502
    // a single unique id for bundles and feeds, to use in blocks
Dries Buytaert's avatar
   
Dries Buytaert committed
503
    $next_id = db_next_id("{feed}_fid");
Dries Buytaert's avatar
   
Dries Buytaert committed
504
    db_query("INSERT INTO {feed} (fid, title, url, attributes, refresh) VALUES (%d, '%s', '%s', '%s', %d)", $next_id, $edit["title"], $edit["url"], $edit["attributes"], $edit["refresh"]);
505
506
507
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
508
function import_save_attributes($edit) {
Dries Buytaert's avatar
   
Dries Buytaert committed
509
  foreach ($edit as $iid => $value) {
Dries Buytaert's avatar
   
Dries Buytaert committed
510
    db_query("UPDATE {item} SET attributes = '%s' WHERE iid = %d", $value, $iid);
511
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
512
  return t("attributes has been saved");
513
514
}

Dries Buytaert's avatar
   
Dries Buytaert committed
515
function import_get_feed($fid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
516
  return db_fetch_array(db_query("SELECT * FROM {feed} WHERE fid = %d", $fid));
517
518
}

Dries Buytaert's avatar
   
Dries Buytaert committed
519
function import_get_bundle($bid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
520
  return db_fetch_array(db_query("SELECT * FROM {bundle} WHERE bid = %d", $bid));
521
522
}

Dries Buytaert's avatar
   
Dries Buytaert committed
523
function import_view() {
Dries Buytaert's avatar
   
Dries Buytaert committed
524
  $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");
525

Dries Buytaert's avatar
   
Dries Buytaert committed
526
  $output .= "<h3>". t("Feed overview") ."</h3>";
Dries Buytaert's avatar
   
Dries Buytaert committed
527
528
529

  $header = array(t("title"), t("attributes"), t("items"), t("last update"), t("next update"), array("data" => t("operations"), "colspan" => 3));
  unset($rows);
530
  while ($feed = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
531
    $rows[] = array($feed->title, $feed->attributes, format_plural($feed->items, "1 item", "%count items"), ($feed->timestamp ? t("%time ago", array("%time" => format_interval(time() - $feed->timestamp))) : t("never")), ($feed->timestamp ? t("%time left", array("%time" => format_interval($feed->timestamp + $feed->refresh - time()))) : t("never")), l(t("edit feed"), "admin/node/syndication/news/edit/feed/$feed->fid"), l(t("remove items"), "admin/node/syndication/news/remove/$feed->fid"), l(t("update items"), "admin/node/syndication/news/update/$feed->fid"));
532
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
533
  $output .= theme("table", $header, $rows);
534

Dries Buytaert's avatar
   
Dries Buytaert committed
535
  $result = db_query("SELECT * FROM {bundle} ORDER BY title");
536

Dries Buytaert's avatar
   
Dries Buytaert committed
537
  $output .= "<h3>". t("Bundle overview") ."</h3>";
Dries Buytaert's avatar
   
Dries Buytaert committed
538
539
540

  $header = array(t("title"), t("attributes"), t("operations"));
  unset($rows);
541
  while ($bundle = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
542
    $rows[] = array($bundle->title, $bundle->attributes, l(t("edit bundle"), "admin/node/syndication/news/edit/bundle/$bundle->bid"));
543
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
544
  $output .= theme("table", $header, $rows);
545
546
547
548

  return $output;
}

Dries Buytaert's avatar
   
Dries Buytaert committed
549
function import_tag() {
550

Dries Buytaert's avatar
   
Dries Buytaert committed
551
  $result = db_query_range("SELECT i.*, f.title AS feed FROM {item} i INNER JOIN {feed} f ON i.fid = f.fid ORDER BY i.iid DESC", 0, 50);
552

Dries Buytaert's avatar
   
Dries Buytaert committed
553
  $header = array(t("date"), t("feed"), t("news item"));
554
  while ($item = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
555
    $rows[] = array(array("data" => format_date($item->timestamp, "small"), "nowrap" => "nowrap", "valign" => "top"), array("data" => l($item->feed, "admin/node/syndication/news/edit/feed/$item->fid"), "valign" => "top"), "<a href=\"$item->link\">$item->title</a>". ($item->description ? "<br /><small><i>$item->description</i></small>" : "") ."<br /><input type=\"text\" name=\"edit[$item->iid]\" value=\"". check_form($item->attributes) ."\" size=\"50\" />");
556
  }
Dries Buytaert's avatar
   
Dries Buytaert committed
557

Dries Buytaert's avatar
   
Dries Buytaert committed
558
  $output .= theme("table", $header, $rows);
Dries Buytaert's avatar
   
Dries Buytaert committed
559
  $output .= "<input type=\"submit\" name=\"op\" value=\"". t("Save attributes") ."\" />\n";
560

Dries Buytaert's avatar
   
Dries Buytaert committed
561
  return form($output);
562
563
}

Dries Buytaert's avatar
   
Dries Buytaert committed
564
function import_admin() {
Dries Buytaert's avatar
   
Dries Buytaert committed
565
566
  $op = $_POST["op"];
  $edit = $_POST["edit"];
Dries Buytaert's avatar
   
Dries Buytaert committed
567

Dries Buytaert's avatar
   
Dries Buytaert committed
568
  if (user_access("administer news feeds")) {
Dries Buytaert's avatar
   
Dries Buytaert committed
569

Dries Buytaert's avatar
   
Dries Buytaert committed
570
    if (empty($op)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
571
      $op = arg(4);
Dries Buytaert's avatar
   
Dries Buytaert committed
572
573
    }

Dries Buytaert's avatar
   
Dries Buytaert committed
574
    switch ($op) {
575
      case "add":
Dries Buytaert's avatar
   
Dries Buytaert committed
576
        if (arg(5) == "bundle") {
Dries Buytaert's avatar
   
Dries Buytaert committed
577
          $output = import_form_bundle();
578
579
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
580
          $output = import_form_feed();
581
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
582
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
583
      case "edit":
Dries Buytaert's avatar
   
Dries Buytaert committed
584
        if (arg(5) == "bundle") {
Dries Buytaert's avatar
   
Dries Buytaert committed
585
          $output = import_form_bundle(import_get_bundle(arg(6)));
Dries Buytaert's avatar
   
Dries Buytaert committed
586
587
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
588
          $output = import_form_feed(import_get_feed(arg(6)));
Dries Buytaert's avatar
   
Dries Buytaert committed
589
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
590
591
        break;
      case "remove":
Dries Buytaert's avatar
   
Dries Buytaert committed
592
        drupal_set_message(import_remove(import_get_feed(arg(5))));
Dries Buytaert's avatar
   
Dries Buytaert committed
593
        $output .= import_view();
Dries Buytaert's avatar
   
Dries Buytaert committed
594
595
        break;
      case "update":
Dries Buytaert's avatar
   
Dries Buytaert committed
596
        drupal_set_message(import_refresh(import_get_feed(arg(5))));
Dries Buytaert's avatar
   
Dries Buytaert committed
597
        $output .= import_view();
Dries Buytaert's avatar
   
Dries Buytaert committed
598
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
599
      case "tag":
Dries Buytaert's avatar
   
Dries Buytaert committed
600
        $output = import_tag();
Dries Buytaert's avatar
   
Dries Buytaert committed
601
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
602
      case t("Save attributes"):
Dries Buytaert's avatar
   
Dries Buytaert committed
603
        drupal_set_message(import_save_attributes($edit));
Dries Buytaert's avatar
   
Dries Buytaert committed
604
        $output .= import_tag();
Dries Buytaert's avatar
   
Dries Buytaert committed
605
        break;
Dries Buytaert's avatar
   
Dries Buytaert committed
606
      case t("Delete"):
Dries Buytaert's avatar
   
Dries Buytaert committed
607
        $edit["title"] = 0;
Dries Buytaert's avatar
   
Dries Buytaert committed
608
        // fall through:
Dries Buytaert's avatar
   
Dries Buytaert committed
609
      case t("Submit"):
Dries Buytaert's avatar
   
Dries Buytaert committed
610
        if (arg(5) == "bundle") {
Dries Buytaert's avatar
   
Dries Buytaert committed
611
          drupal_set_message(import_save_bundle($edit));
Dries Buytaert's avatar
   
Dries Buytaert committed
612
613
        }
        else {
Dries Buytaert's avatar
   
Dries Buytaert committed
614
          drupal_set_message(import_save_feed($edit));
Dries Buytaert's avatar
   
Dries Buytaert committed
615
        }
Dries Buytaert's avatar
   
Dries Buytaert committed
616
617
        // fall through:
      default:
Dries Buytaert's avatar
   
Dries Buytaert committed
618
        $output .=  import_view();
Dries Buytaert's avatar
   
Dries Buytaert committed
619
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
620
    print theme("page", $output);
Dries Buytaert's avatar
   
Dries Buytaert committed
621
622
  }
  else {
Dries Buytaert's avatar
   
Dries Buytaert committed
623
    print theme("page", message_access());
624
625
626
  }
}

Dries Buytaert's avatar
   
Dries Buytaert committed
627
function import_page_last() {
Dries Buytaert's avatar
   
Dries Buytaert committed
628

Dries Buytaert's avatar
   
Dries Buytaert committed
629

Dries Buytaert's avatar
   
Dries Buytaert committed
630
  $result = db_query_range("SELECT i.*, f.title AS ftitle, f.link AS flink FROM {item} i INNER JOIN {feed} f ON i.fid = f.fid ORDER BY i.iid DESC", 0, variable_get("import_page_limit", 75));
Dries Buytaert's avatar
   
Dries Buytaert committed
631
632

  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"2\">";
Dries Buytaert's avatar
   
Dries Buytaert committed
633
  while ($item = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
634
    if (module_exist("blog") && user_access("maintain personal blog")) {
635
      $links[] = l(t("blog it"), "node/add/blog", array("title" => t("Comment on this news item in your personal blog.")), "iid=$item->iid");
636
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
637
    $links[] = l(t("feed"), "import/feed/$item->fid", array("title" => t("Read more syndicated news from this feed.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
638
639

    if ($item->link) {
Dries Buytaert's avatar
   
Dries Buytaert committed
640
      $output .= "<tr><td><a href=\"$item->link\">$item->title</a> &middot; ". l($item->ftitle, "import/feed/$item->fid", array("title" => t("View more information about this feed."))) ."</td><td style=\"text-align: right; vertical-align: top;\">". theme("links", $links) ."</td></tr>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
641
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
642

Dries Buytaert's avatar
   
Dries Buytaert committed
643
    if ($item->description) {
Dries Buytaert's avatar
   
Dries Buytaert committed
644
      $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">$item->description</div><br /></td></tr>";
Dries Buytaert's avatar
   
Dries Buytaert committed
645
646
647
    }

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

Dries Buytaert's avatar
   
Dries Buytaert committed
651
  print theme("page", $output);
Dries Buytaert's avatar
   
Dries Buytaert committed
652
653
654
}

function import_page_feed($fid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
655

Dries Buytaert's avatar
   
Dries Buytaert committed
656

Dries Buytaert's avatar
   
Dries Buytaert committed
657
  $feed = db_fetch_object(db_query("SELECT * FROM {feed} WHERE fid = %d", $fid));
Dries Buytaert's avatar
   
Dries Buytaert committed
658

659
660
661
  $header .= "<p><strong>". t("Website") .":</strong><div style=\"margin-left: 20px;\"><a href=\"$feed->link\">$feed->link</a></div></p>";
  $header .= "<p><strong>". t("Description") .":</strong><div style=\"margin-left: 20px;\">$feed->description</div></p>";
  $header .= "<p><strong>". t("Last update") .":</strong><div style=\"margin-left: 20px; text-align: right;\">". t("%time ago", array("%time" => format_interval(time() - $feed->timestamp))) ." <a href=\"$feed->url\"><img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" alt=\"\" title=\"\" /></a><br /><br /></div></p>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
662

Dries Buytaert's avatar
   
Dries Buytaert committed
663
  $result = db_query_range("SELECT * FROM {item} WHERE fid = %d ORDER BY iid DESC", $fid, 0, variable_get("import_page_limit", 75));
Dries Buytaert's avatar
   
Dries Buytaert committed
664
665

  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"2\">";
Dries Buytaert's avatar
   
Dries Buytaert committed
666
  while ($item = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
667
    if (module_exist("blog") && user_access("maintain personal blog")) {
668
      $links[] = l(t("blog it"), "node/add/blog", array("title" => t("Comment on this news item in your personal blog.")), "iid=$item->iid");
669
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
670
    $links[] = "<a href=\"$item->link\">". t("visit") ."</a>";
Dries Buytaert's avatar
   
Dries Buytaert committed
671

Dries Buytaert's avatar
   
Dries Buytaert committed
672
    if ($item->link) {
Dries Buytaert's avatar
   
Dries Buytaert committed
673
      $output .= "<tr><td><a href=\"$item->link\">$item->title</a></td><td style=\"text-align: right; vertical-align: top;\">". theme("links", $links) ."</td></tr>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
674
675
    }
    if ($item->description) {
Dries Buytaert's avatar
   
Dries Buytaert committed
676
      $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">$item->description</div><br /></td></tr>";
Dries Buytaert's avatar
   
Dries Buytaert committed
677
678
679
680
681
    }

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

Dries Buytaert's avatar
   
Dries Buytaert committed
683
684
685
686
  print theme("header");
  print theme("box", $feed->title, $header);
  print theme("box", t("Latest news"), $output);
  print theme("footer");
Dries Buytaert's avatar
   
Dries Buytaert committed
687
688
689
}

function import_page_bundle($bid) {
Dries Buytaert's avatar
   
Dries Buytaert committed
690

Dries Buytaert's avatar
   
Dries Buytaert committed
691

Dries Buytaert's avatar
   
Dries Buytaert committed
692
  $bundle = db_fetch_object(db_query("SELECT * FROM {bundle} WHERE bid = %d", $bid));
Dries Buytaert's avatar
   
Dries Buytaert committed
693

694
695
  $header .= "<p><strong>". t("Website") .":</strong><div style=\"margin-left: 20px;\">". l($bundle->title, "import/bundle/$bundle->bid") ."</div></p>";
  $header .= "<p><strong>". t("Description") .":</strong><div style=\"margin-left: 20px;\">". t("A composite news feed about") ." $bundle->attributes.</div></p>";
Dries Buytaert's avatar
   
Dries Buytaert committed
696
697
698

  $keys = explode(",", $bundle->attributes);
  foreach ($keys as $key) $where[] = "i.attributes LIKE '%". trim($key) ."%'";
Dries Buytaert's avatar
   
Dries Buytaert committed
699
  $result = db_query_range("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", 0, variable_get("import_page_limit", 75));
Dries Buytaert's avatar
   
Dries Buytaert committed
700

Dries Buytaert's avatar
   
Dries Buytaert committed
701
  $output .= "<table border=\"0\" cellpadding=\"4\" cellspacing=\"2\">";
Dries Buytaert's avatar
   
Dries Buytaert committed
702
  while ($item = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
703
    if (module_exist("blog") && user_access("maintain personal blog")) {
704
      $links[] = l(t("blog it"), "node/add/blog", array("title" => t("Comment on this news item in your personal blog.")), "iid=$item->iid");
705
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
706
    $links[] = l(t("feed"), "import/feed/$item->fid", array("title" => t("Read more syndicated news from this feed.")));
Dries Buytaert's avatar
   
Dries Buytaert committed
707
708
709
    $links[] = "<a href=\"$item->link\">". t("visit") ."</a>";

    if ($item->link) {
Dries Buytaert's avatar
   
Dries Buytaert committed
710
      $output .= "<tr><td><a href=\"$item->link\">$item->title</a> &middot; ". l($item->ftitle, "import/feed/$item->fid", array("title" => t("View more information about this feed."))) ."</td><td style=\"text-align: right; vertical-align: top;\">". theme("links", $links) ."</td></tr>\n";
Dries Buytaert's avatar
   
Dries Buytaert committed
711
    }
Dries Buytaert's avatar
   
Dries Buytaert committed
712

Dries Buytaert's avatar
   
Dries Buytaert committed
713
    if ($item->description) {
Dries Buytaert's avatar
   
Dries Buytaert committed
714
      $output .= "<tr><td colspan=\"2\"><div style=\"margin-left: 20px;\">$item->description</div><br /></td></tr>";
Dries Buytaert's avatar
   
Dries Buytaert committed
715
716
717
    }

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

Dries Buytaert's avatar
   
Dries Buytaert committed
721
722
723
724
  print theme("header");
  print theme("box", $bundle->title, $header);
  print theme("box", t("Latest news"), $output);
  print theme("footer");
Dries Buytaert's avatar
   
Dries Buytaert committed
725

Dries Buytaert's avatar
   
Dries Buytaert committed
726
727
}

Dries Buytaert's avatar
   
Dries Buytaert committed
728
function import_page_sources() {
Dries Buytaert's avatar
   
Dries Buytaert committed
729

Dries Buytaert's avatar
   
Dries Buytaert committed
730

Dries Buytaert's avatar
   
Dries Buytaert committed
731
  $result = db_query("SELECT * FROM {feed} ORDER BY title");
Dries Buytaert's avatar
   
Dries Buytaert committed
732
733

  while ($feed = db_fetch_object($result)) {
Dries Buytaert's avatar
   
Dries Buytaert committed
734
    $output .= l($feed->title, "import/feed/$feed->fid");
Dries Buytaert's avatar
   
Dries Buytaert committed
735
    $output .= "<div style=\"margin-left: 20px;\">$feed->description</div><br />";
Dries Buytaert's avatar
   
Dries Buytaert committed
736
737
  }

Dries Buytaert's avatar
   
Dries Buytaert committed
738
  $output .= "<div style=\"xml-icon\">". l("<img src=\"". theme("image", "xml.gif") ."\" width=\"36\" height=\"14\" style=\"border: 0px;\" />", "import/fd", array("title" => t("View the list of syndicated web sites in XML format."))) ."</div><br />";
Dries Buytaert's avatar
   
Dries Buytaert committed
739

Dries Buytaert's avatar
   
Dries Buytaert committed
740
  print theme("page", $output);
Dries Buytaert's avatar
   
Dries Buytaert committed
741
742
}

Dries Buytaert's avatar