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