story.module 12.3 KB
Newer Older
Dries's avatar
 
Dries committed
1
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
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
  $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";
  foreach ($sections = section_get() as $value) $options .= "  <OPTION VALUE=\"$value\">$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]\" 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
?>