* Il manque les conditionnelles (« pas d’article à cette adresse »)
dans les squelettes par défaut ; rendre une page vide, c’est pas top,
on devrait peut-être ajouter un<include(404.php3)>
.
Cette entrée de la TodoListe me tarabiscotte depuis un moment.
Ajoutons !
1. Créer le fichier 404.php3
:
<?php
header("HTTP/1.1 404 Not found");
header("Status: 404 Not found");
$fond = "404";
$delais = 0;
$flag_preserver = true;
include ("inc-public.php3");
?>
2. Créer le fichier 404-dist.html
:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html lang="#LANG">
<head>
<title>[#NOM_SITE_SPIP] : [(#NOM_SITE_SPIP|non_publie)]</title>
<meta http-equiv="Content-Type" content="text/html; charset=#CHARSET">
<!-- Ceci est la feuille de style par defaut pour les types internes a SPIP -->
<link rel="stylesheet" href="spip_style.css" type="text/css">
<!-- Les feuilles de style specifiques aux presents squelettes -->
<link rel="stylesheet" href="typographie.css" type="text/css">
<!-- media="..." permet de ne pas utiliser ce style sous Netscape 4
(sinon plantage) -->
<link rel="stylesheet" href="habillage.css" type="text/css"
media="print, projection, screen, tv">
<!-- Lien vers le backend pour navigateurs eclaires -->
<link rel="alternate" type="application/rss+xml" title="<:syndiquer_site:>"
href="backend.php3">
</head>
<body bgcolor="white" dir="#LANG_DIR">
<div id="navigation">
<h1 class="structure"><:navigation:></h1>
<!-- Menu de navigation general -->
<div class="menu">
<ul class="general">
<li class="menu-titre">
[<a href="(#URL_SITE_SPIP)"
title="<:accueil_site:>"><b>#NOM_SITE_SPIP</b></a>]
</li>
<li class="menu-item">
<a href="plan.php3"><:plan_site:></a>
</li>
<li class="menu-item">
<a href="resume.php3" title="<:articles_populaires:>"><:en_resume:></a>
</li>
<li class="menu-item">
<a href="ecrire/"><:espace_prive:></a>
</li>
</ul>
</div>
<!-- Formulaire de recherche -->
[(#FORMULAIRE_RECHERCHE)]
<!-- Menu de navigation rubriques -->
<B_rubriques>
<div class="menu">
<ul class="rubriques">
<BOUCLE_rubriques(RUBRIQUES) {racine} {par titre}>
<li>
<div class="menu-titre"><a href="#URL_RUBRIQUE"
[title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></div>
<B_sous_rubriques>
<ul class="menu-liste">
<BOUCLE_sous_rubriques(RUBRIQUES) {id_parent} {par titre}>
<li class="menu-item"><a href="#URL_RUBRIQUE"
[title="(#DESCRIPTIF|textebrut|entites_html)"]>#TITRE</a></li>
</BOUCLE_sous_rubriques>
</ul>
</B_sous_rubriques>
</li>
</BOUCLE_rubriques>
</ul>
</div>
</B_rubriques>
<!-- Logo SPIP -->
<a href="http://www.spip.net"><img src="NAVPICS/petit-logo-spip.gif" width="88"
height="31" border="0" alt="<:site_realise_avec_spip:>"></a>
</div>
<div id="principal" class="contenu">
[<h1 class="titre-texte">(#NOM_SITE_SPIP|non_publie)</h1>]
</div>
</body>
</html>
3. Ajouter le filtre non_publie dans mes_fonctions.php3
:
// urls d'objets non publiés
function non_publie($texte) {
global $id_article, $id_breve, $id_rubrique, $id_mot,
$id_auteur, $id_site, $id_document;
if($id_article) {
return _T("local/public/spip:aucun_article");
}
else if($id_breve) {
return _T("local/public/spip:aucune_breve");
}
else if($id_rubrique) {
return _T("local/public/spip:aucune_rubrique");
}
else if($id_site) {
return _T("local/public/spip:aucun_site");
}
else if($id_auteur) {
return _T("local/public/spip:aucun_auteur");
}
else if($id_mot) {
return _T("local/public/spip:aucun_mot");
}
else if($id_document) {
return _T("local/public/spip:aucun_document");
}
else {
return _T("local/public/spip:aucune_page");
}
}
4. Ajouter les codes manquants dans ecrire/lang/local_fr.php3
:
<?php
// This is a SPIP module file -- Ceci est un fichier module de SPIP
$GLOBALS['i18n_local_fr'] = array(
// A
'aucun_document' => 'Il n\'y a pas de document à cette adresse',
'aucun_mot' => 'Il n\'y a pas de mot-clé à cette adresse',
'aucune_page' => 'Aucune page ne correspond à votre requête',
);
?>
5. Dans tous les squelettes *-dist.html
,
modifier la fin de chaque fichier :
</body>
</html>
</BOUCLE_<objet>_principal>
<:aucun_<objet>:>
<INCLURE(404.php3){id_<objet>}>
<//B_<objet>_principal>
[1]
5bis. Pour éviter d’avoir 2 déclarations de DOCTYPE, ajouter au début de chaque fichier *-dist.html
:
<B_<objet>_principal>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<BOUCLE_<objet>_principal(<OBJETS>) {id_<objet>}>
Attention ! Pour site-dist.html
ce n’est pas la peine de se fatiguer, il n’est pas construit de la même manière et tient déjà compte du problème. On pourrait s’amuser à le réecrire entièrement...
6. S’arranger pour que les boutons d’administration n’apparaissent pas si l’id_<objet>
n’existe pas dans la base.
C’est la raison de la présence de la ligne :
$flag_preserver = true;
dans le fichier 404.php3
et de l’absence de la balise #FORMULAIRE_ADMIN
dans le squelette.
Pour être plus fin, il faudrait, par exemple dans inc-admin.php3
, modifier la fonction afficher_boutons_admin()
pour qu’elle n’affiche QUE le bouton ’recalculer cette page’... Mais cela nous oblige à modifier le noyau, et pour si peu, ce serait balot...
7. S’assurer de la non-prise en compte du hit dans les statistiques... Pas de mystère, c’est une modification du code qui nous attend. Aussi, considérons que ce dernier point est facultatif. Dans inc-stats.php3
, dans la fonction ecrire_stats()
:
else {
$log_type = "autre";
$log_id_num = 0;
}
if($id_rubrique>0) {
$query="SELECT id_rubrique FROM spip_rubriques WHERE statut='publie'
AND id_rubrique=".$id_rubrique;
$result = spip_query($query);
$row = spip_fetch_array($result);
if(!$row) { $log_type = "autre"; $log_id_num = 0; }
}
if($id_article>0) {
$query="SELECT id_article FROM spip_articles WHERE statut='publie'
AND id_article=".$id_article;
$result = spip_query($query);
$row = spip_fetch_array($result);
if(!$row) { $log_type = "autre"; $log_id_num = 0; }
}
if($id_breve>0) {
$query="SELECT id_breve FROM spip_breves WHERE statut='publie'
AND id_breve=".$id_breve;
$result = spip_query($query);
$row = spip_fetch_array($result);
if(!$row) { $log_type = "autre"; $log_id_num = 0; }
}
// Conversion IP 4 octets -> entier 32 bits
7. Si vous y tenez, Le fichier .htaccess à la racine de votre site pourra contenir :
ErrorDocument 404 404.php3
8. Un bonheur n’arrivant jamais seul, la gestion des « erreurs » de ce type est intégré à la version 1.8