From fbd4d09117abc4b042d4c3b534d194744f79d9ad Mon Sep 17 00:00:00 2001
From: Matthieu Marcillaud <marcimat@rezo.net>
Date: Fri, 14 Dec 2007 00:50:48 +0000
Subject: [PATCH] =?UTF-8?q?Permettre=20aux=20boucles=20SPIP=20de=20ne=20pa?=
 =?UTF-8?q?s=20raler=20si=20la=20table=20demand=C3=A9e=20est=20introuvable?=
 =?UTF-8?q?.=20Pour=20cela,=20il=20faut=20ajouter=20un=20=3F=20juste=20ava?=
 =?UTF-8?q?nt=20la=20fin=20de=20parenth=C3=A8se=20:=20<BOUCLE=5Fnom(TABLE?=
 =?UTF-8?q?=3F)>,=20<BOUCLE=5Fnom(TABLE=20jointure=3F)>=20ou=20encore=20<B?=
 =?UTF-8?q?OUCLE=5Fnom(TABLE=20=3F)>?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Cela permet aux squelettes qui utilisent un plugin optionnel ayant créé table X de ne pas signaler par une erreur l'absence de cette table dans une boucle si le plugin n'a pas été installé.

<BOUCLE_plugin(X ?)>#BALISE</BOUCLE_plugin>
</B_plugin>
Texte affiché si X n'est pas présent ou si la boucle n'a pas d'élément
<//B_plugin>

Il était déjà possible d'obtenir à peu près le même comportement (sauf le texte sur l'absence d'élément) en utilisant la balise plugin et une noisette :
[(#PLUGIN{prefixe_plugin}|?{' ',''})
  <INCLURE(fond=squelette_contenant_la_boucle)>
]
---
 ecrire/public/compiler.php     | 10 +++++++---
 ecrire/public/interfaces.php   |  1 +
 ecrire/public/phraser_html.php |  9 +++++++--
 3 files changed, 15 insertions(+), 5 deletions(-)

diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php
index 6ed69bf0a2..34127ef6d7 100644
--- a/ecrire/public/compiler.php
+++ b/ecrire/public/compiler.php
@@ -719,9 +719,13 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
 				$boucles[$id]->type_requete = '';
 				$x = $boucles[$id]->sql_serveur;
 				$x = $x ? "$x:$type" : $type;
-				erreur_squelette(_T('zbug_table_inconnue',
-						    array('table' => $x )),
-						 $id);
+				// ne pas renvoyer d'erreur si la table est optionnelle
+				// declare par ? avant ) dans <BOUCLE_A(table ?)>
+				if (!$boucles[$id]->table_optionnelle) {
+					erreur_squelette(_T('zbug_table_inconnue',
+								array('table' => $x )),
+							 $id);
+				}
 			}
 		}
 	}
diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php
index 2fdfd9b977..c3a205805f 100644
--- a/ecrire/public/interfaces.php
+++ b/ecrire/public/interfaces.php
@@ -44,6 +44,7 @@ class Boucle {
 	var $avant, $milieu, $apres, $altern;
 	var $lang_select;
 	var $type_requete;
+	var $table_optionnelle = false; # si ? dans <BOUCLE_x(table ?)>
 	var $sql_serveur = '';
 	var $param = array();
 	var $criteres = array();
diff --git a/ecrire/public/phraser_html.php b/ecrire/public/phraser_html.php
index 330c56a9e0..1f527f1854 100644
--- a/ecrire/public/phraser_html.php
+++ b/ecrire/public/phraser_html.php
@@ -25,7 +25,7 @@ define('BALISE_POST_BOUCLE', '</B');
 define('BALISE_ALT_BOUCLE', '<//B');
 
 define('TYPE_RECURSIF', 'boucle');
-define('SPEC_BOUCLE','/\s*\(\s*([^\s)]+)(\s*[^)]*)\)/');
+define('SPEC_BOUCLE','/\s*\(\s*([^\s?)]+)(\s*[^)?]*)([?]?)\)/');
 define('NOM_DE_BOUCLE', "[0-9]+|[-_][-_.a-zA-Z0-9]*");
 # ecriture alambiquee pour rester compatible avec les hexadecimaux des vieux squelettes
 define('NOM_DE_CHAMP', "#((" . NOM_DE_BOUCLE . "):)?(([A-F]*[G-Z_][A-Z_0-9]*)|[A-Z_]+)(\*{0,2})");
@@ -575,11 +575,16 @@ function public_phraser_html($texte, $id_parent, &$boucles, $nom, $ligne=1) {
                 $milieu = substr($milieu, strlen($match[0]));
 		$type = $match[1];
 		$jointures = trim($match[2]);
+		$table_optionnelle = ($match[3]);
 		if ($jointures) {
 			$result->jointures = preg_split("/\s+/",$jointures);
 			$result->jointures_explicites = $jointures;
 		}
-
+		
+		if ($table_optionnelle){
+			$result->table_optionnelle = true;	
+		}
+		
 		if ($p = strpos($type, ':'))
 		  {
 		    $result->sql_serveur = substr($type,0,$p);
-- 
GitLab