187dc1344SAndreas Gohr<?php 2*d6d97f60SAnna 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 1087dc1344SAndreas Gohr// must be run within Dokuwiki 1187dc1344SAndreas Gohrif (!defined('DOKU_INC')) die(); 1287dc1344SAndreas Gohr 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 */ 21*d6d97f60SAnna Dabrowskaclass action_plugin_struct_revert extends DokuWiki_Action_Plugin 22*d6d97f60SAnna Dabrowska{ 2387dc1344SAndreas Gohr 2487dc1344SAndreas Gohr /** 2587dc1344SAndreas Gohr * Registers a callback function for a given event 2687dc1344SAndreas Gohr * 2787dc1344SAndreas Gohr * @param Doku_Event_Handler $controller DokuWiki's event controller object 2887dc1344SAndreas Gohr * @return void 2987dc1344SAndreas Gohr */ 30*d6d97f60SAnna Dabrowska public function register(Doku_Event_Handler $controller) 31*d6d97f60SAnna Dabrowska { 3287dc1344SAndreas Gohr // ensure a page revision is created when struct data changes: 3387dc1344SAndreas Gohr $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'BEFORE', $this, 'handle_pagesave_before'); 3487dc1344SAndreas Gohr // save struct data after page has been saved: 3587dc1344SAndreas Gohr $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handle_pagesave_after'); 3687dc1344SAndreas Gohr } 3787dc1344SAndreas Gohr 3887dc1344SAndreas Gohr /** 3987dc1344SAndreas Gohr * Check if the page has to be changed 4087dc1344SAndreas Gohr * 4187dc1344SAndreas Gohr * @param Doku_Event $event event object by reference 4287dc1344SAndreas Gohr * @param mixed $param [the parameters passed as fifth argument to register_hook() when this 4387dc1344SAndreas Gohr * handler was registered] 4487dc1344SAndreas Gohr * @return bool 4587dc1344SAndreas Gohr */ 46*d6d97f60SAnna Dabrowska public function handle_pagesave_before(Doku_Event $event, $param) 47*d6d97f60SAnna Dabrowska { 4887dc1344SAndreas Gohr if ($event->data['contentChanged']) return false; // will be saved for page changes already 4987dc1344SAndreas Gohr global $ACT; 5087dc1344SAndreas Gohr global $REV; 5187dc1344SAndreas Gohr if ($ACT != 'revert' || !$REV) return false; 5287dc1344SAndreas Gohr 5387dc1344SAndreas Gohr // force changes for revert if there are assignments 54025cb9daSAndreas Gohr $assignments = Assignments::getInstance(); 5587dc1344SAndreas Gohr $tosave = $assignments->getPageAssignments($event->data['id']); 5687dc1344SAndreas Gohr if (count($tosave)) { 5787dc1344SAndreas Gohr $event->data['contentChanged'] = true; // save for data changes 5887dc1344SAndreas Gohr } 5987dc1344SAndreas Gohr 6087dc1344SAndreas Gohr return true; 6187dc1344SAndreas Gohr } 6287dc1344SAndreas Gohr 6387dc1344SAndreas Gohr /** 6487dc1344SAndreas Gohr * Save the data, by loading it from the old revision and storing it as a new revision 6587dc1344SAndreas Gohr * 6687dc1344SAndreas Gohr * @param Doku_Event $event event object by reference 6787dc1344SAndreas Gohr * @param mixed $param [the parameters passed as fifth argument to register_hook() when this 6887dc1344SAndreas Gohr * handler was registered] 6987dc1344SAndreas Gohr * @return bool 7087dc1344SAndreas Gohr */ 71*d6d97f60SAnna Dabrowska public function handle_pagesave_after(Doku_Event $event, $param) 72*d6d97f60SAnna Dabrowska { 7387dc1344SAndreas Gohr global $ACT; 7487dc1344SAndreas Gohr global $REV; 7587dc1344SAndreas Gohr if ($ACT != 'revert' || !$REV) return false; 7687dc1344SAndreas Gohr 77025cb9daSAndreas Gohr $assignments = Assignments::getInstance(); 7887dc1344SAndreas Gohr 7987dc1344SAndreas Gohr // we load the data to restore from DB: 8087dc1344SAndreas Gohr $tosave = $assignments->getPageAssignments($event->data['id']); 8187dc1344SAndreas Gohr foreach ($tosave as $table) { 82f392071eSAndreas Gohr $accessOld = AccessTable::byTableName($table, $event->data['id'], $REV); 83f392071eSAndreas Gohr $accessNew = AccessTable::byTableName($table, $event->data['id'], $event->data['newRevision']); 8487dc1344SAndreas Gohr $accessNew->saveData($accessOld->getDataArray()); 8587dc1344SAndreas Gohr 8687dc1344SAndreas Gohr // make sure this schema is assigned 8787dc1344SAndreas Gohr $assignments->assignPageSchema($event->data['id'], $table); 8887dc1344SAndreas Gohr } 8987dc1344SAndreas Gohr return true; 9087dc1344SAndreas Gohr } 9187dc1344SAndreas Gohr} 92