summaryrefslogtreecommitdiff
path: root/manager/library/plugins/plugin.buildmenu.php
blob: f3cb261600b1ea904829986d2cb290d621908dda (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
<?php

/**
 * this plugin tries to add modules to the top navigation depending on the user
 * which is logged in and the required permissions needed (provided by the action modules)
 *
 * @author markus
 * $Id: plugin.buildmenu.php 95 2010-03-19 14:14:39Z markus $
 */
class BuildMenu extends Zend_Controller_Plugin_Abstract {
	public function preDispatch(Zend_Controller_Request_Abstract $request) {
		$session = Zend_Registry::get('session');
    	if (!isset($session->authdata) || !isset($session->authdata['authed']) || $session->authdata['authed'] === false)
    		return;

		$cur_ctrl = $request->getControllerName();
		$cur_action = $request->getActionName();

    	$view = Zend_Registry::get('view');

		if (is_dir(FWACTIONS_PATH)) {
			$dir = opendir(FWACTIONS_PATH);

			while (($file = readdir($dir)) !== false) {
				if ($file == '.' || $file == '..')
					continue;
				if (preg_match('/^Action([a-zA-Z0-9_]*)\.php/', $file, $match)) {
					$path = FWACTIONS_PATH . '/' . $file;
					require_once($path);

					$r = new ReflectionClass($match[1]);

					if ($r->isSubclassOf('FWAction')) {
						/**
						 * match Actions permission with the permissions of the currently logged in user,
						 * add to menu if user has access to that action
						 */

						$required = $r->getMethod('getRequiredPermissions')->invoke(null);
						$menuprio = $r->getMethod('getTopNavPrio')->invoke(null);
						$ctrl = $r->getMethod('getController')->invoke(null);
						$action = $r->getMethod('getAction')->invoke(null);
						$text = $r->getMethod('getMenutext')->invoke(null);
						$role = $session->authdata['authed_role'];

						if ($cur_ctrl == $ctrl) # && $cur_action == $action)
							$aclass = ' class="active"';
						else
							$aclass = '';

						$acl = $session->authdata['authed_permissions'];
						if (is_array($required) && count($required) == 0) {
							$view->topNav('<a href="' .
					    		$view->url(array('controller' => $ctrl, 'action' => $action), 'default', true) .
					   		'"' . $aclass . '>' . I18n::_($text) . '</a>', Zend_View_Helper_Placeholder_Container_Abstract::SET, $menuprio);
						}
						else {
							foreach ($required as $rperm) {
								if ($acl->has($rperm) && $acl->isAllowed($role, $rperm, 'view')) {
							    	$view->topNav('<a href="' .
							    		$view->url(array('controller' => $ctrl, 'action' => $action), 'default', true) .
							   		'"' . $aclass . '>' . I18n::_($text) . '</a>', Zend_View_Helper_Placeholder_Container_Abstract::SET, $menuprio);
					    		break;	// exit on first match
								}
							}
						}
					}
				}
			}

			closedir($dir);
		}
	}
}