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