OSDN Git Service

f813ebadf3214670bf81a88a6008195e9e44ba2b
[nucleus-jp/nucleus-next.git] / nucleus / libs / BLOG.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 a blog and containing functions to get that blog shown\r
15  * on the screen\r
16  *\r
17  * @license http://nucleuscms.org/license.txt GNU General Public License\r
18  * @copyright Copyright (C) 2002-2009 The Nucleus Group\r
19  * @version $Id: BLOG.php 1624 2012-01-09 11:36:20Z sakamocchi $\r
20  */\r
21 \r
22 if ( !function_exists('requestVar') ) exit;\r
23 require_once dirname(__FILE__) . '/ITEMACTIONS.php';\r
24 \r
25 class Blog\r
26 {\r
27         // blog id\r
28         var $blogid;\r
29 \r
30         // ID of currently selected category\r
31         var $selectedcatid;\r
32 \r
33         // After creating an object of the blog class, contains true if the BLOG object is\r
34         // valid (the blog exists)\r
35         var $isValid;\r
36 \r
37         // associative array, containing all blogsettings (use the get/set functions instead)\r
38         var $settings;\r
39 \r
40         /**\r
41          * Creates a new BLOG object for the given blog\r
42          *\r
43          * @param $id blogid\r
44          */\r
45         function BLOG($id) {\r
46                 $this->blogid = intval($id);\r
47                 $this->readSettings();\r
48 \r
49                 // try to set catid\r
50                 // (the parse functions in SKIN.php will override this, so it's mainly useless)\r
51                 global $catid;\r
52                 $this->setSelectedCategory($catid);\r
53         }\r
54 \r
55         /**\r
56          * Shows the given amount of items for this blog\r
57          *\r
58          * @param $template\r
59          *              String representing the template _NAME_ (!)\r
60          * @param $amountEntries\r
61          *              amount of entries to show\r
62          * @param $startpos\r
63          *              offset from where items should be shown (e.g. 5 = start at fifth item)\r
64          * @returns int\r
65          *              amount of items shown\r
66          */\r
67         function readLog($template, $amountEntries, $offset = 0, $startpos = 0) {\r
68                 return $this->readLogAmount($template,$amountEntries,'','',1,1,$offset, $startpos);\r
69         }\r
70 \r
71         /**\r
72          * Blog::showArchive()\r
73          * Shows an archive for a given month\r
74          *\r
75          * @param integer       $year           year\r
76          * @param integer       $month          month\r
77          * @param string        $template       String representing the template name to be used\r
78          * @return void\r
79          * \r
80          */\r
81         function showArchive($templatename, $year, $month=0, $day=0)\r
82         {\r
83                 // create extra where clause for select query\r
84                 if ( $day == 0 && $month != 0 )\r
85                 {\r
86                         $timestamp_start = mktime(0,0,0,$month,1,$year);\r
87                         // also works when $month==12\r
88                         $timestamp_end = mktime(0,0,0,$month+1,1,$year);\r
89                 }\r
90                 elseif ( $month == 0 )\r
91                 {\r
92                         $timestamp_start = mktime(0,0,0,1,1,$year);\r
93                         // also works when $month==12\r
94                         $timestamp_end = mktime(0,0,0,12,31,$year);\r
95                 }\r
96                 else\r
97                 {\r
98                         $timestamp_start = mktime(0,0,0,$month,$day,$year);\r
99                         $timestamp_end = mktime(0,0,0,$month,$day+1,$year);\r
100                 }\r
101                 $extra_query = " and i.itime>=%s and i.itime<%s";\r
102                 $extra_query = sprintf($extra_query, DB::formatDateTime($timestamp_start), DB::formatDateTime($timestamp_end));\r
103                 \r
104                 $this->readLogAmount($templatename,0,$extra_query,'',1,1);\r
105                 return;\r
106         }\r
107 \r
108         /**\r
109          * Sets the selected category by id (only when category exists)\r
110          */\r
111         function setSelectedCategory($catid) {\r
112                 if ($this->isValidCategory($catid) || (intval($catid) == 0))\r
113                         $this->selectedcatid = intval($catid);\r
114         }\r
115 \r
116         /**\r
117          * Sets the selected category by name\r
118          */\r
119         function setSelectedCategoryByName($catname) {\r
120                 $this->setSelectedCategory($this->getCategoryIdFromName($catname));\r
121         }\r
122 \r
123         /**\r
124          * Returns the selected category\r
125          */\r
126         function getSelectedCategory() {\r
127                 return $this->selectedcatid;\r
128         }\r
129 \r
130         /**\r
131          * Shows the given amount of items for this blog\r
132          *\r
133          * @param $template\r
134          *              String representing the template _NAME_ (!)\r
135          * @param $amountEntries\r
136          *              amount of entries to show (0 = no limit)\r
137          * @param $extraQuery\r
138          *              extra conditions to be added to the query\r
139          * @param $highlight\r
140          *              contains a query that should be highlighted\r
141          * @param $comments\r
142          *              1=show comments 0=don't show comments\r
143          * @param $dateheads\r
144          *              1=show dateheads 0=don't show dateheads\r
145          * @param $offset\r
146          *              offset\r
147          * @returns int\r
148          *              amount of items shown\r
149          */\r
150         function readLogAmount($template, $amountEntries, $extraQuery, $highlight, $comments, $dateheads, $offset = 0, $startpos = 0) {\r
151 \r
152                 $query = $this->getSqlBlog($extraQuery);\r
153 \r
154                 if ($amountEntries > 0) {\r
155                                 // $offset zou moeten worden:\r
156                                 // (($startpos / $amountentries) + 1) * $offset ... later testen ...\r
157                            $query .= ' LIMIT ' . intval($startpos + $offset).',' . intval($amountEntries);\r
158                 }\r
159                 return $this->showUsingQuery($template, $query, $highlight, $comments, $dateheads);\r
160         }\r
161 \r
162         /**\r
163          * Blog::showUsingQuery()\r
164          * Do the job for readLogAmmount\r
165          * \r
166          * @param       string          $templateName   template name\r
167          * @param       string          $query                  string for query\r
168          * @param       string          $highlight              string to be highlighted\r
169          * @param       integer $comments               the number of comments\r
170          * @param       boolean $dateheads              date header is needed or not\r
171          * @return      integer the number of rows as a result of mysql query\r
172          * \r
173          */     \r
174         function showUsingQuery($templateName, $query, $highlight = '', $comments = 0, $dateheads = 1)\r
175         {\r
176                 global $CONF, $manager, $currentTemplateName;\r
177                 \r
178                 $lastVisit = cookieVar($CONF['CookiePrefix'] .'lastVisit');\r
179                 if ( $lastVisit != 0 )\r
180                 {\r
181                         $lastVisit = $this->getCorrectTime($lastVisit);\r
182                 }\r
183                 \r
184                 // set templatename as global variable (so plugins can access it)\r
185                 $currentTemplateName = $templateName;\r
186                 $template =& $manager->getTemplate($templateName);\r
187                 \r
188                 // create parser object & action handler\r
189                 $handler = new ItemActions($this);\r
190                 $handler->setTemplate($template);\r
191                 $handler->setHighlight($highlight);\r
192                 $handler->setLastVisit($lastVisit);\r
193                 $handler->setShowComments($comments);\r
194                 \r
195                 $parser = new Parser($handler);\r
196                 \r
197                 // execute query\r
198                 $items = DB::getResult($query);\r
199                 \r
200                 // loop over all items\r
201                 $old_date = 0;\r
202                 foreach ( $items as $item )\r
203                 {\r
204                         $item['timestamp'] = strtotime($item['itime']); // string timestamp -> unix timestamp\r
205                         \r
206                         // action handler needs to know the item we're handling\r
207                         $handler->setCurrentItem($item);\r
208                         \r
209                         // add date header if needed\r
210                         if ( $dateheads )\r
211                         {\r
212                                 $new_date = date('dFY', $item['timestamp']);\r
213                                 if ( $new_date != $old_date )\r
214                                 {\r
215                                         // unless this is the first time, write date footer\r
216                                         $timestamp = $item['timestamp'];\r
217                                         if ( $old_date != 0 )\r
218                                         {\r
219                                                 $oldTS = strtotime($old_date);\r
220                                                 $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => $oldTS));\r
221                                                 \r
222                                                 if ( in_array('DATE_FOOTER', $template) && !empty($template['DATE_FOOTER']) )\r
223                                                 {\r
224                                                         $tmp_footer = i18n::formatted_datetime($template['DATE_FOOTER'], $oldTS);\r
225                                                 }\r
226                                                 else\r
227                                                 {\r
228                                                         $tmp_footer = '';\r
229                                                 }\r
230                                                 $parser->parse($tmp_footer);\r
231                                                 $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => $oldTS));\r
232                                         }\r
233                                         \r
234                                         $manager->notify('PreDateHead',array('blog' => &$this, 'timestamp' => $timestamp));\r
235                                         \r
236                                         // note, to use templatvars in the dateheader, the %-characters need to be doubled in\r
237                                         // order to be preserved by strftime\r
238                                         if ( in_array('DATE_HEADER', $template) && !empty($template['DATE_HEADER']) )\r
239                                         {\r
240                                                 $tmp_header = i18n::formatted_datetime($template['DATE_HEADER'], $timestamp);\r
241                                         }\r
242                                         else\r
243                                         {\r
244                                                 $tmp_header = '';\r
245                                         }\r
246                                         $parser->parse($tmp_header);\r
247                                         $manager->notify('PostDateHead',array('blog' => &$this, 'timestamp' => $timestamp));\r
248                                 }\r
249                                 $old_date = $new_date;\r
250                         }\r
251                         \r
252                         // parse item\r
253                         $parser->parse($template['ITEM_HEADER']);\r
254                         $manager->notify('PreItem', array('blog' => &$this, 'item' => &$item));\r
255                         $parser->parse($template['ITEM']);\r
256                         $manager->notify('PostItem', array('blog' => &$this, 'item' => &$item));\r
257                         $parser->parse($template['ITEM_FOOTER']);\r
258                 }\r
259                 \r
260                 $numrows = $items->rowCount();\r
261                 \r
262                 // add another date footer if there was at least one item\r
263                 if ( ($numrows > 0) && $dateheads )\r
264                 {\r
265                         $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));\r
266                         $parser->parse($template['DATE_FOOTER']);\r
267                         $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));\r
268                 }\r
269                 \r
270                 $items->closeCursor();\r
271                 return $numrows;\r
272         }\r
273         \r
274         /**\r
275          * Simplified function for showing only one item\r
276          */\r
277         function showOneitem($itemid, $template, $highlight) {\r
278                 $extraQuery = ' and inumber=' . intval($itemid);\r
279 \r
280                 return $this->readLogAmount($template, 1, $extraQuery, $highlight, 0, 0);\r
281         }\r
282 \r
283 \r
284         /**\r
285          * Blog::addItem()\r
286          * Adds an item to this blog\r
287          * \r
288          * @param       Integer $catid  ID for category\r
289          * @param       String  $title  ID for \r
290          * @param       String  $body   text for body\r
291          * @param       String  $more   text for more\r
292          * @param       Integer $blogid ID for blog\r
293          * @param       Integer $authorid       ID for author\r
294          * @param       Timestamp       $timestamp      UNIX timestamp for post\r
295          * @param       Boolean $closed opened or closed\r
296          * @param       Boolean $draft  draft or not\r
297          * @param       Boolean $posted posted or not\r
298          * @return\r
299          */\r
300         function additem($catid, $title, $body, $more, $blogid, $authorid, $timestamp, $closed, $draft, $posted='1')\r
301         {\r
302                 global $manager;\r
303                 \r
304                 $blogid         = intval($blogid);\r
305                 $authorid       = intval($authorid);\r
306                 $title          = $title;\r
307                 $body           = $body;\r
308                 $more           = $more;\r
309                 $catid          = intval($catid);\r
310                 \r
311                 // convert newlines to <br />\r
312                 if ( $this->convertBreaks() )\r
313                 {\r
314                         $body = addBreaks($body);\r
315                         $more = addBreaks($more);\r
316                 }\r
317 \r
318                 if ( $closed != '1' )\r
319                 {\r
320                         $closed = '0';\r
321                 }\r
322                 if ( $draft != '0' )\r
323                 {\r
324                         $draft = '1';\r
325                 }\r
326                 \r
327                 if ( !$this->isValidCategory($catid) )\r
328                 {\r
329                         $catid = $this->getDefaultCategory();\r
330                 }\r
331                 \r
332                 $isFuture = 0;\r
333                 if ( $timestamp > $this->getCorrectTime() )\r
334                 {\r
335                         $isFuture = 1;\r
336                 }\r
337                 \r
338                 $timestamp = date('Y-m-d H:i:s',$timestamp);\r
339                 \r
340                 $manager->notify('PreAddItem',array('title' => &$title, 'body' => &$body, 'more' => &$more, 'blog' => &$this, 'authorid' => &$authorid, 'timestamp' => &$timestamp, 'closed' => &$closed, 'draft' => &$draft, 'catid' => &$catid));\r
341                 \r
342                 $ititle = DB::quoteValue($title);\r
343                 $ibody = DB::quoteValue($body);\r
344                 $imore = DB::quoteValue($more);\r
345                 \r
346                 $query = "INSERT INTO %s (ITITLE, IBODY, IMORE, IBLOG, IAUTHOR, ITIME, ICLOSED, IDRAFT, ICAT, IPOSTED) VALUES (%s, %s, %s, %d, %d, '%s', %s, %s, %s, %s)";\r
347                 $query = sprintf($query, sql_table('item'), $ititle, $ibody, $imore, $blogid, $authorid, $timestamp, $closed, $draft, $catid, $posted);\r
348                 DB::execute($query);\r
349                 $itemid = DB::getInsertId();\r
350                 \r
351                 $manager->notify('PostAddItem',array('itemid' => $itemid));\r
352                 \r
353                 if ( !$draft )\r
354                 {\r
355                         $this->updateUpdateFile();\r
356                 }\r
357                 // send notification mail\r
358                 if ( !$draft && !$isFuture && $this->getNotifyAddress() && $this->notifyOnNewItem() )\r
359                 {\r
360                         $this->sendNewItemNotification($itemid, $title, $body);\r
361                 }\r
362                 return $itemid;\r
363         }\r
364         \r
365         /**\r
366          * Blog::sendNewItemNotification()\r
367          * Send a new item notification to the notification list\r
368          * \r
369          * @param String        $itemid ID of the item\r
370          * @param String        $title  title of the item\r
371          * @param String        $body   body of the item\r
372          * @return      Void\r
373          */\r
374         function sendNewItemNotification($itemid, $title, $body)\r
375         {\r
376                 global $CONF, $member;\r
377                 \r
378                 $ascii = Entity::anchor_footnoting($body);\r
379                 \r
380                 $message = _NOTIFY_NI_MSG . " \n";\r
381                 $temp = parse_url($CONF['Self']);\r
382                 if ( $temp['scheme'] )\r
383                 {\r
384                         $message .= Link::create_item_link($itemid) . "\n\n";\r
385                 }\r
386                 else\r
387                 {\r
388                         $tempurl = $this->getURL();\r
389                         if ( i18n::substr($tempurl, -1) == '/' || i18n::substr($tempurl, -4) == '.php' )\r
390                         {\r
391                                 $message .= $tempurl . '?itemid=' . $itemid . "\n\n";\r
392                         }\r
393                         else\r
394                         {\r
395                                 $message .= $tempurl . '/?itemid=' . $itemid . "\n\n";\r
396                         }\r
397                 }\r
398                 $message .= _NOTIFY_TITLE . ' ' . strip_tags($title) . "\n";\r
399                 $message .= _NOTIFY_CONTENTS . "\n " . $ascii . "\n";\r
400                 $message .= NOTIFICATION::get_mail_footer();\r
401                 \r
402                 $subject = $this->getName() . ': ' . _NOTIFY_NI_TITLE;\r
403                 \r
404                 $from = $member->getNotifyFromMailAddress();\r
405                 \r
406                 NOTIFICATION::mail($this->getNotifyAddress(), $subject, $message, $from, i18n::get_current_charset());\r
407                 return;\r
408         }\r
409         \r
410         /**\r
411          * Blog::createNewCategory()\r
412          * Creates a new category for this blog\r
413          *\r
414          * @param String        $catName        name of the new category. When empty, a name is generated automatically (starting with newcat)\r
415          * @param String        $catDescription description of the new category. Defaults to 'New Category'\r
416          * @returns     Integer the new category-id in case of success. 0 on failure\r
417          */\r
418         function createNewCategory($catName = '', $catDescription = _CREATED_NEW_CATEGORY_DESC)\r
419         {\r
420                 global $member, $manager;\r
421                 \r
422                 if ( $member->blogAdminRights($this->getID()) )\r
423                 {\r
424                         // generate\r
425                         if ( $catName == '' )\r
426                         {\r
427                                 $catName = _CREATED_NEW_CATEGORY_NAME;\r
428                                 $i = 1;\r
429                                 \r
430                                 $res = DB::getResult('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID());\r
431                                 while ( $res->rowCount() > 0 )\r
432                                 {\r
433                                         $i++;\r
434                                         $res = DB::getResult('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID());\r
435                                 }\r
436                                 \r
437                                 $catName = $catName . $i;\r
438                         }\r
439                         \r
440                         $manager->notify(\r
441                                 'PreAddCategory',\r
442                                 array(\r
443                                         'blog' => &$this,\r
444                                         'name' => &$catName,\r
445                                         'description' => $catDescription\r
446                                 )\r
447                         );\r
448                         \r
449                         $query = "INSERT INTO %s (cblog, cname, cdesc) VALUES (%d, %s, %s)";\r
450                         $query = sprintf($query, sql_table('category'), (integer) $this->getID(), DB::quoteValue($catName), DB::quoteValue($catDescription));\r
451                         DB::execute($query);\r
452                         $catid = DB::getInsertId();\r
453                         \r
454                         $manager->notify(\r
455                                 'PostAddCategory',\r
456                                 array(\r
457                                         'blog' => &$this,\r
458                                         'name' => $catName,\r
459                                         'description' => $catDescription,\r
460                                         'catid' => $catid\r
461                                 )\r
462                         );\r
463                         \r
464                         return $catid;\r
465                 }\r
466                 return 0;\r
467         }\r
468         \r
469         /**\r
470          * Searches all months of this blog for the given query\r
471          *\r
472          * @param $query\r
473          *              search query\r
474          * @param $template\r
475          *              template to be used (__NAME__ of the template)\r
476          * @param $amountMonths\r
477          *              max amount of months to be search (0 = all)\r
478          * @param $maxresults\r
479          *              max number of results to show\r
480          * @param $startpos\r
481          *              offset\r
482          * @returns\r
483          *              amount of hits found\r
484          */\r
485         function search($query, $template, $amountMonths, $maxresults, $startpos) {\r
486                 global $CONF, $manager;\r
487 \r
488                 $highlight      = '';\r
489                 $sqlquery       = $this->getSqlSearch($query, $amountMonths, $highlight);\r
490 \r
491                 if ($sqlquery == '')\r
492                 {\r
493                         // no query -> show everything\r
494                         $extraquery = '';\r
495                         $amountfound = $this->readLogAmount($template, $maxresults, $extraQuery, $query, 1, 1);\r
496                 } else {\r
497 \r
498                         // add LIMIT to query (to split search results into pages)\r
499                         if (intval($maxresults > 0))\r
500                                 $sqlquery .= ' LIMIT ' . intval($startpos).',' . intval($maxresults);\r
501 \r
502                         // show results\r
503                         $amountfound = $this->showUsingQuery($template, $sqlquery, $highlight, 1, 1);\r
504 \r
505                         // when no results were found, show a message\r
506                         if ($amountfound == 0)\r
507                         {\r
508                                 $template =& $manager->getTemplate($template);\r
509                                 $vars = array(\r
510                                         'query'         => Entity::hsc($query),\r
511                                         'blogid'        => $this->getID()\r
512                                 );\r
513                                 echo Template::fill($template['SEARCH_NOTHINGFOUND'],$vars);\r
514                         }\r
515                 }\r
516 \r
517                 return $amountfound;\r
518         }\r
519 \r
520         /**\r
521          * Blog::getSqlSearch()\r
522          * Returns an SQL query to use for a search query\r
523          * No LIMIT clause is added. (caller should add this if multiple pages are requested)\r
524          *\r
525          * @param string        $query  search query\r
526          * @param       integer $amountMonths   amount of months to search back. Default = 0 = unlimited\r
527          * @param       string  $mode   either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query\r
528          * @return      string  $highlight      words to highlight (out parameter)\r
529          * @return      string  either a full SQL query, or an empty string (if querystring empty)\r
530          */\r
531         function getSqlSearch($query, $amountMonths = 0, &$highlight, $mode = '')\r
532         {\r
533                 $searchclass = new Search($query);\r
534                 \r
535                 $highlight       = $searchclass->inclusive;\r
536                 \r
537                 // if querystring is empty, return empty string\r
538                 if ( $searchclass->inclusive == '' )\r
539                 {\r
540                         return '';\r
541                 }\r
542                 \r
543                 $where  = $searchclass->boolean_sql_where('ititle,ibody,imore');\r
544                 $select = $searchclass->boolean_sql_select('ititle,ibody,imore');\r
545                 \r
546                 // get list of blogs to search\r
547                 $blogs          = $searchclass->blogs;          // array containing blogs that always need to be included\r
548                 $blogs[]        = $this->getID();                       // also search current blog (duh)\r
549                 $blogs          = array_unique($blogs);         // remove duplicates\r
550                 $selectblogs = '';\r
551                 if ( count($blogs) > 0 )\r
552                 {\r
553                         $selectblogs = ' and i.iblog in (' . implode(',', $blogs) . ')';\r
554                 }\r
555                 \r
556                 if ( $mode == '' )\r
557                 {\r
558                         $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, i.itime, i.imore as more, i.icat as catid, i.iclosed as closed,\r
559                                 m.mname as author, m.mrealname as authorname, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl,\r
560                                 c.cname as category';\r
561                         \r
562                         if ( $select )\r
563                         {\r
564                                 $query .= ', '.$select. ' as score ';\r
565                         }\r
566                 }\r
567                 else\r
568                 {\r
569                         $query = 'SELECT COUNT(*) as result ';\r
570                 }\r
571                 \r
572                 $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c'\r
573                                 . ' WHERE i.iauthor=m.mnumber'\r
574                                 . ' and i.icat=c.catid'\r
575                                 // exclude drafts\r
576                                 . ' and i.idraft=0'\r
577                                 . $selectblogs\r
578                                         // don't show future items\r
579                                 . ' and i.itime<=' . DB::formatDateTime($this->getCorrectTime())\r
580                                 . ' and '.$where;\r
581 \r
582                 // take into account amount of months to search\r
583                 if ( $amountMonths > 0 )\r
584                 {\r
585                         $localtime = getdate($this->getCorrectTime());\r
586                         $timestamp_start = mktime(0,0,0,$localtime['mon'] - $amountMonths,1,$localtime['year']);\r
587                         $query .= ' and i.itime>' . DB::formatDateTime($timestamp_start);\r
588                 }\r
589                 \r
590                 if ( $mode == '' )\r
591                 {\r
592                         if ( $select )\r
593                         {\r
594                                 $query .= ' ORDER BY score DESC';\r
595                         }\r
596                         else\r
597                         {\r
598                                 $query .= ' ORDER BY i.itime DESC ';\r
599                         }\r
600                 }\r
601                 \r
602                 return $query;\r
603         }\r
604         \r
605         /**\r
606          * Blog::getSqlBlog()\r
607          * Returns the SQL query that's normally used to display the blog items on the index type skins\r
608          * No LIMIT clause is added. (caller should add this if multiple pages are requested)\r
609          *\r
610          * @param       string  $extraQuery     extra query string\r
611          * @param       string  $mode                   either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query\r
612          * @return      string  either a full SQL query, or an empty string\r
613          */\r
614         function getSqlBlog($extraQuery, $mode = '')\r
615         {\r
616                 if ( $mode == '' )\r
617                 {\r
618                         $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author,\r
619                                 m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail,\r
620                                 m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed';\r
621                 }\r
622                 else\r
623                 {\r
624                         $query = 'SELECT COUNT(*) as result ';\r
625                 }\r
626                 \r
627                 $query  .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c'\r
628                                 . ' WHERE i.iblog='.$this->blogid\r
629                                 . ' and i.iauthor=m.mnumber'\r
630                                 . ' and i.icat=c.catid'\r
631                                 // exclude drafts\r
632                                 . ' and i.idraft=0'\r
633                                 // don't show future items\r
634                                 . ' and i.itime<=' . DB::formatDateTime($this->getCorrectTime());\r
635                 \r
636                 if ( $this->getSelectedCategory() )\r
637                 {\r
638                         $query .= ' and i.icat=' . $this->getSelectedCategory() . ' ';\r
639                 }\r
640                 \r
641                 $query .= $extraQuery;\r
642                 \r
643                 if ( $mode == '' )\r
644                 {\r
645                         $query .= ' ORDER BY i.itime DESC';\r
646                 }\r
647                 return $query;\r
648         }\r
649         \r
650         /**\r
651          * Blog::showArchiveList()\r
652          * Shows the archivelist using the given template\r
653          * \r
654          * @param       String  $template       template name\r
655          * @param       String  $mode   year/month/day\r
656          * @param       Integer $limit  limit of record count\r
657          * @return      Void\r
658          */\r
659         function showArchiveList($template, $mode = 'month', $limit = 0)\r
660         {\r
661                 global $CONF, $catid, $manager;\r
662                 \r
663                 if ( !isset ($linkparams) )\r
664                 {\r
665                         $linkparams = array();\r
666                 }\r
667                 \r
668                 if ( $catid )\r
669                 {\r
670                         $linkparams = array('catid' => $catid);\r
671                 }\r
672                 \r
673                 $template =& $manager->getTemplate($template);\r
674                 $data['blogid'] = $this->getID();\r
675                 \r
676                 if ( !array_key_exists('ARCHIVELIST_HEADER', $template) || !$template['ARCHIVELIST_HEADER'] )\r
677                 {\r
678                         $tplt = '';\r
679                 }\r
680                 else\r
681                 {\r
682                         $tplt = $template['ARCHIVELIST_HEADER'];\r
683                 }\r
684                 \r
685                 echo Template::fill($tplt, $data);\r
686                 \r
687                 $query = 'SELECT itime, SUBSTRING(itime,1,4) AS Year, SUBSTRING(itime,6,2) AS Month, SUBSTRING(itime,9,2) AS Day'\r
688                                 . ' FROM '.sql_table('item')\r
689                                 . ' WHERE iblog=' . $this->getID()\r
690                                 // don't show future items!\r
691                                 . ' AND itime <=' . DB::formatDateTime($this->getCorrectTime())\r
692                                 // don't show draft items\r
693                                 . ' AND idraft=0';\r
694                 \r
695                 if ( $catid )\r
696                 {\r
697                         $query .= ' and icat=' . intval($catid);\r
698                 }\r
699                 \r
700                 $query .= ' GROUP BY Year';\r
701                 if ( $mode == 'month' || $mode == 'day' )\r
702                 {\r
703                         $query .= ', Month';\r
704                 }\r
705                 if ( $mode == 'day' )\r
706                 {\r
707                         $query .= ', Day';\r
708                 }\r
709                 \r
710                 $query .= ' ORDER BY itime DESC';\r
711                 \r
712                 if ( $limit > 0 )\r
713                 {\r
714                         $query .= ' LIMIT ' . intval($limit);\r
715                 }\r
716                 \r
717                 $res = DB::getResult($query);\r
718                 foreach ( $res as $current )\r
719                 {\r
720                         /* string time -> unix timestamp */\r
721                         $current['itime'] = strtotime($current['itime']);\r
722                         \r
723                         if ( $mode == 'day' )\r
724                         {\r
725                                 $archivedate = date('Y-m-d',$current['itime']);\r
726                                 $archive['day'] = date('d',$current['itime']);\r
727                                 $data['day'] = date('d',$current['itime']);\r
728                                 $data['month'] = date('m',$current['itime']);\r
729                                 $archive['month'] = $data['month'];\r
730                         }\r
731                         elseif ( $mode == 'year' )\r
732                         {\r
733                                 $archivedate = date('Y',$current['itime']);\r
734                                 $data['day'] = '';\r
735                                 $data['month'] = '';\r
736                                 $archive['day'] = '';\r
737                                 $archive['month'] = '';\r
738                         }\r
739                         else\r
740                         {\r
741                                 $archivedate = date('Y-m',$current['itime']);\r
742                                 $data['month'] = date('m',$current['itime']);\r
743                                 $archive['month'] = $data['month'];\r
744                                 $data['day'] = '';\r
745                                 $archive['day'] = '';\r
746                         }\r
747                         \r
748                         $data['year'] = date('Y',$current['itime']);\r
749                         $archive['year'] = $data['year'];\r
750                         $data['archivelink'] = Link::create_archive_link($this->getID(),$archivedate,$linkparams);\r
751                         \r
752                         $manager->notify(\r
753                                 'PreArchiveListItem',\r
754                                 array(\r
755                                         'listitem' => &$data\r
756                                 )\r
757                         );\r
758                         \r
759                         $temp = Template::fill($template['ARCHIVELIST_LISTITEM'],$data);\r
760                         echo i18n::formatted_datetime($temp, $current['itime']);\r
761                         return;\r
762                 }\r
763                 \r
764                 $res->closeCursor();\r
765                 \r
766                 if ( !array_key_exists('ARCHIVELIST_FOOTER', $template) || !$template['ARCHIVELIST_FOOTER'] )\r
767                 {\r
768                         $tplt = '';\r
769                 }\r
770                 else\r
771                 {\r
772                         $tplt = $template['ARCHIVELIST_FOOTER'];\r
773                 }\r
774                 \r
775                 echo Template::fill($tplt, $data);\r
776                 return;\r
777         }\r
778         \r
779         /**\r
780          * Blog::showCategoryList()\r
781          * Shows the list of categories using a given template\r
782          * \r
783          * @param       string  $template       Template Name\r
784          * @return      void\r
785          */\r
786         function showCategoryList($template)\r
787         {\r
788                 global $CONF, $manager;\r
789                 \r
790                 /*\r
791                  * determine arguments next to catids\r
792                  * I guess this can be done in a better way, but it works\r
793                  */\r
794                 global $archive, $archivelist;\r
795                 \r
796                 $linkparams = array();\r
797                 if ( $archive )\r
798                 {\r
799                         $blogurl = Link::create_archive_link($this->getID(), $archive, '');\r
800                         $linkparams['blogid'] = $this->getID();\r
801                         $linkparams['archive'] = $archive;\r
802                 }\r
803                 else if ( $archivelist )\r
804                 {\r
805                         $blogurl = Link::create_archivelist_link($this->getID(), '');\r
806                         $linkparams['archivelist'] = $archivelist;\r
807                 }\r
808                 else\r
809                 {\r
810                         $blogurl = Link::create_blogid_link($this->getID(), '');\r
811                         $linkparams['blogid'] = $this->getID();\r
812                 }\r
813                 \r
814                 $template =& $manager->getTemplate($template);\r
815                 \r
816                 //: Change: Set nocatselected variable\r
817                 if ( $this->getSelectedCategory() )\r
818                 {\r
819                         $nocatselected = 'no';\r
820                 }\r
821                 else\r
822                 {\r
823                         $nocatselected = 'yes';\r
824                 } \r
825                 \r
826                 $args = array(\r
827                         'blogid'        => $this->getID(),\r
828                         'blogurl'       => $blogurl,\r
829                         'self'          => $CONF['Self'],\r
830                         //: Change: Set catiscurrent template variable for header\r
831                         'catiscurrent'  => $nocatselected,\r
832                         'currentcat'    => $nocatselected \r
833                 );\r
834                 \r
835                 /* output header of category list item */\r
836                 if ( !array_key_exists('CATLIST_HEADER', $template) || empty($template['CATLIST_HEADER']) )\r
837                 {\r
838                         echo Template::fill(NULL, $args);\r
839                 }\r
840                 else\r
841                 {\r
842                         echo Template::fill($template['CATLIST_HEADER'], $args);\r
843                 }\r
844                 \r
845                 $query = "SELECT catid, cdesc as catdesc, cname as catname FROM %s WHERE cblog=%d ORDER BY cname ASC;";\r
846                 $query = sprintf($query, sql_table('category'), (integer) $this->getID());\r
847                 $res = DB::getResult($query);\r
848                 \r
849                 foreach ( $res as $data )\r
850                 {\r
851                         $args = array(\r
852                                 'catid' => $data['catid'],\r
853                                 'name'  => $data['catname'],\r
854                                 'extra' => $linkparams\r
855                         );\r
856                         \r
857                         $data['blogid']         = $this->getID();\r
858                         $data['blogurl']        = $blogurl;\r
859                         $data['catlink']        = Link::create_link('category', $args);\r
860                         $data['self']           = $CONF['Self'];\r
861                         \r
862                         // this gives catiscurrent = no when no category is selected.\r
863                         $data['catiscurrent'] = 'no';\r
864                         $data['currentcat'] = 'no';\r
865                         \r
866                         if ( $this->getSelectedCategory() )\r
867                         {\r
868                                 if ( $this->getSelectedCategory() == $data['catid'] )\r
869                                 {\r
870                                         $data['catiscurrent'] = 'yes';\r
871                                         $data['currentcat'] = 'yes';\r
872                                 }\r
873                         }\r
874                         else\r
875                         {\r
876                                 global $itemid;\r
877                                 if ( intval($itemid) && $manager->existsItem(intval($itemid), 0, 0) )\r
878                                 {\r
879                                         $iobj   =& $manager->getItem(intval($itemid), 0, 0);\r
880                                         $cid    = $iobj['catid'];\r
881                                         \r
882                                         if ( $cid == $data['catid'] )\r
883                                         {\r
884                                                 $data['catiscurrent']   = 'yes';\r
885                                                 $data['currentcat']             = 'yes';\r
886                                         }\r
887                                 }\r
888                         }\r
889                         \r
890                         $manager->notify(\r
891                                 'PreCategoryListItem',\r
892                                 array(\r
893                                         'listitem' => &$data\r
894                                 ));\r
895                         \r
896                         if ( !array_key_exists('CATLIST_LISTITEM', $template) || empty($template['CATLIST_LISTITEM']))\r
897                         {\r
898                                 echo Template::fill(NULL, $data);\r
899                         }\r
900                         else\r
901                         {\r
902                                 echo Template::fill($template['CATLIST_LISTITEM'], $data);\r
903                         }\r
904                 }\r
905                 \r
906                 $res->closeCursor();\r
907                 \r
908                 $args = array(\r
909                         'blogid'        => $this->getID(),\r
910                         'blogurl'       => $blogurl,\r
911                         'self'          => $CONF['Self'],\r
912                         //: Change: Set catiscurrent template variable for footer\r
913                         'catiscurrent'  => $nocatselected,\r
914                         'currentcat'    => $nocatselected  \r
915                 );\r
916                 \r
917                 if ( !array_key_exists('CATLIST_FOOTER', $template) || empty($template['CATLIST_FOOTER']))\r
918                 {\r
919                         echo Template::fill(NULL, $args);\r
920                 }\r
921                 else\r
922                 {\r
923                         echo Template::fill($template['CATLIST_FOOTER'], $args);\r
924                 }\r
925                 \r
926                 return;\r
927         }\r
928         \r
929         /**\r
930          * Blog::showBlogList()\r
931          * Shows a list of all blogs in the system using a given template\r
932          * ordered by number, name, shortname or description\r
933          * in ascending or descending order\r
934          * \r
935          * @param       String  $template       tempalte name\r
936          * @param       String  $bnametype      bname/bshortname\r
937          * @param       String  $orderby        string for 'ORDER BY' SQL\r
938          * @param       String  $direction      ASC/DESC\r
939          * @return      Void\r
940          */\r
941         function showBlogList($template, $bnametype, $orderby, $direction)\r
942         {\r
943                 global $CONF, $manager;\r
944                 \r
945                 switch ( $orderby )\r
946                 {\r
947                         case 'number':\r
948                                 $orderby='bnumber';\r
949                                 break;\r
950                         case 'name':\r
951                                 $orderby='bname';\r
952                                 break;\r
953                         case 'shortname':\r
954                                 $orderby='bshortname';\r
955                                 break;\r
956                         case 'description':\r
957                                 $orderby='bdesc';\r
958                                 break;\r
959                         default:\r
960                                 $orderby='bnumber';\r
961                                 break;\r
962                 }\r
963                 \r
964                 $direction=strtolower($direction);\r
965                 switch ( $direction )\r
966                 {\r
967                         case 'asc':\r
968                                 $direction='ASC';\r
969                                 break;\r
970                         case 'desc':\r
971                                 $direction='DESC';\r
972                                 break;\r
973                         default:\r
974                                 $direction='ASC';\r
975                                 break;\r
976                 }\r
977                 \r
978                 $template =& $manager->getTemplate($template);\r
979                 \r
980                 echo Template::fill((isset($template['BLOGLIST_HEADER']) ? $template['BLOGLIST_HEADER'] : null),\r
981                         array(\r
982                                 'sitename' => $CONF['SiteName'],\r
983                                 'siteurl' => $CONF['IndexURL']\r
984                         )\r
985                 );\r
986                 \r
987                 $query = 'SELECT bnumber, bname, bshortname, bdesc, burl FROM '.sql_table('blog').' ORDER BY '.$orderby.' '.$direction;\r
988                 $res = DB::getResult($query);\r
989                 \r
990                 foreach ( $res as $data )\r
991                 {\r
992                         $list = array();\r
993                         $list['bloglink'] = Link::create_blogid_link($data['bnumber']);\r
994                         $list['blogdesc'] = $data['bdesc'];\r
995                         $list['blogurl'] = $data['burl'];\r
996                         \r
997                         if ( $bnametype == 'shortname' )\r
998                         {\r
999                                 $list['blogname'] = $data['bshortname'];\r
1000                         }\r
1001                         else\r
1002                         {\r
1003                                 /* all other cases */\r
1004                                 $list['blogname'] = $data['bname'];\r
1005                         }\r
1006                         \r
1007                         $manager->notify(\r
1008                                 'PreBlogListItem',\r
1009                                 array(\r
1010                                         'listitem' => &$list\r
1011                                 )\r
1012                         );\r
1013                         \r
1014                         echo Template::fill((isset($template['BLOGLIST_LISTITEM']) ? $template['BLOGLIST_LISTITEM'] : null), $list);\r
1015                 }\r
1016                 \r
1017                 $res->closeCursor();\r
1018                 \r
1019                 echo Template::fill((isset($template['BLOGLIST_FOOTER']) ? $template['BLOGLIST_FOOTER'] : null),\r
1020                         array(\r
1021                                 'sitename' => $CONF['SiteName'],\r
1022                                 'siteurl' => $CONF['IndexURL']\r
1023                         )\r
1024                 );\r
1025                 return;\r
1026         }\r
1027         \r
1028         /**\r
1029           * Read the blog settings\r
1030           */\r
1031         function readSettings() {\r
1032                 $query =  'SELECT *'\r
1033                            . ' FROM '.sql_table('blog')\r
1034                            . ' WHERE bnumber=' . $this->blogid;\r
1035                 $res = DB::getResult($query);\r
1036 \r
1037                 $this->isValid = ($res->rowCount() > 0);\r
1038                 if (!$this->isValid)\r
1039                         return;\r
1040 \r
1041                 $this->settings = $res->fetch(PDO::FETCH_ASSOC);\r
1042         }\r
1043 \r
1044         /**\r
1045           * Write the blog settings\r
1046           */\r
1047         function writeSettings() {\r
1048 \r
1049                 // (can't use floatval since not available prior to PHP 4.2)\r
1050                 $offset = $this->getTimeOffset();\r
1051                 if (!is_float($offset))\r
1052                         $offset = intval($offset);\r
1053 \r
1054                 $query =  'UPDATE '.sql_table('blog')\r
1055                            . ' SET bname=' . DB::quoteValue($this->getName()) . ','\r
1056                            . '     bshortname='. DB::quoteValue($this->getShortName()) . ','\r
1057                            . '     bcomments='. intval($this->commentsEnabled()) . ','\r
1058                            . '     bmaxcomments=' . intval($this->getMaxComments()) . ','\r
1059                            . '     btimeoffset=' . $offset . ','\r
1060                            . '     bpublic=' . intval($this->isPublic()) . ','\r
1061                            . '     breqemail=' . intval($this->emailRequired()) . ','\r
1062                            . '     bconvertbreaks=' . intval($this->convertBreaks()) . ','\r
1063                            . '     ballowpast=' . intval($this->allowPastPosting()) . ','\r
1064                            . '     bnotify=' . DB::quoteValue($this->getNotifyAddress()) . ','\r
1065                            . '     bnotifytype=' . intval($this->getNotifyType()) . ','\r
1066                            . '     burl=' . DB::quoteValue($this->getURL()) . ','\r
1067                            . '     bupdate=' . DB::quoteValue($this->getUpdateFile()) . ','\r
1068                            . '     bdesc=' . DB::quoteValue($this->getDescription()) . ','\r
1069                            . '     bdefcat=' . intval($this->getDefaultCategory()) . ','\r
1070                            . '     bdefskin=' . intval($this->getDefaultSkin()) . ','\r
1071                            . '     bincludesearch=' . intval($this->getSearchable())\r
1072                            . ' WHERE bnumber=' . intval($this->getID());\r
1073                 DB::execute($query);\r
1074 \r
1075         }\r
1076 \r
1077         /**\r
1078           * Update the update file if requested\r
1079           */    \r
1080         function updateUpdatefile() {\r
1081                  if ($this->getUpdateFile()) {\r
1082                         $f_update = fopen($this->getUpdateFile(),'w');\r
1083                         fputs($f_update,$this->getCorrectTime());\r
1084                         fclose($f_update);\r
1085                  }\r
1086 \r
1087         }\r
1088 \r
1089         /**\r
1090           * Check if a category with a given catid is valid\r
1091           * \r
1092           * @param $catid\r
1093           *     category id\r
1094           */\r
1095         function isValidCategory($catid) {\r
1096                 $query = 'SELECT * FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' and catid=' . intval($catid);\r
1097                 $res = DB::getResult($query);\r
1098                 return ($res->rowCount() != 0);\r
1099         }\r
1100 \r
1101         /**\r
1102           * Get the category name for a given catid\r
1103           * \r
1104           * @param $catid\r
1105           *     category id\r
1106           */\r
1107         function getCategoryName($catid) {\r
1108                 $res = DB::getValue('SELECT cname FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));\r
1109                 return $res;\r
1110         }\r
1111 \r
1112         /**\r
1113           * Get the category description for a given catid\r
1114           * \r
1115           * @param $catid\r
1116           *     category id\r
1117           */\r
1118         function getCategoryDesc($catid) {\r
1119                 $res = DB::getValue('SELECT cdesc FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));\r
1120                 return $res;\r
1121         }\r
1122 \r
1123         /**\r
1124           * Get the category id for a given category name\r
1125           * \r
1126           * @param $name\r
1127           *     category name\r
1128           */\r
1129         function getCategoryIdFromName($name) {\r
1130                 $res = DB::getValue('SELECT catid FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and cname="' . DB::quoteValue($name) . '"');\r
1131                 if ( $res ) {\r
1132                         return $res;\r
1133                 } else {\r
1134                         return $this->getDefaultCategory();\r
1135                 }\r
1136         }\r
1137 \r
1138         /**\r
1139           * Get the the setting for the line break handling\r
1140           * [should be named as getConvertBreaks()]\r
1141           */\r
1142         function convertBreaks() {\r
1143                 return $this->getSetting('bconvertbreaks');\r
1144         }\r
1145         \r
1146         /**\r
1147           * Set the the setting for the line break handling\r
1148           * \r
1149           * @param $val\r
1150           *     new value for bconvertbreaks\r
1151           */\r
1152         function setConvertBreaks($val) {\r
1153                 $this->setSetting('bconvertbreaks',$val);\r
1154         }\r
1155 \r
1156         /**\r
1157           * Insert a javascript that includes information about the settings\r
1158           * of an author:  ConvertBreaks, MediaUrl and AuthorId\r
1159           * \r
1160           * @param $authorid\r
1161           *     id of the author\r
1162           */    \r
1163         function insertJavaScriptInfo($authorid = '') {\r
1164                 global $member, $CONF;\r
1165 \r
1166                 if ($authorid == '')\r
1167                         $authorid = $member->getID();\r
1168 \r
1169                 ?>\r
1170                 <script type="text/javascript">\r
1171                         setConvertBreaks(<?php echo  $this->convertBreaks() ? 'true' : 'false' ?>);\r
1172                         setMediaUrl("<?php echo $CONF['MediaURL']?>");\r
1173                         setAuthorId(<?php echo $authorid?>);\r
1174                 </script><?php  \r
1175         }\r
1176 \r
1177         /**\r
1178           * Set the the setting for allowing to publish postings in the past\r
1179           * \r
1180           * @param $val\r
1181           *     new value for ballowpast\r
1182           */\r
1183         function setAllowPastPosting($val) {\r
1184                 $this->setSetting('ballowpast',$val);\r
1185         }\r
1186         \r
1187         /**\r
1188           * Get the the setting if it is allowed to publish postings in the past\r
1189           * [should be named as getAllowPastPosting()]\r
1190           */\r
1191         function allowPastPosting() {\r
1192                 return $this->getSetting('ballowpast');\r
1193         }\r
1194 \r
1195         function getCorrectTime($t=0) {\r
1196                 if ($t == 0) $t = time();\r
1197                 return ($t + 3600 * $this->getTimeOffset());\r
1198         }\r
1199 \r
1200         function getName() {\r
1201                 return $this->getSetting('bname');\r
1202         }\r
1203 \r
1204         function getShortName() {\r
1205                 return $this->getSetting('bshortname');\r
1206         }\r
1207 \r
1208         function getMaxComments() {\r
1209                 return $this->getSetting('bmaxcomments');\r
1210         }\r
1211 \r
1212         function getNotifyAddress() {\r
1213                 return $this->getSetting('bnotify');\r
1214         }\r
1215 \r
1216         function getNotifyType() {\r
1217                 return $this->getSetting('bnotifytype');\r
1218         }\r
1219 \r
1220         function notifyOnComment() {\r
1221                 $n = $this->getNotifyType();\r
1222                 return (($n != 0) && (($n % 3) == 0));\r
1223         }\r
1224 \r
1225         function notifyOnVote() {\r
1226                 $n = $this->getNotifyType();\r
1227                 return (($n != 0) && (($n % 5) == 0));\r
1228         }\r
1229 \r
1230         function notifyOnNewItem() {\r
1231                 $n = $this->getNotifyType();\r
1232                 return (($n != 0) && (($n % 7) == 0));\r
1233         }\r
1234 \r
1235         function setNotifyType($val) {\r
1236                 $this->setSetting('bnotifytype',$val);\r
1237         }\r
1238 \r
1239 \r
1240         function getTimeOffset() {\r
1241                 return $this->getSetting('btimeoffset');\r
1242         }\r
1243 \r
1244         function commentsEnabled() {\r
1245                 return $this->getSetting('bcomments');\r
1246         }\r
1247 \r
1248         function getURL() {\r
1249                 return $this->getSetting('burl');\r
1250         }\r
1251 \r
1252         function getDefaultSkin() {\r
1253                 return $this->getSetting('bdefskin');\r
1254         }\r
1255 \r
1256         function getUpdateFile() {\r
1257                 return $this->getSetting('bupdate');\r
1258         }\r
1259 \r
1260         function getDescription() {\r
1261                 return $this->getSetting('bdesc');\r
1262         }\r
1263 \r
1264         function isPublic() {\r
1265                 return $this->getSetting('bpublic');\r
1266         }\r
1267 \r
1268         function emailRequired() {\r
1269                 return $this->getSetting('breqemail');\r
1270         }\r
1271 \r
1272         function getSearchable() {\r
1273                 return $this->getSetting('bincludesearch');\r
1274         }\r
1275 \r
1276         function getDefaultCategory() {\r
1277                 return $this->getSetting('bdefcat');\r
1278         }\r
1279 \r
1280         function setPublic($val) {\r
1281                 $this->setSetting('bpublic',$val);\r
1282         }\r
1283 \r
1284         function setSearchable($val) {\r
1285                 $this->setSetting('bincludesearch',$val);\r
1286         }\r
1287 \r
1288         function setDescription($val) {\r
1289                 $this->setSetting('bdesc',$val);\r
1290         }\r
1291 \r
1292         function setUpdateFile($val) {\r
1293                 $this->setSetting('bupdate',$val);\r
1294         }\r
1295 \r
1296         function setDefaultSkin($val) {\r
1297                 $this->setSetting('bdefskin',$val);\r
1298         }\r
1299 \r
1300         function setURL($val) {\r
1301                 $this->setSetting('burl',$val);\r
1302         }\r
1303 \r
1304         function setName($val) {\r
1305                 $this->setSetting('bname',$val);\r
1306         }\r
1307 \r
1308         function setShortName($val) {\r
1309                 $this->setSetting('bshortname',$val);\r
1310         }\r
1311 \r
1312         function setCommentsEnabled($val) {\r
1313                 $this->setSetting('bcomments',$val);\r
1314         }\r
1315 \r
1316         function setMaxComments($val) {\r
1317                 $this->setSetting('bmaxcomments',$val);\r
1318         }\r
1319 \r
1320         function setNotifyAddress($val) {\r
1321                 $this->setSetting('bnotify',$val);\r
1322         }\r
1323 \r
1324         function setEmailRequired($val) {\r
1325                 $this->setSetting('breqemail',$val);\r
1326         }\r
1327         \r
1328         public function setTimeOffset($val)\r
1329         {\r
1330                 // check validity of value\r
1331                 // 1. replace , by . (common mistake)\r
1332                 $val = str_replace(',','.',$val);\r
1333                 \r
1334                 // 2. cast to float or int\r
1335                 if ( is_numeric($val) && (i18n::strpos($val, '.5') === (i18n::strlen($val) - 2)) )\r
1336                 {\r
1337                         $val = (float) $val;\r
1338                 }\r
1339                 else\r
1340                 {\r
1341                         $val = (integer) $val;\r
1342                 }\r
1343                 \r
1344                 $this->setSetting('btimeoffset',$val);\r
1345                 return;\r
1346         }\r
1347 \r
1348         function setDefaultCategory($val) {\r
1349                 $this->setSetting('bdefcat',$val);\r
1350         }\r
1351 \r
1352         function getSetting($key) {\r
1353                 return $this->settings[$key];\r
1354         }\r
1355 \r
1356         function setSetting($key,$value) {\r
1357                 $this->settings[$key] = $value;\r
1358         }\r
1359 \r
1360         /**\r
1361          * Blog::addTeamMember()\r
1362          * Tries to add a member to the team. \r
1363          * Returns false if the member was already on the team\r
1364          * \r
1365          * @param       Integer $memberid       id for member\r
1366          * @param       Boolean $admin  super-admin or not\r
1367          * @return      Boolean Success/Fail\r
1368          */\r
1369         function addTeamMember($memberid, $admin)\r
1370         {\r
1371                 global $manager;\r
1372                 \r
1373                 $memberid = intval($memberid);\r
1374                 $admin = intval($admin);\r
1375                 \r
1376                 // check if member is already a member\r
1377                 $tmem = Member::createFromID($memberid);\r
1378                 \r
1379                 if ( $tmem->isTeamMember($this->getID()) )\r
1380                 {\r
1381                         return 0;\r
1382                 }\r
1383                 \r
1384                 $manager->notify(\r
1385                         'PreAddTeamMember',\r
1386                         array(\r
1387                                 'blog' => &$this,\r
1388                                 'member' => &$tmem,\r
1389                                 'admin' => &$admin\r
1390                         )\r
1391                 );\r
1392                 \r
1393                 // add to team\r
1394                 $query = "INSERT INTO %s (TMEMBER, TBLOG, TADMIN) VALUES (%d, %d, %d);";
1395                 $query = sprintf($query, sql_table('team'), (integer) $memberid, (integer) $this->getID(), (integer) $admin);
1396                 DB::execute($query);\r
1397                 \r
1398                 $manager->notify(\r
1399                         'PostAddTeamMember',\r
1400                         array(\r
1401                                 'blog' => &$this,\r
1402                                 'member' => &$tmem,\r
1403                                 'admin' => $admin\r
1404                         )\r
1405                 );\r
1406                 \r
1407                 $logMsg = sprintf(_TEAM_ADD_NEWTEAMMEMBER, $tmem->getDisplayName(), $memberid, $this->getName());\r
1408                 ActionLog::add(INFO, $logMsg);\r
1409                 \r
1410                 return 1;\r
1411         }\r
1412 \r
1413         function getID() {\r
1414                 return (integer) $this->blogid;\r
1415         }\r
1416 \r
1417         /**\r
1418           * Checks if a blog with a given shortname exists \r
1419           * Returns true if there is a blog with the given shortname (static)\r
1420           * \r
1421           * @param $name\r
1422           *     blog shortname\r
1423           */\r
1424         function exists($name) {\r
1425                 $r = DB::getResult('SELECT * FROM '.sql_table('blog').' WHERE bshortname='. DB::quoteValue($name));\r
1426                 return ($r->rowCount() != 0);\r
1427         }\r
1428 \r
1429         /**\r
1430           * Checks if a blog with a given id exists \r
1431           * Returns true if there is a blog with the given ID (static)\r
1432           * \r
1433           * @param $id\r
1434           *     blog id\r
1435           */\r
1436         function existsID($id) {\r
1437                 $r = DB::getResult('SELECT * FROM '.sql_table('blog').' WHERE bnumber='.intval($id));\r
1438                 return ($r->rowCount() != 0);\r
1439         }\r
1440 \r
1441         /**\r
1442           * flag there is a future post pending \r
1443           */\r
1444         function setFuturePost() {\r
1445                 $query =  'UPDATE '.sql_table('blog')\r
1446                             . " SET bfuturepost='1' WHERE bnumber=" . $this->getID();\r
1447                 DB::execute($query);\r
1448         }\r
1449 \r
1450         /**\r
1451           * clear there is a future post pending \r
1452           */\r
1453         function clearFuturePost() {\r
1454                 $query =  'UPDATE '.sql_table('blog')\r
1455                            . " SET bfuturepost='0' WHERE bnumber=" . $this->getID();\r
1456                 DB::execute($query);\r
1457         }\r
1458 \r
1459         /**\r
1460           * check if we should throw justPosted event \r
1461           */\r
1462         function checkJustPosted() {\r
1463                 global $manager;\r
1464 \r
1465                 if ($this->settings['bfuturepost'] == 1) {\r
1466                         $blogid = $this->getID();\r
1467                         $result = DB::getResult("SELECT * FROM " . sql_table('item')\r
1468                                   . " WHERE iposted=0 AND iblog=" . $blogid . " AND itime<NOW()");\r
1469                         if ( $result->rowCount() > 0 ) {\r
1470                                 // This $pinged is allow a plugin to tell other hook to the event that a ping is sent already\r
1471                                 // Note that the plugins's calling order is subject to thri order in the plugin list\r
1472                                 $pinged = false;\r
1473                                 $manager->notify(\r
1474                                                 'JustPosted',\r
1475                                                 array('blogid' => $blogid,\r
1476                                                 'pinged' => &$pinged\r
1477                                                 )\r
1478                                 );\r
1479 \r
1480                                 // clear all expired future posts\r
1481                                 DB::execute("UPDATE " . sql_table('item') . " SET iposted='1' WHERE iblog=" . $blogid . " AND itime<NOW()");\r
1482 \r
1483                                 // check to see any pending future post, clear the flag is none\r
1484                                 $result = DB::getResult("SELECT * FROM " . sql_table('item')\r
1485                                           . " WHERE iposted=0 AND iblog=" . $blogid);\r
1486                                 if ( $result->rowCount() == 0 ) {\r
1487                                         $this->clearFuturePost();\r
1488                                 }\r
1489                         }\r
1490                 }\r
1491         }\r
1492 \r
1493         /**\r
1494          * Shows the given list of items for this blog\r
1495          *\r
1496          * @param $itemarray\r
1497          *              array of item numbers to be displayed\r
1498          * @param $template\r
1499          *              String representing the template _NAME_ (!)\r
1500          * @param $highlight\r
1501          *              contains a query that should be highlighted\r
1502          * @param $comments\r
1503          *              1=show comments 0=don't show comments\r
1504          * @param $dateheads\r
1505          *              1=show dateheads 0=don't show dateheads\r
1506          * @param $showDrafts\r
1507          *              0=do not show drafts 1=show drafts\r
1508          * @param $showFuture\r
1509          *              0=do not show future posts 1=show future posts\r
1510          * @returns int\r
1511          *              amount of items shown\r
1512          */\r
1513         function readLogFromList($itemarray, $template, $highlight = '', $comments = 1, $dateheads = 1,$showDrafts = 0, $showFuture = 0) {\r
1514 \r
1515                 $query = $this->getSqlItemList($itemarray,$showDrafts,$showFuture);\r
1516 \r
1517                 return $this->showUsingQuery($template, $query, $highlight, $comments, $dateheads);\r
1518         }\r
1519 \r
1520         /**\r
1521          * Blog::getSqlItemList()\r
1522          * Returns the SQL query used to fill out templates for a list of items\r
1523          * No LIMIT clause is added. (caller should add this if multiple pages are requested)\r
1524          *\r
1525          * @param       array   $itemarray              an array holding the item numbers of the items to be displayed\r
1526          * @param integer       $showDrafts     0=do not show drafts 1=show drafts\r
1527          * @param integer       $showFuture     0=do not show future posts 1=show future posts\r
1528          * @return      string  either a full SQL query, or an empty string\r
1529          * \r
1530          */\r
1531         function getSqlItemList($itemarray,$showDrafts = 0,$showFuture = 0)\r
1532         {\r
1533                 if ( !is_array($itemarray) )\r
1534                 {\r
1535                         return '';\r
1536                 }\r
1537                 \r
1538                 $showDrafts = intval($showDrafts);\r
1539                 $showFuture = intval($showFuture);\r
1540                 $items = array();\r
1541                 \r
1542                 foreach ( $itemarray as $value )\r
1543                 {\r
1544                         if ( intval($value) )\r
1545                         {\r
1546                                 $items[] = intval($value);\r
1547                         }\r
1548                 }\r
1549                 if ( !count($items) )\r
1550                 {\r
1551                         return '';\r
1552                 }\r
1553                 \r
1554                 $i = count($items);\r
1555                 $query = '';\r
1556                 foreach ( $items as $value )\r
1557                 {\r
1558                         $query .= '('\r
1559                                         .       'SELECT'\r
1560                                         .       ' i.inumber as itemid,'\r
1561                                         .       ' i.ititle as title,'\r
1562                                         .       ' i.ibody as body,'\r
1563                                         .       ' m.mname as author,'\r
1564                                         .       ' m.mrealname as authorname,'\r
1565                                         .       ' i.itime,'\r
1566                                         .       ' i.imore as more,'\r
1567                                         .       ' m.mnumber as authorid,'\r
1568                                         .       ' m.memail as authormail,'\r
1569                                         .       ' m.murl as authorurl,'\r
1570                                         .       ' c.cname as category,'\r
1571                                         .       ' i.icat as catid,'\r
1572                                         .       ' i.iclosed as closed';\r
1573                         \r
1574                         $query .= ' FROM '\r
1575                                         . sql_table('item') . ' as i, '\r
1576                                         . sql_table('member') . ' as m, '\r
1577                                         . sql_table('category') . ' as c'\r
1578                                         . ' WHERE'\r
1579                                     .    ' i.iblog='.$this->blogid\r
1580                                    . ' and i.iauthor=m.mnumber'\r
1581                                    . ' and i.icat=c.catid';\r
1582                         \r
1583                         // exclude drafts       \r
1584                         if ( !$showDrafts )\r
1585                         {\r
1586                                 $query .= ' and i.idraft=0';\r
1587                         }\r
1588                         if ( !$showFuture )\r
1589                         {\r
1590                                 // don't show future items\r
1591                                 $query .= ' and i.itime<=' . DB::formatDateTime($this->getCorrectTime());\r
1592                         }\r
1593                         \r
1594                         $query .= ' and i.inumber='.intval($value);\r
1595                         $query .= ')';\r
1596                         $i--;\r
1597                         if ($i) $query .= ' UNION ';\r
1598                 }\r
1599                 \r
1600                 return $query;\r
1601         }\r
1602 }\r