xref: /plugin/approve/action/approve.php (revision 2cf0ddf98be2a7f33d2688ef08fb906a2f80fed9)
11aeb2b4dSghi<?php
21aeb2b4dSghi
31aeb2b4dSghiif(!defined('DOKU_INC')) die();
41aeb2b4dSghidefine(APPROVED, 'Approved');
51aeb2b4dSghi
61aeb2b4dSghiclass action_plugin_approve_approve extends DokuWiki_Action_Plugin {
71aeb2b4dSghi
81aeb2b4dSghi    function register(&$controller) {
91aeb2b4dSghi        $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, handle_approve, array());
101aeb2b4dSghi        $controller->register_hook('TPL_ACT_RENDER', 'AFTER', $this, handle_diff_accept, array());
111aeb2b4dSghi        $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, handle_display_banner, array());
121aeb2b4dSghi        $controller->register_hook('HTML_SHOWREV_OUTPUT', 'BEFORE', $this, handle_showrev, array());
131aeb2b4dSghi    }
141aeb2b4dSghi
151aeb2b4dSghi	function handle_diff_accept(&$event, $param) {
161aeb2b4dSghi		if ($event->data == 'diff' && isset($_GET['approve'])) {
171aeb2b4dSghi			ptln('<a href="'.DOKU_URL.'doku.php?id='.$_GET['id'].'&approve=approve">'.$this->getLang('approve').'</a>');
181aeb2b4dSghi		}
191aeb2b4dSghi	}
201aeb2b4dSghi
211aeb2b4dSghi	function handle_showrev(&$event, $param) {
221aeb2b4dSghi		global $ID, $REV;
231aeb2b4dSghi
241aeb2b4dSghi		$last = $this->find_lastest_approved();
251aeb2b4dSghi		if ($last == $REV)
261aeb2b4dSghi			$event->preventDefault();
271aeb2b4dSghi	}
281aeb2b4dSghi
291aeb2b4dSghi	function can_approve() {
301aeb2b4dSghi		global $ID;
31*2cf0ddf9Sghi		return auth_quickaclcheck($ID) >= AUTH_DELETE;
321aeb2b4dSghi	}
331aeb2b4dSghi
341aeb2b4dSghi	function handle_approve(&$event, $param) {
351aeb2b4dSghi		global $ID, $REV;
361aeb2b4dSghi		if ( ! $this->can_approve()) return;
371aeb2b4dSghi		if ($event->data == 'show' && isset($_GET['approve'])) {
381aeb2b4dSghi			//Add or remove the new line from the end of the page. Silly but needed.
391aeb2b4dSghi			$content = rawWiki($ID, '');
401aeb2b4dSghi			if (substr($content, -1) == "\n") {
411aeb2b4dSghi				$content = substr($content, 0, -1);
421aeb2b4dSghi			} else {
431aeb2b4dSghi				$content .= "\n";
441aeb2b4dSghi			}
451aeb2b4dSghi			saveWikiText($ID, $content, APPROVED);
461aeb2b4dSghi
471aeb2b4dSghi			header('Location: ?id='.$ID);
481aeb2b4dSghi		}
491aeb2b4dSghi
501aeb2b4dSghi		/*czytacze wydzą najnowszą zatwierdzaną*/
511aeb2b4dSghi		$last = $this->find_lastest_approved();
521aeb2b4dSghi		/*użytkownik może tylko czytać i jednocześnie istnieje jakaś zatwierdzona strona*/
531aeb2b4dSghi		if (auth_quickaclcheck($ID) <= AUTH_READ && $last != -1)
541aeb2b4dSghi			/*najnowsza zatwierdzona nie jest najnowszą*/
551aeb2b4dSghi			/*i jednocześnie znajdujemy się w stronach nowszych niż aktualna zatwierdzona*/
561aeb2b4dSghi			if ($last != 0 && ($REV > $last || $REV == 0))
571aeb2b4dSghi				$REV = $last;
581aeb2b4dSghi	}
591aeb2b4dSghi	function find_lastest_approved() {
601aeb2b4dSghi		global $ID;
611aeb2b4dSghi		$m = p_get_metadata($ID);
621aeb2b4dSghi		$sum = $m['last_change']['sum'];
631aeb2b4dSghi		if ($sum == APPROVED)
641aeb2b4dSghi			return 0;
651aeb2b4dSghi
661aeb2b4dSghi		$changelog = new PageChangeLog($ID);
671aeb2b4dSghi		//wyszukaj najnowszej zatwierdzonej
681aeb2b4dSghi		//poszukaj w dół
691aeb2b4dSghi		$chs = $changelog->getRevisions(0, 10000);
701aeb2b4dSghi		foreach ($chs as $rev) {
711aeb2b4dSghi			$ch = $changelog->getRevisionInfo($rev);
721aeb2b4dSghi			if ($ch['sum'] == APPROVED)
731aeb2b4dSghi				return $rev;
741aeb2b4dSghi		}
751aeb2b4dSghi		return -1;
761aeb2b4dSghi	}
771aeb2b4dSghi
781aeb2b4dSghi    function handle_display_banner(&$event, $param) {
791aeb2b4dSghi		global $ID, $REV, $INFO;
801aeb2b4dSghi
811aeb2b4dSghi        if($event->data != 'show') return;
821aeb2b4dSghi		if (!$INFO['exists']) return;
831aeb2b4dSghi
841aeb2b4dSghi		$m = p_get_metadata($ID);
851aeb2b4dSghi		$changelog = new PageChangeLog($ID);
861aeb2b4dSghi
871aeb2b4dSghi		//sprawdź status aktualnej strony
881aeb2b4dSghi		if ($REV != 0) {
891aeb2b4dSghi			$ch = $changelog->getRevisionInfo($REV);
901aeb2b4dSghi			$sum = $ch['sum'];
911aeb2b4dSghi		} else {
921aeb2b4dSghi			$sum = $m['last_change']['sum'];
931aeb2b4dSghi		}
941aeb2b4dSghi
951aeb2b4dSghi		if ($sum != APPRVOED) {
961aeb2b4dSghi			$class = 'approved_no';
971aeb2b4dSghi			$last_approved_rev = $this->find_lastest_approved();
981aeb2b4dSghi		}
991aeb2b4dSghi
1001aeb2b4dSghi
1011aeb2b4dSghi		ptln('<div class="approval '.($sum == APPROVED ? 'approved_yes' : 'approved_no').'">');
1021aeb2b4dSghi
1031aeb2b4dSghi		tpl_pageinfo();
1041aeb2b4dSghi		ptln(' | ');
1051aeb2b4dSghi		if ($sum == APPROVED) {
1061aeb2b4dSghi			ptln('<span>'.$this->getLang('approved').'</span>');
1071aeb2b4dSghi			if ($REV != 0 && auth_quickaclcheck($ID) > AUTH_READ) {
1081aeb2b4dSghi				ptln('<a href="'.wl($ID).'">');
1091aeb2b4dSghi				ptln($this->getLang($m['last_change']['sum'] == APPROVED ? 'newest_approved' : 'newest_draft'));
1101aeb2b4dSghi				ptln('</a>');
1111aeb2b4dSghi			} else if ($REV != 0 && $REV != $last_approved_rev) {
1121aeb2b4dSghi				ptln('<a href="'.wl($ID).'">');
1131aeb2b4dSghi				ptln($this->getLang('newest_approved'));
1141aeb2b4dSghi				ptln('</a>');
1151aeb2b4dSghi			}
1161aeb2b4dSghi		} else {
1171aeb2b4dSghi			ptln('<span>'.$this->getLang('draft').'</span>');
1181aeb2b4dSghi
1191aeb2b4dSghi			if (isset($last_approved_rev)) {
1201aeb2b4dSghi				if ($last_approved_rev != 0)
1211aeb2b4dSghi					ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev)).'">');
1221aeb2b4dSghi				else
1231aeb2b4dSghi					ptln('<a href="'.wl($ID).'">');
1241aeb2b4dSghi
1251aeb2b4dSghi					ptln($this->getLang('newest_approved'));
1261aeb2b4dSghi				ptln('</a>');
1271aeb2b4dSghi			} else {
1281aeb2b4dSghi				ptln('<a href="'.wl($ID).'">');
1291aeb2b4dSghi					ptln($this->getLang('newest_draft'));
1301aeb2b4dSghi				ptln('</a>');
1311aeb2b4dSghi			}
1321aeb2b4dSghi
1331aeb2b4dSghi			//można zatwierdzać tylko najnowsze strony
1341aeb2b4dSghi			if ($REV == 0 && $this->can_approve()) {
1351aeb2b4dSghi				ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev, 'do' => 'diff',
1361aeb2b4dSghi				'approve' => 'approve')).'">');
1371aeb2b4dSghi					ptln($this->getLang('approve'));
1381aeb2b4dSghi				ptln('</a>');
1391aeb2b4dSghi			}
1401aeb2b4dSghi		}
1411aeb2b4dSghi		ptln('</div>');
1421aeb2b4dSghi	}
1431aeb2b4dSghi
1441aeb2b4dSghi}
145