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