From 441265dc41d05e58d9c55cadc5a14d5bb56eb957 Mon Sep 17 00:00:00 2001 From: "Committo,Ergo:sum" <esj@rezo.net> Date: Tue, 23 Oct 2007 16:22:52 +0000 Subject: [PATCH] =?UTF-8?q?Synth=C3=A8se=20=C3=A0=20la=20vol=C3=A9e=20de?= =?UTF-8?q?=20squelette=20sur=20table=20externe.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Afin d'illustrer les nouvelles possibilités de SPIP, l'erreur de squelette indéfini n'est pas provoquée si le nom du squelette correspond à une table SQL connue dans la base interrogée. A la place, un squelette minimal est produit automatiquement, qui visualise le contenu de la table SQL sous forme de table HTML ayant autant de colonnes que la table SQL a de champs. La balise #PAGINATION permet de faire défiler ses lignes par paquet de dix. La première (resp. dernière) ligne de la table HTML permet de trier la table selon la colonne choisie en mode ascendant (resp. descendant) et tenant compte du type de la colonne (numérique/date ou textuel). Tous les champs sont traités en critère conditionnel de la boucle implicite, ce qui permet également de trouver la ou les lignes dont la colonne a pour valeur celle donnée dans l'URL sous ce nom. Enfin, pour chaque champ dont la déclaration SQL indique {{{references}}} ''table'', un lien vers le squelette dynamique de cette autre table est produit. A essayer sur sa propre base SPIP: {{{./?page=petitions}}} par exemple. Compatibilité: l'argument {{{connect}}} a dû être rajouté à la fonction surchargeable '''styliser'''. Celle-ci avait déjà un argument supplémentaire optionnel, jamais utilisé, savoir la possibilité d'avoir un autre suffixe que '''.html''' pour les squelettes. L'argument optionnel {{{connect}}}, de plus grande utilité, vient s'intercaler avant lui. Rien de changé pour SPIP ni pour les extensions qui n'utilisaient pas ça (y en a-t-il qui le font ?). --- .gitattributes | 1 + ecrire/public/parametrer.php | 2 +- ecrire/public/styliser.php | 23 ++++++-- ecrire/public/vertebrer.php | 109 +++++++++++++++++++++++++++++++++++ 4 files changed, 129 insertions(+), 6 deletions(-) create mode 100755 ecrire/public/vertebrer.php diff --git a/.gitattributes b/.gitattributes index e92528e7b4..5b31c30d6c 100644 --- a/.gitattributes +++ b/.gitattributes @@ -700,6 +700,7 @@ ecrire/maj/v019.php -text ecrire/maj/v019_pre193.php -text ecrire/prive.php -text ecrire/public/index.php -text +ecrire/public/vertebrer.php -text ecrire/req/pg.php -text ecrire/rien.gif -text ecrire/typographie/en.php -text diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php index 804ad01917..2e604ed31e 100644 --- a/ecrire/public/parametrer.php +++ b/ecrire/public/parametrer.php @@ -326,7 +326,7 @@ function public_parametrer_dist($fond, $local='', $cache='', $connect='') { $styliser = charger_fonction('styliser', 'public'); list($skel,$mime_type, $gram, $sourcefile) = - $styliser($fond, $id_rubrique_fond, $GLOBALS['spip_lang']); + $styliser($fond, $id_rubrique_fond, $GLOBALS['spip_lang'], $connect); // Charger le squelette en specifiant les langages cibles et source // au cas il faudrait le compiler (source posterieure au resultat) diff --git a/ecrire/public/styliser.php b/ecrire/public/styliser.php index f2e98eef35..cb9fca2470 100644 --- a/ecrire/public/styliser.php +++ b/ecrire/public/styliser.php @@ -19,21 +19,34 @@ if (!defined("_ECRIRE_INC_VERSION")) return; // pour des raisons historiques, ce qui est trompeur // http://doc.spip.org/@public_styliser_dist -function public_styliser_dist($fond, $id_rubrique, $lang, $ext='html') { +function public_styliser_dist($fond, $id_rubrique, $lang='', $connect='', $ext='html') { - // Accrocher un squelette de base dans le chemin, sinon erreur + // Trouver un squelette de base dans le chemin if (!$base = find_in_path("$fond.$ext")) { + // Si pas de squelette regarder si c'est une table + $trouver_table = charger_fonction('trouver_table', 'base'); + $table = $trouver_table($fond, $connect); + if ($table) { + $base = _DIR_TMP . $fond . ".$ext"; + if (!file_exists($base) + OR $GLOBALS['var_mode'] == 'recalcul') { + $vertebrer = charger_fonction('vertebrer', 'public'); + $f = fopen($base, 'w'); + fwrite($f, $vertebrer($table)); + fclose($f); + } + } else { // on est gentil, mais la ... include_spip('public/debug'); erreur_squelette(_T('info_erreur_squelette2', - array('fichier'=>"'$fond'")), - $GLOBALS['dossier_squelettes']); + array('fichier'=>"'$fond'")), + $GLOBALS['dossier_squelettes']); $f = find_in_path(".$ext"); // on ne renvoie rien ici, c'est le resultat vide qui provoquere un 404 si necessaire return array(substr($f, 0, -strlen(".$ext")), $ext, $ext, $f); + } } - // supprimer le ".html" pour pouvoir affiner par id_rubrique ou par langue $squelette = substr($base, 0, - strlen(".$ext")); diff --git a/ecrire/public/vertebrer.php b/ecrire/public/vertebrer.php new file mode 100755 index 0000000000..ff69c73899 --- /dev/null +++ b/ecrire/public/vertebrer.php @@ -0,0 +1,109 @@ +<?php + +/***************************************************************************\ + * SPIP, Systeme de publication pour l'internet * + * * + * Copyright (c) 2001-2007 * + * Arnaud Martin, Antoine Pitrou, Philippe Riviere, Emmanuel Saint-James * + * * + * Ce programme est un logiciel libre distribue sous licence GNU/GPL. * + * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * +\***************************************************************************/ + +// +// Production dynamique d'un squelette lorsqu'il ne figure pas +// dans les dossiers de squelettes mais que son nom est celui d'une table SQL: +// on produit une table HTML montrant le contenu de la table SQL +// Le squelette produit illustre quelques possibilites de SPIP: +// - pagination automatique +// - tri ascendant et descendant sur chacune des colonnes +// - critere conditionnel donnant l'extrait correspondant a la colonne en URL +// + +if (!defined("_ECRIRE_INC_VERSION")) return; + +// nomme chaque colonne par le nom du champ, +// qui sert de lien vers la meme page, avec la table triee selon ce champ +// distingue champ numerique et non numerique + +function vertebrer_sort($fields, $direction) +{ + $res = ''; + foreach($fields as $n => $t) { + $tri = $direction + . ((test_sql_int($t) OR test_sql_date($r)) ? 'tri_n' : 'tri'); + $args =""; + foreach (array('tri', 'tri_n', '_tri', '_tri_n') as $c) { + if ($tri != $c) $args .= '|parametre_url{' . $c .',""}'; + } + // #SELF contient tous les parametes *tri*. A ameliorer + $url = "[(#SELF$args|parametre_url{" . $tri . ",'" . $n . "'})]"; + $res .= "\n\t\t<th><a href='$url'>$n</a></th>"; + } + return $res; +} + +// Autant de criteres conditionnels que de champs + +function vertebrer_crit($v) +{ + $res = "{pagination}" + . "\n\t{par #ENV{tri}}{!par #ENV{_tri}}{par num #ENV{tri_n}}{!par num #ENV{_tri_n}}"; + + foreach($v as $n => $t) { $res .= "\n\t{" . $n . " ?}"; } + return $res; +} + +// Class CSS en fonction de la parite du numero de ligne. +// Si une colonne reference une table, ajoute un href sur sa page dynamique. +// Ce serait encore mieux d'aller chercher sa cle primaire. + +function vertebrer_cell($fields) +{ + $res = "\n\t<tr class='[row_(#COMPTEUR_BOUCLE|alterner{'odd','even'})]'>\n\t\t<td>#COMPTEUR_BOUCLE</td>"; + foreach($fields as $n => $t) { + { + $texte = "#" . strtoupper($n); + if (preg_match('/\s+references\s+([\w_]+)/' , $t, $r)) { + $url = "[(#SELF|parametre_url{page,'" . $r[1] . "'})]"; + $texte = "<a href='$url'>" . $texte . "</a>"; + } + $res .= "\n\t\t<td>$texte</td>"; + } + } + return $res; +} + +function public_vertebrer_dist($desc) +{ + $nom = $desc['table']; + $surnom = $desc['id_table']; + $field = $desc['field']; + $key = $desc['key']; + ksort($field); + return +"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'> +<html xmlns='http://www.w3.org/1999/xhtml' xml:lang='#LANG' lang='#LANG' dir='#LANG_DIR'> +<head> +<title>SPIPAdmin $surnom [(#NOM_SITE_SPIP|textebrut)]</title> +<INCLURE{fond=inc-head}> +</head> +<body class=page_rubrique><div id='page'> +<h1 style='text-align:center'>SPIPAdmin $surnom</h1><br />\n" . + // au minimum: "<BOUCLE1($fond)></BOUCLE1>#TOTAL_BOUCLE<//B1>") + // au maximum: + "<B1>#ANCRE_PAGINATION[<p class='pagination'>(#PAGINATION)</p>]" . + "<table class='spip' border='1' width='90%'>" . + "<tr>\n\t<th>Nb</th>" . + vertebrer_sort($field,'') . + "\n</tr>\n<BOUCLE1($nom)" . + vertebrer_crit($field) . + '>' . + vertebrer_cell($field) . + "\n\t</tr>\n</BOUCLE1>" . + "\n\t<tr>\n\t<th>Nb</th>" . + vertebrer_sort($field,'_') . + "\n</tr></table>" . +'</B1></div></body></html>'; +} +?> -- GitLab