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 10use dokuwiki\plugin\struct\meta\AccessTable; 11use dokuwiki\plugin\struct\meta\Assignments; 12 13/** 14 * Class action_plugin_struct_entry 15 * 16 * Handles reverting to old data via revert action 17 */ 18class action_plugin_struct_revert extends DokuWiki_Action_Plugin 19{ 20 21 /** 22 * Registers a callback function for a given event 23 * 24 * @param Doku_Event_Handler $controller DokuWiki's event controller object 25 * @return void 26 */ 27 public function register(Doku_Event_Handler $controller) 28 { 29 // ensure a page revision is created when struct data changes: 30 $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'BEFORE', $this, 'handlePagesaveBefore'); 31 // save struct data after page has been saved: 32 $controller->register_hook('COMMON_WIKIPAGE_SAVE', 'AFTER', $this, 'handlePagesaveAfter'); 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 handlePagesaveBefore(Doku_Event $event, $param) 44 { 45 if ($event->data['contentChanged']) return false; // will be saved for page changes already 46 global $ACT; 47 global $REV; 48 if ($ACT != 'revert' || !$REV) return false; 49 50 // force changes for revert if there are assignments 51 $assignments = Assignments::getInstance(); 52 $tosave = $assignments->getPageAssignments($event->data['id']); 53 if (count($tosave)) { 54 $event->data['contentChanged'] = true; // save for data changes 55 } 56 57 return true; 58 } 59 60 /** 61 * Save the data, by loading it from the old revision and storing it as a new revision 62 * 63 * @param Doku_Event $event event object by reference 64 * @param mixed $param [the parameters passed as fifth argument to register_hook() when this 65 * handler was registered] 66 * @return bool 67 */ 68 public function handlePagesaveAfter(Doku_Event $event, $param) 69 { 70 global $ACT; 71 global $REV; 72 if ($ACT != 'revert' || !$REV) return false; 73 74 $assignments = Assignments::getInstance(); 75 76 // we load the data to restore from DB: 77 $tosave = $assignments->getPageAssignments($event->data['id']); 78 foreach ($tosave as $table) { 79 $accessOld = AccessTable::getPageAccess($table, $event->data['id'], $REV); 80 $accessNew = AccessTable::getPageAccess($table, $event->data['id'], $event->data['newRevision']); 81 $accessNew->saveData($accessOld->getDataArray()); 82 83 // make sure this schema is assigned 84 $assignments->assignPageSchema($event->data['id'], $table); 85 } 86 return true; 87 } 88} 89