node.module 25.7 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
2
// $Id$
Dries's avatar
 
Dries committed
3

Dries's avatar
   
Dries committed
4
5
6
7
8
9
function node_help() {
  global $mod;

  if ($mod == "node") {
    foreach (module_list() as $name) {
      if (module_hook($name, "status") && $name != "node") {
Dries's avatar
   
Dries committed
10
        print "<h3>". ucfirst($name) ." type</h3>";
Dries's avatar
   
Dries committed
11
12
13
14
15
16
        print module_invoke($name, "help");
      }
    }
  }
}

Dries's avatar
   
Dries committed
17
18
function node_access($op, $node = 0) {

Dries's avatar
   
Dries committed
19
20
  if (user_access("administer nodes")) {
    return 1;
Dries's avatar
   
Dries committed
21
  }
Dries's avatar
   
Dries committed
22
  else {
Dries's avatar
   
Dries committed
23

Dries's avatar
   
Dries committed
24
25
26
    /*
    ** Convert the node to an object if necessary:
    */
Dries's avatar
   
Dries committed
27

Dries's avatar
   
Dries committed
28
29
30
    if (is_array($node)) {
      $node = node_object($node);
    }
Dries's avatar
   
Dries committed
31

Dries's avatar
   
Dries committed
32
33
34
35
36
37
38
39
40
41
42
43
    /*
    ** Construct a function:
    */

    $function = $node->type ."_access";

    if (function_exists($function)) {
      return $function($op, $node);
    }
    else {
      return 0;
    }
Dries's avatar
   
Dries committed
44
45
46
  }
}

Dries's avatar
   
Dries committed
47
function node_perm() {
Dries's avatar
   
Dries committed
48
  return array("administer nodes", "access content", "post content");
Dries's avatar
   
Dries committed
49
50
}

Dries's avatar
   
Dries committed
51
52
53
54
55
56
57
58
59
60
61
function node_search($keys) {
  global $user;

  $result = db_query("SELECT n.nid, n.title, n.created, u.uid, u.name FROM node n LEFT JOIN users u ON n.uid = u.uid WHERE n.status = 1 AND (n.title LIKE '%$keys%' OR n.teaser LIKE '%$keys%' OR n.body LIKE '%$keys%') ORDER BY n.created DESC LIMIT 20");
  while ($node = db_fetch_object($result)) {
    $find[$i++] = array("title" => check_output($node->title), "link" => (user_access("administer nodes") ? "admin.php?mod=node&type=node&op=edit&id=$node->nid" : "node.php?id=$node->nid"), "user" => $node->name, "date" => $node->created);
  }

  return $find;
}

Dries's avatar
   
Dries committed
62
function node_conf_options() {
Dries's avatar
   
Dries committed
63
  $output .= form_select(t("Default number of nodes to display"), "default_nodes_main", variable_get("default_nodes_main", 10), array(1 => 1, 2 => 2, 3 => 3, 4 => 4, 5 =>  5, 6 => 6, 7 => 7, 8 => 8, 9 => 9, 10 => 10, 15 => 15, 20 => 20, 25 => 25, 30 => 30), t("The default maximum number of nodes to display on the main page."));
Dries's avatar
   
Dries committed
64
  $output .= form_select(t("Minimum number of words in teaser"), "minimum_teaser_size", variable_get("minimum_teaser_size", 0), array(0 => "0 words", 10 => "10 words", 25 => "25 words",  50 => "50 words", 75 => "75 words", 100 => "100 words", 125 => "125 words",  150 => "150 words", 175 => "175 words", 200 => "200 words"), t("The minimum number of words a teaser should consist of.  This can be useful to rule out submissions that do not meet the site's standards, such as short test post."));
Dries's avatar
   
Dries committed
65
66
67
  return $output;
}

Dries's avatar
CHANGES    
Dries committed
68
function node_conf_filters() {
Dries's avatar
   
Dries committed
69
  $output .= form_select(t("Enable HTML tags"), "filter_html", variable_get("filter_html", 0), array("Disabled", "Enabled"), t("Allow HTML and PHP tags in user-contributed content."));
Dries's avatar
   
Dries committed
70
  $output .= form_textfield(t("Allowed HTML tags"), "allowed_html", variable_get("allowed_html", "<a><b><blockquote><dd><dl><dt><i><li><ol><u><ul>"), 64, 128, t("If enabled, optionally specify tags which should not be stripped.  'STYLE' attributes, 'ON' attributes and unclosed tags are always stripped."));
Dries's avatar
   
Dries committed
71
  $output .= "<hr />";
Dries's avatar
   
Dries committed
72
  $output .= form_select(t("Enable link tags"), "filter_link", variable_get("filter_link", 0), array("Disabled", "Enabled"), t("Substitute special [[nodesubject|text]] tags. Your browser will display 'text', and when you click on it your browser will open the node with the subject 'nodesubject'. Please be aware that you'll need to copy the subject of the target node exactly in order to use this feature."));
Dries's avatar
   
Dries committed
73
  $output .= "<hr />";
Dries's avatar
CHANGES    
Dries committed
74
75
76
77
78
79
80
81
82
83
84
  return $output;
}

function node_filter_html($text) {
  $text = eregi_replace("([ \f\r\t\n\'\"])style=[^>]+", "\\1", $text);
  $text = eregi_replace("([ \f\r\t\n\'\"])on[a-z]+=[^>]+", "\\1", $text);
  $text = strip_tags($text, variable_get("allowed_html", ""));
  return $text;
}

function node_filter_link($text) {
Dries's avatar
   
Dries committed
85
86
87
88
89
  $src = array("/\[\[(([^\|]*?)(\|([^\|]*?))?)\]\]/e");  // [link|description]
  $dst = array(format_tag('\\2', '\\4'));                // [link|description]
  return preg_replace($src, $dst, $text);
}

Dries's avatar
   
Dries committed
90
91
92
93
94
95
96
function node_filter_line($text) {

  /*
  ** If HTML mark-up is being used, strip regular mark-up:
  */

  if (strstr($text, "<br />") || strstr($text, "<p>")) {
Dries's avatar
   
Dries committed
97
    $text = ereg_replace("[\r\n]", "", $text);
Dries's avatar
   
Dries committed
98
99
100
101
102
103
104
105
106
107
108
109
  }

  /*
  ** Replace '<br>', '<br />', '<p>' and '<p />' by '\n':
  */

  $text = eregi_replace("<br>", "\n", $text);
  $text = eregi_replace("<br />", "\n", $text);
  $text = eregi_replace("<p>", "\n", $text);
  $text = eregi_replace("<br />", "\n", $text);

  /*
Dries's avatar
   
Dries committed
110
  ** Replace "\r\n" by "\n":
Dries's avatar
   
Dries committed
111
112
113
114
115
116
117
118
119
120
121
  */

  $text = ereg_replace("\r\n", "\n", $text);

  /*
  ** Replace some new line charachters:
  */

  while (strpos($text, "\n\n\n")) {
    $text = ereg_replace("\n\n\n", "\n\n", $text);
  }
Dries's avatar
   
Dries committed
122

Dries's avatar
   
Dries committed
123
124
125
  return trim($text);
}

Dries's avatar
CHANGES    
Dries committed
126
127
128
function node_filter($text) {
  if (variable_get("filter_html", 0)) $text = node_filter_html($text);
  if (variable_get("filter_link", 0)) $text = node_filter_link($text);
Dries's avatar
   
Dries committed
129
  return node_filter_line($text);
Dries's avatar
CHANGES    
Dries committed
130
131
}

Dries's avatar
   
Dries committed
132
function node_link($type, $node = 0) {
Dries's avatar
   
Dries committed
133

Dries's avatar
   
Dries committed
134
  if ($type == "admin" && user_access("administer nodes")) {
Dries's avatar
   
Dries committed
135
136
137
138
139
    $links[] = "<a href=\"admin.php?mod=node\">content management</a>";
  }

  if ($type == "page") {
    $links[] = "<a href=\"module.php?mod=node&op=add\">submit</a>";
Dries's avatar
   
Dries committed
140
141
  }

Dries's avatar
   
Dries committed
142
  if ($type == "node") {
Dries's avatar
   
Dries committed
143

Kjartan's avatar
Kjartan committed
144
145
146
    if ($node->links) {
      $links = $node->links;
    }
Dries's avatar
   
Dries committed
147
148

    if ($node->teaser != $node->body) {
Dries's avatar
   
Dries committed
149
150
      $links[] = "<a href=\"node.php?id=". $node->nid ."\">". t("read more") ."</a>";
    }
Dries's avatar
   
Dries committed
151

Dries's avatar
   
Dries committed
152
153
154
    if ($node->comment) {
      $links[] = "<a href=\"node.php?id=". $node->nid ."\">". format_plural(node_get_comments($node->nid), "comment", "comments") ."</a>";
    }
Dries's avatar
   
Dries committed
155
156
157
158

    if (user_access("administer nodes")) {
      $links[] = "<a href=\"admin.php?mod=node&op=edit&id=". $node->nid ."\">". t("edit") ."</a>";
    }
Dries's avatar
   
Dries committed
159
160
161
162
163
  }

  return $links ? $links : array();
}

Dries's avatar
   
Dries committed
164
function node_admin_settings($edit = array()) {
Dries's avatar
   
Dries committed
165
166
  global $op;

Dries's avatar
   
Dries committed
167
168
169
170
  if ($op == t("Save configuration")) {
    /*
    ** Save the configuration options:
    */
Dries's avatar
Dries committed
171

Dries's avatar
   
Dries committed
172
173
174
    foreach ($edit as $name => $value) {
      variable_set($name, $value);
    }
Dries's avatar
 
Dries committed
175
176
  }

Dries's avatar
   
Dries committed
177
178
179
180
  if ($op == t("Reset to defaults")) {
    /*
    ** Reset the configuration options to their default value:
    */
Dries's avatar
 
Dries committed
181

Dries's avatar
   
Dries committed
182
183
184
    foreach ($edit as $name=>$value) {
      variable_del($name);
    }
Dries's avatar
   
Dries committed
185
  }
Dries's avatar
Dries committed
186

Dries's avatar
   
Dries committed
187
  $output .= "<h3>". t("Global node settings") ."</h3>";
Dries's avatar
   
Dries committed
188
  $output .= node_conf_options();
Dries's avatar
   
Dries committed
189
190
191

  foreach (module_list() as $name) {
    if (module_hook($name, "conf_options") && module_hook($name, "node")) {
Dries's avatar
   
Dries committed
192
      $output .= "<h3>". ucfirst(module_invoke($name, "node", "name") ." settings") ."</h3>";
Dries's avatar
   
Dries committed
193
194
195
196
      $output .= module_invoke($name, "conf_options");
    }
  }

Dries's avatar
   
Dries committed
197
198
  $output .= form_submit(t("Save configuration"));
  $output .= form_submit(t("Reset to defaults"));
Dries's avatar
Dries committed
199

Dries's avatar
   
Dries committed
200
  return form($output);
Dries's avatar
   
Dries committed
201
202
}

Dries's avatar
   
Dries committed
203
function node_admin_edit($node) {
Dries's avatar
   
Dries committed
204

Dries's avatar
   
Dries committed
205
  if (is_numeric($node)) {
Dries's avatar
   
Dries committed
206
    $node = node_load(array("nid" => $node));
Dries's avatar
   
Dries committed
207
  }
Dries's avatar
   
Dries committed
208

Dries's avatar
   
Dries committed
209
210
211
  /*
  ** Edit node:
  */
Dries's avatar
   
Dries committed
212

Dries's avatar
   
Dries committed
213
  $output .= "<h3>". t("Edit") ." ". module_invoke($node->type, "node", "name") ."</h3>";
Dries's avatar
   
Dries committed
214

Dries's avatar
   
Dries committed
215
  $output .= node_form($node);
Dries's avatar
   
Dries committed
216

Dries's avatar
   
Dries committed
217
218
219
220
221
222
223
224
225
  /*
  ** Edit revisions:
  */

  if ($node->revisions) {
    $output .= "<h3>". t("Edit revisions") ."</h3>";
    $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">";
    $output .= " <tr><th>older revisions</th><th colspan=\"3\">operations</th></tr>";
    foreach ($node->revisions as $key => $revision) {
Dries's avatar
   
Dries committed
226
      $output .= " <tr><td>". sprintf(t("revision #%d revised by %s on %s"), $key, format_name(user_load(array("uid" => $revision["uid"]))), format_date($revision["timestamp"], "small")) . ($revision["history"] ? "<br /><small>". $revision["history"] ."</small>" : "") ."</td><td><a href=\"node.php?id=$node->nid&revision=$key\">". t("view revision") ."</a></td><td><a href=\"admin.php?mod=node&op=rollback+revision&id=$node->nid&revision=$key\">". t("rollback revision") ."</a></td><td><a href=\"admin.php?mod=node&op=delete+revision&id=$node->nid&revision=$key\">". t("delete revision") ."</a></td></tr>";
Dries's avatar
   
Dries committed
227
228
229
230
    }
    $output .= "</table>";
  }

Dries's avatar
   
Dries committed
231
232
233
  /*
  ** Edit comments:
  */
Dries's avatar
   
Dries committed
234

Dries's avatar
   
Dries committed
235
  $output .= "<h3>". t("Edit comments") ."</h3>";
Dries's avatar
   
Dries committed
236

Dries's avatar
   
Dries committed
237
  $result = db_query("SELECT c.cid, c.subject, u.uid, u.name FROM comments c LEFT JOIN users u ON u.uid = c.uid WHERE lid = '". $node["nid"] ."' ORDER BY c.timestamp");
Dries's avatar
 
Dries committed
238

Dries's avatar
   
Dries committed
239
240
  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">";
  $output .= " <tr><th>title</th><th>author</th><th colspan=\"3\">operations</th></tr>";
Dries's avatar
   
Dries committed
241
  while ($comment = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
242
    $output .= "<tr><td><a href=\"node.php?id=$node->nid&cid=$comment->cid#$comment->cid\">$comment->subject</a></td><td>". format_name($comment) ."</td><td><a href=\"node.php?id=$node->nid&cid=$comment->cid#$comment->cid\">". t("view comment") ."</a></td><td><a href=\"admin.php?mod=comment&op=edit&id=$comment->cid\">". t("edit comment") ."</a></td><td><a href=\"admin.php?mod=comment&op=delete&id=$comment->cid\">". t("delete comment") ."</a></td></tr>";
Dries's avatar
Dries committed
243
  }
Dries's avatar
   
Dries committed
244
  $output .= "</table>";
Dries's avatar
Dries committed
245

Dries's avatar
   
Dries committed
246
  return $output;
Dries's avatar
   
Dries committed
247
248
249

}

Dries's avatar
   
Dries committed
250
251
function node_admin_nodes() {
  global $query;
Dries's avatar
   
Dries committed
252

Dries's avatar
   
Dries committed
253
  $queries = array(array("ORDER BY n.created DESC", "new nodes"), array("ORDER BY n.changed DESC", "updated nodes"), array("WHERE n.status = 1 AND n.moderate = 0 ORDER BY n.nid DESC", "published nodes"), array("WHERE n.status = 0 AND n.moderate = 0 ORDER BY n.nid DESC", "non-published nodes"), array("WHERE n.status = 1 AND n.moderate = 1 ORDER BY n.nid DESC", "pending nodes"), array("WHERE n.status = 1 AND n.promote = 1 ORDER BY n.nid DESC", "promoted nodes"));
Dries's avatar
   
Dries committed
254

Dries's avatar
   
Dries committed
255
  $result = db_query("SELECT n.*, u.name, u.uid FROM node n LEFT JOIN users u ON n.uid = u.uid ". $queries[$query ? $query : 0][0] ." LIMIT 50");
Dries's avatar
   
Dries committed
256

Dries's avatar
   
Dries committed
257
258
  foreach ($queries as $key => $value) {
    $links[] = "<a href=\"admin.php?mod=node&op=nodes&query=$key\">$value[1]</a>";
Dries's avatar
Dries committed
259
260
  }

Dries's avatar
   
Dries committed
261
  $output .= "<small>". implode(" :: ", $links) ."</small><hr />";
Dries's avatar
   
Dries committed
262

Dries's avatar
   
Dries committed
263
264
265
  $output .= "<table border=\"1\" cellpadding=\"2\" cellspacing=\"2\">\n";
  $output .= " <tr><th>title</th><th>type</th><th>author</th><th>status</th><th colspan=\"2\">operations</th></tr>\n";
  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
266
    $output .= "<tr><td><a href=\"node.php?id=$node->nid\">". check_output($node->title) ."</a></td><td>$node->type</td><td nowrap=\"nowrap\">". format_name($node) ."</td><td>". ($node->status ? t("published") : t("not published")) ."</td><td nowrap=\"nowrap\"><a href=\"admin.php?mod=node&op=edit&id=$node->nid\">". t("edit node") ."</a></td><td nowrap=\"nowrap\"><a href=\"admin.php?mod=node&op=delete&id=$node->nid\">". t("delete node") ."</a></td></tr>";
Dries's avatar
   
Dries committed
267
  }
Dries's avatar
   
Dries committed
268
  $output .= "</table>";
Dries's avatar
   
Dries committed
269

Dries's avatar
   
Dries committed
270
  return $output;
Dries's avatar
Dries committed
271
272
}

Dries's avatar
   
Dries committed
273
274
275
276
277
278
279
280
281
282
283
284
/*
** Return the revision with the specified revision number.
*/

function node_revision_load($node, $revision) {
  return $node->revisions[$revision]["node"];
}

/*
** Create and return a new revision of the given node.
*/

Dries's avatar
   
Dries committed
285
286
287
function node_revision_create($node) {
  global $user;

Dries's avatar
   
Dries committed
288
289
290
291
292
  /*
  ** 'revision' is the name of the field used to indicicate that we
  ** have to create a new revision of a node.
  */

Dries's avatar
   
Dries committed
293
  if ($node->nid && $node->revision) {
Dries's avatar
   
Dries committed
294
295
296
297
    $prev = node_load(array("nid" => $node->nid));
    $node->revisions = $prev->revisions;
    unset($prev->revisions);
    $node->revisions[] = array("uid" => $user->uid, "timestamp" => time(), "node" => $prev, "history" => $node->history);
Dries's avatar
   
Dries committed
298
299
300
301
302
  }

  return $node;
}

Dries's avatar
   
Dries committed
303
304
305
/*
** Roll-back to the revision with the specified revision number.
*/
Dries's avatar
   
Dries committed
306

Dries's avatar
   
Dries committed
307
308
function node_revision_rollback($node, $revision) {
  global $user;
Dries's avatar
   
Dries committed
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343

  /*
  ** Extract the specified revision:
  */

  $rev = $node->revisions[$revision]["node"];

  /*
  ** Inherit all the past revisions:
  */

  $rev->revisions = $node->revisions;

  /*
  ** Save the original/current node:
  */

  $rev->revisions[] = array("uid" => $user->uid, "timestamp" => time(), "node" => $node);

  /*
  ** Remove the specified revision:
  */

  unset($rev->revisions[$revision]);

  /*
  ** Save the node:
  */

  foreach ($node as $key => $value) {
    $filter[] = $key;
  }

  node_save($rev, $filter);

Dries's avatar
   
Dries committed
344
  watchdog("special", "node: rollbacked to revision #$revision of '$node->title'");
Dries's avatar
   
Dries committed
345
346
}

Dries's avatar
   
Dries committed
347
348
349
350
351
/*
** Delete the revision with specified revision number.
*/

function node_revision_delete($node, $revision) {
Dries's avatar
   
Dries committed
352
353

  unset($node->revisions[$revision]);
Dries's avatar
   
Dries committed
354

Dries's avatar
   
Dries committed
355
  node_save($node, array("nid", "revisions"));
Dries's avatar
   
Dries committed
356
357
358
359

  watchdog("special", "node: removed revision #$revision of '$node->title'");
}

Dries's avatar
   
Dries committed
360
361
362
363
364
365
366
367
368
369
370
/*
** Return a list of all the existing revision numbers.
*/

function node_revision_list($node) {
  if (is_array($node->revisions)) {
    return array_keys($node->revisions);
  }
  else {
    return array();
  }
Dries's avatar
   
Dries committed
371
372
}

Dries's avatar
 
Dries committed
373
function node_admin() {
Dries's avatar
   
Dries committed
374
  global $op, $id, $revision, $edit;
Dries's avatar
   
Dries committed
375

Dries's avatar
   
Dries committed
376
  if (user_access("administer nodes")) {
Dries's avatar
   
Dries committed
377

Dries's avatar
   
Dries committed
378
379
380
    /*
    ** Compile a list of the administrative links:
    */
Dries's avatar
Dries committed
381

Dries's avatar
   
Dries committed
382
383
384
385
    $links[] = "<a href=\"admin.php?mod=node&op=nodes\">nodes</a>";
    $links[] = "<a href=\"admin.php?mod=node&op=search\">search content</a>";
    $links[] = "<a href=\"admin.php?mod=node&op=settings\">settings</a>";
    $links[] = "<a href=\"admin.php?mod=node&op=help\">help</a>";
Dries's avatar
   
Dries committed
386

Dries's avatar
   
Dries committed
387
    print "<small>". implode(" &middot; ", $links) ."</small><hr />";
Dries's avatar
   
Dries committed
388
389
390
391
392
393

    switch ($op) {
      case "help":
        print node_help();
        break;
      case "search":
Dries's avatar
   
Dries committed
394
        print search_type("node", "admin.php?mod=node&op=search");
Dries's avatar
   
Dries committed
395
        break;
Dries's avatar
   
Dries committed
396
397
398
399
      case t("Save configuration"):
      case t("Reset to defaults"):
      case "settings":
        print node_admin_settings($edit);
Dries's avatar
   
Dries committed
400
401
        break;
      case "edit":
Dries's avatar
   
Dries committed
402
        print node_admin_edit($id);
Dries's avatar
   
Dries committed
403
        break;
Dries's avatar
   
Dries committed
404
405
406
      case "delete":
        print node_delete(array("nid" => $id));
        break;
Dries's avatar
   
Dries committed
407
      case "rollback revision":
Dries's avatar
   
Dries committed
408
409
        print node_revision_rollback(node_load(array("nid" => $id)), $revision);
        print node_admin_edit($id);
Dries's avatar
   
Dries committed
410
411
        break;
      case "delete revision":
Dries's avatar
   
Dries committed
412
413
        print node_revision_delete(node_load(array("nid" => $id)), $revision);
        print node_admin_edit($id);
Dries's avatar
   
Dries committed
414
        break;
Dries's avatar
   
Dries committed
415
      case t("Preview"):
Dries's avatar
   
Dries committed
416
        print node_preview($edit);
Dries's avatar
   
Dries committed
417
        break;
Dries's avatar
   
Dries committed
418
      case t("Submit"):
Dries's avatar
   
Dries committed
419
420
421
422
        print node_submit($edit);
        print node_admin_nodes();
        break;
      case t("Delete"):
Dries's avatar
   
Dries committed
423
        print node_delete($edit);
Dries's avatar
   
Dries committed
424
        break;
Dries's avatar
   
Dries committed
425
      default:
Dries's avatar
   
Dries committed
426
        print node_admin_nodes();
Dries's avatar
   
Dries committed
427
428
429
430
    }
  }
  else {
    print message_access();
Dries's avatar
 
Dries committed
431
432
433
  }
}

Dries's avatar
   
Dries committed
434
435
436
437
function node_block() {
  global $theme;

  $block[0][subject] = t("Syndicate");
Dries's avatar
   
Dries committed
438
  $block[0][content] = "<div align=\"center\"><a href=\"module.php?mod=node&op=feed\"><img src=\"". $theme->image("xml.gif") ."\" width=\"36\" height=\"14\" border=\"0\" alt=\"XML\" /></a></div>\n";
Dries's avatar
   
Dries committed
439
440
441
442
443
444
  $block[0][info] = "Syndicate";

  return $block;
}

function node_feed() {
Dries's avatar
   
Dries committed
445

Dries's avatar
   
Dries committed
446
  $result = db_query("SELECT nid, type FROM node WHERE promote = '1' AND status = '1' ORDER BY created DESC LIMIT 15");
Dries's avatar
   
Dries committed
447
448

  while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
449
    $item = node_load(array("nid" => $node->nid, "type" => $node->type));
Dries's avatar
   
Dries committed
450
451
452

    $link = path_uri() ."node.php?id=$item->nid";

Dries's avatar
   
Dries committed
453
    $items .= format_rss_item($item->title, $link, $item->teaser);
Dries's avatar
   
Dries committed
454
455
456
  }

  $output .= "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>\n";
Dries's avatar
   
Dries committed
457
  $output .= "<!DOCTYPE rss [<!ENTITY % HTMLlat1 PUBLIC \"-//W3C//ENTITIES Latin 1 for XHTML//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml-lat1.ent\">\n";
Dries's avatar
   
Dries committed
458
  $output .= "<rss version=\"0.91\">\n";
Dries's avatar
   
Dries committed
459
  $output .= format_rss_channel(variable_get("site_name", "drupal"), path_uri(), variable_get("site_slogan", ""), $items);
Dries's avatar
   
Dries committed
460
461
  $output .= "</rss>\n";

Dries's avatar
   
Dries committed
462
463
  header("Content-Type: text/xml");

Dries's avatar
   
Dries committed
464
465
466
467
  print $output;

}

Dries's avatar
   
Dries committed
468

Dries's avatar
   
Dries committed
469
function node_validate($node, $error = array()) {
Dries's avatar
   
Dries committed
470
471
472
473
474
475
476

  global $user;

  /*
  ** Convert the node to an object if necessary:
  */

Dries's avatar
   
Dries committed
477
  $node = node_object($node);
Dries's avatar
   
Dries committed
478
479
480
481
482

  /*
  ** Validate the title field:
  */

Dries's avatar
   
Dries committed
483
  if (isset($node->title) && !$node->title) {
Dries's avatar
   
Dries committed
484
485
486
487
488
489
490
491
492
    $error["title"] = "<div style=\"color: red;\">". t("You have to specify a valid title.") ."</div>";
  }

  if (user_access("administer nodes")) {

    /*
    ** Setup default values if required:
    */

Dries's avatar
   
Dries committed
493
494
    if (!$node->created) {
      $node->created = time();
Dries's avatar
   
Dries committed
495
496
    }

Dries's avatar
   
Dries committed
497
498
    if (!$node->date) {
      $node->date = date("M j, Y g:i a", $node->created);
Dries's avatar
   
Dries committed
499
500
501
502
503
504
    }

    /*
    ** Validate the "authored by"-field:
    */

Dries's avatar
   
Dries committed
505
506
507
508
509
510
511
512
513
    if (empty($node->name)) {
      /*
      ** The use of empty() is mandatory in the context of usernames
      ** as the empty string denotes the anonymous user.  In case we
      ** are dealing with an anomymous user we set the user ID to 0.
      */
      $node->uid = 0;
    }
    else if ($account = user_load(array("name" => $node->name))) {
Dries's avatar
   
Dries committed
514
      $node->uid = $account->uid;
Dries's avatar
   
Dries committed
515
516
    }
    else {
Dries's avatar
   
Dries committed
517
      $error["name"] = "<div style=\"color: red;\">". sprintf(t("The name '%s' does not exist."), $node->name) ."</div>";
Dries's avatar
   
Dries committed
518
519
520
521
522
523
    }

    /*
    ** Validate the "authored on"-field:
    */

Dries's avatar
   
Dries committed
524
525
    if (strtotime($node->date) > 1000) {
      $node->created = strtotime($node->date);
Dries's avatar
   
Dries committed
526
527
528
529
    }
    else {
      $error["date"] = "<div style=\"color: red;\">". t("You have to specifiy a valid date.") ."</div>";
    }
Dries's avatar
   
Dries committed
530
531
532
533
534

    /*
    ** Validate the "teaser"-field:
    */

Dries's avatar
   
Dries committed
535
    if ($node->teaser && count(explode(" ", $node->teaser)) < variable_get("minimum_teaser_size", 0)) {
Dries's avatar
   
Dries committed
536
537
538
      $error["teaser"] = "<div style=\"color: red;\">". t("Your teaser is too short.") ."</div>";
    }

Dries's avatar
   
Dries committed
539
540
  }

Dries's avatar
   
Dries committed
541
  return $node;
Dries's avatar
   
Dries committed
542
543
}

Dries's avatar
   
Dries committed
544

Dries's avatar
   
Dries committed
545
546
function node_form($edit) {

Dries's avatar
   
Dries committed
547
548
549
550
  /*
  ** Validate the node:
  */

Dries's avatar
   
Dries committed
551
  $edit = node_validate($edit, &$error);
Dries's avatar
   
Dries committed
552

Dries's avatar
   
Dries committed
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
  /*
  ** Get the node specific bits:
  */

  $function = $edit->type ."_form";
  if (function_exists($function)) {
    $form .= $function(&$edit, &$help, &$error);
  }

  /*
  ** Add the help text:
  */

  if ($help) {
    $output .= "<p>$help</p>";
  }

Dries's avatar
   
Dries committed
570
571
572
573
  $output .= "<table border=\"0\" cellpadding=\"2\" cellspacing=\"2\">";
  $output .= " <tr>";
  $output .= "  <td valign=\"top\">";

Dries's avatar
   
Dries committed
574
575
576
577
578
579
580
581
582
583
584
  /*
  ** Add the default fields:
  */

  $output .= form_textfield(t("Title"), "title", $edit->title, 60, 64, $error["title"]);

  if ($edit->body && !$edit->teaser) {
    $edit->teaser = node_teaser($edit->body);
  }

  if ($edit->teaser) {
Dries's avatar
   
Dries committed
585
    $output .= form_textarea(t("Teaser"), "teaser", $edit->teaser, 60, 5, $error["teaser"]);
Dries's avatar
   
Dries committed
586
587
588
  }

  /*
Dries's avatar
   
Dries committed
589
  ** Add the node specific fields:
Dries's avatar
   
Dries committed
590
591
  */

Dries's avatar
   
Dries committed
592
  $output .= $form;
Dries's avatar
   
Dries committed
593
594
595
596
597
598
599
600
601

  /*
  ** Add the hidden fields:
  */

  if ($edit->nid) {
    $output .= form_hidden("nid", $edit->nid);
  }

Dries's avatar
   
Dries committed
602
603
604
605
606
  if (isset($edit->uid)) {
      /*
      ** The use of isset() is mandatory in the context of user IDs as uid
      ** 0 denotes the anonymous user.
      */
Dries's avatar
   
Dries committed
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
    $output .= form_hidden("uid", $edit->uid);
  }

  if ($edit->created) {
    $output .= form_hidden("created", $edit->created);
  }

  $output .= form_hidden("type", $edit->type);

  /*
  ** Add the buttons:
  */

  $output .= form_submit(t("Preview"));

  if ($edit->title && $edit->type && !$error) {
    $output .= form_submit(t("Submit"));
  }

Dries's avatar
   
Dries committed
626
  if ($edit->nid && node_access("delete", $edit)) {
Dries's avatar
   
Dries committed
627
628
629
630
631
632
633
634
    $output .= form_submit(t("Delete"));
  }

  /*
  ** Add the admin specific parts:
  */

  if (user_access("administer nodes")) {
Dries's avatar
   
Dries committed
635
    $output .= "</td><td align=\"left\" valign=\"top\">";
Dries's avatar
   
Dries committed
636

Dries's avatar
   
Dries committed
637
638
639
    $output .= form_textfield(t("Authored by"), "name", $edit->name, 20, 25, $error["name"]);
    $output .= form_textfield(t("Authored on"), "date", $edit->date, 20, 25, $error["date"]);
    $output .= "<br />";
Dries's avatar
   
Dries committed
640
641
642
643
    $output .= form_select(t("Set public/published"), "status", $edit->status, array("Disabled", "Enabled"));
    $output .= form_select(t("Allow users comments"), "comment", $edit->comment, array("Disabled", "Enabled"));
    $output .= form_select(t("Promote to front page"), "promote", $edit->promote, array("Disabled", "Enabled"));
    $output .= form_select(t("Create new revision"), "revision", $edit->revision, array("Disabled", "Enabled"));
Dries's avatar
   
Dries committed
644
645
  }

Dries's avatar
   
Dries committed
646
647
648
649
  $output .= "  </td>";
  $output .= " </tr>";
  $output .= "</table>";

Dries's avatar
   
Dries committed
650
651
652
653
654
655
656
  return form($output);
}

function node_add($type) {
  global $user;

  if ($type) {
Dries's avatar
   
Dries committed
657
    $output = node_form(array("uid" => $user->uid, "name" => $user->name, "type" => $type));
Dries's avatar
   
Dries committed
658
659
  }
  else {
Dries's avatar
   
Dries committed
660

Dries's avatar
   
Dries committed
661
662
663
    /*
    ** Compile a list with the different node types and their explanation:
    */
Dries's avatar
   
Dries committed
664

Dries's avatar
   
Dries committed
665
    foreach (module_list() as $name) {
Dries's avatar
   
Dries committed
666
667
668
669
670
      if (module_hook($name, "node") && node_access("create", array("type" => $name))) {
        $output .= "<li>";
        $output .= " <a href=\"module.php?mod=node&op=add&type=$name\">". module_invoke($name, "node", "name") ."</a>";
        $output .= " <div style=\"margin-left: 20px;\">". module_invoke($name, "node", "description") ."</div>";
        $output .= "</li>";
Dries's avatar
   
Dries committed
671
      }
Dries's avatar
   
Dries committed
672
673
    }

Dries's avatar
   
Dries committed
674
675
    $output = t("Choose the appropriate item from the list:") ."<ul>$output</ul>";

Dries's avatar
   
Dries committed
676
677
678
679
680
681
682
683
684
685
  }

  return $output;
}

function node_edit($id) {
  global $user;

  $node = node_load(array("nid" => $id));

Dries's avatar
   
Dries committed
686
687
688
689
690
691
692
693
  if (node_access("update", $node)) {
    $output = node_form($node);
  }
  else {
    $output = message_access();
  }

  return $output;
Dries's avatar
   
Dries committed
694
695
696
697
698
699
700
701
}

function node_preview($edit) {

  /*
  ** Load the user's name when needed:
  */

Dries's avatar
   
Dries committed
702
703
704
705
706
707
708
709
710
711
712
  if (isset($edit["name"])) {
      /*
      ** The use of isset() is mandatory in the context of user IDs as uid
      ** 0 denotes the anonymous user.
      */
    if ($user = user_load(array("name" => $edit["name"]))) {
      $edit["uid"] = $user->uid;
    }
    else {
      $edit["uid"] = 0; // anonymous user
    }
Dries's avatar
   
Dries committed
713
714
715
716
717
718
719
720
721
722
723
724
725
726
  }
  else if ($edit["uid"]) {
    $user = user_load(array("uid" => $edit["uid"]));
    $edit["name"] = $user->name;
  }

  /*
  ** Set the created time when needed:
  */

  if (empty($edit["nid"])) {
    $edit["created"] = time();
  }

Dries's avatar
   
Dries committed
727
728
729
730
731
732
733
734
  /*
  ** Apply the required filters:
  */

  foreach ($edit as $key => $value) {
    $node->$key = check_input($value);
  }

Dries's avatar
   
Dries committed
735
736
737
738
  /*
  ** Display a preview of the node:
  */

Dries's avatar
   
Dries committed
739
  node_view($node);
Dries's avatar
   
Dries committed
740
741
742
743

  return node_form($edit);
}

Dries's avatar
   
Dries committed
744
function node_submit($node) {
Dries's avatar
   
Dries committed
745
746
  global $user;

Dries's avatar
   
Dries committed
747
748
749
750
751
752
753
  /*
  ** Verify a user's submission rate and avoid duplicate nodes being
  ** inserted:
  */

  throttle("node", variable_get("max_node_rate", 900));

Dries's avatar
   
Dries committed
754
755
756
757
  /*
  ** Fixup the node when required:
  */

Dries's avatar
   
Dries committed
758
  $node = node_validate($node);
Dries's avatar
   
Dries committed
759

Dries's avatar
   
Dries committed
760
761
762
763
  /*
  ** Create a new revision when required:
  */

Dries's avatar
   
Dries committed
764
  $node = node_revision_create($node);
Dries's avatar
   
Dries committed
765

Dries's avatar
   
Dries committed
766
  if ($node->nid) {
Dries's avatar
   
Dries committed
767
768

    /*
Dries's avatar
   
Dries committed
769
770
    ** Check whether the current user has the proper access rights to
    ** perform this operation:
Dries's avatar
   
Dries committed
771
772
    */

Dries's avatar
   
Dries committed
773
774
775
776
777
778
779
780
    if (node_access("update", $node)) {

      /*
      ** Compile a list of the node fields and their default values that users
      ** and administrators are allowed to save when updating a node.
      */

      if (user_access("administer nodes")) {
Dries's avatar
   
Dries committed
781
        $fields = array("nid", "uid", "body", "comment", "created", "promote", "moderate", "revisions", "status", "teaser", "title", "type" => $node->type);
Dries's avatar
   
Dries committed
782
783
784
785
786
      }
      else {
        $fields = array("nid", "uid" => $user->uid, "body", "teaser", "title", "type" => $node->type);
      }

Dries's avatar
   
Dries committed
787
      node_save($node, array_merge($fields, module_invoke($node->type, "save", "update", $node)));
Dries's avatar
   
Dries committed
788

Dries's avatar
   
Dries committed
789
      watchdog("special", "node: updated '$node->title'");
Dries's avatar
   
Dries committed
790
      $output = t("The node has been updated.");
Dries's avatar
   
Dries committed
791
792
    }
    else {
Dries's avatar
   
Dries committed
793
794
      watchdog("warning", "node: not authorized to update node");
      $output = t("You are not authorized to update this node.");
Dries's avatar
   
Dries committed
795
796
797
798
    }

  }
  else {
Dries's avatar
   
Dries committed
799

Dries's avatar
   
Dries committed
800
    /*
Dries's avatar
   
Dries committed
801
802
    ** Check whether the current user has the proper access rights to
    ** perform this operation:
Dries's avatar
   
Dries committed
803
804
    */

Dries's avatar
   
Dries committed
805
    if (node_access("create", $node)) {
Dries's avatar
   
Dries committed
806

Dries's avatar
   
Dries committed
807
808
809
810
      /*
      ** Compile a list of the node fields and their default values that users
      ** and administrators are allowed to save when inserting a new node.
      */
Dries's avatar
   
Dries committed
811

Dries's avatar
   
Dries committed
812
813
814
815
816
817
      if (user_access("administer nodes")) {
        $fields = array("uid", "body", "comment" => 1, "promote", "moderate", "status" => 1, "teaser", "title", "type" => $node->type);
      }
      else {
        $fields = array("uid" => $user->uid, "body", "comment" => 1, "teaser", "title", "type" => $node->type);
      }
Dries's avatar
   
Dries committed
818

Dries's avatar
   
Dries committed
819
      node_save($node, array_merge($fields, module_invoke($node->type, "save", "create", $node)));
Dries's avatar
   
Dries committed
820

Dries's avatar
   
Dries committed
821
      watchdog("special", "node: added '$node->title'");
Dries's avatar
   
Dries committed
822
823
824
825
826
827
      $output = t("Thanks for your submission.");
    }
    else {
      watchdog("warning", "node: not authorized to create node");
      $output = t("You are not authorized to create this node.");
    }
Dries's avatar
   
Dries committed
828
829
830
831
832
  }

  return $output;
}

Dries's avatar
   
Dries committed
833
function node_delete($edit) {
Dries's avatar
   
Dries committed
834

Dries's avatar
   
Dries committed
835
836
837
  $node = node_load(array("nid" => $edit["nid"]));

  if (node_access("delete", $node)) {
Dries's avatar
   
Dries committed
838

Dries's avatar
   
Dries committed
839
    if ($edit["confirm"]) {
Dries's avatar
   
Dries committed
840

Dries's avatar
   
Dries committed
841
842
843
844
845
846
847
848
849
850
851
852
853
854
      /*
      ** Delete the specified node and its comments:
      */

      db_query("DELETE FROM node WHERE nid = '$node->nid'");
      db_query("DELETE FROM comments WHERE lid = '$node->nid'");

      /*
      ** Call the node specific callback (if any):
      */

      module_invoke($node->type, "delete", &$node);

      watchdog("special", "node: deleted '$node->title'");
Dries's avatar
   
Dries committed
855
856
857
      $output = t("The node has been deleted.");
    }
    else {
Dries's avatar
   
Dries committed
858
      $output .= form_item(t("Confirm deletion"), check_output($node->title));
Dries's avatar
   
Dries committed
859
860
861
862
863
      $output .= form_hidden("nid", $node->nid);
      $output .= form_hidden("confirm", 1);
      $output .= form_submit(t("Delete"));
      $output = form($output, "post", "admin.php?mod=node");
    }
Dries's avatar
   
Dries committed
864
865
  }
  else {
Dries's avatar
   
Dries committed
866
867
    watchdog("warning", "node: not authorized to remove node");
    $output = t("You are not authorized to remove this node.");
Dries's avatar
   
Dries committed
868
869
870
871
872
  }

  return $output;
}

Dries's avatar
   
Dries committed
873
function node_page() {
Dries's avatar
   
Dries committed
874
  global $op, $id, $user, $edit, $type, $theme, $meta, $date;
Dries's avatar
   
Dries committed
875
876
877

  if ($op == "feed") {
    node_feed();
Dries's avatar
   
Dries committed
878
    return;
Dries's avatar
   
Dries committed
879
  }
Dries's avatar
   
Dries committed
880

Dries's avatar
   
Dries committed
881
882
883
884
885
886
887
888
889
890
891
892
893
894
  /*
  ** Try to find a good title:
  */

  if ($type) {
    $title = ucfirst(module_invoke($type, "node", "name"));
  }
  else if ($edit["type"]) {
    $title = ucfirst(module_invoke($edit["type"], "node", "name"));
  }
  else {
    $title = t("Submission form");
  }

Dries's avatar
   
Dries committed
895
896
897
898
  $theme->header();

  switch ($op) {
    case "add":
Dries's avatar
   
Dries committed
899
      $theme->box($title, node_add($type));
Dries's avatar
   
Dries committed
900
901
      break;
    case "edit":
Dries's avatar
   
Dries committed
902
      $theme->box($title, node_edit($id));
Dries's avatar
   
Dries committed
903
904
      break;
    case t("Preview"):
Dries's avatar
   
Dries committed
905
      $theme->box($title, node_preview($edit));
Dries's avatar
   
Dries committed
906
907
      break;
    case t("Submit"):
Dries's avatar
   
Dries committed
908
      $theme->box($title, node_submit($edit));
Dries's avatar
   
Dries committed
909
      break;
Dries's avatar
   
Dries committed
910
    case t("Delete"):
Dries's avatar
   
Dries committed
911
      print node_delete($edit);
Dries's avatar
   
Dries committed
912
      break;
Dries's avatar
   
Dries committed
913
    default:
Dries's avatar
   
Dries committed
914
      $result = db_query("SELECT nid, type FROM node WHERE ". ($meta ? "attributes LIKE '%". check_input($meta) ."%' AND " : "") ." promote = '1' AND status = '1' AND created <= '". ($date > 0 ? check_input($date) : time()) ."' ORDER BY created DESC LIMIT ". ($user->nodes ? $user->nodes : variable_get("default_nodes_main", 10)));
915
      while ($node = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
916
        node_view(node_load(array("nid" => $node->nid, "type" => $node->type)), 1);
917
918
      }
  }
Dries's avatar
   
Dries committed
919
920

  $theme->footer();
Dries's avatar
   
Dries committed
921
}
Dries's avatar
   
Dries committed
922

Dries's avatar
 
Dries committed
923
?>