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