blog (development code)
[moodle.git] / blog / class.BlogEntry.php
1 <?php // $Id$
3 /*******************************************************************
4  * Class to represent a blog entry.
5  *
6  * @copyright Copyright (C) 2003, Jason Buberel
7  * @author Jason Buberel jason@buberel.org {@link http://www.buberel.org/}
8  * @version  $Id$
9  * @license http://www.gnu.org/copyleft/gpl.html GNU Public License
10  * @package blog
11  ******************************************************************/
13 global $CFG;
14 include_once($CFG->dirroot .'/blog/lib.php');
16 /**
17  *
18  * This class represents a single entry in a blog. Normally, you wouldn't
19  * need to call the constructor directly...you would instead make use of
20  * a BlogInfo object's entry retrieval methods in order to get an instance
21  * of BlogEntry.
22  *
23  * To create a new blogEntry object use BlogInfo's insert_blog_entry() function.
24  *
25  * @todo Ultimately this class might to be expanded to include a factory
26  * method for the creation of new BlogEntries (->create()).
27  * Better yet:
28  fix constructor to not have to take a record set - should be empty and use setters
29  verify that everything has getters/setters
30  make sure that both the ->save and ->update function operate properly on an entry that does not yet exist!
31  this way one could:
32  $newEntry = new BlogEntry();
33  $newEntry->set_title('a title');
34  $newEntry->set_body('a post here');
35  $newEntry->set_userid(2);
36  $newEntry->save();
37  */
38 class BlogEntry {
39     // member variables
40     var $entryId; // post.id
41     var $entryBody; // post.summary
42     var $entryExtendedBody; // post.content
43     var $entryTitle; // post.subject
44     var $entryKarma; // post.rating
45     var $entryFormat; // post.format
46     var $entryuserid; // post.author    
47     var $entryGroupId; // post.groupid
48     var $entryCourseId; // post.courseid
49     var $entryPublishState; // post.publishstate
50     var $entryAuthorName; // blog_users.name
51     var $entryAuthorEmail; // blog_users.email
52     
53     //Daryl Hawes note: entryCategoryIds should be phased out as entryCategories is an
54     //associative array of $id => $name elements
55     var $entryCategoryIds = array(); // post.id -> blog_categories_entries.categoryid
56     var $entryCategories = array(); // post.id -> blog_categories_entries.categoryid -> blog_categories.catname
57     
58     var $entryLastModified; // last modification date post.lastmodified
59     var $formattedEntryLastModified; // post.lastmodified
60     var $entryCreated; // creation date post.created
61     var $formattedEntryCreated; // post.created
63     /**
64      * Class constructor that will build a new instance of the object
65      * when given a reference to an object that contains
66      * all of the keys from a row in the post table
67      * Daryl Hawes note: constructor should be changed not to have to take in a database row!
68      *
69      * @param object $entrydetails reference to an object that contains
70      *                              all of the keys from a row in the post table
71      * @uses $CFG
72      * @uses $db
73      * @todo finish documenting this constructor
74      */
75     function BlogEntry(&$entrydetails) {
76         global $db, $CFG;
77 //        print_object($entrydetails); //debug
79         $this->entryId = $entrydetails->id;
81         if (!empty($entrydetails->categoryid)) {
82             if (is_array($entrydetails->categoryid)) {
83                 $this->entryCategoryIds = $entrydetails->categoryid;
84             } else {
85                 $this->entryCategoryIds = array($entrydetails->categoryid);
86             }
87         } else {
88             // load up all categories that this entry is associated with
89             // cannot use moodle's get_records() here because this table does not conform well enough
90             $sql = 'SELECT * FROM '. $CFG->prefix .'blog_categories_entries WHERE entryid='. $this->entryId;
91             if($rs = $db->Execute($sql)) {
92                 while (!$rs->EOF) {
93                     $this->entryCategoryIds[] = $rs->fields['categoryid'];
94                     $rs->MoveNext();            
95                 }
96             }
97         }
98         $this->entryCategoryIds = array_unique($this->entryCategoryIds);
99 //        print "Debug: entryId: $this->entryId"; //debug
100 //        print_object($this->entryCategoryIds); //debug
101         
102         $this->entryBody = ereg_replace('<tick>', "'", stripslashes_safe($entrydetails->summary));
103         if (isset($entrydetails->extendedbody)) {
104             $this->entryExtendedBody = ereg_replace('<tick>', "'", stripslashes_safe($entrydetails->extendedbody));
105         } else {
106             $this->entryExtendedBody = '';
107         }
108         
109         $strftimedaydatetime = get_string('strftimedaydatetime');
110         $this->entryLastModified = $entrydetails->lastmodified;
111         $this->formattedEntryLastModified = userdate($this->entryLastModified, $strftimedaydatetime);
112         $this->entryCreated = $entrydetails->created;
113         $this->formattedEntryCreated = userdate($this->entryCreated, $strftimedaydatetime);
114         
115         $this->entryuserid = $entrydetails->userid;
116         
118         //added stripslashes_safe here for rss feeds. Will this conflict anywhere?
119         
120         
121         $this->entryTitle = ereg_replace('<tick>', "'", stripslashes_safe($entrydetails->subject));   //subject, not title!
122         
123         $this->entryFormat = $entrydetails->format;
125         //Daryl Hawes additions: course and group ids
126         if (isset($entrydetails->groupid) ) {
127             $this->entryGroupId = $entrydetails->groupid;
128         }
129         if (isset($entrydetails->courseid) ) {
130             $this->entryCourseId = $entrydetails->courseid;
131         }
133         if (isset($entrydetails->publishstate) ) {
134             $this->entryPublishState = $entrydetails->publishstate;
135         } else {
136             $this->entryPublishState = 'draft';
137         }
139         // need to get the email address of the author.
140         if (! $rs = get_record('user', 'id', $this->entryuserid)) {
141                 error('Could not find user '. $this->entryuserid ."\n"); //Daryl Hawes note: needs localization
142                 die;
143         }
144         $this->entryAuthorName = $rs->firstname .' '. $rs->lastname;
145         //need to make sure that email is actually just a link to our email sending page.
146         $this->entryAuthorEmail = $rs->email;
148         // then each category
149         if (!empty($this->entryCategoryIds)) {
150             foreach ($this->entryCategoryIds as $categoryid) {
151                 if (! $currcat = get_record('blog_categories', 'id', $categoryid)) {
152                     print 'Could not find category id '. $categoryid ."\n";
153                     $this->entryCategories[$categoryid] = '';
154                 } else {
155                     $this->entryCategories[$categoryid] = $currcat->catname;
156                 }
157             }
158         }
159     }
161     /**
162      * delete this entry
163      *
164      * @return bool Returns true on successful deletion
165      */
166     function delete() {
167         if (! delete_records('post', 'userid', $this->entryuserid, 'id', $this->entryId)) {
168                 print 'Could not find blog entry matching author with user id '. $this->entryuserid .'  and entry with id '. $this->entryId ."\n";
169                 return false;
170         }
171         return true;
172     }
173     
174     /**
175      * get_formatted_karma_link
176      *
177      * @return string If allowed a link to set karma for this entry will be returned
178      * @uses $USER
179      * @uses $CFG
180      */
181     function get_formatted_karma_link() {
182         global $USER, $CFG;
183         $str = '';
184         if (!empty($CFG->blog_ratename)) {
185             $str .= $CFG->blog_ratename .': ';
186         }
187         $str .= $this->entryKarma;
188         if ( !isguest() && blog_isLoggedIn()) {
189             $str .= ' ( <a href="'. $CFG->wwwroot .'/blog/karma.php?op=add&amp;userid='. $this->entryuserid .'&amp;postid='. $this->entryId .'">+</a> / <a href="'. $CFG->wwwroot .'/blog/karma.php?op=sub&amp;userid='. $this->entryuserid .'&amp;postid='. $this->entryId .'">-</a> )';
190         }
191         return $str;
192     }
194     /**
195      * get_formatted_category_link
196      *
197      * @return string unordered list of categories this entry is associated with
198      * @uses $CFG
199      */
200     function get_formatted_category_link() {
201         global $CFG;
202         $returnstring = '<span class="post-category">';
203         
204         if (!empty($this->entryCategoryIds)) {
205             $count = count($this->entryCategoryIds);
206             foreach ($this->entryCategoryIds as $categoryid) {
207                 $returnstring .= '<a href="'. $CFG->wwwroot .'/blog/index.php?user='. $this->entryuserid .'&amp;categoryid='. $categoryid .'">'. $this->entryCategories[$categoryid] .'</a>';
208                 $count--;
209                 if ($count != 0) {
210                     $returnstring .= ',&nbsp;';
211                 }
212                 $returnstring .= "\n";
213             }
214         }
216         return $returnstring.'</span>' . "\n";
217     }
218     
219     
220     /**
221      * get_formatted_course_link
222      *
223      * @return string Returns and unordered list of courses that this entry is associated with
224      * @uses $CFG
225      */
226     function get_formatted_course_link() {
227         global $CFG;
228         $returnstring = '<span class="post-course">';
229         $courseid = $this->entryCourseId;
230         if ( !empty($courseid) && !($courseid == 0 || $courseid == '' || ! is_numeric($courseid) )) {
231             if ($course = get_record('course', 'id', $courseid, '', '', '', '', 'fullname')) {
232                 $returnstring .= '<a href="'. $CFG->wwwroot .'/course/view.php?id='. $courseid .'">'. $course->fullname .'</a>' . "\n";
233             }
234         }
235     
236         return $returnstring.'</span>' . "\n";
237     }
239     /**
240      * get_formatted_entry_link
241      *
242      * @return string Permalink URL wrapped in an HTML link
243      */
244     function get_formatted_entry_link() {
245     
246         // removed the word 'permalink' and replaced with 'Read More' to
247         // further eliminate jargon from moodle blog
248         // Daryl Hawes note: must localize this line now
249         $str = '<a href="'. $this->get_entryurl() .'">Read More</a>';
250         return $str;
252     }
254     /*
255     * get_simple_entry_link - Just the link, with no extra html. 
256     *
257     * @return string Returns just a URL with no HTML.
258     * (Daryl Hawes note: this function moved to class.Blogentry from lib.php)
259     */
260     function get_simple_entry_link() {
261     
262         $str = htmlspecialchars( $this->get_entryurl() );    
263         return $str;
264     
265     }
266     
267     /**
268      * get_blog_this_URL added by Daryl Hawes for moodle integration
269      *
270      * @param bool $showImage If true then the return string is an HTML image tag
271      *                          If false then the return string is an HTML text link
272      * @uses $CFG
273      * @return string An HTML image tag or text link depending upon $showImage argument
274      */
275     function get_blog_this_URL($showImage=false) {
276         $str = '';
277         global $CFG;
278         //ensure user is logged in and that they have a blog to edit
279         if ( !isguest() && blog_isLoggedIn() ) {
280             $blogThisString = '';
281             if ($showImage) {
282                 $blogThisString = '<img src="'. $CFG->pixpath .'/blog/blog.gif" alt="'. get_string('blogthis', 'blog');
283                 $blogThisString .= '!" title="'. get_string('blogthis', 'blog') .'!" border="0" align="middle" />';
284             } else {
285                 $blogThisString = get_string('blogthis', 'blog');
286             }
287             if (!$showImage) { 
288                 $str .= '('; 
289             }
290             $str .= '<a href="'. $this->get_entryblogthisurl() .'">'. $blogThisString .'</a>';
291             if (!$showImage) { 
292                 $str .= ')'; 
293             }
294         }
295         return $str;
296     }
298     /**
299      * get_formatted_edit_URL added by Daryl Hawes for moodle integration
300      * An empty string is returned if the user is a guest, the user is not logged in,
301      * or the user is not currently editing their blog page (turn editing on button)
302      * we will only show edit link if the entry is in draft status or the user is an admin
303      * note: teacher should not be allowed to edit or delete - only demote back to draft
304      *
305      * @param bool $showImage If false a text link is printed. If true a linked edit icon is printed.
306      * @uses $USER
307      * @uses $CFG
308      * @todo get_formatted_delete_URL and get_formatted_edit_URL should be merged into a single function
309      */
310     function get_formatted_edit_URL($showImage=false) {
311         global $USER, $CFG;
312         $str = '';
314         if ( !isguest() && blog_isLoggedIn() && blog_isediting() && blog_is_blog_admin($this->entryuserid) 
315              && (!$CFG->blog_enable_moderation || isadmin() || $blogEntry->entryPublishState == 'draft') ) {            
316             $str = '<div class="blogedit">';
318             //check if user is in blog's acl
319             //instead of creating a new BlogInfo object might a BlogInfo pointer in BlogEntry constructor be better? Does php have singleton objects? if not then a bloginfo reference as an argument to the constructor of BlogEntry would be a good idea. (The only problem here is in pages with multiple bloginfo objects represented - aggregate pages.)
320             $bloginfo = new BlogInfo($this->entryuserid);
321             //if so then show them an edit link
322             if (blog_user_has_rights($bloginfo)) {
323                 $editString = '';
324                 if ($showImage) {
325                     $editString = '<img src="'. $CFG->pixpath .'/t/edit.gif" alt="'. get_string('edit');
326                     $editString .= '" title="'. get_string('edit') .'" align="absmiddle" height="16" width="16" border="0" />';
327                 } else {
328                     $editString = get_string('edit');
329                 }
330                 if (!$showImage) { 
331                     $str .= '('; 
332                 }
333                 $str .= '<a title="'. get_string('edit') .'" href="'. $this->get_entryediturl() .'">'. $editString .'</a>';
334                 if (!$showImage) { 
335                     $str .= ')'; 
336                 }
337             }
338             $str .= '</div>';
339             unset($blogInfo); //clean up after ourselves        
340         }
341         return $str;
342     }
343     
344     /**
345      * get_formatted_delete_URL added by Daryl Hawes for moodle integration
346      * An empty string is returned if the user is a guest, the user is not logged in,
347      * or the user is not currently editing their blog page (turn editing on button)
348      * we will only show edit link if the entry is in draft status or the user is an admin
349      * note: teacher should not be allowed to edit or delete - only demote back to draft
350      *
351      * @uses $USER
352      * @uses $CFG
353      * @param bool $showImage If false a text link is printed. If true a linked delete icon is printed.
354      * @todo get_formatted_delete_URL and get_formatted_edit_URL should be merged into a single function
355      */
356     function get_formatted_delete_URL($showImage=false) {
357         global $USER, $CFG;
358         $str = '';
359         
360         if ( !isguest() && blog_isLoggedIn() && blog_isediting() && blog_is_blog_admin($this->entryuserid)
361              && (!$CFG->blog_enable_moderation || isadmin() || $blogEntry->entryPublishState == 'draft') ) {
362             
363             $str = '<div class="blogdelete">';
364             
365             //check if user is in blog's acl
366             //instead of creating a new BlogInfo object might a BlogInfo pointer in BlogEntry constructor be better? Does php have singleton objects? if not then a bloginfo reference as an argument to the constructor of BlogEntry would be a good idea.
367             $bloginfo =& new BlogInfo($this->entryuserid);
368             //if so then show them an edit link
369             if (blog_user_has_rights($bloginfo)) {
370                 $deleteString = '';
371                 if ($showImage) {
372                     $deleteString = '<img src="'. $CFG->pixpath .'/t/delete.gif" alt="'. get_string('delete');
373                     $deleteString .= '" title="'. get_string('delete') .'" align="absmiddle" border="0" />';
374                 } else {
375                     $deleteString = get_string('delete');
376                 }
377                 if (!$showImage) {
378                     $str .= '(';
379                 }
380                 $str .= '<a title="'. get_string('delete') .'" href="'. $this->get_entrydeleteurl() .'">'. $deleteString .'</a>';
381                 if (!$showImage) { 
382                     $str .= ')'; 
383                 }
384             }
385             $str .= '</div>';
386             unset($blogInfo); //clean up after ourselves
387         }
388         return $str;
389     }
391     /**
392      * get_formatted_entry_body
393      * getter for ->entryBody.
394      *
395      * @uses $CFG
396      * @return string Entry body/summary run through moodle's format_text formatter and 
397      *                  with slashes stripped from database entry
398      */
399     function get_formatted_entry_body() {
400         global $CFG;
401         include_once($CFG->libdir .'/weblib.php');
402         if ( isset($this->entryFormat) ) {
403             return format_text($this->entryBody, $this->entryFormat);
404         }
405         return stripslashes_safe($this->entryBody);
406     }
407     
408     /**
409      * get_unformatted_entry_body
410      * getter for ->entryBody
411      *
412      * @return string Entry body/summary - raw string from database
413      */
414     function get_unformatted_entry_body() {
415         return $this->entryBody;
416     }
418     /**
419      * get_formatted_entry_extended_body
420      * getter for ->entryExtendedBody
421      *
422      * @uses $CFG
423      * @return string Entry extended body/content run through moodle's format_text formatter and 
424      *                  with slashes stripped from database entry
425      */
426     function get_formatted_entry_extended_body() {
427         global $CFG;
428         include_once($CFG->libdir .'/weblib.php');
429         if ( isset($this->entryFormat) ) {
430             return format_text($this->entryExtendedBody, $this->entryFormat);
431         }
432         return stripslashes_safe($this->entryExtendedBody);
433     }
435     /**
436      * get_unformatted_entry_extended_body
437      * getter for ->entryExtendedBody
438      *
439      * @return string Entry extended body/content - raw string from database
440      */
441     function get_unformatted_entry_extended_body() {
442         return $this->entryExtendedBody;
443     }
445     /**
446      * BlogEntry setters do not save to the database.
447      * To save changes call the BlogEntry->save() function when ready.
448      *
449      * @param string $title New entry subject
450      */
451     function set_title($title) {
452         $this->entryTitle = $title;
453     }
455     /**
456      * BlogEntry setters do not save to the database.
457      * To save changes call the BlogEntry->save() function when ready.
458      *
459      * @param string $body New entry summary
460      */
461     function set_body($body) {
462         $this->entryBody = $body;
463     }
465     /**
466      * BlogEntry setters do not save to the database.
467      * To save changes call the BlogEntry->save() function when ready.
468      *
469      * @param string $extendedbody New entry content
470      */
471     function set_extendedbody($extendedbody) {
472         $this->entryExtendedBody = $extendedbody;
473     }
475     /**
476      * BlogEntry setters do not save to the database.
477      * To save changes call the BlogEntry->save() function when ready.
478      *
479      * @param string $format Moodle format_text format type.
480      */
481     function set_format($format) {
482         $this->entryFormat = $format;
483     }
484     
485     /**
486      *
487      * @return string
488      */
489     function get_entryurl() {
490         global $CFG;
491         return $CFG->wwwroot .'/blog/archive.php?userid='. $this->entryuserid .'&amp;postid='. $this->entryId;
492     }
494     /**
495      *  The url of the news feed containing this item. Uses global admin config to determin what feed type to point to.
496      * @return string
497      */
498     function get_entryfeedurl() {
499         global $CFG;
500         return $CFG->wwwroot .'/blog/rss.php?userid='. $this->entryuserid;
501     }
503     /**
504      *  
505      * @return string
506      */
507     function get_entryediturl() {
508         global $CFG;
509         return $CFG->wwwroot .'/blog/edit.php?userid='. $this->entryuserid .'&amp;editid='. $this->entryId;
510     }
513     /**
514      *  
515      * @return string
516      */
517     function get_entrydeleteurl() {
518         global $CFG;
519         return 'javascript:del(\''. $CFG->wwwroot .'/blog/\', '. $this->entryId .', '. $this->entryuserid .')';
520     }
522     /**
523      *  
524      * @return string
525      */
526     function get_entryblogthisurl() {
527         global $CFG;
528         return $CFG->wwwroot .'/blog/blogthis.php?userid='. $this->entryuserid .'&amp;act=use&amp;postid='. $this->entryId;
529     }
531     /**
532      * BlogEntry setters do not save to the database.
533      * To save changes call the BlogEntry->save() function when ready.
534      *
535      * @param int $userid The new author/owner's moodle user id
536      */
537     function set_userid($userid) {
538         $this->entryuserid = $userid;
539     }
541     /**
542      * BlogEntry setters do not save to the database.
543      * To save changes call the BlogEntry->save() function when ready.
544      *
545      * @param string $publishstate A new publish state for this entry. One of: 
546      *                  enum('draft','teacher','course','group','site','public') 
547      * @return bool True if new state is allowed (and applied), false if not.
548      */
549     function set_publishstate($publishstate) {
550         $applicablestates = array_keys(blog_applicable_publish_states($this->entryCourseId));
551         if (in_array($publishstate, $applicablestates)) {
552             $this->entryPublishState = $publishstate;
553             return true;
554         }
555         return false;
556     }
558     /**
559      * BlogEntry setters do not save to the database.
560      * To save changes call the BlogEntry->save() function when ready.
561      *
562      * @param int $courseid The course by id that this entry should be associated with.
563      */
564     function set_courseid($courseid) {
565         $this->entryCourseId = $courseid;
566     }
568     /**
569      * BlogEntry setters do not save to the database.
570      * To save changes call the BlogEntry->save() function when ready.
571      *
572      * @param int $groupid The groupid that this entry should be associated with.
573      */
574     function set_groupid($groupid) {
575         $this->entryGroupId = $groupid;
576     }
578     /**
579      * BlogEntry setters do not save to the database.
580      * To save changes call the BlogEntry->save() function when ready.
581      *
582      * @param array $catids An array of category ids to associate this entry with. 
583      */
584     function set_categoryids($catids) {
585         $this->entryCategoryIds = $catids;
587         if (!empty($this->entryCategoryIds)) {
588             if (!is_array($this->entryCategoryIds)) {
589                 $this->entryCategoryIds = array($this->entryCategoryIds);
590             }
591             $this->entryCategoryIds = array_unique($this->entryCategoryIds);
592         }
593         
594         // now populate the entryCategories array
595         if (!empty($this->entryCategoryIds)) {
596             foreach ($this->entryCategoryIds as $categoryid) {
597                 if (! $currcat = get_record('blog_categories', 'id', $categoryid)) {
598                     print 'Could not find category id '. $categoryid ."\n";
599                     $this->entryCategories[$categoryid] = '';
600                 } else {
601                     $this->entryCategories[$categoryid] = $currcat->catname;
602                 }
603             }
604         }
605     }
607     /**
608      * This function will determine if the user is logged in and
609      * able to make changes to the publish state of this entry
610      *
611      * @return bool True if user is allowed to change publish state
612      */
613     function user_can_change_publish_state() {
614         // figure out who the currently logged in user is.
615         // to change any publish state one must be logged in
616         global $USER;
617         if ( !isset($USER) || empty($USER) || !isset($USER->id) ) {
618             // only site members are allowed to edit entries
619             return 'Only site members are allowed to edit entries';
620         } else {
621             $uid = $USER->id;
622         }
623         if ( ($uid == $this->entryuserid) || (blog_is_blog_admin($this->entryuserid)) || (isadmin()) 
624              || (isset($this->entryCourseId) && isteacher($this->entryCourseId)) ) {
625             return true;
626         }
627         return false;
628     }
630     /**
631      * added by Daryl Hawes for moodle integration
632      *
633      * @param int $uid The user attempting to view this entry
634      * @return bool
635      */
636     function user_can_view($uid='') {
637         global $USER;
639         //first allow access to any post for admin users
640         if ( isadmin() ) {
641             return true;
642         }
643         
644         //get the logged in user's id if needed
645         if ($uid == '') {
646             if ( isset($USER) && isset($USER->id)) {
647                 $uid = $USER->id;
648             }
649         }
651         if ($this->entryPublishState == 'public') {
652             return true;
653         } else if ($this->entryPublishState == 'draft') {
654             //only the owner is allowed to see their own draft message
655             if ($uid == $this->entryuserid) {
656                 return true;
657             } 
658         } else if ($this->entryPublishState == 'site') {
659             //user has a valid member id and user is not a guest of the site
660             if ( ! $uid == '' && ! isguest() ) {
661                 return true;
662             }
663         } else if ($this->entryPublishState == 'course') {
664             //there is a courseid and the user is a member of that course
665             if ( isset($this->entryCourseId) && (isteacher($this->entryCourseId, $uid) || isstudent($this->entryCourseId, $uid) ) ) {
666                 return true;
667             }
668         } else if ($this->entryPublishState == 'teacher') {
669             if ( isset($this->entryCourseId) && isteacher($this->entryCourseId, $uid) )  {
670                 return true;
671             }
672         } else if ($this->entryPublishState == 'group') {
673             if ( isset($this->entryGroupId) && ismember($this->entryGroupId, $uid) )  {
674                 return true;
675             }            
676         }
678         //nothing qualified - the user requesting access is not allowed to view this entry!
679         return false;
680     }
681     
682     
683     /**
684      * @param bool $return If true a string value is returned. If this variable is set to false
685      *                      Then this function will print out the menu code and exit.
686      * @param bool $includehelp If true a help button linking to the batch_publish page
687      *                      will be included in the returned string
688      * @return string|nil  If the $return param is set to true a string is returned.
689      */
690     function get_publish_to_menu($return=true, $includehelp=true) {
691         $menu = '';
692         if ($this->user_can_change_publish_state() && blog_isediting() ) {
693             $menu .= '<div class="publishto">'. get_string('publishto', 'blog').': ';
694             $options = blog_applicable_publish_states($this->entryCourseId);
695             $menu .= choose_from_menu($options, $this->entryuserid .'-'. $this->entryId, $this->entryPublishState, '', '', '0', true);
696             $menu .= "\n".'</div>'."\n";
697             if ($includehelp) {
698                 $menu .= helpbutton('batch_publish', get_string('batchpublish', 'blog'), 'blog', true, false, '', true);
699             }
700         }
701         if ($return) {
702             return $menu;
703         }
704         print $menu;
705     }
706         
707     /**
708      * Save this entry to the database. 
709      * This function can be used outside the BlogEntry class.
710      * ex:
711      * <code>
712      * $myBlogEntry = blogInfo->get_blog_entry_by_id(100);
713      * $myBlogEntry->set_title('New Title');
714      * $myBlogEntry->save();
715      * </code>
716      * This function will handle all of the security and data integrity checking for you
717      * @return null|string Error string returned when an error is encountered.
718      */
719     function save() {
720         //check if the user is authorized to make this change
721         // either they own this entry, are in the blog acl for this entry,
722         // are an admin user or they teach the course this entry is associated with
723         if ($this->user_can_change_publish_state()) {
724             $applicablestates = array_keys(blog_applicable_publish_states($this->entryCourseId));
725             if (in_array($this->entryPublishState, $applicablestates)) {
726                 // Yes they are authorized so update the entry.
727                 if ( $this->_update() ) {
728                     //print_object($this); //debug:
730                     //add a timestamp to the user preference for this userid to mark it updated
731                     set_user_preference('bloglastmodified', time(), $this->entryuserid);
732                     return;
733                 } else {
734                     $error = 'An error occured saving this entry';
735                 }
736             } else {
737                 $error = 'Publish state '. $this->entryPublishState .' is not available for this user';
738             }
739         } else {
740             $error = 'User not allowed to edit this entry';
741         }
742         // must not have worked...
743         return $error;
744     }
746     /**
747      * _update
748      *
749      * This function is internal to the BlogEntry class and should not be used elsewhere.
750      * It takes the currently set member variables and writes them to the database.
751      * @return boolean
752      */
753     function _update() {
754     
755         global $db, $CFG;
756         // generate the modification date
757         $timenow = time();
759         //load up the data object with the latest data
760         $dataobject->id = intval($this->entryId);
761         $dataobject->summary = $this->entryBody;
762         $dataobject->content = $this->entryExtendedBody;
763         $dataobject->subject = $this->entryTitle;
764         $dataobject->format = intval($this->entryFormat);
765         $dataobject->userid = intval($this->entryuserid);
766         $dataobject->publishstate = $this->entryPublishState;
768         if ($this->entryCourseId) {
769             $dataobject->courseid = $this->entryCourseId;
770         } else {
771             $dataobject->courseid = SITEID;    //yu: in case change to all course
772         }
773         if ($this->entryGroupId) {
774             $dataobject->groupid = $this->entryGroupId;
775         } else {
776             $dataobject->groupid = 0;    //yu: in case we change to all groups
777         }
778         $dataobject->lastmodified = $timenow;
780         $dataobject->summary = ereg_replace("'", '<tick>', $dataobject->summary);
781         // The wysiwyg html editor adds a <br /> tag to the extendedbody.
782         // cleanup the extendedbody first
783         if ($dataobject->content == '<br />') {
784             $dataobject->content = '';
785         }
786         $dataobject->content= ereg_replace("'", '<tick>', $dataobject->content);
787         $dataobject->subject = ereg_replace("'", '<tick>', $dataobject->subject);
788         $dataobject->subject = addslashes($dataobject->subject);
789         $dataobject->summary = addslashes($dataobject->summary);
790         $dataobject->content = addslashes($dataobject->content);
792         // First update the entry's categories. Remove all, then add back those passed in
793         $sql = 'DELETE FROM '. $CFG->prefix .'blog_categories_entries WHERE entryid='. $this->entryId;
794         $rs = $db->Execute($sql);
796         if (!empty($this->entryCategoryIds)) {
797             if (!is_array($this->entryCategoryIds)) {
798                 $this->entryCategoryIds = array($this->entryCategoryIds);
799             }
800             $this->entryCategoryIds = array_unique($this->entryCategoryIds);
801             foreach ($this->entryCategoryIds as $categoryid) {
802                 $cat->entryid = $this->entryId;
803                 $cat->categoryid = $categoryid;
804                 insert_record('blog_categories_entries', $cat);
805             }
806         }
808         // next update the entry itself
809         if (update_record('post', $dataobject)) {
810             return true;
811         }
812         //failure
813         return false;
814     }
816 }//end class BlogEntry
817 ?>