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
?>