Esempio n. 1
0
function calculer_jointure(&$boucle, $depart, $arrivee, $col='', $cond=false)
{

  $res = calculer_chaine_jointures($boucle, $depart, $arrivee);
  if (!$res) return "";

  list($nom,$desc) = $depart;
  return fabrique_jointures($boucle, $res, $cond, $desc, $nom, $col);
}
Esempio n. 2
0
/**
 * Générer directement une jointure via une table de lien spip_xxx_liens
 * pour un critère {id_xxx}
 *
 * @todo $checkarrivee doit être obligatoire ici ?
 *
 * @param Boucle $boucle
 *     Description de la boucle
 * @param array $joints
 *     Liste de jointures possibles (ex: $boucle->jointures ou $boucle->jointures_explicites)
 * @param string $col
 *     Colonne cible de la jointure
 * @param array $desc
 *     Description de la table
 * @param bool $cond
 *     Flag pour savoir si le critère est conditionnel ou non
 * @param bool|string $checkarrivee
 *     string : nom de la table jointe où on veut trouver le champ.
 *     n'a normalement pas d'appel sans $checkarrivee.
 * @return string
 *     Alias de la table de jointure (Lx)
 */
function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false)
{
    $primary_arrivee = id_table_objet($checkarrivee);
    // [FIXME] $checkarrivee peut-il arriver avec false ????
    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
    if (!$intermediaire or !$arrivee) {
        return '';
    }
    array_pop($intermediaire);
    // enlever la cle en 3eme argument
    array_pop($arrivee);
    // enlever la cle en 3eme argument
    $res = fabrique_jointures($boucle, array(array($boucle->id_table, $intermediaire, array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])), array(reset($intermediaire), $arrivee, $primary_arrivee)), $cond, $desc, $boucle->id_table, array($col));
    return $res;
}
Esempio n. 3
0
/**
 * Gérer les statuts declarés pour cette table
 *
 * S'il existe des statuts sur cette table, déclarés dans la description
 * d'un objet éditorial, applique leurs contraintes
 *
 * @param Boucle $boucle
 *     Descrition de la boucle
 * @param bool $echapper
 *     true pour échapper le code créé
 * @param bool $ignore_previsu
 *     true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page
 */
function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false)
{
    /*
    	$show['statut'][] = array(
    		'champ'=>'statut',  // champ de la table sur lequel porte le filtrage par le statut
    		'publie'=>'publie', // valeur ou liste de valeurs, qui definissent l'objet comme publie.
    		'previsu'=>'publie,prop', // valeur ou liste de valeurs qui sont visibles en previsu
    		'post_date'=>'date', // un champ de date pour la prise en compte des post_dates, ou rien sinon
    	  'exception'=>'statut', // liste des modificateurs qui annulent le filtrage par statut
    	                         // si plusieurs valeurs : array('statut','tout','lien')
    	);
    
    	Pour 'publier' ou 'previsu', si la chaine commence par un "!" on exclu au lieu de filtrer sur les valeurs donnees
    	si la chaine est vide, on ne garde rien si elle est seulement "!" on n'exclu rien
    
    	Si le statut repose sur une jointure, 'champ' est alors un tableau du format suivant :
    	'champ'=>array(
    	    array(table1, cle1),
    	    ...
    	    array(tablen, clen),
    	    champstatut
    	 )
    
    	champstatut est alors le champ statut sur la tablen
    	dans les jointures, clen peut etre un tableau pour une jointure complexe : array('id_objet','id_article','objet','article')
    */
    $id_table = $boucle->id_table;
    $show = $boucle->show;
    if (isset($show['statut']) and $show['statut']) {
        foreach ($show['statut'] as $k => $s) {
            // Restreindre aux elements publies si pas de {statut} ou autre dans les criteres
            $filtrer = true;
            if (isset($s['exception'])) {
                foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) {
                    if (isset($boucle->modificateur[$m]) or isset($boucle->modificateur['criteres'][$m])) {
                        $filtrer = false;
                        break;
                    }
                }
            }
            if ($filtrer) {
                if (is_array($s['champ'])) {
                    $statut = preg_replace(',\\W,', '', array_pop($s['champ']));
                    // securite
                    $jointures = array();
                    // indiquer la description de chaque table dans le tableau de jointures,
                    // ce qui permet d'eviter certains GROUP BY inutiles.
                    $trouver_table = charger_fonction('trouver_table', 'base');
                    foreach ($s['champ'] as $j) {
                        $id = reset($j);
                        $def = $trouver_table($id);
                        $jointures[] = array('', array($id, $def), end($j));
                    }
                    $jointures[0][0] = $id_table;
                    if (!array_search($id, $boucle->from)) {
                        include_spip('public/jointures');
                        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);
                } else {
                    $id = $id_table;
                    $statut = preg_replace(',\\W,', '', $s['champ']);
                    // securite
                }
                $mstatut = $id . '.' . $statut;
                $arg_ignore_previsu = $ignore_previsu ? ",true" : '';
                include_spip('public/quete');
                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, $echapper ? "\nquete_condition_postdates('{$date}'," . _q($boucle->sql_serveur) . "{$arg_ignore_previsu})" : quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu));
                }
                array_unshift($boucle->where, $echapper ? "\nquete_condition_statut('{$mstatut}'," . _q($s['previsu']) . "," . _q($s['publie']) . "," . _q($boucle->sql_serveur) . "{$arg_ignore_previsu})" : quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu));
            }
        }
    }
}
Esempio n. 4
0
function index_exception(&$boucle, $desc, $nom_champ, $excep)
{
	static $trouver_table;
	if (!$trouver_table)
		$trouver_table = charger_fonction('trouver_table', 'base');

	if (is_array($excep)) {
		// permettre aux plugins de gerer eux meme des jointures derogatoire ingerables
		$t = NULL;
		if (count($excep)==3){
			$index_exception_derogatoire = array_pop($excep);
			$t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep);
		}
		if ($t == NULL) {
			list($e, $x) = $excep;	#PHP4 affecte de gauche a droite
			$excep = $x;		#PHP5 de droite a gauche !
			$j = $trouver_table($e, $boucle->sql_serveur);
			if (!$j) return array('','');
			$e = $j['table'];
			if (!$t = array_search($e, $boucle->from)) {
				$k = $j['key']['PRIMARY KEY'];
				if (strpos($k,',')) {
					$l = (preg_split('/\s*,\s*/', $k));
					$k = $desc['key']['PRIMARY KEY'];
					if (!in_array($k, $l)) {
						spip_log("jointure impossible $e " . join(',', $l));
						return array('','');
					}
				}
				$k = array($boucle->id_table, array($e), $k);
				fabrique_jointures($boucle, array($k));
				$t = array_search($e, $boucle->from);
			}
		}
	}
	else $t = $boucle->id_table;
	// demander a SQL de gerer le synonyme
	// ca permet que excep soit dynamique (Cedric, 2/3/06)
	if ($excep != $nom_champ) $excep .= ' AS '. $nom_champ;
	return array("$t.$excep", $nom_champ);
}
Esempio n. 5
0
/**
 * Generer directement une jointure via une table de lien spip_xxx_liens
 * pour un critere {id_xxx}
 * @param  $boucle
 * @param  $joints
 * @param  $col
 * @param  $desc
 * @param  $cond
 * @param bool $checkarrivee
 * @return string
 */
function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false)
{
    $primary_arrivee = id_table_objet($checkarrivee);
    $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens");
    $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee);
    if (!$intermediaire or !$arrivee) {
        return '';
    }
    $res = fabrique_jointures($boucle, array(array($boucle->id_table, $intermediaire, array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])), array(reset($intermediaire), $arrivee, $primary_arrivee)), $cond, $desc, $boucle->id_table, array($col));
    return $res;
}
Esempio n. 6
0
/**
 * Calculer et construite une jointure entre $depart et $arrivee
 * 
 * L'objet boucle est modifié pour compléter la requête.
 * La fonction retourne l'alias d'arrivée une fois la jointure construire,
 * en general un "Lx"
 *
 * @param Boucle $boucle
 *     Description de la boucle
 * @param array $depart
 *     Table de départ, sous la forme (nom de la table, description de la table)
 * @param array $arrivee
 *     Table d'arrivée, sous la forme (nom de la table, description de la table)
 * @param string $col
 *     Colonne cible de la jointure
 * @param bool $cond
 *     Flag pour savoir si le critère est conditionnel ou non
 * @param int $max_liens
 *     Nombre maximal de liaisons possibles pour trouver la jointure.
 * @return string
 *     Alias de la table de jointure (Lx)
 */
function calculer_jointure(&$boucle, $depart, $arrivee, $col = '', $cond = false, $max_liens = 5)
{
    // les jointures minimales sont optimales :
    // on contraint le nombre d'etapes en l'augmentant
    // jusqu'a ce qu'on trouve une jointure ou qu'on atteigne la limite maxi
    $max = 1;
    $res = false;
    $milieu_exclus = $col ? $col : array();
    while ($max <= $max_liens and !$res) {
        $res = calculer_chaine_jointures($boucle, $depart, $arrivee, array(), $milieu_exclus, $max);
        $max++;
    }
    if (!$res) {
        return "";
    }
    list($nom, $desc) = $depart;
    return fabrique_jointures($boucle, $res, $cond, $desc, $nom, $col);
}
Esempio n. 7
0
function boucle_SYNDIC_ARTICLES_dist($id_boucle, &$boucles) {
	$boucle = &$boucles[$id_boucle];
	$id_table = $boucle->id_table;
	$mstatut = $id_table .'.statut';

	// Restreindre aux elements publies, sauf critere contraire
	if (isset($boucle->modificateur['criteres']['statut']) AND $boucle->modificateur['criteres']['statut']) {}
	else if ($GLOBALS['var_preview'])
		array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prop\\')'"));
	else {
		$jointure = array_search("spip_syndic", $boucle->from);
		if (!$jointure) {
			$trouver_table = charger_fonction('trouver_table', 'base');
			$def = $trouver_table('spip_syndic');
			$def = array('spip_syndic', $def);
			$def = array($id_table, $def, 'id_syndic');
			fabrique_jointures($boucle, array($def), true, $boucle->show, $id_table);
			$jointure = array_search('spip_syndic', $boucle->from);
		}
		array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
		$boucle->where[]= array("'='", "'$jointure" . ".statut'", "'\\'publie\\''");

	}
	return calculer_boucle($id_boucle, $boucles);
}