OSDN Git Service

Code Cleanup(BLOG.php/ADMIN.php)
[nucleus-jp/nucleus-jp-ancient.git] / utf8 / nucleus / libs / BLOG.php
1 <?php
2
3 /*
4  * Nucleus: PHP/MySQL Weblog CMS (http://nucleuscms.org/)
5  * Copyright (C) 2002-2009 The Nucleus Group
6  *
7  * This program is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU General Public License
9  * as published by the Free Software Foundation; either version 2
10  * of the License, or (at your option) any later version.
11  * (see nucleus/documentation/index.html#license for more info)
12  */
13 /**
14  * A class representing a blog and containing functions to get that blog shown
15  * on the screen
16  *
17  * @license http://nucleuscms.org/license.txt GNU General Public License
18  * @copyright Copyright (C) 2002-2009 The Nucleus Group
19  * @version $Id$
20  * $NucleusJP: BLOG.php,v 1.12.2.2 2007/08/08 05:26:22 kimitake Exp $
21  */
22
23 if ( !function_exists('requestVar') ) exit;
24 require_once dirname(__FILE__) . '/ITEMACTIONS.php';
25
26 class BLOG {
27
28         // blog id
29         var $blogid;
30
31         // ID of currently selected category
32         var $selectedcatid;
33
34         // After creating an object of the blog class, contains true if the BLOG object is
35         // valid (the blog exists)
36         var $isValid;
37
38         // associative array, containing all blogsettings (use the get/set functions instead)
39         var $settings;
40
41         /**
42          * Creates a new BLOG object for the given blog
43          *
44          * @param $id blogid
45          */
46         function BLOG($id) {
47                 $this->blogid = intval($id);
48                 $this->readSettings();
49
50                 // try to set catid
51                 // (the parse functions in SKIN.php will override this, so it's mainly useless)
52                 global $catid;
53                 $this->setSelectedCategory($catid);
54         }
55
56         /**
57          * Shows the given amount of items for this blog
58          *
59          * @param $template
60          *              String representing the template _NAME_ (!)
61          * @param $amountEntries
62          *              amount of entries to show
63          * @param $startpos
64          *              offset from where items should be shown (e.g. 5 = start at fifth item)
65          * @returns int
66          *              amount of items shown
67          */
68         function readLog($template, $amountEntries, $offset = 0, $startpos = 0) {
69                 return $this->readLogAmount($template,$amountEntries,'','',1,1,$offset, $startpos);
70         }
71
72         /**
73          * Shows an archive for a given month
74          *
75          * @param $year
76          *              year
77          * @param $month
78          *              month
79          * @param $template
80          *              String representing the template name to be used
81          */
82         function showArchive($templatename, $year, $month = 0, $day = 0) {
83
84                 // create extra where clause for select query
85                 if ($day == 0 && $month != 0) {
86                         $timestamp_start = mktime(0,0,0,$month,1,$year);
87                         $timestamp_end = mktime(0,0,0,$month+1,1,$year);  // also works when $month==12
88                 } elseif ($month == 0) {
89                         $timestamp_start = mktime(0,0,0,1,1,$year);
90                         $timestamp_end = mktime(0,0,0,12,31,$year);  // also works when $month==12
91                 } else {
92                         $timestamp_start = mktime(0,0,0,$month,$day,$year);
93                         $timestamp_end = mktime(0,0,0,$month,$day+1,$year);
94                 }
95                 $extra_query = ' and i.itime>=' . mysqldate($timestamp_start)
96                                          . ' and i.itime<' . mysqldate($timestamp_end);
97
98
99                 $this->readLogAmount($templatename,0,$extra_query,'',1,1);
100
101         }
102
103
104         // sets/gets current category (only when category exists)
105         function setSelectedCategory($catid) {
106                 if ($this->isValidCategory($catid) || (intval($catid) == 0))
107                         $this->selectedcatid = intval($catid);
108         }
109
110         function setSelectedCategoryByName($catname) {
111                 $this->setSelectedCategory($this->getCategoryIdFromName($catname));
112         }
113
114         function getSelectedCategory() {
115                 return $this->selectedcatid;
116         }
117
118         /**
119          * Shows the given amount of items for this blog
120          *
121          * @param $template
122          *              String representing the template _NAME_ (!)
123          * @param $amountEntries
124          *              amount of entries to show (0 = no limit)
125          * @param $extraQuery
126          *              extra conditions to be added to the query
127          * @param $highlight
128          *              contains a query that should be highlighted
129          * @param $comments
130          *              1=show comments 0=don't show comments
131          * @param $dateheads
132          *              1=show dateheads 0=don't show dateheads
133          * @param $offset
134          *              offset
135          * @returns int
136          *              amount of items shown
137          */
138         function readLogAmount($template, $amountEntries, $extraQuery, $highlight, $comments, $dateheads, $offset = 0, $startpos = 0) {
139
140                 $query = $this->getSqlBlog($extraQuery);
141
142                 if ($amountEntries > 0) {
143                                 // $offset zou moeten worden:
144                                 // (($startpos / $amountentries) + 1) * $offset ... later testen ...
145                            $query .= ' LIMIT ' . intval($startpos + $offset).',' . intval($amountEntries);
146                 }
147                 return $this->showUsingQuery($template, $query, $highlight, $comments, $dateheads);
148         }
149
150         function showUsingQuery($templateName, $query, $highlight = '', $comments = 0, $dateheads = 1) {
151                 global $CONF, $manager;
152
153                 $lastVisit = cookieVar($CONF['CookiePrefix'] .'lastVisit');
154                 if ($lastVisit != 0)
155                         $lastVisit = $this->getCorrectTime($lastVisit);
156
157                 // set templatename as global variable (so plugins can access it)
158                 global $currentTemplateName;
159                 $currentTemplateName = $templateName;
160
161                 $template =& $manager->getTemplate($templateName);
162
163                 // create parser object & action handler
164                 $actions =& new ITEMACTIONS($this);
165                 $parser =& new PARSER($actions->getDefinedActions(),$actions);
166                 $actions->setTemplate($template);
167                 $actions->setHighlight($highlight);
168                 $actions->setLastVisit($lastVisit);
169                 $actions->setParser($parser);
170                 $actions->setShowComments($comments);
171
172                 // execute query
173                 $items = sql_query($query);
174
175                 // loop over all items
176                 $old_date = 0;
177                 while ($item = sql_fetch_object($items)) {
178
179                         $item->timestamp = strtotime($item->itime);     // string timestamp -> unix timestamp
180
181                         // action handler needs to know the item we're handling
182                         $actions->setCurrentItem($item);
183
184                         // add date header if needed
185                         if ($dateheads) {
186                                 $new_date = date('dFY',$item->timestamp);
187                                 if ($new_date != $old_date) {
188                                         // unless this is the first time, write date footer
189                                         $timestamp = $item->timestamp;
190                                         if ($old_date != 0) {
191                                                 $oldTS = strtotime($old_date);
192                                                 $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => $oldTS));
193                                                 $tmp_footer = strftime(isset($template['DATE_FOOTER'])?$template['DATE_FOOTER']:'', $oldTS);
194                                                 $parser->parse($tmp_footer);
195                                                 $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => $oldTS));
196                                         }
197                                         $manager->notify('PreDateHead',array('blog' => &$this, 'timestamp' => $timestamp));
198                                         // note, to use templatvars in the dateheader, the %-characters need to be doubled in
199                                         // order to be preserved by strftime
200                                         $tmp_header = strftime((isset($template['DATE_HEADER']) ? $template['DATE_HEADER'] : null), $timestamp);
201                                         $parser->parse($tmp_header);
202                                         $manager->notify('PostDateHead',array('blog' => &$this, 'timestamp' => $timestamp));
203                                 }
204                                 $old_date = $new_date;
205                         }
206
207                         // parse item
208                         $parser->parse($template['ITEM_HEADER']);
209                         $manager->notify('PreItem', array('blog' => &$this, 'item' => &$item));
210                         $parser->parse($template['ITEM']);
211                         $manager->notify('PostItem', array('blog' => &$this, 'item' => &$item));
212                         $parser->parse($template['ITEM_FOOTER']);
213
214                 }
215
216                 $numrows = sql_num_rows($items);
217
218                 // add another date footer if there was at least one item
219                 if (($numrows > 0) && $dateheads) {
220                         $manager->notify('PreDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));
221                         $parser->parse($template['DATE_FOOTER']);
222                         $manager->notify('PostDateFoot',array('blog' => &$this, 'timestamp' => strtotime($old_date)));
223                 }
224
225                 sql_free_result($items);        // free memory
226
227                 return $numrows;
228
229         }
230
231         function showOneitem($itemid, $template, $highlight) {
232                 $extraQuery = ' and inumber=' . intval($itemid);
233
234                 return $this->readLogAmount($template, 1, $extraQuery, $highlight, 0, 0);
235         }
236
237
238         /**
239           * Adds an item to this blog
240           */
241         function additem($catid, $title, $body, $more, $blogid, $authorid, $timestamp, $closed, $draft, $posted='1') {
242                 global $manager;
243
244                 $blogid         = intval($blogid);
245                 $authorid       = intval($authorid);
246                 $title          = $title;
247                 $body           = $body;
248                 $more           = $more;
249                 $catid          = intval($catid);
250
251                 // convert newlines to <br />
252                 if ($this->convertBreaks()) {
253                         $body = addBreaks($body);
254                         $more = addBreaks($more);
255                 }
256
257                 if ($closed != '1') $closed = '0';
258                 if ($draft != '0') $draft = '1';
259
260                 if (!$this->isValidCategory($catid))
261                         $catid = $this->getDefaultCategory();
262
263                 if ($timestamp > $this->getCorrectTime())
264                         $isFuture = 1;
265
266                 $timestamp = date('Y-m-d H:i:s',$timestamp);
267
268                 $manager->notify('PreAddItem',array('title' => &$title, 'body' => &$body, 'more' => &$more, 'blog' => &$this, 'authorid' => &$authorid, 'timestamp' => &$timestamp, 'closed' => &$closed, 'draft' => &$draft, 'catid' => &$catid));
269
270                 $title = addslashes($title);
271                 $body = addslashes($body);
272                 $more = addslashes($more);
273
274                 $query = 'INSERT INTO '.sql_table('item').' (ITITLE, IBODY, IMORE, IBLOG, IAUTHOR, ITIME, ICLOSED, IDRAFT, ICAT, IPOSTED) '
275                            . "VALUES ('$title', '$body', '$more', $blogid, $authorid, '$timestamp', $closed, $draft, $catid, $posted)";
276                 sql_query($query);
277                 $itemid = sql_insert_id();
278
279                 $manager->notify('PostAddItem',array('itemid' => $itemid));
280
281                 if (!$draft)
282                         $this->updateUpdateFile();
283
284                 // send notification mail
285                 if (!$draft && !$isFuture && $this->getNotifyAddress() && $this->notifyOnNewItem())
286                         $this->sendNewItemNotification($itemid, stripslashes($title), stripslashes($body));
287
288                 return $itemid;
289         }
290
291         function sendNewItemNotification($itemid, $title, $body) {
292                 global $CONF, $member;
293
294                 // create text version of html post
295                 $ascii = toAscii($body);
296
297                 $mailto_msg = _NOTIFY_NI_MSG . " \n";
298 //              $mailto_msg .= $CONF['IndexURL'] . 'index.php?itemid=' . $itemid . "\n\n";
299                 $temp = parse_url($CONF['Self']);
300                 if ($temp['scheme']) {
301                         $mailto_msg .= createItemLink($itemid) . "\n\n";
302                 } else {
303                         $tempurl = $this->getURL();
304                         if (substr($tempurl, -1) == '/' || substr($tempurl, -4) == '.php') {
305                                 $mailto_msg .= $tempurl . '?itemid=' . $itemid . "\n\n";
306                         } else {
307                                 $mailto_msg .= $tempurl . '/?itemid=' . $itemid . "\n\n";
308                         }
309                 }
310                 $mailto_msg .= _NOTIFY_TITLE . ' ' . strip_tags($title) . "\n";
311                 $mailto_msg .= _NOTIFY_CONTENTS . "\n " . $ascii . "\n";
312                 $mailto_msg .= getMailFooter();
313
314                 $mailto_title = $this->getName() . ': ' . _NOTIFY_NI_TITLE;
315
316                 $frommail = $member->getNotifyFromMailAddress();
317
318                 $notify =& new NOTIFICATION($this->getNotifyAddress());
319                 $notify->notify($mailto_title, $mailto_msg , $frommail);
320
321
322
323         }
324
325
326         /**
327           * Creates a new category for this blog
328           *
329           * @param $catName
330           *             name of the new category. When empty, a name is generated automatically
331           *             (starting with newcat)
332           * @param $catDescription
333           *             description of the new category. Defaults to 'New Category'
334           *
335           * @returns
336           *             the new category-id in case of success.
337           *             0 on failure
338           */
339         function createNewCategory($catName = '', $catDescription = _CREATED_NEW_CATEGORY_DESC) {
340                 global $member, $manager;
341
342                 if ($member->blogAdminRights($this->getID())) {
343                         // generate
344                         if ($catName == '')
345                         {
346                                 $catName = _CREATED_NEW_CATEGORY_NAME;
347                                 $i = 1;
348
349                                 $res = sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID());
350                                 while (sql_num_rows($res) > 0)
351                                 {
352                                         $i++;
353                                         $res = sql_query('SELECT * FROM '.sql_table('category')." WHERE cname='".$catName.$i."' and cblog=".$this->getID());
354                                 }
355
356                                 $catName = $catName . $i;
357                         }
358
359                         $manager->notify(
360                                 'PreAddCategory',
361                                 array(
362                                         'blog' => &$this,
363                                         'name' => &$catName,
364                                         'description' => $catDescription
365                                 )
366                         );
367
368                         $query = 'INSERT INTO '.sql_table('category').' (cblog, cname, cdesc) VALUES (' . $this->getID() . ", '" . addslashes($catName) . "', '" . addslashes($catDescription) . "')";
369                         sql_query($query);
370                         $catid = sql_insert_id();
371
372                         $manager->notify(
373                                 'PostAddCategory',
374                                 array(
375                                         'blog' => &$this,
376                                         'name' => $catName,
377                                         'description' => $catDescription,
378                                         'catid' => $catid
379                                 )
380                         );
381
382                         return $catid;
383                 } else {
384                         return 0;
385                 }
386
387         }
388
389
390         /**
391          * Searches all months of this blog for the given query
392          *
393          * @param $query
394          *              search query
395          * @param $template
396          *              template to be used (__NAME__ of the template)
397          * @param $amountMonths
398          *              max amount of months to be search (0 = all)
399          * @param $maxresults
400          *              max number of results to show
401          * @param $startpos
402          *              offset
403          * @returns
404          *              amount of hits found
405          */
406         function search($query, $template, $amountMonths, $maxresults, $startpos) {
407                 global $CONF, $manager;
408
409                 $highlight      = '';
410                 $sqlquery       = $this->getSqlSearch($query, $amountMonths, $highlight);
411
412                 if ($sqlquery == '')
413                 {
414                         // no query -> show everything
415                         $extraquery = '';
416                         $amountfound = $this->readLogAmount($template, $maxresults, $extraQuery, $query, 1, 1);
417                 } else {
418
419                         // add LIMIT to query (to split search results into pages)
420                         if (intval($maxresults > 0))
421                                 $sqlquery .= ' LIMIT ' . intval($startpos).',' . intval($maxresults);
422
423                         // show results
424                         $amountfound = $this->showUsingQuery($template, $sqlquery, $highlight, 1, 1);
425
426                         // when no results were found, show a message
427                         if ($amountfound == 0)
428                         {
429                                 $template =& $manager->getTemplate($template);
430                                 $vars = array(
431                                         'query'         => htmlspecialchars($query),
432                                         'blogid'        => $this->getID()
433                                 );
434                                 echo TEMPLATE::fill($template['SEARCH_NOTHINGFOUND'],$vars);
435                         }
436                 }
437
438                 return $amountfound;
439         }
440
441         /**
442          * Returns an SQL query to use for a search query
443          *
444          * @param $query
445          *              search query
446          * @param $amountMonths
447          *              amount of months to search back. Default = 0 = unlimited
448          * @param $mode
449          *              either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query
450          * @returns $highlight
451          *              words to highlight (out parameter)
452          * @returns
453          *              either a full SQL query, or an empty string (if querystring empty)
454          * @note
455          *              No LIMIT clause is added. (caller should add this if multiple pages are requested)
456          */
457         function getSqlSearch($query, $amountMonths = 0, &$highlight, $mode = '')
458         {
459                 $searchclass =& new SEARCH($query);
460
461                 $highlight        = $searchclass->inclusive;
462
463                 // if querystring is empty, return empty string
464                 if ($searchclass->inclusive == '')
465                         return '';
466
467
468                 $where  = $searchclass->boolean_sql_where('ititle,ibody,imore');
469                 $select = $searchclass->boolean_sql_select('ititle,ibody,imore');
470
471                 // get list of blogs to search
472                 $blogs          = $searchclass->blogs;          // array containing blogs that always need to be included
473                 $blogs[]        = $this->getID();                       // also search current blog (duh)
474                 $blogs          = array_unique($blogs);         // remove duplicates
475                 $selectblogs = '';
476                 if (count($blogs) > 0)
477                         $selectblogs = ' and i.iblog in (' . implode(',', $blogs) . ')';
478
479                 if ($mode == '')
480                 {
481                         $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed';
482                         if ($select)
483                                 $query .= ', '.$select. ' as score ';
484                 } else {
485                         $query = 'SELECT COUNT(*) as result ';
486                 }
487
488                 $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c'
489                            . ' WHERE i.iauthor=m.mnumber'
490                            . ' and i.icat=c.catid'
491                            . ' and i.idraft=0'  // exclude drafts
492                            . $selectblogs
493                                         // don't show future items
494                            . ' and i.itime<=' . mysqldate($this->getCorrectTime())
495                            . ' and '.$where;
496
497                 // take into account amount of months to search
498                 if ($amountMonths > 0)
499                 {
500                         $localtime = getdate($this->getCorrectTime());
501                         $timestamp_start = mktime(0,0,0,$localtime['mon'] - $amountMonths,1,$localtime['year']);
502                         $query .= ' and i.itime>' . mysqldate($timestamp_start);
503                 }
504
505                 if ($mode == '')
506                 {
507                         if ($select)
508                                 $query .= ' ORDER BY score DESC';
509                         else
510                                 $query .= ' ORDER BY i.itime DESC ';
511                 }
512
513                 return $query;
514         }
515
516         /**
517          * Returns the SQL query that's normally used to display the blog items on the index type skins
518          *
519          * @param $mode
520          *              either empty, or 'count'. In this case, the query will be a SELECT COUNT(*) query
521          * @returns
522          *              either a full SQL query, or an empty string
523          * @note
524          *              No LIMIT clause is added. (caller should add this if multiple pages are requested)
525          */
526         function getSqlBlog($extraQuery, $mode = '')
527         {
528                 if ($mode == '')
529                         $query = 'SELECT i.inumber as itemid, i.ititle as title, i.ibody as body, m.mname as author, m.mrealname as authorname, i.itime, i.imore as more, m.mnumber as authorid, m.memail as authormail, m.murl as authorurl, c.cname as category, i.icat as catid, i.iclosed as closed';
530                 else
531                         $query = 'SELECT COUNT(*) as result ';
532
533                 $query .= ' FROM '.sql_table('item').' as i, '.sql_table('member').' as m, '.sql_table('category').' as c'
534                            . ' WHERE i.iblog='.$this->blogid
535                            . ' and i.iauthor=m.mnumber'
536                            . ' and i.icat=c.catid'
537                            . ' and i.idraft=0'  // exclude drafts
538                                         // don't show future items
539                            . ' and i.itime<=' . mysqldate($this->getCorrectTime());
540
541                 if ($this->getSelectedCategory())
542                         $query .= ' and i.icat=' . $this->getSelectedCategory() . ' ';
543
544
545                 $query .= $extraQuery;
546
547                 if ($mode == '')
548                         $query .= ' ORDER BY i.itime DESC';
549
550                 return $query;
551         }
552
553         /**
554           * Shows the archivelist using the given template
555           */
556         function showArchiveList($template, $mode = 'month', $limit = 0) {
557                 global $CONF, $catid, $manager;
558
559                 if (!isset ($linkparams)) {
560                 $linkparams = array();
561                 }
562
563                 if ($catid) {
564                         $linkparams = array('catid' => $catid);
565                 }
566
567                 $template =& $manager->getTemplate($template);
568                 $data['blogid'] = $this->getID();
569
570                 echo TEMPLATE::fill($template['ARCHIVELIST_HEADER'],$data);
571
572                 $query = 'SELECT itime, SUBSTRING(itime,1,4) AS Year, SUBSTRING(itime,6,2) AS Month, SUBSTRING(itime,9,2) as Day FROM '.sql_table('item')
573                 . ' WHERE iblog=' . $this->getID()
574                 . ' and itime <=' . mysqldate($this->getCorrectTime())  // don't show future items!
575                 . ' and idraft=0'; // don't show draft items
576
577                 if ($catid)
578                         $query .= ' and icat=' . intval($catid);
579
580                 $query .= ' GROUP BY Year';
581                 if ($mode == 'month' || $mode == 'day')
582                         $query .= ', Month';
583                 if ($mode == 'day')
584                         $query .= ', Day';
585
586                 $query .= ' ORDER BY itime DESC';
587
588                 if ($limit > 0)
589                         $query .= ' LIMIT ' . intval($limit);
590
591                 $res = sql_query($query);
592
593                 while ($current = sql_fetch_object($res)) {
594                         $current->itime = strtotime($current->itime);   // string time -> unix timestamp
595
596                         if ($mode == 'day') {
597                                 $archivedate      = date('Y-m-d',$current->itime);
598                                 $archive['day']   = date('d',$current->itime);
599                                 $data['day']      = date('d',$current->itime);
600                                 $data['month']    = date('m',$current->itime);
601                                 $archive['month'] = $data['month'];
602                         } elseif ($mode == 'year') {
603                                 $archivedate      = date('Y',$current->itime);
604                                 $data['day']      = '';
605                                 $data['month']    = '';
606                                 $archive['day']   = '';
607                                 $archive['month'] = '';
608                         } else {
609                                 $archivedate = date('Y-m',$current->itime);
610                                 $data['month'] = date('m',$current->itime);
611                                 $archive['month'] = $data['month'];
612                                 $data['day'] = '';
613                                 $archive['day'] = '';
614                         }
615
616                         $data['year'] = date('Y',$current->itime);
617                         $archive['year'] = $data['year'];
618                         $data['archivelink'] = createArchiveLink($this->getID(),$archivedate,$linkparams);
619
620                         $manager->notify(
621                                 'PreArchiveListItem',
622                                 array(
623                                         'listitem' => &$data
624                                 )
625                         );
626
627                         $temp = TEMPLATE::fill($template['ARCHIVELIST_LISTITEM'],$data);
628                         echo strftime($temp,$current->itime);
629
630                 }
631
632                 sql_free_result($res);
633
634                 echo TEMPLATE::fill($template['ARCHIVELIST_FOOTER'],$data);
635         }
636
637
638         /**
639           * Shows the list of categories using a given template
640           */
641         function showCategoryList($template) {
642                 global $CONF, $manager;
643
644                 // determine arguments next to catids
645                 // I guess this can be done in a better way, but it works
646                 global $archive, $archivelist;
647
648                 $linkparams = array();
649                 if ($archive) {
650                         $blogurl = createArchiveLink($this->getID(), $archive, '');
651                         $linkparams['blogid'] = $this->getID();
652                         $linkparams['archive'] = $archive;
653                 } else if ($archivelist) {
654                         $blogurl = createArchiveListLink($this->getID(), '');
655                         $linkparams['archivelist'] = $archivelist;
656                 } else {
657                         $blogurl = createBlogidLink($this->getID(), '');
658                         $linkparams['blogid'] = $this->getID();
659                 }
660
661                 //$blogurl = $this->getURL() . $qargs;
662                 //$blogurl = createBlogLink($this->getURL(), $linkparams);
663
664                 $template =& $manager->getTemplate($template);
665
666                 echo TEMPLATE::fill((isset($template['CATLIST_HEADER']) ? $template['CATLIST_HEADER'] : null),
667                                                         array(
668                                                                 'blogid' => $this->getID(),
669                                                                 'blogurl' => $blogurl,
670                                                                 'self' => $CONF['Self']
671                                                         ));
672
673                 $query = 'SELECT catid, cdesc as catdesc, cname as catname FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' ORDER BY cname ASC';
674                 $res = sql_query($query);
675
676
677                 while ($data = sql_fetch_assoc($res)) {
678                         $data['blogid'] = $this->getID();
679                         $data['blogurl'] = $blogurl;
680                         $data['catlink'] = createLink(
681                                                                 'category',
682                                                                 array(
683                                                                         'catid' => $data['catid'],
684                                                                         'name' => $data['catname'],
685                                                                         'extra' => $linkparams
686                                                                 )
687                                                            );
688                         $data['self'] = $CONF['Self'];
689
690                         $manager->notify(
691                                 'PreCategoryListItem',
692                                 array(
693                                         'listitem' => &$data
694                                 )
695                         );
696
697                         echo TEMPLATE::fill((isset($template['CATLIST_LISTITEM']) ? $template['CATLIST_LISTITEM'] : null), $data);
698                         //$temp = TEMPLATE::fill((isset($template['CATLIST_LISTITEM']) ? $template['CATLIST_LISTITEM'] : null), $data);
699                         //echo strftime($temp, $current->itime);
700
701                 }
702
703                 sql_free_result($res);
704
705                 echo TEMPLATE::fill((isset($template['CATLIST_FOOTER']) ? $template['CATLIST_FOOTER'] : null),
706                                                         array(
707                                                                 'blogid' => $this->getID(),
708                                                                 'blogurl' => $blogurl,
709                                                                 'self' => $CONF['Self']
710                                                         ));
711         }
712
713         /**
714           * Shows a list of all blogs in the system using a given template
715           * ordered by  number, name, shortname or description
716           * in ascending or descending order
717           */
718         function showBlogList($template, $bnametype, $orderby, $direction) {
719                 global $CONF, $manager;
720
721                 switch ($orderby) {
722                         case 'number':
723                                 $orderby='bnumber';
724                                 break;
725                         case 'name':
726                                 $orderby='bname';
727                                 break;
728                         case 'shortname':
729                                 $orderby='bshortname';
730                                 break;
731                         case 'description':
732                                 $orderby='bdesc';
733                                 break;
734                         default:
735                                 $orderby='bnumber';
736                                 break;
737                 }
738
739                 $direction=strtolower($direction);
740                 switch ($direction) {
741                         case 'asc':
742                                 $direction='ASC';
743                                 break;
744                         case 'desc':
745                                 $direction='DESC';
746                                 break;
747                         default:
748                                 $direction='ASC';
749                                 break;
750                 }
751
752                 $template =& $manager->getTemplate($template);
753
754                 echo TEMPLATE::fill((isset($template['BLOGLIST_HEADER']) ? $template['BLOGLIST_HEADER'] : null),
755                                                         array(
756                                                                 'sitename' => $CONF['SiteName'],
757                                                                 'siteurl' => $CONF['IndexURL']
758                                                         ));
759
760                 $query = 'SELECT bnumber, bname, bshortname, bdesc, burl FROM '.sql_table('blog').' ORDER BY '.$orderby.' '.$direction;
761                 $res = sql_query($query);
762
763                 while ($data = sql_fetch_assoc($res)) {
764
765                         $list = array();
766
767 //                      $list['bloglink'] = createLink('blog', array('blogid' => $data['bnumber']));
768                         $list['bloglink'] = createBlogidLink($data['bnumber']);
769
770                         $list['blogdesc'] = $data['bdesc'];
771
772                         $list['blogurl'] = $data['burl'];
773
774                         if ($bnametype=='shortname') {
775                                 $list['blogname'] = $data['bshortname'];
776                         }
777                         else { // all other cases
778                                 $list['blogname'] = $data['bname'];
779                         }
780
781                         $manager->notify(
782                                 'PreBlogListItem',
783                                 array(
784                                         'listitem' => &$list
785                                 )
786                         );
787
788                         echo TEMPLATE::fill((isset($template['BLOGLIST_LISTITEM']) ? $template['BLOGLIST_LISTITEM'] : null), $list);
789
790                 }
791
792                 sql_free_result($res);
793
794                 echo TEMPLATE::fill((isset($template['BLOGLIST_FOOTER']) ? $template['BLOGLIST_FOOTER'] : null),
795                                                         array(
796                                                                 'sitename' => $CONF['SiteName'],
797                                                                 'siteurl' => $CONF['IndexURL']
798                                                         ));
799
800         }
801
802         /**
803           * Blogsettings functions
804           */
805
806         function readSettings() {
807                 $query =  'SELECT *'
808                            . ' FROM '.sql_table('blog')
809                            . ' WHERE bnumber=' . $this->blogid;
810                 $res = sql_query($query);
811
812                 $this->isValid = (sql_num_rows($res) > 0);
813                 if (!$this->isValid)
814                         return;
815
816                 $this->settings = sql_fetch_assoc($res);
817         }
818
819         function writeSettings() {
820
821                 // (can't use floatval since not available prior to PHP 4.2)
822                 $offset = $this->getTimeOffset();
823                 if (!is_float($offset))
824                         $offset = intval($offset);
825
826                 $query =  'UPDATE '.sql_table('blog')
827                            . " SET bname='" . addslashes($this->getName()) . "',"
828                            . "     bshortname='". addslashes($this->getShortName()) . "',"
829                            . "     bcomments=". intval($this->commentsEnabled()) . ","
830                            . "     bmaxcomments=" . intval($this->getMaxComments()) . ","
831                            . "     btimeoffset=" . $offset . ","
832                            . "     bpublic=" . intval($this->isPublic()) . ","
833                            . "     breqemail=" . intval($this->emailRequired()) . ","
834                            . "     bconvertbreaks=" . intval($this->convertBreaks()) . ","
835                            . "     ballowpast=" . intval($this->allowPastPosting()) . ","
836                            . "     bnotify='" . addslashes($this->getNotifyAddress()) . "',"
837                            . "     bnotifytype=" . intval($this->getNotifyType()) . ","
838                            . "     burl='" . addslashes($this->getURL()) . "',"
839                            . "     bupdate='" . addslashes($this->getUpdateFile()) . "',"
840                            . "     bdesc='" . addslashes($this->getDescription()) . "',"
841                            . "     bdefcat=" . intval($this->getDefaultCategory()) . ","
842                            . "     bdefskin=" . intval($this->getDefaultSkin()) . ","
843                            . "     bincludesearch=" . intval($this->getSearchable())
844                            . " WHERE bnumber=" . intval($this->getID());
845                 sql_query($query);
846
847         }
848
849
850
851         // update update file if requested
852         function updateUpdatefile() {
853                  if ($this->getUpdateFile()) {
854                         $f_update = fopen($this->getUpdateFile(),'w');
855                         fputs($f_update,$this->getCorrectTime());
856                         fclose($f_update);
857                  }
858
859         }
860
861         function isValidCategory($catid) {
862                 $query = 'SELECT * FROM '.sql_table('category').' WHERE cblog=' . $this->getID() . ' and catid=' . intval($catid);
863                 $res = sql_query($query);
864                 return (sql_num_rows($res) != 0);
865         }
866
867         function getCategoryName($catid) {
868                 $res = sql_query('SELECT cname FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));
869                 $o = sql_fetch_object($res);
870                 return $o->cname;
871         }
872
873         function getCategoryDesc($catid) {
874                 $res = sql_query('SELECT cdesc FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and catid=' . intval($catid));
875                 $o = sql_fetch_object($res);
876                 return $o->cdesc;
877         }
878
879         function getCategoryIdFromName($name) {
880                 $res = sql_query('SELECT catid FROM '.sql_table('category').' WHERE cblog='.$this->getID().' and cname="' . addslashes($name) . '"');
881                 if (sql_num_rows($res) > 0) {
882                         $o = sql_fetch_object($res);
883                         return $o->catid;
884                 } else {
885                         return $this->getDefaultCategory();
886                 }
887         }
888
889         function convertBreaks() {
890                 return $this->getSetting('bconvertbreaks');
891         }
892
893         function insertJavaScriptInfo($authorid = '') {
894                 global $member, $CONF;
895
896                 if ($authorid == '')
897                         $authorid = $member->getID();
898
899                 ?>
900                 <script type="text/javascript">
901                         setConvertBreaks(<?php echo  $this->convertBreaks() ? 'true' : 'false' ?>);
902                         setMediaUrl("<?php echo $CONF['MediaURL']?>");
903                         setAuthorId(<?php echo $authorid?>);
904                 </script><?php  }
905
906         function setConvertBreaks($val) {
907                 $this->setSetting('bconvertbreaks',$val);
908         }
909         function setAllowPastPosting($val) {
910                 $this->setSetting('ballowpast',$val);
911         }
912         function allowPastPosting() {
913                 return $this->getSetting('ballowpast');
914         }
915
916         function getCorrectTime($t=0) {
917                 if ($t == 0) $t = time();
918                 return ($t + 3600 * $this->getTimeOffset());
919         }
920
921         function getName() {
922                 return $this->getSetting('bname');
923         }
924
925         function getShortName() {
926                 return $this->getSetting('bshortname');
927         }
928
929         function getMaxComments() {
930                 return $this->getSetting('bmaxcomments');
931         }
932
933         function getNotifyAddress() {
934                 return $this->getSetting('bnotify');
935         }
936
937         function getNotifyType() {
938                 return $this->getSetting('bnotifytype');
939         }
940
941         function notifyOnComment() {
942                 $n = $this->getNotifyType();
943                 return (($n != 0) && (($n % 3) == 0));
944         }
945
946         function notifyOnVote() {
947                 $n = $this->getNotifyType();
948                 return (($n != 0) && (($n % 5) == 0));
949         }
950
951         function notifyOnNewItem() {
952                 $n = $this->getNotifyType();
953                 return (($n != 0) && (($n % 7) == 0));
954         }
955
956         function setNotifyType($val) {
957                 $this->setSetting('bnotifytype',$val);
958         }
959
960
961         function getTimeOffset() {
962                 return $this->getSetting('btimeoffset');
963         }
964
965         function commentsEnabled() {
966                 return $this->getSetting('bcomments');
967         }
968
969         function getURL() {
970                 return $this->getSetting('burl');
971         }
972
973         function getDefaultSkin() {
974                 return $this->getSetting('bdefskin');
975         }
976
977         function getUpdateFile() {
978                 return $this->getSetting('bupdate');
979         }
980
981         function getDescription() {
982                 return $this->getSetting('bdesc');
983         }
984
985         function isPublic() {
986                 return $this->getSetting('bpublic');
987         }
988
989         function emailRequired() {
990                 return $this->getSetting('breqemail');
991         }
992
993         function getSearchable() {
994                 return $this->getSetting('bincludesearch');
995         }
996
997         function getDefaultCategory() {
998                 return $this->getSetting('bdefcat');
999         }
1000
1001         function setPublic($val) {
1002                 $this->setSetting('bpublic',$val);
1003         }
1004
1005         function setSearchable($val) {
1006                 $this->setSetting('bincludesearch',$val);
1007         }
1008
1009         function setDescription($val) {
1010                 $this->setSetting('bdesc',$val);
1011         }
1012
1013         function setUpdateFile($val) {
1014                 $this->setSetting('bupdate',$val);
1015         }
1016
1017         function setDefaultSkin($val) {
1018                 $this->setSetting('bdefskin',$val);
1019         }
1020
1021         function setURL($val) {
1022                 $this->setSetting('burl',$val);
1023         }
1024
1025         function setName($val) {
1026                 $this->setSetting('bname',$val);
1027         }
1028
1029         function setShortName($val) {
1030                 $this->setSetting('bshortname',$val);
1031         }
1032
1033         function setCommentsEnabled($val) {
1034                 $this->setSetting('bcomments',$val);
1035         }
1036
1037         function setMaxComments($val) {
1038                 $this->setSetting('bmaxcomments',$val);
1039         }
1040
1041         function setNotifyAddress($val) {
1042                 $this->setSetting('bnotify',$val);
1043         }
1044
1045         function setEmailRequired($val) {
1046                 $this->setSetting('breqemail',$val);
1047         }
1048
1049         function setTimeOffset($val) {
1050                 // check validity of value
1051                 // 1. replace , by . (common mistake)
1052                 $val = str_replace(',','.',$val);
1053                 // 2. cast to float or int
1054                 if (is_numeric($val) && strstr($val,'.5')) {
1055                         $val = (float) $val;
1056                 } else {
1057                         $val = intval($val);
1058                 }
1059
1060                 $this->setSetting('btimeoffset',$val);
1061         }
1062
1063         function setDefaultCategory($val) {
1064                 $this->setSetting('bdefcat',$val);
1065         }
1066
1067         function getSetting($key) {
1068                 return $this->settings[$key];
1069         }
1070
1071         function setSetting($key,$value) {
1072                 $this->settings[$key] = $value;
1073         }
1074
1075
1076         // tries to add a member to the team. Returns false if the member was already on
1077         // the team
1078         function addTeamMember($memberid, $admin) {
1079                 global $manager;
1080
1081                 $memberid = intval($memberid);
1082                 $admin = intval($admin);
1083
1084                 // check if member is already a member
1085                 $tmem = MEMBER::createFromID($memberid);
1086
1087                 if ($tmem->isTeamMember($this->getID()))
1088                         return 0;
1089
1090                 $manager->notify(
1091                         'PreAddTeamMember',
1092                         array(
1093                                 'blog' => &$this,
1094                                 'member' => &$tmem,
1095                                 'admin' => &$admin
1096                         )
1097                 );
1098
1099                 // add to team
1100                 $query = 'INSERT INTO '.sql_table('team').' (TMEMBER, TBLOG, TADMIN) '
1101                            . 'VALUES (' . $memberid .', '.$this->getID().', "'.$admin.'")';
1102                 sql_query($query);
1103
1104                 $manager->notify(
1105                         'PostAddTeamMember',
1106                         array(
1107                                 'blog' => &$this,
1108                                 'member' => &$tmem,
1109                                 'admin' => $admin
1110                         )
1111
1112                 );
1113
1114                 $logMsg = sprintf(_TEAM_ADD_NEWTEAMMEMBER, $tmem->getDisplayName(), $memberid, $this->getName());
1115                 ACTIONLOG::add(INFO, $logMsg);
1116
1117                 return 1;
1118         }
1119
1120         function getID() {
1121                 return intVal($this->blogid);
1122         }
1123
1124         // returns true if there is a blog with the given shortname (static)
1125         function exists($name) {
1126                 $r = sql_query('select * FROM '.sql_table('blog').' WHERE bshortname="'.addslashes($name).'"');
1127                 return (sql_num_rows($r) != 0);
1128         }
1129
1130         // returns true if there is a blog with the given ID (static)
1131         function existsID($id) {
1132                 $r = sql_query('select * FROM '.sql_table('blog').' WHERE bnumber='.intval($id));
1133                 return (sql_num_rows($r) != 0);
1134         }
1135
1136         // flag there is a future post pending
1137         function setFuturePost() {
1138                 $query =  'UPDATE '.sql_table('blog')
1139                            . " SET bfuturepost='1' WHERE bnumber=" . $this->getID();
1140                 sql_query($query);
1141         }
1142
1143         // clear there is a future post pending
1144         function clearFuturePost() {
1145                 $query =  'UPDATE '.sql_table('blog')
1146                            . " SET bfuturepost='0' WHERE bnumber=" . $this->getID();
1147                 sql_query($query);
1148         }
1149
1150         // check if we should throw justPosted event
1151         function checkJustPosted() {
1152                 global $manager;
1153
1154                 if ($this->settings['bfuturepost'] == 1) {
1155                         $blogid = $this->getID();
1156                         $result = sql_query("SELECT * FROM " . sql_table('item')
1157                                   . " WHERE iposted=0 AND iblog=" . $blogid . " AND itime<NOW()");
1158                         if (sql_num_rows($result) > 0) {
1159                                 // This $pinged is allow a plugin to tell other hook to the event that a ping is sent already
1160                                 // Note that the plugins's calling order is subject to thri order in the plugin list
1161                                 $pinged = false;
1162                                 $manager->notify(
1163                                                 'JustPosted',
1164                                                 array('blogid' => $blogid,
1165                                                 'pinged' => &$pinged
1166                                                 )
1167                                 );
1168
1169                                 // clear all expired future posts
1170                                 sql_query("UPDATE " . sql_table('item') . " SET iposted='1' WHERE iblog=" . $blogid . " AND itime<NOW()");
1171
1172                                 // check to see any pending future post, clear the flag is none
1173                                 $result = sql_query("SELECT * FROM " . sql_table('item')
1174                                           . " WHERE iposted=0 AND iblog=" . $blogid);
1175                                 if (sql_num_rows($result) == 0) {
1176                                         $this->clearFuturePost();
1177                                 }
1178                         }
1179                 }
1180         }
1181
1182         /**
1183          * Shows the given list of items for this blog
1184          *
1185          * @param $itemarray
1186          *              array of item numbers to be displayed
1187          * @param $template
1188          *              String representing the template _NAME_ (!)
1189          * @param $highlight
1190          *              contains a query that should be highlighted
1191          * @param $comments
1192          *              1=show comments 0=don't show comments
1193          * @param $dateheads
1194          *              1=show dateheads 0=don't show dateheads
1195          * @returns int
1196          *              amount of items shown
1197          */
1198         function readLogFromList($itemarray, $template, $highlight = '', $comments = 1, $dateheads = 1) {
1199
1200                 $query = $this->getSqlItemList($itemarray);
1201
1202                 return $this->showUsingQuery($template, $query, $highlight, $comments, $dateheads);
1203         }
1204
1205         /**
1206          * Returns the SQL query used to fill out templates for a list of items
1207          *
1208          * @param $itemarray
1209          *              an array holding the item numbers of the items to be displayed
1210          * @returns
1211          *              either a full SQL query, or an empty string
1212          * @note
1213          *              No LIMIT clause is added. (caller should add this if multiple pages are requested)
1214          */
1215         function getSqlItemList($itemarray)
1216         {
1217                 if (!is_array($itemarray)) return '';
1218                 $items = array();
1219                 foreach ($itemarray as $value) {
1220                         if (intval($value)) $items[] = intval($value);
1221                 }
1222                 if (!count($items)) return '';
1223                 //$itemlist = implode(',',$items);
1224                 $i = count($items);
1225                 $query = '';
1226                 foreach ($items as $value) {
1227                         $query .= '('
1228                                         .   'SELECT'
1229                                         .   ' i.inumber as itemid,'
1230                                         .   ' i.ititle as title,'
1231                                         .   ' i.ibody as body,'
1232                                         .   ' m.mname as author,'
1233                                         .   ' m.mrealname as authorname,'
1234                                         .   ' i.itime,'
1235                                         .   ' i.imore as more,'
1236                                         .   ' m.mnumber as authorid,'
1237                                         .   ' m.memail as authormail,'
1238                                         .   ' m.murl as authorurl,'
1239                                         .   ' c.cname as category,'
1240                                         .   ' i.icat as catid,'
1241                                         .   ' i.iclosed as closed';
1242
1243                         $query .= ' FROM '
1244                                         . sql_table('item') . ' as i, '
1245                                         . sql_table('member') . ' as m, '
1246                                         . sql_table('category').' as c'
1247                                     . ' WHERE'
1248                                         .     ' i.iblog   = ' . $this->blogid
1249                                     . ' and i.iauthor = m.mnumber'
1250                                     . ' and i.icat    = c.catid'
1251                                     . ' and i.idraft  = 0'      // exclude drafts
1252                                                 // don't show future items
1253                                     . ' and i.itime  <= ' . mysqldate($this->getCorrectTime());
1254
1255                         //$query .= ' and i.inumber IN ('.$itemlist.')';
1256                         $query .= ' and i.inumber = '.intval($value);
1257                         $query .= ')';
1258                         $i--;
1259                         if ($i) $query .= ' UNION ';
1260                 }
1261
1262                 return $query;
1263         }
1264
1265 }
1266
1267 ?>