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