1<?php
2
3/**
4 * DokuWiki Plugin struct (Action Component)
5 *
6 * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
7 * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
8 */
9
10use dokuwiki\plugin\struct\meta\PageMeta;
11use dokuwiki\plugin\struct\meta\StructException;
12
13/**
14 * Class action_plugin_struct_title
15 *
16 * Saves the page title when meta data is saved
17 */
18class action_plugin_struct_title extends DokuWiki_Action_Plugin
19{
20    /**
21     * Registers a callback function for a given event
22     *
23     * @param Doku_Event_Handler $controller DokuWiki's event controller object
24     * @return void
25     */
26    public function register(Doku_Event_Handler $controller)
27    {
28        $controller->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'handleMeta');
29    }
30
31    /**
32     * Store the page's title
33     *
34     * @param Doku_Event $event
35     * @param $param
36     */
37    public function handleMeta(Doku_Event $event, $param)
38    {
39        $id = $event->data['page'];
40
41        try {
42            $page = new PageMeta($id);
43
44            // check if we already have data for the latest revision, or we risk redundant db writes
45            $latest = $page->getPageData();
46            if (
47                $latest &&
48                // external edits do not have last change info
49                isset($event->data['current']['last_change']['date']) &&
50                (int)$latest['lastrev'] === $event->data['current']['last_change']['date']
51            ) {
52                return;
53            }
54
55            if (!blank($event->data['current']['title'])) {
56                $page->setTitle($event->data['current']['title']);
57            } else {
58                $page->setTitle(null);
59            }
60
61            if (!blank($event->data['current']['last_change']['date'])) {
62                $page->setLastRevision($event->data['current']['last_change']['date']);
63            } else {
64                $page->setLastRevision(null);
65            }
66
67            if (!blank($event->data['current']['last_change']['user'])) {
68                $page->setLastEditor($event->data['current']['last_change']['user']);
69            } elseif (!blank($event->data['current']['last_change']['ip'])) {
70                $page->setLastEditor($event->data['current']['last_change']['ip']);
71            } else {
72                $page->setLastEditor(null);
73            }
74
75            if (!blank($event->data['current']['last_change']['sum'])) {
76                $page->setLastSummary($event->data['current']['last_change']['sum']);
77            } else {
78                $page->setLastSummary(null);
79            }
80
81            $page->savePageData();
82        } catch (StructException $e) {
83            msg($e->getMessage(), -1);
84        }
85    }
86}
87