lib.php 27 KB
Newer Older
1
2
<?php
/**
Francois Marier's avatar
Francois Marier committed
3
4
 * Mahara: Electronic portfolio, weblog, resume builder and social networking
 * Copyright (C) 2006-2007 Catalyst IT Ltd (http://www.catalyst.net.nz)
5
 *
Francois Marier's avatar
Francois Marier committed
6
7
8
9
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
10
 *
Francois Marier's avatar
Francois Marier committed
11
12
13
14
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
15
 *
Francois Marier's avatar
Francois Marier committed
16
17
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 *
 * @package    mahara
 * @subpackage artefact-blog
 * @author     Alastair Pharo <alastair@catalyst.net.nz>
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
 * @copyright  (C) 2006,2007 Catalyst IT Ltd http://catalyst.net.nz
 *
 */

defined('INTERNAL') || die();

/** 
 * Users can create blogs and blog posts using this plugin.
 */
class PluginArtefactBlog extends PluginArtefact {

    public static function get_artefact_types() {
        return array(
            'blog',
            'blogpost',
        );
    }
40
41
42
43
    
    public static function get_block_types() {
        return array();
    }
44
45
46
47
48
49
50

    public static function get_plugin_name() {
        return 'blog';
    }

    public static function menu_items() {
        return array(
Martyn Smith's avatar
Martyn Smith committed
51
            array(
52
53
                'path'   => 'myportfolio/blogs',
                'url'    => 'artefact/blog/',
54
                'title'  => get_string('myblogs', 'artefact.blog'),
55
56
                'weight' => 30,
            ),
57
58
        );
    }
59

60
61
62
63
    public static function get_cron() {
        return array(
            (object)array(
                'callfunction' => 'clean_post_files',
Richard Mansfield's avatar
Richard Mansfield committed
64
65
                'hour'         => '4',
                'minute'       => '40'
66
67
68
69
70
71
72
73
74
            )
        );
    }

    /**
     * This function cleans out any files that have been uploaded, but which
     * are not associated with a blog, because of an aborted blog creation.
     */
    public static function clean_post_files() {
75

Richard Mansfield's avatar
Richard Mansfield committed
76
77
78
79
80
81
82
83
84
85
86
87
        $bloguploadbase = get_config('dataroot') . ArtefactTypeBlogPost::$blogattachmentroot;
        if (!$basedir = opendir($bloguploadbase)) {
            throw new Exception('Unable to read blog upload directory '.$bloguploadbase);
        }

        $currenttime = time();

        // Read through all the upload session directories
        while (false !== ($sessionupload = readdir($basedir))) {
            if ($sessionupload != "." && $sessionupload != "..") {
                $sessionupload = $bloguploadbase . $sessionupload;
                $subdir = opendir($sessionupload);
88

Richard Mansfield's avatar
Richard Mansfield committed
89
90
91
92
93
94
95
96
97
98
99
100
101
                // Remove all files older than the session timeout plus two hours.
                while (false !== ($uploadfile = readdir($subdir))) {
                    if ($uploadfile != "." && $uploadfile != "..") {
                        $uploadfile = $sessionupload . '/' . $uploadfile;
                        if ($currenttime - filemtime($uploadfile) > get_config('session_timeout') + 7200) {
                            unlink($uploadfile);
                        }
                    }
                }

                closedir($subdir);
                rmdir($sessionupload);
            }
102
        }
Richard Mansfield's avatar
Richard Mansfield committed
103
104

        closedir($basedir);
105
    }
106
107
108
109
110
111
112
}

/**
 * A Blog artefact is a collection of BlogPost artefacts.
 */
class ArtefactTypeBlog extends ArtefactType {

Alastair Pharo's avatar
Alastair Pharo committed
113
114
115
116
117
    /**
     * This constant gives the per-page pagination for listing blogs.
     */
    const pagination = 10;
    
118
119
120
    
    /** 
     * Whether comments are allowed on this blog or not.
Alastair Pharo's avatar
Alastair Pharo committed
121
122
     *
     * @var boolean
123
124
125
126
127
     */
    protected $commentsallowed = false;

    /** 
     * Whether the blog owner will be notified of comments or not.
Alastair Pharo's avatar
Alastair Pharo committed
128
129
     *
     * @var boolean
130
131
132
     */
    protected $commentsnotify = false;

133
134
135
136
137
138
139
140
141
    /**
     * We override the constructor to fetch the extra data.
     *
     * @param integer
     * @param object
     */
    public function __construct($id = 0, $data = null) {
        parent::__construct($id, $data);

142
        if (!$data) {
143
144
145
146
147
148
            if ($this->id) {
                if ($blogdata = get_record('artefact_blog_blog', 'blog', $this->id)) {
                    foreach($blogdata as $name => $value) {
                        if (property_exists($this, $name)) {
                            $this->$name = $value;
                        }
149
                    }
150
                }
151
152
153
154
                else {
                    // This should never happen unless the user is playing around with blog IDs in the location bar or similar
                    throw new ArtefactNotFoundException(get_string('blogdoesnotexist', 'artefact.blog'));
                }
155
            }
156
        }
157
158
159
160
161
162
163
164

        if (empty($this->id)) {
            $this->container = 1;
        }
    }

    public function is_container() {
        return true;
165
    }
Alastair Pharo's avatar
Alastair Pharo committed
166
167

    /**
168
169
170
     * This function updates or inserts the artefact.  This involves putting
     * some data in the artefact table (handled by parent::commit()), and then
     * some data in the artefact_blog_blog table.
Alastair Pharo's avatar
Alastair Pharo committed
171
     */
172
    public function commit() {
173
174
175
176
177
178
179
180
181
182
183
184
185
186
        // Just forget the whole thing when we're clean.
        if (empty($this->dirty)) {
            return;
        }
      
        // We need to keep track of newness before and after.
        $new = empty($this->id);
        
        // Commit to the artefact table.
        parent::commit();

        // Reset dirtyness for the time being.
        $this->dirty = true;

Alastair Pharo's avatar
Alastair Pharo committed
187
        $data = (object)array(
188
189
190
191
192
193
194
195
196
197
198
199
200
            'blog'            => $this->get('id'),
            'commentsallowed' => ($this->get('commentsallowed') ? 1 : 0),
            'commentsnotify'  => ($this->get('commentsnotify') ? 1 : 0)
        );

        if ($new) {
            insert_record('artefact_blog_blog', $data);
        }
        else {
            update_record('artefact_blog_blog', $data, 'blog');
        }

        $this->dirty = false;
201
202
    }

Alastair Pharo's avatar
Alastair Pharo committed
203
    /**
204
205
     * This function extends ArtefactType::delete() by deleting blog-specific
     * data.
Alastair Pharo's avatar
Alastair Pharo committed
206
     */
207
    public function delete() {
208
209
210
211
212
213
214
215
216
        if (empty($this->id)) {
            return;
        }

        // Delete the blog-specific data.
        delete_records('artefact_blog_blog', 'blog', $this->id);

        // Delete the artefact and all children.
        parent::delete();
217
218
    }

219
220
221
222
223
224
225
226
227
228
229
230
231
    /**
     * Checks that the person viewing this blog is the owner. If not, throws an 
     * AccessDeniedException. Used in the blog section to ensure only the 
     * owners of the blogs can view or change them there. Other people see 
     * blogs when they are placed in views.
     */
    public function check_permission() {
        global $USER;
        if ($USER->get('id') != $this->owner) {
            throw new AccessDeniedException(get_string('youarenottheownerofthisblog', 'artefact.blog'));
        }
    }

232

233
234
    public function describe_size() {
        return $this->count_children() . ' ' . get_string('posts', 'artefact.blog');
235
236
    }

237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
    /**
     * Renders a blog for a view. This involves using a tablerenderer to paginate the posts.
     *
     * This uses some legacy stuff from the old views interface, including its 
     * dependence on javascript and the table renderer, which would be nice to 
     * fix using the new pagination stuff some time.
     *
     * @param  array  Options for rendering
     * @return array  A two key array, 'html' and 'javascript'.
     */
    public function render_self($options) {
        // This is because if there are multiple blocks on a page, they need separate
        // js variables.
        $blockid = isset($options['blockid'])
            ? $options['blockid']
            : mt_rand();

        $this->add_to_render_path($options);

        $smarty = smarty_core();
        if (isset($options['viewid'])) {
258
259
            $smarty->assign('artefacttitle', '<a href="' . get_config('wwwroot') . 'view/artefact.php?artefact='
                                             . $this->get('id') . '&view=' . $options['viewid']
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
                                             . '">' . $this->get('title') . '</a>');
        }
        else {
            $smarty->assign('artefacttitle', $this->get('title'));
        }

        $smarty->assign('blockid', $blockid);
        $smarty->assign('options', $options);
        $smarty->assign('enc_id', json_encode($this->id));
        $smarty->assign('limit', self::pagination);
        $smarty->assign('loading_img', theme_get_url('images/loading.gif'));

        // Remove unnecessary options for blog posts
        unset($options['hidetitle']);
        $smarty->assign('enc_options', json_encode(json_encode($options)));

        return array('html' => $smarty->fetch('blocktype:blog:blog_render_self.tpl'), 'javascript' => '');
    }

279
                
280
    public static function get_icon($options=null) {
281
282
    }

Nigel McNie's avatar
Nigel McNie committed
283
    public static function is_singular() {
Penny Leach's avatar
Penny Leach committed
284
285
286
        return false;
    }

Alastair Pharo's avatar
Alastair Pharo committed
287
    public static function collapse_config() {
288
289
    }

Alastair Pharo's avatar
Alastair Pharo committed
290
291
292
293
294
295
296
297
298
    /**
     * This function returns a list of the given user's blogs.
     *
     * @param User
     * @return array (count: integer, data: array)
     */
    public static function get_blog_list(User $user, $limit = self::pagination, $offset = 0) {
        ($result = get_records_sql_array("
         SELECT id, title, description
299
         FROM {artefact}
Alastair Pharo's avatar
Alastair Pharo committed
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
         WHERE owner = ?
          AND artefacttype = 'blog'
         ORDER BY title
         LIMIT ? OFFSET ?", array($user->get('id'), $limit, $offset)))
            || ($result = array());

        $count = (int)get_field('artefact', 'COUNT(*)', 'owner', $user->get('id'), 'artefacttype', 'blog');

        return array($count, $result);
    }

    /**
     * This function creates a new blog.
     *
     * @param User
     * @param array
     */
Alastair Pharo's avatar
Alastair Pharo committed
317
    public static function new_blog(User $user, array $values) {
Alastair Pharo's avatar
Alastair Pharo committed
318
319
320
321
        $artefact = new ArtefactTypeBlog();
        $artefact->set('title', $values['title']);
        $artefact->set('description', $values['description']);
        $artefact->set('owner', $user->get('id'));
322
323
        $artefact->set('commentsallowed', $values['commentsallowed'] ? true : false);
        $artefact->set('commentsnotify', $values['commentsnotify'] ? true : false);
324
        $artefact->set('tags', $values['tags']);
Alastair Pharo's avatar
Alastair Pharo committed
325
        $artefact->commit();
326
    }
Alastair Pharo's avatar
Alastair Pharo committed
327
328
329
330
331
332
333
334
335
336
337
338
339

    /**
     * This function updates an existing blog.
     *
     * @param User
     * @param array
     */
    public static function edit_blog(User $user, array $values) {
        if (empty($values['id']) || !is_numeric($values['id'])) {
            return;
        }

        $artefact = new ArtefactTypeBlog($values['id']);
340
341
342
343
        if ($user->get('id') != $artefact->get('owner')) {
            return;
        }
        
Alastair Pharo's avatar
Alastair Pharo committed
344
345
346
347
        $artefact->set('title', $values['title']);
        $artefact->set('description', $values['description']);
        $artefact->set('commentsallowed', $values['commentsallowed'] ? true : false);
        $artefact->set('commentsnotify', $values['commentsnotify'] ? true : false);
348
        $artefact->set('tags', $values['tags']);
Alastair Pharo's avatar
Alastair Pharo committed
349
350
        $artefact->commit();
    }
351
352
353
354

    public function public_feedback_allowed() {
        return $this->get('commentsallowed');
    }
355
356
357
358
359
360


    public function feedback_notify_owner() {
        return $this->get('commentsnotify');
    }

Martyn Smith's avatar
Martyn Smith committed
361
362
    public static function get_links($id) {
        $wwwroot = get_config('wwwroot');
363

Martyn Smith's avatar
Martyn Smith committed
364
365
366
367
368
        return array(
            '_default'                                  => $wwwroot . 'artefact/blog/view/?id=' . $id,
            get_string('blogsettings', 'artefact.blog') => $wwwroot . 'artefact/blog/settings/?id=' . $id,
        );
    }
369
370
371
372
373
374
375
}

/**
 * BlogPost artefacts occur within Blog artefacts
 */
class ArtefactTypeBlogPost extends ArtefactType {

376
    /**
Alastair Pharo's avatar
Alastair Pharo committed
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
     * This defines whether the blogpost is published or not.
     *
     * @var boolean
     */
    protected $published = false;

    /**
     * We override the constructor to fetch the extra data.
     *
     * @param integer
     * @param object
     */
    public function __construct($id = 0, $data = null) {
        parent::__construct($id, $data);

392
        if (!$data) {
393
394
395
396
397
398
            if ($this->id) {
                if ($bpdata = get_record('artefact_blog_blogpost', 'blogpost', $this->id)) {
                    foreach($bpdata as $name => $value) {
                        if (property_exists($this, $name)) {
                            $this->$name = $value;
                        }
399
                    }
Alastair Pharo's avatar
Alastair Pharo committed
400
                }
401
402
403
404
                else {
                    // This should never happen unless the user is playing around with blog post IDs in the location bar or similar
                    throw new ArtefactNotFoundException(get_string('blogpostdoesnotexist', 'artefact.blog'));
                }
405
406
            }
        }
Alastair Pharo's avatar
Alastair Pharo committed
407
408
409
410
411
    }

    /**
     * This function extends ArtefactType::commit() by adding additional data
     * into the artefact_blog_blogpost table.
412
     */
413
    public function commit() {
Alastair Pharo's avatar
Alastair Pharo committed
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
        if (empty($this->dirty)) {
            return;
        }

        $new = empty($this->id);
      
        parent::commit();

        $this->dirty = true;

        $data = (object)array(
            'blogpost'  => $this->get('id'),
            'published' => ($this->get('published') ? 1 : 0)
        );

        if ($new) {
            insert_record('artefact_blog_blogpost', $data);
        }
        else {
            update_record('artefact_blog_blogpost', $data, 'blogpost');
        }

        $this->dirty = false;
437
438
    }

439
    /**
Alastair Pharo's avatar
Alastair Pharo committed
440
441
     * This function extends ArtefactType::delete() by also deleting anything
     * that's in blogpost.
442
     */
443
    public function delete() {
Alastair Pharo's avatar
Alastair Pharo committed
444
445
446
        if (empty($this->id)) {
            return;
        }
447

Martyn Smith's avatar
Martyn Smith committed
448
        delete_records('artefact_blog_blogpost_file', 'blogpost', $this->id);
Alastair Pharo's avatar
Alastair Pharo committed
449
450
451
452
        delete_records('artefact_blog_blogpost', 'blogpost', $this->id);
      
        parent::delete();
    }
453
454
455
456
457
458
459
460
461
462
463
464
465

    /**
     * Checks that the person viewing this blog is the owner. If not, throws an 
     * AccessDeniedException. Used in the blog section to ensure only the 
     * owners of the blogs can view or change them there. Other people see 
     * blogs when they are placed in views.
     */
    public function check_permission() {
        global $USER;
        if ($USER->get('id') != $this->owner) {
            throw new AccessDeniedException(get_string('youarenottheownerofthisblogpost', 'artefact.blog'));
        }
    }
466
  
467
468
    public function describe_size() {
        return $this->count_attachments() . ' ' . get_string('attachments', 'artefact.blog');
469
470
    }

471
472
473
474
    public function render_self($options) {
        $smarty = smarty_core();
        if (empty($options['hidetitle'])) {
            if (isset($options['viewid'])) {
475
476
                $smarty->assign('artefacttitle', '<a href="' . get_config('wwwroot') . 'view/artefact.php?artefact='
                     . $this->get('id') . '&view=' . $options['viewid']
477
478
479
480
481
482
483
484
485
486
                     . '">' . $this->get('title') . '</a>');
            }
            else {
                $smarty->assign('artefacttitle', $this->get('title'));
            }
        }

        // We need to make sure that the images in the post have the right viewid associated with them
        $postcontent = $this->get('description');
        if (isset($options['viewid'])) {
487
            $postcontent = preg_replace('#(<img[^>]+src="[^>]+artefact/file/download\.php\?file=\d+)#', '\1&amp;view=' . $options['viewid'], $postcontent);
488
489
490
491
492
493
        }
        $smarty->assign('artefactdescription', $postcontent);
        $smarty->assign('artefact', $this);
        $attachments = $this->get_attached_files();
        if ($attachments) {
            $this->add_to_render_path($options);
494
            require_once(get_config('docroot') . 'artefact/lib.php');
495
496
497
498
            foreach ($attachments as &$attachment) {
                $f = artefact_instance_from_id($attachment->id);
                $attachment->size = $f->describe_size();
                $attachment->iconpath = $f->get_icon(array('id' => $attachment->id, 'viewid' => $options['viewid']));
499
                $attachment->viewpath = get_config('wwwroot') . 'view/artefact.php?artefact=' . $attachment->id . '&view=' . $options['viewid'];
500
501
                $attachment->downloadpath = get_config('wwwroot') . 'artefact/file/download.php?file=' . $attachment->id;
                if (isset($options['viewid'])) {
502
                    $attachment->downloadpath .= '&id=' . $options['viewid'];
503
504
505
506
507
508
509
510
511
512
513
514
                }
            }
            $smarty->assign('attachments', $attachments);
        }
        $smarty->assign('postedbyon', get_string('postedbyon', 'artefact.blog',
                                                 display_name($this->owner),
                                                 format_date($this->ctime)));
        return array('html' => $smarty->fetch('artefact:blog:render/blogpost_renderfull.tpl'),
                     'javascript' => '');
    }


515
516
517
    /**
     * Returns an array of IDs of artefacts attached to this blogpost
     */
518
519
520
521
522
523
524
525
526
527
528
529
    public function attachment_id_list() {
        if (!$list = get_column('artefact_blog_blogpost_file', 'file', 'blogpost', $this->get('id'))) {
            $list = array();
        }
        return $list;
    }

    public function attach_file($artefactid) {
        $data = new StdClass;
        $data->blogpost = $this->get('id');
        $data->file = $artefactid;
        insert_record('artefact_blog_blogpost_file', $data);
530

531
532
533
        $data = new StdClass;
        $data->artefact = $artefactid;
        $data->parent = $this->get('id');
534
535
        $data->dirty = true;
        insert_record('artefact_parent_cache', $data);
536
537
538
539
540
541

        // Ensure the attachment is recorded as being related to the blog as well
        $data = new StdClass;
        $data->artefact = $artefactid;
        $data->parent = $this->get('parent');
        $data->dirty = 0;
542
543
544
545

        $where = $data;
        unset($where->dirty);
        ensure_record_exists('artefact_parent_cache', $where, $data);
546
547
548
549
    }

    public function detach_file($artefactid) {
        delete_records('artefact_blog_blogpost_file', 'blogpost', $this->get('id'), 'file', $artefactid);
550
        delete_records('artefact_parent_cache', 'parent', $this->get('id'), 'artefact', $artefactid);
551
552
        // Remove the record relating the attachment with the blog
        delete_records('artefact_parent_cache', 'parent', $this->get('parent'), 'artefact', $artefactid);
553
554
    }

Richard Mansfield's avatar
Richard Mansfield committed
555
556
557
558
559
560

    protected function count_attachments() {
        return count_records('artefact_blog_blogpost_file', 'blogpost', $this->get('id'));
    }


561
    public static function get_icon($options=null) {
562
563
    }

Nigel McNie's avatar
Nigel McNie committed
564
    public static function is_singular() {
Penny Leach's avatar
Penny Leach committed
565
566
567
        return false;
    }

Alastair Pharo's avatar
Alastair Pharo committed
568
    public static function collapse_config() {
569
570
    }

Alastair Pharo's avatar
Alastair Pharo committed
571
572
573
574
575
576
577
578
579
    /**
     * This function returns a list of the current user's blog posts, for the
     * given blog.
     *
     * @param User
     * @param integer
     * @param integer
     */
    public static function get_posts(User $user, $id, $limit = self::pagination, $offset = 0) {
580
        ($result = get_records_sql_assoc("
Alastair Pharo's avatar
Alastair Pharo committed
581
         SELECT a.id, a.title, a.description, a.ctime, a.mtime, bp.published
582
583
         FROM {artefact} a
          LEFT OUTER JOIN {artefact_blog_blogpost} bp
Alastair Pharo's avatar
Alastair Pharo committed
584
585
586
587
           ON a.id = bp.blogpost
         WHERE a.parent = ?
          AND a.artefacttype = 'blogpost'
          AND a.owner = ?
588
         ORDER BY bp.published ASC, a.ctime DESC
Alastair Pharo's avatar
Alastair Pharo committed
589
590
591
592
593
594
595
596
         LIMIT ? OFFSET ?;", array(
            $id,
            $user->get('id'),
            $limit,
            $offset
        )))
            || ($result = array());

597
598
599
600
        $count = (int)get_field('artefact', 'COUNT(*)', 'owner', $user->get('id'), 
                                'artefacttype', 'blogpost', 'parent', $id);

        // Get the attached files.
601
        if (count($result) > 0) {
602
603
604
605
            $idlist = implode(', ', array_map(create_function('$a', 'return $a->id;'), $result));
            $files = get_records_sql_array('
               SELECT
                  bf.blogpost, bf.file, a.artefacttype, a.title, a.description
606
607
               FROM {artefact_blog_blogpost_file} bf
                  INNER JOIN {artefact} a ON bf.file = a.id
608
609
610
611
612
613
614
               WHERE bf.blogpost IN (' . $idlist . ')', '');
            if ($files) {
                foreach ($files as $file) {
                    $result[$file->blogpost]->files[] = $file;
                }
            }
        }
Alastair Pharo's avatar
Alastair Pharo committed
615

616
        return array($count, array_values($result));
Alastair Pharo's avatar
Alastair Pharo committed
617
618
    }

619
    /** 
Alastair Pharo's avatar
Alastair Pharo committed
620
621
622
623
624
625
626
627
628
629
    /**
     * This function creates a new blog post.
     *
     * @param User
     * @param array
     */
    public static function new_post(User $user, array $values) {
        $artefact = new ArtefactTypeBlogPost();
        $artefact->set('title', $values['title']);
        $artefact->set('description', $values['description']);
Alastair Pharo's avatar
Alastair Pharo committed
630
        $artefact->set('published', $values['published']);
Alastair Pharo's avatar
Alastair Pharo committed
631
        $artefact->set('owner', $user->get('id'));
632
        $artefact->set('parent', $values['parent']);
Alastair Pharo's avatar
Alastair Pharo committed
633
        $artefact->commit();
634
        return true;
635
    }
Alastair Pharo's avatar
Alastair Pharo committed
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651

    /** 
     * This function updates an existing blog post.
     *
     * @param User
     * @param array
     */
    public static function edit_post(User $user, array $values) {
        $artefact = new ArtefactTypeBlogPost($values['id']);
        if ($user->get('id') != $artefact->get('owner')) {
            return false;
        }

        $artefact->set('title', $values['title']);
        $artefact->set('description', $values['description']);
        $artefact->set('published', $values['published']);
652
        $artefact->set('tags', $values['tags']);
Alastair Pharo's avatar
Alastair Pharo committed
653
654
655
656
        $artefact->commit();
        return true;
    }

657
658
659
    // Where to store temporary blog post files under dataroot
    static $blogattachmentroot = 'artefact/blog/uploads/';

660
661
662
663
664
665
666

    public static function get_temp_file_path($createid, $uploadnumber) {
        return get_config('dataroot') . self::$blogattachmentroot 
            . session_id() . $createid . '/' . $uploadnumber;
    }


667
668
669
670
671
672
673
674
    /**
     * Returns the size of a temporary attachment
     */
    public static function temp_attachment_size($createid, $uploadnumber) {
        return filesize(self::get_temp_file_path($createid, $uploadnumber));
    }


675
676
677
678
    /** 
     * This function saves an uploaded file to a temporary directory in dataroot
     *
     */
679
    public static function save_attachment_temporary($inputname, $dirname, $filename) {
680
681
        require_once('uploadmanager.php');
        $um = new upload_manager($inputname);
682
683
684
        $result = new StdClass;
        $tempdir = self::$blogattachmentroot . $dirname;
        $result->error = $um->process_file_upload($tempdir, $filename);
685
        $result->oldextension = $um->original_filename_extension();
686
687
688
689
        $tempfile = $tempdir . '/' . $filename;
        safe_require('artefact', 'file');
        $result->type = ArtefactTypeFile::detect_artefact_type($tempfile);
        return $result;
690
691
692
    }


693
694
695
    /**
     * Save a temporary uploaded file to the myfiles area.
     */
696
    public function save_attachment($directory, $filename, $title, $description, $oldextension, $tags) {
697
698
699
700
701
702
703

        // Create the blogfiles folder if it doesn't exist yet.
        $blogfilesid = self::blogfiles_folder_id();
        if (!$blogfilesid) {
            return false;
        }

704
705
706
707
708
709
710
        global $USER;

        safe_require('artefact', 'file');

        $data = new StdClass;
        $data->title = $title;
        $data->description = $description;
711
        $data->tags = $tags;
Richard Mansfield's avatar
Richard Mansfield committed
712
713
        $data->owner = $USER->get('id');
        $data->adminfiles = 0; // No admin blogs yet...
714
        $data->parent = $blogfilesid;
715
        $data->oldextension = $oldextension;
Richard Mansfield's avatar
Richard Mansfield committed
716
717
        
        $path = self::$blogattachmentroot . $directory . '/' . $filename;
718

Richard Mansfield's avatar
Richard Mansfield committed
719
        if (!$fileid = ArtefactTypeFile::save_file($path, $data)) {
720
721
            return false;
        }
722
723

        $this->attach_file($fileid);
724
        return $fileid;
725
726
    }

727
    public static function blogfiles_folder_id($create = true) {
728
729
730
        $name = get_string('blogfilesdirname', 'artefact.blog');
        $description = get_string('blogfilesdirdescription', 'artefact.blog');
        safe_require('artefact', 'file');
731
        return ArtefactTypeFolder::get_folder_id($name, $description, null, null, $create);
732
733
    }

734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
    // Change the name & description of a user's blogfiles folder when the user changes language pref
    public static function change_language($userid, $oldlang, $newlang) {
        $oldname = get_string_from_language($oldlang, 'blogfilesdirname', 'artefact.blog');
        safe_require('artefact', 'file');
        $blogfiles = ArtefactTypeFolder::get_folder_by_name($oldname, null, $userid);
        if (empty($blogfiles)) {
            return;
        }

        $name = get_string_from_language($newlang, 'blogfilesdirname', 'artefact.blog');
        $description = get_string_from_language($newlang, 'blogfilesdirdescription', 'artefact.blog');
        if (!empty($name)) {
            $blogfiles = artefact_instance_from_id($blogfiles->id);
            $blogfiles->set('title', $name);
            $blogfiles->set('description', $description);
            $blogfiles->commit();
        }
    }

Alastair Pharo's avatar
Alastair Pharo committed
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
    /**
     * This function publishes the blog post.
     *
     * @return boolean
     */
    public function publish() {
        if (!$this->id) {
            return false;
        }
        
        $data = (object)array(
            'blogpost'  => $this->id,
            'published' => 1
        );

        if (get_field('artefact_blog_blogpost', 'COUNT(*)', 'blogpost', $this->id)) {
            update_record('artefact_blog_blogpost', $data, 'blogpost');
        }
        else {
            insert_record('artefact_blog_blogpost', $data);
        }
        return true;
    }
776
777
778
779
780
781
782
783

    /**
     * This function returns a list of files attached to a post to use
     * when displaying or editing a blog post
     *
     * @return array
     */
    public function get_attached_files() {
784
        $list = get_records_sql_array('SELECT a.id, a.artefacttype, a.title, a.description 
785
786
            FROM {artefact_blog_blogpost_file} f
            INNER JOIN {artefact} a ON a.id = f.file
787
788
            WHERE f.blogpost = ?
            ORDER BY a.title', array($this->id));
789
790

        // load tags
Martyn Smith's avatar
Martyn Smith committed
791
792
793
794
        if ($list) {
            foreach ( $list as &$attachment ) {
                $attachment->tags = join(', ', get_column('artefact_tag', 'tag', 'artefact', $attachment->id));
            }
795
796
        }
        return $list;
797
    }
798

799
    public function public_feedback_allowed() {
800
801
802
803
        // Comments are not allowed on posts when the blog has
        // commentsallowed set to 0;
        $parent = get_field('artefact', 'parent', 'id', $this->get('id'));
        return get_field('artefact_blog_blog', 'commentsallowed', 'blog', $parent);
804
    }
805
    
806
    
807
808
809
810
811
812
813
    public function feedback_notify_owner() {
        // Notify owner of comments on posts when the blog has
        // commentsnotify set to 1;
        $parent = get_field('artefact', 'parent', 'id', $this->get('id'));
        return get_field('artefact_blog_blog', 'commentsnotify', 'blog', $parent);
    }
    
Martyn Smith's avatar
Martyn Smith committed
814
815
816
817
818
819
820
    public static function get_links($id) {
        $wwwroot = get_config('wwwroot');

        return array(
            '_default'                                  => $wwwroot . 'artefact/blog/post.php?blogpost=' . $id,
        );
    }
821
}
822
823

?>