Valider c96d05e8 rédigé par marcimat's avatar marcimat
Parcourir les fichiers

* Nouvel iterateur (CONDITION) qui renvoie tout simplement un tableau d'une ligne de résultat.

* Nouveau critère {si expression,expression} (par exemple {si #ISDIR}) qui peut s'appliquer sur n'importe quelle boucle : si une des expressions ne renvoie pas de contenu, alors la boucle n'est pas calculée. On peut donc simplifier certaines expressions, évitant l'usage d'une boucle (CONDITION) parente tel que l'exemple si dessous : si c'est un répertoire, alors on affiche le contenu du sous répertoire.

* Possibilité de passer dans {args XXX} un objet iterateur directement, qui sera alors utilisé pour la boucle, ce qui est fait si dessous avec {args  #GETCHILDREN**}, qui renvoie un iterateur.

{{{
		<BOUCLE_repertoire(php:RecursiveDirectoryIterator)
			{args #EVAL{_ROOT_RACINE}}{isdot=0}
			{pagination 5}>
				<li>#CLE
					<B_sous_repertoire>
					<ul>
						<BOUCLE_sous_repertoire(php:RecursiveDirectoryIterator)
							{si #ISDIR}
							{args #GETCHILDREN**}{isdot=0}
						>
							<li>#CLE</li>
						</BOUCLE_sous_repertoire>
					</ul>
					</B_sous_repertoire>
				</li>
		</BOUCLE_repertoire>
}}}

Nota: je n'arrive pas encore a rendre la boucle «sous_repertoire» recursive...
parent b0c13c65
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
@@ -229,6 +229,7 @@ ecrire/install/etape_ldap5.php -text
ecrire/install/etape_sup1.php -text
ecrire/install/etape_sup2.php -text
ecrire/install/index.php -text
ecrire/iterateur/condition.php -text
ecrire/iterateur/data.php -text
ecrire/iterateur/enum.php -text
ecrire/iterateur/php.php -text
+34 −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-2011                                                *
 *  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.   *
\***************************************************************************/


include_spip('iterateur/data');


//
// creer une boucle sur un iterateur POUR
// annonce au compilo les "champs" disponibles
//
function iterateur_CONDITION_dist($b) {
	$b->iterateur = 'CONDITION'; # designe la classe d'iterateur
	$b->show = array(
		'field' => array()
	);
	return $b;
}

include_spip('iterateur/data');
class IterateurCONDITION extends IterateurData {
	protected function select() {
		$this->tableau = array(0=>1);
	}
}
+10 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -1429,4 +1429,14 @@ function critere_datapath_dist($idb, &$boucles, $crit) {
	}
}


/* le critere {si ...} des boucles CONDITION */
function critere_si_dist($idb, &$boucles, $crit) {
	$boucle = &$boucles[$idb];
	$boucle->hash .= '$command[\'si\'] = array();'."\n";
	foreach($crit->param as $param) {
		$boucle->hash .= '
			$command[\'si\'][] = '.calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).';';
	}
}
?>
+54 −11
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -20,14 +20,32 @@
class IterFactory{
	public static function create($iterateur, $command, $info=null){

		// cas des SI {si expression} analises tres tot
		// pour eviter le chargement de tout iterateur
		if (isset($command['si'])) {
			foreach ($command['si'] as $si) {
				if (!$si) {
					return new IterDecorator(new IterDefaut(), $command, $info);
				}
			}
		}

		// chercher un iterateur PHP existant (par exemple dans SPL)
		// (il faudrait passer l'argument ->serveur
		// pour etre certain qu'on est sur un "php:")
		if (class_exists($iterateur)) {
			$a = isset($command['args']) ? $command['args'] : array() ;

			// permettre de passer un Iterateur directement {args #ITERATEUR} :
			// si on recoit deja un iterateur en argument, on l'utilise
			if (count($a)==1 and is_object($a[0]) and is_subclass_of($a[0], 'Iterator')) {
				$iter = $a[0];

			// sinon, on cree un iterateur du type donne
			} else {							
				// arguments de creation de l'iterateur...
				// (pas glop)
			$a = isset($command['args']) ? $command['args'] : array() ;
				try {
					switch (count($a)) {
						case 0:    $iter = new $iterateur();  break;
						case 1:    $iter = new $iterateur($a[0]);  break;
@@ -35,6 +53,12 @@ class IterFactory{
						case 3:    $iter = new $iterateur($a[0], $a[1], $a[2]);  break;
						case 4:    $iter = new $iterateur($a[0], $a[1], $a[2], $a[3]);  break;
					}
				} catch (Exception $e) {
					spip_log("Erreur de chargement de l'iterateur $iterateur");
					spip_log($e->getMessage());
					$iter = new IterDefaut();
				}
			}
		} else {
			// chercher la classe d'iterateur
			// IterateurXXX
@@ -44,7 +68,7 @@ class IterFactory{
			  OR !class_exists($class)) {
				die("Iterateur $iterateur non trouv&#233;");
				// si l'iterateur n'existe pas, on se rabat sur le generique
				$iter = new Iterator();
				$iter = new IterDefaut();
			} else {
				$iter = new $class($command, $info);
			}
@@ -53,6 +77,17 @@ class IterFactory{
	}
}

// mettre directement new Iterator() ne fonctionnait pas car c'est une classe d'implementation.
// par defaut... ne rien faire :)
class IterDefaut implements Iterator {
	public function __construct() {}
	public function next() {}
	public function valid() { return false; }
	public function rewind() {}
	public function current() {}
	public function key() {}
}



class IterDecorator extends FilterIterator {
@@ -126,7 +161,14 @@ class IterDecorator extends FilterIterator {
	public function get_select($nom) {
		if (is_object($this->iter)
		AND method_exists($this->iter, $nom)) {
			try {
				return $this->iter->$nom();
			} catch(Exception $e) {
				// #GETCHILDREN sur un fichier de DirectoryIterator ...
				spip_log("Methode $nom en echec sur " . get_class($this->iter));
				spip_log("Cela peut être normal : retour d'une ligne de resultat ne pouvant pas calculer cette methode");
				return '';
			}
		}
		/*
		if (property_exists($this->iter, $nom)) {
@@ -184,6 +226,7 @@ class IterDecorator extends FilterIterator {
			}
		}

		
		// Appliquer les filtres sur (valeur)
		if ($this->filtre) {
			$this->func_filtre = create_function('$me', $b = 'return ('.join(') AND (', $this->filtre).');');