OSDN Git Service

Merge branch 'master' into skinnable-master
[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, i18n::formatted_datetime('mysql', $timestamp_start), i18n::formatted_datetime('mysql', $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                 $actions = new ItemActions($this);\r
190                 $parser = new Parser($actions->getDefinedActions(),$actions);\r
191                 $actions->setTemplate($template);\r
192                 $actions->setHighlight($highlight);\r
193                 $actions->setLastVisit($lastVisit);\r
194                 $actions->setParser($parser);\r
195                 $actions->setShowComments($comments);\r
196                 \r
197                 // execute query\r
198                 $items = sql_query($query);\r
199                 \r
200                 // loop over all items\r
201                 $old_date = 0;\r
202                 while ( $item = sql_fetch_object($items) )\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                         $actions->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('', $oldTS);\r
225                                                 }\r
226                                                 else\r
227                                                 {\r
228                                                         $tmp_footer = i18n::formatted_datetime($template['DATE_FOOTER'], $oldTS);\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_footer = i18n::formatted_datetime('', $timestamp);\r
241                                         }\r
242                                         else\r
243                                         {\r
244                                                 $tmp_footer = i18n::formatted_datetime($template['DATE_FOOTER'], $timestamp);\r
245                                         }\r
246                                         \r
247                                         $parser->parse($tmp_header);\r
248                                         $manager->notify('PostDateHead',array('blog' => &$this, 'timestamp' => $timestamp));\r
249                                 }\r
250                                 $old_date = $new_date;\r
251                         }\r
252                         \r
253                         // parse item\r
254                         $parser->parse($template['ITEM_HEADER']);\r
255                         $manager->notify('PreItem', array('blog' => &$this, 'item' => &$item));\r
256                         $parser->parse($template['ITEM']);\r
257                         $manager->notify('PostItem', array('blog' => &$this, 'item' => &$item));\r
258                         $parser->parse($template['ITEM_FOOTER']);\r
259                 }\r
260                 \r
261                 $numrows = sql_num_rows($items);\r
262                 \r
263                 // add another date footer if there was at least one item\r
264                 if ( ($numrows > 0) && $dateheads )\r
265                 {\r
266                         $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));\r
267                         $parser->parse($template['DATE_FOOTER']);\r
268                         $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));\r
269                 }\r
270                 \r
271                 sql_free_result($items);\r
272                 return $numrows;\r
273         }\r
274         \r
275         /**\r
276          * Simplified function for showing only one item\r
277          */\r
278         function showOneitem($itemid, $template, $highlight) {\r
279                 $extraQuery = ' and inumber=' . intval($itemid);\r
280 \r
281                 return $this->readLogAmount($template, 1, $extraQuery, $highlight, 0, 0);\r
282         }\r
283 \r
284 \r
285         /**\r
286          * Blog::addItem()\r
287          * Adds an item to this blog\r
288          * \r
289          * @param       Integer $catid  ID for category\r
290          * @param       String  $title  ID for \r
291          * @param       String  $body   text for body\r
292          * @param       String  $more   text for more\r
293          * @param       Integer $blogid ID for blog\r
294          * @param       Integer $authorid       ID for author\r
295          * @param       Timestamp       $timestamp      UNIX timestamp for post\r
296          * @param       Boolean $closed opened or closed\r
297          * @param       Boolean $draft  draft or not\r
298          * @param       Boolean $posted posted or not\r
299          * @return\r
300          */\r
301         function additem($catid, $title, $body, $more, $blogid, $authorid, $timestamp, $closed, $draft, $posted='1')\r
302         {\r
303                 global $manager;\r
304                 \r
305                 $blogid         = intval($blogid);\r
306                 $authorid       = intval($authorid);\r
307                 $title          = $title;\r
308                 $body           = $body;\r
309                 $more           = $more;\r
310                 $catid          = intval($catid);\r
311                 \r
312                 // convert newlines to <br />\r
313                 if ( $this->convertBreaks() )\r
314                 {\r
315                         $body = addBreaks($body);\r
316                         $more = addBreaks($more);\r
317                 }\r
318 \r
319                 if ( $closed != '1' )\r
320                 {\r
321                         $closed = '0';\r
322                 }\r
323                 if ( $draft != '0' )\r
324                 {\r
325                         $draft = '1';\r
326                 }\r
327                 \r
328                 if ( !$this->isValidCategory($catid) )\r
329                 {\r
330                         $catid = $this->getDefaultCategory();\r
331                 }\r
332                 \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 = sql_real_escape_string($title);\r
343                 $ibody = sql_real_escape_string($body);\r
344                 $imore = sql_real_escape_string($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                 sql_query($query);\r
349                 $itemid = sql_insert_id();\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 = sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID());\r
431                                 while ( sql_num_rows($res) > 0 )\r
432                                 {\r
433                                         $i++;\r
434                                         $res = sql_query('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(), sql_real_escape_string($catName), sql_real_escape_string($catDescription));\r
451                         sql_query($query);\r
452                         $catid = sql_insert_id();\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<="' . i18n::formatted_datetime('mysql', $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>"' . i18n::formatted_datetime('mysql', $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<="' . i18n::formatted_datetime('mysql', $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 <="' . i18n::formatted_datetime('mysql', $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 = sql_query($query);\r
718                 while ( $current = sql_fetch_object($res) )\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                 sql_free_result($res);\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 = sql_query($query);\r
848                 \r
849                 while ( $data = sql_fetch_assoc($res) )\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                 sql_free_result($res);\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 = sql_query($query);\r
989                 \r
990                 while ( $data = sql_fetch_assoc($res) )\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                 sql_free_result($res);\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 = sql_query($query);\r
1036 \r
1037                 $this->isValid = (sql_num_rows($res) > 0);\r
1038                 if (!$this->isValid)\r
1039                         return;\r
1040 \r
1041                 $this->settings = sql_fetch_assoc($res);\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='" . sql_real_escape_string($this->getName()) . "',"\r
1056                            . "     bshortname='". sql_real_escape_string($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='" . sql_real_escape_string($this->getNotifyAddress()) . "',"\r
1065                            . "     bnotifytype=" . intval($this->getNotifyType()) . ","\r
1066                            . "     burl='" . sql_real_escape_string($this->getURL()) . "',"\r
1067                            . "     bupdate='" . sql_real_escape_string($this->getUpdateFile()) . "',"\r
1068                            . "     bdesc='" . sql_real_escape_string($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                 sql_query($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 = sql_query($query);\r
1098                 return (sql_num_rows($res) != 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 = sql_query('SELECT cname FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));\r
1109                 $o = sql_fetch_object($res);\r
1110                 return $o->cname;\r
1111         }\r
1112 \r
1113         /**\r
1114           * Get the category description for a given catid\r
1115           * \r
1116           * @param $catid\r
1117           *     category id\r
1118           */\r
1119         function getCategoryDesc($catid) {\r
1120                 $res = sql_query('SELECT cdesc FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));\r
1121                 $o = sql_fetch_object($res);\r
1122                 return $o->cdesc;\r
1123         }\r
1124 \r
1125         /**\r
1126           * Get the category id for a given category name\r
1127           * \r
1128           * @param $name\r
1129           *     category name\r
1130           */\r
1131         function getCategoryIdFromName($name) {\r
1132                 $res = sql_query('SELECT catid FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and cname="' . sql_real_escape_string($name) . '"');\r
1133                 if (sql_num_rows($res) > 0) {\r
1134                         $o = sql_fetch_object($res);\r
1135                         return $o->catid;\r
1136                 } else {\r
1137                         return $this->getDefaultCategory();\r
1138                 }\r
1139         }\r
1140 \r
1141         /**\r
1142           * Get the the setting for the line break handling\r
1143           * [should be named as getConvertBreaks()]\r
1144           */\r
1145         function convertBreaks() {\r
1146                 return $this->getSetting('bconvertbreaks');\r
1147         }\r
1148         \r
1149         /**\r
1150           * Set the the setting for the line break handling\r
1151           * \r
1152           * @param $val\r
1153           *     new value for bconvertbreaks\r
1154           */\r
1155         function setConvertBreaks($val) {\r
1156                 $this->setSetting('bconvertbreaks',$val);\r
1157         }\r
1158 \r
1159         /**\r
1160           * Insert a javascript that includes information about the settings\r
1161           * of an author:  ConvertBreaks, MediaUrl and AuthorId\r
1162           * \r
1163           * @param $authorid\r
1164           *     id of the author\r
1165           */    \r
1166         function insertJavaScriptInfo($authorid = '') {\r
1167                 global $member, $CONF;\r
1168 \r
1169                 if ($authorid == '')\r
1170                         $authorid = $member->getID();\r
1171 \r
1172                 ?>\r
1173                 <script type="text/javascript">\r
1174                         setConvertBreaks(<?php echo  $this->convertBreaks() ? 'true' : 'false' ?>);\r
1175                         setMediaUrl("<?php echo $CONF['MediaURL']?>");\r
1176                         setAuthorId(<?php echo $authorid?>);\r
1177                 </script><?php  \r
1178         }\r
1179 \r
1180         /**\r
1181           * Set the the setting for allowing to publish postings in the past\r
1182           * \r
1183           * @param $val\r
1184           *     new value for ballowpast\r
1185           */\r
1186         function setAllowPastPosting($val) {\r
1187                 $this->setSetting('ballowpast',$val);\r
1188         }\r
1189         \r
1190         /**\r
1191           * Get the the setting if it is allowed to publish postings in the past\r
1192           * [should be named as getAllowPastPosting()]\r
1193           */\r
1194         function allowPastPosting() {\r
1195                 return $this->getSetting('ballowpast');\r
1196         }\r
1197 \r
1198         function getCorrectTime($t=0) {\r
1199                 if ($t == 0) $t = time();\r
1200                 return ($t + 3600 * $this->getTimeOffset());\r
1201         }\r
1202 \r
1203         function getName() {\r
1204                 return $this->getSetting('bname');\r
1205         }\r
1206 \r
1207         function getShortName() {\r
1208                 return $this->getSetting('bshortname');\r
1209         }\r
1210 \r
1211         function getMaxComments() {\r
1212                 return $this->getSetting('bmaxcomments');\r
1213         }\r
1214 \r
1215         function getNotifyAddress() {\r
1216                 return $this->getSetting('bnotify');\r
1217         }\r
1218 \r
1219         function getNotifyType() {\r
1220                 return $this->getSetting('bnotifytype');\r
1221         }\r
1222 \r
1223         function notifyOnComment() {\r
1224                 $n = $this->getNotifyType();\r
1225                 return (($n != 0) && (($n % 3) == 0));\r
1226         }\r
1227 \r
1228         function notifyOnVote() {\r
1229                 $n = $this->getNotifyType();\r
1230                 return (($n != 0) && (($n % 5) == 0));\r
1231         }\r
1232 \r
1233         function notifyOnNewItem() {\r
1234                 $n = $this->getNotifyType();\r
1235                 return (($n != 0) && (($n % 7) == 0));\r
1236         }\r
1237 \r
1238         function setNotifyType($val) {\r
1239                 $this->setSetting('bnotifytype',$val);\r
1240         }\r
1241 \r
1242 \r
1243         function getTimeOffset() {\r
1244                 return $this->getSetting('btimeoffset');\r
1245         }\r
1246 \r
1247         function commentsEnabled() {\r
1248                 return $this->getSetting('bcomments');\r
1249         }\r
1250 \r
1251         function getURL() {\r
1252                 return $this->getSetting('burl');\r
1253         }\r
1254 \r
1255         function getDefaultSkin() {\r
1256                 return $this->getSetting('bdefskin');\r
1257         }\r
1258 \r
1259         function getUpdateFile() {\r
1260                 return $this->getSetting('bupdate');\r
1261         }\r
1262 \r
1263         function getDescription() {\r
1264                 return $this->getSetting('bdesc');\r
1265         }\r
1266 \r
1267         function isPublic() {\r
1268                 return $this->getSetting('bpublic');\r
1269         }\r
1270 \r
1271         function emailRequired() {\r
1272                 return $this->getSetting('breqemail');\r
1273         }\r
1274 \r
1275         function getSearchable() {\r
1276                 return $this->getSetting('bincludesearch');\r
1277         }\r
1278 \r
1279         function getDefaultCategory() {\r
1280                 return $this->getSetting('bdefcat');\r
1281         }\r
1282 \r
1283         function setPublic($val) {\r
1284                 $this->setSetting('bpublic',$val);\r
1285         }\r
1286 \r
1287         function setSearchable($val) {\r
1288                 $this->setSetting('bincludesearch',$val);\r
1289         }\r
1290 \r
1291         function setDescription($val) {\r
1292                 $this->setSetting('bdesc',$val);\r
1293         }\r
1294 \r
1295         function setUpdateFile($val) {\r
1296                 $this->setSetting('bupdate',$val);\r
1297         }\r
1298 \r
1299         function setDefaultSkin($val) {\r
1300                 $this->setSetting('bdefskin',$val);\r
1301         }\r
1302 \r
1303         function setURL($val) {\r
1304                 $this->setSetting('burl',$val);\r
1305         }\r
1306 \r
1307         function setName($val) {\r
1308                 $this->setSetting('bname',$val);\r
1309         }\r
1310 \r
1311         function setShortName($val) {\r
1312                 $this->setSetting('bshortname',$val);\r
1313         }\r
1314 \r
1315         function setCommentsEnabled($val) {\r
1316                 $this->setSetting('bcomments',$val);\r
1317         }\r
1318 \r
1319         function setMaxComments($val) {\r
1320                 $this->setSetting('bmaxcomments',$val);\r
1321         }\r
1322 \r
1323         function setNotifyAddress($val) {\r
1324                 $this->setSetting('bnotify',$val);\r
1325         }\r
1326 \r
1327         function setEmailRequired($val) {\r
1328                 $this->setSetting('breqemail',$val);\r
1329         }\r
1330 \r
1331         function setTimeOffset($val) {\r
1332                 // check validity of value\r
1333                 // 1. replace , by . (common mistake)\r
1334                 $val = str_replace(',','.',$val);\r
1335                 // 2. cast to float or int\r
1336                 if (is_numeric($val) && strstr($val,'.5')) {\r
1337                         $val = (float) $val;\r
1338                 } else {\r
1339                         $val = intval($val);\r
1340                 }\r
1341 \r
1342                 $this->setSetting('btimeoffset',$val);\r
1343         }\r
1344 \r
1345         function setDefaultCategory($val) {\r
1346                 $this->setSetting('bdefcat',$val);\r
1347         }\r
1348 \r
1349         function getSetting($key) {\r
1350                 return $this->settings[$key];\r
1351         }\r
1352 \r
1353         function setSetting($key,$value) {\r
1354                 $this->settings[$key] = $value;\r
1355         }\r
1356 \r
1357         /**\r
1358          * Blog::addTeamMember()\r
1359          * Tries to add a member to the team. \r
1360          * Returns false if the member was already on the team\r
1361          * \r
1362          * @param       Integer $memberid       id for member\r
1363          * @param       Boolean $admin  super-admin or not\r
1364          * @return      Boolean Success/Fail\r
1365          */\r
1366         function addTeamMember($memberid, $admin)\r
1367         {\r
1368                 global $manager;\r
1369                 \r
1370                 $memberid = intval($memberid);\r
1371                 $admin = intval($admin);\r
1372                 \r
1373                 // check if member is already a member\r
1374                 $tmem = Member::createFromID($memberid);\r
1375                 \r
1376                 if ( $tmem->isTeamMember($this->getID()) )\r
1377                 {\r
1378                         return 0;\r
1379                 }\r
1380                 \r
1381                 $manager->notify(\r
1382                         'PreAddTeamMember',\r
1383                         array(\r
1384                                 'blog' => &$this,\r
1385                                 'member' => &$tmem,\r
1386                                 'admin' => &$admin\r
1387                         )\r
1388                 );\r
1389                 \r
1390                 // add to team\r
1391                 $query = "INSERT INTO %s (TMEMBER, TBLOG, TADMIN) ' . 'VALUES (%d, %d, %d)";\r
1392                 $query = sprintf($query, sql_table('team'), $memberid, $this->getID(), $admin);\r
1393                 sql_query($query);\r
1394 \r
1395                 $manager->notify(\r
1396                         'PostAddTeamMember',\r
1397                         array(\r
1398                                 'blog' => &$this,\r
1399                                 'member' => &$tmem,\r
1400                                 'admin' => $admin\r
1401                         )\r
1402                 );\r
1403                 \r
1404                 $logMsg = sprintf(_TEAM_ADD_NEWTEAMMEMBER, $tmem->getDisplayName(), $memberid, $this->getName());\r
1405                 ActionLog::add(INFO, $logMsg);\r
1406                 \r
1407                 return 1;\r
1408         }\r
1409 \r
1410         function getID() {\r
1411                 return (integer) $this->blogid;\r
1412         }\r
1413 \r
1414         /**\r
1415           * Checks if a blog with a given shortname exists \r
1416           * Returns true if there is a blog with the given shortname (static)\r
1417           * \r
1418           * @param $name\r
1419           *     blog shortname\r
1420           */\r
1421         function exists($name) {\r
1422                 $r = sql_query('select * FROM '.sql_table('blog').' WHERE bshortname="'.sql_real_escape_string($name).'"');\r
1423                 return (sql_num_rows($r) != 0);\r
1424         }\r
1425 \r
1426         /**\r
1427           * Checks if a blog with a given id exists \r
1428           * Returns true if there is a blog with the given ID (static)\r
1429           * \r
1430           * @param $id\r
1431           *     blog id\r
1432           */\r
1433         function existsID($id) {\r
1434                 $r = sql_query('select * FROM '.sql_table('blog').' WHERE bnumber='.intval($id));\r
1435                 return (sql_num_rows($r) != 0);\r
1436         }\r
1437 \r
1438         /**\r
1439           * flag there is a future post pending \r
1440           */\r
1441         function setFuturePost() {\r
1442                 $query =  'UPDATE '.sql_table('blog')\r
1443                             . " SET bfuturepost='1' WHERE bnumber=" . $this->getID();\r
1444                 sql_query($query);\r
1445         }\r
1446 \r
1447         /**\r
1448           * clear there is a future post pending \r
1449           */\r
1450         function clearFuturePost() {\r
1451                 $query =  'UPDATE '.sql_table('blog')\r
1452                            . " SET bfuturepost='0' WHERE bnumber=" . $this->getID();\r
1453                 sql_query($query);\r
1454         }\r
1455 \r
1456         /**\r
1457           * check if we should throw justPosted event \r
1458           */\r
1459         function checkJustPosted() {\r
1460                 global $manager;\r
1461 \r
1462                 if ($this->settings['bfuturepost'] == 1) {\r
1463                         $blogid = $this->getID();\r
1464                         $result = sql_query("SELECT * FROM " . sql_table('item')\r
1465                                   . " WHERE iposted=0 AND iblog=" . $blogid . " AND itime<NOW()");\r
1466                         if (sql_num_rows($result) > 0) {\r
1467                                 // This $pinged is allow a plugin to tell other hook to the event that a ping is sent already\r
1468                                 // Note that the plugins's calling order is subject to thri order in the plugin list\r
1469                                 $pinged = false;\r
1470                                 $manager->notify(\r
1471                                                 'JustPosted',\r
1472                                                 array('blogid' => $blogid,\r
1473                                                 'pinged' => &$pinged\r
1474                                                 )\r
1475                                 );\r
1476 \r
1477                                 // clear all expired future posts\r
1478                                 sql_query("UPDATE " . sql_table('item') . " SET iposted='1' WHERE iblog=" . $blogid . " AND itime<NOW()");\r
1479 \r
1480                                 // check to see any pending future post, clear the flag is none\r
1481                                 $result = sql_query("SELECT * FROM " . sql_table('item')\r
1482                                           . " WHERE iposted=0 AND iblog=" . $blogid);\r
1483                                 if (sql_num_rows($result) == 0) {\r
1484                                         $this->clearFuturePost();\r
1485                                 }\r
1486                         }\r
1487                 }\r
1488         }\r
1489 \r
1490         /**\r
1491          * Shows the given list of items for this blog\r
1492          *\r
1493          * @param $itemarray\r
1494          *              array of item numbers to be displayed\r
1495          * @param $template\r
1496          *              String representing the template _NAME_ (!)\r
1497          * @param $highlight\r
1498          *              contains a query that should be highlighted\r
1499          * @param $comments\r
1500          *              1=show comments 0=don't show comments\r
1501          * @param $dateheads\r
1502          *              1=show dateheads 0=don't show dateheads\r
1503          * @param $showDrafts\r
1504          *              0=do not show drafts 1=show drafts\r
1505          * @param $showFuture\r
1506          *              0=do not show future posts 1=show future posts\r
1507          * @returns int\r
1508          *              amount of items shown\r
1509          */\r
1510         function readLogFromList($itemarray, $template, $highlight = '', $comments = 1, $dateheads = 1,$showDrafts = 0, $showFuture = 0) {\r
1511 \r
1512                 $query = $this->getSqlItemList($itemarray,$showDrafts,$showFuture);\r
1513 \r
1514                 return $this->showUsingQuery($template, $query, $highlight, $comments, $dateheads);\r
1515         }\r
1516 \r
1517         /**\r
1518          * Blog::getSqlItemList()\r
1519          * Returns the SQL query used to fill out templates for a list of items\r
1520          * No LIMIT clause is added. (caller should add this if multiple pages are requested)\r
1521          *\r
1522          * @param       array   $itemarray              an array holding the item numbers of the items to be displayed\r
1523          * @param integer       $showDrafts     0=do not show drafts 1=show drafts\r
1524          * @param integer       $showFuture     0=do not show future posts 1=show future posts\r
1525          * @return      string  either a full SQL query, or an empty string\r
1526          * \r
1527          */\r
1528         function getSqlItemList($itemarray,$showDrafts = 0,$showFuture = 0)\r
1529         {\r
1530                 if ( !is_array($itemarray) )\r
1531                 {\r
1532                         return '';\r
1533                 }\r
1534                 \r
1535                 $showDrafts = intval($showDrafts);\r
1536                 $showFuture = intval($showFuture);\r
1537                 $items = array();\r
1538                 \r
1539                 foreach ( $itemarray as $value )\r
1540                 {\r
1541                         if ( intval($value) )\r
1542                         {\r
1543                                 $items[] = intval($value);\r
1544                         }\r
1545                 }\r
1546                 if ( !count($items) )\r
1547                 {\r
1548                         return '';\r
1549                 }\r
1550                 \r
1551                 $i = count($items);\r
1552                 $query = '';\r
1553                 foreach ( $items as $value )\r
1554                 {\r
1555                         $query .= '('\r
1556                                         .       'SELECT'\r
1557                                         .       ' i.inumber as itemid,'\r
1558                                         .       ' i.ititle as title,'\r
1559                                         .       ' i.ibody as body,'\r
1560                                         .       ' m.mname as author,'\r
1561                                         .       ' m.mrealname as authorname,'\r
1562                                         .       ' i.itime,'\r
1563                                         .       ' i.imore as more,'\r
1564                                         .       ' m.mnumber as authorid,'\r
1565                                         .       ' m.memail as authormail,'\r
1566                                         .       ' m.murl as authorurl,'\r
1567                                         .       ' c.cname as category,'\r
1568                                         .       ' i.icat as catid,'\r
1569                                         .       ' i.iclosed as closed';\r
1570                         \r
1571                         $query .= ' FROM '\r
1572                                         . sql_table('item') . ' as i, '\r
1573                                         . sql_table('member') . ' as m, '\r
1574                                         . sql_table('category') . ' as c'\r
1575                                         . ' WHERE'\r
1576                                     .    ' i.iblog='.$this->blogid\r
1577                                    . ' and i.iauthor=m.mnumber'\r
1578                                    . ' and i.icat=c.catid';\r
1579                         \r
1580                         // exclude drafts       \r
1581                         if ( !$showDrafts )\r
1582                         {\r
1583                                 $query .= ' and i.idraft=0';\r
1584                         }\r
1585                         if ( !$showFuture )\r
1586                         {\r
1587                                 // don't show future items\r
1588                                 $query .= " and i.itime<='" . i18n::formatted_datetime('mysql', $this->getCorrectTime()) . "'";\r
1589                         }\r
1590                         \r
1591                         $query .= ' and i.inumber='.intval($value);\r
1592                         $query .= ')';\r
1593                         $i--;\r
1594                         if ($i) $query .= ' UNION ';\r
1595                 }\r
1596                 \r
1597                 return $query;\r
1598         }\r
1599 }\r