diff --git a/.gitattributes b/.gitattributes index e92528e7b44062d75968db62dcba280cca35c414..5b31c30d6c63b46d59616c005fd294c5c864ef47 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 804ad019175656b722edf6645dc963c48a8dccfc..2e604ed31e706ace674acc58c502f38b1626fc2c 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 f2e98eef35311286b3595bfb3ad18dabae1afecc..cb9fca2470a59cebe6d630418d77edf114a139cd 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 0000000000000000000000000000000000000000..ff69c73899a3c7d4444ce3fbbec78290ed357e1a --- /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>'; +} +?>