Um dos recursos mais importantes para que o visitante possa encontrar as informações que deseja é o famoso link "mapa do site". O mapa do seu site pode ser organizado de várias formas e, naturalmente, é mais legal quando podemos fazer isso com calma, facilitando ao máximo o trabalho de achar o conteúdo procurado. Aliás, o dito "mapa do site" é uma importante ferramenta de acessibilidade e deveria estar sempre presente. É ele que garante o" aprendizado do layout do site" pelo usuário menos experiente ou em layouts incomuns, com sistemas de navegação fora do padrão, etc. Mas em situações em que há muitas páginas para catalogar ou onde páginas são criadas/excluídas dinamicamente, podemos usar um script para ler a estrutura do site e mostrar as páginas automaticamente.
Vou mostrar aqui um script em PHP que faz esse trabalho de catalogação e exibição automaticamente.
A idéia
Primeiro, o script tinha que ler um diretório (raiz do site) e guardar dados sobre todos os arquivos de tipos determinados, pela extensão - .HTM, .HTML, .PHP, etc. Legal, mas e quanto a arquivos PHP que não contém HTML, por exemplo? há muitos arquivos, inclusive .html que não deveriam ser listados… então precisamos também de algo que limite isso. Pensei em usar um array para isso, onde colocaria os nomes dos arquivos a serem excluídos. Ok, mas em grandes quantidades de arquivos isso ainda era insuficiente. Comecei então a ler os arquivos e pegar apenas os que tem alguma string entre as tags <title> e </title> e ler as META TAGs DESCRIPTION para descrever o arquivo na listagem. Os arquivos que não tem META DESCRIPTION podem também ser ignorados, bastando descomentar a linha a seguir na função printTree.
//if(empty($arr[’description’])) continue;
Bem, afinal, acho que ficou bem legal, mas é importante salientar que este script só vai ser realmente útil para sites que usam de forma eficiente as TAGs citadas, não repetindo um mesmo title para todas as páginas do site e com descrições específicas para cada página.
Para usar é preciso editar certas variáveis, como descrito no comentário dentro do script. Segue o script na íntegra:
<?php
/**
* Mapa do site
* ————
* @author Cau Guanabara
* @date 2006-10-01
*
* Este script cria um ‘mapa do site’ a partir dos arquivos dentro de determinado diretório.
* Os parâmetros buscados são os elementos HTML <TITLE> (para retirar o título) e
* <META NAME=description CONTENT=…> (para retirar a descrição). Se o documento não tiver o
* elemento TITLE, não será incluído na listagem. Se não tiver META Description, aparecerá
* na listagem, mas sem descrição.
* ———————————————————————–
* Para usar defina essas variáveis com os valores apropriados:
* $sitedir -> define o caminho para o diretório base da listagem (todos os sub-dir serão incluídos).
* $hostname -> define a URL para o diretório base da listagem, para compôr os links.
* $extensions -> define que tipos de arquivos serão incluídos na busca, pela extensão.
* $ignore -> define que arquivos e diretórios serão ignorados pelo sistema. Aqui deve-se usar
* apenas os nomes dos itens, não o caminho ou URL. Se houver vários itens com o mesmo
* nome em níveis diferentes, todos serão ignorados.
*
* Pode não ser conveniente usar este arquivo, se o conteúdo a ser listado é muito grande.
* Nesse caso, use este script para gerar o HTML e salve com extensão .html - será mais rápido.
*
* O HTML pode ser editado à vontade, bastando preservar as seções PHP. As tabelas estão vinculadas
* ao CSS e para modificar, edite as classes CSS abaixo.
*/
// ————-
// configurações
// ————-
// pasta raiz do site (path abs. ou rel. - não URL)
$sitedir = "./";
// URL do site para usar endereços absolutos (se ficar em branco, as URLs serão relativas)
$hostname = ‘http://localhost/’;
// extensões dos arquivos para listar
$extensions = array(’htm’,'html’,'php’,'asp’);
// nomes de pastas e arquivos que devem ser ignorados (em qualquer nível)
$ignore = array("sitemap.php");
// ————-
// isso foi necessário para pastas com conteúdo muito grande. O limite de 30 seg.
// não era suficiente, aumentei para 100 seg. (descomente se for necessário)
//set_time_limit(100);
$tree = dirItems($sitedir, $extensions, $ignore);
//print ‘<hr /><pre>’.print_r($tree,1)."</pre>\n";
printTree($tree, $hostname);
function dirItems($directory, $extensions, $ignore = array()) {
$items = array();
if($_dir = @opendir($directory)) {
while(($_file = readdir($_dir)) !== false) {
if(in_array($_file, $ignore)) continue;
if(is_file($directory.$_file) and preg_match("/\.(".join(’|',$extensions).")$/",$_file)) {
if($retit = readItem($directory.$_file)) $items[] = $retit;
}
if(is_dir($directory.$_file) and !preg_match("/^\./",$_file)) {
$items[$_file] = dirItems($directory.$_file.’/', $extensions, $ignore);
}
}
closedir($_dir);
}
return $items;
}
function readItem($item) { //print $item.’<br>’;
$ret = array(’name’ => preg_replace("/(^.+\/)([^\/]+)$/","$2",$item),
‘folder’ => preg_replace("/^.+\/([^\/]+)\/[^\/]+$/","$1",$item),
‘url’ => $item);
$conts = file_get_contents($item);
if(preg_match("/<title[^>]*>([^<]+)<\/title>/i", $conts, $matches)) $ret[’title’] = $matches[1];
else return false;
if(preg_match("/<meta[^>]*name=[\’\"]description[\’\"][^>]*content=[\’\"]([^\’\"]+)[\’\"]\s*\/?>/i", $conts, $matches))
$ret[’description’] = $matches[1];
return $ret;
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<meta name="description" content="Encontre facilmente as páginas que procura dentro deste site." />
<title>Mapa do site</title>
<style type="text/css">
<!–
body,td,th {
font-family: trebuchet MS, verdana, arial;
font-size: 14px;
}
body {
margin-left: 10px;
margin-top: 10px;
margin-right: 10px;
margin-bottom: 10px;
}
a.tit {
font-size: 16px;
font-weight:bold;
color:#000099;
}
a.tit:visited {
color:#005;
font-style:italic;
}
a.tit:hover {
color:#0000EE;
}
a.url {
color: #006633;
font-weight: bold;
}
a.url:visited { color:#666; font-style:italic; }
.tabela {
background-color:#FAFAFA;
margin-bottom:10px;
border:1px dotted #ccc;
width:500px;
}
.tabela td {
padding:5px;
}
fieldset.mapset {
padding:10px;
width:450px;
border:none;
margin-left:20px;
border-left:3px solid #E8E8E8;
}
fieldset.mapset legend {
font-size:120%;
color:#663333;
padding:3px;
}
–>
</style>
</head>
<body>
<?php
// criei essa função dentro do BODY para poder editar o html (…)
function printTree($tree, $host = ‘’, $retrue = false) {
$subs = array();
if($retrue) ob_start();
foreach($tree as $ind => $arr) {
if(is_string($ind) and count($arr) > 0) { // guarda as pastas para inserir no fim da lista
$sbs = printTree($arr, $host, true);
if(!empty($sbs))
$subs[] = "<fieldset class=\"mapset\"><legend>Diretório: ".
"<strong>$ind</strong></legend>".$sbs."</fieldset>";
continue;
}/**/
if(empty($arr[’url’]) or empty($arr[’title’])) continue;
// descomente para excluir da lista as páginas sem descrição
//if(empty($arr[’description’])) continue;
if($host) $arr[’url’] = preg_replace("/^\./", preg_replace("/\/?$/", "", $host), $arr[’url’]);
?>
<table class="tabela" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><a class="tit" href="<?=$arr[’url’]?>"><?=$arr[’title’]?></a></td>
</tr>
<?php if(!empty($arr[’description’])) { ?>
<tr>
<td><?=$arr[’description’]?></td>
</tr>
<?php } ?>
<tr>
<td><a class="url" href="<?=$arr[’url’]?>"><?=$arr[’url’]?></a></td>
</tr>
</table>
<?php
}
if(count($subs) > 0) print join("\n",$subs);
if($retrue) return ob_get_clean();
}
?>
</body>
</html>
Como vimos, o arquivo é uma página - depois de configurado, basta exibir no navegador. Pode-se editar o HTML e o CSS na página, naturalmente. Espero que seja útil ao menos como base para algo mais detalhado.










Legal o script, mas nao funcionou e deu um monte de erros
Por Eliseu em 2006-11-20 09:52:05, segunda
Eliseu:
esse script não foi devidamente testado, mas funcionou aqui…
Você podia descrever os erros para tentarmos resolver.
Por Cau Guanabara em 2006-11-20 09:52:05, segunda