Skip to content
Extraits de code Groupes Projets
Valider 631075c4 rédigé par cerdic's avatar cerdic
Parcourir les fichiers

Passer la gestion derogatoire du filtrage des boucle par le statut en mode declaratif,

 via la globale table_statut :
 
 	$table_statut[nom_table][] = 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')
		
On evacue le codes des boucles sur les tables articles, auteurs, et rubriques.
La table documents est en sursis, son cas est deja regle dans le plugin mediatheque
parent af12ac2d
Aucune branche associée trouvée
Aucune étiquette associée trouvée
Aucune requête de fusion associée trouvée
......@@ -35,59 +35,6 @@ function boucle_BOUCLE_dist($id_boucle, &$boucles) {
return calculer_boucle($id_boucle, $boucles);
}
//
// <BOUCLE(ARTICLES)>
//
// http://doc.spip.org/@boucle_ARTICLES_dist
function boucle_ARTICLES_dist($id_boucle, &$boucles) {
$boucle = &$boucles[$id_boucle];
$id_table = $boucle->id_table;
$mstatut = $id_table .'.statut';
// Restreindre aux elements publies
if (!isset($boucle->modificateur['criteres']['statut'])) {
if (!$GLOBALS['var_preview']) {
if ($GLOBALS['meta']["post_dates"] == 'non')
array_unshift($boucle->where,"quete_condition_postdates('$id_table.date')");
array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
} else
array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prop\\')'"));
}
return calculer_boucle($id_boucle, $boucles);
}
//
// <BOUCLE(AUTEURS)>
//
// http://doc.spip.org/@boucle_AUTEURS_dist
function boucle_AUTEURS_dist($id_boucle, &$boucles) {
$boucle = &$boucles[$id_boucle];
$id_table = $boucle->id_table;
$mstatut = $id_table .'.statut';
// Restreindre aux elements publies
if (!isset($boucle->modificateur['criteres']['statut'])) {
// Si pas de lien avec un article, selectionner
// uniquement les auteurs d'un article publie
if (!$GLOBALS['var_preview'])
if (!isset($boucle->modificateur['lien']) AND !isset($boucle->modificateur['tout'])) {
fabrique_jointures($boucle, array(
array($id_table, array('spip_auteurs_liens'), 'id_auteur'),
array('', array('spip_articles'), array('id_objet','id_article','objet','article'))
), true, $boucle->show, $id_table);
$t = array_search('spip_articles', $boucle->from);
array_unshift($boucle->where,
array("'='", "'$t.statut'", "'\\'publie\\''"));
if ($GLOBALS['meta']['post_dates'] == 'non')
array_unshift($boucle->where, "quete_condition_postdates('$t.date')");
}
// pas d'auteurs poubellises
array_unshift($boucle->where,array("'!='", "'$mstatut'", "'\\'5poubelle\\''"));
}
return calculer_boucle($id_boucle, $boucles);
}
//
// <BOUCLE(DOCUMENTS)>
......@@ -151,26 +98,6 @@ function boucle_DOCUMENTS_dist($id_boucle, &$boucles) {
return calculer_boucle($id_boucle, $boucles);
}
//
// <BOUCLE(RUBRIQUES)>
//
// http://doc.spip.org/@boucle_RUBRIQUES_dist
function boucle_RUBRIQUES_dist($id_boucle, &$boucles) {
$boucle = &$boucles[$id_boucle];
$id_table = $boucle->id_table;
$mstatut = $id_table .'.statut';
// Restreindre aux elements publies
if (!isset($boucle->modificateur['criteres']['statut'])) {
if (!$GLOBALS['var_preview'])
if (!isset($boucle->modificateur['tout']))
array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''"));
}
return calculer_boucle($id_boucle, $boucles);
}
//
// <BOUCLE(HIERARCHIE)>
//
......
......@@ -189,15 +189,129 @@ function calculer_inclure($p, &$boucles, $id_boucle) {
return "\n'<'.'". "?php ". $code . "\n?'." . "'>'";
}
//
// 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
/**
* Calculer la clause where pour filtrer les status,
*
* @param string $mstatut
* le champ de la table sur lequel porte la condition
* @param string $liste
* statut ou liste des statuts separes par une virgule
* @return array
*/
function calculer_where_statut($mstatut,$liste){
$not = false;
if (strncmp($liste,'!',1)==0){
$not = true;
$liste = substr($liste,1);
}
// '' => ne rien afficher, '!'=> ne rien filtrer
if (!strlen($liste))
return ($not?"'1=1'":"'0=1'");
$liste = explode(',',$liste);
foreach($liste as $k=>$v) {
$liste[$k] = "\\'".preg_replace(",\W,","",$v)."\\'";
}
if (count($liste)==1){
return array($not?"'<>'":"'='", "'$mstatut'", "'".reset($liste)."'");
}
else {
return array($not?"'NOT IN'":"'IN'", "'$mstatut'", "'(".implode(',',$liste).")'");
}
}
/**
* 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) {
// gerer les statuts si declares pour cette table
/*
$table_statut[nom_table][] = 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')
*/
$boucle = &$boucles[$id_boucle];
$id_table = $boucle->id_table;
$table_sql = $boucle->from[$id_table];
if (isset($GLOBALS['table_statut'][$table_sql])){
foreach($GLOBALS['table_statut'][$table_sql] as $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['criteres'][$m])) {
$filtrer = false;
break;
}
}
}
if ($filtrer) {
if (is_array($s['champ'])){
$statut = preg_replace(',\W,','',array_pop($s['champ'])); // securite
$jointures = array();
foreach($s['champ'] as $j) {
$jointures[] = array('',array($id=reset($j)),end($j));
}
$jointures[0][0] = $id_table;
fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table);
// 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;
if (!$GLOBALS['var_preview']) {
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,"quete_condition_postdates('$date')");
}
array_unshift($boucle->where,calculer_where_statut($mstatut,$s['publie']));
}
else {
array_unshift($boucle->where,calculer_where_statut($mstatut,$s['previsu']));
}
}
}
}
$boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
// en mode debug memoriser les premiers passages dans la boucle,
......
......@@ -187,7 +187,7 @@ $exception_des_connect[] = ''; // ne pas transmettre le connect='' par les inclu
* @return void
*/
function declarer_interfaces(){
global $exceptions_des_tables, $table_des_tables, $table_date, $table_titre;
global $exceptions_des_tables, $table_des_tables, $table_date, $table_titre, $table_statut;
$table_des_tables['articles']='articles';
$table_des_tables['auteurs']='auteurs';
......@@ -217,6 +217,16 @@ function declarer_interfaces(){
$table_date['types_documents']='date';
$table_date['rubriques']='date';
$table_statut['spip_articles'][] = array('champ'=>'statut','publie'=>'publie','previsu'=>'publie,prop','post_date'=>'date','exception'=>'statut');
// 2 conditions pour les auteurs : statut=poubelle, et avoir des articles publies !
$table_statut['spip_auteurs'][] = array('champ'=>'statut','publie'=>'!5poubelle','previsu'=>'!5poubelle','exception'=>'statut');
$table_statut['spip_auteurs'][] = array('champ'=>array(
array('spip_auteurs_liens', 'id_auteur'),
array('spip_articles', array('id_objet','id_article','objet','article')),
'statut'
),'publie'=>'publie','previsu'=>'publie,prop','post_date'=>'date','exception'=>array('statut','lien','tout'));
$table_statut['spip_rubriques'][] = array('champ'=>'statut','publie'=>'publie','previsu'=>'!','exception'=>array('statut','tout'));
//
// tableau des tables de jointures
// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)
......@@ -234,7 +244,6 @@ function declarer_interfaces(){
$tables_jointures['spip_rubriques'][]= 'documents_liens';
global $exceptions_des_jointures;
#$exceptions_des_jointures['titre_mot'] = array('spip_mots', 'titre'); // pour exemple
......@@ -279,6 +288,7 @@ function declarer_interfaces(){
'tables_jointures'=>$tables_jointures,
'exceptions_des_jointures'=>$exceptions_des_jointures,
'table_des_traitements'=>$table_des_traitements,
'table_statut'=>$table_statut,
));
if ($interfaces){
$table_des_tables = $interfaces['table_des_tables'];
......@@ -288,6 +298,7 @@ function declarer_interfaces(){
$tables_jointures = $interfaces['tables_jointures'];
$exceptions_des_jointures = $interfaces['exceptions_des_jointures'];
$table_des_traitements = $interfaces['table_des_traitements'];
$table_statut = $interfaces['table_statut'];
}
}
......
0% Chargement en cours ou .
You are about to add 0 people to the discussion. Proceed with caution.
Terminez d'abord l'édition de ce message.
Veuillez vous inscrire ou vous pour commenter