1<?php 2 3if(!defined('DOKU_INC')) die(); 4define(APPROVED, 'Approved'); 5 6class action_plugin_approve_approve extends DokuWiki_Action_Plugin { 7 8 function register(&$controller) { 9 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, handle_approve, array()); 10 $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, handle_viewer, array()); 11 $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, handle_diff_accept, array()); 12 $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, handle_display_banner, array()); 13 $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, handle_showrev, array()); 14 } 15 16 function handle_diff_accept(&$event, $param) { 17 if ($event->data == 'diff' && isset($_GET['approve'])) { 18 ptln('<a href="'.DOKU_URL.'doku.php?id='.$_GET['id'].'&approve=approve">'.$this->getLang('approve').'</a>'); 19 } 20 } 21 22 function handle_showrev(&$event, $param) { 23 global $ID, $REV; 24 25 $last = $this->find_lastest_approved(); 26 if ($last == $REV) 27 $event->preventDefault(); 28 } 29 30 function can_approve() { 31 global $ID; 32 return auth_quickaclcheck($ID) >= AUTH_DELETE; 33 } 34 35 function handle_approve(&$event, $param) { 36 global $ID, $REV, $INFO; 37 if ($event->data == 'show' && isset($_GET['approve'])) { 38 if ( ! $this->can_approve()) return; 39 40 //change last commit comment to Approved 41 $meta = p_read_metadata($ID); 42 $meta[current][last_change][sum] = $meta[persistent][last_change][sum] = APPROVED; 43 $meta[current][last_change][user] = $meta[persistent][last_change][user] = $INFO[client]; 44 if (!array_key_exists($meta[current][contributor], $INFO[client])) { 45 $meta[current][contributor][$INFO[client]] = $INFO[userinfo][name]; 46 $meta[persistent][contributor][$INFO[client]] = $INFO[userinfo][name]; 47 } 48 p_save_metadata($ID, $meta); 49 //update changelog 50 //remove last line from file 51 $changelog_file = metaFN($ID, '.changes'); 52 $changes = file($changelog_file, FILE_SKIP_EMPTY_LINES); 53 $lastLogLine = array_pop($changes); 54 $info = parseChangelogLine($lastLogLine); 55 56 $info[user] = $INFO[client]; 57 $info[sum] = APPROVED; 58 59 $logline = implode("\t", $info)."\n"; 60 array_push($changes, $logline); 61 62 io_saveFile($changelog_file, implode('', $changes)); 63 64 header('Location: ?id='.$ID); 65 } 66 } 67 function handle_viewer(&$event, $param) { 68 global $REV, $ID; 69 if ($event->data != 'show') return; 70 if (auth_quickaclcheck($ID) > AUTH_READ) return; 71 72 $last = $this->find_lastest_approved(); 73 //no page is approved 74 if ($last == -1) return; 75 //approved page is the newest page 76 if ($last == 0) return; 77 78 //if we are viewing lastest revision, show last approved 79 if ($REV == 0) header("Location: ?id=$ID&rev=$last"); 80 } 81 function find_lastest_approved() { 82 global $ID; 83 $m = p_get_metadata($ID); 84 $sum = $m['last_change']['sum']; 85 if ($sum == APPROVED) 86 return 0; 87 88 $changelog = new PageChangeLog($ID); 89 //wyszukaj najnowszej zatwierdzonej 90 //poszukaj w dół 91 $chs = $changelog->getRevisions(0, 10000); 92 foreach ($chs as $rev) { 93 $ch = $changelog->getRevisionInfo($rev); 94 if ($ch['sum'] == APPROVED) 95 return $rev; 96 } 97 return -1; 98 } 99 100 function handle_display_banner(&$event, $param) { 101 global $ID, $REV, $INFO; 102 103 if($event->data != 'show') return; 104 if (!$INFO['exists']) return; 105 106 $m = p_get_metadata($ID); 107 $changelog = new PageChangeLog($ID); 108 109 //sprawdź status aktualnej strony 110 if ($REV != 0) { 111 $ch = $changelog->getRevisionInfo($REV); 112 $sum = $ch['sum']; 113 } else { 114 $sum = $m['last_change']['sum']; 115 } 116 117 if ($sum != APPRVOED) { 118 $class = 'approved_no'; 119 $last_approved_rev = $this->find_lastest_approved(); 120 } 121 122 123 ptln('<div class="approval '.($sum == APPROVED ? 'approved_yes' : 'approved_no').'">'); 124 125 tpl_pageinfo(); 126 ptln(' | '); 127 if ($sum == APPROVED) { 128 ptln('<span>'.$this->getLang('approved').'</span>'); 129 if ($REV != 0 && auth_quickaclcheck($ID) > AUTH_READ) { 130 ptln('<a href="'.wl($ID).'">'); 131 ptln($this->getLang($m['last_change']['sum'] == APPROVED ? 'newest_approved' : 'newest_draft')); 132 ptln('</a>'); 133 } else if ($REV != 0 && $REV != $last_approved_rev) { 134 ptln('<a href="'.wl($ID).'">'); 135 ptln($this->getLang('newest_approved')); 136 ptln('</a>'); 137 } 138 } else { 139 ptln('<span>'.$this->getLang('draft').'</span>'); 140 141 if (isset($last_approved_rev)) { 142 if ($last_approved_rev != 0) 143 ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev)).'">'); 144 else 145 ptln('<a href="'.wl($ID).'">'); 146 147 ptln($this->getLang('newest_approved')); 148 ptln('</a>'); 149 } else { 150 ptln('<a href="'.wl($ID).'">'); 151 ptln($this->getLang('newest_draft')); 152 ptln('</a>'); 153 } 154 155 //można zatwierdzać tylko najnowsze strony 156 if ($REV == 0 && $this->can_approve()) { 157 ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev, 'do' => 'diff', 158 'approve' => 'approve')).'">'); 159 ptln($this->getLang('approve')); 160 ptln('</a>'); 161 } 162 } 163 ptln('</div>'); 164 } 165 166} 167