xref: /plugin/approve/action/approve.php (revision 9f9f09678a62a30bf19250bb7dd1fec3e153308a)
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($INFO[client], $meta[current][contributor])) {
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		ptln('<div class="approval '.($sum == APPROVED ? 'approved_yes' : 'approved_no').'">');
118
119		tpl_pageinfo();
120		ptln(' | ');
121		$last_approved_rev = $this->find_lastest_approved();
122		if ($sum == APPROVED) {
123			ptln('<span>'.$this->getLang('approved').'</span>');
124			if ($REV != 0 && auth_quickaclcheck($ID) > AUTH_READ) {
125				ptln('<a href="'.wl($ID).'">');
126				ptln($this->getLang($m['last_change']['sum'] == APPROVED ? 'newest_approved' : 'newest_draft'));
127				ptln('</a>');
128			} else if ($REV != 0 && $REV != $last_approved_rev) {
129				ptln('<a href="'.wl($ID).'">');
130				ptln($this->getLang('newest_approved'));
131				ptln('</a>');
132			}
133		} else {
134			ptln('<span>'.$this->getLang('draft').'</span>');
135
136			if ($last_approved_rev == -1) {
137			    if ($REV != 0) {
138				    ptln('<a href="'.wl($ID).'">');
139				    	ptln($this->getLang('newest_draft'));
140				    ptln('</a>');
141				}
142			} else {
143				if ($last_approved_rev != 0)
144					ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev)).'">');
145				else
146					ptln('<a href="'.wl($ID).'">');
147
148					ptln($this->getLang('newest_approved'));
149				ptln('</a>');
150			}
151
152			//można zatwierdzać tylko najnowsze strony
153			if ($REV == 0 && $this->can_approve()) {
154				ptln('<a href="'.wl($ID, array('rev' => $last_approved_rev, 'do' => 'diff',
155				'approve' => 'approve')).'">');
156					ptln($this->getLang('approve'));
157				ptln('</a>');
158			}
159		}
160		ptln('</div>');
161	}
162
163}
164