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
include_once "includes/section.inc";

Dries's avatar
 
Dries committed
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
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
26
function story_block() {
Dries's avatar
 
Dries committed
27
  $result = db_query("SELECT s.id, COUNT(s.id) 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
28
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
29
    $content .= "<LI><A HREF=\"story.php?id=$story->id\">$story->subject</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
Dries's avatar
 
Dries committed
30 31 32 33 34 35
  }

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

Dries's avatar
 
Dries committed
36 37
  unset($content);

Dries's avatar
 
Dries committed
38
  $result = db_query("SELECT s.id, COUNT(s.id) 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
39
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
40
    $content .= "<LI><A HREF=\"story.php?id=$story->id\">$story->subject</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
Dries's avatar
 
Dries committed
41 42 43 44 45 46 47 48
  }

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

Dries's avatar
 
Dries committed
50
function story_add() {
Dries's avatar
 
Dries committed
51
  global $allowed_html;
Dries's avatar
 
Dries committed
52 53 54 55 56 57 58 59

  $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";

Dries's avatar
 
Dries committed
60 61 62 63
  $output .= "<P><B>Section:</B><BR>\n";
  $output .= " <SELECT NAME=\"edit[section]\">\n";  
  foreach ($sections = section_get() as $value) {
    $output .= "  <OPTION VALUE=\"$value\">$value</OPTION>\n";  
Dries's avatar
 
Dries committed
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
  }
  $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();
Dries's avatar
 
Dries committed
101
  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
102 103 104
  watchdog("story", "story: added '$edit[subject]'");
}

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

  $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
111
  $output .= "<FORM ACTION=\"admin.php?mod=story&id=$id\" METHOD=\"post\">\n";
Dries's avatar
 
Dries committed
112 113 114 115 116 117 118 119

  $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
120
  $output .= " <INPUT TYPE=\"text\" NAME=\"edit[subject]\" SIZE=\"50\" VALUE=\"". check_textfield($story->subject) ."\"><BR>\n";
Dries's avatar
 
Dries committed
121 122
  $output .= "</P>\n";

Dries's avatar
 
Dries committed
123
  $output .= "<P>\n";
Dries's avatar
 
Dries committed
124 125 126 127
  $output .= " <B>Section:</B><BR>\n";
  $output .= " <SELECT NAME=\"edit[section]\">\n";
  foreach ($sections = section_get() as $value) {
    $output .= "  <OPTION VALUE=\"$value\"". ($story->section == $value ? " SELECTED" : "") .">$value</OPTION>\n";
Dries's avatar
 
Dries committed
128 129 130 131 132
  }
  $output .= "</SELECT>\n";
  $output .= "</P>\n";

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

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

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

Dries's avatar
 
Dries committed
150 151 152 153 154 155 156
  $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
157 158 159 160 161 162 163 164 165 166
  $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
167
function story_edit_save($id, $edit) {
Dries's avatar
 
Dries committed
168 169
  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
170
  watchdog("message", "story: modified `$edit[subject]'");
Dries's avatar
 
Dries committed
171 172
}

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

  // 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
180
    $output .= " <TR><TD><A HREF=\"story.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
181 182
  }

Dries's avatar
 
Dries committed
183 184 185
  // 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
186
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
187
    $output .= " <TR><TD><A HREF=\"story.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
188 189
  }

Dries's avatar
 
Dries committed
190 191 192 193
  // 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
194
    $output .= " <TR><TD><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid, 1) ."</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
195 196 197 198 199 200
  }

  // 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
201
    $output .= " <TR><TD><A HREF=\"story.php?id=$story->id\">". check_output($story->subject) ."</A></TD><TD>". format_username($story->userid, 1) ."</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
202 203
  }
 
Dries's avatar
 
Dries committed
204 205 206 207 208 209
  $output .= "</TABLE>\n";
 
  print $output;
}

function story_admin() {
Dries's avatar
 
Dries committed
210 211 212 213
  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
214
  switch ($op) {
Dries's avatar
 
Dries committed
215 216 217
    case "add":
      story_add();
      break;
Dries's avatar
 
Dries committed
218 219 220
    case "edit":
      story_edit($id);
      break;
Dries's avatar
 
Dries committed
221 222
    case "help":
      story_help();
Dries's avatar
 
Dries committed
223
      break;
Dries's avatar
 
Dries committed
224 225 226 227 228 229 230
    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
231 232 233 234 235 236
      break;
    default:
      story_display();
  }
}

Dries's avatar
 
Dries committed
237
?>