xref: /plugin/struct/action/revert.php (revision 4fc908c26a1ba87b8658df684b82b191fd852c45)
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\AccessTable;
11use dokuwiki\plugin\struct\meta\Assignments;
12
13/**
14 * Class action_plugin_struct_entry
15 *
16 * Handles reverting to old data via revert action
17 */
18class action_plugin_struct_revert extends DokuWiki_Action_Plugin
19{
20
21    /**
22     * Registers a callback function for a given event
23     *
24     * @param Doku_Event_Handler $controller DokuWiki's event controller object
25     * @return void
26     */
27    public function register(Doku_Event_Handler $controller)
28    {
29        // ensure a page revision is created when struct data changes:
30        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'BEFORE', $this, 'handlePagesaveBefore');
31        // save struct data after page has been saved:
32        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handlePagesaveAfter');
33    }
34
35    /**
36     * Check if the page has to be changed
37     *
38     * @param Doku_Event $event event object by reference
39     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
40     *                           handler was registered]
41     * @return bool
42     */
43    public function handlePagesaveBefore(Doku_Event $event, $param)
44    {
45        if ($event->data['contentChanged']) return false; // will be saved for page changes already
46        global $ACT;
47        global $REV;
48        if ($ACT != 'revert' || !$REV) return false;
49
50        // force changes for revert if there are assignments
51        $assignments = Assignments::getInstance();
52        $tosave = $assignments->getPageAssignments($event->data['id']);
53        if (count($tosave)) {
54            $event->data['contentChanged'] = true; // save for data changes
55        }
56
57        return true;
58    }
59
60    /**
61     * Save the data, by loading it from the old revision and storing it as a new revision
62     *
63     * @param Doku_Event $event event object by reference
64     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
65     *                           handler was registered]
66     * @return bool
67     */
68    public function handlePagesaveAfter(Doku_Event $event, $param)
69    {
70        global $ACT;
71        global $REV;
72        if ($ACT != 'revert' || !$REV) return false;
73
74        $assignments = Assignments::getInstance();
75
76        //  we load the data to restore from DB:
77        $tosave = $assignments->getPageAssignments($event->data['id']);
78        foreach ($tosave as $table) {
79            $accessOld = AccessTable::getPageAccess($table, $event->data['id'], $REV);
80            $accessNew = AccessTable::getPageAccess($table, $event->data['id'], $event->data['newRevision']);
81            $accessNew->saveData($accessOld->getDataArray());
82
83            // make sure this schema is assigned
84            $assignments->assignPageSchema($event->data['id'], $table);
85        }
86        return true;
87    }
88}
89