type_requete; // $t est le nom de la table SQL (préfixe "spip_") $t = $table_des_tables[$r]; // $a est la valeur de cette table en PHP (cf les globaux spip_* ci-dessus) $a = $$t; // $e est le type SQL de l'entrée (on s'en sert comme booléen uniquement) $e = $a[$c]; if ($e) // entité SPIP homonyme au champ SQL { $e = $c; } else { // entité SPIP alias d'un champ SQL $e = $exceptions_des_tables[$r][$c]; if (is_array($e)) // entité SPIP dans une table SQL annexe qu'il faut préciser { $t = $e[0]; $e = $e[1]; } } if ($e) { $boucles[$idb]->select[] = $t . "." . $e; return ('$PileRow[$SP' . ($i ? "-$i" : "") . '][' . $e . "]"); } $idb = $boucles[$idb]->id_parent; $i++; } if ($from_request) { foreach($from_request as $k => $v) { if ($k == $nom_champ) { return('$PileRow[0]['.$nom_champ.']'); }}} return "''"; } // calculer_champ genere le code PHP correspondant a un champ SPIP. // Retourne un tableau dont le premier élément est une EXPRESSION php // et le deuxième une suite d'INSTRUCTIONS à exécuter AVANT de calculer // l'expression (typiquement: un include ou une affectation d'auxiliaires) // Essayer de renvoyer une suite vide, ça diminue les allocations function calculer_champ($fonctions, $nom_champ, $id_boucle) { global $les_notes, $boucles, $flag_ob, $flag_pcre, $boucle_courante, $exceptions_des_champs; // on regarde d'abord si c'est un champs SQL homonyme, // sauf pour les faux homonymes $milieu = ''; $code = ($exceptions_des_champs[$nom_champ] ? "''" : index_pile($id_boucle, $nom_champ)); if ($code == "''") { // Champ SPIP non SQL switch($nom_champ) { // // Les logos (rubriques, articles...) // case 'LOGO_ARTICLE': case 'LOGO_ARTICLE_NORMAL': case 'LOGO_ARTICLE_RUBRIQUE': case 'LOGO_ARTICLE_SURVOL': case 'LOGO_AUTEUR': case 'LOGO_AUTEUR_NORMAL': case 'LOGO_AUTEUR_SURVOL': case 'LOGO_SITE': case 'LOGO_BREVE': case 'LOGO_BREVE_RUBRIQUE': case 'LOGO_MOT': case 'LOGO_RUBRIQUE': case 'LOGO_RUBRIQUE_NORMAL': case 'LOGO_RUBRIQUE_SURVOL': case 'LOGO_DOCUMENT': ereg("^LOGO_(([a-zA-Z]+).*)$", $nom_champ, $regs); $type_logo = $regs[1]; $type_objet = strtolower($regs[2]); $filtres = ''; if ($fonctions) { while (list(, $nom) = each($fonctions)) { if (ereg('^(left|right|center|top|bottom)$', $nom)) $align = $nom; else if ($nom == 'lien') { $flag_lien_auto = 'oui'; $flag_stop = true; } else if ($nom == 'fichier') { $flag_fichier = 'oui'; $flag_stop = true; } else if ($nom == '') // double || signifie "on passe aux filtres" $flag_stop = true; else if (!$flag_stop) { $lien = $nom; $flag_stop = true; } else // apres un URL ou || ou |fichier ce sont des filtres (sauf left...lien...fichier) $filtres[] = $nom; } // recuperer les filtres s'il y en a $fonctions = $filtres; } if ($flag_lien_auto && !$lien) { $milieu .= " \$lien = generer_url_$type_objet(" . index_pile($id_boucle, 'id_$type_objet') . "); "; } else { $milieu .= "\n\t\$lien = "; $a = $lien; while (ereg("^([^#]*)#([A-Za-z_]+)(.*)$", $a, $match)) { list($c,$m) = calculer_champ("", $match[2], $id_boucle); // $m est nul dans les cas prévus $milieu .= ((!$match[1]) ? "" :"'$match[1]' .") . " $c ."; $a = $match[3]; } if ($a) $milieu .= "'$lien';"; else { if ($lien) $milieu = substr($milieu,1,-1) .";"; else $milieu .= "'';"; } } if ($type_logo == 'RUBRIQUE') { $milieu .= ' list($logon, $logoff) = IMG_image(image_rubrique(' . index_pile($id_boucle, "id_rubrique") . ')); '; } else if ($type_logo == 'RUBRIQUE_NORMAL') { $milieu .= ' list($logon,) = IMG_image(image_rubrique(' . index_pile($id_boucle, "id_rubrique") . ')); $logoff = ""; '; } else if ($type_logo == 'RUBRIQUE_SURVOL') { $milieu .= ' list(,$logon) = IMG_image(image_rubrique(' . index_pile($id_boucle, "id_rubrique") . ')); $logoff = ""; '; } else if ($type_logo == 'DOCUMENT'){ $milieu .= ' $logon = integre_image(' . index_pile($id_boucle, "id_document") . ',"","fichier_vignette"); $logoff = ""; '; } else if ($type_logo == 'AUTEUR') { $milieu .= ' list($logon, $logoff) = IMG_image(image_auteur(' . index_pile($id_boucle, "id_auteur") . ')); '; } else if ($type_logo == 'AUTEUR_NORMAL') { $milieu .= ' list($logon,) = IMG_image(image_auteur(' . index_pile($id_boucle, "id_auteur") . ')); $logoff = ""; '; } else if ($type_logo == 'AUTEUR_SURVOL') { $milieu .= ' list(,$logon) = IMG_image(image_auteur(' . index_pile($id_boucle, "id_auteur") . ')); $logoff = ""; '; } else if ($type_logo == 'BREVE') { $milieu .= ' list($logon, $logoff) = IMG_image(image_breve(' . index_pile($id_boucle, "id_breve") . ')); '; } else if ($type_logo == 'BREVE_RUBRIQUE') { $milieu .= ' list($logon, $logoff) = IMG_image(image_breve(' . index_pile($id_boucle, "id_breve") . ')); if (!$logon) list($logon, $logoff) = IMG_image(image_rubrique(' . index_pile($id_boucle, "id_rubrique") . ')); '; } else if ($type_logo == 'SITE') { $milieu .= ' list($logon, $logoff) = IMG_image(image_site(' . index_pile($id_boucle, "id_syndic") . ')); '; } else if ($type_logo == 'MOT') { $milieu .= ' list($logon, $logoff) = IMG_image(image_mot(' . index_pile($id_boucle, "id_mot") . ')); '; } else if ($type_logo == 'ARTICLE') { $milieu .= ' list($logon, $logoff) = IMG_image(image_article(' . index_pile($id_boucle, "id_article") . ')); '; } else if ($type_logo == 'ARTICLE_NORMAL') { $milieu .= ' list($logon,) = IMG_image(image_article(' . index_pile($id_boucle, "id_article") . ')); $logoff = ""; '; } else if ($type_logo == 'ARTICLE_SURVOL') { $milieu .= ' list(,$logon) = IMG_image(image_article(' . index_pile($id_boucle, "id_article") . ')); $logoff = ""; '; } else if ($type_logo == 'ARTICLE_RUBRIQUE') { $milieu .= ' list($logon, $logoff) = IMG_image(image_article(' . index_pile($id_boucle, "id_article") . ')); if (!$logon) list($logon, $logoff) = IMG_image(image_rubrique(' . index_pile($id_boucle, "id_rubrique") . ')); '; } if ($flag_fichier) $code = "ereg_replace('^/?IMG/','',\$logon)"; // compatibilite ascendante : pas de 'IMG/' else $code = "affiche_logos(\$logon, \$logoff, \$lien, '". addslashes($align) . "')"; break; // // Liste des auteurs d'un article // case 'LESAUTEURS': $code = 'query_auteurs(' . index_pile($id_boucle, "id_article") . ')'; break; // // Introduction (d'un article, d'une breve ou d'un message de forum) // case 'INTRODUCTION': $code = 'calcul_introduction(\'' . $boucles[$id_boucle]->type_requete . "',\n" . index_pile($id_boucle, "texte") . ",\n" . index_pile($id_boucle, "chapo") . ",\n" . index_pile($id_boucle, "descriptif") . ")\n"; break; // // Divers types de champs // case 'URL_SITE_SPIP': $code = "lire_meta('adresse_site')"; break; case 'NOM_SITE_SPIP': $code = "lire_meta('nom_site')"; break; case 'EMAIL_WEBMASTER': $code = "lire_meta('email_webmaster')"; break; case 'CHARSET': $code = "lire_meta('charset')"; break; case 'LANG': $code = "lire_meta('langue_site')"; break; case 'LANG_LEFT': $code = "lang_dir(\$GLOBALS['spip_lang'],'left','right')"; break; case 'LANG_RIGHT': $code = "lang_dir(\$GLOBALS['spip_lang'],'right','left')"; break; case 'LANG_DIR': $code = "lang_dir(\$GLOBALS['spip_lang'],'ltr','rtl')"; break; case 'PUCE': $code = "propre('- ')"; break; case 'DATE': // Uniquement hors-boucles, pour la date passee dans l'URL ou contexte_inclus // est-ce bien sûr ? $code = index_pile($id_boucle, 'date'); break; case 'DATE_NOUVEAUTES': $code = "((lire_meta('quoi_de_neuf') == 'oui' AND lire_meta('majnouv')) ? normaliser_date(lire_meta('majnouv')) : \"'0000-00-00'\")"; break; case 'URL_ARTICLE': $code = "generer_url_article(" . index_pile($id_boucle, 'id_article') . ")" ; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche(" . $code . ")"; break; case 'URL_RUBRIQUE': $code = "generer_url_rubrique(" . index_pile($id_boucle, 'id_rubrique') . ")" ; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche(" . $code . ")"; break; case 'URL_BREVE': $code = "generer_url_breve(" . index_pile($id_boucle, 'id_breve') . ")"; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche(" . $code . ")"; break; case 'URL_MOT': $code = "generer_url_mot(" . index_pile($id_boucle, 'id_mot') . ")"; if ($boucles[$id_boucle]->hash) $code = "url_var_recherche(" . $code . ")"; break; case 'URL_FORUM': $code = "generer_url_forum(" . index_pile($id_boucle, 'id_forum') .")"; break; case 'URL_DOCUMENT': $code = "generer_url_document(" . index_pile($id_boucle, 'id_document') . ")"; break; case 'NOTES': $milieu = '$lacible = $GLOBALS["les_notes"]; $GLOBALS["les_notes"] = ""; $GLOBALS["compt_note"] = 0; $GLOBALS["marqueur_notes"] ++; '; $code = '$lacible'; break; case 'RECHERCHE': $code = 'htmlspecialchars($GLOBALS["recherche"])'; break; case 'COMPTEUR_BOUCLE': $code = '$compteur_boucle'; break; case 'TOTAL_BOUCLE': $n = 0; $b = $id_boucle; // si $id_boucle est vide, c'est la racine // il faudrait dire à l'auteur du squelette que ca n'a pas de sens while ($b != $boucle_courante) { $n++; $b = $boucles[$b]->id_parent; // ça ne devrait pas arriver, mais je ne prends pas le risque if (!$b) break; } $code = '$PileNum[$SP' . (($n==0) ? "" : "+$n") . ']'; $boucles[$id_boucle]->numrows = true; break; case 'POPULARITE': $code = 'ceil(min(100, 100 * ' . index_pile($id_boucle, "popularite") . '/ max(1 , 0 + lire_meta(\'popularite_max\'))))'; break; case 'POPULARITE_ABSOLUE': $code = 'ceil(' . index_pile($id_boucle, "popularite") . ')'; break; case 'POPULARITE_SITE': $code = 'ceil(lire_meta(\'popularite_total\'))'; break; case 'POPULARITE_MAX': $code = 'ceil(lire_meta(\'popularite_max\'))'; break; case 'EXTRA': // cas particulier : on ne peut pas appliquer interdire_scripts directement // sur la balise, sinon on casse le unserialize(). Donc on ne l'applique qu'en // absence de filtres (et aussi dans le filtre extra{"xxx"}) if (!$fonctions) { $fonctions[] = 'interdire_scripts'; } /* else { // gerer la notation [(#EXTRA{toto})] $filtres = Array(); reset ($fonctions); while (list(,$filtre) = each($fonctions)) { if (ereg("^{(.*)\}$", trim($filtre), $regs)) $filtres[] = 'extra{"'.$regs[1].'"}'; else $filtres[] = $filtre; } $fonctions = $filtres; } */ $code = 'trim(' . index_pile($id_boucle, "extra") . ')'; break; // // Inserer directement un document dans le squelette // case 'EMBED_DOCUMENT': $milieu = " include_ecrire('inc_documents.php3');"; $code = "embed_document(" . index_pile($id_boucle, 'id_document') . ", '" . ($fonctions) ? join($fonctions, "|") : "" . "', false)"; $fonctions = ""; break; // // Formulaire de recherche sur le site // case 'FORMULAIRE_RECHERCHE': if ($fonctions) { list(, $lien) = each($fonctions); // le premier est un url while (list(, $filtre) = each($fonctions)) { $filtres[] = $filtre; // les suivants sont des filtres } $fonctions = $filtres; } if (!$lien) $lien = 'recherche.php3'; $code = "((lire_meta('activer_moteur') != 'oui') ? '' : (\"
\"))"; break; // // Formulaire d'inscription comme redacteur // (dans inc-formulaires.php3) case 'FORMULAIRE_INSCRIPTION': $milieu = ' $spip_lang = $GLOBALS["spip_lang"];'; $code = '(lire_meta("accepter_inscriptions") != "oui") ? "" : ("<"."?php include_local(\'inc-formulaires.php3\'); lang_select(\"$spip_lang\"); formulaire_inscription(\"redac\"); lang_dselect(); ?".">")'; break; // // Formulaire pour ecrire a l'auteur // case 'FORMULAIRE_ECRIRE_AUTEUR': $milieu = ' $spip_lang = $GLOBALS["spip_lang"]; $mailauteur = ' . index_pile($id_boucle, 'email') . '; $nomauteur = ' . index_pile($id_boucle, 'id_auteur') . ';'; $code = '(!email_valide($mailauteur) ? "" : ("<'.'?php include_local(\'inc-formulaires.php3\'); lang_select(\"$spip_lang\"); formulaire_ecrire_auteur(\"$nomauteur\", trim(\"$mailauteur\")); lang_dselect(); ?'.'>"))'; break; // // Formulaire de signature d'une petition // case 'FORMULAIRE_SIGNATURE': $milieu = ' $spip_lang = $GLOBALS["spip_lang"]; $lacible = ' . index_pile($id_boucle, 'id_article') . ";"; $code = '(!spip_fetch_array(spip_query("SELECT id_article FROM spip_petitions WHERE id_article=\'$lacible\'")) ? "" : ("<"."?php include_local(\'inc-formulaires.php3\'); lang_select(\"$spip_lang\"); formulaire_signature($lacible); lang_dselect(); ?".">"))'; break; // // Formulaire de referencement d'un site // case 'FORMULAIRE_SITE': $milieu = ' $spip_lang = $GLOBALS["spip_lang"]; $lacible = ' . index_pile($id_boucle, 'id_rubrique') . ';'; $code = '(lire_meta("proposer_sites") != "2") ? "" : ("<"."?php include_local(\'inc-formulaires.php3\'); lang_select(\"$spip_lang\"); formulaire_site($lacible); lang_dselect(); ?".">")'; break; // // Champ testant la presence d'une petition // case 'PETITION': $code = '(spip_fetch_array(spip_query("SELECT id_article FROM spip_petitions WHERE id_article=' . index_pile($id_boucle, 'id_article') . '")) ? " " : "")'; break; // // Formulaire de reponse a un forum // case 'FORMULAIRE_FORUM': $idr=0;$idf=0;$ida=0;$idb=0;$ids=0; switch ($boucles[$id_boucle]->type_requete) { case 'articles': $ida = index_pile($id_boucle, 'id_article'); break; case 'breves': $idb = index_pile($id_boucle, 'id_breve'); break; case 'rubriques': $idr = index_pile($id_boucle, 'id_rubrique'); break; case 'syndication': $ids = index_pile($id_boucle, 'id_syndic'); break; case 'forums': default: $idr = index_pile($id_boucle, 'id_rubrique'); $idf = index_pile($id_boucle, 'id_forum'); $ida = index_pile($id_boucle, 'id_article'); $idb = index_pile($id_boucle, 'id_breve'); $ids = index_pile($id_boucle, 'id_syndic'); break; } $code = '"<"."?php include_local(\'inc-forum.php3\'); lang_select(\$GLOBALS[\'spip_lang\']); echo retour_forum(".\'' . addslashes($idr) . "' . \", \".\n\t\t'" . addslashes($idf) . "' . \", \".\n\t\t'" . addslashes($ida) . "' . \", \".\n\t\t'" . addslashes($idb) . "' . \", \".\n\t\t'" . addslashes($ids) . "' . \n" . '"); lang_dselect(); ?".">"'; break; // // Parametres d'appel du formulaire de reponse a un forum // case 'PARAMETRES_FORUM': $milieu = ' $forums_publics = ((' . index_pile($id_boucle, "accepter_forum") . ' == "" AND lire_meta("forums_publics") != "non") OR (' . index_pile($id_boucle, "accepter_forum") . ' != "" AND ' . index_pile($id_boucle, "accepter_forum") . ' != "non")); if ($forums_publics) { $request_uri = $GLOBALS["REQUEST_URI"]; $http_get_vars = $GLOBALS["HTTP_GET_VARS"]; $lien = substr($request_uri, strrpos($request_uri, "/") + 1); if (!($lien_retour = $http_get_vars["retour"])) $lien_retour = $lien; $lien_retour = rawurlencode($lien_retour); '; switch ($boucles[$id_boucle]->type_requete) { case 'articles': $c = '"id_article=".' . index_pile($id_boucle, id_article); break; case 'breves': $c = '"id_breve=".' . index_pile($id_boucle, id_breve); break; case 'rubriques': $c = '"id_rubrique=".' . index_pile($id_boucle, id_rubrique); break; case 'syndication': $c = '"id_syndic=".' . index_pile($id_boucle, id_syndic); break; case 'forums': default: $liste_champs = array ("id_article","id_breve","id_rubrique","id_syndic","id_forum"); $c="";$s=""; while (list(,$champ) = each ($liste_champs)) { $x = index_pile($id_boucle, $champ); $c .= (($c) ? ".\n" : "") . "((!$x) ? '' : ('$s$champ='.$x))"; $s="&";} break; } $milieu .= "}\n"; $code = "(!\$forums_publics) ? '' : ($c . \"retour=\$lien_retour\")"; break; // // Debut et fin de surlignage auto des mots de la recherche // case 'DEBUT_SURLIGNE': if ($flag_ob AND $flag_pcre) { $code = '"<"."?php if (\$var_recherche) { \$mode_surligne = debut_surligne(\$var_recherche, \$mode_surligne); } ?".">"'; } else $code = ""; break; case 'FIN_SURLIGNE': if ($flag_ob AND $flag_pcre) { $code = '"<"."?php if (\$var_recherche) { \$mode_surligne = fin_surligne(\$var_recherche, \$mode_surligne); } ?".">"'; } else $code = ""; break; // // Formulaires de login // case 'LOGIN_PRIVE': $code = '"<"."?php include_local(\'inc-login.php3\'); login (\'\', \'prive\'); ?".">"'; break; case 'LOGIN_PUBLIC': if ($fonctions) { while (list(, $nom) = each($fonctions)) $lacible = "new Link('".$nom."')"; $fonctions = $filtres = array(); } else { $lacible = '\$GLOBALS[\'clean_link\']'; } $code = '"<"."?php include_local(\'inc-login.php3\'); \$cible = ' . $lacible . '; login (\$cible, false); ?".">"'; break; case 'URL_LOGOUT': if ($fonctions) { $url = "&url=".$fonctions[0]; $fonctions = array(); } else { $url = '&url=\'.urlencode(\$clean_link->getUrl()).\''; } $code = '"<"."?php if (\$GLOBALS[\'auteur_session\'][\'login\']) { echo \'spip_cookie.php3?logout_public=\'.\$GLOBALS[\'auteur_session\'][\'login\'].\'' . $url . '\'; } ?".">"'; break; // // Boutons d'administration // case 'FORMULAIRE_ADMIN': $code = '"<"."?php \$GLOBALS[\"flag_boutons_admin\"] = true; if (\$GLOBALS[\"HTTP_COOKIE_VARS\"][\"spip_admin\"]) { include_local(\'inc-admin.php3\'); afficher_boutons_admin();} ?".">"'; break; default: // pour debugger les squelettes $code = '""'; break; } // switch } return (array(applique_filtres($fonctions, $code),$milieu)); } ?>