/** * Décrit un critère non déclaré explicitement, sur un champ externe à la table * * Décrit un critère non déclaré comme {id_article} {id_article>3} qui correspond * à un champ non présent dans la table, et donc à retrouver par jointure si possible. * * @param Boucle $boucle Description de la boucle * @param Critere $crit Paramètres du critère dans cette boucle * @param string $op L'opérateur utilisé, tel que '=' * @param array $desc Description de la table * @param string $col Nom de la colonne à trouver (la véritable) * @param string $col_alias Alias de la colonne éventuel utilisé dans le critère ex: id_enfant * @param string $table Nom de la table SQL de la boucle * @return array|string * Liste si jointure possible : * - string $col * - string $col_alias * - string $table * - array $where * - array $desc * * Chaîne vide si on ne trouve pas le champ par jointure... **/ function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) { global $exceptions_des_jointures; $where = ''; $calculer_critere_externe = 'calculer_critere_externe_init'; // gestion par les plugins des jointures tordues // pas automatiques mais necessaires $table_sql = table_objet_sql($table); if (isset($exceptions_des_jointures[$table_sql]) and is_array($exceptions_des_jointures[$table_sql]) and (isset($exceptions_des_jointures[$table_sql][$col]) or isset($exceptions_des_jointures[$table_sql]['']))) { $t = $exceptions_des_jointures[$table_sql]; $index = isset($t[$col]) ? $t[$col] : (isset($t['']) ? $t[''] : array()); if (count($index) == 3) { list($t, $col, $calculer_critere_externe) = $index; } elseif (count($index) == 2) { list($t, $col) = $t[$col]; } elseif (count($index) == 1) { list($calculer_critere_externe) = $index; $t = $table; } else { $t = ''; } // jointure non declaree. La trouver. } elseif (isset($exceptions_des_jointures[$col])) { list($t, $col) = $exceptions_des_jointures[$col]; } else { $t = ''; } // jointure non declaree. La trouver. // ici on construit le from pour fournir $col en piochant dans les jointures // si des jointures explicites sont fournies, on cherche d'abord dans celles ci // permet de forcer une table de lien quand il y a ambiguite // <BOUCLE_(DOCUMENTS documents_liens){id_mot}> // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}> $table = ""; if ($boucle->jointures_explicites) { $jointures_explicites = explode(' ', $boucle->jointures_explicites); $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, $crit->cond or $op != '=', $t); } // et sinon on cherche parmi toutes les jointures declarees if (!$table) { $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, $crit->cond or $op != '=', $t); } if (!$table) { return ''; } // il ne reste plus qu'a trouver le champ dans les from list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle); if (count($cle) > 1 or reset($cle) !== $col) { $col_alias = $col; // id_article devient juste le nom d'origine if (count($cle) > 1 and reset($cle) == 'id_objet') { $e = decompose_champ_id_objet($col); $col = array_shift($e); $where = primary_doublee($e, $table); } else { $col = reset($cle); } } return array($col, $col_alias, $table, $where, $desc); }
function calculer_critere_infixe_externe(&$boucle, $crit, $op, $desc, $col, $col_alias, $table) { global $exceptions_des_jointures; $where = ''; $calculer_critere_externe = 'calculer_critere_externe_init'; // gestion par les plugins des jointures tordues // pas automatiques mais necessaires if (is_array($exceptions_des_jointures[$table])) { $t = $exceptions_des_jointures[$table]; $index = isset($t[$col]) ? $t[$col] : (isset($t['']) ? $t[''] : array()); if (count($index)==3) list($t, $col, $calculer_critere_externe) = $index; elseif (count($index)==2) list($t, $col) = $t[$col]; elseif (count($index)==1){ list($calculer_critere_externe) = $index; $t = $table; } else $t=''; // jointure non declaree. La trouver. } elseif (isset($exceptions_des_jointures[$col])) list($t, $col) = $exceptions_des_jointures[$col]; else $t =''; // jointure non declaree. La trouver. $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond OR $op !='='), $t); if (!$table) return ''; list($nom, $desc) = trouver_champ_exterieur($col, $boucle->jointures, $boucle); if (count(trouver_champs_decomposes($col,$desc))>1){ $col_alias = $col; // id_article devient juste le nom d'origine $e = decompose_champ_id_objet($col); $col = array_shift($e); $where = primary_doublee($e, $table); } return array($col, $col_alias, $table, $where); }