function boucle_COURRIERS ($id_boucle, &$boucles) { /* $boucle = &$boucles[$id_boucle]; if(spiplistes_spip_est_inferieur_193()) { $id_table = $boucle->id_table; $boucle->from[] = "spip_courriers AS $id_table"; } $boucle->where[] = array("'='","'type'","'\"nl\"'"); return (calculer_boucle($id_boucle, $boucles)); /**/ global $table_des_tables; $boucle = &$boucles[$id_boucle]; $id_table = $boucle->id_table; $type = $boucle->type_requete; $id_table = $table_des_tables[$type]; if (!$id_table) // table hors SPIP $boucle->from[$type] = $type; else { // les tables declarees par spip ont un prefixe et un surnom $boucle->from[$id_table] = 'spip_' . $type ; } return (calculer_boucle($id_boucle, $boucles)); }
function boucle_FORUMS_dist($id_boucle, &$boucles) { $boucle =& $boucles[$id_boucle]; $id_table = $boucle->id_table; // Par defaut, selectionner uniquement les forums sans mere // Les criteres {tout} et {plat} inversent ce choix // de meme qu'un critere sur {id_forum} ou {id_parent} if (!isset($boucle->modificateur['tout']) and !isset($boucle->modificateur['plat']) and !isset($boucle->modificateur['criteres']['id_forum']) and !isset($boucle->modificateur['criteres']['id_parent'])) { array_unshift($boucle->where, array("'='", "'{$id_table}." . "id_parent'", 0)); } return calculer_boucle($id_boucle, $boucles); }
/** * <BOUCLE(EVENEMENTS)> * * @param <type> $id_boucle * @param <type> $boucles * @return <type> */ function boucle_EVENEMENTS_dist($id_boucle, &$boucles) { $boucle = &$boucles[$id_boucle]; $id_table = $boucle->id_table; if (!isset($boucle->modificateur['criteres']['statut'])) { // Restreindre aux elements publies // uniquement les evenements d'un article publie if (!$GLOBALS['var_preview']) if (!isset($boucle->modificateur['lien']) AND !isset($boucle->modificateur['tout']) AND (!isset($boucle->lien) OR !$boucle->lien) AND (!isset($boucle->tout) OR !$boucle->tout)) { $boucle->from["articles"] = "spip_articles"; $boucle->where[]= array("'='", "'articles.id_article'", "'$id_table.id_article'"); $boucle->where[]= array("'='", "'articles.statut'", "'\"publie\"'"); } } return calculer_boucle($id_boucle, $boucles); }
function boucle_HIERARCHIE_dist($id_boucle, &$boucles) { $boucle =& $boucles[$id_boucle]; $id_table = $boucle->id_table . ".id_rubrique"; // Si la boucle mere est une boucle RUBRIQUES il faut ignorer la feuille // sauf en presence du critere {tout} (vu par phraser_html) // ou {id_article} qui positionne aussi le {tout} $boucle->hierarchie = 'if (!($id_rubrique = intval(' . calculer_argument_precedent($boucle->id_boucle, 'id_rubrique', $boucles) . ")))\n\t\treturn '';\n\t" . "include_spip('inc/rubriques');\n\t" . '$hierarchie = calcul_hierarchie_in($id_rubrique,' . (isset($boucle->modificateur['tout']) ? 'true' : 'false') . ");\n\t" . 'if (!$hierarchie) return "";' . "\n\t"; $boucle->where[] = array("'IN'", "'{$id_table}'", '"($hierarchie)"'); $order = "FIELD({$id_table}, \$hierarchie)"; if (!isset($boucle->default_order[0]) or $boucle->default_order[0] != " DESC") { $boucle->default_order[] = "\"{$order}\""; } else { $boucle->default_order[0] = "\"{$order} DESC\""; } return calculer_boucle($id_boucle, $boucles); }
function boucle_DOCUMENTS($id_boucle, &$boucles) { $boucle =& $boucles[$id_boucle]; $id_table = $boucle->id_table; // on ne veut pas des fichiers de taille nulle, // sauf s'ils sont distants (taille inconnue) array_unshift($boucle->where, array("'({$id_table}.taille > 0 OR {$id_table}.distant=\\'oui\\')'")); /** * N'afficher que les modes de documents que l'on accepte * Utiliser le "pipeline medias_documents_visibles" pour en ajouter */ if (!isset($boucle->modificateur['criteres']['mode']) and !isset($boucle->modificateur['tout'])) { $modes = pipeline('medias_documents_visibles', array('image', 'document')); $f = sql_serveur('quote', $boucle->sql_serveur, true); $modes = addslashes(join(',', array_map($f, array_unique($modes)))); array_unshift($boucle->where, array("'IN'", "'{$id_table}.mode'", "'({$modes})'")); } return calculer_boucle($id_boucle, $boucles); }
function calculer_boucle_avec_frequence($id_boucle, &$boucles) { //compatibilite 1.9.2 et SPIP SVN $spip_abstract_fetch = function_exists('spip_abstract_fetch') ? 'spip_abstract_fetch' : 'sql_fetch'; $boucle = &$boucles[$id_boucle]; $id_table = $boucle->id_table; $boucle->from[$id_table] = "spip_mots"; //retenir max_frequence $max = '$max_frequence'.$boucle->id_boucle; $frequence = '$Pile[$SP][\'frequence'.$boucle->id_boucle.'\']'; $code_avant = "\n\t" . $max .' = 0; $PileTemp = array();'; $code = "\n\t".'while ($Pile[$SP] = @'.$spip_abstract_fetch.'($result,"")) {' . "\n\t\t" . $max.' = max('.$max.', '.$frequence.');' . "\n\t\t" . '$PileTemp[] = $Pile[$SP]; } while (list(,$Pile[$SP]) = each($PileTemp)) {'; $calcul = calculer_boucle($id_boucle, $boucles); $calcul = preg_replace(',(\t\/\/ RESULTATS),', '$1'.$code_avant, $calcul); $calcul = preg_replace(',(while([^{]*){),', $code, $calcul); return $calcul; }
/** * Compile une boucle HIERARCHIE * * <BOUCLE(HIERARCHIE)> * * Cette boucle (aliasée sur la table RUBRIQUES) * - recherche un id_rubrique dans les boucles parentes, * - extrait sa hiérarchie, en prenant ou non la rubrique en cours en fonction du critère {tout} * - crée une condition WHERE avec ces identifiants ansi qu'une clause ORDER * - compile la boucle. * * Le code compilé calculant la hierarchie est ajouté au tout début de la * fonction de boucle et quitte la boucle si aucune rubrique n'est trouvée. * * @param string $id_boucle * Identifiant de la boucle * @param array $boucles * AST du squelette * @return string * Code PHP compilé de la boucle **/ function boucle_HIERARCHIE_dist($id_boucle, &$boucles) { $boucle =& $boucles[$id_boucle]; $id_table = $boucle->id_table . ".id_rubrique"; // Si la boucle mere est une boucle RUBRIQUES il faut ignorer la feuille // sauf en presence du critere {tout} (vu par phraser_html) // ou {id_article} qui positionne aussi le {tout} $boucle->hierarchie = 'if (!($id_rubrique = intval(' . calculer_argument_precedent($boucle->id_boucle, 'id_rubrique', $boucles) . ")))\n\t\treturn '';\n\t" . '$hierarchie = ' . (isset($boucle->modificateur['tout']) ? '",$id_rubrique"' : "''") . ";\n\t" . 'while ($id_rubrique = sql_getfetsel("id_parent","spip_rubriques","id_rubrique=" . $id_rubrique,"","","", "", $connect)) { $hierarchie = ",$id_rubrique$hierarchie"; } if (!$hierarchie) return ""; $hierarchie = substr($hierarchie,1);'; $boucle->where[] = array("'IN'", "'{$id_table}'", '"($hierarchie)"'); $order = "FIELD({$id_table}, \$hierarchie)"; if (!isset($boucle->default_order[0]) or $boucle->default_order[0] != " DESC") { $boucle->default_order[] = "\"{$order}\""; } else { $boucle->default_order[0] = "\"{$order} DESC\""; } return calculer_boucle($id_boucle, $boucles); }
/** * Calcule la liste des langues réellement utilisées 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'); include_spip('public/phraser_html'); $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->separateur[] = ','; $boucle->return = '$Pile[$SP][\'lang\']'; $boucle->iterateur = 'sql'; $boucle->descr['nom'] = 'objet_test_si_publie'; // eviter notice php $boucle->descr['sourcefile'] = 'internal'; $boucle = pipeline('pre_boucle', $boucle); if (isset($desc['statut']) and $desc['statut']) { $boucles = array('calculer_langues_utilisees' => $boucle); // generer un nom de fonction "anonyme" unique do { $functionname = 'f_calculer_langues_utilisees_' . $boucle->id_table . '_' . time() . '_' . rand(); } while (function_exists($functionname)); $code = calculer_boucle('calculer_langues_utilisees', $boucles); $code = '$SP=0; $command=array();$command["connect"] = $connect = "' . $serveur . '"; $Pile=array(0=>array());' . "\n" . $code; $code = 'function ' . $functionname . '(){' . $code . '};$res = ' . $functionname . '();'; $res = ''; eval($code); $res = explode(',', $res); foreach ($res as $lang) { $langues[$lang] = 1; } } 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; }
function boucle_SYNDIC_ARTICLES_dist($id_boucle, &$boucles) { $boucle = &$boucles[$id_boucle]; $id_table = $boucle->id_table; $mstatut = $id_table .'.statut'; // Restreindre aux elements publies, sauf critere contraire if (isset($boucle->modificateur['criteres']['statut']) AND $boucle->modificateur['criteres']['statut']) {} else if ($GLOBALS['var_preview']) array_unshift($boucle->where,array("'IN'", "'$mstatut'", "'(\\'publie\\',\\'prop\\')'")); else { $jointure = array_search("spip_syndic", $boucle->from); if (!$jointure) { $trouver_table = charger_fonction('trouver_table', 'base'); $def = $trouver_table('spip_syndic'); $def = array('spip_syndic', $def); $def = array($id_table, $def, 'id_syndic'); fabrique_jointures($boucle, array($def), true, $boucle->show, $id_table); $jointure = array_search('spip_syndic', $boucle->from); } array_unshift($boucle->where,array("'='", "'$mstatut'", "'\\'publie\\''")); $boucle->where[]= array("'='", "'$jointure" . ".statut'", "'\\'publie\\''"); } return calculer_boucle($id_boucle, $boucles); }