Squelette conditionnel

Ceci est une archive périmée mais qui reste intéressante, parfois autant pour l’article que les commentaires associés.

* 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 &agrave; cette adresse',
'aucun_mot' => 'Il n\'y a pas de mot-cl&eacute; &agrave; cette adresse',
'aucune_page' => 'Aucune page ne correspond &agrave; votre requ&ecirc;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

Notes

[1bien coller les balises, sans caractères supplémentaires, pour éviter l’envoi de caractères au navigateur avant l’envoi d’une entête, dixit Déesse A. qui a bien raison ;-)