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

regrouper statut et tables_jointures dans declarer_tables_objets_sql

Pour le second il est a noter que plugin peut declarer des jointures pour d'autres objets que les siens, ce qui s'accomode mal d'une affectation brutale par $table[spip_xxx] = array(...) qui peut ecraser une jointure declaree precedemment par un autre plugin sur cette table.
On propose donc que la declaration d'un plugin sur ses objets propres se fasse bien dans declarer_tables_objets_sql, mais la declaration sur des objets externes se fasse via declarer_tables_interfaces, qui est ensuite mergee avec declarer_tables_objets_sql

Au final c'est bien ce dernier qui fait reference et est utilise dans le compilateur
parent 091b8135
Chargement en cours
Chargement en cours
Chargement en cours
Chargement en cours
+2 −4
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -241,12 +241,10 @@ function table_jointure($x, $y) {
	$trouver_table = charger_fonction('trouver_table', 'base');
	$xdesc = $trouver_table(table_objet($x));
	$ydesc = $trouver_table(table_objet($y));
	$tx = $xdesc['table'];
	$ty = $ydesc['table'];
	$ix = @$xdesc['key']["PRIMARY KEY"];
	$iy = @$ydesc['key']["PRIMARY KEY"];
	if ($table = $GLOBALS['tables_jointures'][$ty][$ix]) return $table;
	if ($table = $GLOBALS['tables_jointures'][$tx][$iy]) return $table;
	if ($table = $ydesc['tables_jointures'][$ix]) return $table;
	if ($table = $xdesc['tables_jointures'][$iy]) return $table;
	return '';
}

+15 −7
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -195,18 +195,26 @@ function lister_tables_noerase(){
 * + toutes les tables auxiliaires hors relations
 * + les tables relations dont les deux tables liees sont dans la liste
 *
 * @global <type> $tables_principales
 * @global <type> $tables_auxiliaires
 * @global <type> $tables_jointures
 * @param array $exclude_tables
 * @return array
 */
function base_liste_table_for_dump($exclude_tables = array()){
	$tables_for_dump = array();
	$tables_pointees = array();
	global $tables_principales;
	global $tables_auxiliaires;
	global $tables_jointures;
	$tables_principales = $GLOBALS['tables_principales'];
	$tables_auxiliaires = $GLOBALS['tables_auxiliaires'];
	$tables_jointures = $GLOBALS['tables_jointures'];

	include_spip('base/objets');
	$tables = lister_tables_objets_sql();
	foreach($tables as $t=>$infos){
		if ($infos['principale'] AND !isset($tables_principales[$t]))
			$tables_principales[$t] = true;
		if (!$infos['principale'] AND !isset($tables_auxiliaires[$t]))
			$tables_auxiliaires[$t] = true;
		if (count($infos['tables_jointures']))
			$tables_jointures[$t] = array_merge(isset($tables_jointures[$t])?$tables_jointures[$t]:array(),$infos['tables_jointures']);
	}

	// on construit un index des tables de liens
	// pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees
@@ -229,7 +237,7 @@ function base_liste_table_for_dump($exclude_tables = array()){
			}
		}

	$liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires));
	$liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires),array_keys($tables));
	foreach($liste_tables as $table){
	  //		$name = preg_replace("{^spip_}","",$table);
	  if (		!isset($tables_pointees[$table])
+47 −0
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -60,6 +60,14 @@ function lister_tables_objets_sql($table_sql=null, $desc=array()){
				'rechercher_jointures' => array(
					'auteur' => array('nom' => 10),
				),
				'statut'=> array(
					'champ' => 'statut',
					'publie' => 'publie',
					'previsu' => 'publie,prop',
					'post_date' => 'date',
					'exception' => 'statut'
				),
				'tables_jointures' => array('id_auteur' => 'auteurs_liens'),
			),
			'spip_auteurs' => array(
				'page'=>'auteur',
@@ -76,6 +84,31 @@ function lister_tables_objets_sql($table_sql=null, $desc=array()){
				'rechercher_champs' => array(
					'nom' => 5, 'bio' => 1, 'email' => 1, 'nom_site' => 1, 'url_site' => 1, 'login' => 1
				),
				// 2 conditions pour les auteurs : statut!=poubelle,
				// et avoir des articles publies
				'statut'=> array(
					array(
						'champ' => 'statut',
						'publie' => '!5poubelle',
						'previsu' => '!5poubelle',
						'exception' => 'statut'
					),
					array(
						'champ' => array(
							array('spip_auteurs_liens', 'id_auteur'),
							array(
								'spip_articles',
								array('id_objet','id_article','objet','article')
							),
							'statut'
						),
						'publie' => 'publie',
						'previsu' => '!',
						'post_date' => 'date',
						'exception' => array('statut','lien','tout')
					),
				),
				'tables_jointures' => array('auteurs_liens'),
			),
			'spip_rubriques' => array(
				'page'=>'rubrique',
@@ -94,6 +127,13 @@ function lister_tables_objets_sql($table_sql=null, $desc=array()){
				'rechercher_champs' => array(
					'titre' => 8, 'descriptif' => 5, 'texte' => 1
				),
				'statut' => array(
					'champ' => 'statut',
					'publie' => 'publie',
					'previsu' => '!',
					'exception' => array('statut','tout')
				),
				'tables_jointures' => array('id_auteur' => 'auteurs_liens'),
			)
		));
		// completer les informations manquantes ou implicites
@@ -233,6 +273,13 @@ function renseigner_table_objet_sql($table_sql,$infos){
		$infos['titre'] = isset($GLOBALS['table_titre'][$infos['table_objet']]) ? $GLOBALS['table_titre'][$infos['table_objet']] : '';
	if (!isset($infos['date']))
		$infos['date'] = isset($GLOBALS['table_date'][$infos['table_objet']]) ? $GLOBALS['table_date'][$infos['table_objet']] : '';
	if (!isset($infos['statut']))
		$infos['statut'] = isset($GLOBALS['table_statut'][$table_sql]) ? $GLOBALS['table_statut'][$table_sql] : '';
	if (!isset($infos['tables_jointures']))
		$infos['tables_jointures'] = array();
	if (isset($GLOBALS['tables_jointures'][$table_sql]))
		$infos['tables_jointures'] = array_merge($infos['tables_jointures'],$GLOBALS['tables_jointures'][$table_sql]);
	

	if (!isset($infos['champs_versionnes']))
		$infos['champs_versionnes'] = array();
+2 −3
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -942,7 +942,6 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect='')
// Autres specifications comme ci-dessus

function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect=''){
	global $tables_jointures;
	static $trouver_table;
	spip_timer('calcul_skel');

@@ -1008,8 +1007,8 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co

				$boucles[$id]->descr = &$descr;
				if ((!$boucles[$id]->jointures)
				AND (isset($tables_jointures[$nom_table])) 
				AND is_array($x = $tables_jointures[$nom_table]))
				  AND is_array($show['tables_jointures'])
				  AND count($x = $show['tables_jointures']))
					$boucles[$id]->jointures = $x;
				if ($boucles[$id]->jointures_explicites){
					$jointures = preg_split("/\s+/",$boucles[$id]->jointures_explicites);
+4 −44
Numéro de ligne d'origine Numéro de ligne de diff Ligne de diff
@@ -194,55 +194,15 @@ function declarer_interfaces(){
	$table_des_tables['rubriques']='rubriques';
	$table_des_tables['hierarchie']='rubriques';

	$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' => '!',
		'post_date' => 'date',
		'exception' => array('statut','lien','tout')
	);

	$table_statut['spip_rubriques'][] = array(
		'champ' => 'statut',
		'publie' => 'publie',
		'previsu' => '!',
		'exception' => array('statut','tout')
	);
	// definition des statuts de publication
	global $tables_statut;
	$table_statut = array();

	//
	// tableau des tables de jointures
	// Ex: gestion du critere {id_mot} dans la boucle(ARTICLES)

	global $tables_jointures;

	$tables_jointures['spip_articles']['id_auteur']= 'auteurs_liens';
	$tables_jointures['spip_rubriques']['id_auteur']= 'auteurs_liens';
	$tables_jointures['spip_auteurs'][]= 'auteurs_liens';

	$tables_jointures = array();

	global  $exceptions_des_jointures;
	#$exceptions_des_jointures['titre_mot'] = array('spip_mots', 'titre'); // pour exemple