示例#1
0
/**
 * Champ hors table, ça ne peut être qu'une jointure.
 *
 * On cherche la table du champ et on regarde si elle est déjà jointe
 * Si oui et qu'on y cherche un champ nouveau, pas de jointure supplementaire
 * Exemple: criteres {titre_mot=...}{type_mot=...}
 * Dans les 2 autres cas ==> jointure
 * (Exemple: criteres {type_mot=...}{type_mot=...} donne 2 jointures
 * pour selectioner ce qui a exactement ces 2 mots-cles.
 *
 * @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)
 *     Vide sinon.
 */
function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false)
{
    // si on demande un truc du genre spip_mots
    // avec aussi spip_mots_liens dans les jointures dispo
    // et qu'on est la
    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
    if ($checkarrivee and is_string($checkarrivee) and $a = table_objet($checkarrivee) and in_array($a . '_liens', $joints)) {
        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
            return $res;
        }
    }
    foreach ($joints as $joint) {
        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
            // alias de table dans le from
            $t = array_search($arrivee[0], $boucle->from);
            // recuperer la cle id_xx eventuellement decomposee en (id_objet,objet)
            $cols = $arrivee[2];
            // mais on ignore la 3eme cle si presente qui correspond alors au point de depart
            if (count($cols) > 2) {
                array_pop($cols);
            }
            if ($t) {
                // la table est déjà dans le FROM, on vérifie si le champ est utilisé.
                $joindre = false;
                foreach ($cols as $col) {
                    $c = '/\\b' . $t . ".{$col}" . '\\b/';
                    if (trouver_champ($c, $boucle->where)) {
                        $joindre = true;
                    } else {
                        // mais ca peut etre dans le FIELD pour le Having
                        $c = "/FIELD.{$t}" . ".{$col},/";
                        if (trouver_champ($c, $boucle->select)) {
                            $joindre = true;
                        }
                    }
                }
                if (!$joindre) {
                    return $t;
                }
            }
            array_pop($arrivee);
            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
                return $res;
            }
        }
    }
    return '';
}
示例#2
0
/**
 * Champ hors table, ca ne peut etre qu'une jointure.
 * On cherche la table du champ et on regarde si elle est deja jointe
 * Si oui et qu'on y cherche un champ nouveau, pas de jointure supplementaire
 * Exemple: criteres {titre_mot=...}{type_mot=...}
 * Dans les 2 autres cas ==> jointure
 * (Exemple: criteres {type_mot=...}{type_mot=...} donne 2 jointures
 * pour selectioner ce qui a exactement ces 2 mots-cles.
 *
 * http://doc.spip.org/@calculer_critere_externe_init
 *
 * @param  $boucle
 * @param  $joints
 * @param  $col
 * @param  $desc
 * @param  $cond
 * @param bool|string $checkarrivee
 * @return mixed|string
 */
function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false)
{
    // si on demande un truc du genre spip_mots
    // avec aussi spip_mots_liens dans les jointures dispo
    // et qu'on est la
    // il faut privilegier la jointure directe en 2 etapes spip_mots_liens, spip_mots
    if ($checkarrivee and is_string($checkarrivee) and $a = table_objet($checkarrivee) and in_array($a . '_liens', $joints)) {
        if ($res = calculer_lien_externe_init($boucle, $joints, $col, $desc, $cond, $checkarrivee)) {
            return $res;
        }
    }
    foreach ($joints as $joint) {
        if ($arrivee = trouver_champ_exterieur($col, array($joint), $boucle, $checkarrivee)) {
            $t = array_search($arrivee[0], $boucle->from);
            // transformer eventuellement id_xx en (id_objet,objet)
            $cols = trouver_champs_decomposes($col, $arrivee[1]);
            if ($t) {
                $joindre = false;
                foreach ($cols as $col) {
                    $c = '/\\b' . $t . ".{$col}" . '\\b/';
                    if (trouver_champ($c, $boucle->where)) {
                        $joindre = true;
                    } else {
                        // mais ca peut etre dans le FIELD pour le Having
                        $c = "/FIELD.{$t}" . ".{$col},/";
                        if (trouver_champ($c, $boucle->select)) {
                            $joindre = true;
                        }
                    }
                }
                if (!$joindre) {
                    return $t;
                }
            }
            if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) {
                return $res;
            }
        }
    }
    return '';
}