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