/** * 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; }
/** * 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; }
/** * 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); }