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

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

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

function story_help() {
 ?>
  <P><B>Scheduled stories</B>: 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><B>Queued stories</B>: user-contributed stories are automatically whisked away to a submission queue for moderators to frown at it.  Moderators vote whether or not a story should be carried to the front page for discussion.</P>
  <P><B>Posted stories</B>: published stories accessible to all visitors.</P>
  <P><B>Dumped stories</B>: rejected stories that are no longer available to visitors.</P>
 <?
}

Dries's avatar
 
Dries committed
24
function story_block() {
Dries's avatar
 
Dries committed
25
  $result = db_query("SELECT s.id, COUNT(s.id) AS comments, s.subject FROM stories s LEFT JOIN comments c ON s.id = c.sid WHERE s.status = 2 GROUP BY s.id ORDER BY comments DESC LIMIT 10");
Dries's avatar
 
Dries committed
26 27 28 29 30 31 32 33
  while ($story = db_fetch_object($result)) {
    $content .= "<LI><A HREF=\"discussion.php?id=$story->id\">$story->subject</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
  }

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

Dries's avatar
 
Dries committed
34 35
  unset($content);

Dries's avatar
 
Dries committed
36
  $result = db_query("SELECT s.id, COUNT(s.id) AS comments, s.subject FROM stories s LEFT JOIN comments c ON s.id = c.sid WHERE s.status = 2 AND ". time() ." - s.timestamp < 2419200 GROUP BY s.id ORDER BY comments DESC LIMIT 10");
Dries's avatar
 
Dries committed
37 38 39 40 41 42 43 44 45 46
  while ($story = db_fetch_object($result)) {
    $content .= "<LI><A HREF=\"discussion.php?id=$story->id\">$story->subject</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
  }

  $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
47

Dries's avatar
 
Dries committed
48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
function story_add() {
  global $allowed_html, $categories;

  $output .= "<FORM ACTION=\"admin.php?mod=story\" METHOD=\"post\">\n";
 
  $output .= "<P>\n";
  $output .= " <B>Subject:</B><BR>\n";
  $output .= " <INPUT TYPE=\"text\" NAME=\"edit[subject]\" SIZE=\"50\" MAXLENGTH=\"60\"><BR>\n";
  $output .= "</P>\n";

  $output .= "<P><B>Category:</B><BR>\n";
  $output .= " <SELECT NAME=\"edit[category]\">\n";  
  for ($i = 0; $i < sizeof($categories); $i++) {
    $output .= "  <OPTION VALUE=\"$categories[$i]\">$categories[$i]</OPTION>\n";  
  }
  $output .= " </SELECT>\n";
  $output .= "</P>\n";

  $output .= "<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>\n";
  $output .= "</P>\n";

  $output .= "<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>\n";
  $output .= "</P>\n";

  $output .= "<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>\n";
  $output .= "</P>\n";
 
  $output .= "<P>\n";
  $output .= " <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Add story\">\n";
  $output .= "</P>\n";

  $output .= "</FORM>\n";

  print $output;
}

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

Dries's avatar
 
Dries committed
103
function story_edit($id) {
Dries's avatar
 
Dries committed
104
  global $allowed_html, $categories;
Dries's avatar
 
Dries committed
105 106 107 108

  $result = db_query("SELECT s.*, u.userid FROM stories s LEFT JOIN users u ON s.author = u.id WHERE s.id = $id");
  $story = db_fetch_object($result);

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

  $output .= "<P>\n";
  $output .= " <B>Author:</B><BR>\n";
  $output .= " ". format_username($story->userid) ."\n";
  $output .= "</P>\n";

  $output .= "<P>\n";
  $output .= " <B>Subject:</B><BR>\n";
Dries's avatar
 
Dries committed
118
  $output .= " <INPUT TYPE=\"text\" NAME=\"edit[subject]\" SIZE=\"50\" VALUE=\"". check_textfield($story->subject) ."\"><BR>\n";
Dries's avatar
 
Dries committed
119 120
  $output .= "</P>\n";

Dries's avatar
 
Dries committed
121 122 123
  $output .= "<P>\n";
  $output .= " <B>Category:</B><BR>\n";
  $output .= " <SELECT NAME=\"edit[category]\">\n";
Dries's avatar
 
Dries committed
124
  for ($i = 0; $i < sizeof($categories); $i++) {
Dries's avatar
 
Dries committed
125
    $output .= "  <OPTION VALUE=\"$categories[$i]\"". ($story->category == $categories[$i] ? " SELECTED" : "") .">$categories[$i]</OPTION>\n";
Dries's avatar
 
Dries committed
126 127 128 129 130
  }
  $output .= "</SELECT>\n";
  $output .= "</P>\n";

  $output .= "<P>\n";
Dries's avatar
 
Dries committed
131
  $output .= " <B>Abstract:</B><BR>\n";
Dries's avatar
 
Dries committed
132
  $output .= " <TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"10\" NAME=\"edit[abstract]\">". check_textarea($story->abstract) ."</TEXTAREA><BR>\n";
Dries's avatar
 
Dries committed
133
  $output .= " <SMALL><I>Allowed HTML tags: ". htmlspecialchars($allowed_html) .".</I></SMALL>\n";
Dries's avatar
 
Dries committed
134 135 136
  $output .= "</P>\n";

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

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

Dries's avatar
 
Dries committed
148 149 150 151 152 153 154
  $output .= "<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>\n";
Dries's avatar
 
Dries committed
155 156 157 158 159 160 161 162 163 164
  $output .= "</P>\n";

  $output .= "<P>\n";
  $output .= " <INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"Save story\">\n";
  $output .= "</P>\n";
  $output .= "</FORM>\n";
  
  print $output;
}

Dries's avatar
 
Dries committed
165 166 167
function story_edit_save($id, $edit) {
  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]) ."', category = '". check_input($edit[category]) ."', 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]) ."', category = '". check_input($edit[category]) ."', status = '$edit[status]' WHERE id = '$id'");
Dries's avatar
Dries committed
168
  watchdog("message", "story: modified `$edit[subject]'");
Dries's avatar
 
Dries committed
169 170
}

Dries's avatar
 
Dries committed
171
function story_display() {  
Dries's avatar
 
Dries committed
172
  $output .= "<TABLE BORDER=\"1\" CELLPADDING=\"2\" CELLSPACING=\"2\">\n";
Dries's avatar
 
Dries committed
173 174 175 176 177 178

  // 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)) {
    $output .= " <TR><TD><A HREF=\"discussion.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid, 1) ."</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
179 180
  }

Dries's avatar
 
Dries committed
181 182 183
  // 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
184
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
185
    $output .= " <TR><TD><A HREF=\"discussion.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid, 1) ."</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
186 187
  }

Dries's avatar
 
Dries committed
188 189 190 191 192 193 194 195 196 197 198 199 200 201
  // 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)) {
    $output .= " <TR><TD><A HREF=\"discussion.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid, 1) ."</TD><TD>$story->category</TD><TD ALIGN=\"center\"><A HREF=\"admin.php?mod=story&op=edit&id=$story->id\">edit</A></TD></TR>\n";
  }

  // 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)) {
    $output .= " <TR><TD><A HREF=\"discussion.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid, 1) ."</TD><TD>$story->category</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
202 203 204 205 206 207
  $output .= "</TABLE>\n";
 
  print $output;
}

function story_admin() {
Dries's avatar
 
Dries committed
208 209 210 211
  global $op, $id, $edit;

  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=help\">help</A></SMALL><HR>\n";

Dries's avatar
 
Dries committed
212
  switch ($op) {
Dries's avatar
 
Dries committed
213 214 215
    case "add":
      story_add();
      break;
Dries's avatar
 
Dries committed
216 217 218
    case "edit":
      story_edit($id);
      break;
Dries's avatar
 
Dries committed
219 220
    case "help":
      story_help();
Dries's avatar
 
Dries committed
221
      break;
Dries's avatar
 
Dries committed
222 223 224 225 226 227 228
    case "Add story":
      story_add_save($edit);
      story_display();
      break;
    case "Save story":
      story_edit_save($id, $edit);
      story_display();
Dries's avatar
 
Dries committed
229 230 231 232 233 234
      break;
    default:
      story_display();
  }
}

Dries's avatar
 
Dries committed
235
?>