lib.php 23 KB
Newer Older
1
2
<?php
/**
Francois Marier's avatar
Francois Marier committed
3
 * Mahara: Electronic portfolio, weblog, resume builder and social networking
4
 * Copyright (C) 2006-2008 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
 *
 * @package    mahara
 * @subpackage artefact-blog
21
 * @author     Catalyst IT Ltd
22
 * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL
23
 * @copyright  (C) 2006-2008 Catalyst IT Ltd http://catalyst.net.nz
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 *
 */

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
    public static function get_cron() {
61
        return array();
62
63
    }

64
65
66
67
68
69
70
71

    public static function block_advanced_options_element($configdata, $artefacttype) {
        $strartefacttype = get_string($artefacttype, 'artefact.blog');
        return array(
            'type' => 'fieldset',
            'name' => 'advanced',
            'collapsible' => true,
            'collapsed' => false,
72
            'legend' => get_string('moreoptions', 'artefact.blog'),
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
            'elements' => array(
                'copytype' => array(
                    'type' => 'select',
                    'title' => get_string('blockcopypermission', 'view'),
                    'description' => get_string('blockcopypermissiondesc', 'view'),
                    'defaultvalue' => isset($configdata['copytype']) ? $configdata['copytype'] : 'nocopy',
                    'options' => array(
                        'nocopy' => get_string('copynocopy', 'artefact.blog'),
                        'reference' => get_string('copyreference', 'artefact.blog', $strartefacttype),
                        'full' => get_string('copyfull', 'artefact.blog', $strartefacttype),
                    ),
                ),
            ),
        );
    }

89
90
91
92
93
94
95
}

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

Alastair Pharo's avatar
Alastair Pharo committed
96
97
98
99
    /**
     * This constant gives the per-page pagination for listing blogs.
     */
    const pagination = 10;
100
101


102
103
104
105
106
107
108
109
    /**
     * We override the constructor to fetch the extra data.
     *
     * @param integer
     * @param object
     */
    public function __construct($id = 0, $data = null) {
        parent::__construct($id, $data);
110
111
112
113
114
115
116
117

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

    public function is_container() {
        return true;
118
    }
Alastair Pharo's avatar
Alastair Pharo committed
119
120

    /**
121
122
123
     * 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
124
     */
125
    public function commit() {
126
127
128
129
130
131
132
133
134
135
136
137
        // 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();

        $this->dirty = false;
138
139
    }

Alastair Pharo's avatar
Alastair Pharo committed
140
    /**
141
142
     * This function extends ArtefactType::delete() by deleting blog-specific
     * data.
Alastair Pharo's avatar
Alastair Pharo committed
143
     */
144
    public function delete() {
145
146
147
148
149
150
        if (empty($this->id)) {
            return;
        }

        // Delete the artefact and all children.
        parent::delete();
151
152
    }

153
154
155
156
157
158
159
160
161
162
163
164
165
    /**
     * 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'));
        }
    }

166

167
168
    public function describe_size() {
        return $this->count_children() . ' ' . get_string('posts', 'artefact.blog');
169
170
    }

171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
    /**
     * 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'])) {
192
193
            $smarty->assign('artefacttitle', '<a href="' . get_config('wwwroot') . 'view/artefact.php?artefact='
                                             . $this->get('id') . '&view=' . $options['viewid']
194
195
196
197
198
199
200
201
202
203
204
                                             . '">' . $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'));
205
        $smarty->assign('description', $this->get('description'));
206
207
208
209
210
211
212
213

        // 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' => '');
    }

214
                
215
    public static function get_icon($options=null) {
216
217
    }

Nigel McNie's avatar
Nigel McNie committed
218
    public static function is_singular() {
Penny Leach's avatar
Penny Leach committed
219
220
221
        return false;
    }

Alastair Pharo's avatar
Alastair Pharo committed
222
    public static function collapse_config() {
223
224
    }

Alastair Pharo's avatar
Alastair Pharo committed
225
226
227
228
229
230
231
232
233
    /**
     * 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
234
         FROM {artefact}
Alastair Pharo's avatar
Alastair Pharo committed
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
         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
252
    public static function new_blog(User $user, array $values) {
Alastair Pharo's avatar
Alastair Pharo committed
253
254
255
256
        $artefact = new ArtefactTypeBlog();
        $artefact->set('title', $values['title']);
        $artefact->set('description', $values['description']);
        $artefact->set('owner', $user->get('id'));
257
        $artefact->set('tags', $values['tags']);
Alastair Pharo's avatar
Alastair Pharo committed
258
        $artefact->commit();
259
    }
Alastair Pharo's avatar
Alastair Pharo committed
260
261
262
263
264
265
266
267
268
269
270
271
272

    /**
     * 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']);
273
274
275
276
        if ($user->get('id') != $artefact->get('owner')) {
            return;
        }
        
Alastair Pharo's avatar
Alastair Pharo committed
277
278
        $artefact->set('title', $values['title']);
        $artefact->set('description', $values['description']);
279
        $artefact->set('tags', $values['tags']);
Alastair Pharo's avatar
Alastair Pharo committed
280
281
        $artefact->commit();
    }
282

Martyn Smith's avatar
Martyn Smith committed
283
284
    public static function get_links($id) {
        $wwwroot = get_config('wwwroot');
285

Martyn Smith's avatar
Martyn Smith committed
286
287
288
289
290
        return array(
            '_default'                                  => $wwwroot . 'artefact/blog/view/?id=' . $id,
            get_string('blogsettings', 'artefact.blog') => $wwwroot . 'artefact/blog/settings/?id=' . $id,
        );
    }
291
292
293
294
295

    public function copy_extra($new) {
        $new->set('title', get_string('Copyof', 'mahara', $this->get('title')));
    }

296
297
298
299
300
301
302
}

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

303
    /**
Alastair Pharo's avatar
Alastair Pharo committed
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
     * 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);

319
320
321
322
323
        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;
324
                    }
Alastair Pharo's avatar
Alastair Pharo committed
325
                }
326
327
328
329
            }
            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'));
330
331
            }
        }
Alastair Pharo's avatar
Alastair Pharo committed
332
333
334
    }

    /**
335
     * This method extends ArtefactType::commit() by adding additional data
Alastair Pharo's avatar
Alastair Pharo committed
336
     * into the artefact_blog_blogpost table.
337
338
339
340
341
     *
     * This method also works out what blockinstances this blogpost is in, and 
     * informs them that they should re-check what artefacts they have in them.
     * The post content may now link to different artefacts. See {@link 
     * PluginBlocktypeBlogPost::get_artefacts for more information}
342
     */
343
    public function commit() {
Alastair Pharo's avatar
Alastair Pharo committed
344
345
346
347
        if (empty($this->dirty)) {
            return;
        }

348
        db_begin();
Alastair Pharo's avatar
Alastair Pharo committed
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
        $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');
        }

367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
        // We want to get all blockinstances that contain this blog post. That is currently:
        // 1) All blogpost blocktypes with this post in it
        // 2) All blog blocktypes with this posts's blog in it
        //
        // With these, we tell them to rebuild what artefacts they have in them, 
        // since the post content could have changed and now have links to 
        // different artefacts in it
        $blockinstanceids = (array)get_column_sql('SELECT block
            FROM {view_artefact}
            WHERE artefact = ?
            OR artefact = ?', array($this->get('id'), $this->get('parent')));
        if ($blockinstanceids) {
            require_once(get_config('docroot') . 'blocktype/lib.php');
            foreach ($blockinstanceids as $id) {
                $instance = new BlockInstance($id);
                $instance->rebuild_artefact_list();
            }
        }

        db_commit();
Alastair Pharo's avatar
Alastair Pharo committed
387
        $this->dirty = false;
388
389
    }

390
    /**
Alastair Pharo's avatar
Alastair Pharo committed
391
392
     * This function extends ArtefactType::delete() by also deleting anything
     * that's in blogpost.
393
     */
394
    public function delete() {
Alastair Pharo's avatar
Alastair Pharo committed
395
396
397
        if (empty($this->id)) {
            return;
        }
398

399
        $this->detach(); // Detach all file attachments
Alastair Pharo's avatar
Alastair Pharo committed
400
401
402
403
        delete_records('artefact_blog_blogpost', 'blogpost', $this->id);
      
        parent::delete();
    }
404
405
406
407
408
409
410
411
412
413
414
415
416

    /**
     * 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'));
        }
    }
417
  
418
419
    public function describe_size() {
        return $this->count_attachments() . ' ' . get_string('attachments', 'artefact.blog');
420
421
    }

422
423
424
425
    public function render_self($options) {
        $smarty = smarty_core();
        if (empty($options['hidetitle'])) {
            if (isset($options['viewid'])) {
426
427
                $smarty->assign('artefacttitle', '<a href="' . get_config('wwwroot') . 'view/artefact.php?artefact='
                     . $this->get('id') . '&view=' . $options['viewid']
428
429
430
431
432
433
434
435
436
437
                     . '">' . $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'])) {
438
439
            safe_require('artefact', 'file');
            $postcontent = ArtefactTypeFolder::append_view_url($postcontent, $options['viewid']);
440
441
442
        }
        $smarty->assign('artefactdescription', $postcontent);
        $smarty->assign('artefact', $this);
443
        $attachments = $this->get_attachments();
444
445
        if ($attachments) {
            $this->add_to_render_path($options);
446
            require_once(get_config('docroot') . 'artefact/lib.php');
447
448
449
450
            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']));
451
                $attachment->viewpath = get_config('wwwroot') . 'view/artefact.php?artefact=' . $attachment->id . '&view=' . $options['viewid'];
452
453
                $attachment->downloadpath = get_config('wwwroot') . 'artefact/file/download.php?file=' . $attachment->id;
                if (isset($options['viewid'])) {
454
                    $attachment->downloadpath .= '&id=' . $options['viewid'];
455
456
457
458
459
460
461
462
463
464
465
466
                }
            }
            $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' => '');
    }


467
468
    public function can_have_attachments() {
        return true;
Richard Mansfield's avatar
Richard Mansfield committed
469
470
471
    }


472
    public static function get_icon($options=null) {
473
474
    }

Nigel McNie's avatar
Nigel McNie committed
475
    public static function is_singular() {
Penny Leach's avatar
Penny Leach committed
476
477
478
        return false;
    }

Alastair Pharo's avatar
Alastair Pharo committed
479
    public static function collapse_config() {
480
481
    }

Alastair Pharo's avatar
Alastair Pharo committed
482
483
484
485
486
487
488
489
490
    /**
     * 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) {
491
        ($result = get_records_sql_assoc("
492
         SELECT a.id, a.title, a.description, " . db_format_tsfield('a.ctime', 'ctime') . ', ' . db_format_tsfield('a.mtime', 'mtime') . ", bp.published
493
494
         FROM {artefact} a
          LEFT OUTER JOIN {artefact_blog_blogpost} bp
Alastair Pharo's avatar
Alastair Pharo committed
495
496
497
498
           ON a.id = bp.blogpost
         WHERE a.parent = ?
          AND a.artefacttype = 'blogpost'
          AND a.owner = ?
499
         ORDER BY bp.published ASC, a.ctime DESC
Alastair Pharo's avatar
Alastair Pharo committed
500
501
502
503
504
505
506
507
         LIMIT ? OFFSET ?;", array(
            $id,
            $user->get('id'),
            $limit,
            $offset
        )))
            || ($result = array());

508
509
510
        $count = (int)get_field('artefact', 'COUNT(*)', 'owner', $user->get('id'), 
                                'artefacttype', 'blogpost', 'parent', $id);

511
        if (count($result) > 0) {
512
            // Get the attached files.
513
            $files = ArtefactType::attachments_from_id_list(array_map(create_function('$a', 'return $a->id;'), $result));
514
515
            if ($files) {
                foreach ($files as $file) {
516
                    $result[$file->artefact]->files[] = $file;
517
518
                }
            }
519
520
521
522
523
524

            // Format dates properly
            foreach ($result as &$post) {
                $post->ctime = format_date($post->ctime, 'strftimedaydatetime');
                $post->mtime = format_date($post->mtime);
            }
525
        }
Alastair Pharo's avatar
Alastair Pharo committed
526

527
        return array($count, array_values($result));
Alastair Pharo's avatar
Alastair Pharo committed
528
529
    }

530
    /** 
Alastair Pharo's avatar
Alastair Pharo committed
531
532
533
534
535
536
537
538
539
540
    /**
     * 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
541
        $artefact->set('published', $values['published']);
Alastair Pharo's avatar
Alastair Pharo committed
542
        $artefact->set('owner', $user->get('id'));
543
        $artefact->set('parent', $values['parent']);
Alastair Pharo's avatar
Alastair Pharo committed
544
        $artefact->commit();
545
        return true;
546
    }
Alastair Pharo's avatar
Alastair Pharo committed
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562

    /** 
     * 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']);
563
        $artefact->set('tags', $values['tags']);
Alastair Pharo's avatar
Alastair Pharo committed
564
565
566
567
        $artefact->commit();
        return true;
    }

568

569
    public static function blogfiles_folder_id($create = true) {
570
        global $USER;
571
572
573
        $name = get_string('blogfilesdirname', 'artefact.blog');
        $description = get_string('blogfilesdirdescription', 'artefact.blog');
        safe_require('artefact', 'file');
574
        return ArtefactTypeFolder::get_folder_id($name, $description, null, $create, $USER->get('id'));
575
576
    }

577
578
579
580
    // 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');
581
        $blogfiles = ArtefactTypeFolder::get_folder_by_name($oldname, null, $userid, null, null);
582
583
584
585
586
587
588
589
590
591
592
593
594
595
        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
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
    /**
     * 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;
    }
619

620
    
Martyn Smith's avatar
Martyn Smith committed
621
622
623
624
625
626
627
    public static function get_links($id) {
        $wwwroot = get_config('wwwroot');

        return array(
            '_default'                                  => $wwwroot . 'artefact/blog/post.php?blogpost=' . $id,
        );
    }
628
629
630
631
632
633
634
635
636
637

    public function update_artefact_references(&$view, &$template, &$artefactcopies, $oldid) {
        parent::update_artefact_references($view, $template, $artefactcopies, $oldid);
        // Attach copies of the files that were attached to the old post.
        // Update <img> tags in the post body to refer to the new image artefacts.
        $regexp = array();
        $replacetext = array();
        if (isset($artefactcopies[$oldid]->oldattachments)) {
            foreach ($artefactcopies[$oldid]->oldattachments as $a) {
                if (isset($artefactcopies[$a])) {
638
                    $this->attach($artefactcopies[$a]->newid);
639
640
641
642
643
644
645
646
                }
                $regexp[] = '#<img([^>]+)src="' . get_config('wwwroot') . 'artefact/file/download.php\?file=' . $a . '"#';
                $replacetext[] = '<img$1src="' . get_config('wwwroot') . 'artefact/file/download.php?file=' . $artefactcopies[$a]->newid . '"';
            }
            $this->set('description', preg_replace($regexp, $replacetext, $this->get('description')));
        }
    }

647
648
649
650
651
    /**
     * During the copying of a view, we might be allowed to copy
     * blogposts but not the containing blog.  We need to create a new
     * blog to hold the copied posts.
     */
652
    public function default_parent_for_copy(&$view, &$template, $artefactstoignore) {
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
        static $blogid;

        if (!empty($blogid)) {
            return $blogid;
        }

        $blogname = get_string('viewposts', 'artefact.blog', $view->get('id'));
        $data = (object) array(
            'title'       => $blogname,
            'description' => get_string('postscopiedfromview', 'artefact.blog', $template->get('title')),
            'owner'       => $view->get('owner'),
            'group'       => $view->get('group'),
            'institution' => $view->get('institution'),
        );
        $blog = new ArtefactTypeBlog(0, $data);
        $blog->commit();

        $blogid = $blog->get('id');

        return $blogid;
    }
674
675
676
677
678
679
680
681

    /**
     * Looks through the blog post text for links to download artefacts, and 
     * returns the IDs of those artefacts.
     */
    public function get_referenced_artefacts_from_postbody() {
        return artefact_get_references_in_html($this->get('description'));
    }
682
}
683

684

685
?>