Breadcrumbs, menù a briciole di pane

MarcoGrazia

Utente Attivo
15 Dic 2009
764
15
18
58
Udine
www.stilisticamente.com
Ciao,
ecco un semplice script in PHP che genera le cosiddette "briciole di pane" ovvero il breadcrumbs per un sito.

Premesse: per funzionare usa le sessioni,

Script da mettere in ogni pagina che si vuole monitorare per generare le breadcrumbs
PHP:
<?php
session_start();  //  Senza questo le sessioni non funzionano.
//    Genera il nome del file in esecuzione ( la pagina che stiamo guardando )
$paginaCorrente = basename( filter_var( $_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING ));
//    Inserisco la pagina corrente nell'array di sessione
$_SESSION['breadcrumb'][] = $paginaCorrente;
?><!DOCTYPE html>
<html lang="it">
        <head>
...........
        </head>
<body>
.......
<?php
//      Immagino che qui va il nostro menù a briciole di pane.
//      Ovviamente il layout della pagina è affar vostro ;-)
$links = "<ol>\n";
//      Elimino i dati ripetuti ( in una pagina si può entrare più volte, ma a noi interessa solo la prima volta che uno ci passa )
$_SESSION['breadcrumb'] = array_unique( $_SESSION['breadcrumb'] );
foreach ( $_SESSION['breadcrumb'] AS $url ) {
    $text = ucwords( substr( $url, 0, -4 ));  //  Rendo in maiuscoletto la stringa, ovvero il nome della pagina, senza l'estenzione finale ( supposto che sia sempre un punto più tre lettere - da rivedere! )
    if ( $url == $paginaCorrente ) {  //  Verifico se siamo sulla pagina, in questo caso la scrivo in un altro colore per marcarla
        $link .= "  <li><a href=\"$url\" style=\"color: red;\">$text</a></li>\n";  //  Link Rosso
    } else {
        $link .= "  <li><a href=\"$url\" style=\"color: green;\">$text</a></li>\n";  // Link Verde
    }
}
//    Stampo il risultato a video e chiudo la lista
echo "$link</ol>\n";
?>

.......
</body>
</html>
Ovviamente la formattazione ognuno si fa la sua, magari usando i CSS, così com'è stampa una lista ordinata di link in verde, uno sotto l'altro, con un unico in rosso, quello della pagina su cui state la momento.
:byebye:
 

MarcoGrazia

Utente Attivo
15 Dic 2009
764
15
18
58
Udine
www.stilisticamente.com
Correzione bugs!

Nello script c'è un errore: prima faccio menzione di uan variabile chiamata $links ( con la S finale ) e poi quella esse la tolgo.
PEr farlo funzionare bene, togliete la esse finale al nome della variabile $links qui:
PHP:
$links = "<ol>\n";
che diventa:
PHP:
$link = "<ol>\n";
Fatelo o vi darà errore!
Ho messo online un sito per farvelo provare: Breadcrumbs

Tanto per esser chiari ecco le pagine del sitozzarello
file-1.php / file-2.php / file-3.php
PHP:
<?php
session_start();  //  Senza questo le sessioni non funzionano.
//    Genera il nome del file in esecuzione ( la pagina che stiamo guardando )
$paginaCorrente = basename( filter_var( $_SERVER['PHP_SELF'], FILTER_SANITIZE_STRING ));
//    Inserisco la pagina corrente nell'array di sessione
$_SESSION['breadcrumb'][] = $paginaCorrente;
?><!DOCTYPE html>
<html lang="it">
        <head>
		<title>File 1</title>
		<meta charset="utf-8">
		<style>
			body {
				color: #000;
				background-color: #F5F5F5;
				margin: 0;
				z-index: 1;
			}
			ul,
			.breadcrumbs {
				list-style: none;
				margin: 0 auto;
				padding: 0;
				width: 90%;
				height: auto;
			}
			ul li,
			.breadcrumbs li {
				float: left;
				display: inline-block;
			}
			ul li a,
			.breadcrumbs li a {
				display: left;
				margin: 0 10px;
				padding: 5px;
				height: 2em;
				line-height: 2em;
				color: green;
			}
			ul li a {
				background-color: #D3D7CF;
				color: #26528F;
			}
			ul li a:hover {text-decoration: none;}
		</style>
        </head>
<body>
	<h1>Prova per un breadcrumbs</h1>
	<ul>
		<li><a href="file-1.php">Link 1</a></li>
		<li><a href="file-2.php">Link 2</a></li>
		<li><a href="file-3.php">Link 3</a></li>
	</ul>
	<p>&nbsp;</p>
<?php
//      Immagino che qui va il nostro menù a briciole di pane.
//      Ovviamente il layout della pagina è affar vostro ;-)
$link = "<ol class=\"breadcrumbs\">\n";
//      Elimino i dati ripetuti ( in una pagina si può entrare più volte, ma a noi interessa solo la prima volta che uno ci passa )
$_SESSION['breadcrumb'] = array_unique( $_SESSION['breadcrumb'] );
foreach ( $_SESSION['breadcrumb'] AS $url ) {
    $text = ucwords( substr( $url, 0, -4 ));  //  Rendo in maiuscoletto la stringa, ovvero il nome della pagina, senza l'estenzione finale ( supposto che sia sempre un punto più tre lettere - da rivedere! )
    if ( $url == $paginaCorrente ) {  //  Verifico se siamo sulla pagina, in questo caso la scrivo in un altro colore per marcarla
        $link .= "  <li><a href=\"$url\" style=\"color: red;\">$text</a> &raquo; </li>\n";  //  Link Rosso
    } else {
        $link .= "  <li><a href=\"$url\">$text</a> &raquo; </li>\n";  // Link Verde
    }
}
//    Stampo il risultato a video e chiudo la lista
echo "$link</ol>\n";
?>

</body>
</html>
Ovviamente le pagine sono tutte identiche, cambiano solo i nomi.
 
Ultima modifica:

MarcoGrazia

Utente Attivo
15 Dic 2009
764
15
18
58
Udine
www.stilisticamente.com
Considerazioni personali:
ovviamente si può modificare lo script, per esempio volendo aggiungere il query string all'url del file.
Immagino una pagina utente che si identifichi tramite una GET del tipo ... pagina_utente.php?id=123456 usando lo script così com'è la querystring si perde e con essa l'utente; se pagina_utente.php ha un warning tramite il quale chiunque passi di lì senza il querystring viene reindirizzato che so all'homepage, diventa inutile il breadcrumbs per quella pagina, dato che, ogni volta che proviamo a passare da lì veniamo reindirizzati altrove.
Ed è solo un esempio!

Altra cosa: nel mio primo post scrivo che
PHP:
//  Rendo in maiuscoletto la stringa, ovvero il nome della pagina, senza l'estenzione finale
//  ( supposto che sia sempre un punto più tre lettere - da rivedere! ) 
$text = ucwords( substr( $url, 0, -4 ));
Certo si può fare facilmente, per esempio rilevando l'ultima posizione del punto prima dell'estensione:
PHP:
$text = ucwords( substr( $url, 0, strripos( $url, '.' )));
Ma è davvero necessario?
Voglio dire: se qualcuno ha un server per far lavorare file con estensione diversa da PHP o addiruttura senza estensione, sì certo può servire, altrimenti è inutile e crea un lavoro in più alla macchina ( il server ).

Quello che invece si può fare è la modifica del nome del file, il testo dell'url per capirci, File-1 non è il massimo, File 1 è più umanamente accettabile, File: 1 è perfetto!
Se po' ffà :)
PHP:
$text = ucwords( substr( $url, 0, strripos( $url, '.' )));
$text = strtr( $text, array( '-' => ': ' ));
E avremo una formattazione come quella proposta.