OSDN Git Service

150b7319743cf8cd28415397c9442dd2c68a66f4
[nucleus-jp/nucleus-jp-ancient.git] / nucleus / libs / ITEM.php
1 <?php\r
2 \r
3 /*\r
4  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)\r
5  * Copyright (C) 2002-2012 The Nucleus Group\r
6  *\r
7  * This program is free software; you can redistribute it and/or\r
8  * modify it under the terms of the GNU General Public License\r
9  * as published by the Free Software Foundation; either version 2\r
10  * of the License, or (at your option) any later version.\r
11  * (see nucleus/documentation/index.html#license for more info)\r
12  */\r
13 /**\r
14  * A class representing an item\r
15  *\r
16  * @license http://nucleuscms.org/license.txt GNU General Public License\r
17  * @copyright Copyright (C) 2002-2012 The Nucleus Group\r
18  * @version $Id$\r
19  * $NucleusJP: ITEM.php,v 1.7.2.3 2008/02/07 06:13:30 kimitake Exp $\r
20  */\r
21 class ITEM {\r
22 \r
23         var $itemid;\r
24 \r
25         /**\r
26           * Constructor of an ITEM object\r
27           * \r
28           * @param integer $itemid id of the item\r
29           */\r
30         function ITEM($itemid) {\r
31                 $this->itemid = $itemid;\r
32         }\r
33 \r
34         /**\r
35           * Returns one item with the specific itemid\r
36           * \r
37           * @param integer $itemid id of the item\r
38           * @param boolean $allowdraft\r
39           * @param boolean $allowfuture\r
40           * @static\r
41           */\r
42         function getitem($itemid, $allowdraft, $allowfuture) {\r
43                 global $manager;\r
44 \r
45                 $itemid = intval($itemid);\r
46 \r
47                 $query =  'SELECT i.idraft as draft, i.inumber as itemid, i.iclosed as closed, '\r
48                            . ' i.ititle as title, i.ibody as body, m.mname as author, '\r
49                            . ' i.iauthor as authorid, i.itime, i.imore as more, i.ikarmapos as karmapos, '\r
50                            . ' i.ikarmaneg as karmaneg, i.icat as catid, i.iblog as blogid '\r
51                            . ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, ' . sql_table('blog') . ' as b '\r
52                            . ' WHERE i.inumber=' . $itemid\r
53                            . ' and i.iauthor=m.mnumber '\r
54                            . ' and i.iblog=b.bnumber';\r
55 \r
56                 if (!$allowdraft)\r
57                         $query .= ' and i.idraft=0';\r
58 \r
59                 if (!$allowfuture) {\r
60                         $blog =& $manager->getBlog(getBlogIDFromItemID($itemid));\r
61                         $query .= ' and i.itime <=' . mysqldate($blog->getCorrectTime());\r
62                 }\r
63 \r
64                 $query .= ' LIMIT 1';\r
65 \r
66                 $res = sql_query($query);\r
67 \r
68                 if (sql_num_rows($res) == 1)\r
69                 {\r
70                         $aItemInfo = sql_fetch_assoc($res);\r
71                         $aItemInfo['timestamp'] = strtotime($aItemInfo['itime']);\r
72                         return $aItemInfo;\r
73                 } else {\r
74                         return 0;\r
75                 }\r
76 \r
77         }\r
78 \r
79         /**\r
80          * Tries to create an item from the data in the current request (comes from\r
81          * bookmarklet or admin area\r
82          *\r
83          * Returns an array with status info:\r
84          * status = 'added', 'error', 'newcategory'\r
85          *\r
86          * @static\r
87          */\r
88         function createFromRequest() {\r
89                  global $member, $manager;\r
90 \r
91                  $i_author =            $member->getID();\r
92                  $i_body =                      postVar('body');\r
93                  $i_title =                     postVar('title');\r
94                  $i_more =                      postVar('more');\r
95                  $i_actiontype =        postVar('actiontype');\r
96                  $i_closed =            intPostVar('closed');\r
97                  $i_hour =                      intPostVar('hour');\r
98                  $i_minutes =           intPostVar('minutes');\r
99                  $i_month =             intPostVar('month');\r
100                  $i_day =                       intPostVar('day');\r
101                  $i_year =                      intPostVar('year');\r
102 \r
103                  $i_catid =             postVar('catid');\r
104 \r
105                  $i_draftid =           intPostVar('draftid');\r
106 \r
107                  if (!$member->canAddItem($i_catid))\r
108                         return array('status' => 'error', 'message' => _ERROR_DISALLOWED);\r
109 \r
110                  if (!$i_actiontype) $i_actiontype = 'addnow';\r
111 \r
112                  switch ($i_actiontype) {\r
113                         case 'adddraft':\r
114                                 $i_draft = 1;\r
115                                 break;\r
116                         case 'addfuture':\r
117                         case 'addnow':\r
118                         default:\r
119                                 $i_draft = 0;\r
120                  }\r
121 \r
122                  if (!trim($i_body))\r
123                         return array('status' => 'error', 'message' => _ERROR_NOEMPTYITEMS);\r
124 \r
125                 // create new category if needed\r
126                 if (strstr($i_catid,'newcat')) {\r
127                         // get blogid\r
128                         list($i_blogid) = sscanf($i_catid,"newcat-%d");\r
129 \r
130                         // create\r
131                         $blog =& $manager->getBlog($i_blogid);\r
132                         $i_catid = $blog->createNewCategory();\r
133 \r
134                         // show error when sth goes wrong\r
135                         if (!$i_catid)\r
136                                 return array('status' => 'error','message' => 'Could not create new category');\r
137                 } else {\r
138                         // force blogid (must be same as category id)\r
139                         $i_blogid = getBlogIDFromCatID($i_catid);\r
140                         $blog =& $manager->getBlog($i_blogid);\r
141                 }\r
142 \r
143                 if ($i_actiontype == 'addfuture') {\r
144                         $posttime = mktime($i_hour, $i_minutes, 0, $i_month, $i_day, $i_year);\r
145 \r
146                         // make sure the date is in the future, unless we allow past dates\r
147                         if ((!$blog->allowPastPosting()) && ($posttime < $blog->getCorrectTime()))\r
148                                 $posttime = $blog->getCorrectTime();\r
149                 } else {\r
150                         // time with offset, or 0 for drafts\r
151                         $posttime = $i_draft ? 0 : $blog->getCorrectTime();\r
152                 }\r
153 \r
154                 if ($posttime > $blog->getCorrectTime()) {\r
155                         $posted = 0;\r
156                         $blog->setFuturePost();\r
157                 }\r
158                 else {\r
159                         $posted = 1;\r
160                 }\r
161 \r
162                 $itemid = $blog->additem($i_catid, $i_title,$i_body,$i_more,$i_blogid,$i_author,$posttime,$i_closed,$i_draft,$posted);\r
163 \r
164                 //Setting the itemOptions\r
165                 $aOptions = requestArray('plugoption');\r
166                 NucleusPlugin::_applyPluginOptions($aOptions, $itemid);\r
167                 $param = array(\r
168                 'context'       => 'item',\r
169                 'itemid'        => $itemid,\r
170                 'item'          => array(\r
171                         'title'         => $i_title,\r
172                         'body'          => $i_body,\r
173                         'more'          => $i_more,\r
174                         'closed'        => $i_closed,\r
175                         'catid'         => $i_catid)\r
176                 );\r
177                 $manager->notify('PostPluginOptionsUpdate', $param);\r
178 \r
179                 if ($i_draftid > 0) {\r
180                         // delete permission is checked inside ITEM::delete()\r
181                         ITEM::delete($i_draftid);\r
182                 }\r
183 \r
184                 // success\r
185                 if ($i_catid != intRequestVar('catid'))\r
186                         return array('status' => 'newcategory', 'itemid' => $itemid, 'catid' => $i_catid);\r
187                 else\r
188                         return array('status' => 'added', 'itemid' => $itemid);\r
189         }\r
190 \r
191 \r
192         /**\r
193           * Updates an item\r
194           *\r
195           * @static\r
196           */\r
197         function update($itemid, $catid, $title, $body, $more, $closed, $wasdraft, $publish, $timestamp = 0) {\r
198                 global $manager;\r
199 \r
200                 $itemid = intval($itemid);\r
201 \r
202                 // make sure value is 1 or 0\r
203                 if ($closed != 1) $closed = 0;\r
204 \r
205                 // get destination blogid\r
206                 $new_blogid = getBlogIDFromCatID($catid);\r
207                 $old_blogid = getBlogIDFromItemID($itemid);\r
208 \r
209                 // move will be done on end of method\r
210                 if ($new_blogid != $old_blogid)\r
211                         $moveNeeded = 1;\r
212 \r
213                 // add <br /> before newlines\r
214                 $blog =& $manager->getBlog($new_blogid);\r
215                 if ($blog->convertBreaks()) {\r
216                         $body = addBreaks($body);\r
217                         $more = addBreaks($more);\r
218                 }\r
219 \r
220                 // call plugins\r
221                 $param = array(\r
222                 '       itemid'         =>  $itemid,\r
223                         'title'         => &$title,\r
224                         'body'          => &$body,\r
225                         'more'          => &$more,\r
226                         'blog'          => &$blog,\r
227                         'closed'        => &$closed,\r
228                         'catid'         => &$catid\r
229                 );\r
230                 $manager->notify('PreUpdateItem', $param);\r
231 \r
232                 // update item itsself\r
233                 $query =  'UPDATE '.sql_table('item')\r
234                            . ' SET'\r
235                            . " ibody='". sql_real_escape_string($body) ."',"\r
236                            . " ititle='" . sql_real_escape_string($title) . "',"\r
237                            . " imore='" . sql_real_escape_string($more) . "',"\r
238                            . " iclosed=" . intval($closed) . ","\r
239                            . " icat=" . intval($catid);\r
240 \r
241                 // if we received an updated timestamp in the past, but past posting is not allowed,\r
242                 // reject that date change (timestamp = 0 will make sure the current date is kept)\r
243                 if ( (!$blog->allowPastPosting()) && ($timestamp < $blog->getCorrectTime()))\r
244                                 $timestamp = 0;\r
245 \r
246                 if ($timestamp > $blog->getCorrectTime(time())) {\r
247                         $isFuture = 1;\r
248                         $query .= ', iposted=0';\r
249                 }\r
250                 else {\r
251                         $isFuture = 0;\r
252                         $query .= ', iposted=1';\r
253                 }\r
254 \r
255                 if ($wasdraft && $publish) {\r
256                         // set timestamp to current date only if it's not a future item\r
257                         // draft items have timestamp == 0\r
258                         // don't allow timestamps in the past (unless otherwise defined in blogsettings)\r
259                         $query .= ', idraft=0';\r
260 \r
261                         if ($timestamp == 0)\r
262                                 $timestamp = $blog->getCorrectTime();\r
263 \r
264                         // send new item notification\r
265                         if (!$isFuture && $blog->getNotifyAddress() && $blog->notifyOnNewItem())\r
266                                 $blog->sendNewItemNotification($itemid, $title, $body);\r
267                 }\r
268 \r
269                 // save back to drafts          \r
270                 if (!$wasdraft && !$publish) {\r
271                         $query .= ', idraft=1';\r
272                         // set timestamp back to zero for a draft\r
273                         $query .= ", itime=" . mysqldate($timestamp);\r
274                 }\r
275 \r
276                 // update timestamp when needed\r
277                 if ($timestamp != 0)\r
278                         $query .= ", itime=" . mysqldate($timestamp);\r
279 \r
280                 // make sure the correct item is updated\r
281                 $query .= ' WHERE inumber=' . $itemid;\r
282 \r
283                 // off we go!\r
284                 sql_query($query);\r
285 \r
286                 $param = array('itemid' => $itemid);\r
287                 $manager->notify('PostUpdateItem', $param);\r
288 \r
289                 // when needed, move item and comments to new blog\r
290                 if ($moveNeeded)\r
291                         ITEM::move($itemid, $catid);\r
292 \r
293                 //update the itemOptions\r
294                 $aOptions = requestArray('plugoption');\r
295                 NucleusPlugin::_applyPluginOptions($aOptions);\r
296                 $param = array(\r
297                         'context'       => 'item',\r
298                         'itemid'        => $itemid,\r
299                         'item'          => array(\r
300                                 'title'         => $title,\r
301                                 'body'          => $body,\r
302                                 'more'          => $more,\r
303                                 'closed'        => $closed,\r
304                                 'catid'         => $catid\r
305                         )\r
306                 );\r
307                 $manager->notify('PostPluginOptionsUpdate', $param);\r
308 \r
309         }\r
310 \r
311         /**\r
312          * Move an item to another blog (no checks)\r
313          *\r
314          * @static\r
315          */\r
316         function move($itemid, $new_catid) {\r
317                 global $manager;\r
318 \r
319                 $itemid = intval($itemid);\r
320                 $new_catid = intval($new_catid);\r
321 \r
322                 $new_blogid = getBlogIDFromCatID($new_catid);\r
323 \r
324                 $param = array(\r
325                         'itemid'                => $itemid,\r
326                         'destblogid'    => $new_blogid,\r
327                         'destcatid'             => $new_catid\r
328                 );\r
329                 $manager->notify('PreMoveItem', $param);\r
330 \r
331 \r
332                 // update item table\r
333                 $query = 'UPDATE '.sql_table('item')." SET iblog=$new_blogid, icat=$new_catid WHERE inumber=$itemid";\r
334                 sql_query($query);\r
335 \r
336                 // update comments\r
337                 $query = 'UPDATE '.sql_table('comment')." SET cblog=" . $new_blogid." WHERE citem=" . $itemid;\r
338                 sql_query($query);\r
339 \r
340                 $param = array(\r
341                         'itemid'                => $itemid,\r
342                         'destblogid'    => $new_blogid,\r
343                         'destcatid'             => $new_catid\r
344                 );\r
345                 $manager->notify('PostMoveItem', $param);\r
346         }\r
347 \r
348         /**\r
349           * Deletes an item\r
350           */\r
351         function delete($itemid) {\r
352                 global $manager, $member;\r
353 \r
354                 $itemid = intval($itemid);\r
355 \r
356                 // check to ensure only those allow to alter the item can\r
357                 // proceed\r
358                 if (!$member->canAlterItem($itemid)) {\r
359                         return 1;\r
360                 }\r
361 \r
362                 $param = array('itemid' => $itemid);\r
363                 $manager->notify('PreDeleteItem', $param);\r
364 \r
365                 // delete item\r
366                 $query = 'DELETE FROM '.sql_table('item').' WHERE inumber=' . $itemid;\r
367                 sql_query($query);\r
368 \r
369                 // delete the comments associated with the item\r
370                 $query = 'DELETE FROM '.sql_table('comment').' WHERE citem=' . $itemid;\r
371                 sql_query($query);\r
372 \r
373                 // delete all associated plugin options\r
374                 NucleusPlugin::_deleteOptionValues('item', $itemid);\r
375 \r
376                 $param = array('itemid' => $itemid);\r
377                 $manager->notify('PostDeleteItem', $param);\r
378 \r
379                 return 0;\r
380         }\r
381 \r
382         /**\r
383          * Returns true if there is an item with the given ID\r
384          *\r
385          * @static\r
386          */\r
387         function exists($id,$future,$draft) {\r
388                 global $manager;\r
389 \r
390                 $id = intval($id);\r
391 \r
392                 $r = 'select * FROM '.sql_table('item').' WHERE inumber='.$id;\r
393                 if (!$future) {\r
394                         $bid = getBlogIDFromItemID($id);\r
395                         if (!$bid) return 0;\r
396                         $b =& $manager->getBlog($bid);\r
397                         $r .= ' and itime<='.mysqldate($b->getCorrectTime());\r
398                 }\r
399                 if (!$draft) {\r
400                         $r .= ' and idraft=0';\r
401                 }\r
402                 $r = sql_query($r);\r
403 \r
404                 return (sql_num_rows($r) != 0);\r
405         }\r
406 \r
407         /**\r
408          * Tries to create an draft from the data in the current request (comes from\r
409          * bookmarklet or admin area\r
410          *\r
411          * Returns an array with status info:\r
412          * status = 'added', 'error', 'newcategory'\r
413          *\r
414          * @static\r
415          *\r
416          * Used by xmlHTTPRequest AutoDraft\r
417          */\r
418         function createDraftFromRequest() {\r
419                 global $member, $manager;\r
420 \r
421                 $i_author = $member->getID();\r
422                 $i_body = postVar('body');\r
423                 $i_title = postVar('title');\r
424                 $i_more = postVar('more');\r
425 \r
426                 if(strtoupper(_CHARSET) != 'UTF-8'){\r
427                         $i_body  = mb_convert_encoding($i_body, _CHARSET, "UTF-8");\r
428                         $i_title = mb_convert_encoding($i_title, _CHARSET, "UTF-8");\r
429                         $i_more  = mb_convert_encoding($i_more, _CHARSET, "UTF-8");\r
430                 }\r
431                 //$i_actiontype = postVar('actiontype');\r
432                 $i_closed = intPostVar('closed');\r
433                 //$i_hour = intPostVar('hour');\r
434                 //$i_minutes = intPostVar('minutes');\r
435                 //$i_month = intPostVar('month');\r
436                 //$i_day = intPostVar('day');\r
437                 //$i_year = intPostVar('year');\r
438                 $i_catid = postVar('catid');\r
439                 $i_draft = 1;\r
440                 $type = postVar('type');\r
441                 if ($type == 'edit') {\r
442                         $i_blogid = getBlogIDFromItemID(intPostVar('itemid'));\r
443                 }\r
444                 else {\r
445                         $i_blogid = intPostVar('blogid');\r
446                 }\r
447                 $i_draftid = intPostVar('draftid');\r
448 \r
449                 if (!$member->canAddItem($i_catid)) {\r
450                         return array('status' => 'error', 'message' => _ERROR_DISALLOWED);\r
451                 }\r
452 \r
453                 if (!trim($i_body)) {\r
454                         return array('status' => 'error', 'message' => _ERROR_NOEMPTYITEMS);\r
455                 }\r
456 \r
457                 // create new category if needed\r
458                 if (strstr($i_catid, 'newcat')) {\r
459                         // Set in default category\r
460                         $blog =& $manager->getBlog($i_blogid);\r
461                         $i_catid = $blog->getDefaultCategory();\r
462                 }\r
463                 else {\r
464                         // force blogid (must be same as category id)\r
465                         $i_blogid = getBlogIDFromCatID($i_catid);\r
466                         $blog =& $manager->getBlog($i_blogid);\r
467                 }\r
468 \r
469                 $posttime = 0;\r
470 \r
471                 if ($i_draftid > 0) {\r
472                         ITEM::update($i_draftid, $i_catid, $i_title, $i_body, $i_more, $i_closed, 1, 0, 0);\r
473                         $itemid = $i_draftid;\r
474                 }\r
475                 else {\r
476                         $itemid = $blog->additem($i_catid, $i_title, $i_body, $i_more, $i_blogid, $i_author, $posttime, $i_closed, $i_draft);\r
477                 }\r
478 \r
479                 /*\r
480                 // No plugin support in AutoSaveDraft yet\r
481                 //Setting the itemOptions\r
482                 $aOptions = requestArray('plugoption');\r
483                 NucleusPlugin::_applyPluginOptions($aOptions, $itemid);\r
484                 $param = array(\r
485                         'context'       => 'item',\r
486                         'itemid'        => $itemid,\r
487                         'item'          => array(\r
488                                 'title'         => $i_title,\r
489                                 'body'          => $i_body,\r
490                                 'more'          => $i_more,\r
491                                 'closed'        => $i_closed,\r
492                                 'catid'         => $i_catid\r
493                         )\r
494                 );\r
495                 $manager->notify('PostPluginOptionsUpdate', $param);\r
496                 */\r
497                 \r
498                 // success\r
499                 return array('status' => 'added', 'draftid' => $itemid);\r
500         }\r
501 \r
502 }\r
503 \r
504 ?>