Exemple #1
0
/**
 * Calcule la liste des langues reellement utilisees dans le site public
 *
 * La recherche de langue est effectuée en recréant une boucle pour chaque
 * objet éditorial gérant des langues de sorte que les éléments non publiés
 * ne sont pas pris en compte.
 * 
 * @param string $serveur
 *    Nom du connecteur à la base de données
 * @return string
 *    Liste des langues utilisées séparées par des virgules
**/
function calculer_langues_utilisees($serveur = '')
{
    include_spip('public/interfaces');
    include_spip('public/compiler');
    include_spip('public/composer');
    $langues = array();
    $langues[$GLOBALS['meta']['langue_site']] = 1;
    include_spip('base/objets');
    $tables = lister_tables_objets_sql();
    $trouver_table = charger_fonction('trouver_table', 'base');
    foreach (array_keys($tables) as $t) {
        $desc = $trouver_table($t, $serveur);
        // c'est une table avec des langues
        if ($desc['exist'] and isset($desc['field']['lang']) and isset($desc['field']['langue_choisie'])) {
            $boucle = new Boucle();
            $boucle->show = $desc;
            $boucle->nom = 'calculer_langues_utilisees';
            $boucle->id_boucle = $desc['table_objet'];
            $boucle->id_table = $desc['table_objet'];
            $boucle->sql_serveur = $serveur;
            $boucle->select[] = "DISTINCT lang";
            $boucle->from[$desc['table_objet']] = $t;
            $boucle = pipeline('pre_boucle', $boucle);
            if (isset($desc['statut']) and $desc['statut']) {
                instituer_boucle($boucle, false);
                $res = calculer_select($boucle->select, $boucle->from, $boucle->from_type, $boucle->where, $boucle->join, $boucle->group, $boucle->order, $boucle->limit, $boucle->having, $desc['table_objet'], $desc['table_objet'], $serveur);
            } else {
                $res = sql_select(implode(',', $boucle->select), $boucle->from);
            }
            while ($row = sql_fetch($res)) {
                $langues[$row['lang']] = 1;
            }
        }
    }
    $langues = array_filter(array_keys($langues));
    sort($langues);
    $langues = join(',', $langues);
    spip_log("langues utilisees: {$langues}");
    return $langues;
}
Exemple #2
0
/**
 * Determininer si un objet est publie ou non
 * 
 * On se base pour cela sur sa declaration de statut
 * pour des cas particuliers non declarables, on permet de fournir une fonction
 * base_xxxx_test_si_publie qui sera appele par la fonction
 *
 * @param string $objet
 * @param int $id_objet
 * @param string $serveur
 * @return bool
 */
function objet_test_si_publie($objet, $id_objet, $serveur = '')
{
    // voir si une fonction est definie pour faire le boulot
    // elle a la priorite dans ce cas
    if ($f = charger_fonction($objet . "_test_si_publie", "base", true)) {
        return $f($objet, $id_objet, $serveur);
    }
    // sinon on se fie a la declaration de l'objet si presente
    $id_table = $table_objet = table_objet($objet);
    $id_table_objet = id_table_objet($objet, $serveur);
    $trouver_table = charger_fonction('trouver_table', 'base');
    if ($desc = $trouver_table($table_objet, $serveur) and isset($desc['statut']) and $desc['statut']) {
        $boucle = new Boucle();
        $boucle->show = $desc;
        $boucle->nom = 'objet_test_si_publie';
        $boucle->id_boucle = $id_table;
        $boucle->id_table = $id_table;
        $boucle->sql_serveur = $serveur;
        $boucle->select[] = $id_table_objet;
        $boucle->from[$table_objet] = table_objet_sql($objet, $serveur);
        $boucle->where[] = $id_table . "." . $id_table_objet . '=' . intval($id_objet);
        include_spip('public/compiler');
        include_spip('public/composer');
        instituer_boucle($boucle, false);
        $res = calculer_select($boucle->select, $boucle->from, $boucle->from_type, $boucle->where, $boucle->join, $boucle->group, $boucle->order, $boucle->limit, $boucle->having, $table_objet, $id_table, $serveur);
        if (sql_fetch($res)) {
            return true;
        }
        return false;
    }
    // si pas d'info statut ni de fonction : l'objet est publie
    return true;
}
Exemple #3
0
/**
 * Produit le corps PHP d'une boucle Spip.
 * 
 * Ce corps remplit une variable $t0 retournée en valeur.
 * Ici on distingue boucles recursives et boucle à requête SQL
 * et on insère le code d'envoi au debusqueur du resultat de la fonction.
 *
 * @param string $id_boucle
 * 		Identifiant de la boucle
 * @param array $boucles
 * 		AST du squelette
 * @return string
 * 		Code PHP compilé de la boucle
 */
function calculer_boucle($id_boucle, &$boucles)
{
    $boucle =& $boucles[$id_boucle];
    instituer_boucle($boucle);
    $boucles[$id_boucle] = pipeline('post_boucle', $boucles[$id_boucle]);
    // en mode debug memoriser les premiers passages dans la boucle,
    // mais pas tous, sinon ca pete.
    if (_request('var_mode_affiche') != 'resultat') {
        $trace = '';
    } else {
        $trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle;
        $trace = "if (count(@\$GLOBALS['debug_objets']['resultat']['{$trace}'])<3)\n\t    \$GLOBALS['debug_objets']['resultat']['{$trace}'][] = \$t0;";
    }
    return $boucles[$id_boucle]->type_requete == TYPE_RECURSIF ? calculer_boucle_rec($id_boucle, $boucles, $trace) : calculer_boucle_nonrec($id_boucle, $boucles, $trace);
}