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

Dries's avatar
   
Dries committed
3
$module = array("help" => "story_help",
Dries's avatar
   
Dries committed
4
                "find" => "story_find",
Dries's avatar
   
Dries committed
5
                "type" => "story_type",
Dries's avatar
   
Dries committed
6
7
                "user" => "story_user",
                "queue" => "story_queue",
Dries's avatar
   
Dries committed
8
9
                "admin" => "story_admin",
                "block" => "story_block");
Dries's avatar
   
Dries committed
10

Dries's avatar
   
Dries committed
11
12
include_once "includes/section.inc";

Dries's avatar
   
Dries committed
13
14
15
16
17
18
19
20
21
22
class Story {
  function Story($userid, $title, $abstract, $body, $section, $timestamp) {    $this->userid = $userid;
    $this->title = $title;
    $this->abstract = $abstract;
    $this->body = $body;
    $this->section = $section;
    $this->timestamp = $timestamp;
  }
}

Dries's avatar
   
Dries committed
23
function story_post_threshold($node, $default) {
Dries's avatar
   
Dries committed
24
  return section_post_threshold($node->section, $default);
Dries's avatar
   
Dries committed
25
26
27
}

function story_dump_threshold($node, $default) {
Dries's avatar
   
Dries committed
28
  return section_dump_threshold($node->section, $default);
Dries's avatar
   
Dries committed
29
30
31
}

function story_timout_threshold($node, $default) {
Dries's avatar
   
Dries committed
32
  return section_timout_threshold($node->section, $default);
Dries's avatar
   
Dries committed
33
34
}

Dries's avatar
   
Dries committed
35
36
37
38
function story_status() {
  return array(dumped, queued, posted);
}

Dries's avatar
   
Dries committed
39
function story_find($keys) {
Dries's avatar
   
Dries committed
40
  global $status, $user;
Dries's avatar
   
Dries committed
41
  $find = array();
Dries's avatar
   
Dries committed
42
  $result = db_query("SELECT n.*, s.* FROM story s LEFT JOIN node n ON n.nid = s.nid AND n.lid = s.lid WHERE n.status = '$status[posted]' AND (n.title LIKE '%$keys%' OR s.abstract LIKE '%$keys%' OR s.body LIKE '%$keys%') LIMIT 20");
Dries's avatar
   
Dries committed
43
  while ($story = db_fetch_object($result)) {
Dries's avatar
   
Dries committed
44
    array_push($find, array("title" => check_output($story->title), "link" => (user_access($user, "story") ? "admin.php?mod=story&op=edit&id=$story->nid" : "node.php?id=$story->nid"), "user" => $story->userid, "date" => $story->timestamp));
Dries's avatar
   
Dries committed
45
46
47
48
  }
  return $find;
}

Dries's avatar
   
Dries committed
49
50
function story_help() {
 ?>
Dries's avatar
   
Dries committed
51
52
53
  <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
54
 <?php
Dries's avatar
   
Dries committed
55
56
}

Dries's avatar
   
Dries committed
57
58
59
60
function story_type() {
  return array("story", t("story"));
}

Dries's avatar
   
Dries committed
61
function story_view($node, $page = 1) {
Dries's avatar
   
Dries committed
62
  global $id, $cid, $op, $moderate, $pid, $subject, $comment, $theme, $mode, $order, $threshold;
Dries's avatar
   
Dries committed
63

Dries's avatar
   
Dries committed
64
  if ($page == 1) {
Dries's avatar
   
Dries committed
65
66
67
    switch($op) {
      case t("Preview comment"):
        $theme->header();
Dries's avatar
   
Dries committed
68
        comment_preview(check_input($pid), check_input($id), $subject, $comment);
Dries's avatar
   
Dries committed
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
103
104
105
106
107
        $theme->footer();
        break;
      case t("Post comment"):
        comment_post(check_input($pid), check_input($id), check_input($subject), check_input($comment));
        $theme->header();
        $theme->story($node, "[ <A HREF=\"node.php?op=reply&id=$node->nid&pid=0\">". t("reply to this story") ."</A> ]");
        comment_render($id, $cid);
        $theme->footer();
        break;
      case "reply":
        $theme->header();
        comment_reply(check_input($pid), check_input($id));
        $theme->footer();
        break;
      case t("Update settings"):
        comment_settings(check_input($mode), check_input($order), check_input($threshold));
        $theme->header();
        $theme->story($node, "[ <A HREF=\"node.php?op=reply&id=$node->nid&pid=0\">". t("reply to this story") ."</A> ]");
        comment_render($id, $cid);
        $theme->footer();
        break;
      case t("Moderate comments"):
        comment_moderate($moderate);
        $theme->header();
        $theme->story($node, "[ <A HREF=\"node.php?op=reply&id=$node->nid&pid=0\">". t("reply to this story") ."</A> ]");
        comment_render($id, $cid);
        $theme->footer();
        break;
      case "reply":
        $theme->header();
        comment_reply(check_input($pid), check_input($id));
        $theme->footer();
        break;
      default:
        $theme->header();
        $theme->story($node, "[ <A HREF=\"node.php?op=reply&id=$node->nid&pid=0\">". t("reply to this story") ."</A> ]");
        comment_render($id, $cid);
        $theme->footer();
    }
Dries's avatar
   
Dries committed
108
  }
Dries's avatar
   
Dries committed
109
110
  else {
    $theme->story($node, "[ <A HREF=\"node.php?op=reply&id=$node->nid&pid=0\">". t("reply to this story") ."</A> ]");
Dries's avatar
   
Dries committed
111
  }
Dries's avatar
   
Dries committed
112
}
Dries's avatar
   
Dries committed
113

Dries's avatar
   
Dries committed
114
function story_form($edit = array()) {
Dries's avatar
   
Dries committed
115
  global $allowed_html, $REQUEST_URI, $user;
Dries's avatar
   
Dries committed
116

Dries's avatar
   
Dries committed
117
  $output .= "<FORM ACTION=\"$REQUEST_URI\" METHOD=\"post\">\n";
Dries's avatar
   
Dries committed
118

Dries's avatar
Dries committed
119
120
121
  $output .= "<B>". t("Your name") .":</B><BR>\n";
  $output .= "<INPUT TYPE=\"hidden\" NAME=\"edit[userid]\" VALUE=\"$edit[userid]\">\n";
  $output .= format_username(($edit[userid] ? $edit[userid] : $user->userid)) ."<P>";
Dries's avatar
   
Dries committed
122

Dries's avatar
Dries committed
123
124
  $output .= "<B>". t("Subject") .":</B><BR>\n";
  $output .= "<INPUT TYPE=\"text\" NAME=\"edit[title]\" SIZE=\"50\" MAXLENGTH=\"60\" VALUE=\"". check_textfield($edit[title]) ."\"><P>\n";
Dries's avatar
   
Dries committed
125

Dries's avatar
   
Dries committed
126
127
  $output .= "<B>". t("Section") .":</B><BR>\n";
  foreach ($sections = section_get() as $value) $options .= "  <OPTION VALUE=\"". check_select($value) ."\"". ($edit[section] == $value ? " SELECTED" : "") .">". check_output($value) ."</OPTION>\n";
Dries's avatar
   
Dries committed
128
129
  $output .= "<SELECT NAME=\"edit[section]\">$options</SELECT><P>\n";

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

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

Dries's avatar
Dries committed
138
139
140
141
  if (user_access($user, "story")) {
    $output .= "<INPUT TYPE=\"hidden\" NAME=\"edit[timestamp]\" VALUE=\"$edit[timestamp]\">\n";
    $output .= "<INPUT TYPE=\"hidden\" NAME=\"edit[nid]\" VALUE=\"$edit[nid]\">\n";
  }
Dries's avatar
   
Dries committed
142

Dries's avatar
   
Dries committed
143
  $duplicate = db_result(db_query("SELECT COUNT(nid) FROM node WHERE title = '$title'"));
Dries's avatar
   
Dries committed
144

Dries's avatar
   
Dries committed
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
  if (!$edit) {
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Preview") ."\">\n";
  }
  else if (!$edit[title]) {
    $output .= "<FONT COLOR=\"red\">". t("Warning: you did not supply a subject.") ."</FONT><P>\n";
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Preview") ."\">\n";
  }
  else if (!$edit[section]) {
    $output .= "<FONT COLOR=\"red\">". t("Warning: you did not supply a section.") ."</FONT><P>\n";
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Preview") ."\">\n";
  }
  else if (!$edit[abstract]) {
    $output .= "<FONT COLOR=\"red\">". t("Warning: you did not supply an abstract.") ."</FONT><P>\n";
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Preview") ."\">\n";
  }
  else if (!$edit[nid] && $duplicate) {
    $output .= "<FONT COLOR=\"red\">". t("Warning: there is already a story with that subject.") ."</FONT><P>\n";
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Preview") ."\">\n";
  }
  else {
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Preview") ."\">\n";
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Submit") ."\">\n";
  }
Dries's avatar
   
Dries committed
168
169
  $output .= "</FORM>\n";

Dries's avatar
   
Dries committed
170
  return $output;
Dries's avatar
   
Dries committed
171
172
}

Dries's avatar
   
Dries committed
173
function story_save($edit) {
Dries's avatar
   
Dries committed
174
  node_save(array_diff(array_merge($edit, array(nid => $edit[nid], type => "story")), array(userid => $edit[userid])));
Dries's avatar
   
Dries committed
175
176
}

Dries's avatar
   
Dries committed
177
178
179
180
181
function story_block() {
/*
  //
  // disabled for now
  //
Dries's avatar
   
Dries committed
182
  global $status;
Dries's avatar
   
Dries committed
183
  $result = db_query("SELECT s.lid, COUNT(c.cid) AS comments, s.title FROM story s LEFT JOIN comments c ON s.lid = c.lid WHERE s.status = '$status[posted]' AND c.link = 'story' GROUP BY s.lid ORDER BY comments DESC LIMIT 10");
Dries's avatar
   
Dries committed
184
185
186
  while ($story = db_fetch_object($result)) {
    $content .= "<LI><A HREF=\"node.php?id=$story->id\">". check_output($story->title) ."</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
  }
Dries's avatar
   
Dries committed
187

Dries's avatar
   
Dries committed
188
189
190
  $blocks[0][subject] = "Top 10:<BR>all stories";
  $blocks[0][content] = $content;
  $blocks[0][info] = "Top 10: all stories";
Dries's avatar
   
Dries committed
191

Dries's avatar
   
Dries committed
192
  unset($content);
Dries's avatar
   
Dries committed
193

Dries's avatar
   
Dries committed
194
  $result = db_query("SELECT s.lid, COUNT(c.cid) AS comments, s.title FROM story s LEFT JOIN comments c ON s.lid = c.lid WHERE s.status = '$status[posted]' AND c.link = 'story' AND ". time() ." - s.timestamp < 2419200 GROUP BY s.lid ORDER BY comments DESC LIMIT 10");
Dries's avatar
   
Dries committed
195
196
197
  while ($story = db_fetch_object($result)) {
    $content .= "<LI><A HREF=\"node.php?id=$story->id\">". check_output($story->title) ."</A><BR><SMALL>(". format_plural($story->comments, "comment", "comments") .")</SMALL></LI>\n";
  }
Dries's avatar
   
Dries committed
198

Dries's avatar
   
Dries committed
199
200
201
  $blocks[1][subject] = "Top 10:<BR>recent stories";
  $blocks[1][content] = $content;
  $blocks[1][info] = "Top 10: recent stories";
Dries's avatar
 
Dries committed
202

Dries's avatar
   
Dries committed
203
204
  return $blocks;
*/
Dries's avatar
 
Dries committed
205
206
}

Dries's avatar
   
Dries committed
207
208
function story_query($type = "") {
  global $status;
Dries's avatar
   
Dries committed
209
  $queries = array(array("recent stories", "WHERE n.type = 'story' ORDER BY n.timestamp DESC"), array("posted stories", "WHERE n.type = 'story' AND n.status = '$status[posted]' ORDER BY n.timestamp DESC"), array("queued stories", "WHERE n.type = 'story' AND n.status = '$status[queued]' ORDER BY n.timestamp DESC"), array("dumped stories", "WHERE n.type = 'story' AND n.status = '$status[dumped]' ORDER BY n.timestamp DESC"));
Dries's avatar
   
Dries committed
210
211
212
213
214
  return ($queries[$type] ? $queries[$type] : $queries);
}

function story_overview($query = array()) {
  return node_overview($query);
Dries's avatar
 
Dries committed
215
216
217
}

function story_admin() {
Dries's avatar
   
Dries committed
218
219
220
  global $id, $edit, $mod, $keys, $op, $theme, $type, $user;

  print "<SMALL><A HREF=\"admin.php?mod=story&op=add\">add new story</A> | <A HREF=\"admin.php?mod=story&op=listing\">story listing</A> | <A HREF=\"admin.php?mod=story&op=search\">search 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
221

Dries's avatar
   
Dries committed
222
  $type = ($type ? $type : 0);
Dries's avatar
   
Dries committed
223

Dries's avatar
 
Dries committed
224
  switch ($op) {
Dries's avatar
   
Dries committed
225
    case "add":
Dries's avatar
   
Dries committed
226
227
228
229
      print story_form();
      break;
    case "delete":
      print story_delete($id);
Dries's avatar
   
Dries committed
230
      print story_overview(story_query($type));
Dries's avatar
   
Dries committed
231
      break;
Dries's avatar
 
Dries committed
232
    case "edit":
Dries's avatar
   
Dries committed
233
      print story_form(node_get_array("nid", check_input($id)));
Dries's avatar
 
Dries committed
234
      break;
Dries's avatar
   
Dries committed
235
236
    case "help":
      story_help();
Dries's avatar
 
Dries committed
237
      break;
Dries's avatar
   
Dries committed
238
    case "listing":
Dries's avatar
   
Dries committed
239
      print node_listing(story_query());
Dries's avatar
   
Dries committed
240
      break;
Dries's avatar
   
Dries committed
241
    case "search":
Dries's avatar
   
Dries committed
242
243
      print search_form($keys);
      print search_data($keys, $mod);
Dries's avatar
   
Dries committed
244
      break;
Dries's avatar
   
Dries committed
245
    case t("Preview"):
Dries's avatar
   
Dries committed
246
      story_view(new Story(($edit[userid] ? $edit[userid] : $user->userid), $edit[title], $edit[abstract], $edit[body], $edit[section], ($edit[timestamp] ? $edit[timestamp] : time())), 0);
Dries's avatar
   
Dries committed
247
248
249
      print story_form($edit);
      break;
    case t("Submit"):
Dries's avatar
   
Dries committed
250
      story_save($edit);
Dries's avatar
   
Dries committed
251
      // fall through:
Dries's avatar
   
Dries committed
252
    default:
Dries's avatar
   
Dries committed
253
      print story_overview(story_query($type));
Dries's avatar
   
Dries committed
254
255
256
257
258
  }
}


function story_user() {
Dries's avatar
   
Dries committed
259
  global $edit, $op, $theme, $user;
Dries's avatar
   
Dries committed
260
261
262

  switch($op) {
    case t("Preview"):
Dries's avatar
   
Dries committed
263
      story_view(new Story($user->userid, $edit[title], $edit[abstract], $edit[body], $edit[section], ($edit[timestamp] ? $edit[timestamp] : time())), 0);
Dries's avatar
   
Dries committed
264
      $theme->box("Submit a story", story_form($edit));
Dries's avatar
   
Dries committed
265
      break;
Dries's avatar
   
Dries committed
266
    case t("Submit"):
Dries's avatar
   
Dries committed
267
      story_save($edit);
Dries's avatar
   
Dries committed
268
      $theme->box(t("Submit a story"), t("Thank you for your submission."));
Dries's avatar
 
Dries committed
269
270
      break;
    default:
Dries's avatar
   
Dries committed
271
      $theme->box("Submit a story", story_form());
Dries's avatar
 
Dries committed
272
273
274
  }
}

Dries's avatar
   
Dries committed
275
?>