Valider 15d81585 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

introduction d'une fonction objet_test_si_publie qui renvoie true ou false...

introduction d'une fonction objet_test_si_publie qui renvoie true ou false selon l'etat publie de l'objet.
La fonction prend en compte la declaration de statut dans declarer_tables_objets_sql, et tient donc compte des post-date, jointures et autres.
Pour assurer la coherence avec les clauses sql injectees dans les boucles, on extrait la fonction instituer_boucle dediee a cette tache, et on lui ajoute un argument boolen pour echapper ou non les clauses SQL produites selon que l'on veut compiler un squelette ou executer tout de suite la requete.
Ainsi, la traduction de la declaration du statut en SQL est unique, utilisee par le compilateur d'un côté et la fonction objet_test_si_publie d'un autre, qui renverra bien la même chose dans tous les cas
parent ce1b3e65
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+44 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -124,7 +124,7 @@ function lister_tables_objets_sql($table_sql=null, $desc=array()){
			),
			'spip_rubriques' => array(
				'page'=>'rubrique',
				'url_voir' => 'naviguer',
				'url_voir' => 'rubrique',
				'url_edit' => 'rubriques_edit',
				'texte_retour' => 'icone_retour',
				'texte_objets' => 'public:rubriques',
@@ -472,3 +472,46 @@ function objet_type($table_objet, $serveur=''){
	// on a fait ce qu'on a pu
	return $type;
}

/**
 * Determininer si un objet est publie ou non
 * on se base pour cela sur sa declaration de statut
 * pour des cas particuliers non declarables, on permet de fournir une fonction
 * base_xxxx_test_si_publie qui sera appele par la fonction
 *
 * @param string $objet
 * @param int $id_objet
 * @param string $serveur
 * @return bool
 */
function objet_test_si_publie($objet,$id_objet, $serveur=''){
	$id_table = $table_objet = table_objet($objet);
	$id_table_objet = id_table_objet($objet, $serveur);
	$trouver_table = charger_fonction('trouver_table', 'base');
	if ($desc = $trouver_table($table_objet, $serveur)
		AND isset($desc['statut'])
	  AND $desc['statut']){
		$boucle = new Boucle();
		$boucle->show = $desc;
		$boucle->nom = 'objet_test_si_publie';
		$boucle->id_boucle = $id_table;
		$boucle->id_table = $id_table;
		$boucle->serveur = $serveur;
		$boucle->select[] = $id_table_objet;
		$boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
		$boucle->where[] = $id_table.".".$id_table_objet.'='.intval($id_objet);

		include_spip('public/compiler');
		instituer_boucle($boucle, false);
		$res = calculer_select($boucle->select,$boucle->from,$boucle->from_type,$boucle->where,$boucle->join,$boucle->group,$boucle->order,$boucle->limit,$boucle->having,$table_objet,$id_table,$serveur);
		if (sql_fetch($res))
			return true;
		return false;
	}
	// voir si une fonction est definie pour faire le boulot
	if ($f = charger_fonction($objet."test_si_publie","base"))
		return $f($objet,$id_objet, $serveur);

	// si pas d'info statut ni de fonction : l'objet est publie
	return true;
}
 No newline at end of file
+32 −22
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -192,20 +192,7 @@ function calculer_inclure($p, &$boucles, $id_boucle) {
}


/**
 * calculer_boucle() produit le corps PHP d'une boucle Spip.
 * ce corps remplit une variable $t0 retournee en valeur.
 * Ici on distingue boucles recursives et boucle a requete SQL
 * et on insere le code d'envoi au debusqueur du resultat de la fonction.
 *
 * http://doc.spip.org/@calculer_boucle
 *
 * @param  $id_boucle
 * @param  $boucles
 * @return string
 */
function calculer_boucle($id_boucle, &$boucles) {

function instituer_boucle(&$boucle, $echapper=true){
	// gerer les statuts si declares pour cette table
	/*
	$show['statut'][] = array(
@@ -232,7 +219,6 @@ function calculer_boucle($id_boucle, &$boucles) {
	dans les jointures, clen peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
	*/

	$boucle = &$boucles[$id_boucle];
	$id_table = $boucle->id_table;
	$show = $boucle->show;
	if (isset($show['statut']) AND $show['statut']){
@@ -257,7 +243,7 @@ function calculer_boucle($id_boucle, &$boucles) {
					}
					$jointures[0][0] = $id_table;
					if (!array_search($id, $boucle->from)){
						fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table);
						fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper);
					}
					// trouver l'alias de la table d'arrivee qui porte le statut
					$id = array_search($id, $boucle->from);
@@ -271,19 +257,43 @@ function calculer_boucle($id_boucle, &$boucles) {
				if (isset($s['post_date']) AND $s['post_date']
					AND $GLOBALS['meta']["post_dates"] == 'non'){
					$date = $id.'.'.preg_replace(',\W,','',$s['post_date']); // securite
					array_unshift($boucle->where,"\nquete_condition_postdates('$date',"._q($boucle->serveur).")");
					array_unshift($boucle->where,
						$echapper ?
							"\nquete_condition_postdates('$date',"._q($boucle->serveur).")"
						:
							quete_condition_postdates($date,$boucle->serveur)
					);
				}
				array_unshift($boucle->where,
					$echapper ?
						"\nquete_condition_statut('$mstatut',"
							. _q($s['previsu']).","
							._q($s['publie']).","
							._q($boucle->serveur).")"
					:
						quete_condition_statut($mstatut,$s['previsu'],$s['publie'],$boucle->serveur)
				);
			}
		}
	}
}

/**
 * calculer_boucle() produit le corps PHP d'une boucle Spip.
 * ce corps remplit une variable $t0 retournee en valeur.
 * Ici on distingue boucles recursives et boucle a requete SQL
 * et on insere le code d'envoi au debusqueur du resultat de la fonction.
 *
 * http://doc.spip.org/@calculer_boucle
 *
 * @param  $id_boucle
 * @param  $boucles
 * @return string
 */
function calculer_boucle($id_boucle, &$boucles) {

	$boucle = &$boucles[$id_boucle];
	instituer_boucle($boucle);

	$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);

+9 −5
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -68,7 +68,7 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col='', $cond=false)
}

// http://doc.spip.org/@fabrique_jointures
function fabrique_jointures(&$boucle, $res, $cond=false, $desc=array(), $nom='', $col='')
function fabrique_jointures(&$boucle, $res, $cond=false, $desc=array(), $nom='', $col='', $echap=true)
{
	static $num=array();
	$id_table = "";
@@ -87,10 +87,14 @@ function fabrique_jointures(&$boucle, $res, $cond=false, $desc=array(), $nom='',
			// le where complementaire est envoye dans la jointure pour pouvoir etre elimine avec la jointure
			// en cas d'optimisation
			//$boucle->where[] = array("'='","'$obj'","sql_quote('$type')");
			$boucle->join["L$n"]= array("'$id_table'","'$j2'","'$j1'","'$obj='.sql_quote('$type')");
			$boucle->join["L$n"]=
				$echap ?
					array("'$id_table'","'$j2'","'$j1'","'$obj='.sql_quote('$type')")
				:
					array($id_table,$j2,$j1,"$obj=".sql_quote($type));
		}
		else
			$boucle->join["L$n"]= array("'$id_table'","'$j'");
			$boucle->join["L$n"]= $echap?array("'$id_table'","'$j'"):array($id_table,$j);
		$boucle->from[$id_table = "L$n"] = $a[0];
	}