story.module 12.3 KB
Newer Older
Dries's avatar
 
Dries committed
1
<?php
Dries's avatar
 
Dries committed
2

Dries's avatar
 
Dries committed
3 4
$module = array("cron" => "story_cron",
                "help" => "story_help",
Dries's avatar
 
Dries committed
5 6 7
                "find" => "story_find",
                "admin" => "story_admin",
                "block" => "story_block");
Dries's avatar
 
Dries committed
8

Dries's avatar
 
Dries committed
9 10
include_once "includes/section.inc";

Dries's avatar
 
Dries committed
11 12 13
function story_cron() {
  $result = db_query("SELECT * FROM stories WHERE status = 3 AND timestamp <= ". time() ."");
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
14
    db_query("UPDATE stories SET status = '1', timestamp = '". time() ."' WHERE id = '$story->id'");
Dries's avatar
 
Dries committed
15 16 17
  }
}

Dries's avatar
 
Dries committed
18
function story_find($keys) {
Dries's avatar
 
Dries committed
19
  global $user;
Dries's avatar
 
Dries committed
20
  $find = array();
Dries's avatar
 
Dries committed
21
  $result = db_query("SELECT s.*, u.userid FROM stories s LEFT JOIN users u ON s.author = u.id WHERE s.status = 2 AND (s.subject LIKE '%". check_input($keys) ."%' OR s.abstract LIKE '%". check_input($keys) ."%' OR s.article LIKE '%$keys%') ORDER BY s.timestamp DESC LIMIT 20");
Dries's avatar
 
Dries committed
22
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
23
    array_push($find, array("subject" => check_output($story->subject), "link" => (user_access($user, "story") ? "admin.php?mod=story&op=edit&id=$story->id" : "story.php?id=$story->id"), "user" => $story->userid, "date" => $story->timestamp));
Dries's avatar
 
Dries committed
24 25 26 27
  }
  return $find;
}

Dries's avatar
 
Dries committed
28 29
function story_search() {
  global $keys, $mod;
Dries's avatar
 
Dries committed
30 31
  print search_form($keys);
  print search_data($keys, $mod);
Dries's avatar
 
Dries committed
32 33
}

Dries's avatar
 
Dries committed
34 35
function story_help() {
 ?>
Dries's avatar
 
Dries committed
36 37 38 39
  <P>Scheduled stories: stories that are scheduled to be automatically published at a given date and time.  Useful when you have to leave the site alone for a while or when you want to regulate the flow of new content.</P>
  <P>Queued stories: user-contributed stories are automatically whisked away to a submission queue for moderators (i.e. registered user) to frown at.  Moderators vote whether or not a story should be posted to the front page for discussion.</P>
  <P>Posted stories: published stories accessible to all visitors.</P>
  <P>Dumped stories: rejected stories that are no longer available to visitors.</P>
Dries's avatar
 
Dries committed
40
 <?php
Dries's avatar
 
Dries committed
41 42
}

Dries's avatar
 
Dries committed
43
function story_block() {
Dries's avatar
 
Dries committed
44
  $result = db_query("SELECT s.id, COUNT(c.cid) AS comments, s.subject FROM stories s LEFT JOIN comments c ON s.id = c.lid WHERE s.status = 2 AND c.link = 'story' GROUP BY s.id ORDER BY comments DESC LIMIT 10");
Dries's avatar
 
Dries committed
45
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
46
    $content .= "<LI><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
Dries's avatar
 
Dries committed
47 48 49 50 51 52
  }

  $blocks[0]["subject"] = "Top 10:<BR>all stories";
  $blocks[0]["content"] = $content;
  $blocks[0]["info"] = "Top 10: all stories";

Dries's avatar
 
Dries committed
53 54
  unset($content);

Dries's avatar
 
Dries committed
55
  $result = db_query("SELECT s.id, COUNT(c.cid) AS comments, s.subject FROM stories s LEFT JOIN comments c ON s.id = c.lid WHERE s.status = 2 AND c.link = 'story' AND ". time() ." - s.timestamp < 2419200 GROUP BY s.id ORDER BY comments DESC LIMIT 10");
Dries's avatar
 
Dries committed
56
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
57
    $content .= "<LI><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
Dries's avatar
 
Dries committed
58 59 60 61 62 63 64 65
  }

  $blocks[1]["subject"] = "Top 10:<BR>recent stories";
  $blocks[1]["content"] = $content;
  $blocks[1]["info"] = "Top 10: recent stories";

  return $blocks;
}
Dries's avatar
 
Dries committed
66

Dries's avatar
 
Dries committed
67
function story_add() {
Dries's avatar
 
Dries committed
68
  global $allowed_html;
Dries's avatar
 
Dries committed
69 70

  $output .= "<FORM ACTION=\"admin.php?mod=story\" METHOD=\"post\">\n";
Dries's avatar
 
Dries committed
71

Dries's avatar
 
Dries committed
72 73 74 75
  $output .= "<B>Subject:</B><BR>\n";
  $output .= "<INPUT TYPE=\"text\" NAME=\"edit[subject]\" SIZE=\"50\" MAXLENGTH=\"60\"><BR>\n";

  $output .= "<B>Section:</B><BR>\n";
Dries's avatar
 
Dries committed
76
  foreach ($sections = section_get() as $value) $options .= "  <OPTION VALUE=\"". check_textfield($value) ."\">". check_output($value) ."</OPTION>\n";
Dries's avatar
 
Dries committed
77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
  $output .= "<SELECT NAME=\"edit[section]\">$options</SELECT><P>\n";

  $output .= "<B>Abstract:</B><BR>\n";
  $output .= "<TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"10\" NAME=\"edit[abstract]\" MAXLENGTH=\"20\"></TEXTAREA><BR>\n";
  $output .= "<SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL><P>\n";

  $output .= "<B>Extended story:</B><BR>\n";
  $output .= "<TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"15\" NAME=\"edit[article]\"></TEXTAREA><BR>\n";
  $output .= "<SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL><P>\n";

  $output .= "<B>Status:</B><BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"3\">scheduled story for <INPUT TYPE=\"text\" NAME=\"edit[date]\" SIZE=\"30\" VALUE=\"". date("j F Y G:i") ."\"><BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"2\">posted story<BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"1\" CHECKED>queued story<BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"0\">dumped story<BR>\n";
  $output .= "<SMALL><I>The textfield for scheduled stories expects a string containing an English date format of when you want to have your story automatically published.<BR>Example input: '". date("j F Y G:i") ."', '". date("m/d/y H:i") ."', '". date("F j, Y H:i") ."', ...</I></SMALL><P>\n";
Dries's avatar
 
Dries committed
93

Dries's avatar
 
Dries committed
94
  $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Add story\">\n";
Dries's avatar
 
Dries committed
95 96 97 98 99 100 101 102
  $output .= "</FORM>\n";

  print $output;
}

function story_add_save($edit) {
  global $user;
  $timestamp = ($edit[status] == 3 && strtotime($edit[date]) > time()) ? strtotime($edit[date]) : time();
Dries's avatar
 
Dries committed
103
  db_query("INSERT INTO stories (author, subject, abstract, article, section, status, timestamp) VALUES ('$user->id', '". check_input($edit[subject]) ."', '". check_input($edit[abstract]) ."', '". check_input($edit[article]) ."', '". check_input($edit[section]) ."', '$edit[status]', '$timestamp')");
Dries's avatar
 
Dries committed
104 105 106
  watchdog("story", "story: added '$edit[subject]'");
}

Dries's avatar
 
Dries committed
107
function story_edit($id) {
Dries's avatar
 
Dries committed
108
  global $allowed_html;
Dries's avatar
 
Dries committed
109

Dries's avatar
 
Dries committed
110
  $result = db_query("SELECT s.*, u.userid FROM stories s LEFT JOIN users u ON s.author = u.id WHERE s.id = '$id'");
Dries's avatar
 
Dries committed
111 112
  $story = db_fetch_object($result);

Dries's avatar
 
Dries committed
113
  $output .= "<FORM ACTION=\"admin.php?mod=story&id=$id\" METHOD=\"post\">\n";
Dries's avatar
 
Dries committed
114

Dries's avatar
 
Dries committed
115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
  $output .= "<B>Author:</B><BR>\n";
  $output .= format_username($story->userid) ."<P>\n";

  $output .= "<B>Subject:</B><BR>\n";
  $output .= "<INPUT TYPE=\"text\" NAME=\"edit[subject]\" SIZE=\"50\" MAXLENGTH=\"60\" VALUE=\"". check_textfield($story->subject) ."\"><P>\n";

  $output .= "<B>Section:</B><BR>\n";
  foreach ($sections = section_get() as $value) $options .= "  <OPTION VALUE=\"$value\"". ($story->section == $value ? " SELECTED" : "") .">$value</OPTION>\n";
  $output .= "<SELECT NAME=\"edit[section]\">$options</SELECT><P>\n";

  $output .= "<B>Abstract:</B><BR>\n";
  $output .= "<TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"10\" NAME=\"edit[abstract]\">". check_textarea($story->abstract) ."</TEXTAREA><BR>\n";
  $output .= "<SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL><P>\n";

  $output .= "<B>Editor's note/updates:</B><BR>\n";
  $output .= "<TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"10\" NAME=\"edit[updates]\">". check_textarea($story->updates) ."</TEXTAREA><BR>\n";
  $output .= "<SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL><P>\n";

  $output .= "<B>Extended story:</B><BR>\n";
  $output .= "<TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"15\" NAME=\"edit[article]\">". check_textarea($story->article) ."</TEXTAREA><BR>\n";
  $output .= "<SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL><P>\n";

  $output .= "<B>Status:</B><BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"3\"". ($story->status == 3 ? " CHECKED" : "") .">scheduled story for <INPUT TYPE=\"text\" NAME=\"edit[date]\" SIZE=\"30\" VALUE=\"". date("j F Y G:i", $story->timestamp) ."\"><BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"2\"". ($story->status == 2 ? " CHECKED" : "") .">posted story<BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"1\"". ($story->status == 1 ? " CHECKED" : "") .">queued story<BR>\n";
  $output .= "<INPUT TYPE=\"radio\" NAME=\"edit[status]\" VALUE=\"0\"". ($story->status == 0 ? " CHECKED" : "") .">dumped story<BR>\n";
  $output .= "<SMALL><I>The textfield for scheduled stories expects a string containing an English date format of when you want to have your story automatically published.<BR>Example input: '". date("j F Y G:i") ."', '". date("m/d/y H:i") ."', '". date("F j, Y H:i") ."', ...</I></SMALL><P>\n";

  $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Save story\">\n";
Dries's avatar
 
Dries committed
145
  $output .= "</FORM>\n";
Dries's avatar
 
Dries committed
146

Dries's avatar
 
Dries committed
147 148 149
  print $output;
}

Dries's avatar
 
Dries committed
150
function story_edit_save($id, $edit) {
Dries's avatar
 
Dries committed
151 152
  if ($edit[status] == 3 && strtotime($edit[date]) > time()) db_query("UPDATE stories SET subject = '". check_input($edit[subject]) ."', abstract = '". check_input($edit[abstract]) ."', updates = '". check_input($edit[updates]) ."', article = '". check_input($edit[article]) ."', section = '". check_input($edit[section]) ."', status = '$edit[status]', timestamp = '". strtotime($edit[date]) ."' WHERE id = '$id'");
  else db_query("UPDATE stories SET subject = '". check_input($edit[subject]) ."', abstract = '". check_input($edit[abstract]) ."', updates = '". check_input($edit[updates]) ."', article = '". check_input($edit[article]) ."', section = '". check_input($edit[section]) ."', status = '$edit[status]' WHERE id = '$id'");
Dries's avatar
 
Dries committed
153
  watchdog("message", "story: modified '$edit[subject]'");
Dries's avatar
 
Dries committed
154 155
}

Dries's avatar
 
Dries committed
156
function story_display() {
Dries's avatar
 
Dries committed
157
  $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
Dries's avatar
 
Dries committed
158 159 160 161 162

  // Pending stories:
  $result = db_query("SELECT s.*, u.userid FROM stories s LEFT JOIN users u ON u.id = s.author WHERE s.status = 1 ORDER BY timestamp DESC");
  $output .= " <TR><TH COLSPAN=\"4\">queued stories</TH></TR>\n";
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
163
    $output .= " <TR><TD><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid) ."</TD><TD>votes: $story->votes, score: $story->score</TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=story&op=edit&id=$story->id\">edit</A></TD></TR>\n";
Dries's avatar
 
Dries committed
164 165
  }

Dries's avatar
 
Dries committed
166 167 168
  // Scheduled stories:
  $result = db_query("SELECT s.*, u.userid FROM stories s LEFT JOIN users u ON u.id = s.author WHERE s.status = 3 ORDER BY timestamp");
  $output .= " <TR><TH COLSPAN=\"4\">scheduled stories</TH></TR>\n";
Dries's avatar
 
Dries committed
169
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
170
    $output .= " <TR><TD><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid) ."</TD><TD>". date("D, m/d/Y H:i", $story->timestamp) ." - ". format_interval($story->timestamp - time()) ." left</TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=story&op=edit&id=$story->id\">edit</A></TD></TR>\n";
Dries's avatar
 
Dries committed
171 172
  }

Dries's avatar
 
Dries committed
173 174 175 176
  // Dumped stories:
  $result = db_query("SELECT s.*, u.userid FROM stories s LEFT JOIN users u ON u.id = s.author WHERE s.status = 0 ORDER BY timestamp DESC LIMIT 5");
  $output .= " <TR><TH COLSPAN=\"4\">dumped stories</TTH></TR>\n";
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
177
    $output .= " <TR><TD><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid) ."</TD><TD>$story->section</TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=story&op=edit&id=$story->id\">edit</A></TD></TR>\n";
Dries's avatar
 
Dries committed
178 179 180 181 182 183
  }

  // Posted stories:
  $result = db_query("SELECT s.*, u.userid FROM stories s LEFT JOIN users u ON u.id = s.author WHERE s.status = 2 ORDER BY timestamp DESC LIMIT 15");
  $output .= " <TR><TH COLSPAN=\"4\">posted stories</TH></TR>\n";
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
184
    $output .= " <TR><TD><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid) ."</TD><TD>$story->section</TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=story&op=edit&id=$story->id\">edit</A></TD></TR>\n";
Dries's avatar
 
Dries committed
185
  }
Dries's avatar
 
Dries committed
186

Dries's avatar
 
Dries committed
187
  $output .= "</TABLE>\n";
Dries's avatar
 
Dries committed
188

Dries's avatar
 
Dries committed
189 190 191 192
  print $output;
}

function story_admin() {
Dries's avatar
 
Dries committed
193 194
  global $op, $id, $edit;

Dries's avatar
 
Dries committed
195
  print "<SMALL><A HREF=\"admin.php?mod=story&op=add\">add new story</A> | <A HREF=\"admin.php?mod=story\">overview</A> | <A HREF=\"admin.php?mod=story&op=search\">search story</A> | <A HREF=\"admin.php?mod=story&op=help\">help</A></SMALL><HR>\n";
Dries's avatar
 
Dries committed
196

Dries's avatar
 
Dries committed
197
  switch ($op) {
Dries's avatar
 
Dries committed
198 199 200
    case "add":
      story_add();
      break;
Dries's avatar
 
Dries committed
201
    case "edit":
Dries's avatar
 
Dries committed
202
      story_edit(check_input($id));
Dries's avatar
 
Dries committed
203
      break;
Dries's avatar
 
Dries committed
204 205
    case "help":
      story_help();
Dries's avatar
 
Dries committed
206
      break;
Dries's avatar
 
Dries committed
207 208 209
   case "search":
      story_search();
      break;
Dries's avatar
 
Dries committed
210 211 212 213 214
    case "Add story":
      story_add_save($edit);
      story_display();
      break;
    case "Save story":
Dries's avatar
 
Dries committed
215
      story_edit_save(check_input($id), $edit);
Dries's avatar
 
Dries committed
216
      story_display();
Dries's avatar
 
Dries committed
217 218 219 220 221 222
      break;
    default:
      story_display();
  }
}

Dries's avatar
 
Dries committed
223
?>