xref: /plugin/struct/action/revert.php (revision 5e29103a15bd9873f422f66a6a5239b6aec4651e)
187dc1344SAndreas Gohr<?php
2d6d97f60SAnna Dabrowska
387dc1344SAndreas Gohr/**
487dc1344SAndreas Gohr * DokuWiki Plugin struct (Action Component)
587dc1344SAndreas Gohr *
687dc1344SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html
787dc1344SAndreas Gohr * @author  Andreas Gohr, Michael Große <dokuwiki@cosmocode.de>
887dc1344SAndreas Gohr */
987dc1344SAndreas Gohr
107234bfb1Ssplitbrainuse dokuwiki\Extension\ActionPlugin;
117234bfb1Ssplitbrainuse dokuwiki\Extension\EventHandler;
127234bfb1Ssplitbrainuse dokuwiki\Extension\Event;
13f392071eSAndreas Gohruse dokuwiki\plugin\struct\meta\AccessTable;
1487dc1344SAndreas Gohruse dokuwiki\plugin\struct\meta\Assignments;
1587dc1344SAndreas Gohr
1687dc1344SAndreas Gohr/**
1787dc1344SAndreas Gohr * Class action_plugin_struct_entry
1887dc1344SAndreas Gohr *
1987dc1344SAndreas Gohr * Handles reverting to old data via revert action
2087dc1344SAndreas Gohr */
217234bfb1Ssplitbrainclass action_plugin_struct_revert extends ActionPlugin
22d6d97f60SAnna Dabrowska{
2387dc1344SAndreas Gohr    /**
2487dc1344SAndreas Gohr     * Registers a callback function for a given event
2587dc1344SAndreas Gohr     *
26*5e29103aSannda     * @param EventHandler $controller DokuWiki's event controller object
2787dc1344SAndreas Gohr     * @return void
2887dc1344SAndreas Gohr     */
297234bfb1Ssplitbrain    public function register(EventHandler $controller)
30d6d97f60SAnna Dabrowska    {
3187dc1344SAndreas Gohr        // ensure a page revision is created when struct data changes:
32748e747fSAnna Dabrowska        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'BEFORE', $this, 'handlePagesaveBefore');
3387dc1344SAndreas Gohr        // save struct data after page has been saved:
34748e747fSAnna Dabrowska        $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handlePagesaveAfter');
3587dc1344SAndreas Gohr    }
3687dc1344SAndreas Gohr
3787dc1344SAndreas Gohr    /**
3887dc1344SAndreas Gohr     * Check if the page has to be changed
3987dc1344SAndreas Gohr     *
40*5e29103aSannda     * @param Event $event event object by reference
4187dc1344SAndreas Gohr     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
4287dc1344SAndreas Gohr     *                           handler was registered]
4387dc1344SAndreas Gohr     * @return bool
4487dc1344SAndreas Gohr     */
457234bfb1Ssplitbrain    public function handlePagesaveBefore(Event $event, $param)
46d6d97f60SAnna Dabrowska    {
4787dc1344SAndreas Gohr        if ($event->data['contentChanged']) return false; // will be saved for page changes already
4887dc1344SAndreas Gohr        global $ACT;
4987dc1344SAndreas Gohr        global $REV;
5087dc1344SAndreas Gohr        if ($ACT != 'revert' || !$REV) return false;
5187dc1344SAndreas Gohr
5287dc1344SAndreas Gohr        // force changes for revert if there are assignments
53025cb9daSAndreas Gohr        $assignments = Assignments::getInstance();
5487dc1344SAndreas Gohr        $tosave = $assignments->getPageAssignments($event->data['id']);
557234bfb1Ssplitbrain        if ($tosave !== []) {
5687dc1344SAndreas Gohr            $event->data['contentChanged'] = true; // save for data changes
5787dc1344SAndreas Gohr        }
5887dc1344SAndreas Gohr
5987dc1344SAndreas Gohr        return true;
6087dc1344SAndreas Gohr    }
6187dc1344SAndreas Gohr
6287dc1344SAndreas Gohr    /**
6387dc1344SAndreas Gohr     * Save the data, by loading it from the old revision and storing it as a new revision
6487dc1344SAndreas Gohr     *
65*5e29103aSannda     * @param Event $event event object by reference
6687dc1344SAndreas Gohr     * @param mixed $param [the parameters passed as fifth argument to register_hook() when this
6787dc1344SAndreas Gohr     *                           handler was registered]
6887dc1344SAndreas Gohr     * @return bool
6987dc1344SAndreas Gohr     */
707234bfb1Ssplitbrain    public function handlePagesaveAfter(Event $event, $param)
71d6d97f60SAnna Dabrowska    {
7287dc1344SAndreas Gohr        global $ACT;
7387dc1344SAndreas Gohr        global $REV;
7487dc1344SAndreas Gohr        if ($ACT != 'revert' || !$REV) return false;
7587dc1344SAndreas Gohr
76025cb9daSAndreas Gohr        $assignments = Assignments::getInstance();
7787dc1344SAndreas Gohr
7887dc1344SAndreas Gohr        //  we load the data to restore from DB:
7987dc1344SAndreas Gohr        $tosave = $assignments->getPageAssignments($event->data['id']);
8087dc1344SAndreas Gohr        foreach ($tosave as $table) {
814cd5cc28SAnna Dabrowska            $accessOld = AccessTable::getPageAccess($table, $event->data['id'], $REV);
824cd5cc28SAnna Dabrowska            $accessNew = AccessTable::getPageAccess($table, $event->data['id'], $event->data['newRevision']);
8387dc1344SAndreas Gohr            $accessNew->saveData($accessOld->getDataArray());
8487dc1344SAndreas Gohr
8587dc1344SAndreas Gohr            // make sure this schema is assigned
8687dc1344SAndreas Gohr            $assignments->assignPageSchema($event->data['id'], $table);
8787dc1344SAndreas Gohr        }
8887dc1344SAndreas Gohr        return true;
8987dc1344SAndreas Gohr    }
9087dc1344SAndreas Gohr}
91