Jeżeli to będzie "nierozbudowane" menu z "niewielką" ilością ról, to może wystarczy taki a'la template
index.php (dla demonstracji logowania)
<?php
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
// Tu sprawdzenie login-a i hasła z bazy danych
// dla demonstracji poniżej symulacja zalogowania
$users = ['default', 'prezes', 'informatyk'];
if (in_array($_POST['login'], $users, true)) {
$_SESSION['role'] = $_POST['login'];
header('Location: menu.php');
exit();
}
} else {
unset($_SESSION);
session_destroy();
}
?>
<style>
form {
margin: 2em;
}
input, button {
display: block;
margin: 1em 0;
width: 16em;
}
</style>
<form action="" method="post">
<input type="text" id="login" name="login" placeholder="login" readonly />
<input type="password" id="password" name="password" placeholder="password" readonly />
<button type="submit" id="default">Zaloguj jako user ( default )</button>
<button type="submit" id="prezes">Zaloguj jako Prezes</button>
<button type="submit" id="informatyk">Zaloguj jako Informatyk</button>
</form>
<script>
const form = document.querySelector('form');
form.addEventListener('click', loginAs);
function loginAs(e) {
if (e.target.nodeName == 'BUTTON') {
form.querySelector('input#login').value = e.target.id;
form.querySelector('input#password').value = '1234';
} else {
e.preventDefault();
}
}
</script>
menu.php (dla demonstracji)
<?php
session_start();
$logged_as = ''; // dla demonstracji
$allow_for_menu = null;
if (isset($_COOKIE['PHPSESSID']) && isset($_SESSION['role'])) {
$logged_as = $_SESSION['role']; // dla demonstracji
$allow_for_menu = $_SESSION['role'];
} else {
header('Location: index.php');
exit();
}
?>
<!DOCTYPE html>
<html lang="pl">
<head>
<meta charset="utf-8" />
<style>
div, nav {
margin: 1em;
}
.show-role span {
font-weight: bold;
}
nav a {
display: block;
text-decoration: none;
margin: 0.35em 0;
font: 400 1em/1.1 arial;
}
nav a:hover {
text-decoration: underline;
}
nav a:last-child {
margin: 1em 0 0 0;
}
</style>
</head>
<body>
<!-- dla demonstracji -->
<div class="show-role">Zalogowany: <span><?php echo $logged_as; ?></span></div>
<nav>
<!--
default = niezalogowany w tym przykładzie,
to widzą wszyscy niezależnie od roli
-->
<a href='/panel' class='nav-a'>Strona główna</a>
<a href='/zgloszenia' class='nav-a'>Zgłoszenia</a>
<a href='/' class='nav-a'>Magazyn</a>
<a href='/' class='nav-a'>Faktury</a>
<!-- prezes zobaczy to co default plus to co może prezes -->
<?php if ($allow_for_menu == 'prezes'): ?>
<a href='/' class='nav-a'>Archiwum</a>
<a href='/zmiany' class='nav-a'>Zmiany</a>
<?php endif; ?>
<!-- informatyk zobaczy to co default plus to co może informatyk -->
<?php if ($allow_for_menu == 'informatyk'): ?>
<a href='/' class='nav-a'>Ustawienia</a>
<a href='/zmiany' class='nav-a'>Baza danych panel</a>
<?php endif; ?>
<!--
default = niezalogowany w tym przykładzie,
to widzą wszyscy niezależnie od roli
-->
<a href="index.php">Wyloguj</a>
</nav>
</body>
</html>
menu.php (wersja robocza)
<?php
session_start();
$allow_for_menu = null;
if (isset($_COOKIE['PHPSESSID']) && isset($_SESSION['role'])) {
$allow_for_menu = $_SESSION['role'];
} else {
header('Location: index.php');
exit();
}
?>
<!--
style ewentualnie też do usunięcia, w dokumencie głównym można podlikować
-->
<style>
nav {
margin: 1em;
}
nav a {
display: block;
text-decoration: none;
margin: 0.35em 0;
font: 400 1em/1.1 arial;
}
nav a:hover {
text-decoration: underline;
}
nav a:last-child {
margin: 1em 0 0 0;
}
</style>
<nav>
<a href='/panel' class='nav-a'>Strona główna</a>
<a href='/zgloszenia' class='nav-a'>Zgłoszenia</a>
<a href='/' class='nav-a'>Magazyn</a>
<a href='/' class='nav-a'>Faktury</a>
<?php if ($allow_for_menu == 'prezes'): ?>
<a href='/' class='nav-a'>Archiwum</a>
<a href='/zmiany' class='nav-a'>Zmiany</a>
<?php endif; ?>
<?php if ($allow_for_menu == 'informatyk'): ?>
<a href='/' class='nav-a'>Ustawienia</a>
<a href='/zmiany' class='nav-a'>Baza danych panel</a>
<?php endif; ?>
<a href="index.php">Wyloguj</a>
</nav>
Jeżeli menu ma być "rozbudowane" z dużą ilością ról, to polecałbym rozwiązanie, które podał @rafal.budzis;