OSDN Git Service

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