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

Report de r21498 : Ferme #2013 : dans la declaration du filtrage par statut,...

Report de r21498 : Ferme #2013 : dans la declaration du filtrage par statut, on peut suffixer un statut donné par "/auteur" pour que seuls les objets liés à l'auteur connecté soient affichés pour ce statut.
Application aux articles, pour lesquels on limite en previsualisation l'affichage des articles en cours de rédaction à ceux de l'auteur connecté.

Dans la fonction quete_condition_statut on utilise le nom de table qui prefixe le champ statut pour savoir de quel objet on traite.
Ce n'est pas parfait, il faudrait le passer en argument supplémentaire, mais cela suffit en général, et on ne veut pas changer la signature de la fonction dans cette version stable. A noter que si on n'a pas cette information, on ignore le statut considéré pour ne pas risquer de dévoiler de l'information - idem si pas d'auteur connecté.
parent 1c2097f6
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+1 −1
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -146,7 +146,7 @@ function lister_tables_objets_sql($table_sql=null, $desc=array()){
					array(
						'champ' => 'statut',
						'publie' => 'publie',
						'previsu' => 'publie,prop,prepa',
						'previsu' => 'publie,prop,prepa/auteur',
						'post_date' => 'date',
						'exception' => 'statut'
					)
+35 −2
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -180,16 +180,49 @@ function quete_condition_statut($mstatut,$previsu,$publie, $serveur='', $ignore_
		return $cond[$key]=($not?"1=1":"'0=1'");

	$liste = explode(',',$liste);
	$where = array();
	foreach($liste as $k=>$v) {
		// filtrage /auteur pour limiter les objets d'un statut (prepa en general)
		// a ceux de l'auteur identifie
		if (strpos($v,"/")!==false){
			$v = explode("/",$v);
			$filtre = end($v);
			$v = reset($v);
			$v = preg_replace(",\W,","",$v);
			if ($filtre=="auteur"
				AND isset($GLOBALS['visiteur_session']['id_auteur'])
				AND intval($GLOBALS['visiteur_session']['id_auteur'])
				AND (strpos($mstatut,".")!==false)
			  AND $objet = explode(".",$mstatut)
				AND $id_table = reset($objet)
			  AND $objet = objet_type($id_table)){
				$primary = id_table_objet($objet);
				$where[] = "($mstatut<>".sql_quote($v)." OR $id_table.$primary IN (".sql_get_select("ssss.id_objet","spip_auteurs_liens AS ssss","ssss.objet=".sql_quote($objet)." AND ssss.id_auteur=".intval($GLOBALS['visiteur_session']['id_auteur']),'','','','',$serveur)."))";
			}
			// ignorer ce statut si on ne sait pas comment le filtrer
			else
				$v = "";
		}
		// securite
		$liste[$k] = preg_replace(",\W,","",$v);
	}
	$liste = array_filter($liste);
  if (count($liste)==1){
		return $cond[$key] = array(($not?'<>':'='), $mstatut, sql_quote(reset($liste),$serveur));
		$where[] = array('=', $mstatut, sql_quote(reset($liste),$serveur));
  }
  else {
	  return $cond[$key] = sql_in($mstatut,$liste,$not,$serveur);
	  $where[] = sql_in($mstatut,$liste,$not,$serveur);
  }

	while (count($where)>1){
		$and = array('AND',array_pop($where),array_pop($where));
		$where[] = $and;
	}
	$cond[$key] = reset($where);
	if ($not)
		$cond[$key] = array('NOT',$cond[$key]);

	return $cond[$key];
}

/**