Valider 441265dc rédigé par esj's avatar esj
Parcourir les fichiers

Synthèse à la volée de squelette sur table externe.

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 ?).

parent fca2cfca
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -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)
+18 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -19,10 +19,23 @@ 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'")),
@@ -33,7 +46,7 @@ function public_styliser_dist($fond, $id_rubrique, $lang, $ext='html') {
			     $ext,
			     $f);
		}

	}
	// supprimer le ".html" pour pouvoir affiner par id_rubrique ou par langue
	$squelette = substr($base, 0, - strlen(".$ext"));

+109 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
<?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>';
}
?>