story.module 10.2 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
class Story {
Dries's avatar
 
Dries committed
12 13
  function Story($story) {
    global $user;
Dries's avatar
 
Dries committed
14 15 16 17 18
    $this->userid = $story[userid] ? $story[userid] : $user->userid;
    $this->title = $story[title];
    $this->abstract = $story[abstract];
    $this->body = $story[body];
    $this->timestamp = $story[timestamp] ? $story[timestamp] : time();
Dries's avatar
 
Dries committed
19 20
    $this->cid = $story[cid];
    $this->tid = $story[tid];
Dries's avatar
 
Dries committed
21 22 23
  }
}

Dries's avatar
 
Dries committed
24 25 26 27
function story_status() {
  return array(dumped, queued, posted);
}

Dries's avatar
 
Dries committed
28
function story_find($keys) {
Dries's avatar
 
Dries committed
29
  global $status, $user;
Dries's avatar
 
Dries committed
30
  $find = array();
Dries's avatar
 
Dries committed
31
  $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
32
  while ($story = db_fetch_object($result)) {
Dries's avatar
 
Dries committed
33
    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
34 35 36 37
  }
  return $find;
}

Dries's avatar
 
Dries committed
38 39
function story_help() {
 ?>
Dries's avatar
 
Dries committed
40 41 42
  <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
43
 <?php
Dries's avatar
 
Dries committed
44 45
}

Dries's avatar
 
Dries committed
46 47 48 49
function story_type() {
  return array("story", t("story"));
}

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

Dries's avatar
 
Dries committed
53
  if ($page == 1) {
Dries's avatar
 
Dries committed
54 55 56
    switch($op) {
      case t("Preview comment"):
        $theme->header();
Dries's avatar
 
Dries committed
57
        comment_preview(check_input($pid), check_input($id), $subject, $comment);
Dries's avatar
 
Dries committed
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
        $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
97
  }
Dries's avatar
 
Dries committed
98
  else {
Dries's avatar
 
Dries committed
99
    $theme->story($node, ($PHP_SELF == "/node.php" ? "[ <A HREF=\"node.php?op=reply&id=$node->nid&pid=0\">". t("reply to this story") ."</A> ]" : 0));
Dries's avatar
 
Dries committed
100
  }
Dries's avatar
 
Dries committed
101
}
Dries's avatar
 
Dries committed
102

Dries's avatar
 
Dries committed
103
function story_form($edit = array()) {
Dries's avatar
 
Dries committed
104
  global $allowed_html, $REQUEST_URI, $user;
Dries's avatar
 
Dries committed
105

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

Dries's avatar
Dries committed
108
  $output .= "<B>". t("Your name") .":</B><BR>\n";
Dries's avatar
 
Dries committed
109 110
  $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
111

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

Dries's avatar
 
Dries committed
115
  $output .= structure_form("story", $edit);
Dries's avatar
 
Dries committed
116

Dries's avatar
 
Dries committed
117
  $output .= "<B>". t("Abstract") .":</B><BR>\n";
Dries's avatar
 
Dries committed
118
  $output .= "<TEXTAREA WRAP=\"virtual\" COLS=\"50\" ROWS=\"10\" NAME=\"edit[abstract]\">". check_textarea($edit[abstract]) ."</TEXTAREA><BR>\n";
Dries's avatar
 
Dries committed
119 120 121
  $output .= "<SMALL><I>". t("Allowed HTML tags") .": ". htmlspecialchars($allowed_html) .".</I></SMALL><P>\n";

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

Dries's avatar
Dries committed
125
  if (user_access($user, "story")) {
Dries's avatar
 
Dries committed
126 127
    $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
128
  }
Dries's avatar
 
Dries committed
129

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

Dries's avatar
 
Dries committed
132
  if (!$edit) {
Dries's avatar
 
Dries committed
133 134
    $output .= "<INPUT TYPE=\"submit\" NAME=\"op\" VALUE=\"". t("Preview") ."\">\n";
  }
Dries's avatar
 
Dries committed
135
  else if (!$edit[title]) {
Dries's avatar
 
Dries committed
136 137 138
    $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";
  }
Dries's avatar
 
Dries committed
139
  else if (!$edit[abstract]) {
Dries's avatar
 
Dries committed
140 141 142
    $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";
  }
Dries's avatar
 
Dries committed
143
  else if (!$edit[nid] && $duplicate) {
Dries's avatar
 
Dries committed
144 145 146 147 148 149 150
    $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
151 152
  $output .= "</FORM>\n";

Dries's avatar
 
Dries committed
153
  return $output;
Dries's avatar
 
Dries committed
154 155
}

Dries's avatar
 
Dries committed
156 157
function story_save($edit) {
  node_save(array_diff(array_merge($edit, array(nid => $edit[nid], type => "story")), array(userid => $edit[userid])));
Dries's avatar
 
Dries committed
158 159
}

Dries's avatar
 
Dries committed
160 161 162 163 164
function story_block() {
/*
  //
  // disabled for now
  //
Dries's avatar
 
Dries committed
165
  global $status;
Dries's avatar
 
Dries committed
166
  $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
167 168 169
  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
170

Dries's avatar
 
Dries committed
171 172 173
  $blocks[0][subject] = "Top 10:<BR>all stories";
  $blocks[0][content] = $content;
  $blocks[0][info] = "Top 10: all stories";
Dries's avatar
 
Dries committed
174

Dries's avatar
 
Dries committed
175
  unset($content);
Dries's avatar
 
Dries committed
176

Dries's avatar
 
Dries committed
177
  $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
178 179 180
  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
181

Dries's avatar
 
Dries committed
182 183 184
  $blocks[1][subject] = "Top 10:<BR>recent stories";
  $blocks[1][content] = $content;
  $blocks[1][info] = "Top 10: recent stories";
Dries's avatar
 
Dries committed
185

Dries's avatar
 
Dries committed
186 187
  return $blocks;
*/
Dries's avatar
 
Dries committed
188 189
}

Dries's avatar
 
Dries committed
190 191
function story_query($type = "") {
  global $status;
Dries's avatar
 
Dries committed
192
  $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"), array("stories without category (integrity)", "WHERE n.type = 'story' AND n.cid = '0' ORDER BY n.timestamp DESC"), array("stories without topic (integrity)", "WHERE n.type = 'story' AND n.tid = '0' ORDER BY n.timestamp DESC"));
Dries's avatar
 
Dries committed
193 194 195 196 197
  return ($queries[$type] ? $queries[$type] : $queries);
}

function story_overview($query = array()) {
  return node_overview($query);
Dries's avatar
 
Dries committed
198 199 200
}

function story_admin() {
Dries's avatar
 
Dries committed
201
  global $id, $edit, $mod, $keys, $op, $theme, $type, $user;
Dries's avatar
 
Dries committed
202 203

  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
204

Dries's avatar
 
Dries committed
205
  $type = ($type ? $type : 0);
Dries's avatar
 
Dries committed
206

Dries's avatar
 
Dries committed
207
  switch ($op) {
Dries's avatar
 
Dries committed
208
    case "add":
Dries's avatar
 
Dries committed
209 210 211 212
      print story_form();
      break;
    case "delete":
      print story_delete($id);
Dries's avatar
 
Dries committed
213
      print story_overview(story_query($type));
Dries's avatar
 
Dries committed
214
      break;
Dries's avatar
 
Dries committed
215
    case "edit":
Dries's avatar
 
Dries committed
216
      print story_form(node_get_array("nid", check_input($id)));
Dries's avatar
 
Dries committed
217
      break;
Dries's avatar
 
Dries committed
218 219
    case "help":
      story_help();
Dries's avatar
 
Dries committed
220
      break;
Dries's avatar
 
Dries committed
221
    case "listing":
Dries's avatar
 
Dries committed
222
      print node_listing(story_query());
Dries's avatar
 
Dries committed
223
      break;
Dries's avatar
 
Dries committed
224
    case "search":
Dries's avatar
 
Dries committed
225 226
      print search_form($keys);
      print search_data($keys, $mod);
Dries's avatar
 
Dries committed
227
      break;
Dries's avatar
 
Dries committed
228
    case t("Preview"):
Dries's avatar
 
Dries committed
229 230
      story_view(new Story($edit),0);
      print story_form($edit);
Dries's avatar
 
Dries committed
231 232
      break;
    case t("Submit"):
Dries's avatar
 
Dries committed
233
      story_save($edit);
Dries's avatar
 
Dries committed
234
      // fall through:
Dries's avatar
 
Dries committed
235
    default:
Dries's avatar
 
Dries committed
236
      print story_overview(story_query($type));
Dries's avatar
 
Dries committed
237 238 239 240 241
  }
}


function story_user() {
Dries's avatar
 
Dries committed
242
  global $edit, $op, $theme, $user;
Dries's avatar
 
Dries committed
243 244 245

  switch($op) {
    case t("Preview"):
Dries's avatar
 
Dries committed
246 247
      story_view(new Story($edit), 0);
      $theme->box(t("Submit"), story_form($edit));
Dries's avatar
 
Dries committed
248
      break;
Dries's avatar
 
Dries committed
249
    case t("Submit"):
Dries's avatar
 
Dries committed
250
      story_save($edit);
Dries's avatar
 
Dries committed
251
      $theme->box(t("Submit"), t("Thank you for your submission."));
Dries's avatar
 
Dries committed
252 253
      break;
    default:
Dries's avatar
 
Dries committed
254
      $theme->box(t("Submit"), story_form());
Dries's avatar
 
Dries committed
255 256 257
  }
}

Dries's avatar
 
Dries committed
258
?>