From 9b90f1b8a15bcd9e1e25fe9a37e5bad516b248b2 Mon Sep 17 00:00:00 2001 From: Cerdic <cedric@yterium.com> Date: Sun, 13 Dec 2015 11:16:30 +0000 Subject: [PATCH] Indentation et regles de codage selon http://www.spip.net/fr_article3497.html#regles_codage --- ecrire/action/activer_plugins.php | 58 +- ecrire/action/ajouter_lien.php | 20 +- ecrire/action/annuler_job.php | 15 +- ecrire/action/auth.php | 15 +- ecrire/action/calculer_taille_cache.php | 62 +- ecrire/action/confirmer_email.php | 26 +- ecrire/action/confirmer_inscription.php | 47 +- ecrire/action/converser.php | 51 +- ecrire/action/cookie.php | 78 +- ecrire/action/debloquer_edition.php | 18 +- ecrire/action/desinstaller_plugin.php | 35 +- ecrire/action/editer_article.php | 205 +- ecrire/action/editer_auteur.php | 192 +- ecrire/action/editer_liens.php | 458 +- ecrire/action/editer_logo.php | 82 +- ecrire/action/editer_objet.php | 225 +- ecrire/action/editer_rubrique.php | 102 +- ecrire/action/etre_webmestre.php | 22 +- ecrire/action/forcer_job.php | 13 +- ecrire/action/inscrire_auteur.php | 163 +- ecrire/action/instituer_langue_objet.php | 23 +- ecrire/action/instituer_langue_rubrique.php | 30 +- ecrire/action/instituer_objet.php | 22 +- ecrire/action/logout.php | 78 +- ecrire/action/menu_rubriques.php | 108 +- ecrire/action/preferer.php | 75 +- ecrire/action/purger.php | 27 +- ecrire/action/purger_queue.php | 13 +- ecrire/action/redirect.php | 52 +- ecrire/action/referencer_traduction.php | 42 +- ecrire/action/session.php | 19 +- ecrire/action/super_cron.php | 16 +- ecrire/action/supprimer_lien.php | 18 +- ecrire/action/supprimer_rubrique.php | 26 +- ecrire/action/tester.php | 162 +- ecrire/action/tester_taille.php | 51 +- ecrire/auth/ldap.php | 191 +- ecrire/auth/sha256.inc.php | 922 +- ecrire/auth/spip.php | 239 +- ecrire/balise/configurer_metas.php | 31 +- ecrire/balise/formulaire_.php | 192 +- ecrire/balise/formulaire_admin.php | 136 +- ecrire/balise/formulaire_ecrire_auteur.php | 45 +- ecrire/balise/formulaire_inscription.php | 17 +- ecrire/balise/info_.php | 21 +- ecrire/balise/login_prive.php | 39 +- ecrire/balise/login_public.php | 36 +- ecrire/balise/logo_.php | 99 +- ecrire/balise/menu_lang.php | 32 +- ecrire/balise/menu_lang_ecrire.php | 57 +- ecrire/balise/url_.php | 155 +- ecrire/balise/url_logout.php | 26 +- ecrire/base/abstract_sql.php | 1420 +- ecrire/base/auxiliaires.php | 6 +- ecrire/base/connect_sql.php | 317 +- ecrire/base/create.php | 82 +- ecrire/base/delete_all.php | 25 +- ecrire/base/dump.php | 440 +- ecrire/base/objets.php | 858 +- ecrire/base/repair.php | 97 +- ecrire/base/serial.php | 6 +- ecrire/base/trouver_table.php | 92 +- ecrire/base/upgrade.php | 273 +- ecrire/charsets/cp1250.php | 170 +- ecrire/charsets/cp1251.php | 158 +- ecrire/charsets/cp1256.php | 159 +- ecrire/charsets/html.php | 147 +- ecrire/charsets/iso-8859-1.php | 149 +- ecrire/charsets/iso-8859-15.php | 24 +- ecrire/charsets/iso-8859-6.php | 75 +- ecrire/charsets/iso-8859-9.php | 20 +- ecrire/charsets/mathml.php | 3372 ++--- ecrire/charsets/translit.php | 437 +- ecrire/charsets/translitcomplexe.php | 174 +- ecrire/exec/403.php | 38 +- ecrire/exec/404.php | 25 +- ecrire/exec/admin_plugin.php | 187 +- ecrire/exec/base_delete_all.php | 29 +- ecrire/exec/base_repair.php | 23 +- ecrire/exec/demande_mise_a_jour.php | 21 +- ecrire/exec/fond.php | 40 +- ecrire/exec/fond_monobloc.php | 151 +- ecrire/exec/info_plugin.php | 25 +- ecrire/exec/informer.php | 23 +- ecrire/exec/install.php | 19 +- ecrire/exec/plonger.php | 25 +- ecrire/exec/puce_statut.php | 37 +- ecrire/exec/rechercher.php | 83 +- ecrire/exec/selectionner.php | 24 +- ecrire/exec/upgrade.php | 61 +- ecrire/exec/valider_xml.php | 261 +- ecrire/genie/mail.php | 31 +- ecrire/genie/maintenance.php | 41 +- ecrire/genie/mise_a_jour.php | 80 +- ecrire/genie/optimiser.php | 88 +- ecrire/inc/acces.php | 179 +- ecrire/inc/actions.php | 50 +- ecrire/inc/admin.php | 139 +- ecrire/inc/aider.php | 176 +- ecrire/inc/auth.php | 368 +- ecrire/inc/autoriser.php | 1200 +- ecrire/inc/bandeau.php | 129 +- ecrire/inc/boutons.php | 86 +- ecrire/inc/charger_php_extension.php | 22 +- ecrire/inc/charsets.php | 749 +- ecrire/inc/chercher_logo.php | 21 +- ecrire/inc/chercher_rubrique.php | 193 +- ecrire/inc/commencer_page.php | 62 +- ecrire/inc/config.php | 327 +- ecrire/inc/cookie.php | 83 +- ecrire/inc/couleurs.php | 129 +- ecrire/inc/csv.php | 106 +- ecrire/inc/cvt_autosave.php | 61 +- ecrire/inc/cvt_configurer.php | 215 +- ecrire/inc/cvt_multietapes.php | 145 +- ecrire/inc/distant.php | 535 +- ecrire/inc/documents.php | 139 +- ecrire/inc/drapeau_edition.php | 122 +- ecrire/inc/editer.php | 404 +- ecrire/inc/envoyer_mail.php | 89 +- ecrire/inc/exporter_csv.php | 45 +- ecrire/inc/filtres.php | 2950 ++-- ecrire/inc/filtres_boites.php | 73 +- ecrire/inc/filtres_ecrire.php | 348 +- ecrire/inc/filtres_images_lib_mini.php | 883 +- ecrire/inc/filtres_images_mini.php | 211 +- ecrire/inc/filtres_mime.php | 101 +- ecrire/inc/filtres_mini.php | 134 +- ecrire/inc/filtres_selecteur_generique.php | 92 +- ecrire/inc/flock.php | 359 +- ecrire/inc/genie.php | 85 +- ecrire/inc/headers.php | 160 +- ecrire/inc/icone_renommer.php | 53 +- ecrire/inc/iconifier.php | 15 +- ecrire/inc/importer_csv.php | 54 +- ecrire/inc/informer.php | 47 +- ecrire/inc/install.php | 492 +- ecrire/inc/invalideur.php | 150 +- ecrire/inc/journal.php | 12 +- ecrire/inc/json.php | 26 +- ecrire/inc/lang.php | 218 +- ecrire/inc/lang_liste.php | 11 +- ecrire/inc/layer.php | 156 +- ecrire/inc/lien.php | 301 +- ecrire/inc/lien_court.php | 8 +- ecrire/inc/lister_objets.php | 34 +- ecrire/inc/log.php | 80 +- ecrire/inc/mail.php | 10 +- ecrire/inc/math.php | 52 +- ecrire/inc/meta.php | 148 +- ecrire/inc/minipres.php | 120 +- ecrire/inc/modifier.php | 117 +- ecrire/inc/nfslock.php | 114 +- ecrire/inc/notifications.php | 89 +- ecrire/inc/pclzip.php | 11125 ++++++++-------- ecrire/inc/pipelines.php | 158 +- ecrire/inc/pipelines_ecrire.php | 213 +- ecrire/inc/plonger.php | 88 +- ecrire/inc/plugin.php | 787 +- ecrire/inc/precharger_article.php | 17 +- ecrire/inc/precharger_objet.php | 64 +- ecrire/inc/prepare_recherche.php | 116 +- .../preselectionner_parent_nouvel_objet.php | 30 +- ecrire/inc/presentation.php | 211 +- ecrire/inc/presentation_mini.php | 157 +- ecrire/inc/presenter_enfants.php | 183 +- ecrire/inc/puce_statut.php | 187 +- ecrire/inc/queue.php | 435 +- ecrire/inc/recherche_to_array.php | 178 +- ecrire/inc/rechercher.php | 149 +- ecrire/inc/roles.php | 107 +- ecrire/inc/rubriques.php | 400 +- ecrire/inc/securiser_action.php | 116 +- ecrire/inc/selectionner.php | 99 +- ecrire/inc/session.php | 274 +- ecrire/inc/simplexml_to_array.php | 50 +- ecrire/inc/surligne.php | 48 +- ecrire/inc/texte.php | 136 +- ecrire/inc/texte_mini.php | 317 +- ecrire/inc/traduire.php | 138 +- ecrire/inc/urls.php | 169 +- ecrire/inc/utils.php | 1774 ++- ecrire/inc/xml.php | 232 +- ecrire/inc_version.php | 150 +- ecrire/index.php | 80 +- ecrire/install/etape_.php | 22 +- ecrire/install/etape_1.php | 37 +- ecrire/install/etape_2.php | 162 +- ecrire/install/etape_3.php | 355 +- ecrire/install/etape_3b.php | 87 +- ecrire/install/etape_4.php | 34 +- ecrire/install/etape_chmod.php | 126 +- ecrire/install/etape_fin.php | 49 +- ecrire/install/etape_ldap1.php | 94 +- ecrire/install/etape_ldap2.php | 62 +- ecrire/install/etape_ldap3.php | 34 +- ecrire/install/etape_ldap4.php | 94 +- ecrire/install/etape_ldap5.php | 63 +- ecrire/iterateur/condition.php | 13 +- ecrire/iterateur/data.php | 456 +- ecrire/iterateur/php.php | 12 +- ecrire/iterateur/pour.php | 9 +- ecrire/iterateur/sql.php | 71 +- ecrire/maj/svn10000.php | 486 +- ecrire/maj/v009.php | 69 +- ecrire/maj/v010.php | 31 +- ecrire/maj/v011.php | 19 +- ecrire/maj/v012.php | 27 +- ecrire/maj/v013.php | 29 +- ecrire/maj/v014.php | 117 +- ecrire/maj/v015.php | 17 +- ecrire/maj/v016.php | 27 +- ecrire/maj/v017.php | 66 +- ecrire/maj/v018.php | 42 +- ecrire/maj/v019.php | 562 +- ecrire/maj/v019_pre193.php | 168 +- ecrire/notifications/instituerarticle.php | 30 +- ecrire/oo/index.php | 7 +- ecrire/plugins/afficher_liste.php | 78 +- ecrire/plugins/afficher_nom_plugin.php | 40 +- ecrire/plugins/afficher_plugin.php | 243 +- ecrire/plugins/afficher_repertoires.php | 72 +- ecrire/plugins/extraire_boutons.php | 33 +- ecrire/plugins/extraire_pipelines.php | 31 +- ecrire/plugins/get_infos.php | 67 +- ecrire/plugins/infos_paquet.php | 129 +- ecrire/plugins/infos_plugin.php | 142 +- ecrire/plugins/installer.php | 173 +- ecrire/plugins/verifie_conformite.php | 199 +- ecrire/prive.php | 12 +- ecrire/public.php | 130 +- ecrire/public/admin.php | 29 +- ecrire/public/aiguiller.php | 192 +- ecrire/public/assembler.php | 383 +- ecrire/public/balises.php | 985 +- ecrire/public/boucles.php | 48 +- ecrire/public/cacher.php | 195 +- ecrire/public/compiler.php | 1249 +- ecrire/public/composer.php | 706 +- ecrire/public/criteres.php | 1634 ++- ecrire/public/debusquer.php | 431 +- ecrire/public/decompiler.php | 212 +- ecrire/public/evaluer_page.php | 23 +- ecrire/public/format_html.php | 114 +- ecrire/public/interfaces.php | 547 +- ecrire/public/iterateur.php | 252 +- ecrire/public/jointures.php | 280 +- ecrire/public/normaliser.php | 181 +- ecrire/public/parametrer.php | 152 +- ecrire/public/quete.php | 323 +- ecrire/public/references.php | 376 +- ecrire/public/sandbox.php | 75 +- ecrire/public/styliser.php | 91 +- ecrire/public/styliser_par_z.php | 300 +- ecrire/public/tracer.php | 103 +- ecrire/req/mysql.php | 1146 +- ecrire/req/pg.exp.php | 1224 +- ecrire/req/sqlite2.php | 18 +- ecrire/req/sqlite3.php | 16 +- ecrire/req/sqlite_fonctions.php | 283 +- ecrire/req/sqlite_generique.php | 1693 ++- ecrire/typographie/en.php | 5 +- ecrire/typographie/fr.php | 37 +- ecrire/urls/page.php | 54 +- ecrire/xml/analyser_dtd.php | 305 +- ecrire/xml/indenter.php | 19 +- ecrire/xml/interfaces.php | 33 +- ecrire/xml/sax.php | 237 +- ecrire/xml/valider.php | 250 +- 269 files changed, 36902 insertions(+), 28490 deletions(-) diff --git a/ecrire/action/activer_plugins.php b/ecrire/action/activer_plugins.php index 4674f8016a..cb626ae12c 100644 --- a/ecrire/action/activer_plugins.php +++ b/ecrire/action/activer_plugins.php @@ -14,51 +14,60 @@ * Gestion de l'action activer_plugins * * @package SPIP\Core\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mise à jour des données si envoi via formulaire - * - * @global array $GLOBALS['visiteur_session'] - * @global array $GLOBALS['meta'] + * + * @global array $GLOBALS ['visiteur_session'] + * @global array $GLOBALS ['meta'] * @return void */ -function enregistre_modif_plugin(){ +function enregistre_modif_plugin() { include_spip('inc/plugin'); - // recuperer les plugins dans l'ordre des $_POST + // recuperer les plugins dans l'ordre des $_POST $test = array(); - foreach(liste_plugin_files() as $file){ - $test['s'.substr(md5(_DIR_PLUGINS.$file),0,16)] = $file; + foreach (liste_plugin_files() as $file) { + $test['s' . substr(md5(_DIR_PLUGINS . $file), 0, 16)] = $file; } - if (defined('_DIR_PLUGINS_SUPPL')) - foreach(liste_plugin_files(_DIR_PLUGINS_SUPPL) as $file){ - $test['s'.substr(md5(_DIR_PLUGINS_SUPPL.$file),0,16)] = $file; + if (defined('_DIR_PLUGINS_SUPPL')) { + foreach (liste_plugin_files(_DIR_PLUGINS_SUPPL) as $file) { + $test['s' . substr(md5(_DIR_PLUGINS_SUPPL . $file), 0, 16)] = $file; } + } - $plugin=array(); + $plugin = array(); - foreach($_POST as $choix=>$val){ - if (isset($test[$choix])&&$val=='O') - $plugin[]=$test[$choix]; + foreach ($_POST as $choix => $val) { + if (isset($test[$choix]) && $val == 'O') { + $plugin[] = $test[$choix]; + } } - spip_log("Changement des plugins actifs par l'auteur " . $GLOBALS['visiteur_session']['id_auteur'] . ": " . join(',', $plugin)); + spip_log("Changement des plugins actifs par l'auteur " . $GLOBALS['visiteur_session']['id_auteur'] . ": " . join(',', + $plugin)); ecrire_plugin_actifs($plugin); // Chaque fois que l'on valide des plugins, on memorise la liste de ces plugins comme etant "interessants", avec un score initial, qui sera decremente a chaque tour : ainsi un plugin active pourra reter visible a l'ecran, jusqu'a ce qu'il tombe dans l'oubli. $plugins_interessants = @unserialize($GLOBALS['meta']['plugins_interessants']); - if (!is_array($plugins_interessants)) + if (!is_array($plugins_interessants)) { $plugins_interessants = array(); + } $plugins_interessants2 = array(); - foreach($plugins_interessants as $plug => $score) - if ($score > 1) + foreach ($plugins_interessants as $plug => $score) { + if ($score > 1) { $plugins_interessants2[$plug] = $score-1; - foreach ($plugin as $plug) - $plugins_interessants2[$plug] = 10; // score initial + } + } + foreach ($plugin as $plug) { + $plugins_interessants2[$plug] = 10; + } // score initial ecrire_meta('plugins_interessants', serialize($plugins_interessants2)); } @@ -66,7 +75,7 @@ function enregistre_modif_plugin(){ * Fonction d'initialisation avant l'activation des plugins * * Vérifie les droits et met à jour les méta avant de lancer l'activation des plugins - * + * * @return void */ function action_activer_plugins_dist() { @@ -74,8 +83,9 @@ function action_activer_plugins_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); - if (!autoriser('configurer', '_plugins')) + if (!autoriser('configurer', '_plugins')) { die('erreur'); + } // forcer la maj des meta pour les cas de modif de numero de version base via phpmyadmin lire_metas(); enregistre_modif_plugin(); diff --git a/ecrire/action/ajouter_lien.php b/ecrire/action/ajouter_lien.php index adc6cf656a..dcd04ada23 100644 --- a/ecrire/action/ajouter_lien.php +++ b/ecrire/action/ajouter_lien.php @@ -14,9 +14,11 @@ * Gestion de l'action ajouter_lien * * @package SPIP\Core\Liens -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action pour lier 2 objets entre eux @@ -25,23 +27,23 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * tel que `mot-7-rubrique-3`. * * @uses objet_associer() - * + * * @param null|string $arg * Clé des arguments. En absence utilise l'argument * de l'action sécurisée. * @return void */ -function action_ajouter_lien_dist($arg = null){ - if (is_null($arg)){ - $securiser_action = charger_fonction('securiser_action','inc'); +function action_ajouter_lien_dist($arg = null) { + if (is_null($arg)) { + $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } - $arg = explode("-",$arg); - list($objet_source,$ids,$objet_lie,$idl) = $arg; + $arg = explode("-", $arg); + list($objet_source, $ids, $objet_lie, $idl) = $arg; include_spip('action/editer_liens'); - objet_associer(array($objet_source=>$ids), array($objet_lie=>$idl)); + objet_associer(array($objet_source => $ids), array($objet_lie => $idl)); } diff --git a/ecrire/action/annuler_job.php b/ecrire/action/annuler_job.php index 668977799b..7b94fdfb58 100644 --- a/ecrire/action/annuler_job.php +++ b/ecrire/action/annuler_job.php @@ -14,21 +14,24 @@ * Gestion de l'action annuler_job * * @package SPIP\Core\Job -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Annuler un travail + * * @return void */ -function action_annuler_job_dist(){ - $securiser_action = charger_fonction('securiser_action','inc'); +function action_annuler_job_dist() { + $securiser_action = charger_fonction('securiser_action', 'inc'); $id_job = $securiser_action(); if ($id_job = intval($id_job) - AND autoriser('annuler','job',$id_job) - ){ + AND autoriser('annuler', 'job', $id_job) + ) { job_queue_remove($id_job); } } diff --git a/ecrire/action/auth.php b/ecrire/action/auth.php index bad372ce02..f382ae45c2 100644 --- a/ecrire/action/auth.php +++ b/ecrire/action/auth.php @@ -14,30 +14,31 @@ * Gestion de l'action auth * * @package SPIP\Core\Authentification -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Retour d'authentification pour les SSO */ function action_auth_dist() { - + $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); if (!preg_match(",^(\w+)[/](.+)$,", $arg, $r)) { spip_log("action_auth_dist $arg pas compris"); - } - else { + } else { $auth_methode = $r[1]; $login = $r[2]; include_spip('inc/auth'); $res = auth_terminer_identifier_login($auth_methode, $login); - if (is_string($res)){ // Erreur + if (is_string($res)) { // Erreur $redirect = _request('redirect'); - $redirect = parametre_url($redirect,'var_erreur',$res,'&'); + $redirect = parametre_url($redirect, 'var_erreur', $res, '&'); include_spip('inc/headers'); redirige_par_entete($redirect); } diff --git a/ecrire/action/calculer_taille_cache.php b/ecrire/action/calculer_taille_cache.php index 72081ed61f..6f5e9575e0 100644 --- a/ecrire/action/calculer_taille_cache.php +++ b/ecrire/action/calculer_taille_cache.php @@ -14,9 +14,10 @@ * Gestion de l'action calculer_taille_cache * * @package SPIP\Core\Cache -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; - + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -24,48 +25,44 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * * Si l'argument reçu est 'images', c'est la taille du cache _DIR_VAR qui est calculé, * sinon celle du cache des squelettes (approximation) - * + * * @param string|null $arg * Argument attendu. En absence utilise l'argument * de l'action sécurisée. */ -function action_calculer_taille_cache_dist($arg = null){ - if (is_null($arg)){ +function action_calculer_taille_cache_dist($arg = null) { + if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } include_spip('inc/filtres'); - if ($arg=='images'){ + if ($arg == 'images') { $taille = calculer_taille_dossier(_DIR_VAR); $res = _T('ecrire:taille_cache_image', - array( - 'dir' => joli_repertoire(_DIR_VAR), - 'taille' => "<b>".(taille_en_octets($taille) > 0 ? taille_en_octets($taille) : "0 octet")."</b>" + array( + 'dir' => joli_repertoire(_DIR_VAR), + 'taille' => "<b>" . (taille_en_octets($taille) > 0 ? taille_en_octets($taille) : "0 octet") . "</b>" ) ); - } - else { + } else { include_spip('inc/invalideur'); $taille = calculer_taille_dossier(_DIR_CACHE_XML) - +calculer_taille_dossier(_DIR_CACHE.'skel/') - +calculer_taille_dossier(_DIR_CACHE.'wheels/') - +calculer_taille_dossier(_DIR_CACHE.'contextes/') - ; + +calculer_taille_dossier(_DIR_CACHE . 'skel/') + +calculer_taille_dossier(_DIR_CACHE . 'wheels/') + +calculer_taille_dossier(_DIR_CACHE . 'contextes/'); $taille += intval(taille_du_cache()); - if ($taille<=150000){ + if ($taille <= 150000) { $res = _T('taille_cache_vide'); - } - elseif ($taille<=1024*1024){ - $res = _T('taille_cache_moins_de',array('octets'=>taille_en_octets(1024*1024))); - } - else { - $res = _T('taille_cache_octets',array('octets'=>taille_en_octets($taille))); + } elseif ($taille <= 1024*1024) { + $res = _T('taille_cache_moins_de', array('octets' => taille_en_octets(1024*1024))); + } else { + $res = _T('taille_cache_octets', array('octets' => taille_en_octets($taille))); } $res = "<b>$res</b>"; } - + $res = "<p>$res</p>"; ajax_retour($res); } @@ -77,20 +74,27 @@ function action_calculer_taille_cache_dist($arg = null){ * @param string $dir Répertoire dont on souhaite évaluer la taille * @return int Taille en octets */ -function calculer_taille_dossier ($dir) { +function calculer_taille_dossier($dir) { $handle = @opendir($dir); - if (!$handle) return 0; + if (!$handle) { + return 0; + } $taille = 0; while (($fichier = @readdir($handle)) !== false) { // Eviter ".", "..", ".htaccess", etc. - if ($fichier[0] == '.') continue; + if ($fichier[0] == '.') { + continue; + } if (is_file($d = "$dir/$fichier")) { $taille += filesize($d); + } else { + if (is_dir($d)) { + $taille += calculer_taille_dossier($d); + } } - else if (is_dir($d)) - $taille += calculer_taille_dossier($d); } closedir($handle); + return $taille; } diff --git a/ecrire/action/confirmer_email.php b/ecrire/action/confirmer_email.php index 764b3ac69e..50db4f60c2 100644 --- a/ecrire/action/confirmer_email.php +++ b/ecrire/action/confirmer_email.php @@ -12,33 +12,37 @@ /** * Gestion de l'action confirmer_email - * + * * @package SPIP\Core\Inscription */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Confirmer un changement d'email - * - * @global array $GLOBALS['visiteur_session'] - * @global string $GLOBALS['redirect'] + * + * @global array $GLOBALS ['visiteur_session'] + * @global string $GLOBALS ['redirect'] * @return void */ -function action_confirmer_email_dist() -{ +function action_confirmer_email_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); include_spip('inc/filtres'); - if ($GLOBALS['visiteur_session']['id_auteur'] AND email_valide($arg)){ + if ($GLOBALS['visiteur_session']['id_auteur'] AND email_valide($arg)) { include_spip('action/editer_auteur'); - auteur_modifier($GLOBALS['visiteur_session']['id_auteur'],array('email'=>$arg)); + auteur_modifier($GLOBALS['visiteur_session']['id_auteur'], array('email' => $arg)); } // verifier avant de rediriger pour invalider le message de confirmation // si ca n'a pas marche - if ($redirect = _request('redirect') AND !$arg == sql_getfetsel('email', 'spip_auteurs', 'id_auteur='.intval($GLOBALS['visiteur_session']))) - $GLOBALS['redirect'] = parametre_url($redirect, 'email_modif',''); + if ($redirect = _request('redirect') AND !$arg == sql_getfetsel('email', 'spip_auteurs', + 'id_auteur=' . intval($GLOBALS['visiteur_session'])) + ) { + $GLOBALS['redirect'] = parametre_url($redirect, 'email_modif', ''); + } } diff --git a/ecrire/action/confirmer_inscription.php b/ecrire/action/confirmer_inscription.php index 4864cf42d8..e6cb578867 100644 --- a/ecrire/action/confirmer_inscription.php +++ b/ecrire/action/confirmer_inscription.php @@ -12,17 +12,19 @@ /** * Gestion de l'action confirmer_inscription - * + * * @package SPIP\Core\Inscription */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action de confirmation d'une inscription - * - * @global array $GLOBALS['visiteur_session'] - * @global string $GLOBALS['redirect'] + * + * @global array $GLOBALS ['visiteur_session'] + * @global string $GLOBALS ['redirect'] * @return void */ function action_confirmer_inscription_dist() { @@ -31,8 +33,9 @@ function action_confirmer_inscription_dist() { include_spip('action/inscrire_auteur'); if ($auteur = auteur_verifier_jeton($jeton) - AND $auteur['email']==$email - AND $auteur['statut']=='nouveau'){ + AND $auteur['email'] == $email + AND $auteur['statut'] == 'nouveau' + ) { // OK c'est un nouvel inscrit qui confirme : // on le loge => ca va confirmer son statut et c'est plus sympa @@ -44,30 +47,30 @@ function action_confirmer_inscription_dist() { // si pas de redirection demandee, rediriger vers public ou prive selon le statut de l'auteur // TODO: ne semble pas marcher si inscrit non visiteur, a debug - if (!_request('redirect')){ + if (!_request('redirect')) { // on passe id_auteur explicite pour forcer une lecture en base de toutes les infos - if (autoriser('ecrire','','',$auteur['id_auteur'])){ + if (autoriser('ecrire', '', '', $auteur['id_auteur'])) { // poser un cookie admin aussi - $cookie = charger_fonction('cookie','action'); - $cookie("@".$GLOBALS['visiteur_session']['login']); + $cookie = charger_fonction('cookie', 'action'); + $cookie("@" . $GLOBALS['visiteur_session']['login']); $GLOBALS['redirect'] = _DIR_RESTREINT_ABS; - } - else + } else { $GLOBALS['redirect'] = $GLOBALS['meta']['adresse_site']; + } } - } - else { + } else { // lien perime : - if ($GLOBALS['visiteur_session']['id_auteur']){ + if ($GLOBALS['visiteur_session']['id_auteur']) { // on passe id_auteur explicite pour forcer une lecture en base de toutes les infos - if (autoriser('ecrire','','',$GLOBALS['visiteur_session']['id_auteur'])) + if (autoriser('ecrire', '', '', $GLOBALS['visiteur_session']['id_auteur'])) { $GLOBALS['redirect'] = _DIR_RESTREINT_ABS; - else + } else { $GLOBALS['redirect'] = $GLOBALS['meta']['adresse_site']; + } + } else // rediriger vers la page de login si pas encore loge + { + $GLOBALS['redirect'] = parametre_url(generer_url_public('login', '', false), 'url', _request('redirect')); } - else - // rediriger vers la page de login si pas encore loge - $GLOBALS['redirect'] = parametre_url(generer_url_public('login','',false),'url',_request('redirect')); } } diff --git a/ecrire/action/converser.php b/ecrire/action/converser.php index fe97cabede..02e22e807a 100644 --- a/ecrire/action/converser.php +++ b/ecrire/action/converser.php @@ -14,23 +14,24 @@ * Gestion de l'action converser qui permet changer de langue * * @package SPIP\Core\Langue -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/cookie'); /** * Point d'entrée pour changer de langue - * + * * Pas de secu si espace public ou login ou installation * mais alors on n'accède pas à la base, on pose seulement le cookie. * * @return void */ -function action_converser_dist() -{ +function action_converser_dist() { $update_session = false; - if ( _request('arg') AND spip_connect()) { + if (_request('arg') AND spip_connect()) { $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); $update_session = true; @@ -39,23 +40,25 @@ function action_converser_dist() $lang = action_converser_changer_langue($update_session); $redirect = rawurldecode(_request('redirect')); - if (!$redirect) $redirect = _DIR_RESTREINT_ABS; - $redirect = parametre_url($redirect,'lang',$lang,'&'); + if (!$redirect) { + $redirect = _DIR_RESTREINT_ABS; + } + $redirect = parametre_url($redirect, 'lang', $lang, '&'); redirige_par_entete($redirect, true); } /** * Cette fonction prépare le travail de changement de langue * en récupérant la bonne variable de langue - * - * @global array $GLOBALS['visiteur_session'] - * @param bool $update_session + * + * @global array $GLOBALS ['visiteur_session'] + * @param bool $update_session * @return string */ -function action_converser_changer_langue($update_session){ - if ($lang = _request('var_lang')) +function action_converser_changer_langue($update_session) { + if ($lang = _request('var_lang')) { action_converser_post($lang); - elseif ($lang = _request('var_lang_ecrire')) { + } elseif ($lang = _request('var_lang_ecrire')) { if ($update_session) { sql_updateq("spip_auteurs", array("lang" => $lang), "id_auteur = " . $GLOBALS['visiteur_session']['id_auteur']); $GLOBALS['visiteur_session']['lang'] = $lang; @@ -64,31 +67,33 @@ function action_converser_changer_langue($update_session){ spip_setcookie( 'spip_session', $spip_session, - time() + 3600 * 24 * 14 + time()+3600*24*14 ); } } action_converser_post($lang, 'spip_lang_ecrire'); } + return $lang; } /** * Cette fonction effectue le travail de changement de langue - * - * @param string $lang - * @param bool $ecrire + * + * @param string $lang + * @param bool $ecrire * @return void */ -function action_converser_post($lang, $ecrire = false) -{ +function action_converser_post($lang, $ecrire = false) { if ($lang) { include_spip('inc/lang'); if (changer_langue($lang)) { - spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, time() + 365 * 24 * 3600); - if ($ecrire) - spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, time() + 365 * 24 * 3600); + spip_setcookie('spip_lang', $_COOKIE['spip_lang'] = $lang, time()+365*24*3600); + if ($ecrire) { + spip_setcookie('spip_lang_ecrire', $_COOKIE['spip_lang_ecrire'] = $lang, time()+365*24*3600); + } } } } + ?> diff --git a/ecrire/action/cookie.php b/ecrire/action/cookie.php index a28864c793..2646ce8e3a 100644 --- a/ecrire/action/cookie.php +++ b/ecrire/action/cookie.php @@ -12,11 +12,13 @@ /** * Gestion de l'action cookie - * + * * @package SPIP\Core\Inscription */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); include_spip('inc/cookie'); @@ -24,17 +26,17 @@ include_spip('inc/cookie'); /** * Cette fonction traite les cookies posés au moment de l'authentification standard * ou vérifie que l'authentification HTTP est correcte - * + * * @global bool ignore_auth_http - * @param string|null $set_cookie_admin - * @param string|null $change_session + * @param string|null $set_cookie_admin + * @param string|null $change_session * @return void */ function action_cookie_dist($set_cookie_admin = null, $change_session = null) { $redirect_echec = $redirect = null; $test_echec_cookie = null; $url = ""; - if (is_null($set_cookie_admin)){ + if (is_null($set_cookie_admin)) { $set_cookie_admin = _request('cookie_admin'); $change_session = _request('change_session'); $test_echec_cookie = _request('test_echec_cookie'); @@ -44,10 +46,11 @@ function action_cookie_dist($set_cookie_admin = null, $change_session = null) { $redirect = $url ? $url : generer_url_ecrire('accueil'); $redirect_echec = _request('url_echec'); if (!isset($redirect_echec)) { - if (strpos($redirect,_DIR_RESTREINT_ABS)!==false) - $redirect_echec = generer_url_public('login','',true); - else + if (strpos($redirect, _DIR_RESTREINT_ABS) !== false) { + $redirect_echec = generer_url_public('login', '', true); + } else { $redirect_echec = $redirect; + } } } @@ -65,49 +68,52 @@ function action_cookie_dist($set_cookie_admin = null, $change_session = null) { if (_request('essai_auth_http') AND !$GLOBALS['ignore_auth_http']) { include_spip('inc/auth'); if (@$_SERVER['PHP_AUTH_USER'] - AND @$_SERVER['PHP_AUTH_PW'] - AND $auteur = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])){ + AND @$_SERVER['PHP_AUTH_PW'] + AND $auteur = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) + ) { auth_loger($auteur); - redirige_par_entete(parametre_url($redirect,'t',time(),'&')); - } - else { + redirige_par_entete(parametre_url($redirect, 't', time(), '&')); + } else { ask_php_auth(_T('info_connexion_refusee'), - _T('login_login_pass_incorrect'), - _T('login_retour_site'), - "url=".rawurlencode($redirect), - _T('login_nouvelle_tentative'), - (strpos($url,_DIR_RESTREINT_ABS)!==false)); + _T('login_login_pass_incorrect'), + _T('login_retour_site'), + "url=" . rawurlencode($redirect), + _T('login_nouvelle_tentative'), + (strpos($url, _DIR_RESTREINT_ABS) !== false)); } - } - else { - + } else { + // en cas de login sur bonjour=oui, on tente de poser un cookie // puis de passer au login qui diagnostiquera l'echec de cookie // le cas echeant. if ($test_echec_cookie == 'oui') { spip_setcookie('spip_session', 'test_echec_cookie'); - if ($redirect) - $redirect = parametre_url(parametre_url($redirect_echec,'var_echec_cookie','oui','&'),'url',rawurlencode($redirect),'&'); - } - else { + if ($redirect) { + $redirect = parametre_url(parametre_url($redirect_echec, 'var_echec_cookie', 'oui', '&'), 'url', + rawurlencode($redirect), '&'); + } + } else { $cook = isset($_COOKIE['spip_admin']) ? $_COOKIE['spip_admin'] : ''; // Suppression cookie d'admin ? if ($set_cookie_admin == "non") { - if ($cook) - spip_setcookie('spip_admin', $cook, time() - 3600 * 24); - } - // Ajout de cookie d'admin - else if ($set_cookie_admin) { - spip_setcookie('spip_admin', $set_cookie_admin, - time() + 14 * 24 * 3600); + if ($cook) { + spip_setcookie('spip_admin', $cook, time()-3600*24); + } + } // Ajout de cookie d'admin + else { + if ($set_cookie_admin) { + spip_setcookie('spip_admin', $set_cookie_admin, + time()+14*24*3600); + } } } } - + // Redirection finale - if ($redirect) + if ($redirect) { redirige_par_entete($redirect, true); + } } ?> diff --git a/ecrire/action/debloquer_edition.php b/ecrire/action/debloquer_edition.php index 7a0b995771..997b384664 100644 --- a/ecrire/action/debloquer_edition.php +++ b/ecrire/action/debloquer_edition.php @@ -12,18 +12,20 @@ /** * Gestion de l'action debloquer_edition - * + * * @package SPIP\Core\Edition */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Lever les blocages d'édition pour l'utilisateur courant * * @uses debloquer_tous() * @uses debloquer_edition() - * + * * @global array visiteur_session * @return void */ @@ -36,12 +38,12 @@ function action_debloquer_edition_dist() { include_spip('inc/drapeau_edition'); if ($arg == 'tous') { debloquer_tous($GLOBALS['visiteur_session']['id_auteur']); - } - else { - $arg = explode("-",$arg); - list($objet,$id_objet) = $arg; + } else { + $arg = explode("-", $arg); + list($objet, $id_objet) = $arg; debloquer_edition($GLOBALS['visiteur_session']['id_auteur'], $id_objet, $objet); } } } + ?> diff --git a/ecrire/action/desinstaller_plugin.php b/ecrire/action/desinstaller_plugin.php index f4454f43be..37bb2703e9 100644 --- a/ecrire/action/desinstaller_plugin.php +++ b/ecrire/action/desinstaller_plugin.php @@ -12,19 +12,21 @@ /** * Gestion de l'action desinstaller_plugin - * + * * @package SPIP\Core\Plugins */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action de désinstallation d'un plugin * * L'argument attendu est le préfixe du plugin à désinstaller. - * + * * @uses plugins_installer_dist() - * + * * @global array visiteur_session * @return void */ @@ -32,23 +34,28 @@ function action_desinstaller_plugin_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); - list($dir_plugins,$plugin) = explode("::",$arg); + list($dir_plugins, $plugin) = explode("::", $arg); $dir_type = "_DIR_PLUGINS"; - if (defined('_DIR_PLUGINS_SUPPL') AND $dir_plugins==_DIR_PLUGINS_SUPPL) + if (defined('_DIR_PLUGINS_SUPPL') AND $dir_plugins == _DIR_PLUGINS_SUPPL) { $dir_type = "_DIR_PLUGINS_SUPPL"; + } $installer_plugins = charger_fonction('installer', 'plugins'); - $infos = $installer_plugins($plugin, 'uninstall',$dir_type); + $infos = $installer_plugins($plugin, 'uninstall', $dir_type); if ($infos AND !$infos['install_test'][0]) { include_spip('inc/plugin'); - ecrire_plugin_actifs(array($plugin),false,'enleve'); + ecrire_plugin_actifs(array($plugin), false, 'enleve'); $erreur = ''; - } else $erreur = 'erreur_plugin_desinstalation_echouee'; - if ($redirect = _request('redirect')){ + } else { + $erreur = 'erreur_plugin_desinstalation_echouee'; + } + if ($redirect = _request('redirect')) { include_spip('inc/headers'); - if ($erreur) - $redirect = parametre_url($redirect, 'erreur',$erreur); - $redirect = str_replace('&','&',$redirect); + if ($erreur) { + $redirect = parametre_url($redirect, 'erreur', $erreur); + } + $redirect = str_replace('&', '&', $redirect); redirige_par_entete($redirect); } } + ?> diff --git a/ecrire/action/editer_article.php b/ecrire/action/editer_article.php index a26fe0881b..a7f84fb2fa 100644 --- a/ecrire/action/editer_article.php +++ b/ecrire/action/editer_article.php @@ -12,11 +12,13 @@ /** * Gestion de l'action editer_article et de l'API d'édition d'un article - * + * * @package SPIP\Core\Articles\Edition */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action d'édition d'un article dans la base de données dont @@ -26,11 +28,11 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Si aucun identifiant n'est donné, on crée alors un nouvel article, * à condition que la rubrique parente (id_rubrique) puisse être obtenue * (avec _request()) - * + * * @link http://code.spip.net/@action_editer_article_dist * @uses article_inserer() * @uses article_modifier() - * + * * @param null|int $arg * Identifiant de l'article. En absence utilise l'argument * de l'action sécurisée. @@ -39,8 +41,8 @@ if (!defined('_ECRIRE_INC_VERSION')) return; */ function action_editer_article_dist($arg = null) { include_spip('inc/autoriser'); - $err=""; - if (is_null($arg)){ + $err = ""; + if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } @@ -49,28 +51,32 @@ function action_editer_article_dist($arg = null) { // mais on verifie qu'on a toutes les donnees qu'il faut. if (!$id_article = intval($arg)) { $id_parent = _request('id_parent'); - if (!$id_parent) + if (!$id_parent) { $err = _L("creation interdite d'un article sans rubrique"); - elseif(!autoriser('creerarticledans','rubrique',$id_parent)) + } elseif (!autoriser('creerarticledans', 'rubrique', $id_parent)) { $err = _T("info_creerdansrubrique_non_autorise"); - else + } else { $id_article = article_inserer($id_parent); + } } // Enregistre l'envoi dans la BD - if ($id_article > 0) $err = article_modifier($id_article); + if ($id_article > 0) { + $err = article_modifier($id_article); + } - if ($err) - spip_log("echec editeur article: $err",_LOG_ERREUR); + if ($err) { + spip_log("echec editeur article: $err", _LOG_ERREUR); + } - return array($id_article,$err); + return array($id_article, $err); } /** * Modifier un article - * + * * Appelle toutes les fonctions de modification d'un article - * + * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $set @@ -91,16 +97,16 @@ function article_modifier($id_article, $set = null) { include_spip('inc/modifier'); include_spip('inc/filtres'); $c = collecter_requests( - // white list - objet_info('article','champs_editables'), + // white list + objet_info('article', 'champs_editables'), // black list - array('date','statut','id_parent'), + array('date', 'statut', 'id_parent'), // donnees eventuellement fournies $set ); // Si l'article est publie, invalider les caches et demander sa reindexation - $t = sql_getfetsel("statut", "spip_articles", "id_article=".intval($id_article)); + $t = sql_getfetsel("statut", "spip_articles", "id_article=" . intval($id_article)); $invalideur = $indexation = false; if ($t == 'publie') { $invalideur = "id='article/$id_article'"; @@ -110,16 +116,18 @@ function article_modifier($id_article, $set = null) { if ($err = objet_modifier_champs('article', $id_article, array( 'data' => $set, - 'nonvide' => array('titre' => _T('info_nouvel_article')." "._T('info_numero_abbreviation').$id_article), + 'nonvide' => array('titre' => _T('info_nouvel_article') . " " . _T('info_numero_abbreviation') . $id_article), 'invalideur' => $invalideur, 'indexation' => $indexation, 'date_modif' => 'date_modif' // champ a mettre a date('Y-m-d H:i:s') s'il y a modif ), - $c)) + $c) + ) { return $err; + } // Modification de statut, changement de rubrique ? - $c = collecter_requests(array('date', 'statut', 'id_parent'),array(),$set); + $c = collecter_requests(array('date', 'statut', 'id_parent'), array(), $set); $err = article_instituer($id_article, $c); return $err; @@ -127,9 +135,9 @@ function article_modifier($id_article, $set = null) { /** * Insérer un nouvel article en base de données - * + * * En plus des données enregistrées par défaut, la fonction : - * + * * - retrouve un identifiant de rubrique pour stocker l'article (la * première rubrique racine) si l'identifiant de rubrique transmis est * nul. @@ -141,34 +149,36 @@ function article_modifier($id_article, $set = null) { * - crée une liaison automatiquement entre l'auteur connecté et l'article * créé, de sorte que la personne devient par défaut auteur de l'article * qu'elle crée. - * + * * @pipeline_appel pre_insertion * @pipeline_appel post_insertion * * @global array meta * @global array visiteur_session * @global string spip_lang - * + * * @param int $id_rubrique * Identifiant de la rubrique parente * @param array|null $set * @return int * Identifiant du nouvel article - * + * */ function article_inserer($id_rubrique, $set = null) { // Si id_rubrique vaut 0 ou n'est pas definie, creer l'article // dans la premiere rubrique racine if (!$id_rubrique = intval($id_rubrique)) { - $row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1"); + $row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0", '', '0+titre,titre', "1"); $id_rubrique = $row['id_rubrique']; - } else $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique"); + } else { + $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=$id_rubrique"); + } // eviter $id_secteur = NULL (erreur sqlite) si la requete precedente echoue // cas de id_rubrique = -1 par exemple avec plugin "pages" $id_secteur = isset($row['id_secteur']) ? $row['id_secteur'] : 0; - + $lang_rub = $row['lang']; $lang = ""; @@ -177,10 +187,12 @@ function article_inserer($id_rubrique, $set = null) { // dans les rubriques, on essaie avec la langue de l'auteur, // ou a defaut celle de la rubrique // Sinon c'est la langue de la rubrique qui est choisie + heritee - if (!empty($GLOBALS['meta']['multi_objets']) and in_array('spip_articles', explode(',', $GLOBALS['meta']['multi_objets']))) { + if (!empty($GLOBALS['meta']['multi_objets']) and in_array('spip_articles', + explode(',', $GLOBALS['meta']['multi_objets'])) + ) { lang_select($GLOBALS['visiteur_session']['lang']); if (in_array($GLOBALS['spip_lang'], - explode(',', $GLOBALS['meta']['langues_multilingue']))) { + explode(',', $GLOBALS['meta']['langues_multilingue']))) { $lang = $GLOBALS['spip_lang']; $choisie = 'oui'; } @@ -193,14 +205,16 @@ function article_inserer($id_rubrique, $set = null) { $champs = array( 'id_rubrique' => $id_rubrique, - 'id_secteur' => $id_secteur, - 'statut' => 'prepa', + 'id_secteur' => $id_secteur, + 'statut' => 'prepa', 'date' => date('Y-m-d H:i:s'), 'lang' => $lang, - 'langue_choisie' =>$choisie); + 'langue_choisie' => $choisie + ); - if ($set) + if ($set) { $champs = array_merge($champs, $set); + } // Envoyer aux plugins $champs = pipeline('pre_insertion', @@ -215,13 +229,13 @@ function article_inserer($id_rubrique, $set = null) { $id_article = sql_insertq("spip_articles", $champs); // controler si le serveur n'a pas renvoye une erreur - if ($id_article > 0){ - $id_auteur = ((is_null(_request('id_auteur')) AND isset($GLOBALS['visiteur_session']['id_auteur']))? + if ($id_article > 0) { + $id_auteur = ((is_null(_request('id_auteur')) AND isset($GLOBALS['visiteur_session']['id_auteur'])) ? $GLOBALS['visiteur_session']['id_auteur'] - :_request('id_auteur')); - if ($id_auteur){ + : _request('id_auteur')); + if ($id_auteur) { include_spip('action/editer_auteur'); - auteur_associer($id_auteur, array('article'=>$id_article)); + auteur_associer($id_auteur, array('article' => $id_article)); } } @@ -239,16 +253,16 @@ function article_inserer($id_rubrique, $set = null) { } -/** +/** * Modification des statuts d'un article * * Modifie la langue, la rubrique ou les statuts d'un article. - * - * @global array $GLOBALS['meta'] + * + * @global array $GLOBALS ['meta'] * * @pipeline_appel pre_edition * @pipeline_appel post_edition - * + * * @param int $id_article * Identifiant de l'article * @param array $c @@ -273,46 +287,53 @@ function article_instituer($id_article, $c, $calcul_rub = true) { $date_ancienne = $date = $row['date']; $champs = array(); - $d = isset($c['date'])?$c['date']:null; - $s = isset($c['statut'])?$c['statut']:$statut; + $d = isset($c['date']) ? $c['date'] : null; + $s = isset($c['statut']) ? $c['statut'] : $statut; // cf autorisations dans inc/instituer_article if ($s != $statut OR ($d AND $d != $date)) { - if (autoriser('publierdans', 'rubrique', $id_rubrique)) - $statut = $champs['statut'] = $s; - else if (autoriser('modifier', 'article', $id_article) AND $s != 'publie') + if (autoriser('publierdans', 'rubrique', $id_rubrique)) { $statut = $champs['statut'] = $s; - else - spip_log("editer_article $id_article refus " . join(' ', $c)); + } else { + if (autoriser('modifier', 'article', $id_article) AND $s != 'publie') { + $statut = $champs['statut'] = $s; + } else { + spip_log("editer_article $id_article refus " . join(' ', $c)); + } + } // En cas de publication, fixer la date a "maintenant" // sauf si $c commande autre chose // ou si l'article est deja date dans le futur // En cas de proposition d'un article (mais pas depublication), idem if ($champs['statut'] == 'publie' - OR ($champs['statut'] == 'prop' AND ($d OR !in_array($statut_ancien, array('publie', 'prop')))) + OR ($champs['statut'] == 'prop' AND ($d OR !in_array($statut_ancien, array('publie', 'prop')))) ) { - if ($d OR strtotime($d=$date)>time()) + if ($d OR strtotime($d = $date) > time()) { $champs['date'] = $date = $d; - else + } else { $champs['date'] = $date = date('Y-m-d H:i:s'); + } } } // Verifier que la rubrique demandee existe et est differente // de la rubrique actuelle if (isset($c['id_parent']) - AND $id_parent = $c['id_parent'] - AND $id_parent != $id_rubrique - AND (sql_fetsel('1', "spip_rubriques", "id_rubrique=".intval($id_parent)))) { + AND $id_parent = $c['id_parent'] + AND $id_parent != $id_rubrique + AND (sql_fetsel('1', "spip_rubriques", "id_rubrique=" . intval($id_parent))) + ) { $champs['id_rubrique'] = $id_parent; // si l'article etait publie // et que le demandeur n'est pas admin de la rubrique de destination // repasser l'article en statut 'propose'. if ($statut == 'publie' - AND !autoriser('publierdans', 'rubrique', $id_parent)) + AND !autoriser('publierdans', 'rubrique', $id_parent) + ) { $champs['statut'] = 'prop'; + } } // Envoyer aux plugins @@ -321,7 +342,7 @@ function article_instituer($id_article, $c, $calcul_rub = true) { 'args' => array( 'table' => 'spip_articles', 'id_objet' => $id_article, - 'action'=>'instituer', + 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, ), @@ -329,7 +350,9 @@ function article_instituer($id_article, $c, $calcul_rub = true) { ) ); - if (!count($champs)) return ''; + if (!count($champs)) { + return ''; + } // Envoyer les modifs. editer_article_heritage($id_article, $id_rubrique, $statut_ancien, $champs, $calcul_rub); @@ -352,7 +375,7 @@ function article_instituer($id_article, $c, $calcul_rub = true) { 'args' => array( 'table' => 'spip_articles', 'id_objet' => $id_article, - 'action'=>'instituer', + 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, ), @@ -363,7 +386,7 @@ function article_instituer($id_article, $c, $calcul_rub = true) { // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications('instituerarticle', $id_article, - array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date, 'date_ancienne' => $date_ancienne) + array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne) ); } @@ -373,8 +396,8 @@ function article_instituer($id_article, $c, $calcul_rub = true) { /** * Fabrique la requête de modification de l'article, avec champs hérités * - * @global array $GLOBALS['meta'] - * + * @global array $GLOBALS ['meta'] + * * @param int $id_article * Identifiant de l'article * @param int $id_rubrique @@ -383,7 +406,7 @@ function article_instituer($id_article, $c, $calcul_rub = true) { * Statut de l'article (prop, publie, ...) * @param array $champs * Couples (colonne => valeur) des champs qui ont été modifiés - * @param bool $cond + * @param bool $cond * True pour actualiser le statut et date de publication de la rubrique * parente si nécessaire * @return void|null @@ -396,39 +419,42 @@ function editer_article_heritage($id_article, $id_rubrique, $statut, $champs, $c // changer aussi son secteur et sa langue (si heritee) if (isset($champs['id_rubrique'])) { - $row_rub = sql_fetsel("id_secteur, lang", "spip_rubriques", "id_rubrique=".sql_quote($champs['id_rubrique'])); + $row_rub = sql_fetsel("id_secteur, lang", "spip_rubriques", "id_rubrique=" . sql_quote($champs['id_rubrique'])); $langue = $row_rub['lang']; $champs['id_secteur'] = $row_rub['id_secteur']; - if (sql_fetsel('1', 'spip_articles', "id_article=".intval($id_article)." AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) { + if (sql_fetsel('1', 'spip_articles', + "id_article=" . intval($id_article) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) { $champs['lang'] = $langue; } } - if (!$champs) return; + if (!$champs) { + return; + } - sql_updateq('spip_articles', $champs, "id_article=".intval($id_article)); + sql_updateq('spip_articles', $champs, "id_article=" . intval($id_article)); // Changer le statut des rubriques concernees if ($cond) { include_spip('inc/rubriques'); - $postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time()))?$champs['date']:false; + $postdate = ($GLOBALS['meta']["post_dates"] == "non" AND isset($champs['date']) AND (strtotime($champs['date']) < time())) ? $champs['date'] : false; calculer_rubriques_if($id_rubrique, $champs, $statut, $postdate); } } /** * Réunit les textes decoupés parce que trop longs - * + * * @return void */ function trop_longs_articles() { if (is_array($plus = _request('texte_plus'))) { - foreach ($plus as $n=>$t) { - $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,","", $t); + foreach ($plus as $n => $t) { + $plus[$n] = preg_replace(",<!--SPIP-->[\n\r]*,", "", $t); } - set_request('texte', join('',$plus) . _request('texte')); + set_request('texte', join('', $plus) . _request('texte')); } } @@ -438,10 +464,10 @@ function trop_longs_articles() { /** * Créer une révision d'un article - * + * * @deprecated Utiliser article_modifier() * @see article_modifier() - * + * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $c @@ -453,16 +479,16 @@ function trop_longs_articles() { * Null si aucun champ à modifier, * Chaîne contenant un texte d'erreur sinon. */ -function revisions_articles ($id_article, $c = false) { - return article_modifier($id_article,$c); +function revisions_articles($id_article, $c = false) { + return article_modifier($id_article, $c); } /** * Créer une révision d'un article - * + * * @deprecated Utiliser article_modifier() * @see article_modifier() - * + * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $c @@ -474,16 +500,16 @@ function revisions_articles ($id_article, $c = false) { * Null si aucun champ à modifier, * Chaîne contenant un texte d'erreur sinon. */ -function revision_article ($id_article, $c = false) { - return article_modifier($id_article,$c); +function revision_article($id_article, $c = false) { + return article_modifier($id_article, $c); } /** * Modifier un article - * + * * @deprecated Utiliser article_modifier() * @see article_modifier() - * + * * @param int $id_article * Identifiant de l'article à modifier * @param array|null $set @@ -496,7 +522,7 @@ function revision_article ($id_article, $c = false) { * Chaîne contenant un texte d'erreur sinon. */ function articles_set($id_article, $set = null) { - return article_modifier($id_article,$set); + return article_modifier($id_article, $set); } /** @@ -504,7 +530,7 @@ function articles_set($id_article, $set = null) { * * @deprecated Utiliser article_inserer() * @see article_inserer() - * + * * @param int $id_rubrique * Identifiant de la rubrique * @return int @@ -519,7 +545,7 @@ function insert_article($id_rubrique) { * * @deprecated Utiliser article_instituer() * @see article_instituer() - * + * * @param int $id_article * Identifiant de l'article * @param array $c @@ -533,6 +559,7 @@ function insert_article($id_rubrique) { * Chaîne vide */ function instituer_article($id_article, $c, $calcul_rub = true) { - return article_instituer($id_article,$c,$calcul_rub); + return article_instituer($id_article, $c, $calcul_rub); } + ?> diff --git a/ecrire/action/editer_auteur.php b/ecrire/action/editer_auteur.php index 2efc1b2ac2..6e20ddb432 100644 --- a/ecrire/action/editer_auteur.php +++ b/ecrire/action/editer_auteur.php @@ -12,21 +12,23 @@ /** * Gestion de l'action editer_article et de l'API d'édition d'un article - * + * * @package SPIP\Core\Auteurs\Edition */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Éditer ou créer un auteur * * Si aucun identifiant d'auteur n'est donné, on crée alors un nouvel auteur. - * + * * @global array visiteur_session * @uses auteur_inserer() * @uses auteur_modifier() - * + * * @param array|null $arg * Identifiant de l'auteur. En absence utilise l'argument * de l'action sécurisée. @@ -35,7 +37,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; */ function action_editer_auteur_dist($arg = null) { - if (is_null($arg)){ + if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } @@ -44,12 +46,12 @@ function action_editer_auteur_dist($arg = null) { // si id_auteur n'est pas un nombre, c'est une creation if (!$id_auteur = intval($arg)) { - if (($id_auteur = auteur_inserer()) > 0){ + if (($id_auteur = auteur_inserer()) > 0) { # cf. GROS HACK # recuperer l'eventuel logo charge avant la creation # ils ont un id = 0-id_auteur de la session - $id_hack = 0 - $GLOBALS['visiteur_session']['id_auteur']; + $id_hack = 0-$GLOBALS['visiteur_session']['id_auteur']; $chercher_logo = charger_fonction('chercher_logo', 'inc'); foreach (array('on', 'off') as $type) { if ($logo = $chercher_logo($id_hack, 'id_auteur', $type)) { @@ -63,13 +65,15 @@ function action_editer_auteur_dist($arg = null) { // Enregistre l'envoi dans la BD $err = ""; - if ($id_auteur > 0) + if ($id_auteur > 0) { $err = auteur_modifier($id_auteur); + } - if ($err) - spip_log("echec editeur auteur: $err",_LOG_ERREUR); + if ($err) { + spip_log("echec editeur auteur: $err", _LOG_ERREUR); + } - return array($id_auteur,$err); + return array($id_auteur, $err); } /** @@ -77,7 +81,7 @@ function action_editer_auteur_dist($arg = null) { * * @pipeline_appel pre_insertion * @pipeline_appel post_insertion - * + * * @param string|null $source * D'où provient l'auteur créé ? par défaut 'spip', mais peut être 'ldap' ou autre. * @param array|null $set @@ -88,14 +92,15 @@ function auteur_inserer($source = null, $set = null) { // Ce qu'on va demander comme modifications $champs = array(); - $champs['source'] = $source?$source:'spip'; + $champs['source'] = $source ? $source : 'spip'; $champs['login'] = ''; $champs['statut'] = '5poubelle'; // inutilisable tant qu'il n'a pas ete renseigne et institue $champs['webmestre'] = 'non'; - if ($set) + if ($set) { $champs = array_merge($champs, $set); + } // Envoyer aux plugins $champs = pipeline('pre_insertion', @@ -116,13 +121,14 @@ function auteur_inserer($source = null, $set = null) { 'data' => $champs ) ); + return $id_auteur; } /** * Modifier un auteur - * + * * Appelle toutes les fonctions de modification d'un auteur * * @param int $id_auteur @@ -144,10 +150,10 @@ function auteur_modifier($id_auteur, $set = null, $force_update = false) { include_spip('inc/modifier'); include_spip('inc/filtres'); $c = collecter_requests( - // white list - objet_info('auteur','champs_editables'), + // white list + objet_info('auteur', 'champs_editables'), // black list - $force_update?array():array('webmestre','pass','login'), + $force_update ? array() : array('webmestre', 'pass', 'login'), // donnees eventuellement fournies $set ); @@ -157,29 +163,40 @@ function auteur_modifier($id_auteur, $set = null, $force_update = false) { 'data' => $set, 'nonvide' => array('nom' => _T('ecrire:item_nouvel_auteur')) ), - $c)) + $c) + ) { return $err; + } $session = $c; $err = ''; - if (!$force_update){ + if (!$force_update) { // Modification de statut, changement de rubrique ? $c = collecter_requests( - // white list + // white list array( - 'statut', 'new_login','new_pass','login','pass','webmestre','restreintes','id_parent' + 'statut', + 'new_login', + 'new_pass', + 'login', + 'pass', + 'webmestre', + 'restreintes', + 'id_parent' ), // black list array(), // donnees eventuellement fournies $set ); - if (isset($c['new_login']) AND !isset($c['login'])) + if (isset($c['new_login']) AND !isset($c['login'])) { $c['login'] = $c['new_login']; - if (isset($c['new_pass']) AND !isset($c['pass'])) + } + if (isset($c['new_pass']) AND !isset($c['pass'])) { $c['pass'] = $c['new_pass']; + } $err = auteur_instituer($id_auteur, $c); - $session = array_merge($session,$c); + $session = array_merge($session, $c); } // .. mettre a jour les sessions de cet auteur @@ -196,11 +213,11 @@ function auteur_modifier($id_auteur, $set = null, $force_update = false) { * Associer un auteur à des objets listés * * @uses objet_associer() - * + * * @param int $id_auteur * Identifiant de l'auteur * @param array $objets - * Liste sous la forme `array($objet=>$id_objets,...)`. + * Liste sous la forme `array($objet=>$id_objets,...)`. * `$id_objets` peut lui-même être un scalaire ou un tableau pour une liste * d'objets du même type. * @param array|null $qualif @@ -209,9 +226,10 @@ function auteur_modifier($id_auteur, $set = null, $force_update = false) { * En cas de lot de liens, c'est la même qualification qui est appliquée à tous * @return string */ -function auteur_associer($id_auteur, $objets, $qualif = null){ +function auteur_associer($id_auteur, $objets, $qualif = null) { include_spip('action/editer_liens'); - return objet_associer(array('auteur'=>$id_auteur), $objets, $qualif); + + return objet_associer(array('auteur' => $id_auteur), $objets, $qualif); } @@ -220,44 +238,45 @@ function auteur_associer($id_auteur, $objets, $qualif = null){ * * @deprecated Utiliser auteur_associer() * @see auteur_associer() - * + * * @param int $id_auteur * @param array $c * @return string */ -function auteur_referent($id_auteur, $c){ - return auteur_associer($id_auteur,$c); +function auteur_referent($id_auteur, $c) { + return auteur_associer($id_auteur, $c); } /** * Dissocier un auteur des objets listés * * @uses objet_dissocier() - * + * * @param int $id_auteur * Identifiant de l'auteur * @param array $objets - * Liste sous la forme `array($objet=>$id_objets,...)`. + * Liste sous la forme `array($objet=>$id_objets,...)`. * `$id_objets` peut lui-même être un scalaire ou un tableau pour une liste * d'objets du même type. * * Un `*` pour $id_auteur,$objet,$id_objet permet de traiter par lot * @return string */ -function auteur_dissocier($id_auteur, $objets){ +function auteur_dissocier($id_auteur, $objets) { include_spip('action/editer_liens'); - return objet_dissocier(array('auteur'=>$id_auteur), $objets); + + return objet_dissocier(array('auteur' => $id_auteur), $objets); } /** * Qualifier le lien d'un auteur avec les objets listés - * + * * @uses objet_qualifier_liens() - * + * * @param int $id_auteur * Identifiant de l'auteur * @param array $objets - * Liste sous la forme `array($objet=>$id_objets,...)`. + * Liste sous la forme `array($objet=>$id_objets,...)`. * `$id_objets` peut lui-même être un scalaire ou un tableau pour une liste * d'objets du même type. * @@ -266,9 +285,10 @@ function auteur_dissocier($id_auteur, $objets){ * Couples (colonne, valeur) tel que `array('vu'=>'oui');` * @return bool|int */ -function auteur_qualifier($id_auteur, $objets, $qualif){ +function auteur_qualifier($id_auteur, $objets, $qualif) { include_spip('action/editer_liens'); - return objet_qualifier_liens(array('auteur'=>$id_auteur), $objets, $qualif); + + return objet_qualifier_liens(array('auteur' => $id_auteur), $objets, $qualif); } @@ -277,7 +297,7 @@ function auteur_qualifier($id_auteur, $objets, $qualif){ * * @pipeline_appel pre_edition * @pipeline_appel post_edition - * + * * @param int $id_auteur * Identifiant de l'auteur * @param array $c @@ -287,38 +307,46 @@ function auteur_qualifier($id_auteur, $objets, $qualif){ * @return bool|string */ function auteur_instituer($id_auteur, $c, $force_webmestre = false) { - if (!$id_auteur=intval($id_auteur)) + if (!$id_auteur = intval($id_auteur)) { return false; + } $erreurs = array(); // contiendra les differentes erreurs a traduire par _T() $champs = array(); // les memoriser pour les faire passer dans le pipeline pre_edition - if (isset($c['login']) AND strlen($c['login'])) + if (isset($c['login']) AND strlen($c['login'])) { $champs['login'] = $c['login']; - if (isset($c['pass']) AND strlen($c['pass'])) + } + if (isset($c['pass']) AND strlen($c['pass'])) { $champs['pass'] = $c['pass']; + } + + $statut = $statut_ancien = sql_getfetsel('statut', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); - $statut = $statut_ancien = sql_getfetsel('statut','spip_auteurs','id_auteur='.intval($id_auteur)); - if (isset($c['statut']) - AND (autoriser('modifier', 'auteur', $id_auteur,null, array('statut' => $c['statut'])))) + AND (autoriser('modifier', 'auteur', $id_auteur, null, array('statut' => $c['statut']))) + ) { $statut = $champs['statut'] = $c['statut']; + } // Restreindre avant de declarer l'auteur // (section critique sur les droits) if (isset($c['id_parent']) and $c['id_parent']) { - if (is_array($c['restreintes'])) + if (is_array($c['restreintes'])) { $c['restreintes'][] = $c['id_parent']; - else + } else { $c['restreintes'] = array($c['id_parent']); + } } if (isset($c['webmestre']) - AND ($force_webmestre OR autoriser('modifier', 'auteur', $id_auteur,null, array('webmestre' => '?')))) - $champs['webmestre'] = $c['webmestre']=='oui'?'oui':'non'; + AND ($force_webmestre OR autoriser('modifier', 'auteur', $id_auteur, null, array('webmestre' => '?'))) + ) { + $champs['webmestre'] = $c['webmestre'] == 'oui' ? 'oui' : 'non'; + } // si statut change et n'est pas 0minirezo, on force webmestre a non - if (isset($c['statut']) AND $c['statut']!=='0minirezo'){ + if (isset($c['statut']) AND $c['statut'] !== '0minirezo') { $champs['webmestre'] = $c['webmestre'] = 'non'; } @@ -334,42 +362,48 @@ function auteur_instituer($id_auteur, $c, $force_webmestre = false) { 'data' => $champs ) ); - + if (isset($c['restreintes']) and is_array($c['restreintes']) - AND autoriser('modifier', 'auteur', $id_auteur, NULL, array('restreint'=>$c['restreintes']))) { - $rubriques = array_map('intval',$c['restreintes']); + AND autoriser('modifier', 'auteur', $id_auteur, null, array('restreint' => $c['restreintes'])) + ) { + $rubriques = array_map('intval', $c['restreintes']); $rubriques = array_unique($rubriques); - $rubriques = array_diff($rubriques,array(0)); - auteur_dissocier($id_auteur, array('rubrique'=>'*')); - auteur_associer($id_auteur,array('rubrique'=>$rubriques)); + $rubriques = array_diff($rubriques, array(0)); + auteur_dissocier($id_auteur, array('rubrique' => '*')); + auteur_associer($id_auteur, array('rubrique' => $rubriques)); } $flag_ecrire_acces = false; // commencer par traiter les cas particuliers des logins et pass // avant les autres ecritures en base - if (isset($champs['login']) OR isset($champs['pass'])){ - $auth_methode = sql_getfetsel('source','spip_auteurs','id_auteur='.intval($id_auteur)); + if (isset($champs['login']) OR isset($champs['pass'])) { + $auth_methode = sql_getfetsel('source', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); include_spip('inc/auth'); - if (isset($champs['login']) AND strlen($champs['login'])) - if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) + if (isset($champs['login']) AND strlen($champs['login'])) { + if (!auth_modifier_login($auth_methode, $champs['login'], $id_auteur)) { $erreurs[] = 'ecrire:impossible_modifier_login_auteur'; - if (isset($champs['pass']) AND strlen($champs['pass'])){ - $champs['login'] = sql_getfetsel('login','spip_auteurs','id_auteur='.intval($id_auteur)); - if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) + } + } + if (isset($champs['pass']) AND strlen($champs['pass'])) { + $champs['login'] = sql_getfetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur)); + if (!auth_modifier_pass($auth_methode, $champs['login'], $champs['pass'], $id_auteur)) { $erreurs[] = 'ecrire:impossible_modifier_pass_auteur'; + } } unset($champs['login']); unset($champs['pass']); $flag_ecrire_acces = true; } - if (!count($champs)) return implode(' ', array_map('_T', $erreurs)); - sql_updateq('spip_auteurs', $champs , 'id_auteur='.$id_auteur); + if (!count($champs)) { + return implode(' ', array_map('_T', $erreurs)); + } + sql_updateq('spip_auteurs', $champs, 'id_auteur=' . $id_auteur); // .. mettre a jour les fichiers .htpasswd et .htpasswd-admin if ($flag_ecrire_acces - OR isset($champs['statut']) - ) { + OR isset($champs['statut']) + ) { include_spip('inc/acces'); ecrire_acces(); } @@ -377,7 +411,7 @@ function auteur_instituer($id_auteur, $c, $force_webmestre = false) { // Invalider les caches include_spip('inc/invalideur'); suivre_invalideur("id='auteur/$id_auteur'"); - + // Pipeline pipeline('post_edition', array( @@ -413,7 +447,7 @@ function auteur_instituer($id_auteur, $c, $force_webmestre = false) { * * @deprecated Utiliser auteur_inserer() * @see auteur_inserer() - * + * * @param string|null $source * @return int */ @@ -426,13 +460,13 @@ function insert_auteur($source = null) { * * @deprecated Utiliser auteur_modifier() * @see auteur_modifier() - * + * * @param int $id_auteur * @param array|null $set * @return string|null */ function auteurs_set($id_auteur, $set = null) { - return auteur_modifier($id_auteur,$set); + return auteur_modifier($id_auteur, $set); } /** @@ -440,14 +474,14 @@ function auteurs_set($id_auteur, $set = null) { * * @deprecated Utiliser auteur_instituer() * @see auteur_instituer() - * + * * @param int $id_auteur * @param array $c * @param bool $force_webmestre * @return bool|string */ function instituer_auteur($id_auteur, $c, $force_webmestre = false) { - return auteur_instituer($id_auteur,$c,$force_webmestre); + return auteur_instituer($id_auteur, $c, $force_webmestre); } /** @@ -455,13 +489,13 @@ function instituer_auteur($id_auteur, $c, $force_webmestre = false) { * * @deprecated Utiliser auteur_modifier() * @see auteur_modifier() - * + * * @param int $id_auteur * @param array $c * @return string|null */ function revision_auteur($id_auteur, $c = false) { - return auteur_modifier($id_auteur,$c); + return auteur_modifier($id_auteur, $c); } ?> diff --git a/ecrire/action/editer_liens.php b/ecrire/action/editer_liens.php index 2f4024743f..fd26e86f9a 100644 --- a/ecrire/action/editer_liens.php +++ b/ecrire/action/editer_liens.php @@ -16,7 +16,7 @@ * Cette API gère la création, modification et suppressions de liens * entre deux objets éditoriaux par l'intermédiaire de tables de liaison * tel que spip_xx_liens. - * + * * L'unicité est assurée dans les fonctions sur le trio (id_x, objet, id_objet) * par défaut, ce qui correspond à la déclaration de clé primaire. * @@ -27,8 +27,10 @@ * * @package SPIP\Core\Liens\API */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // charger la gestion les rôles sur les objets include_spip('inc/roles'); @@ -44,24 +46,27 @@ include_spip('inc/roles'); * - false si l'objet n'est pas associable. * - array(clé primaire, nom de la table de lien) si associable */ -function objet_associable($objet){ - $trouver_table = charger_fonction('trouver_table','base'); +function objet_associable($objet) { + $trouver_table = charger_fonction('trouver_table', 'base'); $table_sql = table_objet_sql($objet); - $l=""; + $l = ""; if ($primary = id_table_objet($objet) - AND $trouver_table($l = $table_sql."_liens") - AND !preg_match(',[^\w],',$primary) - AND !preg_match(',[^\w],',$l)) - return array($primary,$l); + AND $trouver_table($l = $table_sql . "_liens") + AND !preg_match(',[^\w],', $primary) + AND !preg_match(',[^\w],', $l) + ) { + return array($primary, $l); + } spip_log("Objet $objet non associable : ne dispose pas d'une cle primaire $primary OU d'une table liens $l"); + return false; } /** * Associer un ou des objets à des objets listés - * + * * `$objets_source` et `$objets_lies` sont de la forme * `array($objet=>$id_objets,...)` * `$id_objets` peut lui même être un scalaire ou un tableau pour une liste d'objets du même type @@ -74,18 +79,19 @@ function objet_associable($objet){ * On peut passer optionnellement une qualification du (des) lien(s) qui sera * alors appliquée dans la foulée. * En cas de lot de liens, c'est la même qualification qui est appliquée a tous - * + * * @api * @param array $objets_source * @param array|string $objets_lies * @param array $qualif * @return bool|int */ -function objet_associer($objets_source, $objets_lies, $qualif = null){ +function objet_associer($objets_source, $objets_lies, $qualif = null) { $modifs = objet_traiter_liaisons('lien_insert', $objets_source, $objets_lies, $qualif); - if ($qualif) + if ($qualif) { objet_qualifier_liens($objets_source, $objets_lies, $qualif); + } return $modifs; // pas d'erreur } @@ -93,7 +99,7 @@ function objet_associer($objets_source, $objets_lies, $qualif = null){ /** * Dissocier un (ou des) objet(s) des objets listés - * + * * `$objets_source` et `$objets_lies` sont de la forme * `array($objet=>$id_objets,...)` * `$id_objets` peut lui-même être un scalaire ou un tableau pour une liste d'objets du même type @@ -120,19 +126,18 @@ function objet_associer($objets_source, $objets_lies, $qualif = null){ * ou tous les rôles (*), en s'affranchissant du vrai nom de la colonne. * @return bool|int */ -function objet_dissocier($objets_source, $objets_lies, $cond = null){ - return objet_traiter_liaisons('lien_delete',$objets_source,$objets_lies, $cond); +function objet_dissocier($objets_source, $objets_lies, $cond = null) { + return objet_traiter_liaisons('lien_delete', $objets_source, $objets_lies, $cond); } - /** * Qualifier le lien entre un (ou des) objet(s) et des objets listés - * + * * $objets_source et $objets sont de la forme * array($objet=>$id_objets,...) * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type - * + * * Les objets sources sont les pivots qui portent les liens * et pour lesquels une table spip_xxx_liens existe * (auteurs, documents, mots) @@ -146,14 +151,14 @@ function objet_dissocier($objets_source, $objets_lies, $cond = null){ * @param array $qualif * @return bool|int */ -function objet_qualifier_liens($objets_source, $objets_lies, $qualif){ - return objet_traiter_liaisons('lien_set',$objets_source,$objets_lies,$qualif); +function objet_qualifier_liens($objets_source, $objets_lies, $qualif) { + return objet_traiter_liaisons('lien_set', $objets_source, $objets_lies, $qualif); } /** * Trouver les liens entre objets - * + * * $objets_source et $objets sont de la forme * array($objet=>$id_objets,...) * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type @@ -173,22 +178,22 @@ function objet_qualifier_liens($objets_source, $objets_lies, $qualif){ * array('id_document'=>23,'objet'=>'article','id_objet'=>12,'vu'=>'oui', * 'document'=>23,'article'=>12) * ) - * + * * @api - * @param array $objets_source Couples (objets_source => identifiants) (objet qui a la table de lien) + * @param array $objets_source Couples (objets_source => identifiants) (objet qui a la table de lien) * @param array|string $objets_lies Couples (objets_lies => identifiants) - * @param array|null $cond Condition du where supplémentaires + * @param array|null $cond Condition du where supplémentaires * @return array * Liste des trouvailles */ -function objet_trouver_liens($objets_source, $objets_lies, $cond = null){ - return objet_traiter_liaisons('lien_find',$objets_source,$objets_lies,$cond); +function objet_trouver_liens($objets_source, $objets_lies, $cond = null) { + return objet_traiter_liaisons('lien_find', $objets_source, $objets_lies, $cond); } /** * Nettoyer les liens morts vers des objets qui n'existent plus - * + * * $objets_source et $objets sont de la forme * array($objet=>$id_objets,...) * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type @@ -199,18 +204,17 @@ function objet_trouver_liens($objets_source, $objets_lies, $cond = null){ * * un * pour $objet,$id_objet permet de traiter par lot * seul le type de l'objet source ne peut pas accepter de joker et doit etre explicite - * + * * @api * @param array $objets_source * @param array|string $objets_lies * @return int */ -function objet_optimiser_liens($objets_source, $objets_lies){ - return objet_traiter_liaisons('lien_optimise',$objets_source,$objets_lies); +function objet_optimiser_liens($objets_source, $objets_lies) { + return objet_traiter_liaisons('lien_optimise', $objets_source, $objets_lies); } - /** * Dupliquer tous les liens entrant ou sortants d'un objet * vers un autre (meme type d'objet, mais id different) @@ -226,32 +230,32 @@ function objet_optimiser_liens($objets_source, $objets_lies){ * @return int * Nombre de liens copiés */ -function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $exclure_types = null){ +function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $exclure_types = null) { include_spip('base/objets'); $tables = lister_tables_objets_sql(); $n = 0; - foreach($tables as $table_sql => $infos){ + foreach ($tables as $table_sql => $infos) { if ( - (is_null($types) OR in_array($infos['type'],$types)) - AND (is_null($exclure_types) OR !in_array($infos['type'],$exclure_types)) - ){ - if (objet_associable($infos['type'])){ - $liens = (($infos['type']==$objet)? - objet_trouver_liens(array($objet=>$id_source),'*') + (is_null($types) OR in_array($infos['type'], $types)) + AND (is_null($exclure_types) OR !in_array($infos['type'], $exclure_types)) + ) { + if (objet_associable($infos['type'])) { + $liens = (($infos['type'] == $objet) ? + objet_trouver_liens(array($objet => $id_source), '*') : - objet_trouver_liens(array($infos['type']=>'*'),array($objet=>$id_source))); - foreach($liens as $lien){ + objet_trouver_liens(array($infos['type'] => '*'), array($objet => $id_source))); + foreach ($liens as $lien) { $n++; - if ($infos['type']==$objet){ - objet_associer(array($objet=>$id_cible),array($lien['objet']=>$lien[$lien['objet']]),$lien); - } - else { - objet_associer(array($infos['type']=>$lien[$infos['type']]),array($objet=>$id_cible),$lien); + if ($infos['type'] == $objet) { + objet_associer(array($objet => $id_cible), array($lien['objet'] => $lien[$lien['objet']]), $lien); + } else { + objet_associer(array($infos['type'] => $lien[$infos['type']]), array($objet => $id_cible), $lien); } } } } } + return $n; } @@ -264,7 +268,7 @@ function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $ex /** * Fonction générique qui * applique une operation de liaison entre un ou des objets et des objets listés - * + * * $objets_source et $objets_lies sont de la forme * array($objet=>$id_objets,...) * $id_objets peut lui meme etre un scalaire ou un tableau pour une liste d'objets du meme type @@ -293,37 +297,39 @@ function objet_dupliquer_liens($objet, $id_source, $id_cible, $types = null, $ex * En fonction des opérations il peut servir à différentes utilisations * @return bool|int|array */ -function objet_traiter_liaisons($operation, $objets_source, $objets_lies, $set = null){ +function objet_traiter_liaisons($operation, $objets_source, $objets_lies, $set = null) { // accepter une syntaxe minimale pour supprimer tous les liens - if ($objets_lies=='*') $objets_lies = array('*'=>'*'); + if ($objets_lies == '*') { + $objets_lies = array('*' => '*'); + } $modifs = 0; // compter le nombre de modifications $echec = null; - foreach($objets_source as $objet=>$ids){ + foreach ($objets_source as $objet => $ids) { if ($a = objet_associable($objet)) { - list($primary,$l) = $a; - if (!is_array($ids)) + list($primary, $l) = $a; + if (!is_array($ids)) { $ids = array($ids); - elseif(reset($ids)=="NOT"){ + } elseif (reset($ids) == "NOT") { // si on demande un array('NOT',...) => recuperer la liste d'ids correspondants - $where = lien_where($primary,$ids,'*','*'); - $ids = sql_allfetsel($primary,$l,$where); - $ids = array_map('reset',$ids); + $where = lien_where($primary, $ids, '*', '*'); + $ids = sql_allfetsel($primary, $l, $where); + $ids = array_map('reset', $ids); } - foreach($ids as $id) { - $res = $operation($objet,$primary,$l,$id,$objets_lies,$set); - if ($res===false) { - spip_log("objet_traiter_liaisons [Echec] : $operation sur $objet/$primary/$l/$id",_LOG_ERREUR); + foreach ($ids as $id) { + $res = $operation($objet, $primary, $l, $id, $objets_lies, $set); + if ($res === false) { + spip_log("objet_traiter_liaisons [Echec] : $operation sur $objet/$primary/$l/$id", _LOG_ERREUR); $echec = true; + } else { + $modifs = ($modifs ? (is_array($res) ? array_merge($modifs, $res) : $modifs+$res) : $res); } - else - $modifs=($modifs?(is_array($res)?array_merge($modifs,$res):$modifs+$res):$res); } - } - else + } else { $echec = true; + } } - return ($echec?false:$modifs); // pas d'erreur + return ($echec ? false : $modifs); // pas d'erreur } @@ -331,18 +337,18 @@ function objet_traiter_liaisons($operation, $objets_source, $objets_lies, $set = * Sous fonction insertion * qui traite les liens pour un objet source dont la clé primaire * et la table de lien sont fournies - * + * * $objets et de la forme * array($objet=>$id_objets,...) * * Retourne le nombre d'insertions réalisées * * @internal - * @param string $objet_source Objet source de l'insertion (celui qui a la table de liaison) - * @param string $primary Nom de la clé primaire de cet objet - * @param string $table_lien Nom de la table de lien de cet objet - * @param int $id Identifiant de l'objet sur lesquels on va insérer des liaisons - * @param array $objets Liste des liaisons à faire, de la forme array($objet=>$id_objets) + * @param string $objet_source Objet source de l'insertion (celui qui a la table de liaison) + * @param string $primary Nom de la clé primaire de cet objet + * @param string $table_lien Nom de la table de lien de cet objet + * @param int $id Identifiant de l'objet sur lesquels on va insérer des liaisons + * @param array $objets Liste des liaisons à faire, de la forme array($objet=>$id_objets) * @param array $qualif * Liste des qualifications à appliquer (qui seront faites par lien_set()), * dont on cherche un rôle à insérer également. @@ -354,36 +360,42 @@ function objet_traiter_liaisons($operation, $objets_source, $objets_lies, $set = function lien_insert($objet_source, $primary, $table_lien, $id, $objets, $qualif) { $ins = 0; $echec = null; - if (is_null($qualif)) $qualif = array(); + if (is_null($qualif)) { + $qualif = array(); + } - foreach($objets as $objet => $id_objets){ - if (!is_array($id_objets)) $id_objets = array($id_objets); + foreach ($objets as $objet => $id_objets) { + if (!is_array($id_objets)) { + $id_objets = array($id_objets); + } // role, colonne, where par défaut list($role, $colonne_role, $cond) = roles_trouver_dans_qualif($objet_source, $objet, $qualif); - foreach($id_objets as $id_objet) { - $objet = ($objet=='*')?$objet:objet_type($objet); # securite + foreach ($id_objets as $id_objet) { + $objet = ($objet == '*') ? $objet : objet_type($objet); # securite $insertions = array( 'id_objet' => $id_objet, - 'objet' => $objet, - $primary => $id + 'objet' => $objet, + $primary => $id ); // rôle en plus s'il est défini - if ($role) $insertions += array( - $colonne_role => $role - ); + if ($role) { + $insertions += array( + $colonne_role => $role + ); + } $args = array( - 'table_lien' => $table_lien, - 'objet_source' => $objet_source, + 'table_lien' => $table_lien, + 'objet_source' => $objet_source, 'id_objet_source' => $id, - 'objet' => $objet, - 'id_objet' => $id_objet, - 'role' => $role, - 'colonne_role' => $colonne_role, - 'action' => 'insert', + 'objet' => $objet, + 'id_objet' => $id_objet, + 'role' => $role, + 'colonne_role' => $colonne_role, + 'action' => 'insert', ); // Envoyer aux plugins @@ -397,72 +409,81 @@ function lien_insert($objet_source, $primary, $table_lien, $id, $objets, $qualif $where = lien_where($primary, $id, $objet, $id_objet, $cond); - if ($id_objet=intval($insertions['id_objet']) - AND !sql_getfetsel($primary, $table_lien, $where)) { - - $e = sql_insertq($table_lien, $insertions); - if ($e!==false) { - $ins++; - lien_propage_date_modif($objet,$id_objet); - lien_propage_date_modif($objet_source,$id); - // Envoyer aux plugins - pipeline('post_edition_lien', - array( - 'args' => $args, - 'data' => $insertions - ) - ); - } - else - $echec = true; + if ($id_objet = intval($insertions['id_objet']) + AND !sql_getfetsel($primary, $table_lien, $where) + ) { + + $e = sql_insertq($table_lien, $insertions); + if ($e !== false) { + $ins++; + lien_propage_date_modif($objet, $id_objet); + lien_propage_date_modif($objet_source, $id); + // Envoyer aux plugins + pipeline('post_edition_lien', + array( + 'args' => $args, + 'data' => $insertions + ) + ); + } else { + $echec = true; + } } } } - return ($echec?false:$ins); + + return ($echec ? false : $ins); } /** * Fabriquer la condition where en tenant compte des jokers * * * @internal - * @param string $primary Nom de la clé primaire - * @param int|string|array $id_source Identifiant de la clé primaire - * @param string $objet Nom de l'objet lié - * @param int|string|array $id_objet Identifiant de l'objet lié - * @param array $cond Conditions par défaut + * @param string $primary Nom de la clé primaire + * @param int|string|array $id_source Identifiant de la clé primaire + * @param string $objet Nom de l'objet lié + * @param int|string|array $id_objet Identifiant de l'objet lié + * @param array $cond Conditions par défaut * @return array Liste des conditions */ -function lien_where($primary, $id_source, $objet, $id_objet, $cond = array()){ +function lien_where($primary, $id_source, $objet, $id_objet, $cond = array()) { if ((!is_array($id_source) AND !strlen($id_source)) - OR !strlen($objet) - OR (!is_array($id_objet) AND !strlen($id_objet))) - return array("0=1"); // securite - - $not=""; - if (is_array($id_source) AND reset($id_source)=="NOT"){ + OR !strlen($objet) + OR (!is_array($id_objet) AND !strlen($id_objet)) + ) { + return array("0=1"); + } // securite + + $not = ""; + if (is_array($id_source) AND reset($id_source) == "NOT") { $not = array_shift($id_source); $id_source = reset($id_source); } $where = $cond; - if ($id_source!=='*') - $where[] = (is_array($id_source)?sql_in(addslashes($primary),array_map('intval',$id_source),$not):addslashes($primary) . ($not?"<>":"=") . intval($id_source)); - elseif ($not) - $where[] = "0=1"; // idiot mais quand meme + if ($id_source !== '*') { + $where[] = (is_array($id_source) ? sql_in(addslashes($primary), array_map('intval', $id_source), + $not) : addslashes($primary) . ($not ? "<>" : "=") . intval($id_source)); + } elseif ($not) { + $where[] = "0=1"; + } // idiot mais quand meme - $not=""; - if (is_array($id_objet) AND reset($id_objet)=="NOT"){ + $not = ""; + if (is_array($id_objet) AND reset($id_objet) == "NOT") { $not = array_shift($id_objet); $id_objet = reset($id_objet); } - if ($objet!=='*') - $where[] = "objet=".sql_quote($objet); - if ($id_objet!=='*') - $where[] = (is_array($id_objet)?sql_in('id_objet',array_map('intval',$id_objet),$not):"id_objet" . ($not?"<>":"=") . intval($id_objet)); - elseif ($not) - $where[] = "0=1"; // idiot mais quand meme + if ($objet !== '*') { + $where[] = "objet=" . sql_quote($objet); + } + if ($id_objet !== '*') { + $where[] = (is_array($id_objet) ? sql_in('id_objet', array_map('intval', $id_objet), + $not) : "id_objet" . ($not ? "<>" : "=") . intval($id_objet)); + } elseif ($not) { + $where[] = "0=1"; + } // idiot mais quand meme return $where; } @@ -493,28 +514,34 @@ function lien_where($primary, $id_source, $objet, $id_objet, $cond = array()){ * Un cas particulier est géré lorsque l'index 'role' est présent (ou absent) * @return bool|int */ -function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = null){ +function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = null) { $retire = array(); $dels = 0; $echec = false; - if (is_null($cond)) $cond = array(); + if (is_null($cond)) { + $cond = array(); + } - foreach($objets as $objet => $id_objets){ - $objet = ($objet=='*')?$objet:objet_type($objet); # securite - if (!is_array($id_objets) OR reset($id_objets)=="NOT") $id_objets = array($id_objets); - foreach($id_objets as $id_objet) { + foreach ($objets as $objet => $id_objets) { + $objet = ($objet == '*') ? $objet : objet_type($objet); # securite + if (!is_array($id_objets) OR reset($id_objets) == "NOT") { + $id_objets = array($id_objets); + } + foreach ($id_objets as $id_objet) { list($cond, $colonne_role, $role) = roles_creer_condition_role($objet_source, $objet, $cond); // id_objet peut valoir '*' $where = lien_where($primary, $id, $objet, $id_objet, $cond); // lire les liens existants pour propager la date de modif $select = "$primary,id_objet,objet"; - if ($colonne_role) $select .= ",$colonne_role"; - $liens = sql_allfetsel($select,$table_lien,$where); + if ($colonne_role) { + $select .= ",$colonne_role"; + } + $liens = sql_allfetsel($select, $table_lien, $where); // iterer sur les liens pour permettre aux plugins de gerer - foreach($liens as $l) { + foreach ($liens as $l) { $args = array( 'table_lien' => $table_lien, @@ -524,7 +551,7 @@ function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = 'id_objet' => $l['id_objet'], 'colonne_role' => $colonne_role, 'role' => ($colonne_role ? $l[$colonne_role] : ''), - 'action'=>'delete', + 'action' => 'delete', ); // Envoyer aux plugins @@ -536,22 +563,22 @@ function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = ); $args['id_objet'] = $id_o = $l['id_objet']; - if ($id_o=intval($l['id_objet'])) { + if ($id_o = intval($l['id_objet'])) { $where = lien_where($primary, $l[$primary], $l['objet'], $id_o, $cond); $e = sql_delete($table_lien, $where); - if ($e!==false){ - $dels+=$e; - lien_propage_date_modif($l['objet'],$id_o); - lien_propage_date_modif($objet_source,$l[$primary]); - } - else + if ($e !== false) { + $dels += $e; + lien_propage_date_modif($l['objet'], $id_o); + lien_propage_date_modif($objet_source, $l[$primary]); + } else { $echec = true; + } $retire[] = array( - 'source' => array($objet_source=>$l[$primary]), - 'lien' => array($l['objet']=>$id_o), - 'type' => $l['objet'], - 'role' => ($colonne_role ? $l[$colonne_role] : ''), - 'id' => $id_o + 'source' => array($objet_source => $l[$primary]), + 'lien' => array($l['objet'] => $id_o), + 'type' => $l['objet'], + 'role' => ($colonne_role ? $l[$colonne_role] : ''), + 'id' => $id_o ); // Envoyer aux plugins pipeline('post_edition_lien', @@ -565,9 +592,9 @@ function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = } } - pipeline('trig_supprimer_objets_lies',$retire); + pipeline('trig_supprimer_objets_lies', $retire); - return ($echec?false:$dels); + return ($echec ? false : $dels); } @@ -589,18 +616,20 @@ function lien_delete($objet_source, $primary, $table_lien, $id, $objets, $cond = * @param array $objets * @return bool|int */ -function lien_optimise($objet_source, $primary, $table_lien, $id, $objets){ +function lien_optimise($objet_source, $primary, $table_lien, $id, $objets) { include_spip('genie/optimiser'); $echec = false; $dels = 0; - foreach($objets as $objet => $id_objets){ - $objet = ($objet=='*')?$objet:objet_type($objet); # securite - if (!is_array($id_objets) OR reset($id_objets)=="NOT") $id_objets = array($id_objets); - foreach($id_objets as $id_objet) { + foreach ($objets as $objet => $id_objets) { + $objet = ($objet == '*') ? $objet : objet_type($objet); # securite + if (!is_array($id_objets) OR reset($id_objets) == "NOT") { + $id_objets = array($id_objets); + } + foreach ($id_objets as $id_objet) { $where = lien_where($primary, $id, $objet, $id_objet); # les liens vers un objet inexistant - $r = sql_select("DISTINCT objet",$table_lien,$where); - while ($t = sql_fetch($r)){ + $r = sql_select("DISTINCT objet", $table_lien, $where); + while ($t = sql_fetch($r)) { $type = $t['objet']; $spip_table_objet = table_objet_sql($type); $id_table_objet = id_table_objet($type); @@ -608,16 +637,18 @@ function lien_optimise($objet_source, $primary, $table_lien, $id, $objets){ // la condition de jointure inclue L.objet='xxx' pour ne joindre que les bonnes lignes // du coups toutes les lignes avec un autre objet ont un id_xxx=NULL puisque LEFT JOIN // il faut les eliminier en repetant la condition dans le where L.objet='xxx' - "$table_lien AS L + "$table_lien AS L LEFT JOIN $spip_table_objet AS O - ON (O.$id_table_objet=L.id_objet AND L.objet=".sql_quote($type).")", - "L.objet=".sql_quote($type)." AND O.$id_table_objet IS NULL"); + ON (O.$id_table_objet=L.id_objet AND L.objet=" . sql_quote($type) . ")", + "L.objet=" . sql_quote($type) . " AND O.$id_table_objet IS NULL"); // sur une cle primaire composee, pas d'autres solutions que de virer un a un - while ($row = sql_fetch($res)){ - $e = sql_delete($table_lien, array("$primary=".$row['id'],"id_objet=".$row['id_objet'],"objet=".sql_quote($type))); - if ($e!=false){ - $dels+=$e; - spip_log("Entree ".$row['id']."/".$row['id_objet']."/$type supprimee dans la table $table_lien", _LOG_INFO_IMPORTANTE); + while ($row = sql_fetch($res)) { + $e = sql_delete($table_lien, + array("$primary=" . $row['id'], "id_objet=" . $row['id_objet'], "objet=" . sql_quote($type))); + if ($e != false) { + $dels += $e; + spip_log("Entree " . $row['id'] . "/" . $row['id_objet'] . "/$type supprimee dans la table $table_lien", + _LOG_INFO_IMPORTANTE); } } } @@ -629,12 +660,13 @@ function lien_optimise($objet_source, $primary, $table_lien, $id, $objets){ $where = lien_where("L.$primary", $id, $objet, $id_objet); $where[] = "O.$primary IS NULL"; $res = sql_select("L.$primary AS id", - "$table_lien AS L LEFT JOIN $table_source AS O ON L.$primary=O.$primary", - $where); - $dels+= optimiser_sansref($table_lien, $primary, $res); + "$table_lien AS L LEFT JOIN $table_source AS O ON L.$primary=O.$primary", + $where); + $dels += optimiser_sansref($table_lien, $primary, $res); } } - return ($echec?false:$dels); + + return ($echec ? false : $dels); } @@ -646,16 +678,16 @@ function lien_optimise($objet_source, $primary, $table_lien, $id, $objets){ * $objets et de la forme * array($objet=>$id_objets,...) * un * pour $id,$objet,$id_objets permet de traiter par lot - * + * * exemple : * $qualif = array('vu'=>'oui'); * * @internal - * @param string $objet_source Objet source de l'insertion (celui qui a la table de liaison) - * @param string $primary Nom de la clé primaire de cet objet - * @param string $table_lien Nom de la table de lien de cet objet - * @param int $id Identifiant de l'objet sur lesquels on va insérer des liaisons - * @param array $objets Liste des liaisons à faire, de la forme array($objet=>$id_objets) + * @param string $objet_source Objet source de l'insertion (celui qui a la table de liaison) + * @param string $primary Nom de la clé primaire de cet objet + * @param string $table_lien Nom de la table de lien de cet objet + * @param int $id Identifiant de l'objet sur lesquels on va insérer des liaisons + * @param array $objets Liste des liaisons à faire, de la forme array($objet=>$id_objets) * @param array $qualif * Liste des qualifications à appliquer. * @@ -665,11 +697,12 @@ function lien_optimise($objet_source, $primary, $table_lien, $id, $objets){ * @return bool|int * Nombre de modifications faites, false si échec. */ -function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif){ +function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif) { $echec = null; $ok = 0; - if (!$qualif) + if (!$qualif) { return false; + } // nettoyer qualif qui peut venir directement d'un objet_trouver_lien : unset($qualif[$primary]); unset($qualif[$objet_source]); @@ -678,25 +711,27 @@ function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif){ } unset($qualif['objet']); unset($qualif['id_objet']); - foreach($objets as $objet => $id_objets) { + foreach ($objets as $objet => $id_objets) { // role, colonne, where par défaut list($role, $colonne_role, $cond) = roles_trouver_dans_qualif($objet_source, $objet, $qualif); - $objet = ($objet=='*')?$objet:objet_type($objet); # securite - if (!is_array($id_objets) OR reset($id_objets)=="NOT") $id_objets = array($id_objets); - foreach($id_objets as $id_objet) { + $objet = ($objet == '*') ? $objet : objet_type($objet); # securite + if (!is_array($id_objets) OR reset($id_objets) == "NOT") { + $id_objets = array($id_objets); + } + foreach ($id_objets as $id_objet) { $args = array( - 'table_lien' => $table_lien, - 'objet_source' => $objet_source, + 'table_lien' => $table_lien, + 'objet_source' => $objet_source, 'id_objet_source' => $id, - 'objet' => $objet, - 'id_objet' => $id_objet, - 'role' => $role, - 'colonne_role' => $colonne_role, - 'action' => 'modifier', + 'objet' => $objet, + 'id_objet' => $id_objet, + 'role' => $role, + 'colonne_role' => $colonne_role, + 'action' => 'modifier', ); // Envoyer aux plugins @@ -709,12 +744,11 @@ function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif){ $args['id_objet'] = $id_objet; $where = lien_where($primary, $id, $objet, $id_objet, $cond); - $e = sql_updateq($table_lien,$qualif,$where); + $e = sql_updateq($table_lien, $qualif, $where); - if ($e===false) { + if ($e === false) { $echec = true; - } - else { + } else { // Envoyer aux plugins pipeline('post_edition_lien', array( @@ -726,7 +760,8 @@ function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif){ } } } - return ($echec?false:$ok); + + return ($echec ? false : $ok); } /** @@ -755,22 +790,23 @@ function lien_set($objet_source, $primary, $table_lien, $id, $objets, $qualif){ * le role défini dedans (et '*' pour tous les rôles). * @return array */ -function lien_find($objet_source, $primary, $table_lien, $id, $objets, $cond = null){ +function lien_find($objet_source, $primary, $table_lien, $id, $objets, $cond = null) { $trouve = array(); - foreach($objets as $objet => $id_objets){ - $objet = ($objet=='*')?$objet:objet_type($objet); # securite + foreach ($objets as $objet => $id_objets) { + $objet = ($objet == '*') ? $objet : objet_type($objet); # securite // gerer les roles s'il y en a dans $cond list($cond) = roles_creer_condition_role($objet_source, $objet, $cond, true); // lien_where prend en charge les $id_objets sous forme int ou array $where = lien_where($primary, $id, $objet, $id_objets, $cond); - $liens = sql_allfetsel('*',$table_lien,$where); + $liens = sql_allfetsel('*', $table_lien, $where); // ajouter les entrees objet_source et objet cible par convenance - foreach($liens as $l) { + foreach ($liens as $l) { $l[$objet_source] = $l[$primary]; $l[$objet] = $l['id_objet']; $trouve[] = $l; } } + return $trouve; } @@ -781,7 +817,7 @@ function lien_find($objet_source, $primary, $table_lien, $id, $objets, $cond = n * @param string $objet * @param array|int $ids */ -function lien_propage_date_modif($objet, $ids){ +function lien_propage_date_modif($objet, $ids) { static $done = array(); $hash = md5($objet . serialize($ids)); @@ -791,16 +827,18 @@ function lien_propage_date_modif($objet, $ids){ return; } - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $table = table_objet_sql($objet); if ($desc = $trouver_table($table) - AND isset($desc['field']['date_modif'])){ + AND isset($desc['field']['date_modif']) + ) { $primary = id_table_objet($objet); - $where = (is_array($ids)?sql_in($primary, array_map('intval',$ids)):"$primary=".intval($ids)); - sql_updateq($table, array('date_modif'=>date('Y-m-d H:i:s')), $where); + $where = (is_array($ids) ? sql_in($primary, array_map('intval', $ids)) : "$primary=" . intval($ids)); + sql_updateq($table, array('date_modif' => date('Y-m-d H:i:s')), $where); } $done[$hash] = true; } + ?> diff --git a/ecrire/action/editer_logo.php b/ecrire/action/editer_logo.php index 65d5ac52d2..1ef691470f 100644 --- a/ecrire/action/editer_logo.php +++ b/ecrire/action/editer_logo.php @@ -16,19 +16,21 @@ * @package SPIP\Core\Logo\Edition */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Supprimer le logo d'un objet - * + * * @param string $objet * @param int $id_objet * @param string $etat * `on` ou `off` */ -function logo_supprimer($objet, $id_objet, $etat){ - $chercher_logo = charger_fonction('chercher_logo','inc'); +function logo_supprimer($objet, $id_objet, $etat) { + $chercher_logo = charger_fonction('chercher_logo', 'inc'); $objet = objet_type($objet); $primary = id_table_objet($objet); include_spip('inc/chercher_logo'); @@ -42,6 +44,7 @@ function logo_supprimer($objet, $id_objet, $etat){ /** * Modifier le logo d'un objet + * * @param string $objet * @param int $id_objet * @param string $etat @@ -52,15 +55,15 @@ function logo_supprimer($objet, $id_objet, $etat){ * @return string * Erreur, sinon '' */ -function logo_modifier($objet, $id_objet, $etat, $source){ - $chercher_logo = charger_fonction('chercher_logo','inc'); +function logo_modifier($objet, $id_objet, $etat, $source) { + $chercher_logo = charger_fonction('chercher_logo', 'inc'); $objet = objet_type($objet); $primary = id_table_objet($objet); include_spip('inc/chercher_logo'); $type = type_du_logo($primary); // nom du logo - $nom = $type.$etat.$id_objet; + $nom = $type . $etat . $id_objet; // supprimer le logo eventueel existant logo_supprimer($objet, $id_objet, $etat); @@ -68,9 +71,10 @@ function logo_modifier($objet, $id_objet, $etat, $source){ include_spip('inc/documents'); $erreur = ""; - if (!$source){ + if (!$source) { spip_log("spip_image_ajouter : source inconnue"); $erreur = "source inconnue"; + return $erreur; } @@ -78,11 +82,10 @@ function logo_modifier($objet, $id_objet, $etat, $source){ $ok = false; // fichier dans upload/ - if (is_string($source)){ + if (is_string($source)) { if (file_exists($source)) { $ok = @copy($source, $file_tmp); - } - elseif(file_exists($f=determine_upload() . $source)){ + } elseif (file_exists($f = determine_upload() . $source)) { $ok = @copy($f, $file_tmp); } } // Intercepter une erreur a l'envoi @@ -92,71 +95,80 @@ function logo_modifier($objet, $id_objet, $etat, $source){ $ok = deplacer_fichier_upload($source['tmp_name'], $file_tmp); } - if ($erreur){ + if ($erreur) { return $erreur; } - if (!$ok OR !file_exists($file_tmp)){ + if (!$ok OR !file_exists($file_tmp)) { spip_log($erreur = "probleme de copie pour $file_tmp "); + return $erreur; } $size = @getimagesize($file_tmp); - $type = !$size ? '' : ($size[2]>3 ? '' : $GLOBALS['formats_logos'][$size[2]-1]); - if ($type){ - @rename($file_tmp,$file_tmp.".$type"); - $file_tmp = $file_tmp.".$type"; + $type = !$size ? '' : ($size[2] > 3 ? '' : $GLOBALS['formats_logos'][$size[2]-1]); + if ($type) { + @rename($file_tmp, $file_tmp . ".$type"); + $file_tmp = $file_tmp . ".$type"; $poids = filesize($file_tmp); if (defined('_LOGO_MAX_WIDTH') OR defined('_LOGO_MAX_HEIGHT')) { - if ((defined('_LOGO_MAX_WIDTH') AND _LOGO_MAX_WIDTH AND $size[0]>_LOGO_MAX_WIDTH) - OR (defined('_LOGO_MAX_HEIGHT') AND _LOGO_MAX_HEIGHT AND $size[1]>_LOGO_MAX_HEIGHT) ){ - $max_width = (defined('_LOGO_MAX_WIDTH') AND _LOGO_MAX_WIDTH)? _LOGO_MAX_WIDTH : '*'; - $max_height = (defined('_LOGO_MAX_HEIGHT') AND _LOGO_MAX_HEIGHT)? _LOGO_MAX_HEIGHT : '*'; + if ((defined('_LOGO_MAX_WIDTH') AND _LOGO_MAX_WIDTH AND $size[0] > _LOGO_MAX_WIDTH) + OR (defined('_LOGO_MAX_HEIGHT') AND _LOGO_MAX_HEIGHT AND $size[1] > _LOGO_MAX_HEIGHT) + ) { + $max_width = (defined('_LOGO_MAX_WIDTH') AND _LOGO_MAX_WIDTH) ? _LOGO_MAX_WIDTH : '*'; + $max_height = (defined('_LOGO_MAX_HEIGHT') AND _LOGO_MAX_HEIGHT) ? _LOGO_MAX_HEIGHT : '*'; // pas la peine d'embeter le redacteur avec ca si on a active le calcul des miniatures // on met directement a la taille maxi a la volee - if (isset($GLOBALS['meta']['creer_preview']) AND $GLOBALS['meta']['creer_preview']=='oui'){ + if (isset($GLOBALS['meta']['creer_preview']) AND $GLOBALS['meta']['creer_preview'] == 'oui') { include_spip('inc/filtres'); $img = filtrer('image_reduire', $file_tmp, $max_width, $max_height); $img = extraire_attribut($img, 'src'); $img = supprimer_timestamp($img); - if (@file_exists($img) AND $img!==$file_tmp){ + if (@file_exists($img) AND $img !== $file_tmp) { spip_unlink($file_tmp); @rename($img, $file_tmp); $size = @getimagesize($file_tmp); } } // verifier au cas ou image_reduire a echoue - if ((defined('_LOGO_MAX_WIDTH') AND _LOGO_MAX_WIDTH AND $size[0]>_LOGO_MAX_WIDTH) - OR (defined('_LOGO_MAX_HEIGHT') AND _LOGO_MAX_HEIGHT AND $size[1]>_LOGO_MAX_HEIGHT) ){ + if ((defined('_LOGO_MAX_WIDTH') AND _LOGO_MAX_WIDTH AND $size[0] > _LOGO_MAX_WIDTH) + OR (defined('_LOGO_MAX_HEIGHT') AND _LOGO_MAX_HEIGHT AND $size[1] > _LOGO_MAX_HEIGHT) + ) { spip_unlink($file_tmp); $erreur = _T('info_logo_max_poids', array( 'maxi' => _T('info_largeur_vignette', - array('largeur_vignette' => $max_width, - 'hauteur_vignette' => $max_height)), + array( + 'largeur_vignette' => $max_width, + 'hauteur_vignette' => $max_height + )), 'actuel' => _T('info_largeur_vignette', - array('largeur_vignette' => $size[0], - 'hauteur_vignette' => $size[1])) + array( + 'largeur_vignette' => $size[0], + 'hauteur_vignette' => $size[1] + )) )); } } } - if (!$erreur AND defined('_LOGO_MAX_SIZE') AND _LOGO_MAX_SIZE AND $poids>_LOGO_MAX_SIZE*1024){ + if (!$erreur AND defined('_LOGO_MAX_SIZE') AND _LOGO_MAX_SIZE AND $poids > _LOGO_MAX_SIZE*1024) { spip_unlink($file_tmp); $erreur = _T('info_logo_max_poids', - array('maxi' => taille_en_octets(_LOGO_MAX_SIZE*1024), - 'actuel' => taille_en_octets($poids))); + array( + 'maxi' => taille_en_octets(_LOGO_MAX_SIZE*1024), + 'actuel' => taille_en_octets($poids) + )); } - if (!$erreur) + if (!$erreur) { @rename($file_tmp, _DIR_LOGOS . $nom . ".$type"); - } - else { + } + } else { spip_unlink($file_tmp); $erreur = _T('info_logo_format_interdit', array('formats' => join(', ', $GLOBALS['formats_logos']))); diff --git a/ecrire/action/editer_objet.php b/ecrire/action/editer_objet.php index 7dfb3d0c80..eb470a653b 100644 --- a/ecrire/action/editer_objet.php +++ b/ecrire/action/editer_objet.php @@ -16,11 +16,13 @@ * @package SPIP\Core\Edition */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Point d'entrée d'édition d'un objet - * + * * On ne peut entrer que par un appel en fournissant $id et $objet * ou avec un argument d'action sécurisée de type "objet/id" * @@ -32,14 +34,14 @@ if (!defined('_ECRIRE_INC_VERSION')) return; function action_editer_objet_dist($id = null, $objet = null, $set = null) { // appel direct depuis une url avec arg = "objet/id" - if (is_null($id) OR is_null($objet)){ + if (is_null($id) OR is_null($objet)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); list($objet, $id) = array_pad(explode("/", $arg, 2), 2, null); } // appel incorrect ou depuis une url erronnée interdit - if (is_null($id) OR is_null($objet)){ + if (is_null($id) OR is_null($objet)) { include_spip('inc/minipres'); echo minipres(_T('info_acces_interdit')); die(); @@ -53,13 +55,14 @@ function action_editer_objet_dist($id = null, $objet = null, $set = null) { $id = objet_inserer($objet, $id_parent); } - if (!($id = intval($id))>0) - return array($id,_L('echec enregistrement en base')); + if (!($id = intval($id)) > 0) { + return array($id, _L('echec enregistrement en base')); + } // Enregistre l'envoi dans la BD $err = objet_modifier($objet, $id, $set); - return array($id,$err); + return array($id, $err); } /** @@ -72,24 +75,28 @@ function action_editer_objet_dist($id = null, $objet = null, $set = null) { * @return mixed|string */ function objet_modifier($objet, $id, $set = null) { - if (include_spip('action/editer_'.$objet) - AND function_exists($modifier = $objet."_modifier")) - return $modifier($id,$set); + if (include_spip('action/editer_' . $objet) + AND function_exists($modifier = $objet . "_modifier") + ) { + return $modifier($id, $set); + } $table_sql = table_objet_sql($objet); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); if (!$desc OR !isset($desc['field'])) { - spip_log("Objet $objet inconnu dans objet_modifier",_LOG_ERREUR); + spip_log("Objet $objet inconnu dans objet_modifier", _LOG_ERREUR); + return _L("Erreur objet $objet inconnu"); } include_spip('inc/modifier'); $champ_date = ''; - if (isset($desc['date']) AND $desc['date']) + if (isset($desc['date']) AND $desc['date']) { $champ_date = $desc['date']; - elseif (isset($desc['field']['date'])) + } elseif (isset($desc['field']['date'])) { $champ_date = 'date'; + } $white = array_keys($desc['field']); // on ne traite pas la cle primaire par defaut, notamment car @@ -100,20 +107,19 @@ function objet_modifier($objet, $id, $set = null) { $white = $desc['champs_editables']; } $c = collecter_requests( - // white list + // white list $white, // black list - array($champ_date,'statut','id_parent','id_secteur'), + array($champ_date, 'statut', 'id_parent', 'id_secteur'), // donnees eventuellement fournies $set ); // Si l'objet est publie, invalider les caches et demander sa reindexation - if (objet_test_si_publie($objet,$id)){ + if (objet_test_si_publie($objet, $id)) { $invalideur = "id='$objet/$id'"; $indexation = true; - } - else { + } else { $invalideur = ""; $indexation = false; } @@ -124,16 +130,18 @@ function objet_modifier($objet, $id, $set = null) { 'nonvide' => '', 'invalideur' => $invalideur, 'indexation' => $indexation, - // champ a mettre a date('Y-m-d H:i:s') s'il y a modif - 'date_modif' => (isset($desc['field']['date_modif'])?'date_modif':'') + // champ a mettre a date('Y-m-d H:i:s') s'il y a modif + 'date_modif' => (isset($desc['field']['date_modif']) ? 'date_modif' : '') ), - $c)) + $c) + ) { return $err; + } // Modification de statut, changement de rubrique ? // FIXME: Ici lorsqu'un $set est passé, la fonction collecter_requests() retourne tout // le tableau $set hors black liste, mais du coup on a possiblement des champs en trop. - $c = collecter_requests(array($champ_date, 'statut', 'id_parent'),array(),$set); + $c = collecter_requests(array($champ_date, 'statut', 'id_parent'), array(), $set); $err = objet_instituer($objet, $id, $c); return $err; @@ -141,41 +149,45 @@ function objet_modifier($objet, $id, $set = null) { /** * Insere en base un objet generique - * + * * @param string $objet * @param int $id_parent * @param array|null $set - * @global array $GLOBALS['visiteur_session'] - * @global array $GLOBALS['meta'] - * @global string $GLOBALS['spip_lang'] + * @global array $GLOBALS ['visiteur_session'] + * @global array $GLOBALS ['meta'] + * @global string $GLOBALS ['spip_lang'] * @return bool|int */ function objet_inserer($objet, $id_parent = null, $set = null) { - if (include_spip('action/editer_'.$objet) - AND function_exists($inserer = $objet."_inserer")) + if (include_spip('action/editer_' . $objet) + AND function_exists($inserer = $objet . "_inserer") + ) { return $inserer($id_parent, $set); + } $table_sql = table_objet_sql($objet); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); - if (!$desc OR !isset($desc['field'])) + if (!$desc OR !isset($desc['field'])) { return 0; + } $lang_rub = ""; $champs = array(); - if (isset($desc['field']['id_rubrique'])){ + if (isset($desc['field']['id_rubrique'])) { // Si id_rubrique vaut 0 ou n'est pas definie, creer l'objet // dans la premiere rubrique racine if (!$id_rubrique = intval($id_parent)) { - $row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0",'', '0+titre,titre', "1"); + $row = sql_fetsel("id_rubrique, id_secteur, lang", "spip_rubriques", "id_parent=0", '', '0+titre,titre', "1"); $id_rubrique = $row['id_rubrique']; + } else { + $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=" . intval($id_rubrique)); } - else - $row = sql_fetsel("lang, id_secteur", "spip_rubriques", "id_rubrique=".intval($id_rubrique)); $champs['id_rubrique'] = $id_rubrique; - if (isset($desc['field']['id_secteur'])) + if (isset($desc['field']['id_secteur'])) { $champs['id_secteur'] = $row['id_secteur']; + } $lang_rub = $row['lang']; } @@ -183,35 +195,39 @@ function objet_inserer($objet, $id_parent = null, $set = null) { // dans les rubriques, on essaie avec la langue de l'auteur, // ou a defaut celle de la rubrique // Sinon c'est la langue de la rubrique qui est choisie + heritee - if (isset($desc['field']['lang']) AND $GLOBALS['meta']['multi_objets'] AND in_array($table_sql, explode(',', $GLOBALS['meta']['multi_objets']))) { + if (isset($desc['field']['lang']) AND $GLOBALS['meta']['multi_objets'] AND in_array($table_sql, + explode(',', $GLOBALS['meta']['multi_objets'])) + ) { lang_select($GLOBALS['visiteur_session']['lang']); if (in_array($GLOBALS['spip_lang'], - explode(',', $GLOBALS['meta']['langues_multilingue']))) { + explode(',', $GLOBALS['meta']['langues_multilingue']))) { $champs['lang'] = $GLOBALS['spip_lang']; - if (isset($desc['field']['langue_choisie'])) + if (isset($desc['field']['langue_choisie'])) { $champs['langue_choisie'] = 'oui'; + } } - } - elseif (isset($desc['field']['lang']) AND isset($desc['field']['langue_choisie'])) { + } elseif (isset($desc['field']['lang']) AND isset($desc['field']['langue_choisie'])) { $champs['lang'] = ($lang_rub ? $lang_rub : $GLOBALS['meta']['langue_site']); $champs['langue_choisie'] = 'non'; } - if (isset($desc['field']['statut'])){ - if (isset($desc['statut_textes_instituer'])){ - $cles_statut = array_keys($desc['statut_textes_instituer']); + if (isset($desc['field']['statut'])) { + if (isset($desc['statut_textes_instituer'])) { + $cles_statut = array_keys($desc['statut_textes_instituer']); $champs['statut'] = reset($cles_statut); - } - else + } else { $champs['statut'] = 'prepa'; + } } - if ((isset($desc['date']) AND $d=$desc['date']) OR isset($desc['field'][$d='date'])) + if ((isset($desc['date']) AND $d = $desc['date']) OR isset($desc['field'][$d = 'date'])) { $champs[$d] = date('Y-m-d H:i:s'); + } - if ($set) + if ($set) { $champs = array_merge($champs, $set); + } // Envoyer aux plugins $champs = pipeline('pre_insertion', @@ -225,20 +241,21 @@ function objet_inserer($objet, $id_parent = null, $set = null) { $id = sql_insertq($table_sql, $champs); - if ($id){ + if ($id) { // controler si le serveur n'a pas renvoye une erreur // et associer l'auteur sinon // si la table n'a pas deja un champ id_auteur // et si le form n'a pas poste un id_auteur (meme vide, ce qui sert a annuler cette auto association) if ($id > 0 - AND !isset($desc['field']['id_auteur'])){ - $id_auteur = ((is_null(_request('id_auteur')) AND isset($GLOBALS['visiteur_session']['id_auteur']))? + AND !isset($desc['field']['id_auteur']) + ) { + $id_auteur = ((is_null(_request('id_auteur')) AND isset($GLOBALS['visiteur_session']['id_auteur'])) ? $GLOBALS['visiteur_session']['id_auteur'] - :_request('id_auteur')); - if ($id_auteur) { + : _request('id_auteur')); + if ($id_auteur) { include_spip('action/editer_auteur'); - auteur_associer($id_auteur, array($objet=>$id)); - } + auteur_associer($id_auteur, array($objet => $id)); + } } pipeline('post_insertion', @@ -259,7 +276,7 @@ function objet_inserer($objet, $id_parent = null, $set = null) { /** * Modifie le statut et/ou la date d'un objet - * + * * @param string $objet * @param int $id * @param array $c @@ -270,54 +287,61 @@ function objet_inserer($objet, $id_parent = null, $set = null) { * @return string */ function objet_instituer($objet, $id, $c, $calcul_rub = true) { - if (include_spip('action/editer_'.$objet) - AND function_exists($instituer = $objet."_instituer")) - return $instituer($id,$c,$calcul_rub); + if (include_spip('action/editer_' . $objet) + AND function_exists($instituer = $objet . "_instituer") + ) { + return $instituer($id, $c, $calcul_rub); + } $table_sql = table_objet_sql($objet); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); - if (!$desc OR !isset($desc['field'])) + if (!$desc OR !isset($desc['field'])) { return _L("Impossible d'instituer $objet : non connu en base"); + } include_spip('inc/autoriser'); include_spip('inc/rubriques'); include_spip('inc/modifier'); $sel = array(); - $sel[] = (isset($desc['field']['statut'])?"statut":"'' as statut"); + $sel[] = (isset($desc['field']['statut']) ? "statut" : "'' as statut"); $champ_date = ''; - if (isset($desc['date']) AND $desc['date']) + if (isset($desc['date']) AND $desc['date']) { $champ_date = $desc['date']; - elseif (isset($desc['field']['date'])) + } elseif (isset($desc['field']['date'])) { $champ_date = 'date'; + } $sel[] = ($champ_date ? "$champ_date as date" : "'' as date"); - $sel[] = (isset($desc['field']['id_rubrique'])?'id_rubrique':"0 as id_rubrique"); + $sel[] = (isset($desc['field']['id_rubrique']) ? 'id_rubrique' : "0 as id_rubrique"); - $row = sql_fetsel($sel, $table_sql, id_table_objet($objet).'='.intval($id)); + $row = sql_fetsel($sel, $table_sql, id_table_objet($objet) . '=' . intval($id)); $id_rubrique = $row['id_rubrique']; $statut_ancien = $statut = $row['statut']; $date_ancienne = $date = $row['date']; $champs = array(); - $d = ($date AND isset($c[$champ_date]))?$c[$champ_date]:null; - $s = (isset($desc['field']['statut']) AND isset($c['statut']))?$c['statut']:$statut; + $d = ($date AND isset($c[$champ_date])) ? $c[$champ_date] : null; + $s = (isset($desc['field']['statut']) AND isset($c['statut'])) ? $c['statut'] : $statut; // cf autorisations dans inc/instituer_objet if ($s != $statut OR ($d AND $d != $date)) { if ($id_rubrique ? - autoriser('publierdans', 'rubrique', $id_rubrique) + autoriser('publierdans', 'rubrique', $id_rubrique) : - autoriser('instituer', $objet, $id, null, array('statut'=>$s)) - ) + autoriser('instituer', $objet, $id, null, array('statut' => $s)) + ) { $statut = $champs['statut'] = $s; - else if ($s!='publie' AND autoriser('modifier', $objet, $id)) - $statut = $champs['statut'] = $s; - else - spip_log("editer_objet $id refus " . join(' ', $c)); + } else { + if ($s != 'publie' AND autoriser('modifier', $objet, $id)) { + $statut = $champs['statut'] = $s; + } else { + spip_log("editer_objet $id refus " . join(' ', $c)); + } + } // En cas de publication, fixer la date a "maintenant" // sauf si $c commande autre chose @@ -325,13 +349,14 @@ function objet_instituer($objet, $id, $c, $calcul_rub = true) { // En cas de proposition d'un objet (mais pas depublication), idem if ($champ_date) { if ($champs['statut'] == 'publie' - OR ($champs['statut'] == 'prop' AND !in_array($statut_ancien, array('publie', 'prop'))) - OR $d + OR ($champs['statut'] == 'prop' AND !in_array($statut_ancien, array('publie', 'prop'))) + OR $d ) { - if ($d OR strtotime($d=$date)>time()) + if ($d OR strtotime($d = $date) > time()) { $champs[$champ_date] = $date = $d; - else + } else { $champs[$champ_date] = $date = date('Y-m-d H:i:s'); + } } } } @@ -339,18 +364,21 @@ function objet_instituer($objet, $id, $c, $calcul_rub = true) { // Verifier que la rubrique demandee existe et est differente // de la rubrique actuelle if ($id_rubrique - AND isset($c['id_parent']) - AND $id_parent = $c['id_parent'] - AND $id_parent != $id_rubrique - AND (sql_fetsel('1', "spip_rubriques", "id_rubrique=".intval($id_parent)))) { + AND isset($c['id_parent']) + AND $id_parent = $c['id_parent'] + AND $id_parent != $id_rubrique + AND (sql_fetsel('1', "spip_rubriques", "id_rubrique=" . intval($id_parent))) + ) { $champs['id_rubrique'] = $id_parent; // si l'objet etait publie // et que le demandeur n'est pas admin de la rubrique // repasser l'objet en statut 'propose'. if ($statut == 'publie' - AND !autoriser('publierdans', 'rubrique', $id_rubrique)) + AND !autoriser('publierdans', 'rubrique', $id_rubrique) + ) { $champs['statut'] = 'prop'; + } } @@ -360,7 +388,7 @@ function objet_instituer($objet, $id, $c, $calcul_rub = true) { 'args' => array( 'table' => $table_sql, 'id_objet' => $id, - 'action'=>'instituer', + 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, 'id_parent_ancien' => $id_rubrique, @@ -369,7 +397,9 @@ function objet_instituer($objet, $id, $c, $calcul_rub = true) { ) ); - if (!count($champs)) return ''; + if (!count($champs)) { + return ''; + } // Envoyer les modifs. objet_editer_heritage($objet, $id, $id_rubrique, $statut_ancien, $champs, $calcul_rub); @@ -393,7 +423,7 @@ function objet_instituer($objet, $id, $c, $calcul_rub = true) { 'args' => array( 'table' => $table_sql, 'id_objet' => $id, - 'action'=>'instituer', + 'action' => 'instituer', 'statut_ancien' => $statut_ancien, 'date_ancienne' => $date_ancienne, 'id_parent_ancien' => $id_rubrique, @@ -405,7 +435,7 @@ function objet_instituer($objet, $id, $c, $calcul_rub = true) { // Notifications if ($notifications = charger_fonction('notifications', 'inc')) { $notifications("instituer$objet", $id, - array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date'=>$date, 'date_ancienne' => $date_ancienne) + array('statut' => $statut, 'statut_ancien' => $statut_ancien, 'date' => $date, 'date_ancienne' => $date_ancienne) ); } @@ -425,27 +455,32 @@ function objet_instituer($objet, $id, $c, $calcul_rub = true) { */ function objet_editer_heritage($objet, $id, $id_rubrique, $statut, $champs, $cond = true) { $table_sql = table_objet_sql($objet); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); // Si on deplace l'objet // changer aussi son secteur et sa langue (si heritee) if (isset($champs['id_rubrique'])) { - $row_rub = sql_fetsel("id_secteur, lang", "spip_rubriques", "id_rubrique=".sql_quote($champs['id_rubrique'])); + $row_rub = sql_fetsel("id_secteur, lang", "spip_rubriques", "id_rubrique=" . sql_quote($champs['id_rubrique'])); $langue = $row_rub['lang']; - if (isset($desc['field']['id_secteur'])) + if (isset($desc['field']['id_secteur'])) { $champs['id_secteur'] = $row_rub['id_secteur']; + } - if (isset($desc['field']['lang']) AND isset($desc['field']['langue_choisie'])) - if (sql_fetsel('1', $table_sql, id_table_objet($objet)."=".intval($id)." AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) { + if (isset($desc['field']['lang']) AND isset($desc['field']['langue_choisie'])) { + if (sql_fetsel('1', $table_sql, + id_table_objet($objet) . "=" . intval($id) . " AND langue_choisie<>'oui' AND lang<>" . sql_quote($langue))) { $champs['lang'] = $langue; } + } } - if (!$champs) return; - sql_updateq($table_sql, $champs, id_table_objet($objet).'='.intval($id)); + if (!$champs) { + return; + } + sql_updateq($table_sql, $champs, id_table_objet($objet) . '=' . intval($id)); // Changer le statut des rubriques concernees if ($cond) { diff --git a/ecrire/action/editer_rubrique.php b/ecrire/action/editer_rubrique.php index d99bc4c0f1..23ccdc21ad 100644 --- a/ecrire/action/editer_rubrique.php +++ b/ecrire/action/editer_rubrique.php @@ -12,10 +12,12 @@ /** * Gestion de l'action editer_rubrique et de l'API d'édition des rubriques - * + * * @package SPIP\Core\Rubriques\Edition */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/rubriques'); @@ -36,7 +38,7 @@ include_spip('inc/rubriques'); */ function action_editer_rubrique_dist($arg = null) { - if (is_null($arg)){ + if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } @@ -55,12 +57,12 @@ function action_editer_rubrique_dist($arg = null) { $redirect = parametre_url( urldecode(_request('redirect')), 'id_rubrique', $id_rubrique, '&'); - + include_spip('inc/headers'); redirige_par_entete($redirect); } - return array($id_rubrique,$err); + return array($id_rubrique, $err); } @@ -78,10 +80,12 @@ function rubrique_inserer($id_parent, $set = null) { $champs = array( 'titre' => _T('item_nouvelle_rubrique'), 'id_parent' => intval($id_parent), - 'statut' => 'prepa'); + 'statut' => 'prepa' + ); - if ($set) + if ($set) { $champs = array_merge($champs, $set); + } // Envoyer aux plugins $champs = pipeline('pre_insertion', @@ -92,7 +96,7 @@ function rubrique_inserer($id_parent, $set = null) { 'data' => $champs ) ); - + $id_rubrique = sql_insertq("spip_rubriques", $champs); pipeline('post_insertion', array( @@ -105,12 +109,13 @@ function rubrique_inserer($id_parent, $set = null) { ); propager_les_secteurs(); calculer_langues_rubriques(); + return $id_rubrique; } /** * Modifier une rubrique en base - * + * * @param int $id_rubrique * Identifiant de la rubrique modifiée * @param array|null $set @@ -126,8 +131,8 @@ function rubrique_modifier($id_rubrique, $set = null) { include_spip('inc/modifier'); $c = collecter_requests( - // white list - objet_info('rubrique','champs_editables'), + // white list + objet_info('rubrique', 'champs_editables'), // black list array('id_parent', 'confirme_deplace'), // donnees eventuellement fournies @@ -137,12 +142,14 @@ function rubrique_modifier($id_rubrique, $set = null) { if ($err = objet_modifier_champs('rubrique', $id_rubrique, array( 'data' => $set, - 'nonvide' => array('titre' => _T('titre_nouvelle_rubrique')." "._T('info_numero_abbreviation').$id_rubrique) + 'nonvide' => array('titre' => _T('titre_nouvelle_rubrique') . " " . _T('info_numero_abbreviation') . $id_rubrique) ), - $c)) + $c) + ) { return $err; + } - $c = collecter_requests(array('id_parent', 'confirme_deplace'),array(),$set); + $c = collecter_requests(array('id_parent', 'confirme_deplace'), array(), $set); // Deplacer la rubrique if (isset($c['id_parent'])) { $err = rubrique_instituer($id_rubrique, $c); @@ -153,16 +160,17 @@ function rubrique_modifier($id_rubrique, $set = null) { suivre_invalideur("id='rubrique/$id_rubrique'"); // et celui de menu_rubriques effacer_meta("date_calcul_rubriques"); + return $err; } /** * Déplace les brèves d'une rubrique dans le secteur d'un nouveau parent - * + * * Si c'est une rubrique-secteur contenant des brèves, on ne deplace * que si $confirme_deplace == 'oui', et change alors l'id_rubrique des * brèves en question - * + * * @todo À déporter dans le plugin brèves via un pipeline ? * * @param int $id_rubrique @@ -175,17 +183,20 @@ function rubrique_modifier($id_rubrique, $set = null) { * true si le déplacement est fait ou s'il n'y a rien à faire * false si la confirmation du déplacement n'est pas présente */ -function editer_rubrique_breves($id_rubrique, $id_parent, $c = array()) -{ - if (!sql_countsel('spip_breves', "id_rubrique=$id_rubrique")) +function editer_rubrique_breves($id_rubrique, $id_parent, $c = array()) { + if (!sql_countsel('spip_breves', "id_rubrique=$id_rubrique")) { return true; + } - if ($c['confirme_deplace'] != 'oui') + if ($c['confirme_deplace'] != 'oui') { return false; + } if ($id_secteur = sql_getfetsel("id_secteur", - "spip_rubriques", "id_rubrique=$id_parent")) + "spip_rubriques", "id_rubrique=$id_parent") + ) { sql_updateq("spip_breves", array("id_rubrique" => $id_secteur), "id_rubrique=$id_rubrique"); + } return true; } @@ -193,17 +204,17 @@ function editer_rubrique_breves($id_rubrique, $id_parent, $c = array()) /** * Instituer une rubrique (changer son parent) - * + * * Change le parent d'une rubrique, si les autorisations sont correctes, * mais n'accèpte pas de déplacer une rubrique dans une de ses filles, tout de même ! * * Recalcule les secteurs, les langues et déplace les brèves au passage. - * + * * @param int $id_rubrique * Identifiant de la rubrique à instituer * @param array $c * Informations pour l'institution (id_rubrique, confirme_deplace) - * @global array $GLOBALS['visiteur_session'] + * @global array $GLOBALS ['visiteur_session'] * @return string * Chaîne vide : aucune erreur * Chaîne : Texte du message d'erreur @@ -213,25 +224,25 @@ function rubrique_instituer($id_rubrique, $c) { // interdiction de deplacer vers ou a partir d'une rubrique // qu'on n'administre pas. - if (NULL !== ($id_parent = $c['id_parent'])) { + if (null !== ($id_parent = $c['id_parent'])) { $id_parent = intval($id_parent); $filles = calcul_branche_in($id_rubrique); - if (strpos(",$id_parent,", ",$filles,") !== false) + if (strpos(",$id_parent,", ",$filles,") !== false) { spip_log("La rubrique $id_rubrique ne peut etre fille de sa descendante $id_parent"); - else { + } else { $s = sql_fetsel("id_parent, statut", "spip_rubriques", "id_rubrique=$id_rubrique"); $old_parent = $s['id_parent']; if (!($id_parent != $old_parent - AND autoriser('publierdans', 'rubrique', $id_parent) - AND autoriser('creerrubriquedans', 'rubrique', $id_parent) - AND autoriser('publierdans', 'rubrique', $old_parent) - )) { + AND autoriser('publierdans', 'rubrique', $id_parent) + AND autoriser('creerrubriquedans', 'rubrique', $id_parent) + AND autoriser('publierdans', 'rubrique', $old_parent) + ) + ) { if ($s['statut'] != 'new') { - spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['visiteur_session']['id_auteur'] . ' '. $GLOBALS['visiteur_session']['statut']); + spip_log("deplacement de $id_rubrique vers $id_parent refuse a " . $GLOBALS['visiteur_session']['id_auteur'] . ' ' . $GLOBALS['visiteur_session']['statut']); } - } - elseif (editer_rubrique_breves($id_rubrique, $id_parent, $c)) { + } elseif (editer_rubrique_breves($id_rubrique, $id_parent, $c)) { $statut_ancien = $s['statut']; sql_updateq('spip_rubriques', array('id_parent' => $id_parent), "id_rubrique=$id_rubrique"); @@ -239,40 +250,43 @@ function rubrique_instituer($id_rubrique, $c) { propager_les_secteurs(); // Deplacement d'une rubrique publiee ==> chgt general de leur statut - if ($statut_ancien == 'publie') + if ($statut_ancien == 'publie') { calculer_rubriques_if($old_parent, array('id_rubrique' => $id_parent), $statut_ancien); + } // Creation ou deplacement d'une rubrique non publiee // invalider le cache de leur menu - elseif (!$statut_ancien || $old_parent!=$id_parent) + elseif (!$statut_ancien || $old_parent != $id_parent) { effacer_meta("date_calcul_rubriques"); + } calculer_langues_rubriques(); } } } + return ''; // pas d'erreur } /** - * Crée une rubrique + * Crée une rubrique * * @deprecated * Utiliser rubrique_inserer() * @see rubrique_inserer() - * + * * @param int $id_parent * Identifiant de la rubrique parente. * 0 pour la racine. * @return int * Identifiant de la rubrique crée -**/ + **/ function insert_rubrique($id_parent) { return rubrique_inserer($id_parent); } /** - * Modifie les contenus d'une rubrique + * Modifie les contenus d'une rubrique * * @deprecated * Utiliser rubrique_modifier() @@ -286,9 +300,9 @@ function insert_rubrique($id_parent) { * - false : Aucune modification, aucun champ n'est à modifier * - chaîne vide : Vide si tout s'est bien passé * - chaîne : Texte d'un message d'erreur -**/ + **/ function revisions_rubriques($id_rubrique, $set = null) { - return rubrique_modifier($id_rubrique,$set); + return rubrique_modifier($id_rubrique, $set); } /** @@ -297,7 +311,7 @@ function revisions_rubriques($id_rubrique, $set = null) { * @deprecated * Utiliser rubrique_instituer() * @see rubrique_instituer() - * + * * @param int $id_rubrique * Identifiant de la rubrique à instituer * @param array $c @@ -305,7 +319,7 @@ function revisions_rubriques($id_rubrique, $set = null) { * @return string * Chaine vide : aucune erreur * Chaîne : Texte du message d'erreur -**/ + **/ function instituer_rubrique($id_rubrique, $c) { return rubrique_instituer($id_rubrique, $c); } diff --git a/ecrire/action/etre_webmestre.php b/ecrire/action/etre_webmestre.php index 6c71cfa592..5a2b837c67 100644 --- a/ecrire/action/etre_webmestre.php +++ b/ecrire/action/etre_webmestre.php @@ -11,27 +11,31 @@ \***************************************************************************/ /** - * Gestion de l'action pour s'autoriser webmestre - * + * Gestion de l'action pour s'autoriser webmestre + * * @package SPIP\Core\Autorisations */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); /** * Prouver qu'on a les droits de webmestre via un ftp, et * devenir webmestre sans refaire l'install + * * @return void */ function action_etre_webmestre_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); $time = $securiser_action(); - if (time()-$time<15*60 - AND $GLOBALS['visiteur_session']['statut']=='0minirezo' - AND $GLOBALS['visiteur_session']['webmestre']!=='oui') { + if (time()-$time < 15*60 + AND $GLOBALS['visiteur_session']['statut'] == '0minirezo' + AND $GLOBALS['visiteur_session']['webmestre'] !== 'oui' + ) { $action = _T('info_admin_etre_webmestre'); $admin = charger_fonction('admin', 'inc'); // lance la verif par ftp et l'appel @@ -46,12 +50,14 @@ function action_etre_webmestre_dist() { /** * Passe l'administrateur connecté en webmestre. + * * @return void */ function base_etre_webmestre_dist() { - if ($GLOBALS['visiteur_session']['statut']=='0minirezo' AND $GLOBALS['visiteur_session']['webmestre']!=='oui') { + if ($GLOBALS['visiteur_session']['statut'] == '0minirezo' AND $GLOBALS['visiteur_session']['webmestre'] !== 'oui') { include_spip('action/editer_auteur'); - instituer_auteur($GLOBALS['visiteur_session']['id_auteur'], array('webmestre'=>'oui'), true); + instituer_auteur($GLOBALS['visiteur_session']['id_auteur'], array('webmestre' => 'oui'), true); } } + ?> diff --git a/ecrire/action/forcer_job.php b/ecrire/action/forcer_job.php index d3b8030b86..dfdd0d8412 100644 --- a/ecrire/action/forcer_job.php +++ b/ecrire/action/forcer_job.php @@ -16,19 +16,22 @@ * @package SPIP\Core\Job */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Executer un travaille immediatement + * * @return void */ -function action_forcer_job_dist(){ - $securiser_action = charger_fonction('securiser_action','inc'); +function action_forcer_job_dist() { + $securiser_action = charger_fonction('securiser_action', 'inc'); $id_job = $securiser_action(); if ($id_job = intval($id_job) - AND autoriser('forcer','job',$id_job) - ){ + AND autoriser('forcer', 'job', $id_job) + ) { include_spip('inc/queue'); include_spip('inc/genie'); queue_schedule(array($id_job)); diff --git a/ecrire/action/inscrire_auteur.php b/ecrire/action/inscrire_auteur.php index b863035acc..7c127a038d 100644 --- a/ecrire/action/inscrire_auteur.php +++ b/ecrire/action/inscrire_auteur.php @@ -14,13 +14,15 @@ * Gestion de l'inscription d'un auteur * * @package SPIP\Core\Inscription -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Inscrire un nouvel auteur sur la base de son nom et son email - * + * * L'email est utilisé pour repérer si il existe déjà ou non * => identifiant par défaut * @@ -34,42 +36,48 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * - force_nouveau : forcer le statut nouveau sur l'auteur inscrit, meme si il existait deja en base * @return array|string */ -function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()){ - if (!is_array($options)) - $options = array('id'=>$options); +function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = array()) { + if (!is_array($options)) { + $options = array('id' => $options); + } - if (function_exists('test_inscription')) + if (function_exists('test_inscription')) { $f = 'test_inscription'; - else $f = 'test_inscription_dist'; + } else { + $f = 'test_inscription_dist'; + } $desc = $f($statut, $mail_complet, $nom, $options); // erreur ? - if (!is_array($desc)) + if (!is_array($desc)) { return _T($desc); + } include_spip('base/abstract_sql'); $res = sql_select("statut, id_auteur, login, email", "spip_auteurs", "email=" . sql_quote($desc['email'])); // erreur ? - if (!$res) + if (!$res) { return _T('titre_probleme_technique'); + } $row = sql_fetch($res); sql_free($res); - if ($row){ - if (isset($options['force_nouveau']) AND $options['force_nouveau']==true){ + if ($row) { + if (isset($options['force_nouveau']) AND $options['force_nouveau'] == true) { $desc['id_auteur'] = $row['id_auteur']; $desc = inscription_nouveau($desc); - } - else + } else { $desc = $row; - } - else - // s'il n'existe pas deja, creer les identifiants + } + } else // s'il n'existe pas deja, creer les identifiants + { $desc = inscription_nouveau($desc); + } // erreur ? - if (!is_array($desc)) + if (!is_array($desc)) { return $desc; + } // generer le mot de passe (ou le refaire si compte inutilise) @@ -79,8 +87,8 @@ function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = ar $desc['jeton'] = auteur_attribuer_jeton($desc['id_auteur']); // charger de suite cette fonction, pour ses utilitaires - $envoyer_inscription = charger_fonction("envoyer_inscription",""); - list($sujet,$msg,$from,$head) = $envoyer_inscription($desc, $nom, $statut, $options); + $envoyer_inscription = charger_fonction("envoyer_inscription", ""); + list($sujet, $msg, $from, $head) = $envoyer_inscription($desc, $nom, $statut, $options); $notifications = charger_fonction('notifications', 'inc'); notifications_envoyer_mails($mail_complet, $msg, $sujet, $from, $head); @@ -99,10 +107,10 @@ function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = ar * et que l'adresse courriel est valide. * * On les normalise au passage (trim etc). - * + * * On peut redéfinir cette fonction pour filtrer les adresses mail et les noms, * et donner des infos supplémentaires - * + * * @param string $statut * @param string $mail * @param string $nom @@ -114,16 +122,21 @@ function action_inscrire_auteur_dist($statut, $mail_complet, $nom, $options = ar */ function test_inscription_dist($statut, $mail, $nom, $options) { include_spip('inc/filtres'); - if (!$r = email_valide($mail)) return 'info_email_invalide'; + if (!$r = email_valide($mail)) { + return 'info_email_invalide'; + } $nom = trim(corriger_caracteres($nom)); $res = array('email' => $r, 'nom' => $nom, 'prefs' => $statut); if (isset($options['login'])) { $login = trim(corriger_caracteres($options['login'])); - if((strlen ($login) >= _LOGIN_TROP_COURT) AND (strlen($nom) <= 64)) + if ((strlen($login) >= _LOGIN_TROP_COURT) AND (strlen($nom) <= 64)) { $res['login'] = $login; + } } - if(!isset($res['login']) AND ((strlen ($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64))) + if (!isset($res['login']) AND ((strlen($nom) < _LOGIN_TROP_COURT) OR (strlen($nom) > 64))) { return 'ecrire:info_login_trop_court'; + } + return $res; } @@ -136,25 +149,28 @@ function test_inscription_dist($statut, $mail, $nom, $options) { * @param array $desc * @return mixed|string */ -function inscription_nouveau($desc) -{ - if (!isset($desc['login']) OR !strlen($desc['login'])) +function inscription_nouveau($desc) { + if (!isset($desc['login']) OR !strlen($desc['login'])) { $desc['login'] = test_login($desc['nom'], $desc['email']); + } $desc['statut'] = 'nouveau'; include_spip('action/editer_auteur'); - if (isset($desc['id_auteur'])) + if (isset($desc['id_auteur'])) { $id_auteur = $desc['id_auteur']; - else + } else { $id_auteur = auteur_inserer(); + } - if (!$id_auteur) return _T('titre_probleme_technique'); + if (!$id_auteur) { + return _T('titre_probleme_technique'); + } include_spip('inc/autoriser'); // lever l'autorisation pour pouvoir modifier le statut - autoriser_exception('modifier','auteur',$id_auteur); + autoriser_exception('modifier', 'auteur', $id_auteur); auteur_modifier($id_auteur, $desc); - autoriser_exception('modifier','auteur',$id_auteur,false); + autoriser_exception('modifier', 'auteur', $id_auteur, false); $desc['id_auteur'] = $id_auteur; @@ -179,30 +195,33 @@ function test_login($nom, $mail) { $mail = strtolower(translitteration(preg_replace('/@.*/', '', $mail))); $login_base = preg_replace("/[^\w\d]/", "_", $mail); } - if (strlen($login_base) < 3) + if (strlen($login_base) < 3) { $login_base = 'user'; + } // eviter aussi qu'il soit trop long (essayer d'attraper le prenom) if (strlen($login_base) > 10) { $login_base = preg_replace("/^(.{4,}(_.{1,7})?)_.*/", '\1', $login_base); - $login_base = substr($login_base, 0,13); + $login_base = substr($login_base, 0, 13); } $login = $login_base; for ($i = 1; ; $i++) { - if (!sql_countsel('spip_auteurs', "login='$login'")) + if (!sql_countsel('spip_auteurs', "login='$login'")) { return $login; - $login = $login_base.$i; + } + $login = $login_base . $i; } + return $login; } /** * Construction du mail envoyant les identifiants - * + * * Fonction redefinissable qui doit retourner un tableau * dont les elements seront les arguments de inc_envoyer_mail * @@ -214,23 +233,24 @@ function test_login($nom, $mail) { */ function envoyer_inscription_dist($desc, $nom, $mode, $options = array()) { - $contexte = array_merge($desc,$options); + $contexte = array_merge($desc, $options); $contexte['nom'] = $nom; $contexte['mode'] = $mode; - $contexte['url_confirm'] = generer_url_action('confirmer_inscription','',true,true); - $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'email',$desc['email']); - $contexte['url_confirm'] = parametre_url($contexte['url_confirm'],'jeton',$desc['jeton']); + $contexte['url_confirm'] = generer_url_action('confirmer_inscription', '', true, true); + $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'email', $desc['email']); + $contexte['url_confirm'] = parametre_url($contexte['url_confirm'], 'jeton', $desc['jeton']); - $message = recuperer_fond('modeles/mail_inscription',$contexte); - $from = (isset($options['from'])?$options['from']:null); + $message = recuperer_fond('modeles/mail_inscription', $contexte); + $from = (isset($options['from']) ? $options['from'] : null); $head = null; - return array("", $message,$from,$head); + + return array("", $message, $from, $head); } /** * Creer un mot de passe initial aleatoire - * + * * @param int $id_auteur * @return string */ @@ -238,7 +258,8 @@ function creer_pass_pour_auteur($id_auteur) { include_spip('inc/acces'); $pass = creer_pass_aleatoire(8, $id_auteur); include_spip('action/editer_auteur'); - auteur_instituer($id_auteur, array('pass'=>$pass)); + auteur_instituer($id_auteur, array('pass' => $pass)); + return $pass; } @@ -251,14 +272,16 @@ function creer_pass_pour_auteur($id_auteur) { * @param int $id * @return string */ -function tester_statut_inscription($statut_tmp, $id){ +function tester_statut_inscription($statut_tmp, $id) { include_spip('inc/autoriser'); - if ($statut_tmp) + if ($statut_tmp) { return autoriser('inscrireauteur', $statut_tmp, $id) ? $statut_tmp : ''; - elseif ( - autoriser('inscrireauteur', $statut_tmp = "1comite", $id) - OR autoriser('inscrireauteur', $statut_tmp = "6forum", $id)) + } elseif ( + autoriser('inscrireauteur', $statut_tmp = "1comite", $id) + OR autoriser('inscrireauteur', $statut_tmp = "6forum", $id) + ) { return $statut_tmp; + } return ''; } @@ -273,27 +296,31 @@ function tester_statut_inscription($statut_tmp, $id){ * @param array $auteur * @return array */ -function confirmer_statut_inscription($auteur){ +function confirmer_statut_inscription($auteur) { // securite - if ($auteur['statut'] != 'nouveau') return $auteur; + if ($auteur['statut'] != 'nouveau') { + return $auteur; + } include_spip('inc/autoriser'); - if (!autoriser('inscrireauteur', $auteur['prefs'])) + if (!autoriser('inscrireauteur', $auteur['prefs'])) { return $auteur; + } $s = $auteur['prefs']; include_spip('inc/autoriser'); // accorder l'autorisation de modif du statut auteur - autoriser_exception('modifier','auteur',$auteur['id_auteur']); + autoriser_exception('modifier', 'auteur', $auteur['id_auteur']); include_spip('action/editer_auteur'); // changer le statut - auteur_modifier($auteur['id_auteur'],array('statut'=> $s)); + auteur_modifier($auteur['id_auteur'], array('statut' => $s)); unset($_COOKIE['spip_session']); // forcer la maj de la session // lever l'autorisation de modif du statut auteur - autoriser_exception('modifier','auteur',$auteur['id_auteur'],false); + autoriser_exception('modifier', 'auteur', $auteur['id_auteur'], false); // mettre a jour le statut $auteur['statut'] = $s; + return $auteur; } @@ -301,32 +328,36 @@ function confirmer_statut_inscription($auteur){ /** * Attribuer un jeton temporaire pour un auteur * en assurant l'unicite du jeton + * * @param int $id_auteur * @return string */ -function auteur_attribuer_jeton($id_auteur){ +function auteur_attribuer_jeton($id_auteur) { include_spip('inc/acces'); // s'assurer de l'unicite du jeton pour le couple (email,cookie) do { $jeton = creer_uniqid(); sql_updateq("spip_auteurs", array("cookie_oubli" => $jeton), "id_auteur=" . intval($id_auteur)); - } - while (sql_countsel("spip_auteurs","cookie_oubli=".sql_quote($jeton))>1); + } while (sql_countsel("spip_auteurs", "cookie_oubli=" . sql_quote($jeton)) > 1); + return $jeton; } /** * Retrouver l'auteur par son jeton + * * @param string $jeton * @return array|bool */ -function auteur_verifier_jeton($jeton){ +function auteur_verifier_jeton($jeton) { // refuser un jeton corrompu - if (preg_match(',[^0-9a-f.],i',$jeton)) + if (preg_match(',[^0-9a-f.],i', $jeton)) { return false; - + } + // on peut tomber sur un jeton compose uniquement de chiffres, il faut forcer le $type pour sql_quote pour eviter de planter - $desc = sql_fetsel('*','spip_auteurs',"cookie_oubli=".sql_quote($jeton, $serveur, 'string')); + $desc = sql_fetsel('*', 'spip_auteurs', "cookie_oubli=" . sql_quote($jeton, $serveur, 'string')); + return $desc; } @@ -336,6 +367,6 @@ function auteur_verifier_jeton($jeton){ * @param int $id_auteur * @return bool */ -function auteur_effacer_jeton($id_auteur){ +function auteur_effacer_jeton($id_auteur) { return sql_updateq("spip_auteurs", array("cookie_oubli" => ''), "id_auteur=" . intval($id_auteur)); } diff --git a/ecrire/action/instituer_langue_objet.php b/ecrire/action/instituer_langue_objet.php index 5ef8cc788c..5c4d99074f 100644 --- a/ecrire/action/instituer_langue_objet.php +++ b/ecrire/action/instituer_langue_objet.php @@ -14,12 +14,15 @@ * Action des changements de langue des objets éditoriaux * * @package SPIP\Core\Edition -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Modifier la langue d'un objet + * * @param string $objet * @param int $id * @param int $id_rubrique @@ -32,18 +35,21 @@ function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_ $id_table_objet = id_table_objet($objet); if ($changer_lang != "herit") { - sql_updateq($table_objet_sql, array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "$id_table_objet=".intval($id)); + sql_updateq($table_objet_sql, array('lang' => $changer_lang, 'langue_choisie' => 'oui'), + "$id_table_objet=" . intval($id)); include_spip('inc/rubriques'); - if ($table_objet_sql == 'spip_rubriques') + if ($table_objet_sql == 'spip_rubriques') { calculer_langues_rubriques(); + } $langues = calculer_langues_utilisees(); ecrire_meta('langues_utilisees', $langues); - } - else { + } else { $langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=" . intval($id_rubrique)); - if (!$langue_parent) + if (!$langue_parent) { $langue_parent = $GLOBALS['meta']['langue_site']; - sql_updateq($table_objet_sql, array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "$id_table_objet=".intval($id)); + } + sql_updateq($table_objet_sql, array('lang' => $langue_parent, 'langue_choisie' => 'non'), + "$id_table_objet=" . intval($id)); $changer_lang = $langue_parent; if ($table_objet_sql == 'spip_rubriques') { include_spip('inc/rubriques'); @@ -51,5 +57,6 @@ function action_instituer_langue_objet_dist($objet, $id, $id_rubrique, $changer_ } } } + return $changer_lang; } diff --git a/ecrire/action/instituer_langue_rubrique.php b/ecrire/action/instituer_langue_rubrique.php index 19a3a5e125..d8b461cb4f 100644 --- a/ecrire/action/instituer_langue_rubrique.php +++ b/ecrire/action/instituer_langue_rubrique.php @@ -14,13 +14,15 @@ * Action des changements de langue des rubriques * * @package SPIP\Core\Edition -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Modifie la langue d'une rubrique -**/ + **/ function action_instituer_langue_rubrique_dist() { $securiser_action = charger_fonction('securiser_action', 'inc'); @@ -30,18 +32,21 @@ function action_instituer_langue_rubrique_dist() { list($id_rubrique, $id_parent) = preg_split('/\W/', $arg); if ($changer_lang - AND $id_rubrique>0 - AND $GLOBALS['meta']['multi_rubriques'] == 'oui' - AND ($GLOBALS['meta']['multi_secteurs'] == 'non' OR $id_parent == 0)) { - if ($changer_lang != "herit") - sql_updateq('spip_rubriques', array('lang'=>$changer_lang, 'langue_choisie'=>'oui'), "id_rubrique=$id_rubrique"); - else { - if ($id_parent == 0) + AND $id_rubrique > 0 + AND $GLOBALS['meta']['multi_rubriques'] == 'oui' + AND ($GLOBALS['meta']['multi_secteurs'] == 'non' OR $id_parent == 0) + ) { + if ($changer_lang != "herit") { + sql_updateq('spip_rubriques', array('lang' => $changer_lang, 'langue_choisie' => 'oui'), + "id_rubrique=$id_rubrique"); + } else { + if ($id_parent == 0) { $langue_parent = $GLOBALS['meta']['langue_site']; - else { + } else { $langue_parent = sql_getfetsel("lang", "spip_rubriques", "id_rubrique=$id_parent"); } - sql_updateq('spip_rubriques', array('lang'=>$langue_parent, 'langue_choisie'=>'non'), "id_rubrique=$id_rubrique"); + sql_updateq('spip_rubriques', array('lang' => $langue_parent, 'langue_choisie' => 'non'), + "id_rubrique=$id_rubrique"); } include_spip('inc/rubriques'); calculer_langues_rubriques(); @@ -51,4 +56,5 @@ function action_instituer_langue_rubrique_dist() { suivre_invalideur("id='rubrique/$id_rubrique'"); } } + ?> diff --git a/ecrire/action/instituer_objet.php b/ecrire/action/instituer_objet.php index 3eb6ddd57c..a0074dc2c1 100644 --- a/ecrire/action/instituer_objet.php +++ b/ecrire/action/instituer_objet.php @@ -12,34 +12,42 @@ /** * Action pour instituer un objet avec les puces rapides - * + * * @package SPIP\Core\PuceStatut */ -if (!defined("_ECRIRE_INC_VERSION")) return; +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** * Instituer un objet avec les puces rapides + * * @param null|string $arg * Chaîne "objet id statut". En absence utilise l'argument * de l'action sécurisée. */ function action_instituer_objet_dist($arg = null) { - if (is_null($arg)){ + if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } list($objet, $id_objet, $statut) = preg_split('/\W/', $arg); - if (!$statut) $statut = _request('statut_nouv'); // cas POST - if (!$statut) return; // impossible mais sait-on jamais + if (!$statut) { + $statut = _request('statut_nouv'); + } // cas POST + if (!$statut) { + return; + } // impossible mais sait-on jamais if ($id_objet = intval($id_objet) - AND autoriser('instituer',$objet,$id_objet,'',array('statut'=>$statut))){ + AND autoriser('instituer', $objet, $id_objet, '', array('statut' => $statut)) + ) { include_spip('action/editer_objet'); - objet_modifier($objet,$id_objet,array('statut' => $statut)); + objet_modifier($objet, $id_objet, array('statut' => $statut)); } } diff --git a/ecrire/action/logout.php b/ecrire/action/logout.php index 7f40809208..f73eb6adad 100644 --- a/ecrire/action/logout.php +++ b/ecrire/action/logout.php @@ -16,13 +16,15 @@ * @package SPIP\Core\Authentification */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/cookie'); /** * Se déloger - * + * * Pour éviter les CSRF on passe par une étape de confirmation si pas de jeton fourni * avec un autosubmit js pour ne pas compliquer l'expérience utilisateur * @@ -31,40 +33,43 @@ include_spip('inc/cookie'); * de l'espace public. * */ -function action_logout_dist() -{ - $logout =_request('logout'); +function action_logout_dist() { + $logout = _request('logout'); $url = securiser_redirect_action(_request('url')); // cas particulier, logout dans l'espace public - if ($logout == 'public' AND !$url) + if ($logout == 'public' AND !$url) { $url = url_de_base(); + } // seul le loge peut se deloger (mais id_auteur peut valoir 0 apres une restauration avortee) - if (isset($GLOBALS['visiteur_session']['id_auteur']) + if (isset($GLOBALS['visiteur_session']['id_auteur']) AND is_numeric($GLOBALS['visiteur_session']['id_auteur']) // des sessions anonymes avec id_auteur=0 existent, mais elle n'ont pas de statut : double check - AND isset($GLOBALS['visiteur_session']['statut'])) { + AND isset($GLOBALS['visiteur_session']['statut']) + ) { // il faut un jeton pour fermer la session (eviter les CSRF) if (!$jeton = _request('jeton') - OR !verifier_jeton_logout($jeton,$GLOBALS['visiteur_session'])){ + OR !verifier_jeton_logout($jeton, $GLOBALS['visiteur_session']) + ) { $jeton = generer_jeton_logout($GLOBALS['visiteur_session']); - $action = generer_url_action("logout","jeton=$jeton"); - $action = parametre_url($action,'logout',_request('logout')); - $action = parametre_url($action,'url',_request('url')); + $action = generer_url_action("logout", "jeton=$jeton"); + $action = parametre_url($action, 'logout', _request('logout')); + $action = parametre_url($action, 'url', _request('url')); include_spip("inc/minipres"); include_spip("inc/filtres"); - $texte = bouton_action(_T('spip:icone_deconnecter'),$action); + $texte = bouton_action(_T('spip:icone_deconnecter'), $action); $texte = "<div class='boutons'>$texte</div>"; $texte .= '<script type="text/javascript">document.write("<style>body{visibility:hidden;}</style>");window.document.forms[0].submit();</script>'; - $res = minipres(_T('spip:icone_deconnecter'),$texte,'',true); + $res = minipres(_T('spip:icone_deconnecter'), $texte, '', true); echo $res; + return; } include_spip('inc/auth'); auth_trace($GLOBALS['visiteur_session'], '0000-00-00 00:00:00'); - // le logout explicite vaut destruction de toutes les sessions + // le logout explicite vaut destruction de toutes les sessions if (isset($_COOKIE['spip_session'])) { $session = charger_fonction('session', 'inc'); $session($GLOBALS['visiteur_session']['id_auteur']); @@ -74,14 +79,15 @@ function action_logout_dist() // pour se deconnecter, il faut proposer un nouveau formulaire de connexion http if (isset($_SERVER['PHP_AUTH_USER']) AND !$GLOBALS['ignore_auth_http'] - AND $GLOBALS['auth_can_disconnect']) { - ask_php_auth(_T('login_deconnexion_ok'), - _T('login_verifiez_navigateur'), - _T('login_retour_public'), - "redirect=". _DIR_RESTREINT_ABS, - _T('login_test_navigateur'), - true); - + AND $GLOBALS['auth_can_disconnect'] + ) { + ask_php_auth(_T('login_deconnexion_ok'), + _T('login_verifiez_navigateur'), + _T('login_retour_public'), + "redirect=" . _DIR_RESTREINT_ABS, + _T('login_test_navigateur'), + true); + } } @@ -94,13 +100,14 @@ function action_logout_dist() /** * Generer un jeton de logout personnel et ephemere + * * @param array $session * @param null|string $alea * @return string */ -function generer_jeton_logout($session, $alea = null){ - if (is_null($alea)){ - if (!isset($GLOBALS['meta']['alea_ephemere'])){ +function generer_jeton_logout($session, $alea = null) { + if (is_null($alea)) { + if (!isset($GLOBALS['meta']['alea_ephemere'])) { include_spip('base/abstract_sql'); $GLOBALS['meta']['alea_ephemere'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere'"); } @@ -108,10 +115,11 @@ function generer_jeton_logout($session, $alea = null){ } $jeton = md5($session['date_session'] - .$session['id_auteur'] - .$session['statut'] - .$alea + . $session['id_auteur'] + . $session['statut'] + . $alea ); + return $jeton; } @@ -119,19 +127,23 @@ function generer_jeton_logout($session, $alea = null){ * Verifier que le jeton de logout est bon * il faut verifier avec alea_ephemere_ancien si pas bon avec alea_ephemere * pour gerer le cas de la rotation d'alea + * * @param string $jeton * @param array $session * @return bool */ -function verifier_jeton_logout($jeton, $session){ - if (generer_jeton_logout($session)===$jeton) +function verifier_jeton_logout($jeton, $session) { + if (generer_jeton_logout($session) === $jeton) { return true; - if (!isset($GLOBALS['meta']['alea_ephemere_ancien'])){ + } + if (!isset($GLOBALS['meta']['alea_ephemere_ancien'])) { include_spip('base/abstract_sql'); $GLOBALS['meta']['alea_ephemere_ancien'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere_ancien'"); } - if (generer_jeton_logout($session,$GLOBALS['meta']['alea_ephemere_ancien'])===$jeton) + if (generer_jeton_logout($session, $GLOBALS['meta']['alea_ephemere_ancien']) === $jeton) { return true; + } + return false; } diff --git a/ecrire/action/menu_rubriques.php b/ecrire/action/menu_rubriques.php index ec3952cd44..55e5866f81 100644 --- a/ecrire/action/menu_rubriques.php +++ b/ecrire/action/menu_rubriques.php @@ -13,44 +13,48 @@ /** * Gestion de l'action d'affichage du navigateur de rubrique du bandeau * - * @package SPIP\Core\Rubriques -**/ + * @package SPIP\Core\Rubriques + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/autoriser'); include_spip('inc/texte'); include_spip('inc/filtres'); /** - * Action d'affichage en ajax du navigateur de rubrique du bandeau + * Action d'affichage en ajax du navigateur de rubrique du bandeau * * @uses gen_liste_rubriques() * @uses menu_rubriques() - * + * * @return string * Code HTML présentant la liste des rubriques -**/ + **/ function action_menu_rubriques_dist() { // si pas acces a ecrire, pas acces au menu // on renvoi un 401 qui fait echouer la requete ajax silencieusement - if (!autoriser('ecrire')){ - $retour = "<ul class='cols_1'><li class='toutsite'><a href='".generer_url_ecrire('accueil')."'>"._T('public:lien_connecter')."</a></li></ul>"; + if (!autoriser('ecrire')) { + $retour = "<ul class='cols_1'><li class='toutsite'><a href='" . generer_url_ecrire('accueil') . "'>" . _T('public:lien_connecter') . "</a></li></ul>"; include_spip('inc/actions'); ajax_retour($retour); exit; } - if ($date = intval(_request('date'))) - header("Last-Modified: ".gmdate("D, d M Y H:i:s", $date)." GMT"); + if ($date = intval(_request('date'))) { + header("Last-Modified: " . gmdate("D, d M Y H:i:s", $date) . " GMT"); + } $r = gen_liste_rubriques(); if (!$r - AND isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) - AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/')) { + AND isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) + AND !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/') + ) { include_spip('inc/headers'); - header('Content-Type: text/html; charset='. $GLOBALS['meta']['charset']); + header('Content-Type: text/html; charset=' . $GLOBALS['meta']['charset']); http_status(304); exit; } else { @@ -66,18 +70,18 @@ function action_menu_rubriques_dist() { * @param bool $complet * - false pour n'avoir que le bouton racine «plan du site» * - true pour avoir l'ensemble des rubriques en plus - * + * * @return string * Code HTML présentant la liste des rubriques -**/ -function menu_rubriques($complet = true){ - $ret = "<li class='toutsite'><a href='".generer_url_ecrire('plan')."'>"._T('info_tout_site')."</a></li>"; + **/ +function menu_rubriques($complet = true) { + $ret = "<li class='toutsite'><a href='" . generer_url_ecrire('plan') . "'>" . _T('info_tout_site') . "</a></li>"; if (!$complet) { return "<ul class='cols_1'>$ret\n</ul>\n"; } - if (!isset($GLOBALS['db_art_cache'])){ + if (!isset($GLOBALS['db_art_cache'])) { gen_liste_rubriques(); } $arr_low = extraire_article(0, $GLOBALS['db_art_cache']); @@ -85,22 +89,24 @@ function menu_rubriques($complet = true){ $total_lignes = $i = sizeof($arr_low); if ($i > 0) { - $nb_col = min(8,ceil($total_lignes / 30)); - if ($nb_col <= 1) $nb_col = ceil($total_lignes / 10); - foreach( $arr_low as $id_rubrique => $titre_rubrique) { - if (autoriser('voir','rubrique',$id_rubrique)){ - $ret .= bandeau_rubrique($id_rubrique, $titre_rubrique, $i); - $i++; + $nb_col = min(8, ceil($total_lignes/30)); + if ($nb_col <= 1) { + $nb_col = ceil($total_lignes/10); + } + foreach ($arr_low as $id_rubrique => $titre_rubrique) { + if (autoriser('voir', 'rubrique', $id_rubrique)) { + $ret .= bandeau_rubrique($id_rubrique, $titre_rubrique, $i); + $i++; } } $ret = "<ul class='cols_$nb_col'>" - . $ret - . "\n</ul>\n"; - } - else + . $ret + . "\n</ul>\n"; + } else { $ret = "<ul class='cols_1'>$ret\n</ul>\n"; - + } + return $ret; } @@ -108,29 +114,30 @@ function menu_rubriques($complet = true){ * Retourne une liste HTML des rubriques enfants d'une rubrique * * @uses extraire_article() - * + * * @param int $id_rubrique * Identifiant de la rubrique parente * @param string $titre_rubrique * Titre de cette rubrique * @param int $zdecal * Décalage vertical, en nombre d'élément - * + * * @return string * Code HTML présentant la liste des rubriques -**/ + **/ function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal) { static $zmax = 6; $nav = "<a href='" - . generer_url_entite($id_rubrique,'rubrique','','',false) - . "'>" - . supprimer_tags(preg_replace(',[\x00-\x1f]+,', ' ', $titre_rubrique)) - . "</a>\n"; + . generer_url_entite($id_rubrique, 'rubrique', '', '', false) + . "'>" + . supprimer_tags(preg_replace(',[\x00-\x1f]+,', ' ', $titre_rubrique)) + . "</a>\n"; // Limiter volontairement le nombre de sous-menus if (!(--$zmax)) { $zmax++; + return "\n<li>$nav</li>"; } @@ -138,17 +145,18 @@ function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal) { $i = sizeof($arr_rub); if (!$i) { $zmax++; + return "\n<li>$nav</li>"; } $nb_col = 1; if ($nb_rub = count($arr_rub)) { - $nb_col = min(10,max(1,ceil($nb_rub / 10))); + $nb_col = min(10, max(1, ceil($nb_rub/10))); } $ret = "<li class='haschild'>$nav<ul class='cols_$nb_col'>"; - foreach( $arr_rub as $id_rub => $titre_rub) { - if (autoriser('voir','rubrique',$id_rub)){ + foreach ($arr_rub as $id_rub => $titre_rub) { + if (autoriser('voir', 'rubrique', $id_rub)) { $titre = supprimer_numero(typo($titre_rub)); $ret .= bandeau_rubrique($id_rub, $titre, $zdecal+$i); $i++; @@ -156,6 +164,7 @@ function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal) { } $ret .= "</ul></li>\n"; $zmax++; + return $ret; } @@ -165,16 +174,16 @@ function bandeau_rubrique($id_rubrique, $titre_rubrique, $zdecal) { * du navigateur de rubrique * * @see gen_liste_rubriques() pour le calcul du cache - * + * * @param int $id_p * Identifiant de la rubrique parente des articles * @param array $t * Cache des rubriques * @return array * Liste des rubriques enfants de la rubrique (et leur titre) -**/ + **/ function extraire_article($id_p, $t) { - return array_key_exists($id_p, $t) ? $t[$id_p]: array(); + return array_key_exists($id_p, $t) ? $t[$id_p] : array(); } /** @@ -185,21 +194,24 @@ function extraire_article($id_p, $t) { * - réactualisé en fonction de la meta `date_calcul_rubriques` * - mis en cache dans le fichier défini par la constante `_CACHE_RUBRIQUES` * - stocké également dans la globale `db_art_cache` - * + * * @return bool true. -**/ + **/ function gen_liste_rubriques() { include_spip('inc/config'); // ici, un petit fichier cache ne fait pas de mal $last = lire_config('date_calcul_rubriques', 0); if (lire_fichier(_CACHE_RUBRIQUES, $cache)) { - list($date,$GLOBALS['db_art_cache']) = @unserialize($cache); - if ($date == $last) return false; // c'etait en cache :-) + list($date, $GLOBALS['db_art_cache']) = @unserialize($cache); + if ($date == $last) { + return false; + } // c'etait en cache :-) } // se restreindre aux rubriques utilisees recemment +secteurs - $where = sql_in_select("id_rubrique", "id_rubrique", "spip_rubriques", "", "", "id_parent=0 DESC, date DESC", _CACHE_RUBRIQUES_MAX); + $where = sql_in_select("id_rubrique", "id_rubrique", "spip_rubriques", "", "", "id_parent=0 DESC, date DESC", + _CACHE_RUBRIQUES_MAX); // puis refaire la requete pour avoir l'ordre alphabetique @@ -215,6 +227,8 @@ function gen_liste_rubriques() { $t = array($last ? $last : time(), $GLOBALS['db_art_cache']); ecrire_fichier(_CACHE_RUBRIQUES, serialize($t)); + return true; } + ?> diff --git a/ecrire/action/preferer.php b/ecrire/action/preferer.php index 27fba0e6db..764da94a13 100644 --- a/ecrire/action/preferer.php +++ b/ecrire/action/preferer.php @@ -18,21 +18,23 @@ * * @see ecrire/oo/index.php * @see prive/formulaires/configurer_preferences.php - * + * * @package SPIP\Core\Auteurs\Preferences -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action de sauvegarde des préférences d'un auteur * * Définit une préférence d'un auteur pour l'affichage dans l'espace privé. - * + * * @deprecated * @see prive/formulaires/configurer_preferences.php -**/ + **/ function action_preferer_dist() { // // Preferences de presentation de l'espace prive @@ -40,41 +42,46 @@ function action_preferer_dist() { if ($_GET['arg'] !== 'display:4') { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); - } else $arg = $_GET['arg']; + } else { + $arg = $_GET['arg']; + } - if (!preg_match(",^(.+):(.*)$,", $arg, $r)) + if (!preg_match(",^(.+):(.*)$,", $arg, $r)) { spip_log("action_preferer_dist: $arg pas compris"); - else { - $prefs_mod = false; + } else { + $prefs_mod = false; - list(, $op, $val) = $r; - if ($op == 'couleur') { - $GLOBALS['visiteur_session']['prefs']['couleur'] = $val; - $prefs_mod = true; - } - elseif ($op == 'display') { - $GLOBALS['visiteur_session']['prefs']['display'] = $val; - $prefs_mod = true; - } - elseif ($op == 'display_outils') { - $GLOBALS['visiteur_session']['prefs']['display_outils'] = $val; - $prefs_mod = true; - } + list(, $op, $val) = $r; + if ($op == 'couleur') { + $GLOBALS['visiteur_session']['prefs']['couleur'] = $val; + $prefs_mod = true; + } elseif ($op == 'display') { + $GLOBALS['visiteur_session']['prefs']['display'] = $val; + $prefs_mod = true; + } elseif ($op == 'display_outils') { + $GLOBALS['visiteur_session']['prefs']['display_outils'] = $val; + $prefs_mod = true; + } - if ($prefs_mod AND intval($GLOBALS['visiteur_session']['id_auteur'])) - sql_updateq('spip_auteurs', array('prefs' => serialize($GLOBALS['visiteur_session']['prefs'])), "id_auteur=" .intval($GLOBALS['visiteur_session']['id_auteur'])); - - if ($op == 'spip_ecran') { - // Poser un cookie, - // car ce reglage depend plus du navigateur que de l'utilisateur - $GLOBALS['spip_ecran'] = $val; - include_spip('inc/cookie'); - spip_setcookie('spip_ecran', $val, time() + 365 * 24 * 3600); - } + if ($prefs_mod AND intval($GLOBALS['visiteur_session']['id_auteur'])) { + sql_updateq('spip_auteurs', array('prefs' => serialize($GLOBALS['visiteur_session']['prefs'])), + "id_auteur=" . intval($GLOBALS['visiteur_session']['id_auteur'])); + } - // Si modif des couleurs en ajax, redirect inutile on a change de CSS - if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') exit; + if ($op == 'spip_ecran') { + // Poser un cookie, + // car ce reglage depend plus du navigateur que de l'utilisateur + $GLOBALS['spip_ecran'] = $val; + include_spip('inc/cookie'); + spip_setcookie('spip_ecran', $val, time()+365*24*3600); + } + + // Si modif des couleurs en ajax, redirect inutile on a change de CSS + if ($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { + exit; + } } } + ?> diff --git a/ecrire/action/purger.php b/ecrire/action/purger.php index 358d4d9e4d..bd2805d215 100644 --- a/ecrire/action/purger.php +++ b/ecrire/action/purger.php @@ -14,8 +14,10 @@ * Gestion de l'action purger pour nettoyer le cache * * @package SPIP\Core\Cache -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action de purge du cache @@ -31,13 +33,12 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @pipeline_appel trig_purger * @uses supprime_invalideurs() * @uses purger_repertoire() - * + * * @param string|null $arg * Argument attendu. En absence utilise l'argument * de l'action sécurisée. */ -function action_purger_dist($arg = null) -{ +function action_purger_dist($arg = null) { if (is_null($arg)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); @@ -50,7 +51,7 @@ function action_purger_dist($arg = null) switch ($arg) { case 'inhibe_cache': // inhiber le cache pendant 24h - ecrire_meta('cache_inhib',$_SERVER['REQUEST_TIME']+24*3600); + ecrire_meta('cache_inhib', $_SERVER['REQUEST_TIME']+24*3600); break; case 'reactive_cache': effacer_meta('cache_inhib'); @@ -60,7 +61,7 @@ function action_purger_dist($arg = null) supprime_invalideurs(); @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_CHEMIN); - @spip_unlink(_DIR_TMP."plugin_xml_cache.gz"); + @spip_unlink(_DIR_TMP . "plugin_xml_cache.gz"); // on ne supprime que _CACHE_PLUGINS_OPT qui declenche la reconstruction des 3 // _CACHE_PIPELINES _CACHE_PLUGINS_PATH et _CACHE_PLUGINS_FCT // pour eviter des problemes de concurence @@ -69,10 +70,10 @@ function action_purger_dist($arg = null) //@spip_unlink(_CACHE_PLUGINS_PATH); //@spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_PLUGINS_OPT); - purger_repertoire(_DIR_CACHE,array('subdir'=>true)); + purger_repertoire(_DIR_CACHE, array('subdir' => true)); purger_repertoire(_DIR_AIDE); - purger_repertoire(_DIR_VAR.'cache-css'); - purger_repertoire(_DIR_VAR.'cache-js'); + purger_repertoire(_DIR_VAR . 'cache-css'); + purger_repertoire(_DIR_VAR . 'cache-js'); break; case 'squelettes': @@ -80,14 +81,14 @@ function action_purger_dist($arg = null) break; case 'vignettes': - purger_repertoire(_DIR_VAR,array('subdir'=>true)); + purger_repertoire(_DIR_VAR, array('subdir' => true)); supprime_invalideurs(); - purger_repertoire(_DIR_CACHE,array('subdir'=>true)); + purger_repertoire(_DIR_CACHE, array('subdir' => true)); break; } // le faire savoir aux plugins - pipeline('trig_purger',$arg); + pipeline('trig_purger', $arg); } ?> diff --git a/ecrire/action/purger_queue.php b/ecrire/action/purger_queue.php index 6d13cf6bb3..462c47e54a 100644 --- a/ecrire/action/purger_queue.php +++ b/ecrire/action/purger_queue.php @@ -14,18 +14,21 @@ * Gestion de l'action de purge des travaux en attente * * @package SPIP\Core\Queue -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Purger la liste des travaux en attente + * * @return void */ -function action_purger_queue_dist(){ - $securiser_action = charger_fonction('securiser_action','inc'); +function action_purger_queue_dist() { + $securiser_action = charger_fonction('securiser_action', 'inc'); $securiser_action(); - if (autoriser('purger','queue')){ + if (autoriser('purger', 'queue')) { include_spip('inc/queue'); queue_purger(); } diff --git a/ecrire/action/redirect.php b/ecrire/action/redirect.php index bca287f117..1d62cd0aaa 100644 --- a/ecrire/action/redirect.php +++ b/ecrire/action/redirect.php @@ -15,9 +15,11 @@ * recalculant au passage son URL * * @package SPIP\Core\Redirections -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Script utile pour recalculer une URL symbolique dès son changement @@ -32,47 +34,55 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * |parametre_url{var_mode,calcul} * |icone_horizontale{<:icone_voir_en_ligne:>,racine})] * ``` -**/ -function action_redirect_dist() -{ + **/ +function action_redirect_dist() { $type = _request('type'); $id = intval(_request('id')); if ($m = _request('var_mode')) { // forcer la mise a jour de l'url de cet objet ! - if (!defined('_VAR_URLS')) define('_VAR_URLS',true); + if (!defined('_VAR_URLS')) { + define('_VAR_URLS', true); + } } if (preg_match('/^\w+$/', $type)) { $h = generer_url_entite_absolue($id, $type, '', '', true); + } else { + if ($page = _request('page') + AND preg_match('/^\w+$/', $page) + ) { + $h = generer_url_public($page, '', true); + } else { + return; + } } - else if ($page = _request('page') - AND preg_match('/^\w+$/', $page)) { - $h = generer_url_public($page, '', true); - } - else return; - if ($m > '') + if ($m > '') { $h = parametre_url($h, 'var_mode', $m); + } if ($m == 'preview' - AND defined('_PREVIEW_TOKEN') - AND _PREVIEW_TOKEN - AND autoriser('previsualiser') - AND $aut = $GLOBALS['visiteur_session']['id_auteur'] ) { + AND defined('_PREVIEW_TOKEN') + AND _PREVIEW_TOKEN + AND autoriser('previsualiser') + AND $aut = $GLOBALS['visiteur_session']['id_auteur'] + ) { include_spip('inc/securiser_action'); $token = _action_auteur('previsualiser', $aut, null, 'alea_ephemere'); $h = parametre_url($h, 'var_previewtoken', "$aut*$token"); } $status = '302'; - if (_request('status') AND _request('status')=='301') + if (_request('status') AND _request('status') == '301') { $status = '301'; + } - if ($h) - redirige_par_entete(str_replace('&', '&', $h),'',$status); - else - redirige_par_entete('/','',$status); + if ($h) { + redirige_par_entete(str_replace('&', '&', $h), '', $status); + } else { + redirige_par_entete('/', '', $status); + } } ?> diff --git a/ecrire/action/referencer_traduction.php b/ecrire/action/referencer_traduction.php index f196a8f897..b045cf33f7 100644 --- a/ecrire/action/referencer_traduction.php +++ b/ecrire/action/referencer_traduction.php @@ -12,11 +12,13 @@ /** * Gestion de l'action referencer_traduction gérant les liens de traductions - * + * * @package SPIP\Core\Action */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Définir le lien de traduction vers un objet de réference @@ -26,7 +28,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * - id_trad=NN : référence le lien de traduction de id_objet vers NN * - id_objet=id_trad actuel et id_trad=new_id_trad : modifie la référence * de tout le groupe de traduction - * + * * @param string $objet * Type d'objet * @param int $id_objet @@ -40,7 +42,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; function action_referencer_traduction_dist($objet, $id_objet, $id_trad) { // ne rien faire si id_trad est ambigu - if (!is_numeric($id_trad)) return false; + if (!is_numeric($id_trad)) { + return false; + } $table_objet_sql = table_objet_sql($objet); $id_table_objet = id_table_objet($objet); @@ -49,9 +53,11 @@ function action_referencer_traduction_dist($objet, $id_objet, $id_trad) { if ($id_trad) { // selectionner l'objet cible, qui doit etre different de nous-meme, // et quitter s'il n'existe pas - $id_lier = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=".intval($id_trad)." AND NOT($id_table_objet=".intval($id_objet).")"); - if ($id_lier === NULL){ + $id_lier = sql_getfetsel('id_trad', $table_objet_sql, + "$id_table_objet=" . intval($id_trad) . " AND NOT($id_table_objet=" . intval($id_objet) . ")"); + if ($id_lier === null) { spip_log("echec lien de trad vers objet $objet/$id_objet incorrect ($id_trad)"); + return false; } @@ -61,26 +67,24 @@ function action_referencer_traduction_dist($objet, $id_objet, $id_trad) { // objets if ($id_lier == 0) { sql_updateq($table_objet_sql, array("id_trad" => $id_trad), "$id_table_objet IN ($id_trad, $id_objet)"); - } - // si id_lier = id_objet alors on veut changer la reference de tout le groupe de trad + } // si id_lier = id_objet alors on veut changer la reference de tout le groupe de trad elseif ($id_lier == $id_objet) { sql_updateq($table_objet_sql, array("id_trad" => $id_trad), "id_trad = $id_lier"); - } - // sinon ajouter notre objet dans le groupe + } // sinon ajouter notre objet dans le groupe else { - sql_updateq($table_objet_sql, array("id_trad" => $id_lier), "$id_table_objet=".intval($id_objet)); + sql_updateq($table_objet_sql, array("id_trad" => $id_lier), "$id_table_objet=" . intval($id_objet)); } - } - // on a fourni un id_trad nul : sortir id_objet du groupe de trad + } // on a fourni un id_trad nul : sortir id_objet du groupe de trad else { - $old_id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=".intval($id_objet)); + $old_id_trad = sql_getfetsel('id_trad', $table_objet_sql, "$id_table_objet=" . intval($id_objet)); // supprimer le lien de traduction - sql_updateq($table_objet_sql, array("id_trad" => 0), "$id_table_objet=".intval($id_objet)); + sql_updateq($table_objet_sql, array("id_trad" => 0), "$id_table_objet=" . intval($id_objet)); // Verifier si l'ancien groupe ne comporte plus qu'un seul objet. Alors mettre a zero. - $cpt = sql_countsel($table_objet_sql, "id_trad=".intval($old_id_trad)); - if ($cpt == 1) - sql_updateq($table_objet_sql, array("id_trad" => 0), "id_trad=".intval($old_id_trad)); + $cpt = sql_countsel($table_objet_sql, "id_trad=" . intval($old_id_trad)); + if ($cpt == 1) { + sql_updateq($table_objet_sql, array("id_trad" => 0), "id_trad=" . intval($old_id_trad)); + } } return true; diff --git a/ecrire/action/session.php b/ecrire/action/session.php index 38ef8a9c7b..8c07cada98 100644 --- a/ecrire/action/session.php +++ b/ecrire/action/session.php @@ -14,29 +14,30 @@ * Gestion d'une action ajoutant une variable dans une session SPIP * * @package SPIP\Core\Sessions -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action pour poser une variable de session SPIP * * Poster sur cette action en indiquant les clés `var` et `val` - * + * * Utilisé par exemple par le script javascript 'autosave' pour sauvegarder * les formulaires en cours d'édition * * @todo * Envoyer en réponse : json contenant toutes les variables publiques de la session -**/ -function action_session_dist() -{ + **/ +function action_session_dist() { if ($var = _request('var') - AND preg_match(',^[a-z_0-9-]+$,i', $var) + AND preg_match(',^[a-z_0-9-]+$,i', $var) ) { - if ($_SERVER['REQUEST_METHOD'] == 'POST'){ + if ($_SERVER['REQUEST_METHOD'] == 'POST') { include_spip('inc/session'); - session_set('session_'.$var, $val=_request('val')); + session_set('session_' . $var, $val = _request('val')); #spip_log("autosave:$var:$val",'autosave'); } } diff --git a/ecrire/action/super_cron.php b/ecrire/action/super_cron.php index 56d63c8d2a..3bc97e2a78 100644 --- a/ecrire/action/super_cron.php +++ b/ecrire/action/super_cron.php @@ -16,7 +16,9 @@ * @package SPIP\Core\Genie */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Url pour lancer le cron de manière asynchrone si le serveur le permet @@ -30,21 +32,22 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @see queue_affichage_cron() Dont une partie du code est repris ici. * @see action_cron() URL appelée en asynchrone pour excécuter le cron */ -function action_super_cron_dist(){ +function action_super_cron_dist() { // Si fsockopen est possible, on lance le cron via un socket // en asynchrone if (function_exists('fsockopen')) { $url = generer_url_action('cron'); $parts = parse_url($url); $fp = fsockopen($parts['host'], - isset($parts['port'])?$parts['port']:80, + isset($parts['port']) ? $parts['port'] : 80, $errno, $errstr, 30); if ($fp) { - $out = "GET ".$parts['path']."?".$parts['query']." HTTP/1.1\r\n"; - $out.= "Host: ".$parts['host']."\r\n"; - $out.= "Connection: Close\r\n\r\n"; + $out = "GET " . $parts['path'] . "?" . $parts['query'] . " HTTP/1.1\r\n"; + $out .= "Host: " . $parts['host'] . "\r\n"; + $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); fclose($fp); + return; } } @@ -53,4 +56,5 @@ function action_super_cron_dist(){ return; } + ?> diff --git a/ecrire/action/supprimer_lien.php b/ecrire/action/supprimer_lien.php index d7814372db..8a808e41f0 100644 --- a/ecrire/action/supprimer_lien.php +++ b/ecrire/action/supprimer_lien.php @@ -16,7 +16,9 @@ * @package SPIP\Core\Liens\API */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -26,23 +28,23 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * tel que `mot-7-rubrique-3`. * * @uses objet_dissocier() - * + * * @param null|string $arg * Clé des arguments. En absence utilise l'argument * de l'action sécurisée. * @return void */ -function action_supprimer_lien_dist($arg = null){ - if (is_null($arg)){ - $securiser_action = charger_fonction('securiser_action','inc'); +function action_supprimer_lien_dist($arg = null) { + if (is_null($arg)) { + $securiser_action = charger_fonction('securiser_action', 'inc'); $arg = $securiser_action(); } - $arg = explode("-",$arg); - list($objet_source,$ids,$objet_lie,$idl) = $arg; + $arg = explode("-", $arg); + list($objet_source, $ids, $objet_lie, $idl) = $arg; include_spip('action/editer_liens'); - objet_dissocier(array($objet_source=>$ids), array($objet_lie=>$idl)); + objet_dissocier(array($objet_source => $ids), array($objet_lie => $idl)); } diff --git a/ecrire/action/supprimer_rubrique.php b/ecrire/action/supprimer_rubrique.php index 4c789e31d6..d440c73c96 100644 --- a/ecrire/action/supprimer_rubrique.php +++ b/ecrire/action/supprimer_rubrique.php @@ -13,12 +13,14 @@ /** * Action de suppression d'une rubrique * - * @package SPIP\Core\Rubriques -**/ + * @package SPIP\Core\Rubriques + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -include_spip('inc/charsets'); # pour le nom de fichier +include_spip('inc/charsets'); # pour le nom de fichier /** * Effacer une rubrique @@ -28,29 +30,31 @@ include_spip('inc/charsets'); # pour le nom de fichier */ function action_supprimer_rubrique_dist($id_rubrique = null) { - if (is_null($id_rubrique)){ + if (is_null($id_rubrique)) { $securiser_action = charger_fonction('securiser_action', 'inc'); $id_rubrique = $securiser_action(); } - if (intval($id_rubrique)){ + if (intval($id_rubrique)) { - sql_delete("spip_rubriques", "id_rubrique=".intval($id_rubrique)); + sql_delete("spip_rubriques", "id_rubrique=" . intval($id_rubrique)); // Les admin restreints qui n'administraient que cette rubrique // deviennent redacteurs // (il y a sans doute moyen de faire ca avec un having) - $q = sql_select("id_auteur", "spip_auteurs_liens", "objet='rubrique' AND id_objet=".intval($id_rubrique)); + $q = sql_select("id_auteur", "spip_auteurs_liens", "objet='rubrique' AND id_objet=" . intval($id_rubrique)); while ($r = sql_fetch($q)) { $id_auteur = $r['id_auteur']; // degrader avant de supprimer la restriction d'admin // section critique sur les droits - $n = sql_countsel("spip_auteurs_liens", "objet='rubrique' AND id_objet!=".intval($id_rubrique)." AND id_auteur=".intval($id_auteur)); + $n = sql_countsel("spip_auteurs_liens", + "objet='rubrique' AND id_objet!=" . intval($id_rubrique) . " AND id_auteur=" . intval($id_auteur)); if (!$n) { include_spip('action/editer_auteur'); - auteurs_set($id_auteur,array("statut" => '1comite')); + auteurs_set($id_auteur, array("statut" => '1comite')); } - sql_delete("spip_auteurs_liens", "objet='rubrique' AND id_objet=".intval($id_rubrique)." AND id_auteur=".intval($id_auteur)); + sql_delete("spip_auteurs_liens", + "objet='rubrique' AND id_objet=" . intval($id_rubrique) . " AND id_auteur=" . intval($id_auteur)); } // menu_rubriques devra recalculer effacer_meta("date_calcul_rubriques"); diff --git a/ecrire/action/tester.php b/ecrire/action/tester.php index 41a35080a7..8f3a1ad4a0 100644 --- a/ecrire/action/tester.php +++ b/ecrire/action/tester.php @@ -12,21 +12,23 @@ /** * Gestion de l'action testant une librairie graphique - * + * * @package SPIP\Core\Configurer */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Tester les capacités du serveur à utiliser une librairie graphique * * L'argument transmis dans la clé `arg` est le type de librairie parmi * gd2, gd1, netpbm, imagick ou convert - * + * * L'action crée une vignette en utilisant la librairie indiquée puis * redirige sur l'image ainsi créée (sinon sur une image d'echec). -**/ + **/ function action_tester_dist() { $arg = _request('arg'); @@ -41,117 +43,133 @@ function action_tester_dist() { } else { # Attention GD sait lire le gif mais pas forcement l'ecrire if (function_exists('ImageCreateFromGIF')) { - $srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK."test.gif"); + $srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK . "test.gif"); if ($srcImage) { $gd_formats_read_gif = ",gif"; - ImageDestroy( $srcImage ); + ImageDestroy($srcImage); } } } - if (imagetypes() & IMG_JPG) + if (imagetypes() & IMG_JPG) { $gd_formats[] = "jpg"; - if (imagetypes() & IMG_PNG) + } + if (imagetypes() & IMG_PNG) { $gd_formats[] = "png"; - } - - else { # ancienne methode de detection des formats, qui en plus - # est bugguee car elle teste les formats en lecture - # alors que la valeur deduite sert a identifier - # les formats disponibles en ecriture... (cf. inc_logos) + } + } else { # ancienne methode de detection des formats, qui en plus + # est bugguee car elle teste les formats en lecture + # alors que la valeur deduite sert a identifier + # les formats disponibles en ecriture... (cf. inc_logos) $gd_formats = Array(); if (function_exists('ImageCreateFromJPEG')) { - $srcImage = @ImageCreateFromJPEG(_ROOT_IMG_PACK."test.jpg"); + $srcImage = @ImageCreateFromJPEG(_ROOT_IMG_PACK . "test.jpg"); if ($srcImage) { $gd_formats[] = "jpg"; - ImageDestroy( $srcImage ); + ImageDestroy($srcImage); } } if (function_exists('ImageCreateFromGIF')) { - $srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK."test.gif"); + $srcImage = @ImageCreateFromGIF(_ROOT_IMG_PACK . "test.gif"); if ($srcImage) { $gd_formats[] = "gif"; - ImageDestroy( $srcImage ); + ImageDestroy($srcImage); } } if (function_exists('ImageCreateFromPNG')) { - $srcImage = @ImageCreateFromPNG(_ROOT_IMG_PACK."test.png"); + $srcImage = @ImageCreateFromPNG(_ROOT_IMG_PACK . "test.png"); if ($srcImage) { $gd_formats[] = "png"; - ImageDestroy( $srcImage ); + ImageDestroy($srcImage); } } } - if ($gd_formats) $gd_formats = join(",", $gd_formats); - ecrire_meta("gd_formats_read", $gd_formats.$gd_formats_read_gif); - ecrire_meta("gd_formats", $gd_formats); - } - - // verifier les formats netpbm - else if ($arg == "netpbm") { - if (!defined('_PNMSCALE_COMMAND')) define('_PNMSCALE_COMMAND', 'pnmscale'); // Securite : mes_options.php peut preciser le chemin absolu - if (_PNMSCALE_COMMAND == '') return; - $netpbm_formats= Array(); - - $jpegtopnm_command = str_replace("pnmscale", - "jpegtopnm", _PNMSCALE_COMMAND); - $pnmtojpeg_command = str_replace("pnmscale", - "pnmtojpeg", _PNMSCALE_COMMAND); - - $vignette = _ROOT_IMG_PACK."test.jpg"; - $dest = _DIR_VAR . "test-jpg.jpg"; - $commande = "$jpegtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest"; - spip_log($commande); - exec($commande); - if ($taille = @getimagesize($dest)) { - if ($taille[1] == 10) $netpbm_formats[] = "jpg"; - } - $giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND); - $pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND); - $vignette = _ROOT_IMG_PACK."test.gif"; - $dest = _DIR_VAR . "test-gif.jpg"; - $commande = "$giftopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest"; - spip_log($commande); - exec($commande); - if ($taille = @getimagesize($dest)) { - if ($taille[1] == 10) $netpbm_formats[] = "gif"; + if ($gd_formats) { + $gd_formats = join(",", $gd_formats); } + ecrire_meta("gd_formats_read", $gd_formats . $gd_formats_read_gif); + ecrire_meta("gd_formats", $gd_formats); + } // verifier les formats netpbm + else { + if ($arg == "netpbm") { + if (!defined('_PNMSCALE_COMMAND')) { + define('_PNMSCALE_COMMAND', 'pnmscale'); + } // Securite : mes_options.php peut preciser le chemin absolu + if (_PNMSCALE_COMMAND == '') { + return; + } + $netpbm_formats = Array(); + + $jpegtopnm_command = str_replace("pnmscale", + "jpegtopnm", _PNMSCALE_COMMAND); + $pnmtojpeg_command = str_replace("pnmscale", + "pnmtojpeg", _PNMSCALE_COMMAND); + + $vignette = _ROOT_IMG_PACK . "test.jpg"; + $dest = _DIR_VAR . "test-jpg.jpg"; + $commande = "$jpegtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest"; + spip_log($commande); + exec($commande); + if ($taille = @getimagesize($dest)) { + if ($taille[1] == 10) { + $netpbm_formats[] = "jpg"; + } + } + $giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND); + $pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND); + $vignette = _ROOT_IMG_PACK . "test.gif"; + $dest = _DIR_VAR . "test-gif.jpg"; + $commande = "$giftopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest"; + spip_log($commande); + exec($commande); + if ($taille = @getimagesize($dest)) { + if ($taille[1] == 10) { + $netpbm_formats[] = "gif"; + } + } - $pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND); - $vignette = _ROOT_IMG_PACK."test.png"; - $dest = _DIR_VAR . "test-gif.jpg"; - $commande = "$pngtopnm_command $vignette | "._PNMSCALE_COMMAND." -width 10 | $pnmtojpeg_command > $dest"; - spip_log($commande); - exec($commande); - if ($taille = @getimagesize($dest)) { - if ($taille[1] == 10) $netpbm_formats[] = "png"; - } + $pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND); + $vignette = _ROOT_IMG_PACK . "test.png"; + $dest = _DIR_VAR . "test-gif.jpg"; + $commande = "$pngtopnm_command $vignette | " . _PNMSCALE_COMMAND . " -width 10 | $pnmtojpeg_command > $dest"; + spip_log($commande); + exec($commande); + if ($taille = @getimagesize($dest)) { + if ($taille[1] == 10) { + $netpbm_formats[] = "png"; + } + } - if ($netpbm_formats) - $netpbm_formats = join(",", $netpbm_formats); - else - $netpbm_formats = ''; - ecrire_meta("netpbm_formats", $netpbm_formats); + if ($netpbm_formats) { + $netpbm_formats = join(",", $netpbm_formats); + } else { + $netpbm_formats = ''; + } + ecrire_meta("netpbm_formats", $netpbm_formats); + } } // et maintenant envoyer la vignette de tests - if (in_array($arg,array("gd1","gd2","imagick","convert","netpbm"))) { + if (in_array($arg, array("gd1", "gd2", "imagick", "convert", "netpbm"))) { include_spip('inc/filtres'); include_spip('inc/filtres_images_mini'); $taille_preview = 150; - $image = _image_valeurs_trans(_DIR_IMG_PACK.'test_image.jpg',"reduire-$taille_preview-$taille_preview",'jpg'); + $image = _image_valeurs_trans(_DIR_IMG_PACK . 'test_image.jpg', "reduire-$taille_preview-$taille_preview", 'jpg'); - $image['fichier_dest']=_DIR_VAR."test_$arg"; + $image['fichier_dest'] = _DIR_VAR . "test_$arg"; if ($preview = _image_creer_vignette($image, $taille_preview, $taille_preview, $arg, true) - AND ($preview['width'] * $preview['height'] > 0)) + AND ($preview['width']*$preview['height'] > 0) + ) { redirige_par_entete($preview['fichier']); + } } # image echec redirige_par_entete(chemin_image('puce-rouge-anim.gif')); } + ?> diff --git a/ecrire/action/tester_taille.php b/ecrire/action/tester_taille.php index ee6a4bc1e6..5f28736e9a 100644 --- a/ecrire/action/tester_taille.php +++ b/ecrire/action/tester_taille.php @@ -13,11 +13,13 @@ /** * Gestion de l'action testant, pour la librairie graphique GD2, la taille * maximale des images qu'il est capable de traiter - * + * * @package SPIP\Core\Configurer */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/headers'); /** @@ -26,18 +28,18 @@ include_spip('inc/headers'); * * Si c'est le cas, on redirige sur la page prévue, testant un autre cas * de traitement - * + * * @param string $output * Sortie du buffer * @return string * Sortie du buffer -**/ -function action_tester_taille_error_handler($output) -{ + **/ +function action_tester_taille_error_handler($output) { // on est ici, donc echec lors de la creation de l'image - if (!empty($GLOBALS['redirect'])){ + if (!empty($GLOBALS['redirect'])) { return redirige_formulaire($GLOBALS['redirect']); } + return $output; } @@ -48,30 +50,32 @@ function action_tester_taille_error_handler($output) * Ce test par dichotomie permet de calculer la taille (en pixels) de la * plus grande image traitable. Ce test se relance jusqu'à trouver cette * taille. - * + * * La clé `arg` attendue est une chaîne indiquant les valeurs minimum et * maximum de taille à tester tel que '3000' (maximum) ou '3000-5000' * (minimum-maximum) - * -**/ + * + **/ function action_tester_taille_dist() { - if (!autoriser('configurer')) + if (!autoriser('configurer')) { return; + } $taille = _request('arg'); - $taille = explode('-',$taille); + $taille = explode('-', $taille); $GLOBALS['taille_max'] = end($taille); $GLOBALS['taille_min'] = 0; - if (count($taille)>1) + if (count($taille) > 1) { $GLOBALS['taille_min'] = reset($taille); + } // si l'intervalle est assez petit, on garde la valeur min - if ($GLOBALS['taille_max']*$GLOBALS['taille_max']-$GLOBALS['taille_min']*$GLOBALS['taille_min']<50000){ + if ($GLOBALS['taille_max']*$GLOBALS['taille_max']-$GLOBALS['taille_min']*$GLOBALS['taille_min'] < 50000) { $t = ($GLOBALS['taille_min']*$GLOBALS['taille_min']); - if ($GLOBALS['taille_min']!==$GLOBALS['taille_max']) { - $t = $t * 0.9; // marge de securite + if ($GLOBALS['taille_min'] !== $GLOBALS['taille_max']) { + $t = $t*0.9; // marge de securite echo round($t/1000000, 3) . ' Mpx'; } else { // c'est un cas "on a reussi la borne max initiale, donc on a pas de limite connue" @@ -106,18 +110,19 @@ function action_tester_taille_dist() { $i = _request('i')+1; $image_source = chemin_image("test.png"); - $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=".$GLOBALS['taille_min']."-".$GLOBALS['taille_test']); + $GLOBALS['redirect'] = generer_url_action("tester_taille", + "i=$i&arg=" . $GLOBALS['taille_min'] . "-" . $GLOBALS['taille_test']); ob_start('action_tester_taille_error_handler'); - filtrer('image_recadre',$image_source,$taille,$taille); - $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-".$GLOBALS['taille_max']); + filtrer('image_recadre', $image_source, $taille, $taille); + $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-" . $GLOBALS['taille_max']); // si la valeur intermediaire a reussi, on teste la valeur maxi qui est peut etre sous estimee // si $GLOBALS['taille_min']==0 (car on est au premier coup) - if ($GLOBALS['taille_min']==0){ + if ($GLOBALS['taille_min'] == 0) { $taille = $GLOBALS['taille_max']; - filtrer('image_recadre',$image_source,$taille,$taille); - $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-".$GLOBALS['taille_max']); + filtrer('image_recadre', $image_source, $taille, $taille); + $GLOBALS['redirect'] = generer_url_action("tester_taille", "i=$i&arg=$taille-" . $GLOBALS['taille_max']); } ob_end_clean(); diff --git a/ecrire/auth/ldap.php b/ecrire/auth/ldap.php index 39625b716c..b44cf497fc 100644 --- a/ecrire/auth/ldap.php +++ b/ecrire/auth/ldap.php @@ -14,20 +14,23 @@ * Gestion de l'authentification par LDAP * * @package SPIP\Core\Authentification\Ldap -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Authentifie via LDAP et retourne la ligne SQL decrivant l'utilisateur si ok // Attributs LDAP correspondants a ceux de SPIP, notamment pour le login // ne pas ecraser une definition perso dans mes_options -if (!isset($GLOBALS['ldap_attributes']) OR !is_array($GLOBALS['ldap_attributes'])){ +if (!isset($GLOBALS['ldap_attributes']) OR !is_array($GLOBALS['ldap_attributes'])) { $GLOBALS['ldap_attributes'] = array( - 'login' => array('sAMAccountName', 'uid', 'login', 'userid', 'cn','sn'), + 'login' => array('sAMAccountName', 'uid', 'login', 'userid', 'cn', 'sn'), 'nom' => "cn", 'email' => "mail", - 'bio' => "description"); + 'bio' => "description" + ); } /** @@ -51,49 +54,56 @@ if (!isset($GLOBALS['ldap_attributes']) OR !is_array($GLOBALS['ldap_attributes'] * @param bool $phpauth * @return string */ -function auth_ldap_dist ($login, $pass, $serveur = '', $phpauth = false) { +function auth_ldap_dist($login, $pass, $serveur = '', $phpauth = false) { #spip_log("ldap $login " . ($pass ? "mdp fourni" : "mdp absent")); // Utilisateur connu ? // si http auth, inutile de reauthentifier: cela - // ne marchera pas avec auth http autre que basic. - $checkpass = isset($_SERVER["REMOTE_USER"])?false:true; - if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) return array(); + // ne marchera pas avec auth http autre que basic. + $checkpass = isset($_SERVER["REMOTE_USER"]) ? false : true; + if (!($dn = auth_ldap_search($login, $pass, $checkpass, $serveur))) { + return array(); + } $credentials_ldap = array('ldap_dn' => $dn, 'ldap_password' => $pass); // Si l'utilisateur figure deja dans la base, y recuperer les infos - $r = sql_fetsel("*", "spip_auteurs", "login=" . sql_quote($login) . " AND source='ldap'",'','','','',$serveur); + $r = sql_fetsel("*", "spip_auteurs", "login=" . sql_quote($login) . " AND source='ldap'", '', '', '', '', $serveur); - if ($r) return array_merge($r, $credentials_ldap); + if ($r) { + return array_merge($r, $credentials_ldap); + } // sinon importer les infos depuis LDAP, if ($GLOBALS['meta']["ldap_statut_import"] - AND $desc = auth_ldap_retrouver($dn, array(), $serveur)) { - // rajouter le statut indique a l'install + AND $desc = auth_ldap_retrouver($dn, array(), $serveur) + ) { + // rajouter le statut indique a l'install $desc['statut'] = $GLOBALS['meta']["ldap_statut_import"]; $desc['login'] = $login; $desc['source'] = 'ldap'; $desc['pass'] = ''; - $r = sql_insertq('spip_auteurs', $desc,'',$serveur); - } + $r = sql_insertq('spip_auteurs', $desc, '', $serveur); + } - if ($r) + if ($r) { return array_merge( $credentials_ldap, - sql_fetsel("*", "spip_auteurs", "id_auteur=".intval($r),'','','','',$serveur) - ); + sql_fetsel("*", "spip_auteurs", "id_auteur=" . intval($r), '', '', '', '', $serveur) + ); + } // sinon echec spip_log("Creation de l'auteur '$login' impossible"); + return array(); } /** * Connexion à l'annuaire LDAP - * + * * Il faut passer par `spip_connect()` pour avoir les info * donc potentiellement indiquer un serveur * meme si dans les fait cet argument est toujours vide @@ -104,22 +114,34 @@ function auth_ldap_dist ($login, $pass, $serveur = '', $phpauth = false) { function auth_ldap_connect($serveur = '') { include_spip('base/connect_sql'); static $connexions_ldap = array(); - if (isset($connexions_ldap[$serveur])) return $connexions_ldap[$serveur]; + if (isset($connexions_ldap[$serveur])) { + return $connexions_ldap[$serveur]; + } $connexion = spip_connect($serveur); if (!is_array($connexion['ldap'])) { if ($connexion['authentification']['ldap']) { - $f = _DIR_CONNECT . $connexion['authentification']['ldap']; + $f = _DIR_CONNECT . $connexion['authentification']['ldap']; unset($GLOBALS['ldap_link']); - if (is_readable($f)) { include_once($f); }; - if (isset($GLOBALS['ldap_link'])) - $connexion['ldap'] = array('link' => $GLOBALS['ldap_link'], - 'base' => $GLOBALS['ldap_base']); - else spip_log("connection LDAP $serveur mal definie dans $f"); - if (isset($GLOBALS['ldap_champs'])) + if (is_readable($f)) { + include_once($f); + }; + if (isset($GLOBALS['ldap_link'])) { + $connexion['ldap'] = array( + 'link' => $GLOBALS['ldap_link'], + 'base' => $GLOBALS['ldap_base'] + ); + } else { + spip_log("connection LDAP $serveur mal definie dans $f"); + } + if (isset($GLOBALS['ldap_champs'])) { $connexion['ldap']['attributes'] = $GLOBALS['ldap_champs']; - } else spip_log("connection LDAP $serveur inconnue"); + } + } else { + spip_log("connection LDAP $serveur inconnue"); + } } - return $connexions_ldap[$serveur]=$connexion['ldap']; + + return $connexions_ldap[$serveur] = $connexion['ldap']; } /** @@ -132,83 +154,97 @@ function auth_ldap_connect($serveur = '') { * @return string * Le login trouvé ou chaine vide si non trouvé */ -function auth_ldap_search($login, $pass, $checkpass = true, $serveur = ''){ +function auth_ldap_search($login, $pass, $checkpass = true, $serveur = '') { // Securite anti-injection et contre un serveur LDAP laxiste - $login_search = preg_replace("/[^-@._\s\d\w]/", "", $login); - if (!strlen($login_search) OR ($checkpass AND !strlen($pass)) ) + $login_search = preg_replace("/[^-@._\s\d\w]/", "", $login); + if (!strlen($login_search) OR ($checkpass AND !strlen($pass))) { return ''; + } // verifier la connexion - if (!$ldap = auth_ldap_connect($serveur)) + if (!$ldap = auth_ldap_connect($serveur)) { return ''; + } $ldap_link = $ldap['link']; $ldap_base = $ldap['base']; - $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes'] ; + $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes']; $logins = is_array($desc['login']) ? $desc['login'] : array($desc['login']); // Tenter une recherche pour essayer de retrouver le DN - foreach($logins as $att) { + foreach ($logins as $att) { $result = @ldap_search($ldap_link, $ldap_base, "$att=$login_search", array("dn")); $info = @ldap_get_entries($ldap_link, $result); - // Ne pas accepter les resultats si plus d'une entree - // (on veut un attribut unique) + // Ne pas accepter les resultats si plus d'une entree + // (on veut un attribut unique) if (is_array($info) AND $info['count'] == 1) { $dn = $info[0]['dn']; - if (!$checkpass) return $dn; - if (@ldap_bind($ldap_link, $dn, $pass)) return $dn; + if (!$checkpass) { + return $dn; + } + if (@ldap_bind($ldap_link, $dn, $pass)) { + return $dn; + } } } if ($checkpass AND !isset($dn)) { // Si echec, essayer de deviner le DN - foreach($logins as $att) { + foreach ($logins as $att) { $dn = "$att=$login_search, $ldap_base"; - if (@ldap_bind($ldap_link, $dn, $pass)) + if (@ldap_bind($ldap_link, $dn, $pass)) { return "$att=$login_search, $ldap_base"; + } } } + return ''; } /** * Retrouver un DN depuis LDAP - * + * * @param string $dn * @param array $desc * @param string $serveur * @return array */ -function auth_ldap_retrouver($dn, $desc = array(), $serveur = '') -{ +function auth_ldap_retrouver($dn, $desc = array(), $serveur = '') { // Lire les infos sur l'utilisateur a partir de son DN depuis LDAP if (!$ldap = spip_connect_ldap($serveur)) { spip_log("ldap $serveur injoignable"); + return array(); } $ldap_link = $ldap['link']; if (!$desc) { - $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes'] ; + $desc = $ldap['attributes'] ? $ldap['attributes'] : $GLOBALS['ldap_attributes']; unset($desc['login']); } $result = @ldap_read($ldap_link, $dn, "objectClass=*", array_values($desc)); - if (!$result) return array(); + if (!$result) { + return array(); + } // Recuperer les donnees du premier (unique?) compte de l'auteur $val = @ldap_get_entries($ldap_link, $result); - if (!is_array($val) OR !is_array($val[0])) return array(); + if (!is_array($val) OR !is_array($val[0])) { + return array(); + } $val = $val[0]; // Convertir depuis UTF-8 (jeu de caracteres par defaut) include_spip('inc/charsets'); - foreach ($desc as $k => $v) + foreach ($desc as $k => $v) { $desc[$k] = importer_charset($val[strtolower($v)][0], 'utf-8'); + } + return $desc; } @@ -220,14 +256,13 @@ function auth_ldap_retrouver($dn, $desc = array(), $serveur = '') * @param string $serveur * @return string */ -function auth_ldap_retrouver_login($login, $serveur = '') -{ +function auth_ldap_retrouver_login($login, $serveur = '') { return auth_ldap_search($login, '', false, $serveur) ? $login : ''; } /** * Vérification de la validité d'un mot de passe pour le mode d'auth concerné - * + * * C'est ici que se font éventuellement les vérifications de longueur mini/maxi * ou de force. * @@ -241,9 +276,10 @@ function auth_ldap_retrouver_login($login, $serveur = '') * @return string * Message d'erreur si login non valide, chaîne vide sinon */ -function auth_ldap_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = ''){ - include_spip('auth/spip'); - return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur); +function auth_ldap_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') { + include_spip('auth/spip'); + + return auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur); } /** @@ -252,7 +288,7 @@ function auth_ldap_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = ' * On ne peut pas détecter à l'avance si l'autorisation sera donnée, il * faudra informer l'utilisateur a posteriori si la modif n'a pas pu se * faire. - * + * * @param string $serveur * @return bool * Pour un auteur LDAP, a priori toujours true, à conditiion que le serveur @@ -263,8 +299,8 @@ function auth_ldap_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = ' * ... * ``` */ -function auth_ldap_autoriser_modifier_pass($serveur = ''){ - return true; +function auth_ldap_autoriser_modifier_pass($serveur = '') { + return true; } /** @@ -273,7 +309,7 @@ function auth_ldap_autoriser_modifier_pass($serveur = ''){ * On se bind au LDAP cette fois sous l'identité de l'utilisateur, car le * compte générique defini dans config/ldap.php n'a généralement pas (et * ne devrait pas avoir) les droits suffisants pour faire la modification. - * + * * @param $login * @param $new_pass * @param $id_auteur @@ -281,26 +317,27 @@ function auth_ldap_autoriser_modifier_pass($serveur = ''){ * @return bool * Informe du succès ou de l'echec du changement du mot de passe */ -function auth_ldap_modifier_pass($login, $new_pass, $id_auteur, $serveur = ''){ - if (is_null($new_pass) OR auth_ldap_verifier_pass($login, $new_pass,$id_auteur,$serveur)!='') { - return false; - } - if (!$ldap = auth_ldap_connect($serveur)) - return ''; - $link = $ldap['link']; - include_spip("inc/session"); - $dn = session_get('ldap_dn'); - if ('' == $dn) { - return false; - } - if (!ldap_bind($link, $dn, session_get('ldap_password'))) { - return false; - } - $encoded_pass = "{MD5}".base64_encode(pack("H*",md5($new_pass))); - $success = ldap_mod_replace($link, $dn, array('userPassword' => $encoded_pass)); - return $success; -} +function auth_ldap_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') { + if (is_null($new_pass) OR auth_ldap_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { + return false; + } + if (!$ldap = auth_ldap_connect($serveur)) { + return ''; + } + $link = $ldap['link']; + include_spip("inc/session"); + $dn = session_get('ldap_dn'); + if ('' == $dn) { + return false; + } + if (!ldap_bind($link, $dn, session_get('ldap_password'))) { + return false; + } + $encoded_pass = "{MD5}" . base64_encode(pack("H*", md5($new_pass))); + $success = ldap_mod_replace($link, $dn, array('userPassword' => $encoded_pass)); + return $success; +} ?> diff --git a/ecrire/auth/sha256.inc.php b/ecrire/auth/sha256.inc.php index 98161ffd55..67fcf533bc 100644 --- a/ecrire/auth/sha256.inc.php +++ b/ecrire/auth/sha256.inc.php @@ -18,7 +18,6 @@ * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. - * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA @@ -68,388 +67,483 @@ * * @package SPIP\Core\Authentification\Sha256 */ -if (!class_exists('nanoSha2')) -{ - /** - * Classe de calcul d'un SHA - */ - class nanoSha2 - { - // php 4 - 5 compatable class properties - /** Le résultat doit être passé en majuscule ? - * @var bool */ - var $toUpper; - /** 32 ou 64 bits ? - * @var int */ - var $platform; - /** bytes par caractères */ - var $bytesString = 16; - - /** - * Constructor - * - * @param bool $toUpper - */ - function __construct($toUpper = false) { - // Determine if the caller wants upper case or not. - $this->toUpper = is_bool($toUpper) - ? $toUpper - : ((defined('_NANO_SHA2_UPPER')) ? true : false); - - // Deteremine if the system is 32 or 64 bit. - $tmpInt = (int)4294967295; - $this->platform = ($tmpInt > 0) ? 64 : 32; - } - - /** - * Here are the bitwise and functions as defined in FIPS180-2 Standard - * - * @param int $x - * @param int $y - * @param int $n - * @return int - */ - function addmod2n($x, $y, $n = 4294967296) // Z = (X + Y) mod 2^32 - { - $mask = 0x80000000; - - if ($x < 0) { - $x &= 0x7FFFFFFF; - $x = (float)$x + $mask; - } - - if ($y < 0) { - $y &= 0x7FFFFFFF; - $y = (float)$y + $mask; - } - - $r = $x + $y; - - if ($r >= $n) { - while ($r >= $n) { - $r -= $n; - } - } - - return (int)$r; - } - - /** - * Logical bitwise right shift (PHP default is arithmetic shift) - * @param int $x - * @param int $n - * return int - */ - function SHR($x, $n) // x >> n - { - if ($n >= 32) { // impose some limits to keep it 32-bit - return (int)0; - } - - if ($n <= 0) { - return (int)$x; - } - - $mask = 0x40000000; - - if ($x < 0) { - $x &= 0x7FFFFFFF; - $mask = $mask >> ($n-1); - return ($x >> $n) | $mask; - } - - return (int)$x >> (int)$n; - } - - /** ROTR - * @param int $x - * @param int $n - * @return int */ - function ROTR($x, $n) { return (int)(($this->SHR($x, $n) | ($x << (32-$n)) & 0xFFFFFFFF)); } - - /** Ch - * @param int $x - * @param int $y - * @param int $z - * @return int */ - function Ch($x, $y, $z) { return ($x & $y) ^ ((~$x) & $z); } - - /** Maj - * @param int $x - * @param int $y - * @param int $z - * @return int */ - function Maj($x, $y, $z) { return ($x & $y) ^ ($x & $z) ^ ($y & $z); } - - /** Sigma0 - * @param int $x - * @return int */ - function Sigma0($x) { return (int) ($this->ROTR($x, 2)^$this->ROTR($x, 13)^$this->ROTR($x, 22)); } - - /** Sigma1 - * @param int $x - * @return int */ - function Sigma1($x) { return (int) ($this->ROTR($x, 6)^$this->ROTR($x, 11)^$this->ROTR($x, 25)); } - - /** Sigma_0 - * @param int $x - * @return int */ - function sigma_0($x) { return (int) ($this->ROTR($x, 7)^$this->ROTR($x, 18)^$this->SHR($x, 3)); } - - /** Sigma_1 - * @param int $x - * @return int */ - function sigma_1($x) { return (int) ($this->ROTR($x, 17)^$this->ROTR($x, 19)^$this->SHR($x, 10)); } - - /** String 2 ord UTF8 - * @param string $s - * @param int $byteSize - * @return array - **/ - function string2ordUTF8($s, &$byteSize){ - $chars = array(); - // par defaut sur 8bits - $byteSize = 8; - $i = 0; - while ($i<strlen($s)){ - $chars[] = $this->ordUTF8($s, $i, $bytes); - $i+=$bytes; - // mais si un char necessite 16bits, on passe tout sur 16 - // sinon on ne concorde pas avec le lecture de la chaine en js - // et le sha256 js - if ($bytes>1) $byteSize = 16; - } - return $chars; - } - - /** Ord UTF8 - * @param string $c - * @param int $index - * @param int $bytes - * @return unknown - **/ - function ordUTF8($c, $index = 0, &$bytes) - { - $len = strlen($c); - $bytes = 0; - - if ($index >= $len) - return false; - - $h = ord($c{$index}); - - if ($h <= 0x7F) { - $bytes = 1; - return $h; - } - else if ($h < 0xC2){ - // pas utf mais renvoyer quand meme ce qu'on a - $bytes = 1; - return $h; - } - else if ($h <= 0xDF && $index < $len - 1) { - $bytes = 2; - return ($h & 0x1F) << 6 | (ord($c{$index + 1}) & 0x3F); - } - else if ($h <= 0xEF && $index < $len - 2) { - $bytes = 3; - return ($h & 0x0F) << 12 | (ord($c{$index + 1}) & 0x3F) << 6 - | (ord($c{$index + 2}) & 0x3F); - } - else if ($h <= 0xF4 && $index < $len - 3) { - $bytes = 4; - return ($h & 0x0F) << 18 | (ord($c{$index + 1}) & 0x3F) << 12 - | (ord($c{$index + 2}) & 0x3F) << 6 - | (ord($c{$index + 3}) & 0x3F); - } - else { - // pas utf mais renvoyer quand meme ce qu'on a - $bytes = 1; - return $h; - } - } - - /** String 2 bin int - * @param string $str - * @param int $npad - * @return int[] - **/ - function string2binint ($str, $npad = 512) { - $bin = array(); - $ords = $this->string2ordUTF8($str,$this->bytesString); - $npad = $npad/$this->bytesString; - $length = count($ords); - $ords[] = 0x80; // append the "1" bit followed by 7 0's - $pad = ceil(($length+1+32/$this->bytesString)/$npad)*$npad-32/$this->bytesString; - $ords = array_pad($ords,$pad,0); - $mask = (1 << $this->bytesString) - 1; - for($i = 0; $i < count($ords) * $this->bytesString; $i += $this->bytesString) { - if (!isset($bin[$i>>5])) { $bin[$i>>5] = 0; } // pour eviter des notices. - $bin[$i>>5] |= ($ords[$i / $this->bytesString] & $mask) << (24 - $i%32); - } - $bin[] = $length*$this->bytesString; - return $bin; - } - - /** Array split - * @param array $a - * @param int $n - * @return array - **/ - function array_split($a, $n) { - $split = array(); - while (count($a)>$n) { - $s = array(); - for($i = 0;$i<$n;$i++) - $s[] = array_shift($a); - $split[] = $s; - } - if (count($a)){ - $a = array_pad($a,$n,0); - $split[] = $a; - } - return $split; - } - - /** - * Process and return the hash. - * - * @param $str Input string to hash - * @param $ig_func Option param to ignore checking for php > 5.1.2 - * @return string Hexadecimal representation of the message digest - */ - function hash($str, $ig_func = true) - { - unset($binStr); // binary representation of input string - unset($hexStr); // 256-bit message digest in readable hex format - - // check for php's internal sha256 function, ignore if ig_func==true - if ($ig_func == false) { - if (version_compare(PHP_VERSION,'5.1.2','>=') AND !defined('_NO_HASH_DEFINED')) { - return hash("sha256", $str, false); - } else if (function_exists('mhash') && defined('MHASH_SHA256')) { - return base64_encode(bin2hex(mhash(MHASH_SHA256, $str))); - } - } - - /* - * SHA-256 Constants - * Sequence of sixty-four constant 32-bit words representing the - * first thirty-two bits of the fractional parts of the cube roots - * of the first sixtyfour prime numbers. - */ - $K = array((int)0x428a2f98, (int)0x71374491, (int)0xb5c0fbcf, - (int)0xe9b5dba5, (int)0x3956c25b, (int)0x59f111f1, - (int)0x923f82a4, (int)0xab1c5ed5, (int)0xd807aa98, - (int)0x12835b01, (int)0x243185be, (int)0x550c7dc3, - (int)0x72be5d74, (int)0x80deb1fe, (int)0x9bdc06a7, - (int)0xc19bf174, (int)0xe49b69c1, (int)0xefbe4786, - (int)0x0fc19dc6, (int)0x240ca1cc, (int)0x2de92c6f, - (int)0x4a7484aa, (int)0x5cb0a9dc, (int)0x76f988da, - (int)0x983e5152, (int)0xa831c66d, (int)0xb00327c8, - (int)0xbf597fc7, (int)0xc6e00bf3, (int)0xd5a79147, - (int)0x06ca6351, (int)0x14292967, (int)0x27b70a85, - (int)0x2e1b2138, (int)0x4d2c6dfc, (int)0x53380d13, - (int)0x650a7354, (int)0x766a0abb, (int)0x81c2c92e, - (int)0x92722c85, (int)0xa2bfe8a1, (int)0xa81a664b, - (int)0xc24b8b70, (int)0xc76c51a3, (int)0xd192e819, - (int)0xd6990624, (int)0xf40e3585, (int)0x106aa070, - (int)0x19a4c116, (int)0x1e376c08, (int)0x2748774c, - (int)0x34b0bcb5, (int)0x391c0cb3, (int)0x4ed8aa4a, - (int)0x5b9cca4f, (int)0x682e6ff3, (int)0x748f82ee, - (int)0x78a5636f, (int)0x84c87814, (int)0x8cc70208, - (int)0x90befffa, (int)0xa4506ceb, (int)0xbef9a3f7, - (int)0xc67178f2); - - // Pre-processing: Padding the string - $binStr = $this->string2binint($str,512); - - // Parsing the Padded Message (Break into N 512-bit blocks) - $M = $this->array_split($binStr, 16); - - // Set the initial hash values - $h[0] = (int)0x6a09e667; - $h[1] = (int)0xbb67ae85; - $h[2] = (int)0x3c6ef372; - $h[3] = (int)0xa54ff53a; - $h[4] = (int)0x510e527f; - $h[5] = (int)0x9b05688c; - $h[6] = (int)0x1f83d9ab; - $h[7] = (int)0x5be0cd19; - - // loop through message blocks and compute hash. ( For i=1 to N : ) - $N = count($M); - for ($i = 0; $i < $N; $i++) - { - // Break input block into 16 32bit words (message schedule prep) - $MI = $M[$i]; - - // Initialize working variables - $_a = (int)$h[0]; - $_b = (int)$h[1]; - $_c = (int)$h[2]; - $_d = (int)$h[3]; - $_e = (int)$h[4]; - $_f = (int)$h[5]; - $_g = (int)$h[6]; - $_h = (int)$h[7]; - unset($_s0); - unset($_s1); - unset($_T1); - unset($_T2); - $W = array(); - - // Compute the hash and update - for ($t = 0; $t < 16; $t++) - { - // Prepare the first 16 message schedule values as we loop - $W[$t] = $MI[$t]; - - // Compute hash - $_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t]); - $_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c)); - - // Update working variables - $_h = $_g; $_g = $_f; $_f = $_e; $_e = $this->addmod2n($_d, $_T1); - $_d = $_c; $_c = $_b; $_b = $_a; $_a = $this->addmod2n($_T1, $_T2); - } - - for (; $t < 64; $t++) - { - // Continue building the message schedule as we loop - $_s0 = $W[($t+1)&0x0F]; - $_s0 = $this->sigma_0($_s0); - $_s1 = $W[($t+14)&0x0F]; - $_s1 = $this->sigma_1($_s1); - - $W[$t&0xF] = $this->addmod2n($this->addmod2n($this->addmod2n($W[$t&0xF], $_s0), $_s1), $W[($t+9)&0x0F]); - - // Compute hash - $_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t&0xF]); - $_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c)); - - // Update working variables - $_h = $_g; $_g = $_f; $_f = $_e; $_e = $this->addmod2n($_d, $_T1); - $_d = $_c; $_c = $_b; $_b = $_a; $_a = $this->addmod2n($_T1, $_T2); - } - - $h[0] = $this->addmod2n($h[0], $_a); - $h[1] = $this->addmod2n($h[1], $_b); - $h[2] = $this->addmod2n($h[2], $_c); - $h[3] = $this->addmod2n($h[3], $_d); - $h[4] = $this->addmod2n($h[4], $_e); - $h[5] = $this->addmod2n($h[5], $_f); - $h[6] = $this->addmod2n($h[6], $_g); - $h[7] = $this->addmod2n($h[7], $_h); - } - - // Convert the 32-bit words into human readable hexadecimal format. - $hexStr = sprintf("%08x%08x%08x%08x%08x%08x%08x%08x", $h[0], $h[1], $h[2], $h[3], $h[4], $h[5], $h[6], $h[7]); - - return ($this->toUpper) ? strtoupper($hexStr) : $hexStr; - } - - } +if (!class_exists('nanoSha2')) { + /** + * Classe de calcul d'un SHA + */ + class nanoSha2 { + // php 4 - 5 compatable class properties + /** Le résultat doit être passé en majuscule ? + * + * @var bool + */ + var $toUpper; + /** 32 ou 64 bits ? + * + * @var int + */ + var $platform; + /** bytes par caractères */ + var $bytesString = 16; + + /** + * Constructor + * + * @param bool $toUpper + */ + function __construct($toUpper = false) { + // Determine if the caller wants upper case or not. + $this->toUpper = is_bool($toUpper) + ? $toUpper + : ((defined('_NANO_SHA2_UPPER')) ? true : false); + + // Deteremine if the system is 32 or 64 bit. + $tmpInt = (int)4294967295; + $this->platform = ($tmpInt > 0) ? 64 : 32; + } + + /** + * Here are the bitwise and functions as defined in FIPS180-2 Standard + * + * @param int $x + * @param int $y + * @param int $n + * @return int + */ + function addmod2n($x, $y, $n = 4294967296) // Z = (X + Y) mod 2^32 + { + $mask = 0x80000000; + + if ($x < 0) { + $x &= 0x7FFFFFFF; + $x = (float)$x+$mask; + } + + if ($y < 0) { + $y &= 0x7FFFFFFF; + $y = (float)$y+$mask; + } + + $r = $x+$y; + + if ($r >= $n) { + while ($r >= $n) { + $r -= $n; + } + } + + return (int)$r; + } + + /** + * Logical bitwise right shift (PHP default is arithmetic shift) + * + * @param int $x + * @param int $n + * return int + */ + function SHR($x, $n) // x >> n + { + if ($n >= 32) { // impose some limits to keep it 32-bit + return (int)0; + } + + if ($n <= 0) { + return (int)$x; + } + + $mask = 0x40000000; + + if ($x < 0) { + $x &= 0x7FFFFFFF; + $mask = $mask >> ($n-1); + + return ($x >> $n) | $mask; + } + + return (int)$x >> (int)$n; + } + + /** ROTR + * + * @param int $x + * @param int $n + * @return int + */ + function ROTR($x, $n) { return (int)(($this->SHR($x, $n) | ($x << (32-$n)) & 0xFFFFFFFF)); } + + /** Ch + * + * @param int $x + * @param int $y + * @param int $z + * @return int + */ + function Ch($x, $y, $z) { return ($x & $y) ^ ((~$x) & $z); } + + /** Maj + * + * @param int $x + * @param int $y + * @param int $z + * @return int + */ + function Maj($x, $y, $z) { return ($x & $y) ^ ($x & $z) ^ ($y & $z); } + + /** Sigma0 + * + * @param int $x + * @return int + */ + function Sigma0($x) { return (int)($this->ROTR($x, 2) ^ $this->ROTR($x, 13) ^ $this->ROTR($x, 22)); } + + /** Sigma1 + * + * @param int $x + * @return int + */ + function Sigma1($x) { return (int)($this->ROTR($x, 6) ^ $this->ROTR($x, 11) ^ $this->ROTR($x, 25)); } + + /** Sigma_0 + * + * @param int $x + * @return int + */ + function sigma_0($x) { return (int)($this->ROTR($x, 7) ^ $this->ROTR($x, 18) ^ $this->SHR($x, 3)); } + + /** Sigma_1 + * + * @param int $x + * @return int + */ + function sigma_1($x) { return (int)($this->ROTR($x, 17) ^ $this->ROTR($x, 19) ^ $this->SHR($x, 10)); } + + /** String 2 ord UTF8 + * + * @param string $s + * @param int $byteSize + * @return array + **/ + function string2ordUTF8($s, &$byteSize) { + $chars = array(); + // par defaut sur 8bits + $byteSize = 8; + $i = 0; + while ($i < strlen($s)) { + $chars[] = $this->ordUTF8($s, $i, $bytes); + $i += $bytes; + // mais si un char necessite 16bits, on passe tout sur 16 + // sinon on ne concorde pas avec le lecture de la chaine en js + // et le sha256 js + if ($bytes > 1) { + $byteSize = 16; + } + } + + return $chars; + } + + /** Ord UTF8 + * + * @param string $c + * @param int $index + * @param int $bytes + * @return unknown + **/ + function ordUTF8($c, $index = 0, &$bytes) { + $len = strlen($c); + $bytes = 0; + + if ($index >= $len) { + return false; + } + + $h = ord($c{$index}); + + if ($h <= 0x7F) { + $bytes = 1; + + return $h; + } else { + if ($h < 0xC2) { + // pas utf mais renvoyer quand meme ce qu'on a + $bytes = 1; + + return $h; + } else { + if ($h <= 0xDF && $index < $len-1) { + $bytes = 2; + + return ($h & 0x1F) << 6 | (ord($c{$index+1}) & 0x3F); + } else { + if ($h <= 0xEF && $index < $len-2) { + $bytes = 3; + + return ($h & 0x0F) << 12 | (ord($c{$index+1}) & 0x3F) << 6 + | (ord($c{$index+2}) & 0x3F); + } else { + if ($h <= 0xF4 && $index < $len-3) { + $bytes = 4; + + return ($h & 0x0F) << 18 | (ord($c{$index+1}) & 0x3F) << 12 + | (ord($c{$index+2}) & 0x3F) << 6 + | (ord($c{$index+3}) & 0x3F); + } else { + // pas utf mais renvoyer quand meme ce qu'on a + $bytes = 1; + + return $h; + } + } + } + } + } + } + + /** String 2 bin int + * + * @param string $str + * @param int $npad + * @return int[] + **/ + function string2binint($str, $npad = 512) { + $bin = array(); + $ords = $this->string2ordUTF8($str, $this->bytesString); + $npad = $npad/$this->bytesString; + $length = count($ords); + $ords[] = 0x80; // append the "1" bit followed by 7 0's + $pad = ceil(($length+1+32/$this->bytesString)/$npad)*$npad-32/$this->bytesString; + $ords = array_pad($ords, $pad, 0); + $mask = (1 << $this->bytesString)-1; + for ($i = 0; $i < count($ords)*$this->bytesString; $i += $this->bytesString) { + if (!isset($bin[$i >> 5])) { + $bin[$i >> 5] = 0; + } // pour eviter des notices. + $bin[$i >> 5] |= ($ords[$i/$this->bytesString] & $mask) << (24-$i%32); + } + $bin[] = $length*$this->bytesString; + + return $bin; + } + + /** Array split + * + * @param array $a + * @param int $n + * @return array + **/ + function array_split($a, $n) { + $split = array(); + while (count($a) > $n) { + $s = array(); + for ($i = 0; $i < $n; $i++) { + $s[] = array_shift($a); + } + $split[] = $s; + } + if (count($a)) { + $a = array_pad($a, $n, 0); + $split[] = $a; + } + + return $split; + } + + /** + * Process and return the hash. + * + * @param $str Input string to hash + * @param $ig_func Option param to ignore checking for php > 5.1.2 + * @return string Hexadecimal representation of the message digest + */ + function hash($str, $ig_func = true) { + unset($binStr); // binary representation of input string + unset($hexStr); // 256-bit message digest in readable hex format + + // check for php's internal sha256 function, ignore if ig_func==true + if ($ig_func == false) { + if (version_compare(PHP_VERSION, '5.1.2', '>=') AND !defined('_NO_HASH_DEFINED')) { + return hash("sha256", $str, false); + } else { + if (function_exists('mhash') && defined('MHASH_SHA256')) { + return base64_encode(bin2hex(mhash(MHASH_SHA256, $str))); + } + } + } + + /* + * SHA-256 Constants + * Sequence of sixty-four constant 32-bit words representing the + * first thirty-two bits of the fractional parts of the cube roots + * of the first sixtyfour prime numbers. + */ + $K = array( + (int)0x428a2f98, + (int)0x71374491, + (int)0xb5c0fbcf, + (int)0xe9b5dba5, + (int)0x3956c25b, + (int)0x59f111f1, + (int)0x923f82a4, + (int)0xab1c5ed5, + (int)0xd807aa98, + (int)0x12835b01, + (int)0x243185be, + (int)0x550c7dc3, + (int)0x72be5d74, + (int)0x80deb1fe, + (int)0x9bdc06a7, + (int)0xc19bf174, + (int)0xe49b69c1, + (int)0xefbe4786, + (int)0x0fc19dc6, + (int)0x240ca1cc, + (int)0x2de92c6f, + (int)0x4a7484aa, + (int)0x5cb0a9dc, + (int)0x76f988da, + (int)0x983e5152, + (int)0xa831c66d, + (int)0xb00327c8, + (int)0xbf597fc7, + (int)0xc6e00bf3, + (int)0xd5a79147, + (int)0x06ca6351, + (int)0x14292967, + (int)0x27b70a85, + (int)0x2e1b2138, + (int)0x4d2c6dfc, + (int)0x53380d13, + (int)0x650a7354, + (int)0x766a0abb, + (int)0x81c2c92e, + (int)0x92722c85, + (int)0xa2bfe8a1, + (int)0xa81a664b, + (int)0xc24b8b70, + (int)0xc76c51a3, + (int)0xd192e819, + (int)0xd6990624, + (int)0xf40e3585, + (int)0x106aa070, + (int)0x19a4c116, + (int)0x1e376c08, + (int)0x2748774c, + (int)0x34b0bcb5, + (int)0x391c0cb3, + (int)0x4ed8aa4a, + (int)0x5b9cca4f, + (int)0x682e6ff3, + (int)0x748f82ee, + (int)0x78a5636f, + (int)0x84c87814, + (int)0x8cc70208, + (int)0x90befffa, + (int)0xa4506ceb, + (int)0xbef9a3f7, + (int)0xc67178f2 + ); + + // Pre-processing: Padding the string + $binStr = $this->string2binint($str, 512); + + // Parsing the Padded Message (Break into N 512-bit blocks) + $M = $this->array_split($binStr, 16); + + // Set the initial hash values + $h[0] = (int)0x6a09e667; + $h[1] = (int)0xbb67ae85; + $h[2] = (int)0x3c6ef372; + $h[3] = (int)0xa54ff53a; + $h[4] = (int)0x510e527f; + $h[5] = (int)0x9b05688c; + $h[6] = (int)0x1f83d9ab; + $h[7] = (int)0x5be0cd19; + + // loop through message blocks and compute hash. ( For i=1 to N : ) + $N = count($M); + for ($i = 0; $i < $N; $i++) { + // Break input block into 16 32bit words (message schedule prep) + $MI = $M[$i]; + + // Initialize working variables + $_a = (int)$h[0]; + $_b = (int)$h[1]; + $_c = (int)$h[2]; + $_d = (int)$h[3]; + $_e = (int)$h[4]; + $_f = (int)$h[5]; + $_g = (int)$h[6]; + $_h = (int)$h[7]; + unset($_s0); + unset($_s1); + unset($_T1); + unset($_T2); + $W = array(); + + // Compute the hash and update + for ($t = 0; $t < 16; $t++) { + // Prepare the first 16 message schedule values as we loop + $W[$t] = $MI[$t]; + + // Compute hash + $_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), + $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t]); + $_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c)); + + // Update working variables + $_h = $_g; + $_g = $_f; + $_f = $_e; + $_e = $this->addmod2n($_d, $_T1); + $_d = $_c; + $_c = $_b; + $_b = $_a; + $_a = $this->addmod2n($_T1, $_T2); + } + + for (; $t < 64; $t++) { + // Continue building the message schedule as we loop + $_s0 = $W[($t+1) & 0x0F]; + $_s0 = $this->sigma_0($_s0); + $_s1 = $W[($t+14) & 0x0F]; + $_s1 = $this->sigma_1($_s1); + + $W[$t & 0xF] = $this->addmod2n($this->addmod2n($this->addmod2n($W[$t & 0xF], $_s0), $_s1), $W[($t+9) & 0x0F]); + + // Compute hash + $_T1 = $this->addmod2n($this->addmod2n($this->addmod2n($this->addmod2n($_h, $this->Sigma1($_e)), + $this->Ch($_e, $_f, $_g)), $K[$t]), $W[$t & 0xF]); + $_T2 = $this->addmod2n($this->Sigma0($_a), $this->Maj($_a, $_b, $_c)); + + // Update working variables + $_h = $_g; + $_g = $_f; + $_f = $_e; + $_e = $this->addmod2n($_d, $_T1); + $_d = $_c; + $_c = $_b; + $_b = $_a; + $_a = $this->addmod2n($_T1, $_T2); + } + + $h[0] = $this->addmod2n($h[0], $_a); + $h[1] = $this->addmod2n($h[1], $_b); + $h[2] = $this->addmod2n($h[2], $_c); + $h[3] = $this->addmod2n($h[3], $_d); + $h[4] = $this->addmod2n($h[4], $_e); + $h[5] = $this->addmod2n($h[5], $_f); + $h[6] = $this->addmod2n($h[6], $_g); + $h[7] = $this->addmod2n($h[7], $_h); + } + + // Convert the 32-bit words into human readable hexadecimal format. + $hexStr = sprintf("%08x%08x%08x%08x%08x%08x%08x%08x", $h[0], $h[1], $h[2], $h[3], $h[4], $h[5], $h[6], $h[7]); + + return ($this->toUpper) ? strtoupper($hexStr) : $hexStr; + } + + } } /** @@ -468,44 +562,44 @@ if (!class_exists('nanoSha2')) * @return string Le SHA de la chaîne */ function _nano_sha256($str, $ig_func = true) { - $obj = new nanoSha2((defined('_NANO_SHA2_UPPER')) ? true : false); - return $obj->hash($str, $ig_func); + $obj = new nanoSha2((defined('_NANO_SHA2_UPPER')) ? true : false); + + return $obj->hash($str, $ig_func); } // 2009-07-23: Added check for function as the Suhosin plugin adds this routine. if (!function_exists('sha256')) { - /** - * Calcul du SHA256 - * @param string $str Chaîne dont on veut calculer le SHA - * @param bool $ig_func - * @return string Le SHA de la chaîne - */ - function sha256($str, $ig_func = true) { return _nano_sha256($str, $ig_func); } + /** + * Calcul du SHA256 + * + * @param string $str Chaîne dont on veut calculer le SHA + * @param bool $ig_func + * @return string Le SHA de la chaîne + */ + function sha256($str, $ig_func = true) { return _nano_sha256($str, $ig_func); } } // support to give php4 the hash() routine which abstracts this code. -if (!function_exists('hash')) -{ - define('_NO_HASH_DEFINED',true); - /** - * Retourne le calcul d'un hachage d'une chaîne (pour PHP4) - * - * @param string $algo Nom de l'algorythme de hachage - * @param string $data Chaîne à hacher - * @return string|bool - * Hash de la chaîne - * False si pas d'algo trouvé - */ - function hash($algo, $data) - { - if (empty($algo) || !is_string($algo) || !is_string($data)) { - return false; - } - - if (function_exists($algo)) { - return $algo($data); - } - } +if (!function_exists('hash')) { + define('_NO_HASH_DEFINED', true); + /** + * Retourne le calcul d'un hachage d'une chaîne (pour PHP4) + * + * @param string $algo Nom de l'algorythme de hachage + * @param string $data Chaîne à hacher + * @return string|bool + * Hash de la chaîne + * False si pas d'algo trouvé + */ + function hash($algo, $data) { + if (empty($algo) || !is_string($algo) || !is_string($data)) { + return false; + } + + if (function_exists($algo)) { + return $algo($data); + } + } } ?> diff --git a/ecrire/auth/spip.php b/ecrire/auth/spip.php index af6be872ba..0fbf09df96 100644 --- a/ecrire/auth/spip.php +++ b/ecrire/auth/spip.php @@ -14,9 +14,11 @@ * Gestion de l'authentification par SPIP * * @package SPIP\Core\Authentification\SPIP -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Authentifie et si ok retourne le tableau de la ligne SQL de l'utilisateur @@ -28,31 +30,31 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param bool $phpauth * @return array|bool */ -function auth_spip_dist ($login, $pass, $serveur = '', $phpauth = false) { +function auth_spip_dist($login, $pass, $serveur = '', $phpauth = false) { // retrouver le login $login = auth_spip_retrouver_login($login); // login inconnu, n'allons pas plus loin - if (!$login) return array(); + if (!$login) { + return array(); + } $md5pass = ""; $shapass = $shanext = ""; - if (preg_match(",^\{([0-9a-f]{64});([0-9a-f]{64})\}$,i",$pass,$regs)){ + if (preg_match(",^\{([0-9a-f]{64});([0-9a-f]{64})\}$,i", $pass, $regs)) { $shapass = $regs[1]; $shanext = $regs[2]; - } - // compat avec une base mixte md5/sha256 : le js a envoye les 2 hash - elseif (preg_match(",^\{([0-9a-f]{64});([0-9a-f]{64});([0-9a-f]{32});([0-9a-f]{32})\}$,i",$pass,$regs)){ + } // compat avec une base mixte md5/sha256 : le js a envoye les 2 hash + elseif (preg_match(",^\{([0-9a-f]{64});([0-9a-f]{64});([0-9a-f]{32});([0-9a-f]{32})\}$,i", $pass, $regs)) { $shapass = $regs[1]; $shanext = $regs[2]; $md5pass = $regs[3]; //$md5next = $regs[4]; - } - - // si envoi non crypte, crypter maintenant + } // si envoi non crypte, crypter maintenant elseif ($pass) { - $row = sql_fetsel("alea_actuel, alea_futur", "spip_auteurs", "login=" . sql_quote($login,$serveur,'text'),'','','','',$serveur); + $row = sql_fetsel("alea_actuel, alea_futur", "spip_auteurs", "login=" . sql_quote($login, $serveur, 'text'), '', '', + '', '', $serveur); if ($row) { include_spip('auth/sha256.inc'); @@ -63,28 +65,44 @@ function auth_spip_dist ($login, $pass, $serveur = '', $phpauth = false) { } // login inexistant ou mot de passe vide - if (!$shapass AND !$md5pass) return array(); + if (!$shapass AND !$md5pass) { + return array(); + } - $row = sql_fetsel("*", "spip_auteurs", "login=" . sql_quote($login,$serveur,'text') . " AND pass=" . sql_quote($shapass,$serveur,'text') . " AND statut<>'5poubelle'",'','','','',$serveur); + $row = sql_fetsel("*", "spip_auteurs", + "login=" . sql_quote($login, $serveur, 'text') . " AND pass=" . sql_quote($shapass, $serveur, + 'text') . " AND statut<>'5poubelle'", '', '', '', '', $serveur); // compat avec les anciennes bases en md5 - if (!$row AND $md5pass) - $row = sql_fetsel("*", "spip_auteurs", "login=" . sql_quote($login,$serveur,'text') . " AND pass=" . sql_quote($md5pass,$serveur,'text') . " AND statut<>'5poubelle'",'','','','',$serveur); + if (!$row AND $md5pass) { + $row = sql_fetsel("*", "spip_auteurs", + "login=" . sql_quote($login, $serveur, 'text') . " AND pass=" . sql_quote($md5pass, $serveur, + 'text') . " AND statut<>'5poubelle'", '', '', '', '', $serveur); + } // login/mot de passe incorrect - if (!$row) return array(); + if (!$row) { + return array(); + } // fait tourner le codage du pass dans la base // sauf si phpauth : cela reviendrait a changer l'alea a chaque hit, et aucune action verifiable par securiser_action() if ($shanext AND !$phpauth) { include_spip('inc/acces'); // pour creer_uniqid - @sql_update('spip_auteurs', array('alea_actuel' => 'alea_futur', 'pass' => sql_quote($shanext,$serveur,'text'), 'alea_futur' => sql_quote(creer_uniqid(),$serveur,'text')), "id_auteur=" . $row['id_auteur'].' AND pass IN ('.sql_quote($shapass,$serveur,'text').', '.sql_quote($md5pass,$serveur,'text').')','',$serveur); + @sql_update('spip_auteurs', array( + 'alea_actuel' => 'alea_futur', + 'pass' => sql_quote($shanext, $serveur, 'text'), + 'alea_futur' => sql_quote(creer_uniqid(), $serveur, 'text') + ), "id_auteur=" . $row['id_auteur'] . ' AND pass IN (' . sql_quote($shapass, $serveur, + 'text') . ', ' . sql_quote($md5pass, $serveur, 'text') . ')', '', $serveur); // En profiter pour verifier la securite de tmp/ // Si elle ne fonctionne pas a l'installation, prevenir - if (!verifier_htaccess(_DIR_TMP) AND defined('_ECRIRE_INSTALL')) + if (!verifier_htaccess(_DIR_TMP) AND defined('_ECRIRE_INSTALL')) { return false; + } } + return $row; } @@ -94,38 +112,42 @@ function auth_spip_dist ($login, $pass, $serveur = '', $phpauth = false) { * @param array $flux * @return array */ -function auth_spip_formulaire_login($flux){ +function auth_spip_formulaire_login($flux) { // faut il encore envoyer md5 ? // on regarde si il reste des pass md5 en base pour des auteurs en statut pas poubelle // les hash md5 ont une longueur 32, les sha 64 // en evitant une requete sql a chaque affichage du formulaire login sans session // (perf issue pour les sites qui mettent le formulaire de login sur la home) $compat_md5 = false; - if (!isset($GLOBALS['meta']['sha_256_only']) OR _request('var_mode')){ + if (!isset($GLOBALS['meta']['sha_256_only']) OR _request('var_mode')) { $compat_md5 = sql_countsel("spip_auteurs", "length(pass)=32 AND statut<>'poubelle'"); - if ($compat_md5 AND isset($GLOBALS['meta']['sha_256_only'])) effacer_meta('sha_256_only'); - if (!$compat_md5) ecrire_meta('sha_256_only','oui'); + if ($compat_md5 AND isset($GLOBALS['meta']['sha_256_only'])) { + effacer_meta('sha_256_only'); + } + if (!$compat_md5) { + ecrire_meta('sha_256_only', 'oui'); + } } // javascript qui gere la securite du login en evitant de faire circuler le pass en clair - $flux['data'].= - ($compat_md5?'<script type="text/javascript" src="'._DIR_JAVASCRIPT.'md5.js"></script>':'') - .'<script type="text/javascript" src="'._DIR_JAVASCRIPT.'login-sha-min.js"></script>' - .'<script type="text/javascript">/*<![CDATA[*/' - ."var login_info={'alea_actuel':'".$flux['args']['contexte']['_alea_actuel']."'," - ."'alea_futur':'".$flux['args']['contexte']['_alea_futur']."'," - ."'login':'".$flux['args']['contexte']['var_login']."'," - ."'page_auteur': '".generer_url_public('informer_auteur')."'," - ."'informe_auteur_en_cours':false," - ."'attente_informe':0," - ."'compat_md5':".($compat_md5?"true":"false")."};" - ."jQuery(function(){ - jQuery('#password').after(\"<em id='pass_securise'><img src='".chemin_image('cadenas-16.png')."' width='16' height='16' alt='" . attribut_html(_T('login_securise')) . "' title='" . attribut_html(_T('login_securise')) . "' \/><\/em>\"); + $flux['data'] .= + ($compat_md5 ? '<script type="text/javascript" src="' . _DIR_JAVASCRIPT . 'md5.js"></script>' : '') + . '<script type="text/javascript" src="' . _DIR_JAVASCRIPT . 'login-sha-min.js"></script>' + . '<script type="text/javascript">/*<![CDATA[*/' + . "var login_info={'alea_actuel':'" . $flux['args']['contexte']['_alea_actuel'] . "'," + . "'alea_futur':'" . $flux['args']['contexte']['_alea_futur'] . "'," + . "'login':'" . $flux['args']['contexte']['var_login'] . "'," + . "'page_auteur': '" . generer_url_public('informer_auteur') . "'," + . "'informe_auteur_en_cours':false," + . "'attente_informe':0," + . "'compat_md5':" . ($compat_md5 ? "true" : "false") . "};" + . "jQuery(function(){ + jQuery('#password').after(\"<em id='pass_securise'><img src='" . chemin_image('cadenas-16.png') . "' width='16' height='16' alt='" . attribut_html(_T('login_securise')) . "' title='" . attribut_html(_T('login_securise')) . "' \/><\/em>\"); affiche_login_secure(); jQuery('#var_login').change(actualise_auteur); jQuery('form#formulaire_login').submit(login_submit); });" - ."/*]]>*/</script>"; + . "/*]]>*/</script>"; return $flux; } @@ -133,13 +155,15 @@ function auth_spip_formulaire_login($flux){ /** * Informer du droit de modifier ou non son login + * * @param string $serveur * @return bool - * toujours true pour un auteur cree dans SPIP + * toujours true pour un auteur cree dans SPIP */ -function auth_spip_autoriser_modifier_login($serveur = ''){ - if (strlen($serveur)) - return false; // les fonctions d'ecriture sur base distante sont encore incompletes +function auth_spip_autoriser_modifier_login($serveur = '') { + if (strlen($serveur)) { + return false; + } // les fonctions d'ecriture sur base distante sont encore incompletes return true; } @@ -148,22 +172,26 @@ function auth_spip_autoriser_modifier_login($serveur = ''){ * * @param string $new_login * @param int $id_auteur - * si auteur existant deja + * si auteur existant deja * @param string $serveur * @return string - * message d'erreur si login non valide, chaine vide sinon + * message d'erreur si login non valide, chaine vide sinon */ -function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = ''){ +function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = '') { // login et mot de passe - if (strlen($new_login)){ - if (strlen($new_login) < _LOGIN_TROP_COURT) - return _T('info_login_trop_court_car_pluriel',array('nb'=>_LOGIN_TROP_COURT)); - else { - $n = sql_countsel('spip_auteurs', "login=" . sql_quote($new_login) . " AND id_auteur!=".intval($id_auteur)." AND statut!='5poubelle'",'','',$serveur); - if ($n) + if (strlen($new_login)) { + if (strlen($new_login) < _LOGIN_TROP_COURT) { + return _T('info_login_trop_court_car_pluriel', array('nb' => _LOGIN_TROP_COURT)); + } else { + $n = sql_countsel('spip_auteurs', + "login=" . sql_quote($new_login) . " AND id_auteur!=" . intval($id_auteur) . " AND statut!='5poubelle'", '', '', + $serveur); + if ($n) { return _T('info_login_existant'); + } } } + return ''; } @@ -175,26 +203,31 @@ function auth_spip_verifier_login($new_login, $id_auteur = 0, $serveur = ''){ * @param string $serveur * @return bool */ -function auth_spip_modifier_login($new_login, $id_auteur, $serveur = ''){ - if (is_null($new_login) OR auth_spip_verifier_login($new_login,$id_auteur,$serveur)!='') +function auth_spip_modifier_login($new_login, $id_auteur, $serveur = '') { + if (is_null($new_login) OR auth_spip_verifier_login($new_login, $id_auteur, $serveur) != '') { return false; + } if (!$id_auteur = intval($id_auteur) - OR !$auteur = sql_fetsel('login','spip_auteurs','id_auteur='.intval($id_auteur),'','','','',$serveur)) + OR !$auteur = sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) + ) { return false; - if ($new_login == $auteur['login']) - return true; // on a rien fait mais c'est bon ! + } + if ($new_login == $auteur['login']) { + return true; + } // on a rien fait mais c'est bon ! include_spip('action/editer_auteur'); // vider le login des auteurs a la poubelle qui avaient ce meme login - if (strlen($new_login)){ - $anciens = sql_allfetsel('id_auteur','spip_auteurs','login='.sql_quote($new_login,$serveur,'text')." AND statut='5poubelle'",'','','','',$serveur); - while ($row = array_pop($anciens)){ - auteur_modifier($row['id_auteur'], array('login'=>''), true); // manque la gestion de $serveur + if (strlen($new_login)) { + $anciens = sql_allfetsel('id_auteur', 'spip_auteurs', + 'login=' . sql_quote($new_login, $serveur, 'text') . " AND statut='5poubelle'", '', '', '', '', $serveur); + while ($row = array_pop($anciens)) { + auteur_modifier($row['id_auteur'], array('login' => ''), true); // manque la gestion de $serveur } } - auteur_modifier($id_auteur, array('login'=>$new_login), true); // manque la gestion de $serveur + auteur_modifier($id_auteur, array('login' => $new_login), true); // manque la gestion de $serveur return true; } @@ -207,22 +240,28 @@ function auth_spip_modifier_login($new_login, $id_auteur, $serveur = ''){ * @param string $serveur * @return string */ -function auth_spip_retrouver_login($login, $serveur = ''){ - if (!strlen($login)) return null; // pas la peine de requeter - $l = sql_quote($login,$serveur,'text'); +function auth_spip_retrouver_login($login, $serveur = '') { + if (!strlen($login)) { + return null; + } // pas la peine de requeter + $l = sql_quote($login, $serveur, 'text'); if ($r = sql_getfetsel('login', 'spip_auteurs', - "statut<>'5poubelle'" . - " AND (length(pass)>0)" . - " AND (login=$l)",'','','','',$serveur)) + "statut<>'5poubelle'" . + " AND (length(pass)>0)" . + " AND (login=$l)", '', '', '', '', $serveur) + ) { return $r; + } // Si pas d'auteur avec ce login // regarder s'il a saisi son nom ou son mail. // Ne pas fusionner avec la requete precedente // car un nom peut etre homonyme d'un autre login - else return sql_getfetsel('login', 'spip_auteurs', + else { + return sql_getfetsel('login', 'spip_auteurs', "statut<>'5poubelle'" . " AND (length(pass)>0)" . - " AND (login<>'' AND (nom=$l OR email=$l))",'','','','',$serveur); + " AND (login<>'' AND (nom=$l OR email=$l))", '', '', '', '', $serveur); + } } @@ -238,7 +277,7 @@ function auth_spip_retrouver_login($login, $serveur = ''){ * @param string $serveur * @return array */ -function auth_spip_informer_login($infos, $row, $serveur = ''){ +function auth_spip_informer_login($infos, $row, $serveur = '') { // pour la methode SPIP on a besoin des alea en plus pour encoder le pass avec $infos['alea_actuel'] = $row['alea_actuel']; @@ -249,13 +288,15 @@ function auth_spip_informer_login($infos, $row, $serveur = ''){ /** * Informer du droit de modifier ou non le pass + * * @param string $serveur * @return bool - * toujours true pour un auteur cree dans SPIP + * toujours true pour un auteur cree dans SPIP */ -function auth_spip_autoriser_modifier_pass($serveur = ''){ - if (strlen($serveur)) - return false; // les fonctions d'ecriture sur base distante sont encore incompletes +function auth_spip_autoriser_modifier_pass($serveur = '') { + if (strlen($serveur)) { + return false; + } // les fonctions d'ecriture sur base distante sont encore incompletes return true; } @@ -266,20 +307,21 @@ function auth_spip_autoriser_modifier_pass($serveur = ''){ * ou de force * * @param string $login - * Le login de l'auteur : permet de verifier que pass et login sont differents + * Le login de l'auteur : permet de verifier que pass et login sont differents * meme a la creation lorsque l'auteur n'existe pas encore * @param string $new_pass - * Nouveau mot de passe + * Nouveau mot de passe * @param int $id_auteur - * si auteur existant deja + * si auteur existant deja * @param string $serveur * @return string - * message d'erreur si login non valide, chaine vide sinon + * message d'erreur si login non valide, chaine vide sinon */ -function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = ''){ +function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = '') { // login et mot de passe - if (strlen($new_pass) < _PASS_LONGUEUR_MINI) - return _T('info_passe_trop_court_car_pluriel',array('nb'=>_PASS_LONGUEUR_MINI)); + if (strlen($new_pass) < _PASS_LONGUEUR_MINI) { + return _T('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI)); + } return ''; } @@ -287,19 +329,23 @@ function auth_spip_verifier_pass($login, $new_pass, $id_auteur = 0, $serveur = ' /** * Modifier le mot de passe de l'auteur sur le serveur concerne * en s'occupant du hash et companie + * * @param string $login * @param string $new_pass * @param int $id_auteur * @param string $serveur * @return bool */ -function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = ''){ - if (is_null($new_pass) OR auth_spip_verifier_pass($login, $new_pass,$id_auteur,$serveur)!='') +function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = '') { + if (is_null($new_pass) OR auth_spip_verifier_pass($login, $new_pass, $id_auteur, $serveur) != '') { return false; + } if (!$id_auteur = intval($id_auteur) - OR !sql_fetsel('login','spip_auteurs','id_auteur='.intval($id_auteur),'','','','',$serveur)) + OR !sql_fetsel('login', 'spip_auteurs', 'id_auteur=' . intval($id_auteur), '', '', '', '', $serveur) + ) { return false; + } $c = array(); include_spip('inc/acces'); @@ -307,7 +353,7 @@ function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = ''){ $htpass = generer_htpass($new_pass); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); - $pass = _nano_sha256($alea_actuel.$new_pass); + $pass = _nano_sha256($alea_actuel . $new_pass); $c['pass'] = $pass; $c['htpass'] = $htpass; $c['alea_actuel'] = $alea_actuel; @@ -326,14 +372,15 @@ function auth_spip_modifier_pass($login, $new_pass, $id_auteur, $serveur = ''){ * @param int $id_auteur * @param array $champs * @param array $options - * all=>true permet de demander la regeneration complete des acces apres operation en base (import, upgrade) + * all=>true permet de demander la regeneration complete des acces apres operation en base (import, upgrade) * @param string $serveur * @return void */ -function auth_spip_synchroniser_distant($id_auteur, $champs, $options = array(), $serveur = ''){ +function auth_spip_synchroniser_distant($id_auteur, $champs, $options = array(), $serveur = '') { // ne rien faire pour une base distante : on ne sait pas regenerer les htaccess - if (strlen($serveur)) + if (strlen($serveur)) { return; + } // si un login, pass ou statut a ete modifie // regenerer les fichier htpass if (isset($champs['login']) @@ -349,9 +396,11 @@ function auth_spip_synchroniser_distant($id_auteur, $champs, $options = array(), // par exemple acces_restreint ; // si .htaccess existe, outrepasser spip_meta if ((!isset($GLOBALS['meta']['creer_htpasswd']) OR ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) - AND !@file_exists($htaccess)) { + AND !@file_exists($htaccess) + ) { spip_unlink($htpasswd); - spip_unlink($htpasswd."-admin"); + spip_unlink($htpasswd . "-admin"); + return; } @@ -361,18 +410,20 @@ function auth_spip_synchroniser_distant($id_auteur, $champs, $options = array(), $p1 = ''; // login:htpass pour tous $p2 = ''; // login:htpass pour les admins - $s = sql_select("login, htpass, statut", "spip_auteurs", sql_in("statut", array('1comite','0minirezo','nouveau'))); + $s = sql_select("login, htpass, statut", "spip_auteurs", + sql_in("statut", array('1comite', '0minirezo', 'nouveau'))); while ($t = sql_fetch($s)) { if (strlen($t['login']) AND strlen($t['htpass'])) { - $p1 .= $t['login'].':'.$t['htpass']."\n"; - if ($t['statut'] == '0minirezo') - $p2 .= $t['login'].':'.$t['htpass']."\n"; + $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; + if ($t['statut'] == '0minirezo') { + $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; + } } } sql_free($s); if ($p1) { ecrire_fichier($htpasswd, $p1); - ecrire_fichier($htpasswd.'-admin', $p2); + ecrire_fichier($htpasswd . '-admin', $p2); spip_log("Ecriture de $htpasswd et $htpasswd-admin"); } } diff --git a/ecrire/balise/configurer_metas.php b/ecrire/balise/configurer_metas.php index d147c7d304..dab3806803 100644 --- a/ecrire/balise/configurer_metas.php +++ b/ecrire/balise/configurer_metas.php @@ -13,10 +13,12 @@ /** * Ce fichier gère la balise dynamique `#CONFIGURER_METAS` - * + * * @package SPIP\Core\Compilateur\Balises -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -32,16 +34,16 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * utiliser `#FORMULAIRE_CONFIGURER_NOM` qui appelle le formulaire `nom.html` * et dans ce formulaire indiquer un champ hidden spécifiant la table d'enregistrement * tel que : - * + * * Chaque saisie à la racine de la table spip_nom : * <input type="hidden" name="_meta_casier" value="/nom" /> - * + * * Toutes les saisies dans la clé 'config' de spip_nom : * <input type="hidden" name="_meta_casier" value="/nom/config" /> - * + * * Chaque saisie à la racine de la table spip_meta : * <input type="hidden" name="_meta_casier" value="" /> - * + * * Toutes les saisies dans la clé 'config' de spip_meta : * <input type="hidden" name="_meta_casier" value="config" /> * @@ -56,7 +58,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ + **/ function balise_CONFIGURER_METAS_dist($p) { return calculer_balise_dynamique($p, $p->nom_champ, array()); } @@ -70,17 +72,22 @@ function balise_CONFIGURER_METAS_dist($p) { * * @see balise_CONFIGURER_METAS_dist() * @param string $form - * Nom du formulaire + * Nom du formulaire * @return array * Liste : Chemin du squelette, durée du cache, contexte -**/ + **/ function balise_CONFIGURER_METAS_dyn($form) { include_spip('balise/formulaire_'); - if (!existe_formulaire($form)) return ''; + if (!existe_formulaire($form)) { + return ''; + } $args = func_get_args(); $contexte = balise_FORMULAIRE__contexte('configurer_metas', $args); - if (!is_array($contexte)) return $contexte; + if (!is_array($contexte)) { + return $contexte; + } + return array('formulaires/' . $form, 3600, $contexte); } diff --git a/ecrire/balise/formulaire_.php b/ecrire/balise/formulaire_.php index d2e52c7399..02b823aeda 100644 --- a/ecrire/balise/formulaire_.php +++ b/ecrire/balise/formulaire_.php @@ -13,15 +13,17 @@ * Fonctions génériques pour les balises formulaires * * @package SPIP\Core\Formulaires -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres'); include_spip('inc/texte'); /** * Protéger les saisies d'un champ de formulaire - * + * * Proteger les ' et les " dans les champs que l'on va injecter, * sans toucher aux valeurs sérialisées * @@ -30,23 +32,25 @@ include_spip('inc/texte'); * Saisie à protéger * @return string|array * Saisie protégée -**/ -function protege_champ($texte){ - if (is_array($texte)) - $texte = array_map('protege_champ',$texte); - else { + **/ +function protege_champ($texte) { + if (is_array($texte)) { + $texte = array_map('protege_champ', $texte); + } else { // ne pas corrompre une valeur serialize - if ((preg_match(",^[abis]:\d+[:;],", $texte) AND @unserialize($texte)!=false) OR is_null($texte)) + if ((preg_match(",^[abis]:\d+[:;],", $texte) AND @unserialize($texte) != false) OR is_null($texte)) { return $texte; + } if (is_string($texte) AND $texte - AND strpbrk($texte, "&\"'<>")!==false - ) { - $texte = spip_htmlspecialchars($texte,ENT_QUOTES); + AND strpbrk($texte, "&\"'<>") !== false + ) { + $texte = spip_htmlspecialchars($texte, ENT_QUOTES); + } elseif (is_bool($texte)) { + $texte = ($texte ? '1' : ''); } - elseif(is_bool($texte)) - $texte = ($texte?'1':''); } + return $texte; } @@ -59,15 +63,17 @@ function protege_champ($texte){ * @return string|bool * - string : chemin du squelette * - false : pas de squelette trouvé -**/ -function existe_formulaire($form) -{ - if (substr($form,0,11)=="FORMULAIRE_") - $form = strtolower(substr($form,11)); - else + **/ +function existe_formulaire($form) { + if (substr($form, 0, 11) == "FORMULAIRE_") { + $form = strtolower(substr($form, 11)); + } else { $form = strtolower($form); + } - if (!$form) return ''; // on ne sait pas, le nom du formulaire n'est pas fourni ici + if (!$form) { + return ''; + } // on ne sait pas, le nom du formulaire n'est pas fourni ici return trouver_fond($form, 'formulaires/') ? $form : false; } @@ -76,21 +82,22 @@ function existe_formulaire($form) /** * Balises Formulaires par défaut. * - * Compilé en un appel à une balise dynamique. + * Compilé en un appel à une balise dynamique. * * @param Champ $p * Description de la balise formulaire * @return Champ * Description complétée du code compilé appelant la balise dynamique -**/ + **/ function balise_FORMULAIRE__dist($p) { // Cas d'un #FORMULAIRE_TOTO inexistant : renvoyer la chaine vide. // mais si #FORMULAIRE_{toto} on ne peut pas savoir a la compilation, continuer - if (existe_formulaire($p->nom_champ)===FALSE) { - $p->code = "''"; - $p->interdire_scripts = false; - return $p; + if (existe_formulaire($p->nom_champ) === false) { + $p->code = "''"; + $p->interdire_scripts = false; + + return $p; } // sinon renvoyer un code php dynamique @@ -106,10 +113,11 @@ function balise_FORMULAIRE__dist($p) { * - array : squelette à appeler, durée du cache, contexte * - string : texte à afficher directement */ -function balise_FORMULAIRE__dyn($form) -{ +function balise_FORMULAIRE__dyn($form) { $form = existe_formulaire($form); - if (!$form) return ''; + if (!$form) { + return ''; + } // deux moyen d'arriver ici : // soit #FORMULAIRE_XX reroute avec 'FORMULAIRE_XX' ajoute en premier arg @@ -122,12 +130,15 @@ function balise_FORMULAIRE__dyn($form) $args = func_get_args(); array_shift($args); $contexte = balise_FORMULAIRE__contexte($form, $args); - if (!is_array($contexte)) return $contexte; + if (!is_array($contexte)) { + return $contexte; + } + return array("formulaires/$form", 3600, $contexte); } /** - * Calcule le contexte à envoyer dans le squelette d'un formulaire + * Calcule le contexte à envoyer dans le squelette d'un formulaire * * @param string $form * Nom du formulaire @@ -135,22 +146,23 @@ function balise_FORMULAIRE__dyn($form) * Arguments envoyés à l'appel du formulaire * @return array * Contexte d'environnement à envoyer au squelette -**/ -function balise_FORMULAIRE__contexte($form, $args) -{ + **/ +function balise_FORMULAIRE__contexte($form, $args) { // tester si ce formulaire vient d'etre poste (memes arguments) // pour ne pas confondre 2 #FORMULAIRES_XX identiques sur une meme page // si poste, on recupere les erreurs $je_suis_poste = false; if ($post_form = _request('formulaire_action') - AND $post_form==$form - AND $p = _request('formulaire_action_args') - AND is_array($p = decoder_contexte_ajax($p, $post_form))) { + AND $post_form == $form + AND $p = _request('formulaire_action_args') + AND is_array($p = decoder_contexte_ajax($p, $post_form)) + ) { // enlever le faux attribut de langue masque array_shift($p); - if (formulaire__identifier($form, $args, $p)) + if (formulaire__identifier($form, $args, $p)) { $je_suis_poste = true; + } } $editable = true; @@ -161,8 +173,8 @@ function balise_FORMULAIRE__contexte($form, $args) $erreurs = isset($post[$e]) ? $post[$e] : array(); $editable = "editable_$form"; $editable = (!isset($post[$e])) - || count($erreurs) - || (isset($post[$editable]) && $post[$editable]); + || count($erreurs) + || (isset($post[$editable]) && $post[$editable]); } $valeurs = formulaire__charger($form, $args, $je_suis_poste); @@ -170,14 +182,16 @@ function balise_FORMULAIRE__contexte($form, $args) // si $valeurs n'est pas un tableau, le formulaire n'est pas applicable // C'est plus fort qu'editable qui est gere par le squelette // Idealement $valeur doit etre alors un message explicatif. - if (!is_array($valeurs)) return is_string($valeurs) ? $valeurs : ''; - + if (!is_array($valeurs)) { + return is_string($valeurs) ? $valeurs : ''; + } + // charger peut passer une action si le formulaire ne tourne pas sur self() // ou une action vide si elle ne sert pas $action = (isset($valeurs['action'])) ? $valeurs['action'] : self('&', true); // bug IEx : si action finit par / // IE croit que le <form ... action=../ > est autoferme - if (substr($action,-1)=='/') { + if (substr($action, -1) == '/') { // on ajoute une ancre pour feinter IE, au pire ca tue l'ancre qui finit par un / $action .= '#'; } @@ -186,13 +200,15 @@ function balise_FORMULAIRE__contexte($form, $args) // seulement si c'est ce formulaire qui est poste // ou si on le demande explicitement par le parametre _forcer_request = true $dispo = ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])); - foreach(array_keys($valeurs) as $champ){ - if ($champ[0]!=='_' AND !in_array($champ, array('message_ok','message_erreur','editable'))) { - if ($dispo AND (($v = _request($champ))!==NULL)) + foreach (array_keys($valeurs) as $champ) { + if ($champ[0] !== '_' AND !in_array($champ, array('message_ok', 'message_erreur', 'editable'))) { + if ($dispo AND (($v = _request($champ)) !== null)) { $valeurs[$champ] = $v; + } // nettoyer l'url des champs qui vont etre saisis - if ($action) - $action = parametre_url($action,$champ,''); + if ($action) { + $action = parametre_url($action, $champ, ''); + } // proteger les ' et les " dans les champs que l'on va injecter $valeurs[$champ] = protege_champ($valeurs[$champ]); } @@ -200,16 +216,16 @@ function balise_FORMULAIRE__contexte($form, $args) if ($action) { // nettoyer l'url - $action = parametre_url($action,'formulaire_action',''); - $action = parametre_url($action,'formulaire_action_args',''); + $action = parametre_url($action, 'formulaire_action', ''); + $action = parametre_url($action, 'formulaire_action_args', ''); } - if (isset($valeurs['_action'])){ - $securiser_action = charger_fonction('securiser_action','inc'); - $secu = $securiser_action(reset($valeurs['_action']),end($valeurs['_action']),'',-1); - $valeurs['_hidden'] = (isset($valeurs['_hidden'])?$valeurs['_hidden']:'') . - "<input type='hidden' name='arg' value='".$secu['arg']."' />" - . "<input type='hidden' name='hash' value='".$secu['hash']."' />"; + if (isset($valeurs['_action'])) { + $securiser_action = charger_fonction('securiser_action', 'inc'); + $secu = $securiser_action(reset($valeurs['_action']), end($valeurs['_action']), '', -1); + $valeurs['_hidden'] = (isset($valeurs['_hidden']) ? $valeurs['_hidden'] : '') . + "<input type='hidden' name='arg' value='" . $secu['arg'] . "' />" + . "<input type='hidden' name='hash' value='" . $secu['hash'] . "' />"; } // empiler la lang en tant que premier argument implicite du CVT @@ -221,24 +237,30 @@ function balise_FORMULAIRE__contexte($form, $args) $valeurs['action'] = $action; $valeurs['form'] = $form; - if (!isset($valeurs['id'])) $valeurs['id'] = 'new'; + if (!isset($valeurs['id'])) { + $valeurs['id'] = 'new'; + } // editable peut venir de charger() ou de traiter() sinon - if (!isset($valeurs['editable'])) $valeurs['editable'] = $editable; + if (!isset($valeurs['editable'])) { + $valeurs['editable'] = $editable; + } // dans tous les cas, renvoyer un espace ou vide (et pas un booleen) - $valeurs['editable'] = ($valeurs['editable']?' ':''); + $valeurs['editable'] = ($valeurs['editable'] ? ' ' : ''); if ($je_suis_poste) { $valeurs['message_erreur'] = ""; - if (isset($erreurs['message_erreur'])) + if (isset($erreurs['message_erreur'])) { $valeurs['message_erreur'] = $erreurs['message_erreur']; + } $valeurs['message_ok'] = ""; - if (isset($post["message_ok_$form"])) + if (isset($post["message_ok_$form"])) { $valeurs['message_ok'] = $post["message_ok_$form"]; - elseif (isset($erreurs['message_ok'])) + } elseif (isset($erreurs['message_ok'])) { $valeurs['message_ok'] = $erreurs["message_ok"]; + } } - + return $valeurs; } @@ -250,36 +272,40 @@ function balise_FORMULAIRE__contexte($form, $args) * @param bool $poste * @return array */ -function formulaire__charger($form, $args, $poste) -{ - if ($charger_valeurs = charger_fonction("charger","formulaires/$form",true)) - $valeurs = call_user_func_array($charger_valeurs,$args); - else $valeurs = array(); +function formulaire__charger($form, $args, $poste) { + if ($charger_valeurs = charger_fonction("charger", "formulaires/$form", true)) { + $valeurs = call_user_func_array($charger_valeurs, $args); + } else { + $valeurs = array(); + } $valeurs = pipeline( 'formulaire_charger', array( - 'args'=>array('form'=>$form,'args'=>$args,'je_suis_poste'=>$poste), - 'data'=>$valeurs) + 'args' => array('form' => $form, 'args' => $args, 'je_suis_poste' => $poste), + 'data' => $valeurs + ) ); // si $valeurs et false ou une chaine, pas de formulaire, donc pas de pipeline ! - if (is_array($valeurs)){ - if (!isset($valeurs['_pipelines'])) $valeurs['_pipelines']=array(); + if (is_array($valeurs)) { + if (!isset($valeurs['_pipelines'])) { + $valeurs['_pipelines'] = array(); + } // l'ancien argument _pipeline devient maintenant _pipelines // reinjectons le vieux _pipeline au debut de _pipelines if (isset($valeurs['_pipeline'])) { - $pipe = is_array($valeurs['_pipeline'])?reset($valeurs['_pipeline']):$valeurs['_pipeline']; - $args = is_array($valeurs['_pipeline'])?end($valeurs['_pipeline']):array(); + $pipe = is_array($valeurs['_pipeline']) ? reset($valeurs['_pipeline']) : $valeurs['_pipeline']; + $args = is_array($valeurs['_pipeline']) ? end($valeurs['_pipeline']) : array(); - $pipelines = array($pipe=>$args); - $valeurs['_pipelines'] = array_merge($pipelines,$valeurs['_pipelines']); + $pipelines = array($pipe => $args); + $valeurs['_pipelines'] = array_merge($pipelines, $valeurs['_pipelines']); } // et enfin, ajoutons systematiquement un pipeline sur le squelette du formulaire // qui constitue le cas le plus courant d'utilisation du pipeline recuperer_fond // (performance, cela evite de s'injecter dans recuperer_fond utilise pour *tous* les squelettes) - $valeurs['_pipelines']['formulaire_fond'] = array('form'=>$form,'args'=>$args,'je_suis_poste'=>$poste); + $valeurs['_pipelines']['formulaire_fond'] = array('form' => $form, 'args' => $args, 'je_suis_poste' => $poste); } return $valeurs; @@ -287,7 +313,7 @@ function formulaire__charger($form, $args, $poste) /** * Vérifier que le formulaire en cours est celui qui est poste - * + * * On se base sur la fonction identifier (si elle existe) qui fournit * une signature identifiant le formulaire a partir de ses arguments * significatifs @@ -301,9 +327,11 @@ function formulaire__charger($form, $args, $poste) * @return bool */ function formulaire__identifier($form, $args, $p) { - if ($identifier_args = charger_fonction("identifier","formulaires/$form",true)) { - return call_user_func_array($identifier_args,$args)===call_user_func_array($identifier_args,$p); + if ($identifier_args = charger_fonction("identifier", "formulaires/$form", true)) { + return call_user_func_array($identifier_args, $args) === call_user_func_array($identifier_args, $p); } - return $args===$p; + + return $args === $p; } + ?> diff --git a/ecrire/balise/formulaire_admin.php b/ecrire/balise/formulaire_admin.php index b3a3347be0..1d2163a4f2 100644 --- a/ecrire/balise/formulaire_admin.php +++ b/ecrire/balise/formulaire_admin.php @@ -12,11 +12,13 @@ /** * Ce fichier gère la balise dynamique `#FORMULAIRE_ADMIN` - * + * * @package SPIP\Core\Formulaires -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise dynamique `#FORMULAIRE_ADMIN` qui des boutons @@ -26,7 +28,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * endroit spécifique du site. Si cette balise n'est pas présente, les boutons * seront automatiquement ajoutés par SPIP si l'auteur a activé le * cookie de correspondance. - * + * * @balise * @see f_admin() * @example @@ -38,14 +40,14 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ -function balise_FORMULAIRE_ADMIN ($p) { - return calculer_balise_dynamique($p,'FORMULAIRE_ADMIN', array()); + **/ +function balise_FORMULAIRE_ADMIN($p) { + return calculer_balise_dynamique($p, 'FORMULAIRE_ADMIN', array()); } /** * Calculs de paramètres de contexte automatiques pour la balise FORMULAIRE_ADMIN - * + * * On ne peut rien dire au moment de l'execution du squelette * * @param array $args @@ -67,41 +69,44 @@ function balise_FORMULAIRE_ADMIN_stat($args, $context_compil) { * @note * Les boutons admin sont mis d'autorité si absents * donc une variable statique contrôle si FORMULAIRE_ADMIN a été vu. - * + * * Toutefois, si c'est le debuger qui appelle, il peut avoir recopié * le code dans ses données et il faut le lui refournir. * Pas question de recompiler: ca fait boucler ! * Le debuger transmet donc ses données, et cette balise y retrouve son petit. - * + * * @param string $float * Classe CSS éventuelle * @param string|array $debug * Informations sur la page contenant une erreur de compilation * @return array * Liste : Chemin du squelette, durée du cache, contexte -**/ + **/ function balise_FORMULAIRE_ADMIN_dyn($float = '', $debug = '') { static $dejafait = false; - if (!@$_COOKIE['spip_admin']) + if (!@$_COOKIE['spip_admin']) { return ''; + } if (!is_array($debug)) { - if ($dejafait) + if ($dejafait) { return ''; + } } else { if ($dejafait) { if (empty($debug['sourcefile'])) { return ''; } - foreach($debug['sourcefile'] as $k => $v) { + foreach ($debug['sourcefile'] as $k => $v) { if (strpos($v, 'administration.') !== false) { if (isset($debug['resultat'][$k . 'tout'])) { return $debug['resultat'][$k . 'tout']; } } } + return ''; } } @@ -117,24 +122,26 @@ function balise_FORMULAIRE_ADMIN_dyn($float = '', $debug = '') { $env = admin_objet(); // Pas de "modifier ce..." ? -> donner "acces a l'espace prive" - if (!$env) + if (!$env) { $env['ecrire'] = _DIR_RESTREINT_ABS; + } $env['divclass'] = $float; $env['lang'] = admin_lang(); $env['calcul'] = (_request('var_mode') ? 'recalcul' : 'calcul'); $env['debug'] = ((defined('_VAR_PREVIEW') AND _VAR_PREVIEW) ? "" : admin_debug()); $env['analyser'] = (!$env['debug'] AND !$GLOBALS['xhtml']) ? '' : admin_valider(); - $env['inclure'] = ((defined('_VAR_INCLURE') AND _VAR_INCLURE)?'inclure':''); + $env['inclure'] = ((defined('_VAR_INCLURE') AND _VAR_INCLURE) ? 'inclure' : ''); - if (!$GLOBALS['use_cache']) + if (!$GLOBALS['use_cache']) { $env['use_cache'] = ' *'; - + } + if (isset($debug['validation'])) { $env['xhtml_error'] = $debug['validation']; } - - $env['_pipelines']['formulaire_admin']=array(); + + $env['_pipelines']['formulaire_admin'] = array(); return array('formulaires/administration', 0, $env); } @@ -149,46 +156,49 @@ function balise_FORMULAIRE_ADMIN_dyn($float = '', $debug = '') { * @note * Attention à l'ordre dans la boucle: * on ne veut pas la rubrique si un autre bouton est possible - * + * * @return array * Tableau de l'environnement calculé -**/ -function admin_objet() -{ + **/ +function admin_objet() { include_spip('inc/urls'); $env = array(); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $objets = urls_liste_objets(false); $objets = array_diff($objets, array('rubrique')); $objets = array_reverse($objets); array_unshift($objets, 'rubrique'); foreach ($objets as $obj) { $type = $obj; - if ($type==objet_type($type,false) + if ($type == objet_type($type, false) AND $_id_type = id_table_objet($type) AND isset($GLOBALS['contexte'][$_id_type]) AND $id = $GLOBALS['contexte'][$_id_type] AND !is_array($id) - AND $id=intval($id)) { - $id = sql_getfetsel($_id_type, table_objet_sql($type), "$_id_type=".intval($id)); + AND $id = intval($id) + ) { + $id = sql_getfetsel($_id_type, table_objet_sql($type), "$_id_type=" . intval($id)); if ($id) { $env[$_id_type] = $id; $env['objet'] = $type; $env['id_objet'] = $id; - $env['voir_'.$obj] = - str_replace('&', '&', generer_url_entite($id,$obj,'','',false)); + $env['voir_' . $obj] = + str_replace('&', '&', generer_url_entite($id, $obj, '', '', false)); if ($desc = $trouver_table(table_objet_sql($type)) AND isset($desc['field']['id_rubrique']) - AND $type != 'rubrique') { + AND $type != 'rubrique' + ) { unset($env['id_rubrique']); unset($env['voir_rubrique']); - if (admin_preview($type, $id, $desc)) - $env['preview']=parametre_url(self(),'var_mode','preview','&'); + if (admin_preview($type, $id, $desc)) { + $env['preview'] = parametre_url(self(), 'var_mode', 'preview', '&'); + } } } } } + return $env; } @@ -205,27 +215,32 @@ function admin_objet() * @return string|array * - Chaine vide si on est déjà en prévisu ou si pas de previsualisation possible * - Tableau d'un élément sinon. -**/ -function admin_preview($type, $id, $desc = null) -{ - if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW) return ''; + **/ +function admin_preview($type, $id, $desc = null) { + if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW) { + return ''; + } if (!$desc) { - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table(table_objet_sql($type)); } - if (!$desc OR !isset($desc['field']['statut'])) + if (!$desc OR !isset($desc['field']['statut'])) { return ''; + } include_spip('inc/autoriser'); - if (!autoriser('previsualiser')) return ''; + if (!autoriser('previsualiser')) { + return ''; + } $notpub = sql_in("statut", array('prop', 'prive')); - if ($type == 'article' AND $GLOBALS['meta']['post_dates'] != 'oui') - $notpub .= " OR (statut='publie' AND date>".sql_quote(date('Y-m-d H:i:s')).")"; + if ($type == 'article' AND $GLOBALS['meta']['post_dates'] != 'oui') { + $notpub .= " OR (statut='publie' AND date>" . sql_quote(date('Y-m-d H:i:s')) . ")"; + } - return sql_fetsel('1', table_objet_sql($type), id_table_objet($type)."=".$id." AND ($notpub)"); + return sql_fetsel('1', table_objet_sql($type), id_table_objet($type) . "=" . $id . " AND ($notpub)"); } @@ -234,15 +249,20 @@ function admin_preview($type, $id, $desc = null) * * @return string * Code de langue -**/ -function admin_lang() -{ - $alang = sql_getfetsel('lang', 'spip_auteurs', "login=" . sql_quote(preg_replace(',^@,','',@$_COOKIE['spip_admin']))); - if (!$alang) return ''; + **/ +function admin_lang() { + $alang = sql_getfetsel('lang', 'spip_auteurs', + "login=" . sql_quote(preg_replace(',^@,', '', @$_COOKIE['spip_admin']))); + if (!$alang) { + return ''; + } $l = lang_select($alang); $alang = $GLOBALS['spip_lang']; - if ($l) lang_select(); + if ($l) { + lang_select(); + } + return $alang; } @@ -250,24 +270,22 @@ function admin_lang() * Retourne une URL vers un validateur * * @return string -**/ -function admin_valider() -{ + **/ +function admin_valider() { return ((!isset($GLOBALS['xhtml']) OR $GLOBALS['xhtml'] !== 'true') ? (parametre_url(self(), 'var_mode', 'debug', '&') - .'&var_mode_affiche=validation') : + . '&var_mode_affiche=validation') : ('http://validator.w3.org/check?uri=' - . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri()))); + . rawurlencode("http://" . $_SERVER['HTTP_HOST'] . nettoyer_uri()))); } /** * Retourne une URL vers le mode debug, si l'utilisateur a le droit, et si c'est utile * * @return string -**/ -function admin_debug() -{ + **/ +function admin_debug() { return (( (isset($GLOBALS['forcer_debug']) AND $GLOBALS['forcer_debug']) OR (isset($GLOBALS['bouton_admin_debug']) AND $GLOBALS['bouton_admin_debug']) @@ -276,8 +294,8 @@ function admin_debug() AND isset($_COOKIE['spip_debug']) AND $_COOKIE['spip_debug'] ) ) AND autoriser('debug') - ) - ? parametre_url(self(),'var_mode', 'debug', '&'): ''; + ) + ? parametre_url(self(), 'var_mode', 'debug', '&') : ''; } ?> diff --git a/ecrire/balise/formulaire_ecrire_auteur.php b/ecrire/balise/formulaire_ecrire_auteur.php index 16a2dc5425..c24681f097 100644 --- a/ecrire/balise/formulaire_ecrire_auteur.php +++ b/ecrire/balise/formulaire_ecrire_auteur.php @@ -12,11 +12,13 @@ /** * Ce fichier gère la balise dynamique `#FORMULAIRE_ECRIRE_AUTEUR` - * + * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); @@ -30,16 +32,16 @@ include_spip('base/abstract_sql'); * Le ou les emails correspondants à l'auteur ou aux auteurs de l'article * sont transmis au formulaire CVT (mais ils ne seront pas dévoilés * au visiteur). - * + * * @balise - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ -function balise_FORMULAIRE_ECRIRE_AUTEUR ($p) { - return calculer_balise_dynamique($p,'FORMULAIRE_ECRIRE_AUTEUR', array('id_auteur', 'id_article', 'email')); + **/ +function balise_FORMULAIRE_ECRIRE_AUTEUR($p) { + return calculer_balise_dynamique($p, 'FORMULAIRE_ECRIRE_AUTEUR', array('id_auteur', 'id_article', 'email')); } /** @@ -47,7 +49,7 @@ function balise_FORMULAIRE_ECRIRE_AUTEUR ($p) { * * Retourne le contexte du formulaire uniquement si l'email de l'auteur * est valide, sinon rien (pas d'exécution/affichage du formulaire) - * + * * @param array $args * Liste des arguments demandés obtenus du contexte (id_auteur, id_article, email) * @param array $context_compil @@ -61,11 +63,16 @@ function balise_FORMULAIRE_ECRIRE_AUTEUR_stat($args, $context_compil) { // Pas d'id_auteur ni d'id_article ? Erreur de contexte $id = intval($args[1]); if (!$args[0] AND !$id) { - $msg = array('zbug_champ_hors_motif', - array ('champ' => 'FORMULAIRE_ECRIRE_AUTEUR', - 'motif' => 'AUTEURS/ARTICLES')); + $msg = array( + 'zbug_champ_hors_motif', + array( + 'champ' => 'FORMULAIRE_ECRIRE_AUTEUR', + 'motif' => 'AUTEURS/ARTICLES' + ) + ); erreur_squelette($msg, $context_compil); + return ''; } // Si on est dans un contexte article, @@ -73,18 +80,20 @@ function balise_FORMULAIRE_ECRIRE_AUTEUR_stat($args, $context_compil) { if (!$args[0] AND $id) { $r = ''; $s = sql_allfetsel('email', - 'spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON (A.id_auteur=L.id_auteur AND L.objet=\'article\')', - "A.email != '' AND L.id_objet=$id"); - foreach($s as $row) { - if (email_valide($row['email'])) - $r .= ', '.$row['email']; + 'spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON (A.id_auteur=L.id_auteur AND L.objet=\'article\')', + "A.email != '' AND L.id_objet=$id"); + foreach ($s as $row) { + if (email_valide($row['email'])) { + $r .= ', ' . $row['email']; + } } $args[2] = substr($r, 2); } // On ne peut pas ecrire a un auteur dont le mail n'est pas valide - if (!$args[2] OR !email_valide($args[2])) + if (!$args[2] OR !email_valide($args[2])) { return ''; + } // OK return $args; diff --git a/ecrire/balise/formulaire_inscription.php b/ecrire/balise/formulaire_inscription.php index ab3ad82d85..a53f1d581c 100644 --- a/ecrire/balise/formulaire_inscription.php +++ b/ecrire/balise/formulaire_inscription.php @@ -12,11 +12,13 @@ /** * Ce fichier gère la balise dynamique `#FORMULAIRE_INSCRIPTION` - * + * * @package SPIP\Core\Inscription -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); include_spip('inc/filtres'); @@ -39,8 +41,8 @@ include_spip('inc/filtres'); * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ -function balise_FORMULAIRE_INSCRIPTION ($p) { + **/ +function balise_FORMULAIRE_INSCRIPTION($p) { return calculer_balise_dynamique($p, 'FORMULAIRE_INSCRIPTION', array()); } @@ -53,13 +55,13 @@ function balise_FORMULAIRE_INSCRIPTION ($p) { * - '1comite' si les rédacteurs peuvent s'inscrire, * - '6forum' sinon si les forums sur abonnements sont actifs, * - rien sinon. - * + * * @example * ``` * #FORMULAIRE_INSCRIPTION * [(#FORMULAIRE_INSCRIPTION{mode_inscription, #ID_RUBRIQUE})] * ``` - * + * * @param array $args * - args[0] un statut d'auteur (rédacteur par defaut) * - args[1] indique la rubrique éventuelle de proposition @@ -73,6 +75,7 @@ function balise_FORMULAIRE_INSCRIPTION_stat($args, $context_compil) { list($mode, $id) = array_pad($args, 2, null); include_spip('action/inscrire_auteur'); $mode = tester_statut_inscription($mode, $id); + return $mode ? array($mode, $id) : ''; } diff --git a/ecrire/balise/info_.php b/ecrire/balise/info_.php index f2ee7f737f..088c3296c9 100644 --- a/ecrire/balise/info_.php +++ b/ecrire/balise/info_.php @@ -14,9 +14,11 @@ * Fonctions génériques pour les balises `#INFO_XXXX` * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise dynamique `#INFO_xx` qui génère n'importe quelle @@ -37,21 +39,22 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return Champ * Pile complétée par le code à générer */ -function balise_INFO__dist($p){ +function balise_INFO__dist($p) { $info = $p->nom_champ; - $type_objet = interprete_argument_balise(1,$p); - $id_objet = interprete_argument_balise(2,$p); + $type_objet = interprete_argument_balise(1, $p); + $id_objet = interprete_argument_balise(2, $p); if ($info === 'INFO_' or !$type_objet or !$id_objet) { $msg = _T('zbug_balise_sans_argument', array('balise' => ' INFO_')); erreur_squelette($msg, $p); $p->interdire_scripts = true; + return $p; - } - else { - $info_sql = strtolower(substr($info,5)); - $code = "generer_info_entite($id_objet, $type_objet, '$info_sql'".($p->etoile?","._q($p->etoile):"").")"; + } else { + $info_sql = strtolower(substr($info, 5)); + $code = "generer_info_entite($id_objet, $type_objet, '$info_sql'" . ($p->etoile ? "," . _q($p->etoile) : "") . ")"; $p->code = champ_sql($info, $p, $code); $p->interdire_scripts = true; + return $p; } } diff --git a/ecrire/balise/login_prive.php b/ecrire/balise/login_prive.php index a0e3b087a3..62001e5fac 100644 --- a/ecrire/balise/login_prive.php +++ b/ecrire/balise/login_prive.php @@ -12,39 +12,41 @@ /** * Ce fichier gère la balise dynamique dépréciée `#LOGIN_PRIVE` - * + * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined("_ECRIRE_INC_VERSION")) return; #securite +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} #securite /** * Compile la balise dynamique `#LOGIN_PRIVE` qui permet d'afficher le * formulaire de connexion vers l'espace privé - * + * * @balise * @deprecated Utiliser `#FORMULAIRE_LOGIN` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ -function balise_LOGIN_PRIVE ($p) { + **/ +function balise_LOGIN_PRIVE($p) { return calculer_balise_dynamique($p, 'LOGIN_PRIVE', array('url')); } /** * Calculs de paramètres de contexte automatiques pour la balise LOGIN_PRIVE * - * Retourne le contexte du formulaire en prenant : + * Retourne le contexte du formulaire en prenant : * - * 1. l'URL collectée ci-dessus (args0) ou donnée en premier paramètre (args1) + * 1. l'URL collectée ci-dessus (args0) ou donnée en premier paramètre (args1) * `#LOGIN_PRIVE{#URL_ECRIRE}` * 2. un éventuel paramètre (args2) indiquant le login et permettant une écriture * `<boucle(AUTEURS)>[(#LOGIN_PRIVE{#URL_ECRIRE, #LOGIN})]` - * + * * @param array $args * Liste des arguments demandés obtenus du contexte (url) * @param array $context_compil @@ -52,7 +54,7 @@ function balise_LOGIN_PRIVE ($p) { * @return array * Liste (url, login) des arguments collectés. */ -function balise_LOGIN_PRIVE_stat ($args, $context_compil) { +function balise_LOGIN_PRIVE_stat($args, $context_compil) { return array(isset($args[1]) ? $args[1] : $args[0], (isset($args[2]) ? $args[2] : '')); } @@ -68,13 +70,16 @@ function balise_LOGIN_PRIVE_stat ($args, $context_compil) { * Login de la personne à identifié (si connu) * @return array * Liste : Chemin du squelette, durée du cache, contexte -**/ + **/ function balise_LOGIN_PRIVE_dyn($url, $login) { include_spip('balise/formulaire_'); - if (!$url # pas d'url passee en filtre ou dans le contexte - AND !$url = _request('url') # ni d'url passee par l'utilisateur - ) - $url = generer_url_ecrire('accueil','',true); - return balise_FORMULAIRE__dyn('login',$url,$login,true); + if (!$url # pas d'url passee en filtre ou dans le contexte + AND !$url = _request('url') # ni d'url passee par l'utilisateur + ) { + $url = generer_url_ecrire('accueil', '', true); + } + + return balise_FORMULAIRE__dyn('login', $url, $login, true); } + ?> diff --git a/ecrire/balise/login_public.php b/ecrire/balise/login_public.php index ed01bdd837..d4bf333dd6 100644 --- a/ecrire/balise/login_public.php +++ b/ecrire/balise/login_public.php @@ -12,41 +12,43 @@ /** * Ce fichier gère la balise dynamique dépréciée `#LOGIN_PUBLIC` - * + * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined("_ECRIRE_INC_VERSION")) return; #securite +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} #securite /** * Compile la balise dynamique `#LOGIN_PUBLIC` qui permet d'afficher le * formulaire de connexion vers l'espace public - * + * * @balise * @deprecated Utiliser `#FORMULAIRE_LOGIN` - * + * * @param Champ $p * Pile au niveau de la balise * @param string $nom * Nom de la fonction de calcul des arguments statiques à appeler * @return Champ * Pile complétée du code compilé -**/ -function balise_LOGIN_PUBLIC ($p, $nom = 'LOGIN_PUBLIC') { + **/ +function balise_LOGIN_PUBLIC($p, $nom = 'LOGIN_PUBLIC') { return calculer_balise_dynamique($p, $nom, array('url')); } /** * Calculs de paramètres de contexte automatiques pour la balise LOGIN_PUBLIC * - * Retourne le contexte du formulaire en prenant : + * Retourne le contexte du formulaire en prenant : * - * 1. l'URL collectée ci-dessus (args0) ou donnée en premier paramètre (args1) + * 1. l'URL collectée ci-dessus (args0) ou donnée en premier paramètre (args1) * `#LOGIN_PUBLIC{#SELF}` * 2. un éventuel paramètre (args2) indiquant le login et permettant une écriture * `<boucle(AUTEURS)>[(#LOGIN_PUBLIC{#SELF, #LOGIN})]` - * + * * @param array $args * Liste des arguments demandés obtenus du contexte (url) * @param array $context_compil @@ -54,7 +56,7 @@ function balise_LOGIN_PUBLIC ($p, $nom = 'LOGIN_PUBLIC') { * @return array * Liste (url, login) des arguments collectés. */ -function balise_LOGIN_PUBLIC_stat ($args, $context_compil) { +function balise_LOGIN_PUBLIC_stat($args, $context_compil) { return array(isset($args[1]) ? $args[1] : $args[0], (isset($args[2]) ? $args[2] : '')); } @@ -70,14 +72,16 @@ function balise_LOGIN_PUBLIC_stat ($args, $context_compil) { * Login de la personne à identifié (si connu) * @return array * Liste : Chemin du squelette, durée du cache, contexte -**/ + **/ function balise_LOGIN_PUBLIC_dyn($url, $login) { include_spip('balise/formulaire_'); - if (!$url # pas d'url passee en filtre ou dans le contexte - AND !$url = _request('url') # ni d'url passee par l'utilisateur - ) + if (!$url # pas d'url passee en filtre ou dans le contexte + AND !$url = _request('url') # ni d'url passee par l'utilisateur + ) { $url = parametre_url(self(), '', '', '&'); - return balise_FORMULAIRE__dyn('login',$url,$login,false); + } + + return balise_FORMULAIRE__dyn('login', $url, $login, false); } ?> diff --git a/ecrire/balise/logo_.php b/ecrire/balise/logo_.php index 6c6144dfbb..4762bdbf88 100644 --- a/ecrire/balise/logo_.php +++ b/ecrire/balise/logo_.php @@ -14,9 +14,11 @@ * Fonctions génériques pour les balises `#LOGO_XXXX` * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -27,7 +29,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * `LOGO_ARTICLE` ou `LOGO_SITE`. * * Ces balises ont quelques options : - * + * * - La balise peut aussi demander explicitement le logo normal ou de survol, * avec `LOGO_ARTICLE_NORMAL` ou `LOGO_ARTICLE_SURVOL`. * - On peut demander un logo de rubrique en absence de logo sur l'objet éditorial @@ -37,20 +39,20 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * - `LOGO_ARTICLE{right}`. Valeurs possibles : top left right center bottom * - `LOGO_DOCUMENT{icone}`. Valeurs possibles : auto icone apercu vignette * - `LOGO_ARTICLE{200, 0}`. Redimensionnement indiqué - * + * * @balise * @uses logo_survol() * @example * ``` * #LOGO_ARTICLE * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ -function balise_LOGO__dist ($p) { +function balise_LOGO__dist($p) { preg_match(",^LOGO_([A-Z_]+?)(|_NORMAL|_SURVOL|_RUBRIQUE)$,i", $p->nom_champ, $regs); $type = strtolower($regs[1]); @@ -75,43 +77,47 @@ function balise_LOGO__dist ($p) { if ($p->param AND !$p->param[0][0]) { $params = $p->param[0]; array_shift($params); - foreach($params as $a) { + foreach ($params as $a) { if ($a[0]->type === 'texte') { $n = $a[0]->texte; - if (is_numeric($n)) - $coord[]= $n; - elseif (in_array($n,array('top','left','right','center','bottom'))) + if (is_numeric($n)) { + $coord[] = $n; + } elseif (in_array($n, array('top', 'left', 'right', 'center', 'bottom'))) { $align = $n; - elseif (in_array($n,array('auto','icone','apercu','vignette'))) + } elseif (in_array($n, array('auto', 'icone', 'apercu', 'vignette'))) { $mode_logo = $n; + } + } else { + $lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle); } - else $lien = calculer_liste($a, $p->descr, $p->boucles, $p->id_boucle); } } - $coord_x = !$coord ? 0 : intval(array_shift($coord)); - $coord_y = !$coord ? 0 : intval(array_shift($coord)); - + $coord_x = !$coord ? 0 : intval(array_shift($coord)); + $coord_y = !$coord ? 0 : intval(array_shift($coord)); + if ($p->etoile === '*') { include_spip('balise/url_'); $lien = generer_generer_url_arg($type, $p, $_id_objet); } - $connect = $p->id_boucle ?$p->boucles[$p->id_boucle]->sql_serveur :''; + $connect = $p->id_boucle ? $p->boucles[$p->id_boucle]->sql_serveur : ''; if ($type == 'document') { $qconnect = _q($connect); $doc = "quete_document($_id_objet, $qconnect)"; - if ($fichier) + if ($fichier) { $code = "quete_logo_file($doc, $qconnect)"; - else $code = "quete_logo_document($doc, " . ($lien ? $lien : "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)"; + } else { + $code = "quete_logo_document($doc, " . ($lien ? $lien : "''") . ", '$align', '$mode_logo', $coord_x, $coord_y, $qconnect)"; + } // (x=non-faux ? y : '') pour affecter x en retournant y - if ($p->descr['documents']) - $code = '(($doublons["documents"] .= ",". ' - . $_id_objet - . ") ? $code : '')"; - } - elseif ($connect) { + if ($p->descr['documents']) { + $code = '(($doublons["documents"] .= ",". ' + . $_id_objet + . ") ? $code : '')"; + } + } elseif ($connect) { $code = "''"; spip_log("Les logos distants ne sont pas prevus"); } else { @@ -120,11 +126,12 @@ function balise_LOGO__dist ($p) { // demande de reduction sur logo avec ecriture spip 2.1 : #LOGO_xxx{200, 0} if ($coord_x OR $coord_y) { - $code = "filtrer('image_graver',filtrer('image_reduire',".$code.", '$coord_x', '$coord_y'))"; - } + $code = "filtrer('image_graver',filtrer('image_reduire'," . $code . ", '$coord_x', '$coord_y'))"; + } $p->code = $code; $p->interdire_scripts = false; + return $p; } @@ -150,42 +157,46 @@ function balise_LOGO__dist ($p) { * Suite éventuelle de la balise logo, telle que `_SURVOL`, `_NORMAL` ou `_RUBRIQUE`. * @return string * Code compilé retournant le chemin du logo ou le code HTML du logo. -**/ -function logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite) -{ + **/ +function logo_survol($id_objet, $_id_objet, $type, $align, $fichier, $lien, $p, $suite) { $code = "quete_logo('$id_objet', '" . - (($suite == '_SURVOL') ? 'off' : - (($suite == '_NORMAL') ? 'on' : 'ON')) . + (($suite == '_SURVOL') ? 'off' : + (($suite == '_NORMAL') ? 'on' : 'ON')) . "', $_id_objet," . - (($suite == '_RUBRIQUE') ? - champ_sql("id_rubrique", $p) : - (($type == 'rubrique') ? "quete_parent($_id_objet)" : "''")) . + (($suite == '_RUBRIQUE') ? + champ_sql("id_rubrique", $p) : + (($type == 'rubrique') ? "quete_parent($_id_objet)" : "''")) . ", " . intval($fichier) . ")"; - if ($fichier) return $code; + if ($fichier) { + return $code; + } // class spip_logos a supprimer ulterieurement (transition douce vers spip_logo) // cf http://core.spip.net/issues/2483 $class = "spip_logo "; - if ($align) $class .= "spip_logo_$align "; + if ($align) { + $class .= "spip_logo_$align "; + } $class .= "spip_logos"; $style = ''; - if (in_array($align,array('left','right'))){ + if (in_array($align, array('left', 'right'))) { $style = "float:$align"; $align = ""; } $code = "\n((!is_array(\$l = $code)) ? '':\n (" . - '"<img class=\"'.$class.'\" alt=\"\"' . - ($style ? " style=\\\"$style\\\"" : '') . - ($align ? " align=\\\"$align\\\"" : '') . - ' src=\"$l[0]\"" . $l[2] . ($l[1] ? " onmouseover=\"this.src=\'$l[1]\'\" onmouseout=\"this.src=\'$l[0]\'\"" : "") . \' />\'))'; + '"<img class=\"' . $class . '\" alt=\"\"' . + ($style ? " style=\\\"$style\\\"" : '') . + ($align ? " align=\\\"$align\\\"" : '') . + ' src=\"$l[0]\"" . $l[2] . ($l[1] ? " onmouseover=\"this.src=\'$l[1]\'\" onmouseout=\"this.src=\'$l[0]\'\"" : "") . \' />\'))'; - if (!$lien) return $code; + if (!$lien) { + return $code; + } - return ('(strlen($logo='.$code.')?\'<a href="\' .' . $lien . ' . \'">\' . $logo . \'</a>\':\'\')'); + return ('(strlen($logo=' . $code . ')?\'<a href="\' .' . $lien . ' . \'">\' . $logo . \'</a>\':\'\')'); } - ?> diff --git a/ecrire/balise/menu_lang.php b/ecrire/balise/menu_lang.php index ce84e9f400..cf9baf06e4 100644 --- a/ecrire/balise/menu_lang.php +++ b/ecrire/balise/menu_lang.php @@ -12,11 +12,13 @@ /** * Ce fichier gère la balise dynamique `#MENU_LANG` - * + * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise dynamique `#MENU_LANG` qui affiche @@ -25,17 +27,17 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Affiche le menu des langues de l'espace public * et présélectionne celle la globale `$lang` * ou de l'arguemnt fourni: `#MENU_LANG{#ENV{malangue}}` - * + * * @balise * @link http://www.spip.net/4626 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ -function balise_MENU_LANG ($p) { - return calculer_balise_dynamique($p,'MENU_LANG', array('lang')); + **/ +function balise_MENU_LANG($p) { + return calculer_balise_dynamique($p, 'MENU_LANG', array('lang')); } /** @@ -43,7 +45,7 @@ function balise_MENU_LANG ($p) { * * S'il n'y a qu'une langue proposée, pas besoin du formulaire * (éviter une balise ?php inutile) - * + * * @param array $args * Liste des arguments demandés obtenus du contexte (lang) * complétés de ceux fournis à la balise @@ -52,8 +54,11 @@ function balise_MENU_LANG ($p) { * @return array * Liste (lang) des arguments collectés et fournis. */ -function balise_MENU_LANG_stat ($args, $context_compil) { - if (strpos($GLOBALS['meta']['langues_multilingue'],',') === false) return ''; +function balise_MENU_LANG_stat($args, $context_compil) { + if (strpos($GLOBALS['meta']['langues_multilingue'], ',') === false) { + return ''; + } + return $args; } @@ -63,14 +68,15 @@ function balise_MENU_LANG_stat ($args, $context_compil) { * @uses menu_lang_pour_tous() * @note * Normalement `$opt` sera toujours non vide suite au test ci-dessus - * + * * @param string $opt * Langue par défaut * @return array * Liste : Chemin du squelette, durée du cache, contexte -**/ + **/ function balise_MENU_LANG_dyn($opt) { include_spip('balise/menu_lang_ecrire'); + return menu_lang_pour_tous('var_lang', $opt); } diff --git a/ecrire/balise/menu_lang_ecrire.php b/ecrire/balise/menu_lang_ecrire.php index f55b608b23..1e3c9c34e5 100644 --- a/ecrire/balise/menu_lang_ecrire.php +++ b/ecrire/balise/menu_lang_ecrire.php @@ -12,11 +12,13 @@ /** * Ce fichier gère la balise dynamique `#MENU_LANG_ECRIRE` - * + * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise dynamique `#MENU_LANG_ECRIRE` qui affiche @@ -25,17 +27,17 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Affiche le menu des langues de l'espace privé * et présélectionne celle la globale `$lang` * ou de l'arguemnt fourni: `#MENU_LANG_ECRIRE{#ENV{malangue}}` - * + * * @balise * @link http://www.spip.net/4626 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ -function balise_MENU_LANG_ECRIRE ($p) { - return calculer_balise_dynamique($p,'MENU_LANG_ECRIRE', array('lang')); + **/ +function balise_MENU_LANG_ECRIRE($p) { + return calculer_balise_dynamique($p, 'MENU_LANG_ECRIRE', array('lang')); } /** @@ -43,7 +45,7 @@ function balise_MENU_LANG_ECRIRE ($p) { * * S'il n'y a qu'une langue proposée, pas besoin du formulaire * (éviter une balise ?php inutile) - * + * * @param array $args * Liste des arguments demandés obtenus du contexte (lang) * complétés de ceux fournis à la balise @@ -52,9 +54,12 @@ function balise_MENU_LANG_ECRIRE ($p) { * @return array * Liste (lang) des arguments collectés et fournis. */ -function balise_MENU_LANG_ECRIRE_stat ($args, $context_compil) { +function balise_MENU_LANG_ECRIRE_stat($args, $context_compil) { include_spip('inc/lang'); - if (strpos($GLOBALS['meta']['langues_proposees'],',') === false) return ''; + if (strpos($GLOBALS['meta']['langues_proposees'], ',') === false) { + return ''; + } + return $args; } @@ -64,12 +69,12 @@ function balise_MENU_LANG_ECRIRE_stat ($args, $context_compil) { * @uses menu_lang_pour_tous() * @note * Normalement `$opt` sera toujours non vide suite au test ci-dessus - * + * * @param string $opt * Langue par défaut * @return array * Liste : Chemin du squelette, durée du cache, contexte -**/ + **/ function balise_MENU_LANG_ECRIRE_dyn($opt) { return menu_lang_pour_tous('var_lang_ecrire', $opt); } @@ -79,35 +84,39 @@ function balise_MENU_LANG_ECRIRE_dyn($opt) { * le formulaire de sélection de changement de langue * * Le changement de langue se fait par l'appel à l'action `converser` - * + * * @uses lang_select() - * @see action_converser_dist() - * + * @see action_converser_dist() + * * @param string $nom * Nom de la variable qui sera postée par le formulaire * @param string $default * Valeur par défaut de la langue * @return array * Liste : Chemin du squelette, durée du cache, contexte -**/ + **/ function menu_lang_pour_tous($nom, $default) { include_spip('inc/lang'); if ($GLOBALS['spip_lang'] <> $default) { - $opt = lang_select($default); # et remplace + $opt = lang_select($default); # et remplace if ($GLOBALS['spip_lang'] <> $default) { - $default = ''; # annule tout choix par defaut - if ($opt) lang_select(); + $default = ''; # annule tout choix par defaut + if ($opt) { + lang_select(); + } } } # lien a partir de / - $cible = parametre_url(self(), 'lang' , '', '&'); - $post = generer_url_action('converser', 'redirect='. rawurlencode($cible), '&'); + $cible = parametre_url(self(), 'lang', '', '&'); + $post = generer_url_action('converser', 'redirect=' . rawurlencode($cible), '&'); - return array('formulaires/menu_lang', + return array( + 'formulaires/menu_lang', 3600, - array('nom' => $nom, + array( + 'nom' => $nom, 'url' => $post, 'name' => $nom, 'default' => $default, diff --git a/ecrire/balise/url_.php b/ecrire/balise/url_.php index 1fddc7dce5..81b9db3dec 100644 --- a/ecrire/balise/url_.php +++ b/ecrire/balise/url_.php @@ -14,18 +14,20 @@ * Fonctions génériques pour les balises `#URL_XXXX` * * Les balises `URL_$type` sont génériques, sauf quelques cas particuliers. - * + * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Génère le code compilé des balises d'URL * * Utilise le premier paramètre de la balise d'URL comme identifiant d'objet * s'il est donné, sinon le prendra dans un champ d'une boucle englobante. - * + * * @uses generer_generer_url_arg() * @param string $type * Type d'objet @@ -33,9 +35,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Pile au niveau de la balise * @return string * Code compilé -**/ -function generer_generer_url($type, $p){ - $_id = interprete_argument_balise(1,$p); + **/ +function generer_generer_url($type, $p) { + $_id = interprete_argument_balise(1, $p); if (!$_id) { $primary = id_table_objet($type); @@ -58,9 +60,9 @@ function generer_generer_url($type, $p){ * * On communique le type-url distant à `generer_url_entite` mais il ne sert pas * car rien ne garantit que le .htaccess soit identique. À approfondir. - * + * * @see generer_url_entite() - * + * * @param string $type * Type d'objet * @param Champ $p @@ -69,30 +71,30 @@ function generer_generer_url($type, $p){ * Code compilé permettant d'obtenir l'identifiant de l'objet * @return string * Code compilé -**/ -function generer_generer_url_arg($type, $p, $_id) -{ + **/ +function generer_generer_url_arg($type, $p, $_id) { if ($s = trouver_nom_serveur_distant($p)) { // si une fonction de generation des url a ete definie pour ce connect l'utiliser - if (function_exists($f = 'generer_generer_url_'.$s)){ + if (function_exists($f = 'generer_generer_url_' . $s)) { return $f($type, $_id, $s); } if (!$GLOBALS['connexions'][strtolower($s)]['spip_connect_version']) { - return NULL; + return null; } $s = _q($s); # exception des urls de documents sur un serveur distant... if ($type == 'document') { - return - "quete_meta('adresse_site', $s) . '/' .\n\t" . - "quete_meta('dir_img', $s) . \n\t" . - "quete_fichier($_id,$s)"; + return + "quete_meta('adresse_site', $s) . '/' .\n\t" . + "quete_meta('dir_img', $s) . \n\t" . + "quete_fichier($_id,$s)"; } $s = ", '', '', $s, quete_meta('type_urls', $s)"; - } - else + } else { $s = ", '', '', true"; + } + return "urlencode_1738(generer_url_entite($_id, '$type'$s))"; } @@ -103,7 +105,7 @@ function generer_generer_url_arg($type, $p, $_id) * S'il existe une fonction spécifique de calcul d'URL pour l'objet demandé, * tel que `balise_URL_ARTICLE_dist()`, la fonction l'utilisera. Sinon, * on calcule une URL de façon générique. - * + * * @balise * @uses generer_generer_url() * @example @@ -123,17 +125,20 @@ function balise_URL__dist($p) { $msg = array('zbug_balise_sans_argument', array('balise' => ' URL_')); erreur_squelette($msg, $p); $p->interdire_scripts = false; + return $p; } elseif ($f = charger_fonction($nom, 'balise', true)) { return $f($p); } else { $nom = strtolower($nom); - $code = generer_generer_url(substr($nom,4), $p); + $code = generer_generer_url(substr($nom, 4), $p); $code = champ_sql($nom, $p, $code); $p->code = $code; - if (!$p->etoile) + if (!$p->etoile) { $p->code = "vider_url($code)"; + } $p->interdire_scripts = false; + return $p; } } @@ -143,7 +148,7 @@ function balise_URL__dist($p) { * * Retourne l'URL (locale) d'un article mais retourne dans le cas * d'un article syndiqué (boucle SYNDIC_ARTICLES), son URL distante d'origine. - * + * * @balise * @uses generer_generer_url() * @link http://www.spip.net/3963 @@ -162,12 +167,16 @@ function balise_URL_ARTICLE_dist($p) { // Cas particulier des boucles (SYNDIC_ARTICLES) if ($p->type_requete == 'syndic_articles') { $code = champ_sql('url', $p); - } else $code = generer_generer_url('article', $p); + } else { + $code = generer_generer_url('article', $p); + } $p->code = $code; - if (!$p->etoile) + if (!$p->etoile) { $p->code = "vider_url($code)"; + } $p->interdire_scripts = false; + return $p; } @@ -176,29 +185,32 @@ function balise_URL_ARTICLE_dist($p) { * * Génère une URL spécifique si la colonne SQL `url_site` est trouvée * (par exemple lien hypertexte d'un article), sinon l'URL d'un site syndiqué - * + * * @balise * @uses generer_generer_url() - * @see calculer_url() + * @see calculer_url() * @link http://www.spip.net/3861 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ -function balise_URL_SITE_dist($p) -{ +function balise_URL_SITE_dist($p) { $code = champ_sql('url_site', $p); if (strpos($code, '@$Pile[0]') !== false) { $code = generer_generer_url('site', $p); - if ($code === NULL) return NULL; + if ($code === null) { + return null; + } } else { - if (!$p->etoile) + if (!$p->etoile) { $code = "calculer_url($code,'','url', \$connect)"; + } } $p->code = $code; $p->interdire_scripts = false; + return $p; } @@ -211,7 +223,7 @@ function balise_URL_SITE_dist($p) * * @balise * @link http://www.spip.net/4623 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ @@ -219,8 +231,9 @@ function balise_URL_SITE_dist($p) */ function balise_URL_SITE_SPIP_dist($p) { $p->code = "sinon(\$GLOBALS['meta']['adresse_site'],'.')"; - $p->code = "spip_htmlspecialchars(".$p->code.")"; + $p->code = "spip_htmlspecialchars(" . $p->code . ")"; $p->interdire_scripts = false; + return $p; } @@ -232,17 +245,17 @@ function balise_URL_SITE_SPIP_dist($p) { * - `#URL_PAGE{nom,param=valeur}` génère l'url pour la page `nom` avec des paramètres * - `#URL_PAGE` sans argument retourne l'URL courante. * - `#URL_PAGE*` retourne l'URL sans convertir les `&` en `&` - * + * * @balise * @link http://www.spip.net/4630 * @see generer_url_public() * @example * ``` - * #URL_PAGE{backend} produit ?page=backend + * #URL_PAGE{backend} produit ?page=backend * #URL_PAGE{backend,id_rubrique=1} est équivalent à * [(#URL_PAGE{backend}|parametre_url{id_rubrique,1})] * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ @@ -252,31 +265,37 @@ function balise_URL_PAGE_dist($p) { $code = interprete_argument_balise(1, $p); $args = interprete_argument_balise(2, $p); - if ($args == NULL) + if ($args == null) { $args = "''"; + } if ($s = trouver_nom_serveur_distant($p)) { // si une fonction de generation des url a ete definie pour ce connect l'utiliser // elle devra aussi traiter le cas derogatoire type=page - if (function_exists($f = 'generer_generer_url_'.$s)){ - if ($args AND $args !== "''") $code .= ", $args"; + if (function_exists($f = 'generer_generer_url_' . $s)) { + if ($args AND $args !== "''") { + $code .= ", $args"; + } $code = $f('page', $code, $s); + return $p; } - $s = 'connect=' . addslashes($s); + $s = 'connect=' . addslashes($s); $args = (($args AND $args !== "''") ? "$args . '&$s'" : "'$s'"); } if (!$code) { $noentities = $p->etoile ? "'&'" : ''; $code = "url_de_base() . preg_replace(',^./,', '', self($noentities))"; - } else{ - if (!$args) $args = "''"; + } else { + if (!$args) { + $args = "''"; + } $noentities = $p->etoile ? ", true" : ''; $code = "generer_url_public($code, $args$noentities)"; } $p->code = $code; - spip_log("Calcul url page : connect vaut $s ca donne :" . $p->code . " args $args", _LOG_INFO); + spip_log("Calcul url page : connect vaut $s ca donne :" . $p->code . " args $args", _LOG_INFO); #$p->interdire_scripts = true; return $p; @@ -290,7 +309,7 @@ function balise_URL_PAGE_dist($p) { * - `#URL_ECRIRE{nom,param=valeur}` génère l'url pour la page `nom` avec des paramètres * - `#URL_ECRIRE` génère l'url pour la page d'accueil de l'espace privé * - `#URL_ECRIRE*` retourne l'URL sans convertir les `&` en `&` - * + * * @balise * @link http://www.spip.net/5566 * @see generer_url_ecrire() @@ -298,7 +317,7 @@ function balise_URL_PAGE_dist($p) { * ``` * #URL_ECRIRE{rubriques} -> ecrire/?exec=rubriques * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ @@ -306,19 +325,23 @@ function balise_URL_PAGE_dist($p) { */ function balise_URL_ECRIRE_dist($p) { - $code = interprete_argument_balise(1,$p); - if (!$code) + $code = interprete_argument_balise(1, $p); + if (!$code) { $fonc = "''"; - else { + } else { $fonc = $code; - $args = interprete_argument_balise(2,$p); - if ($args === NULL) $args = "''"; + $args = interprete_argument_balise(2, $p); + if ($args === null) { + $args = "''"; + } $noentities = $p->etoile ? ", true" : ''; - if (($args != "''") OR $noentities) + if (($args != "''") OR $noentities) { $fonc .= ",$args$noentities"; + } } - $p->code = 'generer_url_ecrire(' . $fonc .')'; + $p->code = 'generer_url_ecrire(' . $fonc . ')'; $p->interdire_scripts = false; + return $p; } @@ -332,7 +355,7 @@ function balise_URL_ECRIRE_dist($p) { * - le nom de l'action * - l'argument transmis à l'action (une chaîne de caractère) * - une éventuelle URL de redirection qui sert une fois l'action réalisée - * + * * @balise * @see generer_action_auteur() * @example @@ -340,7 +363,7 @@ function balise_URL_ECRIRE_dist($p) { * #URL_ACTION_AUTEUR{converser,arg,redirect} * -> ecrire/?action=converser&arg=arg&hash=xxx&redirect=redirect * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ @@ -349,19 +372,23 @@ function balise_URL_ECRIRE_dist($p) { function balise_URL_ACTION_AUTEUR_dist($p) { $p->descr['session'] = true; - $p->code = interprete_argument_balise(1,$p); - $args = interprete_argument_balise(2,$p); - if ($args != "''" && $args!==NULL) - $p->code .= ",".$args; - $redirect = interprete_argument_balise(3,$p); - if ($redirect != "''" && $redirect!==NULL) { - if ($args == "''" || $args===NULL) + $p->code = interprete_argument_balise(1, $p); + $args = interprete_argument_balise(2, $p); + if ($args != "''" && $args !== null) { + $p->code .= "," . $args; + } + $redirect = interprete_argument_balise(3, $p); + if ($redirect != "''" && $redirect !== null) { + if ($args == "''" || $args === null) { $p->code .= ",''"; - $p->code .= ",".$redirect; + } + $p->code .= "," . $redirect; } $p->code = "generer_action_auteur(" . $p->code . ")"; $p->interdire_scripts = false; + return $p; } + ?> diff --git a/ecrire/balise/url_logout.php b/ecrire/balise/url_logout.php index b46e21a223..4c64bf60ca 100644 --- a/ecrire/balise/url_logout.php +++ b/ecrire/balise/url_logout.php @@ -14,26 +14,28 @@ * Ce fichier gère la balise dynamique `#URL_LOGOUT` * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise dynamique `#URL_LOGOUT` qui génère une URL permettant * de déconnecter l'auteur actuellement connecté - * + * * @balise * @example * ``` * [<a href="(#URL_LOGOUT)">déconnexion</a>] * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée du code compilé -**/ -function balise_URL_LOGOUT ($p) { + **/ +function balise_URL_LOGOUT($p) { return calculer_balise_dynamique($p, 'URL_LOGOUT', array()); } @@ -49,8 +51,9 @@ function balise_URL_LOGOUT ($p) { * @return array * Liste (url) des arguments collectés. */ -function balise_URL_LOGOUT_stat ($args, $context_compil) { +function balise_URL_LOGOUT_stat($args, $context_compil) { $url = isset($args[0]) ? $args[0] : ''; + return array($url); } @@ -63,11 +66,14 @@ function balise_URL_LOGOUT_stat ($args, $context_compil) { * URL de destination après déconnexion * @return string * URL de déconnexion ou chaîne vide. -**/ + **/ function balise_URL_LOGOUT_dyn($cible) { - if (!$GLOBALS['visiteur_session']['login'] AND !$GLOBALS['visiteur_session']['statut']) return ''; + if (!$GLOBALS['visiteur_session']['login'] AND !$GLOBALS['visiteur_session']['statut']) { + return ''; + } - return generer_url_action('logout',"logout=public&url=" . rawurlencode($cible ? $cible : self('&'))); + return generer_url_action('logout', "logout=public&url=" . rawurlencode($cible ? $cible : self('&'))); } + ?> diff --git a/ecrire/base/abstract_sql.php b/ecrire/base/abstract_sql.php index 412c30a272..c0f7582f05 100644 --- a/ecrire/base/abstract_sql.php +++ b/ecrire/base/abstract_sql.php @@ -12,7 +12,7 @@ /** * Definition de l'API SQL - * + * * Ce fichier definit la couche d'abstraction entre SPIP et ses serveurs SQL. * Cette version 1 est un ensemble de fonctions ecrites rapidement * pour generaliser le code strictement MySQL de SPIP <= 1.9.2 @@ -24,7 +24,9 @@ * @version 1 */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** Version de l'API SQL */ define('sql_ABSTRACT_VERSION', 1); @@ -41,47 +43,47 @@ include_spip('base/connect_sql'); * utile pour présenter une erreur au débuggueur via `erreur_squelette()` * @return array|string * contexte de l'erreur -**/ -function sql_error_backtrace($compil_info = false){ + **/ +function sql_error_backtrace($compil_info = false) { $trace = debug_backtrace(); $caller = array_shift($trace); - while (count($trace) AND (empty($trace[0]['file']) OR $trace[0]['file']===$caller['file'] OR $trace[0]['file']===__FILE__)) { + while (count($trace) AND (empty($trace[0]['file']) OR $trace[0]['file'] === $caller['file'] OR $trace[0]['file'] === __FILE__)) { array_shift($trace); } - if ($compil_info){ + if ($compil_info) { $contexte_compil = array( $trace[0]['file'],// sourcefile '', //nom - (isset($trace[1]) ? $trace[1]['function']."(){\n" : '') - . $trace[0]['function']."();" - . (isset($trace[1]) ? "\n}" : ''), //id_boucle + (isset($trace[1]) ? $trace[1]['function'] . "(){\n" : '') + . $trace[0]['function'] . "();" + . (isset($trace[1]) ? "\n}" : ''), //id_boucle $trace[0]['line'], // ligne $GLOBALS['spip_lang'], // lang ); + return $contexte_compil; } - $message = count($trace) ? $trace[0]['file']." L".$trace[0]['line'] : ""; + $message = count($trace) ? $trace[0]['file'] . " L" . $trace[0]['line'] : ""; $f = array(); - while(count($trace) AND $t=array_shift($trace)){ - if (in_array($t['function'],array('include_once','include_spip','find_in_path'))) { + while (count($trace) AND $t = array_shift($trace)) { + if (in_array($t['function'], array('include_once', 'include_spip', 'find_in_path'))) { break; } $f[] = $t['function']; } if (count($f)) { - $message .= " [".implode("(),",$f)."()]"; + $message .= " [" . implode("(),", $f) . "()]"; } return $message; } - /** * Charge le serveur de base de donnees - * + * * Fonction principale. Elle charge l'interface au serveur de base de donnees * via la fonction spip_connect_version qui etablira la connexion au besoin. * Elle retourne la fonction produisant la requete SQL demandee @@ -89,23 +91,26 @@ function sql_error_backtrace($compil_info = false){ * * @internal Cette fonction de base est appelee par les autres fonctions sql_* * @param string $ins_sql - * Instruction de l'API SQL demandee (insertq, update, select...) + * Instruction de l'API SQL demandee (insertq, update, select...) * @param string $serveur - * Nom du connecteur ('' pour celui par defaut a l'installation de SPIP) + * Nom du connecteur ('' pour celui par defaut a l'installation de SPIP) * @param bool $continue - * true pour ne pas generer d'erreur si le serveur SQL ne dispose pas de la fonction demandee + * true pour ne pas generer d'erreur si le serveur SQL ne dispose pas de la fonction demandee * @return string|array - * Nom de la fonction a appeler pour l'instruction demandee pour le type de serveur SQL correspondant au fichier de connexion. - * Si l'instruction demandee n'existe pas, retourne la liste de toutes les instructions du serveur SQL avec $continue a true. - * -**/ + * Nom de la fonction a appeler pour l'instruction demandee pour le type de serveur SQL correspondant au fichier de connexion. + * Si l'instruction demandee n'existe pas, retourne la liste de toutes les instructions du serveur SQL avec $continue a true. + * + **/ function sql_serveur($ins_sql = '', $serveur = '', $continue = false) { static $sql_serveur = array(); - if (!isset($sql_serveur[$serveur][$ins_sql])){ + if (!isset($sql_serveur[$serveur][$ins_sql])) { $f = spip_connect_sql(sql_ABSTRACT_VERSION, $ins_sql, $serveur, $continue); - if (!is_string($f) OR !$f) return $f; + if (!is_string($f) OR !$f) { + return $f; + } $sql_serveur[$serveur][$ins_sql] = $f; } + return $sql_serveur[$serveur][$ins_sql]; } @@ -117,7 +122,7 @@ function sql_serveur($ins_sql = '', $serveur = '', $continue = false) { * * @api * @see sql_set_charset() pour utiliser un charset - * + * * @param string $charset * Le charset souhaité * @param string $serveur @@ -126,17 +131,22 @@ function sql_serveur($ins_sql = '', $serveur = '', $continue = false) { * Inutilise * @return string|bool * Retourne le nom du charset si effectivement trouvé, sinon false. -**/ -function sql_get_charset($charset, $serveur = '', $option = true){ - // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc. - $desc = sql_serveur('', $serveur, true,true); + **/ +function sql_get_charset($charset, $serveur = '', $option = true) { + // le nom http du charset differe parfois du nom SQL utf-8 ==> utf8 etc. + $desc = sql_serveur('', $serveur, true, true); $desc = $desc[sql_ABSTRACT_VERSION]; $c = $desc['charsets'][$charset]; if ($c) { - if (function_exists($f=@$desc['get_charset'])) - if ($f($c, $serveur, $option !== false)) return $c; + if (function_exists($f = @$desc['get_charset'])) { + if ($f($c, $serveur, $option !== false)) { + return $c; + } + } } - spip_log( "SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul.", _LOG_AVERTISSEMENT); + spip_log("SPIP ne connait pas les Charsets disponibles sur le serveur $serveur. Le serveur choisira seul.", + _LOG_AVERTISSEMENT); + return false; } @@ -149,35 +159,37 @@ function sql_get_charset($charset, $serveur = '', $option = true){ * * @api * @see sql_get_charset() pour tester l'utilisation d'un charset - * + * * @param string $charset - * Le charset souhaite + * Le charset souhaite * @param string $serveur - * Le nom du connecteur + * Le nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : - * - true pour executer la requete. - * - continue pour ne pas echouer en cas de serveur sql indisponible. - * + * Peut avoir 2 valeurs : + * - true pour executer la requete. + * - continue pour ne pas echouer en cas de serveur sql indisponible. + * * @return bool - * Retourne true si elle reussie. -**/ -function sql_set_charset($charset, $serveur = '', $option = true){ - $f = sql_serveur('set_charset', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + * Retourne true si elle reussie. + **/ +function sql_set_charset($charset, $serveur = '', $option = true) { + $f = sql_serveur('set_charset', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } + return $f($charset, $serveur, $option !== false); } - /** * Effectue une requête de selection - * + * * Fonction de selection (SELECT), retournant la ressource interrogeable par sql_fetch. * * @api * @see sql_fetch() Pour boucler sur les resultats de cette fonction - * + * * @param array|string $select * Liste des champs a recuperer (Select) * @param array|string $from @@ -196,38 +208,51 @@ function sql_set_charset($charset, $serveur = '', $option = true){ * Le serveur sollicite (pour retrouver la connexion) * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false -> ne pas l'exécuter mais la retourner, + * + * - false -> ne pas l'exécuter mais la retourner, * - continue -> ne pas echouer en cas de serveur sql indisponible, * - true|array -> executer la requête. * Le cas array est, pour une requete produite par le compilateur, * un tableau donnnant le contexte afin d'indiquer le lieu de l'erreur au besoin * - * + * * @return mixed * Ressource SQL - * + * * - Ressource SQL pour sql_fetch, si la requete est correcte * - false en cas d'erreur * - Chaine contenant la requete avec $option=false - * + * * Retourne false en cas d'erreur, apres l'avoir denoncee. * Les portages doivent retourner la requete elle-meme en cas d'erreur, * afin de disposer du texte brut. * -**/ -function sql_select ($select = array(), $from = array(), $where = array(), - $groupby = array(), $orderby = array(), $limit = '', $having = array(), - $serveur = '', $option = true) { - $f = sql_serveur('select', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_select( + $select = array(), + $from = array(), + $where = array(), + $groupby = array(), + $orderby = array(), + $limit = '', + $having = array(), + $serveur = '', + $option = true +) { + $f = sql_serveur('select', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $debug = (defined('_VAR_MODE') AND _VAR_MODE == 'debug'); if (($option !== false) AND !$debug) { - $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, is_array($option) ? true : $option); + $res = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, + is_array($option) ? true : $option); } else { $query = $f($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); - if (!$option) return $query; + if (!$option) { + return $query; + } // le debug, c'est pour ce qui a ete produit par le compilateur if (isset($GLOBALS['debug']['aucasou'])) { list($table, $id,) = $GLOBALS['debug']['aucasou']; @@ -238,12 +263,15 @@ function sql_select ($select = array(), $from = array(), $where = array(), } // en cas d'erreur - if (!is_string($res)) return $res; + if (!is_string($res)) { + return $res; + } // denoncer l'erreur SQL dans sa version brute spip_sql_erreur($serveur); // idem dans sa version squelette (prefixe des tables non substitue) $contexte_compil = sql_error_backtrace(true); erreur_squelette(array(sql_errno($serveur), sql_error($serveur), $res), $contexte_compil); + return false; } @@ -259,31 +287,38 @@ function sql_select ($select = array(), $from = array(), $where = array(), * @uses sql_select() * * @param array|string $select - * Liste des champs a recuperer (Select) + * Liste des champs a recuperer (Select) * @param array|string $from - * Tables a consulter (From) + * Tables a consulter (From) * @param array|string $where - * Conditions a remplir (Where) + * Conditions a remplir (Where) * @param array|string $groupby - * Critere de regroupement (Group by) + * Critere de regroupement (Group by) * @param array|string $orderby - * Tableau de classement (Order By) + * Tableau de classement (Order By) * @param string $limit - * Critere de limite (Limit) + * Critere de limite (Limit) * @param array $having - * Tableau des des post-conditions a remplir (Having) + * Tableau des des post-conditions a remplir (Having) * @param string $serveur - * Le serveur sollicite (pour retrouver la connexion) - * + * Le serveur sollicite (pour retrouver la connexion) + * * @return mixed - * Chaine contenant la requete - * ou false en cas d'erreur - * -**/ -function sql_get_select($select = array(), $from = array(), $where = array(), - $groupby = array(), $orderby = array(), $limit = '', $having = array(), - $serveur = '') { - return sql_select ($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); + * Chaine contenant la requete + * ou false en cas d'erreur + * + **/ +function sql_get_select( + $select = array(), + $from = array(), + $where = array(), + $groupby = array(), + $orderby = array(), + $limit = '', + $having = array(), + $serveur = '' +) { + return sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, false); } @@ -303,36 +338,46 @@ function sql_get_select($select = array(), $from = array(), $where = array(), * // ... * } * ``` - * + * * @param array|string $from - * Tables a consulter (From) + * Tables a consulter (From) * @param array|string $where - * Conditions a remplir (Where) + * Conditions a remplir (Where) * @param array|string $groupby - * Critere de regroupement (Group by) + * Critere de regroupement (Group by) * @param array $having - * Tableau des des post-conditions a remplir (Having) + * Tableau des des post-conditions a remplir (Having) * @param string $serveur - * Le serveur sollicite (pour retrouver la connexion) + * Le serveur sollicite (pour retrouver la connexion) * @param bool|string $option - * Peut avoir 3 valeurs : - * - * - false -> ne pas l'executer mais la retourner, - * - continue -> ne pas echouer en cas de serveur sql indisponible, - * - true -> executer la requete. + * Peut avoir 3 valeurs : + * + * - false -> ne pas l'executer mais la retourner, + * - continue -> ne pas echouer en cas de serveur sql indisponible, + * - true -> executer la requete. * * @return int|bool * - Nombre de lignes de resultat * - ou false en cas d'erreur * -**/ -function sql_countsel($from = array(), $where = array(), - $groupby = array(), $having = array(), - $serveur = '', $option = true) { - $f = sql_serveur('countsel', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_countsel( + $from = array(), + $where = array(), + $groupby = array(), + $having = array(), + $serveur = '', + $option = true +) { + $f = sql_serveur('countsel', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($from, $where, $groupby, $having, $serveur, $option !== false); - if ($r===false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -345,7 +390,7 @@ function sql_countsel($from = array(), $where = array(), * ``` * sql_alter('DROP COLUMN supprimer'); * ``` - * + * * @api * @param string $q * La requête à exécuter (sans la préceder de 'ALTER ') @@ -353,22 +398,27 @@ function sql_countsel($from = array(), $where = array(), * Le serveur sollicite (pour retrouver la connexion) * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - true : exécuter la requete * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return mixed * 2 possibilités : - * + * * - Incertain en cas d'exécution correcte de la requête * - false en cas de serveur indiponible ou d'erreur - * + * * Ce retour n'est pas pertinent pour savoir si l'opération est correctement réalisée. -**/ + **/ function sql_alter($q, $serveur = '', $option = true) { - $f = sql_serveur('alter', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('alter', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($q, $serveur, $option !== false); - if ($r===false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -379,22 +429,25 @@ function sql_alter($q, $serveur = '', $option = true) { * * @api * @param mixed $res - * Ressource retournee par sql_select() + * Ressource retournee par sql_select() * @param string $serveur - * Le nom du connecteur + * Le nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : - * - true -> executer la requete - * - continue -> ne pas echouer en cas de serveur sql indisponible - * + * Peut avoir 2 valeurs : + * - true -> executer la requete + * - continue -> ne pas echouer en cas de serveur sql indisponible + * * @return array - * Tableau de cles (colonnes SQL ou alias) / valeurs (valeurs dans la colonne de la table ou calculee) - * presentant une ligne de resultat d'une selection + * Tableau de cles (colonnes SQL ou alias) / valeurs (valeurs dans la colonne de la table ou calculee) + * presentant une ligne de resultat d'une selection */ function sql_fetch($res, $serveur = '', $option = true) { - $f = sql_serveur('fetch', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; - return $f($res, NULL, $serveur, $option !== false); + $f = sql_serveur('fetch', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } + + return $f($res, null, $serveur, $option !== false); } @@ -406,28 +459,34 @@ function sql_fetch($res, $serveur = '', $option = true) { * * @api * @param mixed $res - * Ressource retournee par sql_select() + * Ressource retournee par sql_select() * @param string $serveur - * Le nom du connecteur + * Le nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : - * - true -> executer la requete - * - continue -> ne pas echouer en cas de serveur sql indisponible - * + * Peut avoir 2 valeurs : + * - true -> executer la requete + * - continue -> ne pas echouer en cas de serveur sql indisponible + * * @return array - * Tableau contenant les enregistrements. - * Chaque entree du tableau est un autre tableau - * de cles (colonnes SQL ou alias) / valeurs (valeurs dans la colonne de la table ou calculee) - * presentant une ligne de resultat d'une selection + * Tableau contenant les enregistrements. + * Chaque entree du tableau est un autre tableau + * de cles (colonnes SQL ou alias) / valeurs (valeurs dans la colonne de la table ou calculee) + * presentant une ligne de resultat d'une selection */ -function sql_fetch_all($res, $serveur = '', $option = true){ +function sql_fetch_all($res, $serveur = '', $option = true) { $rows = array(); - if (!$res) return $rows; - $f = sql_serveur('fetch', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return array(); - while ($r = $f($res, NULL, $serveur, $option !== false)) + if (!$res) { + return $rows; + } + $f = sql_serveur('fetch', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return array(); + } + while ($r = $f($res, null, $serveur, $option !== false)) { $rows[] = $r; + } sql_free($res, $serveur); + return $rows; } @@ -442,24 +501,29 @@ function sql_fetch_all($res, $serveur = '', $option = true){ * @see sql_skip() Pour sauter des enregistrements * * @param mixed $res - * Ressource issue de sql_select + * Ressource issue de sql_select * @param int $row_number - * Numero de ligne sur laquelle placer le pointeur + * Numero de ligne sur laquelle placer le pointeur * @param string $serveur - * Le nom du connecteur + * Le nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : - * - true -> executer la requete - * - continue -> ne pas echouer en cas de serveur sql indisponible - * + * Peut avoir 2 valeurs : + * - true -> executer la requete + * - continue -> ne pas echouer en cas de serveur sql indisponible + * * @return bool - * Operation effectuée (true), sinon false. -**/ + * Operation effectuée (true), sinon false. + **/ function sql_seek($res, $row_number, $serveur = '', $option = true) { - $f = sql_serveur('seek', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('seek', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($res, $row_number, $serveur, $option !== false); - if ($r===false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -474,21 +538,26 @@ function sql_seek($res, $row_number, $serveur = '', $option = true) { * * @api * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : - * - true -> executer la requete - * - continue -> ne pas echouer en cas de serveur sql indisponible - * + * Peut avoir 2 valeurs : + * - true -> executer la requete + * - continue -> ne pas echouer en cas de serveur sql indisponible + * * @return array|bool - * Tableau contenant chaque nom de base de donnees. - * False en cas d'erreur. -**/ + * Tableau contenant chaque nom de base de donnees. + * False en cas d'erreur. + **/ function sql_listdbs($serveur = '', $option = true) { - $f = sql_serveur('listdbs', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('listdbs', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($serveur); - if ($r===false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -503,20 +572,24 @@ function sql_listdbs($serveur = '', $option = true) { * Nom du connecteur * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - true -> executer la requete * - continue -> ne pas echouer en cas de serveur sql indisponible - * + * * @return bool|string * - True ou nom de la base en cas de success. * - False en cas d'erreur. -**/ -function sql_selectdb($nom, $serveur = '', $option = true) -{ - $f = sql_serveur('selectdb', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_selectdb($nom, $serveur = '', $option = true) { + $f = sql_serveur('selectdb', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($nom, $serveur, $option !== false); - if ($r===false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -534,19 +607,23 @@ function sql_selectdb($nom, $serveur = '', $option = true) * Nom du connecteur * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - true -> executer la requete * - continue -> ne pas echouer en cas de serveur sql indisponible * @return bool|string * - int Nombre de lignes, * - false en cas d'erreur. -**/ -function sql_count($res, $serveur = '', $option = true) -{ - $f = sql_serveur('count', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_count($res, $serveur = '', $option = true) { + $f = sql_serveur('count', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($res, $serveur, $option !== false); - if ($r===false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -555,29 +632,31 @@ function sql_count($res, $serveur = '', $option = true) * * Indique au gestionnaire SQL de libérer de sa mémoire la ressoucre de * résultat indiquée car on n'a plus besoin de l'utiliser. - * + * * @param Ressource|Object $res * Ressource de résultat * @param string $serveur * Nom de la connexion * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - true -> exécuter la requete * - continue -> ne pas échouer en cas de serveur SQL indisponible * @return bool * True si réussi */ -function sql_free($res, $serveur = '', $option = true) -{ - $f = sql_serveur('free', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; +function sql_free($res, $serveur = '', $option = true) { + $f = sql_serveur('free', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } + return $f($res); } /** - * Insère une ligne dans une table + * Insère une ligne dans une table * * @see sql_insertq() * @see sql_quote() @@ -585,7 +664,7 @@ function sql_free($res, $serveur = '', $option = true) * Cette fonction ne garantit pas une portabilité totale, * et n'est là que pour faciliter des migrations de vieux scripts. * Préférer sql_insertq. - * + * * @param string $table * Nom de la table SQL * @param string $noms @@ -599,25 +678,27 @@ function sql_free($res, $serveur = '', $option = true) * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible - * + * * @return bool|string * - int|true identifiant de l'élément inséré (si possible), ou true, si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_insert($table, $noms, $valeurs, $desc = array(), $serveur = '', $option = true) -{ - $f = sql_serveur('insert', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_insert($table, $noms, $valeurs, $desc = array(), $serveur = '', $option = true) { + $f = sql_serveur('insert', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $noms, $valeurs, $desc, $serveur, $option !== false); if ($r === false OR $r === null) { spip_sql_erreur($serveur); $r = false; } + return $r; } @@ -625,7 +706,7 @@ function sql_insert($table, $noms, $valeurs, $desc = array(), $serveur = '', $op * Insère une ligne dans une table * * Protègera chaque valeur comme sql_quote. - * + * * @api * @see sql_insert() * @see sql_insertq_multi() @@ -636,7 +717,7 @@ function sql_insert($table, $noms, $valeurs, $desc = array(), $serveur = '', $op * $titre = _request('titre'); * $id = sql_insertq('spip_rubriques', array('titre' => $titre)); * ``` - * + * * @param string $table * Nom de la table SQL * @param array $couples @@ -648,25 +729,27 @@ function sql_insert($table, $noms, $valeurs, $desc = array(), $serveur = '', $op * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible - * + * * @return bool|string * - int|true identifiant de l'élément inséré (si possible), ou true, si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_insertq($table, $couples = array(), $desc = array(), $serveur = '', $option = true) -{ - $f = sql_serveur('insertq', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_insertq($table, $couples = array(), $desc = array(), $serveur = '', $option = true) { + $f = sql_serveur('insertq', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $couples, $desc, $serveur, $option !== false); if ($r === false OR $r === null) { spip_sql_erreur($serveur); $r = false; } + return $r; } @@ -679,7 +762,7 @@ function sql_insertq($table, $couples = array(), $desc = array(), $serveur = '', * * @api * @see sql_insertq() - * + * * @param string $table * Nom de la table SQL * @param array $couples @@ -691,25 +774,27 @@ function sql_insertq($table, $couples = array(), $desc = array(), $serveur = '', * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible - * + * * @return bool|string * - True en cas de succès, * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_insertq_multi($table, $couples = array(), $desc = array(), $serveur = '', $option = true) -{ - $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_insertq_multi($table, $couples = array(), $desc = array(), $serveur = '', $option = true) { + $f = sql_serveur('insertq_multi', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $couples, $desc, $serveur, $option !== false); if ($r === false OR $r === null) { spip_sql_erreur($serveur); $r = false; } + return $r; } @@ -718,7 +803,7 @@ function sql_insertq_multi($table, $couples = array(), $desc = array(), $serveur * * Les valeurs ne sont pas échappées, ce qui permet de modifier une colonne * en utilisant la valeur d'une autre colonne ou une expression SQL. - * + * * Il faut alors protéger avec sql_quote() manuellement les valeurs qui * en ont besoin. * @@ -726,7 +811,7 @@ function sql_insertq_multi($table, $couples = array(), $desc = array(), $serveur * * @api * @see sql_updateq() - * + * * @param string $table * Nom de la table * @param array $exp @@ -740,8 +825,8 @@ function sql_insertq_multi($table, $couples = array(), $desc = array(), $serveur * Nom de la connexion * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return array|bool|string @@ -749,12 +834,16 @@ function sql_insertq_multi($table, $couples = array(), $desc = array(), $serveur * - true si la requête a réussie, false sinon * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif */ -function sql_update($table, $exp, $where = '', $desc = array(), $serveur = '', $option = true) -{ - $f = sql_serveur('update', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; +function sql_update($table, $exp, $where = '', $desc = array(), $serveur = '', $option = true) { + $f = sql_serveur('update', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -791,21 +880,25 @@ function sql_update($table, $exp, $where = '', $desc = array(), $serveur = '', $ * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool|string * - true si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_updateq($table, $exp, $where = '', $desc = array(), $serveur = '', $option = true) -{ - $f = sql_serveur('updateq', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_updateq($table, $exp, $where = '', $desc = array(), $serveur = '', $option = true) { + $f = sql_serveur('updateq', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $exp, $where, $desc, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -826,22 +919,26 @@ function sql_updateq($table, $exp, $where = '', $desc = array(), $serveur = '', * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible - * + * * @return bool|string * - int : nombre de suppressions réalisées, * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_delete($table, $where = '', $serveur = '', $option = true) -{ - $f = sql_serveur('delete', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_delete($table, $where = '', $serveur = '', $option = true) { + $f = sql_serveur('delete', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $where, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -850,12 +947,12 @@ function sql_delete($table, $where = '', $serveur = '', $option = true) * * La clé ou les cles primaires doivent être présentes dans les données insérés. * La fonction effectue une protection automatique des données. - * + * * Préférez sql_insertq() et sql_updateq(). - * + * * @see sql_insertq() * @see sql_updateq() - * + * * @param string $table * Nom de la table SQL * @param array $couples @@ -867,39 +964,42 @@ function sql_delete($table, $where = '', $serveur = '', $option = true) * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible - * + * * @return bool|string * - true si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_replace($table, $couples, $desc = array(), $serveur = '', $option = true) -{ - $f = sql_serveur('replace', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_replace($table, $couples, $desc = array(), $serveur = '', $option = true) { + $f = sql_serveur('replace', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $couples, $desc, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } - /** * Insère où met à jour des entrées d’une table SQL * * La clé ou les cles primaires doivent être présentes dans les données insérés. * La fonction effectue une protection automatique des données. - * + * * Préférez sql_insertq_multi() et sql_updateq(). - * + * * @see sql_insertq_multi() * @see sql_updateq() * @see sql_replace() - * + * * @param string $table * Nom de la table SQL * @param array $tab_couples @@ -911,22 +1011,26 @@ function sql_replace($table, $couples, $desc = array(), $serveur = '', $option = * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible - * + * * @return bool|string * - true si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $option = true) -{ - $f = sql_serveur('replace_multi', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $option = true) { + $f = sql_serveur('replace_multi', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $tab_couples, $desc, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -936,7 +1040,7 @@ function sql_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', * @api * @see sql_create() * @see sql_drop_view() - * + * * @param string $table * Nom de la table * @param string $exist @@ -945,21 +1049,25 @@ function sql_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool|string * - True en cas de succès, * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function sql_drop_table($table, $exist = '', $serveur = '', $option = true) -{ - $f = sql_serveur('drop_table', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_drop_table($table, $exist = '', $serveur = '', $option = true) { + $f = sql_serveur('drop_table', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $exist, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -969,35 +1077,39 @@ function sql_drop_table($table, $exist = '', $serveur = '', $option = true) * @api * @see sql_create_view() * @see sql_drop_table() - * - * @param string $table Nom de la vue SQL - * @param string $exist True pour ajouter un test d'existence avant de supprimer - * @param string $serveur Nom de la connexion + * + * @param string $table Nom de la vue SQL + * @param string $exist True pour ajouter un test d'existence avant de supprimer + * @param string $serveur Nom de la connexion * @param bool $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool|string * - string Texte de la requête si demandé * - true si la requête a réussie, false sinon */ -function sql_drop_view($table, $exist = '', $serveur = '', $option = true) -{ - $f = sql_serveur('drop_view', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; +function sql_drop_view($table, $exist = '', $serveur = '', $option = true) { + $f = sql_serveur('drop_view', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $exist, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } /** - * Retourne une ressource de la liste des tables de la base de données + * Retourne une ressource de la liste des tables de la base de données * * @api * @see sql_alltable() - * + * * @param string $spip * Filtre sur tables retournées * - NULL : retourne les tables SPIP uniquement (tables préfixées avec le préfixe de la connexion) @@ -1005,20 +1117,21 @@ function sql_drop_view($table, $exist = '', $serveur = '', $option = true) * @param string $serveur * Le nom du connecteur * @param bool|string $option - * Peut avoir 3 valeurs : - * - false -> ne pas l'executer mais la retourner, + * Peut avoir 3 valeurs : + * - false -> ne pas l'executer mais la retourner, * - continue -> ne pas echouer en cas de serveur sql indisponible, * - true -> executer la requete. * @return ressource * Ressource à utiliser avec sql_fetch() -**/ -function sql_showbase($spip = NULL, $serveur = '', $option = true) -{ - $f = sql_serveur('showbase', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_showbase($spip = null, $serveur = '', $option = true) { + $f = sql_serveur('showbase', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } // la globale n'est remplie qu'apres l'appel de sql_serveur. - if ($spip == NULL){ + if ($spip == null) { $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $spip = $connexion['prefixe'] . '\_%'; } @@ -1038,18 +1151,22 @@ function sql_showbase($spip = NULL, $serveur = '', $option = true) * @param string $serveur * Le nom du connecteur * @param bool|string $option - * Peut avoir 3 valeurs : - * - false -> ne pas l'executer mais la retourner, + * Peut avoir 3 valeurs : + * - false -> ne pas l'executer mais la retourner, * - continue -> ne pas echouer en cas de serveur sql indisponible, * - true -> executer la requete. * @return array * Liste des tables SQL -**/ -function sql_alltable($spip = NULL, $serveur = '', $option = true) -{ + **/ +function sql_alltable($spip = null, $serveur = '', $option = true) { $q = sql_showbase($spip, $serveur, $option); $r = array(); - if ($q) while ($t = sql_fetch($q, $serveur)) { $r[] = array_shift($t);} + if ($q) { + while ($t = sql_fetch($q, $serveur)) { + $r[] = array_shift($t); + } + } + return $r; } @@ -1059,10 +1176,10 @@ function sql_alltable($spip = NULL, $serveur = '', $option = true) * @note * Dans la plupart des situations, il vaut mieux utiliser directement * la fonction trouver_table() qui possède un cache. - * + * * @api * @see base_trouver_table_dist() - * + * * @param string $table * Nom de la table SQL * @param bool $table_spip @@ -1071,8 +1188,8 @@ function sql_alltable($spip = NULL, $serveur = '', $option = true) * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - 'continue' : ne pas échouer en cas de serveur SQL indisponible, * - true : exécuter la requete. * @return bool|array @@ -1081,25 +1198,32 @@ function sql_alltable($spip = NULL, $serveur = '', $option = true) * - 'field' => array(colonne => description) * - 'key' => array(type => key) * - 'join' => array() // jointures, si déclarées. -**/ -function sql_showtable($table, $table_spip = false, $serveur = '', $option = true) -{ - $f = sql_serveur('showtable', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_showtable($table, $table_spip = false, $serveur = '', $option = true) { + $f = sql_serveur('showtable', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } // la globale n'est remplie qu'apres l'appel de sql_serveur. - if ($table_spip){ + if ($table_spip) { $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $vraie_table = preg_replace('/^spip/', $prefixe, $table); - } else $vraie_table = $table; + } else { + $vraie_table = $table; + } $f = $f($vraie_table, $serveur, $option !== false); - if (!$f) return array(); - if (isset($GLOBALS['tables_principales'][$table]['join'])) + if (!$f) { + return array(); + } + if (isset($GLOBALS['tables_principales'][$table]['join'])) { $f['join'] = $GLOBALS['tables_principales'][$table]['join']; - elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) + } elseif (isset($GLOBALS['tables_auxiliaires'][$table]['join'])) { $f['join'] = $GLOBALS['tables_auxiliaires'][$table]['join']; + } + return $f; } @@ -1121,7 +1245,7 @@ function sql_showtable($table, $table_spip = false, $serveur = '', $option = tru * ) * ); * ``` - * + * * @param string $nom * Nom de la table * @param array $champs @@ -1137,18 +1261,31 @@ function sql_showtable($table, $table_spip = false, $serveur = '', $option = tru * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - 'continue' : ne pas échouer en cas de serveur SQL indisponible, * - true : exécuter la requete. * @return bool * true si succès, false en cas d'echec -**/ -function sql_create($nom, $champs, $cles = array(), $autoinc = false, $temporary = false, $serveur = '', $option = true) { - $f = sql_serveur('create', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_create( + $nom, + $champs, + $cles = array(), + $autoinc = false, + $temporary = false, + $serveur = '', + $option = true +) { + $f = sql_serveur('create', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($nom, $champs, $cles, $autoinc, $temporary, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -1156,22 +1293,26 @@ function sql_create($nom, $champs, $cles = array(), $autoinc = false, $temporary * Crée une base de données * * @api - * @param string $nom Nom de la base (sans l'extension de fichier si gestionnaire SQLite) - * @param string $serveur Nom de la connexion + * @param string $nom Nom de la base (sans l'extension de fichier si gestionnaire SQLite) + * @param string $serveur Nom de la connexion * @param bool $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool true si la base est créee. **/ -function sql_create_base($nom, $serveur = '', $option = true) -{ - $f = sql_serveur('create_base', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; +function sql_create_base($nom, $serveur = '', $option = true) { + $f = sql_serveur('create_base', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($nom, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -1183,7 +1324,7 @@ function sql_create_base($nom, $serveur = '', $option = true) * @see sql_drop_view() * @see sql_create() * @see sql_get_select() Pour obtenir le texte de la requête SELECT pour créer la vue. - * + * * @param string $nom * Nom de la vue * @param string $select_query @@ -1192,20 +1333,25 @@ function sql_create_base($nom, $serveur = '', $option = true) * Nom du connecteur * @param bool|string $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool|string * - true si succès, * - texte de la requête si demandé * - false en cas d'échec. -**/ + **/ function sql_create_view($nom, $select_query, $serveur = '', $option = true) { - $f = sql_serveur('create_view', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('create_view', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($nom, $select_query, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -1228,16 +1374,18 @@ function sql_create_view($nom, $select_query, $serveur = '', $option = true) { * Nom du connecteur * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return string * Texte de sélection pour la requête */ -function sql_multi($sel, $lang, $serveur = '', $option = true) -{ - $f = sql_serveur('multi', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; +function sql_multi($sel, $lang, $serveur = '', $option = true) { + $f = sql_serveur('multi', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } + return $f($sel, $lang); } @@ -1254,7 +1402,10 @@ function sql_multi($sel, $lang, $serveur = '', $option = true) */ function sql_error($serveur = '') { $f = sql_serveur('error', $serveur, 'continue'); - if (!is_string($f) OR !$f) return false; + if (!is_string($f) OR !$f) { + return false; + } + return $f('query inconnue', $serveur); } @@ -1270,7 +1421,10 @@ function sql_error($serveur = '') { */ function sql_errno($serveur = '') { $f = sql_serveur('errno', $serveur, 'continue'); - if (!is_string($f) OR !$f) return false; + if (!is_string($f) OR !$f) { + return false; + } + return $f($serveur); } @@ -1278,21 +1432,26 @@ function sql_errno($serveur = '') { * Retourne une explication de requête (Explain) SQL * * @api - * @param string $q Texte de la requête - * @param string $serveur Nom de la connexion + * @param string $q Texte de la requête + * @param string $serveur Nom de la connexion * @param bool $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return array Tableau de l'explication */ function sql_explain($q, $serveur = '', $option = true) { - $f = sql_serveur('explain', $serveur, 'continue'); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('explain', $serveur, 'continue'); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($q, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -1300,21 +1459,26 @@ function sql_explain($q, $serveur = '', $option = true) { * Optimise une table SQL * * @api - * @param string $table Nom de la table - * @param string $serveur Nom de la connexion + * @param string $table Nom de la table + * @param string $serveur Nom de la connexion * @param bool $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool Toujours true */ function sql_optimize($table, $serveur = '', $option = true) { - $f = sql_serveur('optimize', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('optimize', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -1322,12 +1486,12 @@ function sql_optimize($table, $serveur = '', $option = true) { * Répare une table SQL * * @api - * @param string $table Nom de la table SQL - * @param string $serveur Nom de la connexion + * @param string $table Nom de la table SQL + * @param string $serveur Nom de la connexion * @param bool $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return bool|string @@ -1335,10 +1499,15 @@ function sql_optimize($table, $serveur = '', $option = true) { * - true si la requête a réussie, false sinon */ function sql_repair($table, $serveur = '', $option = true) { - $f = sql_serveur('repair', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('repair', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($table, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } @@ -1350,12 +1519,12 @@ function sql_repair($table, $serveur = '', $option = true) { * À n'utiliser qu'en dernière extrémité * * @api - * @param string $ins Requête - * @param string $serveur Nom de la connexion + * @param string $ins Requête + * @param string $serveur Nom de la connexion * @param bool $option * Peut avoir 3 valeurs : - * - * - false : ne pas l'exécuter mais la retourner, + * + * - false : ne pas l'exécuter mais la retourner, * - true : exécuter la requête * - 'continue' : ne pas échouer en cas de serveur sql indisponible * @return array|resource|string|bool @@ -1364,136 +1533,165 @@ function sql_repair($table, $serveur = '', $option = true) { * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. */ function sql_query($ins, $serveur = '', $option = true) { - $f = sql_serveur('query', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('query', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($ins, $serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; } /** * Retourne la première ligne d'une sélection - * + * * Retourne la première ligne de résultat d'une sélection * comme si l'on appelait successivement `sql_select()` puis `sql_fetch()` - * + * * @example * ``` * $art = sql_fetsel(array('id_rubrique','id_secteur'), 'spip_articles', 'id_article='.sql_quote($id_article)); * $id_rubrique = $art['id_rubrique']; * ``` - * + * * @api * @uses sql_select() * @uses sql_fetch() - * @see sql_getfetsel() - * + * @see sql_getfetsel() + * * @param array|string $select - * Liste des champs a recuperer (Select) + * Liste des champs a recuperer (Select) * @param array|string $from - * Tables a consulter (From) + * Tables a consulter (From) * @param array|string $where - * Conditions a remplir (Where) + * Conditions a remplir (Where) * @param array|string $groupby - * Critere de regroupement (Group by) + * Critere de regroupement (Group by) * @param array|string $orderby - * Tableau de classement (Order By) + * Tableau de classement (Order By) * @param string $limit - * Critere de limite (Limit) + * Critere de limite (Limit) * @param array $having - * Tableau des des post-conditions a remplir (Having) + * Tableau des des post-conditions a remplir (Having) * @param string $serveur - * Le serveur sollicite (pour retrouver la connexion) + * Le serveur sollicite (pour retrouver la connexion) * @param bool|string $option - * Peut avoir 3 valeurs : - * - true -> executer la requete. - * - continue -> ne pas echouer en cas de serveur sql indisponible. - * - false -> ne pas l'executer mais la retourner. - * + * Peut avoir 3 valeurs : + * - true -> executer la requete. + * - continue -> ne pas echouer en cas de serveur sql indisponible. + * - false -> ne pas l'executer mais la retourner. + * * @return array * Tableau de la premiere ligne de resultat de la selection tel que * `array('id_rubrique' => 1, 'id_secteur' => 2)` * -**/ -function sql_fetsel($select = array(), $from = array(), $where = array(), - $groupby = array(), $orderby = array(), $limit = '', - $having = array(), $serveur = '', $option = true) { - $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); - if ($option === false) return $q; - if (!$q) return array(); + **/ +function sql_fetsel( + $select = array(), + $from = array(), + $where = array(), + $groupby = array(), + $orderby = array(), + $limit = '', + $having = array(), + $serveur = '', + $option = true +) { + $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); + if ($option === false) { + return $q; + } + if (!$q) { + return array(); + } $r = sql_fetch($q, $serveur, $option); sql_free($q, $serveur, $option); + return $r; } /** * Retourne le tableau de toutes les lignes d'une selection - * + * * Retourne toutes les lignes de resultat d'une selection * comme si l'on appelait successivement sql_select() puis while(sql_fetch()) - * + * * @example - * ``` - * $rubs = sql_allfetsel('id_rubrique', 'spip_articles', 'id_secteur='.sql_quote($id_secteur)); - * // $rubs = array(array('id_rubrique'=>1), array('id_rubrique'=>3, ...) - * ``` - * + * ``` + * $rubs = sql_allfetsel('id_rubrique', 'spip_articles', 'id_secteur='.sql_quote($id_secteur)); + * // $rubs = array(array('id_rubrique'=>1), array('id_rubrique'=>3, ...) + * ``` + * * @api * @uses sql_select() * @uses sql_fetch() - * + * * @param array|string $select - * Liste des champs a recuperer (Select) + * Liste des champs a recuperer (Select) * @param array|string $from - * Tables a consulter (From) + * Tables a consulter (From) * @param array|string $where - * Conditions a remplir (Where) + * Conditions a remplir (Where) * @param array|string $groupby - * Critere de regroupement (Group by) + * Critere de regroupement (Group by) * @param array|string $orderby - * Tableau de classement (Order By) + * Tableau de classement (Order By) * @param string $limit - * Critere de limite (Limit) + * Critere de limite (Limit) * @param array $having - * Tableau des des post-conditions a remplir (Having) + * Tableau des des post-conditions a remplir (Having) * @param string $serveur - * Le serveur sollicite (pour retrouver la connexion) + * Le serveur sollicite (pour retrouver la connexion) * @param bool|string $option - * Peut avoir 3 valeurs : - * - true -> executer la requete. - * - continue -> ne pas echouer en cas de serveur sql indisponible. - * - false -> ne pas l'executer mais la retourner. - * + * Peut avoir 3 valeurs : + * - true -> executer la requete. + * - continue -> ne pas echouer en cas de serveur sql indisponible. + * - false -> ne pas l'executer mais la retourner. + * * @return array - * Tableau de toutes les lignes de resultat de la selection - * Chaque entree contient un tableau des elements demandees dans le SELECT. - * {@example - * ``` - * array( - * array('id_rubrique' => 1, 'id_secteur' => 2) - * array('id_rubrique' => 4, 'id_secteur' => 2) - * ... - * ) - * ``` - * } - * -**/ -function sql_allfetsel($select = array(), $from = array(), $where = array(), - $groupby = array(), $orderby = array(), $limit = '', - $having = array(), $serveur = '', $option = true) { - $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); - if ($option === false) return $q; + * Tableau de toutes les lignes de resultat de la selection + * Chaque entree contient un tableau des elements demandees dans le SELECT. + * {@example + * ``` + * array( + * array('id_rubrique' => 1, 'id_secteur' => 2) + * array('id_rubrique' => 4, 'id_secteur' => 2) + * ... + * ) + * ``` + * } + * + **/ +function sql_allfetsel( + $select = array(), + $from = array(), + $where = array(), + $groupby = array(), + $orderby = array(), + $limit = '', + $having = array(), + $serveur = '', + $option = true +) { + $q = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); + if ($option === false) { + return $q; + } + return sql_fetch_all($q, $serveur, $option); } /** * Retourne un unique champ d'une selection - * + * * Retourne dans la premiere ligne de resultat d'une selection * un unique champ demande - * + * * @example * ``` * $id_rubrique = sql_getfetsel('id_rubrique', 'spip_articles', 'id_article='.sql_quote($id_article)); @@ -1501,7 +1699,7 @@ function sql_allfetsel($select = array(), $from = array(), $where = array(), * * @api * @uses sql_fetsel() - * + * * @param array|string $select * Liste des champs à récupérer (Select) * @param array|string $from @@ -1520,42 +1718,62 @@ function sql_allfetsel($select = array(), $from = array(), $where = array(), * Le serveur sollicité (pour retrouver la connexion) * @param bool|string $option * Peut avoir 3 valeurs : - * + * * - true -> executer la requete. * - continue -> ne pas echouer en cas de serveur sql indisponible. * - false -> ne pas l'executer mais la retourner. - * + * * @return mixed * Contenu de l'unique valeur demandee du premier enregistrement retourne * -**/ -function sql_getfetsel($select, $from = array(), $where = array(), $groupby = array(), - $orderby = array(), $limit = '', $having = array(), $serveur = '', $option = true) { - if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) $id = $c[1]; - elseif (!preg_match('/\W/', $select)) $id = $select; - else {$id = 'n'; $select .= ' AS n';} - $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); - if ($option === false) return $r; - if (!$r) return NULL; - return $r[$id]; + **/ +function sql_getfetsel( + $select, + $from = array(), + $where = array(), + $groupby = array(), + $orderby = array(), + $limit = '', + $having = array(), + $serveur = '', + $option = true +) { + if (preg_match('/\s+as\s+(\w+)$/i', $select, $c)) { + $id = $c[1]; + } elseif (!preg_match('/\W/', $select)) { + $id = $select; + } else { + $id = 'n'; + $select .= ' AS n'; + } + $r = sql_fetsel($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur, $option); + if ($option === false) { + return $r; + } + if (!$r) { + return null; + } + + return $r[$id]; } /** - * Retourne le numero de version du serveur SQL + * Retourne le numero de version du serveur SQL * * @api * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : - * - true pour executer la requete. - * - continue pour ne pas echouer en cas de serveur sql indisponible. - * + * Peut avoir 2 valeurs : + * - true pour executer la requete. + * - continue pour ne pas echouer en cas de serveur sql indisponible. + * * @return string - * Numero de version du serveur SQL -**/ + * Numero de version du serveur SQL + **/ function sql_version($serveur = '', $option = true) { - $row = sql_fetsel("version() AS n", '','','','','','',$serveur); + $row = sql_fetsel("version() AS n", '', '', '', '', '', '', $serveur); + return ($row['n']); } @@ -1571,92 +1789,113 @@ function sql_version($serveur = '', $option = true) { * de verifier que le moteur prefere utiliser des transactions dans ce cas. * * @example - * ``` - * if (sql_preferer_transaction()) { - * sql_demarrer_transaction(); - * } - * ``` + * ``` + * if (sql_preferer_transaction()) { + * sql_demarrer_transaction(); + * } + * ``` * * @api * @see sql_demarrer_transaction() * @see sql_terminer_transaction() * * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : - * - true pour executer la requete. - * - continue pour ne pas echouer en cas de serveur sql indisponible. + * Peut avoir 2 valeurs : + * - true pour executer la requete. + * - continue pour ne pas echouer en cas de serveur sql indisponible. * * @return bool - * Le serveur SQL prefere t'il des transactions pour les insertions multiples ? -**/ + * Le serveur SQL prefere t'il des transactions pour les insertions multiples ? + **/ function sql_preferer_transaction($serveur = '', $option = true) { - $f = sql_serveur('preferer_transaction', $serveur, 'continue'); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('preferer_transaction', $serveur, 'continue'); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; -}; +} + +; /** * Démarre une transaction * * @api * @see sql_terminer_transaction() Pour cloturer la transaction - * + * * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @param bool|string $option - * Peut avoir 3 valeurs : - * - * - true pour executer la requete. - * - continue pour ne pas echouer en cas de serveur sql indisponible. - * - false pour obtenir le code de la requete - * + * Peut avoir 3 valeurs : + * + * - true pour executer la requete. + * - continue pour ne pas echouer en cas de serveur sql indisponible. + * - false pour obtenir le code de la requete + * * @return bool * true si la transaction est demarree * false en cas d'erreur -**/ + **/ function sql_demarrer_transaction($serveur = '', $option = true) { - $f = sql_serveur('demarrer_transaction', $serveur, 'continue'); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('demarrer_transaction', $serveur, 'continue'); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; -}; +} + +; /** * Termine une transaction * * @api * @see sql_demarrer_transaction() Pour demarrer une transaction - * + * * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @param bool|string $option - * Peut avoir 3 valeurs : - * - * - true pour executer la requete. - * - continue pour ne pas echouer en cas de serveur sql indisponible. - * - false pour obtenir le code de la requete - * + * Peut avoir 3 valeurs : + * + * - true pour executer la requete. + * - continue pour ne pas echouer en cas de serveur sql indisponible. + * - false pour obtenir le code de la requete + * * @return bool * true si la transaction est demarree * false en cas d'erreur -**/ + **/ function sql_terminer_transaction($serveur = '', $option = true) { - $f = sql_serveur('terminer_transaction', $serveur, 'continue'); - if (!is_string($f) OR !$f) return false; + $f = sql_serveur('terminer_transaction', $serveur, 'continue'); + if (!is_string($f) OR !$f) { + return false; + } $r = $f($serveur, $option !== false); - if ($r === false) spip_sql_erreur($serveur); + if ($r === false) { + spip_sql_erreur($serveur); + } + return $r; -}; +} + +; /** * Prépare une chaine hexadécimale - * + * * Prend une chaîne sur l'aphabet hexa * et retourne sa représentation numérique attendue par le serveur SQL. * Par exemple : FF ==> 0xFF en MySQL mais x'FF' en PG @@ -1668,27 +1907,29 @@ function sql_terminer_transaction($serveur = '', $option = true) { * Nom du connecteur * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - true pour exécuter la demande. * - 'continue' pour ne pas échouer en cas de serveur SQL indisponible. * @return string * Valeur hexadécimale attendue par le serveur SQL -**/ -function sql_hex($val, $serveur = '', $option = true) -{ - $f = sql_serveur('hex', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; + **/ +function sql_hex($val, $serveur = '', $option = true) { + $f = sql_serveur('hex', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } + return $f($val); } /** * Echapper du contenu - * + * * Echappe du contenu selon ce qu'attend le type de serveur SQL * et en fonction du type de contenu. - * + * * Permet entre autres de se protéger d'injections SQL. - * + * * Cette fonction est automatiquement appelée par les fonctions `sql_*q` * tel que `sql_instertq` ou `sql_updateq` * @@ -1702,11 +1943,13 @@ function sql_hex($val, $serveur = '', $option = true) * Exemple : `int NOT NULL` qui sert alors aussi à calculer le type d'échappement * @return string * La chaine echappee -**/ -function sql_quote($val, $serveur = '', $type = '') -{ + **/ +function sql_quote($val, $serveur = '', $type = '') { $f = sql_serveur('quote', $serveur, true); - if (!is_string($f) OR !$f) $f = '_q'; + if (!is_string($f) OR !$f) { + $f = '_q'; + } + return $f($val, $type); } @@ -1724,17 +1967,19 @@ function sql_quote($val, $serveur = '', $type = '') * Nom du connecteur * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - true pour exécuter la demande. * - 'continue' pour ne pas échouer en cas de serveur SQL indisponible. * @return string|bool * - string : Expression SQL * - false si le serveur SQL est indisponible **/ -function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = true) -{ +function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = true) { $f = sql_serveur('date_proche', $serveur, true); - if (!is_string($f) OR !$f) return false; + if (!is_string($f) OR !$f) { + return false; + } + return $f($champ, $interval, $unite); } @@ -1761,22 +2006,31 @@ function sql_date_proche($champ, $interval, $unite, $serveur = '', $option = tru * Nom du connecteur * @param bool|string $option * Peut avoir 2 valeurs : - * + * * - continue -> ne pas echouer en cas de serveur sql indisponible * - true ou false -> retourne l'expression * @return string * Expression de requête SQL -**/ + **/ function sql_in($val, $valeurs, $not = '', $serveur = '', $option = true) { if (is_array($valeurs)) { $f = sql_serveur('quote', $serveur, true); - if (!is_string($f) OR !$f) return false; + if (!is_string($f) OR !$f) { + return false; + } $valeurs = join(',', array_map($f, array_unique($valeurs))); - } elseif (isset($valeurs[0]) AND $valeurs[0]===',') $valeurs = substr($valeurs,1); - if (!strlen(trim($valeurs))) return ($not ? "0=0" : '0=1'); + } elseif (isset($valeurs[0]) AND $valeurs[0] === ',') { + $valeurs = substr($valeurs, 1); + } + if (!strlen(trim($valeurs))) { + return ($not ? "0=0" : '0=1'); + } + + $f = sql_serveur('in', $serveur, $option === 'continue' OR $option === false); + if (!is_string($f) OR !$f) { + return false; + } - $f = sql_serveur('in', $serveur, $option === 'continue' OR $option === false); - if (!is_string($f) OR !$f) return false; return $f($val, $valeurs, $not, $serveur, $option !== false); } @@ -1815,28 +2069,39 @@ function sql_in($val, $valeurs, $not = '', $serveur = '', $option = true) { * Nom du connecteur * @return string * Expression de requête SQL -**/ -function sql_in_select($in, $select, $from = array(), $where = array(), - $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur = '') -{ - $liste = array(); - $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur); - while ($r = sql_fetch($res)) {$liste[] = array_shift($r);} + **/ +function sql_in_select( + $in, + $select, + $from = array(), + $where = array(), + $groupby = array(), + $orderby = array(), + $limit = '', + $having = array(), + $serveur = '' +) { + $liste = array(); + $res = sql_select($select, $from, $where, $groupby, $orderby, $limit, $having, $serveur); + while ($r = sql_fetch($res)) { + $liste[] = array_shift($r); + } sql_free($res); + return sql_in($in, $liste); } /** * Implémentation sécurisée du saut en avant. - * + * * Ne dépend pas de la disponibilité de la fonction `sql_seek()`. * Ne fait rien pour une valeur négative ou nulle de `$saut`. * Retourne la position après le saut * * @see sql_seek() - * + * * @param resource $res - * Ressource issue d'une selection sql_select + * Ressource issue d'une selection sql_select * @param int $pos * position courante * @param int $saut @@ -1847,27 +2112,36 @@ function sql_in_select($in, $select, $from = array(), $where = array(), * @param string $serveur * Nom du connecteur * @param bool|string $option - * Peut avoir 2 valeurs : + * Peut avoir 2 valeurs : * - true -> executer la requete * - continue -> ne pas echouer en cas de serveur sql indisponible - * + * * @return int * Position apres le saut. */ -function sql_skip($res, $pos, $saut, $count, $serveur = '', $option = true){ +function sql_skip($res, $pos, $saut, $count, $serveur = '', $option = true) { // pas de saut en arriere qu'on ne sait pas faire sans sql_seek - if (($saut=intval($saut))<=0) return $pos; + if (($saut = intval($saut)) <= 0) { + return $pos; + } - $seek = $pos + $saut; + $seek = $pos+$saut; // si le saut fait depasser le maxi, on libere la resource // et on sort - if ($seek>=$count) {sql_free($res, $serveur, $option); return $count;} + if ($seek >= $count) { + sql_free($res, $serveur, $option); + + return $count; + } - if (sql_seek($res, $seek)) + if (sql_seek($res, $seek)) { $pos = $seek; - else - while ($pos<$seek AND sql_fetch($res, $serveur, $option)) + } else { + while ($pos < $seek AND sql_fetch($res, $serveur, $option)) { $pos++; + } + } + return $pos; } @@ -1877,7 +2151,7 @@ function sql_skip($res, $pos, $saut, $count, $serveur = '', $option = true){ * * @api * @see sql_test_date() pour tester les champs de date - * + * * @param string $type * Description de la colonne SQL * @param string $serveur @@ -1887,9 +2161,8 @@ function sql_skip($res, $pos, $saut, $count, $serveur = '', $option = true){ * @return bool * True si le champ est de type entier */ -function sql_test_int($type, $serveur = '', $option = true) -{ - return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i',trim($type)); +function sql_test_int($type, $serveur = '', $option = true) { + return preg_match('/^(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT)/i', trim($type)); } /** @@ -1897,7 +2170,7 @@ function sql_test_int($type, $serveur = '', $option = true) * * @api * @see sql_test_int() pour tester les champs d'entiers - * + * * @param string $type * Description de la colonne SQL * @param string $serveur @@ -1907,43 +2180,45 @@ function sql_test_int($type, $serveur = '', $option = true) * @return bool * True si le champ est de type entier */ -function sql_test_date($type, $serveur = '', $option = true) -{ - return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i',trim($type)); +function sql_test_date($type, $serveur = '', $option = true) { + return preg_match('/^(DATE|DATETIME|TIMESTAMP|TIME)/i', trim($type)); } /** * Formate une date - * + * * Formater une date Y-m-d H:i:s sans passer par mktime * qui ne sait pas gerer les dates < 1970 * * @api * @param int $annee Annee - * @param int $mois Numero du mois - * @param int $jour Numero du jour dans le mois - * @param int $h Heures - * @param int $m Minutes - * @param int $s Secondes + * @param int $mois Numero du mois + * @param int $jour Numero du jour dans le mois + * @param int $h Heures + * @param int $m Minutes + * @param int $s Secondes * @param string $serveur * Le serveur sollicite (pour retrouver la connexion) * @return string * La date formatee */ -function sql_format_date($annee = 0, $mois = 0, $jour = 0, $h = 0, $m = 0, $s = 0, $serveur = ''){ - $annee = sprintf("%04s",$annee); - $mois = sprintf("%02s",$mois); +function sql_format_date($annee = 0, $mois = 0, $jour = 0, $h = 0, $m = 0, $s = 0, $serveur = '') { + $annee = sprintf("%04s", $annee); + $mois = sprintf("%02s", $mois); - if ($annee == "0000") $mois = 0; - if ($mois == "00") $jour = 0; + if ($annee == "0000") { + $mois = 0; + } + if ($mois == "00") { + $jour = 0; + } - return sprintf("%04u",$annee) . '-' . sprintf("%02u",$mois) . '-' - . sprintf("%02u",$jour) . ' ' . sprintf("%02u",$h) . ':' - . sprintf("%02u",$m) . ':' . sprintf("%02u",$s); + return sprintf("%04u", $annee) . '-' . sprintf("%02u", $mois) . '-' + . sprintf("%02u", $jour) . ' ' . sprintf("%02u", $h) . ':' + . sprintf("%02u", $m) . ':' . sprintf("%02u", $s); } - /** * Retourne la description de la table SQL * @@ -1951,17 +2226,17 @@ function sql_format_date($annee = 0, $mois = 0, $jour = 0, $h = 0, $m = 0, $s = * la structure reelle de la base de donnees. * En absence, ce qui arrive lors de l'installation, la fonction * s'appuie sur la declaration des tables SQL principales ou auxiliaires. - * + * * @internal Cette fonction devrait disparaître - * + * * @param string $nom - * Nom de la table dont on souhait la description + * Nom de la table dont on souhait la description * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @return array|bool - * Description de la table ou false si elle n'est pas trouvee ou declaree. -**/ -function description_table($nom, $serveur = ''){ + * Description de la table ou false si elle n'est pas trouvee ou declaree. + **/ +function description_table($nom, $serveur = '') { static $trouver_table; @@ -1970,18 +2245,23 @@ function description_table($nom, $serveur = ''){ car sinon on va se comporter differement selon que la table est declaree ou non */ - if (!$trouver_table) $trouver_table = charger_fonction('trouver_table', 'base'); - if ($desc = $trouver_table($nom, $serveur)) + if (!$trouver_table) { + $trouver_table = charger_fonction('trouver_table', 'base'); + } + if ($desc = $trouver_table($nom, $serveur)) { return $desc; + } // sauf a l'installation : include_spip('base/serial'); - if (isset($GLOBALS['tables_principales'][$nom])) + if (isset($GLOBALS['tables_principales'][$nom])) { return $GLOBALS['tables_principales'][$nom]; + } include_spip('base/auxiliaires'); - if (isset($GLOBALS['tables_auxiliaires'][$nom])) + if (isset($GLOBALS['tables_auxiliaires'][$nom])) { return $GLOBALS['tables_auxiliaires'][$nom]; + } return false; } diff --git a/ecrire/base/auxiliaires.php b/ecrire/base/auxiliaires.php index 5de1615a70..b4691ac6af 100644 --- a/ecrire/base/auxiliaires.php +++ b/ecrire/base/auxiliaires.php @@ -18,9 +18,11 @@ * Ce fichier mais directement base/objets si nécessaire * * @package SPIP\Core\SQL\Tables -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/objets'); lister_tables_objets_sql(); diff --git a/ecrire/base/connect_sql.php b/ecrire/base/connect_sql.php index 5a60ddbf5f..c287b27b78 100644 --- a/ecrire/base/connect_sql.php +++ b/ecrire/base/connect_sql.php @@ -14,12 +14,13 @@ * Utilitaires indispensables autour des serveurs SQL * * @package SPIP\Core\SQL -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} require_once _ROOT_RESTREINT . 'base/objets.php'; - /** * Connexion à un serveur de base de données * @@ -31,20 +32,24 @@ require_once _ROOT_RESTREINT . 'base/objets.php'; * * À l'installation, il faut simuler l'existence de ce fichier. * - * @uses spip_connect_main() - * + * @uses spip_connect_main() + * * @param string $serveur Nom du connecteur * @param string $version Version de l'API SQL * @return bool|array * - false si la connexion a échouée, * - tableau décrivant la connexion sinon -**/ + **/ function spip_connect($serveur = '', $version = '') { $serveur = !is_string($serveur) ? '' : strtolower($serveur); $index = $serveur ? $serveur : 0; - if (!$version) $version = $GLOBALS['spip_sql_version']; - if (isset($GLOBALS['connexions'][$index][$version])) return $GLOBALS['connexions'][$index]; + if (!$version) { + $version = $GLOBALS['spip_sql_version']; + } + if (isset($GLOBALS['connexions'][$index][$version])) { + return $GLOBALS['connexions'][$index]; + } include_spip('base/abstract_sql'); $install = (_request('exec') == 'install'); @@ -52,55 +57,64 @@ function spip_connect($serveur = '', $version = '') { // Premiere connexion ? if (!($old = isset($GLOBALS['connexions'][$index]))) { $f = (!preg_match('/^[\w\.]*$/', $serveur)) - ? '' // nom de serveur mal ecrit - : ($serveur ? - ( _DIR_CONNECT. $serveur . '.php') // serveur externe - : (_FILE_CONNECT ? _FILE_CONNECT // serveur principal ok - : ($install ? _FILE_CONNECT_TMP // init du serveur principal - : ''))); // installation pas faite + ? '' // nom de serveur mal ecrit + : ($serveur ? + (_DIR_CONNECT . $serveur . '.php') // serveur externe + : (_FILE_CONNECT ? _FILE_CONNECT // serveur principal ok + : ($install ? _FILE_CONNECT_TMP // init du serveur principal + : ''))); // installation pas faite unset($GLOBALS['db_ok']); unset($GLOBALS['spip_connect_version']); - if ($f) { - if (is_readable($f)) { + if ($f) { + if (is_readable($f)) { include($f); } elseif ($serveur AND !$install) { // chercher une declaration de serveur dans le path // qui pourra un jour servir a declarer des bases sqlite // par des plugins. Et sert aussi aux boucles POUR. - find_in_path("$serveur.php",'connect/',true); + find_in_path("$serveur.php", 'connect/', true); } } if (!isset($GLOBALS['db_ok'])) { - // fera mieux la prochaine fois - if ($install) return false; - if ($f AND is_readable($f)) + // fera mieux la prochaine fois + if ($install) { + return false; + } + if ($f AND is_readable($f)) { spip_log("spip_connect: fichier de connexion '$f' OK.", _LOG_INFO_IMPORTANTE); - else + } else { spip_log("spip_connect: fichier de connexion '$f' non trouve", _LOG_INFO_IMPORTANTE); + } spip_log("spip_connect: echec connexion ou serveur $index mal defini dans '$f'.", _LOG_HS); + // ne plus reessayer si ce n'est pas l'install - return $GLOBALS['connexions'][$index]=false; + return $GLOBALS['connexions'][$index] = false; } $GLOBALS['connexions'][$index] = $GLOBALS['db_ok']; } // si la connexion a deja ete tentee mais a echoue, le dire! - if (!$GLOBALS['connexions'][$index]) return false; + if (!$GLOBALS['connexions'][$index]) { + return false; + } // la connexion a reussi ou etait deja faite. // chargement de la version du jeu de fonctions // si pas dans le fichier par defaut $type = $GLOBALS['db_ok']['type']; - $jeu = 'spip_' . $type .'_functions_' . $version; + $jeu = 'spip_' . $type . '_functions_' . $version; if (!isset($GLOBALS[$jeu])) { - if (!find_in_path($type . '_' . $version . '.php', 'req/', true)){ - spip_log("spip_connect: serveur $index version '$version' non defini pour '$type'", _LOG_HS); + if (!find_in_path($type . '_' . $version . '.php', 'req/', true)) { + spip_log("spip_connect: serveur $index version '$version' non defini pour '$type'", _LOG_HS); + // ne plus reessayer return $GLOBALS['connexions'][$index][$version] = array(); } } $GLOBALS['connexions'][$index][$version] = $GLOBALS[$jeu]; - if ($old) return $GLOBALS['connexions'][$index]; + if ($old) { + return $GLOBALS['connexions'][$index]; + } $GLOBALS['connexions'][$index]['spip_connect_version'] = isset($GLOBALS['spip_connect_version']) ? $GLOBALS['spip_connect_version'] : 0; @@ -110,33 +124,35 @@ function spip_connect($serveur = '', $version = '') { // s'ils le connaissent if (!$serveur) { - $charset = spip_connect_main($GLOBALS[$jeu],$GLOBALS['db_ok']['charset']); + $charset = spip_connect_main($GLOBALS[$jeu], $GLOBALS['db_ok']['charset']); if (!$charset) { unset($GLOBALS['connexions'][$index]); spip_log("spip_connect: absence de charset", _LOG_AVERTISSEMENT); + return false; } - } - else { - if ($GLOBALS['db_ok']['charset']){ + } else { + if ($GLOBALS['db_ok']['charset']) { $charset = $GLOBALS['db_ok']['charset']; } // spip_meta n'existe pas toujours dans la base // C'est le cas d'un dump sqlite par exemple elseif ($GLOBALS['connexions'][$index]['spip_connect_version'] - AND sql_showtable('spip_meta', true, $serveur) - AND $r = sql_getfetsel('valeur', 'spip_meta', "nom='charset_sql_connexion'",'','','','',$serveur)){ + AND sql_showtable('spip_meta', true, $serveur) + AND $r = sql_getfetsel('valeur', 'spip_meta', "nom='charset_sql_connexion'", '', '', '', '', $serveur) + ) { $charset = $r; - } - else { + } else { $charset = -1; } } if ($charset != -1) { $f = $GLOBALS[$jeu]['set_charset']; - if (function_exists($f)) + if (function_exists($f)) { $f($charset, $serveur); + } } + return $GLOBALS['connexions'][$index]; } @@ -144,15 +160,14 @@ function spip_connect($serveur = '', $version = '') { * Log la dernière erreur SQL présente sur la connexion indiquée * * @param string $serveur Nom du connecteur de bdd utilisé -**/ -function spip_sql_erreur($serveur = '') -{ + **/ +function spip_sql_erreur($serveur = '') { $connexion = spip_connect($serveur); $e = sql_errno($serveur); $t = (isset($connexion['type']) ? $connexion['type'] : 'sql'); - $m = "Erreur $e de $t: " . sql_error($serveur) . "\nin ".sql_error_backtrace()."\n" . trim($connexion['last']); + $m = "Erreur $e de $t: " . sql_error($serveur) . "\nin " . sql_error_backtrace() . "\n" . trim($connexion['last']); $f = $t . $serveur; - spip_log($m, $f.'.'._LOG_ERREUR); + spip_log($m, $f . '.' . _LOG_ERREUR); } /** @@ -163,78 +178,99 @@ function spip_sql_erreur($serveur = '') * * Elle existe en tant que gestionnaire de versions, * connue seulement des convertisseurs automatiques - * + * * @param string $version Numéro de version de l'API SQL - * @param string $ins Instruction de l'API souhaitée, tel que 'allfetsel' + * @param string $ins Instruction de l'API souhaitée, tel que 'allfetsel' * @param string $serveur Nom du connecteur - * @param bool $cont true pour continuer même si le serveur SQL ou l'instruction est indisponible + * @param bool $cont true pour continuer même si le serveur SQL ou l'instruction est indisponible * @return array|bool|string * - string : nom de la fonction à utiliser, * - false : si la connexion a échouée * - array : description de la connexion, si l'instruction sql est indisponible pour cette connexion -**/ + **/ function spip_connect_sql($version, $ins = '', $serveur = '', $cont = false) { $desc = spip_connect($serveur, $version); - if (function_exists($f = @$desc[$version][$ins])) return $f; - if ($cont) return $desc; - if ($ins) + if (function_exists($f = @$desc[$version][$ins])) { + return $f; + } + if ($cont) { + return $desc; + } + if ($ins) { spip_log("Le serveur '$serveur' version $version n'a pas '$ins'", _LOG_ERREUR); + } include_spip('inc/minipres'); - echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status'=>503)); + echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status' => 503)); exit; } /** * Fonction appelée par le fichier connecteur de base de données * crée dans `config/` à l'installation. - * + * * Il contient un appel direct à cette fonction avec comme arguments * les identifants de connexion. - * + * * Si la connexion reussit, la globale `db_ok` mémorise sa description. * C'est un tableau également retourné en valeur, pour les appels * lors de l'installation. * - * @param string $host Adresse du serveur de base de données - * @param string $port Port utilisé pour la connexion - * @param string $login Identifiant de connexion à la base de données - * @param string $pass Mot de passe pour cet identifiant - * @param string $db Nom de la base de données à utiliser - * @param string $type Type de base de données tel que 'mysql', 'sqlite3' (cf ecrire/req/) + * @param string $host Adresse du serveur de base de données + * @param string $port Port utilisé pour la connexion + * @param string $login Identifiant de connexion à la base de données + * @param string $pass Mot de passe pour cet identifiant + * @param string $db Nom de la base de données à utiliser + * @param string $type Type de base de données tel que 'mysql', 'sqlite3' (cf ecrire/req/) * @param string $prefixe Préfixe des tables SPIP - * @param string $auth Type d'authentification (cas si 'ldap') + * @param string $auth Type d'authentification (cas si 'ldap') * @param string $charset Charset de la connexion SQL (optionnel) * @return array Description de la connexion */ -function spip_connect_db($host, $port, $login, $pass, $db = '', $type = 'mysql', $prefixe = '', $auth = '', $charset = '') { +function spip_connect_db( + $host, + $port, + $login, + $pass, + $db = '', + $type = 'mysql', + $prefixe = '', + $auth = '', + $charset = '' +) { // temps avant nouvelle tentative de connexion // suite a une connection echouee - if (!defined('_CONNECT_RETRY_DELAY')) - define('_CONNECT_RETRY_DELAY',30); + if (!defined('_CONNECT_RETRY_DELAY')) { + define('_CONNECT_RETRY_DELAY', 30); + } $f = ""; // un fichier de identifiant par combinaison (type,host,port,db) // pour ne pas declarer tout indisponible d'un coup // si en cours d'installation ou si db=@test@ on ne pose rien // car c'est un test de connexion - if (!defined('_ECRIRE_INSTALL') AND !$db=="@test@") - $f = _DIR_TMP . $type . '.' . substr(md5($host.$port.$db),0,8) . '.out'; - elseif ($db=='@test@') + if (!defined('_ECRIRE_INSTALL') AND !$db == "@test@") { + $f = _DIR_TMP . $type . '.' . substr(md5($host . $port . $db), 0, 8) . '.out'; + } elseif ($db == '@test@') { $db = ''; + } if ($f AND @file_exists($f) - AND (time() - @filemtime($f) < _CONNECT_RETRY_DELAY)) { - spip_log( "Echec : $f recent. Pas de tentative de connexion", _LOG_HS); + AND (time()-@filemtime($f) < _CONNECT_RETRY_DELAY) + ) { + spip_log("Echec : $f recent. Pas de tentative de connexion", _LOG_HS); + return; } - if (!$prefixe) + if (!$prefixe) { $prefixe = isset($GLOBALS['table_prefix']) - ? $GLOBALS['table_prefix'] : $db; + ? $GLOBALS['table_prefix'] : $db; + } $h = charger_fonction($type, 'req', true); if (!$h) { - spip_log( "les requetes $type ne sont pas fournies", _LOG_HS); + spip_log("les requetes $type ne sont pas fournies", _LOG_HS); + return; } if ($g = $h($host, $port, $login, $pass, $db, $prefixe)) { @@ -247,12 +283,13 @@ function spip_connect_db($host, $port, $login, $pass, $db = '', $type = 'mysql', $g['authentification'] = $auth; $g['type'] = $type; $g['charset'] = $charset; + return $GLOBALS['db_ok'] = $g; } // En cas d'indisponibilite du serveur, eviter de le bombarder if ($f) { @touch($f); - spip_log( "Echec connexion serveur $type : host[$host] port[$port] login[$login] base[$db]", $type.'.'._LOG_HS); + spip_log("Echec connexion serveur $type : host[$host] port[$port] login[$login] base[$db]", $type . '.' . _LOG_HS); } } @@ -276,49 +313,56 @@ function spip_connect_db($host, $port, $login, $pass, $db = '', $type = 'mysql', * * - la version 0.1 est moins performante que la 0.2 * - la 0.2 fait un include_ecrire('inc_db_mysql.php3'). - * + * * @param array $connexion Description de la connexion * @param string $charset_sql_connexion charset de connexion fourni dans l'appal a spip_connect_db * @return string|bool|int * - false si pas de charset connu pour la connexion * - -1 charset non renseigné * - nom du charset sinon -**/ -function spip_connect_main($connexion, $charset_sql_connexion = '') -{ - if ($GLOBALS['spip_connect_version']< 0.1 AND _DIR_RESTREINT){ + **/ +function spip_connect_main($connexion, $charset_sql_connexion = '') { + if ($GLOBALS['spip_connect_version'] < 0.1 AND _DIR_RESTREINT) { include_spip('inc/headers'); redirige_url_ecrire('upgrade', 'reinstall=oui'); } - if (!($f = $connexion['select'])) return false; + if (!($f = $connexion['select'])) { + return false; + } // si le charset est fourni, l'utiliser if ($charset_sql_connexion) { return $charset_sql_connexion; } // sinon on regarde la table spip_meta // en cas d'erreur select retourne la requette (is_string=true donc) - if (!$r = $f('valeur','spip_meta', "nom='charset_sql_connexion'") - OR is_string($r)) + if (!$r = $f('valeur', 'spip_meta', "nom='charset_sql_connexion'") + OR is_string($r) + ) { return false; - if (!($f = $connexion['fetch'])) return false; + } + if (!($f = $connexion['fetch'])) { + return false; + } $r = $f($r); + return ($r['valeur'] ? $r['valeur'] : -1); } /** * Connection à LDAP - * + * * Fonction présente pour compatibilité - * + * * @deprecated Utiliser l'authentification LDAP de auth/ldap * @uses auth_ldap_connect() - * + * * @param string $serveur Nom du connecteur * @return array */ function spip_connect_ldap($serveur = '') { include_spip('auth/ldap'); + return auth_ldap_connect($serveur); } @@ -330,14 +374,14 @@ function spip_connect_ldap($serveur = '') { * * @note * L'usage comme échappement SQL est déprécié, à remplacer par sql_quote(). - * + * * @param num|string|array $a Valeur à échapper * @return string Valeur échappée. -**/ -function _q ($a) { + **/ +function _q($a) { return (is_numeric($a)) ? strval($a) : (!is_array($a) ? ("'" . addslashes($a) . "'") - : join(",", array_map('_q', $a))); + : join(",", array_map('_q', $a))); } @@ -347,58 +391,75 @@ function _q ($a) { * @deprecated * Utiliser l'API editer_liens ou les tables de liaisons spip_xx_liens * ou spip_yy_liens selon. - * + * * @param string $x Table de destination * @param string $y Objet source * @return array|string * - array : Description de la table de jointure si connue * - chaîne vide si non trouvé. -**/ + **/ function table_jointure($x, $y) { $trouver_table = charger_fonction('trouver_table', 'base'); $xdesc = $trouver_table(table_objet($x)); $ydesc = $trouver_table(table_objet($y)); $ix = @$xdesc['key']["PRIMARY KEY"]; $iy = @$ydesc['key']["PRIMARY KEY"]; - if ($table = $ydesc['tables_jointures'][$ix]) return $table; - if ($table = $xdesc['tables_jointures'][$iy]) return $table; + if ($table = $ydesc['tables_jointures'][$ix]) { + return $table; + } + if ($table = $xdesc['tables_jointures'][$iy]) { + return $table; + } + return ''; } /** * Echapper les textes entre ' ' ou " " d'une requête SQL * avant son pre-traitement - * + * * On renvoi la query sans textes et les textes séparés, dans * leur ordre d'apparition dans la query * * @see query_reinjecte_textes() - * + * * @param string $query * @return array */ -function query_echappe_textes($query){ - static $codeEchappements = array("''"=>"\x1@##@\x1", "\'"=>"\x2@##@\x2", "\\\""=>"\x3@##@\x3"); +function query_echappe_textes($query) { + static $codeEchappements = array("''" => "\x1@##@\x1", "\'" => "\x2@##@\x2", "\\\"" => "\x3@##@\x3"); $query = str_replace(array_keys($codeEchappements), array_values($codeEchappements), $query); - if (preg_match_all("/((['])[^']*(\\2))|(([\"])[^\"]*(\\5))/S",$query,$textes)){ + if (preg_match_all("/((['])[^']*(\\2))|(([\"])[^\"]*(\\5))/S", $query, $textes)) { $textes = reset($textes); // indice 0 du match - switch(count($textes)){ - case 0:$replace=array();break; - case 1:$replace=array('%1$s');break; - case 2:$replace=array('%1$s','%2$s');break; - case 3:$replace=array('%1$s','%2$s','%3$s');break; - case 4:$replace=array('%1$s','%2$s','%3$s','%4$s');break; - case 5:$replace=array('%1$s','%2$s','%3$s','%4$s','%5$s');break; + switch (count($textes)) { + case 0: + $replace = array(); + break; + case 1: + $replace = array('%1$s'); + break; + case 2: + $replace = array('%1$s', '%2$s'); + break; + case 3: + $replace = array('%1$s', '%2$s', '%3$s'); + break; + case 4: + $replace = array('%1$s', '%2$s', '%3$s', '%4$s'); + break; + case 5: + $replace = array('%1$s', '%2$s', '%3$s', '%4$s', '%5$s'); + break; default: - $replace = range(1,count($textes)); - $replace = '%'.implode('$s,%',$replace).'$s'; - $replace = explode(',',$replace); + $replace = range(1, count($textes)); + $replace = '%' . implode('$s,%', $replace) . '$s'; + $replace = explode(',', $replace); break; } - $query = str_replace($textes,$replace,$query); - } - else + $query = str_replace($textes, $replace, $query); + } else { $textes = array(); + } return array($query, $textes); } @@ -408,29 +469,40 @@ function query_echappe_textes($query){ * après traitement de la requête * * @see query_echappe_textes() - * + * * @param string $query * @param array $textes * @return string */ -function query_reinjecte_textes($query, $textes){ - static $codeEchappements = array("''"=>"\x1@##@\x1", "\'"=>"\x2@##@\x2", "\\\""=>"\x3@##@\x3"); +function query_reinjecte_textes($query, $textes) { + static $codeEchappements = array("''" => "\x1@##@\x1", "\'" => "\x2@##@\x2", "\\\"" => "\x3@##@\x3"); # debug de la substitution #if (($c1=substr_count($query,"%"))!=($c2=count($textes))){ # spip_log("$c1 ::". $query,"tradquery"._LOG_ERREUR); # spip_log("$c2 ::". var_export($textes,1),"tradquery"._LOG_ERREUR); # spip_log("ini ::". $qi,"tradquery"._LOG_ERREUR); #} - switch (count($textes)){ - case 0:break; - case 1:$query=sprintf($query,$textes[0]);break; - case 2:$query=sprintf($query,$textes[0],$textes[1]);break; - case 3:$query=sprintf($query,$textes[0],$textes[1],$textes[2]);break; - case 4:$query=sprintf($query,$textes[0],$textes[1],$textes[2],$textes[3]);break; - case 5:$query=sprintf($query,$textes[0],$textes[1],$textes[2],$textes[3],$textes[4]);break; + switch (count($textes)) { + case 0: + break; + case 1: + $query = sprintf($query, $textes[0]); + break; + case 2: + $query = sprintf($query, $textes[0], $textes[1]); + break; + case 3: + $query = sprintf($query, $textes[0], $textes[1], $textes[2]); + break; + case 4: + $query = sprintf($query, $textes[0], $textes[1], $textes[2], $textes[3]); + break; + case 5: + $query = sprintf($query, $textes[0], $textes[1], $textes[2], $textes[3], $textes[4]); + break; default: - array_unshift($textes,$query); - $query = call_user_func_array('sprintf',$textes); + array_unshift($textes, $query); + $query = call_user_func_array('sprintf', $textes); break; } @@ -445,15 +517,16 @@ function query_reinjecte_textes($query, $textes){ * * @see sql_query() * @deprecated Pour compatibilité. Utiliser `sql_query()` ou l'API `sql_*`. - * + * * @param string $query Texte de la requête * @param string $serveur Nom du connecteur pour la base de données * @return bool|mixed * - false si on ne peut pas exécuter la requête * - indéfini sinon. -**/ + **/ function spip_query($query, $serveur = '') { $f = spip_connect_sql($GLOBALS['spip_sql_version'], 'query', $serveur, true); + return function_exists($f) ? $f($query, $serveur) : false; } diff --git a/ecrire/base/create.php b/ecrire/base/create.php index 165a327a31..39566fb68e 100644 --- a/ecrire/base/create.php +++ b/ecrire/base/create.php @@ -14,8 +14,10 @@ * Création ou mise à jour des tables * * @package SPIP\Core\Installation -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/acces'); include_spip('base/objets'); @@ -30,17 +32,18 @@ include_spip('base/abstract_sql'); * @param array $desc * @return bool */ -function base_determine_autoinc($table, $desc = array()){ - if ($t = lister_tables_principales() AND isset($t[$table])) +function base_determine_autoinc($table, $desc = array()) { + if ($t = lister_tables_principales() AND isset($t[$table])) { $autoinc = true; - elseif ($t = lister_tables_auxiliaires() AND isset($t[$table])) + } elseif ($t = lister_tables_auxiliaires() AND isset($t[$table])) { $autoinc = false; - else { + } else { // essayer de faire au mieux ! $autoinc = (isset($desc['key']['PRIMARY KEY']) - AND strpos($desc['key']['PRIMARY KEY'],',') === false - AND strpos($desc['field'][$desc['key']['PRIMARY KEY']],'default') === false); + AND strpos($desc['key']['PRIMARY KEY'], ',') === false + AND strpos($desc['field'][$desc['key']['PRIMARY KEY']], 'default') === false); } + return $autoinc; } @@ -63,42 +66,44 @@ function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $ser #if (!$sql_desc) $sql_desc = false; #spip_log("table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE); if (!$sql_desc) { - if ($autoinc === 'auto') + if ($autoinc === 'auto') { $autoinc = base_determine_autoinc($table, $desc); + } #spip_log("sql_create $table autoinc=$autoinc","dbinstall"._LOG_INFO_IMPORTANTE); sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur); // verifier la bonne installation de la table (php-fpm es-tu la ?) $sql_desc = sql_showtable($table, true, $serveur); #if (!$sql_desc) $sql_desc = false; #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE); - if (!$sql_desc){ + if (!$sql_desc) { // on retente avec un sleep ? sleep(1); sql_create($table, $desc['field'], $desc['key'], $autoinc, false, $serveur); - $sql_desc = sql_showtable($table,true,$serveur); + $sql_desc = sql_showtable($table, true, $serveur); #if (!$sql_desc) $sql_desc = false; #spip_log("Resultat table=$table sql_desc:$sql_desc","dbinstall"._LOG_INFO_IMPORTANTE); - if (!$sql_desc){ + if (!$sql_desc) { spip_log("Echec creation table $table", "maj" . _LOG_CRITIQUE); } } - } - else { + } else { #spip_log("sql_alter $table ... (on s'en fiche)","dbinstall"._LOG_INFO_IMPORTANTE); // ajouter les champs manquants // on ne supprime jamais les champs, car c'est dangereux // c'est toujours a faire manuellement $last = ''; - foreach($desc['field'] as $field => $type){ - if (!isset($sql_desc['field'][$field])) + foreach ($desc['field'] as $field => $type) { + if (!isset($sql_desc['field'][$field])) { sql_alter("TABLE $table ADD $field $type" . ($last ? " AFTER $last" : ""), $serveur); + } $last = $field; } - foreach($desc['key'] as $key => $type){ + foreach ($desc['key'] as $key => $type) { // Ne pas oublier les cas des cles non nommees dans la declaration et qui sont retournees // par le showtable sous la forme d'un index de tableau "KEY $type" et non "KEY" - if (!isset($sql_desc['key'][$key]) AND !isset($sql_desc['key']["$key $type"])) - sql_alter("TABLE $table ADD $key ($type)",$serveur); + if (!isset($sql_desc['key'][$key]) AND !isset($sql_desc['key']["$key $type"])) { + sql_alter("TABLE $table ADD $key ($type)", $serveur); + } $last = $field; } @@ -110,7 +115,7 @@ function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $ser * en fonction du flag `$up` * * @uses creer_ou_upgrader_table() - * + * * @param array $tables_inc * tables avec autoincrement sur la cle primaire * @param $tables_noinc @@ -123,22 +128,27 @@ function creer_ou_upgrader_table($table, $desc, $autoinc, $upgrade = false, $ser * serveur sql * @return void */ -function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') -{ +function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') { if ($up === false) { $old = false; $up = array(); } else { $old = true; - if (!is_array($up)) $up = array($up); + if (!is_array($up)) { + $up = array($up); + } + } + foreach ($tables_inc as $k => $v) { + if (!$old OR in_array($k, $up)) { + creer_ou_upgrader_table($k, $v, true, $old, $serveur); + } } - foreach($tables_inc as $k => $v) - if (!$old OR in_array($k, $up)) - creer_ou_upgrader_table($k,$v,true,$old,$serveur); - foreach($tables_noinc as $k => $v) - if (!$old OR in_array($k, $up)) - creer_ou_upgrader_table($k,$v,false,$old,$serveur); + foreach ($tables_noinc as $k => $v) { + if (!$old OR in_array($k, $up)) { + creer_ou_upgrader_table($k, $v, false, $old, $serveur); + } + } } /** @@ -148,11 +158,11 @@ function alterer_base($tables_inc, $tables_noinc, $up = false, $serveur = '') * Lorsque de nouvelles tables ont été déclarées, cette fonction crée les tables manquantes. * mais ne crée pas des champs manquant d'une table déjà présente. * Pour cela, c’est `maj_tables()` qu’il faut appeler. - * + * * @api - * @see maj_tables() + * @see maj_tables() * @uses alterer_base() - * + * * @param string $serveur * @return void */ @@ -172,21 +182,21 @@ function creer_base($serveur = '') { /** * Mettre à jour une liste de tables - * + * * Fonction facilitatrice utilisée pour les maj de base * dans les plugins. * * Elle permet de créer les champs manquants d'une table déjà présente. * * @api - * @see creer_base() + * @see creer_base() * @uses alterer_base() - * + * * @param array $upgrade_tables * @param string $serveur * @return void */ -function maj_tables($upgrade_tables = array(), $serveur = ''){ +function maj_tables($upgrade_tables = array(), $serveur = '') { alterer_base( lister_tables_principales(), lister_tables_auxiliaires(), diff --git a/ecrire/base/delete_all.php b/ecrire/base/delete_all.php index a0a71f080a..9f8ae1a70e 100644 --- a/ecrire/base/delete_all.php +++ b/ecrire/base/delete_all.php @@ -12,31 +12,35 @@ /** * Gestion d'affichage de la page de destruction des tables de SPIP + * * @package SPIP\Core\Base */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Destruction des tables SQL de SPIP - * + * * La liste des tables à supprimer est à poster sur le nom (tableau) `delete` * * @pipeline_appel delete_tables * @param string $titre Inutilisé -**/ -function base_delete_all_dist($titre) -{ + **/ +function base_delete_all_dist($titre) { $delete = _request('delete'); $res = array(); if (is_array($delete)) { foreach ($delete as $table) { - if (sql_drop_table($table)) + if (sql_drop_table($table)) { $res[] = $table; - else spip_log( "SPIP n'a pas pu detruire $table.", _LOG_ERREUR); + } else { + spip_log("SPIP n'a pas pu detruire $table.", _LOG_ERREUR); + } } - // un pipeline pour detruire les tables installees par les plugins + // un pipeline pour detruire les tables installees par les plugins pipeline('delete_tables', ''); spip_unlink(_FILE_CONNECT); @@ -47,6 +51,7 @@ function base_delete_all_dist($titre) } $d = count($delete); $r = count($res); - spip_log("Tables detruites: $r sur $d: " . join(', ',$res), _LOG_INFO_IMPORTANTE); + spip_log("Tables detruites: $r sur $d: " . join(', ', $res), _LOG_INFO_IMPORTANTE); } + ?> diff --git a/ecrire/base/dump.php b/ecrire/base/dump.php index c4ddb60fa4..e889e00bb3 100644 --- a/ecrire/base/dump.php +++ b/ecrire/base/dump.php @@ -12,11 +12,13 @@ /** * Fonctions de base pour la sauvegarde - * + * * Boîte à outil commune, sans préjuger de la méthode de sauvegarde */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} define('_VERSION_ARCHIVE', '1.3'); @@ -28,7 +30,7 @@ include_spip('public/interfaces'); // pour table_jointures // donc il faut l'inclure "en globals" if ($f = find_in_path('mes_fonctions.php')) { global $dossier_squelettes; - @include_once (_ROOT_CWD . $f); + @include_once(_ROOT_CWD . $f); } if (@is_readable(_CACHE_PLUGINS_FCT)) { @@ -43,10 +45,10 @@ if (@is_readable(_CACHE_PLUGINS_FCT)) { * sérialisées sur le statut de l'export. * * @param int $rub - * @return string -**/ + * @return string + **/ function base_dump_meta_name($rub) { - return $meta = "status_dump_{$rub}_" . abs($GLOBALS['visiteur_session']['id_auteur']); + return $meta = "status_dump_{$rub}_" . abs($GLOBALS['visiteur_session']['id_auteur']); } /** @@ -56,17 +58,19 @@ function base_dump_meta_name($rub) { * @note * Utilisé uniquement dans l'ancienne sauvegarde XML (plugin dump_xml) * À supprimer ? - * + * * @param string $meta - * @return string -**/ + * @return string + **/ function base_dump_dir($meta) { include_spip('inc/documents'); // determine upload va aussi initialiser l'index "restreint" $maindir = determine_upload(); - if (!$GLOBALS['visiteur_session']['restreint']) + if (!$GLOBALS['visiteur_session']['restreint']) { $maindir = _DIR_DUMP; + } $dir = sous_repertoire($maindir, $meta); + return $dir; } @@ -80,33 +84,42 @@ function base_dump_dir($meta) { * @param bool $affiche_vrai_prefixe * @return array */ -function base_lister_toutes_tables($serveur = '', $tables = array(), $exclude = array(), $affiche_vrai_prefixe = false) { +function base_lister_toutes_tables( + $serveur = '', + $tables = array(), + $exclude = array(), + $affiche_vrai_prefixe = false +) { spip_connect($serveur); $connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0]; $prefixe = $connexion['prefixe']; $p = '/^' . $prefixe . '/'; $res = $tables; - foreach(sql_alltable(null, $serveur) as $t) { + foreach (sql_alltable(null, $serveur) as $t) { if (preg_match($p, $t)) { $t1 = preg_replace($p, 'spip', $t); - if (!in_array($t1, $tables) AND !in_array($t1, $exclude)) - $res[]= ($affiche_vrai_prefixe ? $t : $t1); + if (!in_array($t1, $tables) AND !in_array($t1, $exclude)) { + $res[] = ($affiche_vrai_prefixe ? $t : $t1); + } } } sort($res); + return $res; } /** * Retrouver le prefixe des tables + * * @param string $serveur * @return string */ -function base_prefixe_tables($serveur = ''){ +function base_prefixe_tables($serveur = '') { spip_connect($serveur); $connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0]; $prefixe = $connexion['prefixe']; + return $prefixe; } @@ -126,11 +139,12 @@ function base_saisie_tables($name, $tables, $exclude = array(), $post = null, $s $res = array(); foreach ($tables as $k => $t) { // par defaut tout est coche sauf les tables dans $exclude - if (is_null($post)) + if (is_null($post)) { $check = (in_array($t, $exclude) ? false : true); - // mais si on a poste une selection, la reprendre - else + } // mais si on a poste une selection, la reprendre + else { $check = in_array($t, $post); + } $res[$k] = "<input type='checkbox' value='$t' name='$name" . "[]' id='$name$k'" @@ -138,9 +152,11 @@ function base_saisie_tables($name, $tables, $exclude = array(), $post = null, $s . "/>\n" . "<label for='$name$k'>$t</label>" . " (" - . sinon(singulier_ou_pluriel(sql_countsel($t, '', '', '', $serveur), 'dump:une_donnee', 'dump:nb_donnees'), _T('dump:aucune_donnee')) - . ")"; + . sinon(singulier_ou_pluriel(sql_countsel($t, '', '', '', $serveur), 'dump:une_donnee', 'dump:nb_donnees'), + _T('dump:aucune_donnee')) + . ")"; } + return $res; } @@ -152,13 +168,14 @@ function base_saisie_tables($name, $tables, $exclude = array(), $post = null, $s * @staticvar array $EXPORT_tables_noexport * @return array */ -function lister_tables_noexport(){ +function lister_tables_noexport() { // par defaut tout est exporte sauf les tables ci-dessous static $EXPORT_tables_noexport = null; - if (!is_null($EXPORT_tables_noexport)) + if (!is_null($EXPORT_tables_noexport)) { return $EXPORT_tables_noexport; + } - $EXPORT_tables_noexport= array( + $EXPORT_tables_noexport = array( 'spip_caches', // plugin invalideur 'spip_resultats', // resultats de recherche ... c'est un cache ! 'spip_test', // c'est un test ! @@ -168,9 +185,10 @@ function lister_tables_noexport(){ #'spip_visites_articles', #'spip_versions', #'spip_versions_fragments' - ); + ); + + $EXPORT_tables_noexport = pipeline('lister_tables_noexport', $EXPORT_tables_noexport); - $EXPORT_tables_noexport = pipeline('lister_tables_noexport',$EXPORT_tables_noexport); return $EXPORT_tables_noexport; } @@ -183,21 +201,23 @@ function lister_tables_noexport(){ */ function lister_tables_noimport() { static $IMPORT_tables_noimport = null; - if (!is_null($IMPORT_tables_noimport)) + if (!is_null($IMPORT_tables_noimport)) { return $IMPORT_tables_noimport; + } $IMPORT_tables_noimport = array(); // par defaut tout est importe sauf les tables ci-dessous // possibiliter de definir cela tables via la meta // compatibilite - if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])){ + if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])) { $IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']); - if (!is_array($IMPORT_tables_noimport)){ + if (!is_array($IMPORT_tables_noimport)) { include_spip('inc/meta'); effacer_meta('IMPORT_tables_noimport'); } } $IMPORT_tables_noimport = pipeline('lister_tables_noimport', $IMPORT_tables_noimport); + return $IMPORT_tables_noimport; } @@ -211,8 +231,9 @@ function lister_tables_noimport() { */ function lister_tables_noerase() { static $IMPORT_tables_noerase = null; - if (!is_null($IMPORT_tables_noerase)) + if (!is_null($IMPORT_tables_noerase)) { return $IMPORT_tables_noerase; + } $IMPORT_tables_noerase = array( 'spip_meta', @@ -224,6 +245,7 @@ function lister_tables_noerase() { 'spip_visites_articles' ); $IMPORT_tables_noerase = pipeline('lister_tables_noerase', $IMPORT_tables_noerase); + return $IMPORT_tables_noerase; } @@ -237,7 +259,7 @@ function lister_tables_noerase() { * @param array $exclude_tables * @return array */ -function base_liste_table_for_dump($exclude_tables = array()){ +function base_liste_table_for_dump($exclude_tables = array()) { $tables_for_dump = array(); $tables_pointees = array(); $tables = array(); @@ -246,61 +268,74 @@ function base_liste_table_for_dump($exclude_tables = array()){ $tables_jointures = $GLOBALS['tables_jointures']; if (include_spip('base/objets') - AND function_exists('lister_tables_objets_sql')){ + AND function_exists('lister_tables_objets_sql') + ) { $tables = lister_tables_objets_sql(); - foreach($tables as $t=>$infos){ - if ($infos['principale'] AND !isset($tables_principales[$t])) + foreach ($tables as $t => $infos) { + if ($infos['principale'] AND !isset($tables_principales[$t])) { $tables_principales[$t] = true; - if (!$infos['principale'] AND !isset($tables_auxiliaires[$t])) + } + if (!$infos['principale'] AND !isset($tables_auxiliaires[$t])) { $tables_auxiliaires[$t] = true; - if (count($infos['tables_jointures'])) - $tables_jointures[$t] = array_merge(isset($tables_jointures[$t])?$tables_jointures[$t]:array(),$infos['tables_jointures']); + } + if (count($infos['tables_jointures'])) { + $tables_jointures[$t] = array_merge(isset($tables_jointures[$t]) ? $tables_jointures[$t] : array(), + $infos['tables_jointures']); + } } } // on construit un index des tables de liens // pour les ajouter SI les deux tables qu'ils connectent sont sauvegardees $tables_for_link = array(); - foreach($tables_jointures as $table => $liste_relations) - if (is_array($liste_relations)) - { + foreach ($tables_jointures as $table => $liste_relations) { + if (is_array($liste_relations)) { $nom = $table; - if (!isset($tables_auxiliaires[$nom])&&!isset($tables_principales[$nom])) + if (!isset($tables_auxiliaires[$nom]) && !isset($tables_principales[$nom])) { $nom = "spip_$table"; - if (isset($tables_auxiliaires[$nom])||isset($tables_principales[$nom])){ - foreach($liste_relations as $link_table){ - if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/){ + } + if (isset($tables_auxiliaires[$nom]) || isset($tables_principales[$nom])) { + foreach ($liste_relations as $link_table) { + if (isset($tables_auxiliaires[$link_table])/*||isset($tables_principales[$link_table])*/) { $tables_for_link[$link_table][] = $nom; - } - else if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/){ - $tables_for_link["spip_$link_table"][] = $nom; + } else { + if (isset($tables_auxiliaires["spip_$link_table"])/*||isset($tables_principales["spip_$link_table"])*/) { + $tables_for_link["spip_$link_table"][] = $nom; + } } } } } + } - $liste_tables = array_merge(array_keys($tables_principales),array_keys($tables_auxiliaires),array_keys($tables)); - foreach($liste_tables as $table){ - // $name = preg_replace("{^spip_}","",$table); - if ( !isset($tables_pointees[$table]) - && !in_array($table,$exclude_tables) - && !isset($tables_for_link[$table])){ + $liste_tables = array_merge(array_keys($tables_principales), array_keys($tables_auxiliaires), array_keys($tables)); + foreach ($liste_tables as $table) { + // $name = preg_replace("{^spip_}","",$table); + if (!isset($tables_pointees[$table]) + && !in_array($table, $exclude_tables) + && !isset($tables_for_link[$table]) + ) { $tables_for_dump[] = $table; $tables_pointees[$table] = 1; } } - foreach ($tables_for_link as $link_table =>$liste){ + foreach ($tables_for_link as $link_table => $liste) { $connecte = true; - foreach($liste as $connect_table) - if (!in_array($connect_table,$tables_for_dump)) + foreach ($liste as $connect_table) { + if (!in_array($connect_table, $tables_for_dump)) { $connecte = false; + } + } if ($connecte) # on ajoute les liaisons en premier # si une restauration est interrompue, # cela se verra mieux si il manque des objets # que des liens - array_unshift($tables_for_dump,$link_table); + { + array_unshift($tables_for_dump, $link_table); + } } + return array($tables_for_dump, $tables_for_link); } @@ -315,20 +350,20 @@ function base_liste_table_for_dump($exclude_tables = array()){ * @param array $exclure_tables * @param string $serveur */ -function base_vider_tables_destination_copie($tables, $exclure_tables = array(), $serveur = ''){ +function base_vider_tables_destination_copie($tables, $exclure_tables = array(), $serveur = '') { $trouver_table = charger_fonction('trouver_table', 'base'); - spip_log('Vider '.count($tables) . " tables sur serveur '$serveur' : " . join(', ', $tables),'base.'._LOG_INFO_IMPORTANTE); - foreach($tables as $table){ - if (!in_array($table,$exclure_tables)){ + spip_log('Vider ' . count($tables) . " tables sur serveur '$serveur' : " . join(', ', $tables), + 'base.' . _LOG_INFO_IMPORTANTE); + foreach ($tables as $table) { + if (!in_array($table, $exclure_tables)) { // sur le serveur principal, il ne faut pas supprimer l'auteur loge ! - if (($table!='spip_auteurs') OR $serveur!=''){ + if (($table != 'spip_auteurs') OR $serveur != '') { // regarder si il y a au moins un champ impt='non' - $desc = $trouver_table($table,$serveur); - if (isset($desc['field']['impt'])){ + $desc = $trouver_table($table, $serveur); + if (isset($desc['field']['impt'])) { sql_delete($table, "impt='oui'", $serveur); - } - else{ + } else { sql_delete($table, "", $serveur); } } @@ -337,32 +372,36 @@ function base_vider_tables_destination_copie($tables, $exclure_tables = array(), // sur le serveur principal, il ne faut pas supprimer l'auteur loge ! // Bidouille pour garder l'acces admin actuel pendant toute la restauration - if ($serveur=='' - AND in_array('spip_auteurs',$tables) - AND !in_array('spip_auteurs',$exclure_tables)) { + if ($serveur == '' + AND in_array('spip_auteurs', $tables) + AND !in_array('spip_auteurs', $exclure_tables) + ) { base_conserver_copieur(true, $serveur); - sql_delete("spip_auteurs", "id_auteur>0",$serveur); + sql_delete("spip_auteurs", "id_auteur>0", $serveur); } } /** * Conserver le copieur si besoin + * * @param bool $move * @param string $serveur * @return void */ -function base_conserver_copieur($move = true, $serveur = ''){ +function base_conserver_copieur($move = true, $serveur = '') { // s'asurer qu'on a pas deja fait la manip ! - if ($GLOBALS['visiteur_session']['id_auteur']>0 AND sql_countsel("spip_auteurs", "id_auteur>0")) { - spip_log('Conserver copieur '.$GLOBALS['visiteur_statut']['id_auteur'] . " dans id_auteur=".$GLOBALS['visiteur_statut']['id_auteur']." pour le serveur '$serveur'",'dump.'._LOG_INFO_IMPORTANTE); - sql_delete("spip_auteurs", "id_auteur<0",$serveur); - if ($move){ - sql_updateq('spip_auteurs', array('id_auteur'=>-$GLOBALS['visiteur_session']['id_auteur']), "id_auteur=".intval($GLOBALS['visiteur_session']['id_auteur']),array(),$serveur); - } - else { - $row = sql_fetsel('*','spip_auteurs','id_auteur='.$GLOBALS['visiteur_session']['id_auteur'],'','','','',$serveur); + if ($GLOBALS['visiteur_session']['id_auteur'] > 0 AND sql_countsel("spip_auteurs", "id_auteur>0")) { + spip_log('Conserver copieur ' . $GLOBALS['visiteur_statut']['id_auteur'] . " dans id_auteur=" . $GLOBALS['visiteur_statut']['id_auteur'] . " pour le serveur '$serveur'", + 'dump.' . _LOG_INFO_IMPORTANTE); + sql_delete("spip_auteurs", "id_auteur<0", $serveur); + if ($move) { + sql_updateq('spip_auteurs', array('id_auteur' => -$GLOBALS['visiteur_session']['id_auteur']), + "id_auteur=" . intval($GLOBALS['visiteur_session']['id_auteur']), array(), $serveur); + } else { + $row = sql_fetsel('*', 'spip_auteurs', 'id_auteur=' . $GLOBALS['visiteur_session']['id_auteur'], '', '', '', '', + $serveur); $row['id_auteur'] = -$GLOBALS['visiteur_session']['id_auteur']; - sql_insertq('spip_auteurs',$row,array(),$serveur); + sql_insertq('spip_auteurs', $row, array(), $serveur); } } } @@ -378,21 +417,20 @@ function base_conserver_copieur($move = true, $serveur = ''){ * * @param string $serveur */ -function base_detruire_copieur_si_besoin($serveur = '') -{ +function base_detruire_copieur_si_besoin($serveur = '') { // rien a faire si ce n'est pas le serveur principal ! - if ($serveur=='') { + if ($serveur == '') { if (sql_countsel("spip_auteurs", "id_auteur>0")) { - spip_log("Detruire copieur id_auteur<0 pour le serveur '$serveur'",'dump.'._LOG_INFO_IMPORTANTE); + spip_log("Detruire copieur id_auteur<0 pour le serveur '$serveur'", 'dump.' . _LOG_INFO_IMPORTANTE); sql_delete("spip_auteurs", "id_auteur<0", $serveur); + } else { + spip_log("Restaurer copieur id_auteur<0 pour le serveur '$serveur' (aucun autre auteur en base)", + 'dump.' . _LOG_INFO_IMPORTANTE); + sql_update('spip_auteurs', array('id_auteur' => '-id_auteur'), "id_auteur<0"); } - else { - spip_log( "Restaurer copieur id_auteur<0 pour le serveur '$serveur' (aucun autre auteur en base)",'dump.'._LOG_INFO_IMPORTANTE); - sql_update('spip_auteurs', array('id_auteur'=>'-id_auteur'), "id_auteur<0"); - } + } else { + spip_log("Pas de destruction copieur sur serveur '$serveur'", 'dump.' . _LOG_INFO_IMPORTANTE); } - else - spip_log("Pas de destruction copieur sur serveur '$serveur'",'dump.'._LOG_INFO_IMPORTANTE); } /** @@ -409,36 +447,35 @@ function base_detruire_copieur_si_besoin($serveur = '') function base_preparer_table_dest($table, $desc, $serveur_dest, $init = false) { $upgrade = false; // si la table existe et qu'on est a l'init, la dropper - if ($desc_dest=sql_showtable($table,true,$serveur_dest) AND $init) { - if ($serveur_dest=='' AND in_array($table,array('spip_meta','spip_auteurs'))) { + if ($desc_dest = sql_showtable($table, true, $serveur_dest) AND $init) { + if ($serveur_dest == '' AND in_array($table, array('spip_meta', 'spip_auteurs'))) { // ne pas dropper auteurs et meta sur le serveur principal // faire un simple upgrade a la place // pour ajouter les champs manquants $upgrade = true; // coherence avec le drop sur les autres tables - base_vider_tables_destination_copie(array($table),array(),$serveur_dest); - if ($table=='spip_meta'){ + base_vider_tables_destination_copie(array($table), array(), $serveur_dest); + if ($table == 'spip_meta') { // virer les version base qui vont venir avec l'import - sql_delete($table, "nom like '%_base_version'",$serveur_dest); + sql_delete($table, "nom like '%_base_version'", $serveur_dest); // hum casse la base si pas version_installee a l'import ... - sql_delete($table, "nom='version_installee'",$serveur_dest); + sql_delete($table, "nom='version_installee'", $serveur_dest); } - } - else { + } else { sql_drop_table($table, '', $serveur_dest); - spip_log( "drop table '$table' sur serveur '$serveur_dest'",'dump.'._LOG_INFO_IMPORTANTE); + spip_log("drop table '$table' sur serveur '$serveur_dest'", 'dump.' . _LOG_INFO_IMPORTANTE); } $desc_dest = false; } // si la table n'existe pas dans la destination, la creer a l'identique ! if (!$desc_dest) { - spip_log( "creation '$table' sur serveur '$serveur_dest'",'dump.'._LOG_INFO_IMPORTANTE); + spip_log("creation '$table' sur serveur '$serveur_dest'", 'dump.' . _LOG_INFO_IMPORTANTE); include_spip('base/create'); - creer_ou_upgrader_table($table, $desc, 'auto', $upgrade,$serveur_dest); - $desc_dest = sql_showtable($table,true,$serveur_dest); + creer_ou_upgrader_table($table, $desc, 'auto', $upgrade, $serveur_dest); + $desc_dest = sql_showtable($table, true, $serveur_dest); } - if (!$desc_dest){ - spip_log( "Erreur creation '$table' sur serveur '$serveur_dest'".var_export($desc,1),'dump.'._LOG_ERREUR); + if (!$desc_dest) { + spip_log("Erreur creation '$table' sur serveur '$serveur_dest'" . var_export($desc, 1), 'dump.' . _LOG_ERREUR); } return $desc_dest; @@ -485,32 +522,37 @@ function base_preparer_table_dest($table, $desc, $serveur_dest, $init = false) { * * @return bool */ -function base_copier_tables($status_file, $tables, $serveur_source, $serveur_dest, $options = array()){ - - $callback_progression = isset($options['callback_progression'])?$options['callback_progression']:''; - $max_time = isset($options['max_time'])?$options['max_time']:0; - $drop_source = isset($options['drop_source'])?$options['drop_source']:false; - $no_erase_dest = isset($options['no_erase_dest'])?$options['no_erase_dest']:array(); - $where = isset($options['where'])?$options['where']:array(); - $fonction_base_inserer = isset($options['fonction_base_inserer'])?$options['fonction_base_inserer']:'inserer_copie'; - $desc_tables_dest = isset($options['desc_tables_dest'])?$options['desc_tables_dest']:array(); - $racine_fonctions = (isset($options['racine_fonctions_dest'])?$options['racine_fonctions_dest']:'base'); - $data_pool = (isset($options['data_pool'])?$options['data_pool']:50*1024); - - spip_log( "Copier ".count($tables)." tables de '$serveur_source' vers '$serveur_dest'",'dump.'._LOG_INFO_IMPORTANTE); - - if (!$inserer_copie = charger_fonction($fonction_base_inserer,$racine_fonctions, true)) { - spip_log( "Fonction '{$racine_fonctions}_$fonction_base_inserer' inconnue. Abandon",'dump.'._LOG_INFO_IMPORTANTE); +function base_copier_tables($status_file, $tables, $serveur_source, $serveur_dest, $options = array()) { + + $callback_progression = isset($options['callback_progression']) ? $options['callback_progression'] : ''; + $max_time = isset($options['max_time']) ? $options['max_time'] : 0; + $drop_source = isset($options['drop_source']) ? $options['drop_source'] : false; + $no_erase_dest = isset($options['no_erase_dest']) ? $options['no_erase_dest'] : array(); + $where = isset($options['where']) ? $options['where'] : array(); + $fonction_base_inserer = isset($options['fonction_base_inserer']) ? $options['fonction_base_inserer'] : 'inserer_copie'; + $desc_tables_dest = isset($options['desc_tables_dest']) ? $options['desc_tables_dest'] : array(); + $racine_fonctions = (isset($options['racine_fonctions_dest']) ? $options['racine_fonctions_dest'] : 'base'); + $data_pool = (isset($options['data_pool']) ? $options['data_pool'] : 50*1024); + + spip_log("Copier " . count($tables) . " tables de '$serveur_source' vers '$serveur_dest'", + 'dump.' . _LOG_INFO_IMPORTANTE); + + if (!$inserer_copie = charger_fonction($fonction_base_inserer, $racine_fonctions, true)) { + spip_log("Fonction '{$racine_fonctions}_$fonction_base_inserer' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE); + return true; // echec mais on a fini, donc true } - if (!$preparer_table_dest = charger_fonction('preparer_table_dest',$racine_fonctions, true)) { - spip_log( "Fonction '{$racine_fonctions}_$preparer_table_dest' inconnue. Abandon",'dump.'._LOG_INFO_IMPORTANTE); + if (!$preparer_table_dest = charger_fonction('preparer_table_dest', $racine_fonctions, true)) { + spip_log("Fonction '{$racine_fonctions}_$preparer_table_dest' inconnue. Abandon", 'dump.' . _LOG_INFO_IMPORTANTE); + return true; // echec mais on a fini, donc true } if (!lire_fichier($status_file, $status) - OR !$status = unserialize($status)) + OR !$status = unserialize($status) + ) { $status = array(); + } $status['etape'] = 'basecopie'; // puis relister les tables a importer @@ -519,129 +561,145 @@ function base_copier_tables($status_file, $tables, $serveur_source, $serveur_des // si init pas encore faite, vider les tables du serveur destination if (!$initialisation_copie) { - if (!$vider_tables_destination_copie = charger_fonction('vider_tables_destination_copie',$racine_fonctions, true)) { - spip_log( "Fonction '{$racine_fonctions}_vider_tables_destination_copie' inconnue. Abandon",'dump.'._LOG_INFO_IMPORTANTE); + if (!$vider_tables_destination_copie = charger_fonction('vider_tables_destination_copie', $racine_fonctions, + true) + ) { + spip_log("Fonction '{$racine_fonctions}_vider_tables_destination_copie' inconnue. Abandon", + 'dump.' . _LOG_INFO_IMPORTANTE); + return true; // echec mais on a fini, donc true } $vider_tables_destination_copie($tables, $no_erase_dest, $serveur_dest); - $status["dump_status_copie"]='ok'; - ecrire_fichier($status_file,serialize($status)); + $status["dump_status_copie"] = 'ok'; + ecrire_fichier($status_file, serialize($status)); } // les tables auteurs et meta doivent etre copiees en dernier ! - if (in_array('spip_auteurs',$tables)){ - $tables = array_diff($tables,array('spip_auteurs')); + if (in_array('spip_auteurs', $tables)) { + $tables = array_diff($tables, array('spip_auteurs')); $tables[] = 'spip_auteurs'; } - if (in_array('spip_meta',$tables)){ - $tables = array_diff($tables,array('spip_meta')); + if (in_array('spip_meta', $tables)) { + $tables = array_diff($tables, array('spip_meta')); $tables[] = 'spip_meta'; } - spip_log( "Tables a copier :".implode(", ",$tables),'dump.'._LOG_INFO); + spip_log("Tables a copier :" . implode(", ", $tables), 'dump.' . _LOG_INFO); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); - foreach ($tables as $table){ + foreach ($tables as $table) { // si table commence par spip_ c'est une table SPIP, renommer le prefixe si besoin // sinon chercher la vraie table $desc_source = false; - if (strncmp($table,"spip_",5)==0){ - $desc_source = $trouver_table(preg_replace(",^spip_,","",$table), $serveur_source, true); + if (strncmp($table, "spip_", 5) == 0) { + $desc_source = $trouver_table(preg_replace(",^spip_,", "", $table), $serveur_source, true); } - if (!$desc_source OR !isset($desc_source['exist']) OR !$desc_source['exist']) + if (!$desc_source OR !isset($desc_source['exist']) OR !$desc_source['exist']) { $desc_source = $trouver_table($table, $serveur_source, false); + } // verifier que la table est presente dans la base source - if ($desc_source){ + if ($desc_source) { // $status['tables_copiees'][$table] contient l'avancement // de la copie pour la $table : 0 a N et -N quand elle est finie (-1 si vide et finie...) - if (!isset($status['tables_copiees'][$table])) + if (!isset($status['tables_copiees'][$table])) { $status['tables_copiees'][$table] = 0; + } if (is_numeric($status['tables_copiees'][$table]) - AND $status['tables_copiees'][$table]>=0 + AND $status['tables_copiees'][$table] >= 0 AND $desc_dest = $preparer_table_dest( - $table, - isset($desc_tables_dest[$table])?$desc_tables_dest[$table]:$desc_source, - $serveur_dest, - $status['tables_copiees'][$table] == 0)){ - if ($callback_progression) - $callback_progression($status['tables_copiees'][$table],0,$table); + $table, + isset($desc_tables_dest[$table]) ? $desc_tables_dest[$table] : $desc_source, + $serveur_dest, + $status['tables_copiees'][$table] == 0) + ) { + if ($callback_progression) { + $callback_progression($status['tables_copiees'][$table], 0, $table); + } while (true) { $n = intval($status['tables_copiees'][$table]); // on copie par lot de 400 - $res = sql_select('*',$table,isset($where[$table])?$where[$table]:'','','',"$n,400",'',$serveur_source); - while ($row = sql_fetch($res,$serveur_source)){ + $res = sql_select('*', $table, isset($where[$table]) ? $where[$table] : '', '', '', "$n,400", '', + $serveur_source); + while ($row = sql_fetch($res, $serveur_source)) { $rows = array($row); // lire un groupe de donnees si demande en option // (permet un envoi par lot vers la destination) - if ($data_pool>0){ + if ($data_pool > 0) { $s = strlen(serialize($row)); - while ($s<$data_pool AND $row = sql_fetch($res,$serveur_source)){ + while ($s < $data_pool AND $row = sql_fetch($res, $serveur_source)) { $s += strlen(serialize($row)); - $rows[]= $row; + $rows[] = $row; } } // si l'enregistrement est deja en base, ca fera un echec ou un doublon // mais si ca renvoie false c'est une erreur fatale => abandon - if ($inserer_copie($table,$rows,$desc_dest,$serveur_dest)===false) { + if ($inserer_copie($table, $rows, $desc_dest, $serveur_dest) === false) { // forcer la sortie, charge a l'appelant de gerer l'echec - spip_log("Erreur fatale dans $inserer_copie table $table","dump"._LOG_ERREUR); + spip_log("Erreur fatale dans $inserer_copie table $table", "dump" . _LOG_ERREUR); $status['errors'][] = "Erreur fatale lors de la copie de la table $table"; - ecrire_fichier($status_file,serialize($status)); + ecrire_fichier($status_file, serialize($status)); + // copie finie return true; } - $status['tables_copiees'][$table]+=count($rows); - if ($max_time AND time()>$max_time) + $status['tables_copiees'][$table] += count($rows); + if ($max_time AND time() > $max_time) { break; + } } - if ($n == $status['tables_copiees'][$table]) + if ($n == $status['tables_copiees'][$table]) { break; - spip_log( "recopie $table ".$status['tables_copiees'][$table],'dump.'._LOG_INFO_IMPORTANTE); - if ($callback_progression) - $callback_progression($status['tables_copiees'][$table],0,$table); - ecrire_fichier($status_file,serialize($status)); - if ($max_time AND time()>$max_time) - return false; // on a pas fini, mais le temps imparti est ecoule + } + spip_log("recopie $table " . $status['tables_copiees'][$table], 'dump.' . _LOG_INFO_IMPORTANTE); + if ($callback_progression) { + $callback_progression($status['tables_copiees'][$table], 0, $table); + } + ecrire_fichier($status_file, serialize($status)); + if ($max_time AND time() > $max_time) { + return false; + } // on a pas fini, mais le temps imparti est ecoule } if ($drop_source) { - sql_drop_table($table,'',$serveur_source); - spip_log( "drop $table sur serveur source '$serveur_source'",'dump.'._LOG_INFO_IMPORTANTE); + sql_drop_table($table, '', $serveur_source); + spip_log("drop $table sur serveur source '$serveur_source'", 'dump.' . _LOG_INFO_IMPORTANTE); + } + $status['tables_copiees'][$table] = ($status['tables_copiees'][$table] ? -$status['tables_copiees'][$table] : "zero"); + ecrire_fichier($status_file, serialize($status)); + spip_log("tables_recopiees " . implode(',', $status['tables_copiees']), 'dump.' . _LOG_INFO); + if ($callback_progression) { + $callback_progression($status['tables_copiees'][$table], $status['tables_copiees'][$table], $table); + } + } else { + if ($status['tables_copiees'][$table] < 0) { + spip_log("Table $table deja copiee : " . $status['tables_copiees'][$table], "dump." . _LOG_INFO); + } + if ($callback_progression) { + $callback_progression(0, $status['tables_copiees'][$table], + "$table" . ((is_numeric($status['tables_copiees'][$table]) AND $status['tables_copiees'][$table] >= 0) ? "[Echec]" : "")); } - $status['tables_copiees'][$table]=($status['tables_copiees'][$table]?-$status['tables_copiees'][$table]:"zero"); - ecrire_fichier($status_file,serialize($status)); - spip_log( "tables_recopiees ".implode(',',$status['tables_copiees']),'dump.'._LOG_INFO); - if ($callback_progression) - $callback_progression($status['tables_copiees'][$table],$status['tables_copiees'][$table],$table); - } - else { - if ($status['tables_copiees'][$table]<0) - spip_log("Table $table deja copiee : ".$status['tables_copiees'][$table],"dump."._LOG_INFO); - if ($callback_progression) - $callback_progression(0,$status['tables_copiees'][$table],"$table".((is_numeric($status['tables_copiees'][$table]) AND $status['tables_copiees'][$table]>=0)?"[Echec]":"")); } - } - else { + } else { $status['errors'][] = "Impossible de lire la description de la table $table"; - ecrire_fichier($status_file,serialize($status)); - spip_log("Impossible de lire la description de la table $table","dump."._LOG_ERREUR); + ecrire_fichier($status_file, serialize($status)); + spip_log("Impossible de lire la description de la table $table", "dump." . _LOG_ERREUR); } } // si le nombre de tables envoyees n'est pas egal au nombre de tables demandees // abandonner - if (count($status['tables_copiees'])<count($tables)){ - spip_log("Nombre de tables copiees incorrect : ".count($status['tables_copiees'])."/".count($tables),"dump."._LOG_ERREUR); - $status['errors'][] = "Nombre de tables copiees incorrect : ".count($status['tables_copiees'])."/".count($tables); + if (count($status['tables_copiees']) < count($tables)) { + spip_log("Nombre de tables copiees incorrect : " . count($status['tables_copiees']) . "/" . count($tables), + "dump." . _LOG_ERREUR); + $status['errors'][] = "Nombre de tables copiees incorrect : " . count($status['tables_copiees']) . "/" . count($tables); ecrire_fichier($status_file, serialize($status)); } if ($detruire_copieur_si_besoin = charger_fonction('detruire_copieur_si_besoin', $racine_fonctions, true)) { $detruire_copieur_si_besoin($serveur_dest); - } - else { - spip_log( "Fonction '{$racine_fonctions}_detruire_copieur_si_besoin' inconnue.", 'dump.' . _LOG_INFO_IMPORTANTE); + } else { + spip_log("Fonction '{$racine_fonctions}_detruire_copieur_si_besoin' inconnue.", 'dump.' . _LOG_INFO_IMPORTANTE); } // OK, copie complete @@ -664,8 +722,9 @@ function base_inserer_copie($table, $rows, $desc_dest, $serveur_dest) { // si l'enregistrement est deja en base, ca fera un echec ou un doublon $r = sql_insertq_multi($table, $rows, $desc_dest, $serveur_dest); $nb = sql_countsel($table, '', '', '', $serveur_dest); - if ($nb - $nb1 < count($rows)) { - spip_log("base_inserer_copie : " . ($nb-$nb1) . " insertions au lieu de " . count($rows) . ". On retente 1 par 1", "dump" . _LOG_INFO_IMPORTANTE); + if ($nb-$nb1 < count($rows)) { + spip_log("base_inserer_copie : " . ($nb-$nb1) . " insertions au lieu de " . count($rows) . ". On retente 1 par 1", + "dump" . _LOG_INFO_IMPORTANTE); foreach ($rows as $row) { // si l'enregistrement est deja en base, ca fera un echec ou un doublon $r = sql_insertq($table, $row, $desc_dest, $serveur_dest); @@ -673,11 +732,14 @@ function base_inserer_copie($table, $rows, $desc_dest, $serveur_dest) { // on reverifie le total $r = 0; $nb = sql_countsel($table, '', '', '', $serveur_dest); - if ($nb - $nb1 < count($rows)) { - spip_log("base_inserer_copie : " . ($nb-$nb1) . " insertions au lieu de " . count($rows) . " apres insertion 1 par 1", "dump" . _LOG_ERREUR); + if ($nb-$nb1 < count($rows)) { + spip_log("base_inserer_copie : " . ($nb-$nb1) . " insertions au lieu de " . count($rows) . " apres insertion 1 par 1", + "dump" . _LOG_ERREUR); $r = false; } } + return $r; } + ?> diff --git a/ecrire/base/objets.php b/ecrire/base/objets.php index deb8a7ab7f..9517fa03a7 100644 --- a/ecrire/base/objets.php +++ b/ecrire/base/objets.php @@ -14,9 +14,11 @@ * Fonctions relatives aux objets éditoriaux et SQL * * @package SPIP\Core\SQL\Tables -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Merge dans un tableau une de ses clés avec une valeur @@ -28,17 +30,18 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param array $valeur * Sous tableau à merger dans la clé. * @return void -**/ + **/ function array_set_merge(&$table, $index, $valeur) { - if (!isset($table[$index])) + if (!isset($table[$index])) { $table[$index] = $valeur; - else + } else { $table[$index] = array_merge($table[$index], $valeur); + } } /** * Lister les infos de toutes les tables sql declarées - * + * * Si un argument est fourni, on ne renvoie que les infos de cette table. * Elle est auto-declarée si inconnue jusqu'alors. * @@ -49,7 +52,7 @@ function array_set_merge(&$table, $index, $valeur) { * description connue de la table sql demandee * @return array|bool */ -function lister_tables_objets_sql($table_sql = null, $desc = array()){ +function lister_tables_objets_sql($table_sql = null, $desc = array()) { static $deja_la = false; static $infos_tables = null; static $md5 = null; @@ -59,11 +62,12 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ $_PLUGINS_HASH = defined('_PLUGINS_HASH') ? _PLUGINS_HASH : '!_CACHE_PLUGINS_OPT'; // prealablement recuperer les tables_principales - if (is_null($infos_tables) OR $plugin_hash !== $_PLUGINS_HASH){ + if (is_null($infos_tables) OR $plugin_hash !== $_PLUGINS_HASH) { // pas de reentrance (cas base/serial) if ($deja_la) { - spip_log ("Re-entrance anormale sur lister_tables_objets_sql :" + spip_log("Re-entrance anormale sur lister_tables_objets_sql :" . var_export(debug_backtrace(), true), _LOG_CRITIQUE); + return ($table_sql === "::md5" ? $md5 : array()); } $deja_la = true; @@ -74,15 +78,15 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ base_serial($GLOBALS['tables_principales']); base_auxiliaires($GLOBALS['tables_auxiliaires']); $infos_tables = array( - 'spip_articles'=> array( - 'page'=>'article', + 'spip_articles' => array( + 'page' => 'article', 'texte_retour' => 'icone_retour_article', 'texte_modifier' => 'icone_modifier_article', 'texte_creer' => 'icone_ecrire_article', 'texte_objets' => 'public:articles', 'texte_objet' => 'public:article', 'texte_signale_edition' => 'texte_travail_article', - 'info_aucun_objet'=> 'info_aucun_article', + 'info_aucun_objet' => 'info_aucun_article', 'info_1_objet' => 'info_1_article', 'info_nb_objets' => 'info_nb_articles', 'texte_logo_objet' => 'logo_article', @@ -92,73 +96,102 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ 'date' => 'date', 'principale' => 'oui', 'introduction_longueur' => '500', - 'champs_editables' => array('surtitre', 'titre', 'soustitre', 'descriptif','nom_site', 'url_site', 'chapo', 'texte', 'ps','virtuel'), - 'champs_versionnes' => array('id_rubrique', 'surtitre', 'titre', 'soustitre', 'jointure_auteurs', 'descriptif', 'nom_site', 'url_site', 'chapo', 'texte', 'ps'), + 'champs_editables' => array( + 'surtitre', + 'titre', + 'soustitre', + 'descriptif', + 'nom_site', + 'url_site', + 'chapo', + 'texte', + 'ps', + 'virtuel' + ), + 'champs_versionnes' => array( + 'id_rubrique', + 'surtitre', + 'titre', + 'soustitre', + 'jointure_auteurs', + 'descriptif', + 'nom_site', + 'url_site', + 'chapo', + 'texte', + 'ps' + ), 'field' => array( - "id_article" => "bigint(21) NOT NULL", - "surtitre" => "text DEFAULT '' NOT NULL", - "titre" => "text DEFAULT '' NOT NULL", - "soustitre" => "text DEFAULT '' NOT NULL", - "id_rubrique" => "bigint(21) DEFAULT '0' NOT NULL", - "descriptif" => "text DEFAULT '' NOT NULL", - "chapo" => "mediumtext DEFAULT '' NOT NULL", - "texte" => "longtext DEFAULT '' NOT NULL", - "ps" => "mediumtext DEFAULT '' NOT NULL", - "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - "statut" => "varchar(10) DEFAULT '0' NOT NULL", - "id_secteur" => "bigint(21) DEFAULT '0' NOT NULL", - "maj" => "TIMESTAMP", - "export" => "VARCHAR(10) DEFAULT 'oui'", - "date_redac" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - "visites" => "integer DEFAULT '0' NOT NULL", - "referers" => "integer DEFAULT '0' NOT NULL", - "popularite" => "DOUBLE DEFAULT '0' NOT NULL", - "accepter_forum" => "CHAR(3) DEFAULT '' NOT NULL", - "date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - "lang" => "VARCHAR(10) DEFAULT '' NOT NULL", - "langue_choisie" => "VARCHAR(3) DEFAULT 'non'", - "id_trad" => "bigint(21) DEFAULT '0' NOT NULL", - "nom_site" => "tinytext DEFAULT '' NOT NULL", - "url_site" => "text DEFAULT '' NOT NULL", - "virtuel" => "text DEFAULT '' NOT NULL", + "id_article" => "bigint(21) NOT NULL", + "surtitre" => "text DEFAULT '' NOT NULL", + "titre" => "text DEFAULT '' NOT NULL", + "soustitre" => "text DEFAULT '' NOT NULL", + "id_rubrique" => "bigint(21) DEFAULT '0' NOT NULL", + "descriptif" => "text DEFAULT '' NOT NULL", + "chapo" => "mediumtext DEFAULT '' NOT NULL", + "texte" => "longtext DEFAULT '' NOT NULL", + "ps" => "mediumtext DEFAULT '' NOT NULL", + "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "statut" => "varchar(10) DEFAULT '0' NOT NULL", + "id_secteur" => "bigint(21) DEFAULT '0' NOT NULL", + "maj" => "TIMESTAMP", + "export" => "VARCHAR(10) DEFAULT 'oui'", + "date_redac" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "visites" => "integer DEFAULT '0' NOT NULL", + "referers" => "integer DEFAULT '0' NOT NULL", + "popularite" => "DOUBLE DEFAULT '0' NOT NULL", + "accepter_forum" => "CHAR(3) DEFAULT '' NOT NULL", + "date_modif" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "lang" => "VARCHAR(10) DEFAULT '' NOT NULL", + "langue_choisie" => "VARCHAR(3) DEFAULT 'non'", + "id_trad" => "bigint(21) DEFAULT '0' NOT NULL", + "nom_site" => "tinytext DEFAULT '' NOT NULL", + "url_site" => "text DEFAULT '' NOT NULL", + "virtuel" => "text DEFAULT '' NOT NULL", ), 'key' => array( - "PRIMARY KEY" => "id_article", - "KEY id_rubrique" => "id_rubrique", - "KEY id_secteur" => "id_secteur", - "KEY id_trad" => "id_trad", - "KEY lang" => "lang", - "KEY statut" => "statut, date", + "PRIMARY KEY" => "id_article", + "KEY id_rubrique" => "id_rubrique", + "KEY id_secteur" => "id_secteur", + "KEY id_trad" => "id_trad", + "KEY lang" => "lang", + "KEY statut" => "statut, date", ), 'join' => array( - "id_article"=>"id_article", - "id_rubrique"=>"id_rubrique" + "id_article" => "id_article", + "id_rubrique" => "id_rubrique" ), 'rechercher_champs' => array( - 'surtitre' => 5, 'titre' => 8, 'soustitre' => 5, 'chapo' => 3, - 'texte' => 1, 'ps' => 1, 'nom_site' => 1, 'url_site' => 1, + 'surtitre' => 5, + 'titre' => 8, + 'soustitre' => 5, + 'chapo' => 3, + 'texte' => 1, + 'ps' => 1, + 'nom_site' => 1, + 'url_site' => 1, 'descriptif' => 4 ), 'rechercher_jointures' => array( 'auteur' => array('nom' => 10), ), - 'statut'=> array( + 'statut' => array( array( 'champ' => 'statut', 'publie' => 'publie', 'previsu' => 'publie,prop,prepa/auteur', 'post_date' => 'date', - 'exception' => array('statut','tout') + 'exception' => array('statut', 'tout') ) ), 'statut_titres' => array( - 'prepa'=>'info_article_redaction', - 'prop'=>'info_article_propose', - 'publie'=>'info_article_publie', - 'refuse'=>'info_article_refuse', - 'poubelle'=>'info_article_supprime' + 'prepa' => 'info_article_redaction', + 'prop' => 'info_article_propose', + 'publie' => 'info_article_publie', + 'refuse' => 'info_article_refuse', + 'poubelle' => 'info_article_supprime' ), - 'statut_textes_instituer' => array( + 'statut_textes_instituer' => array( 'prepa' => 'texte_statut_en_cours_redaction', 'prop' => 'texte_statut_propose_evaluation', 'publie' => 'texte_statut_publie', @@ -173,13 +206,13 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ ), ), 'spip_auteurs' => array( - 'page'=>'auteur', + 'page' => 'auteur', 'texte_retour' => 'icone_retour', 'texte_ajouter' => 'titre_ajouter_un_auteur', 'texte_modifier' => 'admin_modifier_auteur', 'texte_objets' => 'icone_auteurs', 'texte_objet' => 'public:auteur', - 'info_aucun_objet'=> 'info_aucun_auteur', + 'info_aucun_objet' => 'info_aucun_auteur', 'info_1_objet' => 'info_1_auteur', 'info_nb_objets' => 'info_nb_auteurs', 'texte_logo_objet' => 'logo_auteur', @@ -187,47 +220,52 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ 'titre' => "nom AS titre, '' AS lang", 'date' => 'date', 'principale' => 'oui', - 'champs_editables' => array('nom','email','bio','nom_site','url_site','imessage','pgp'), + 'champs_editables' => array('nom', 'email', 'bio', 'nom_site', 'url_site', 'imessage', 'pgp'), 'champs_versionnes' => array('nom', 'bio', 'email', 'nom_site', 'url_site', 'login'), 'field' => array( - "id_auteur" => "bigint(21) NOT NULL", - "nom" => "text DEFAULT '' NOT NULL", - "bio" => "text DEFAULT '' NOT NULL", - "email" => "tinytext DEFAULT '' NOT NULL", - "nom_site" => "tinytext DEFAULT '' NOT NULL", - "url_site" => "text DEFAULT '' NOT NULL", - "login" => "VARCHAR(255) BINARY", - "pass" => "tinytext DEFAULT '' NOT NULL", - "low_sec" => "tinytext DEFAULT '' NOT NULL", - "statut" => "varchar(255) DEFAULT '0' NOT NULL", - "webmestre" => "varchar(3) DEFAULT 'non' NOT NULL", - "maj" => "TIMESTAMP", - "pgp" => "TEXT DEFAULT '' NOT NULL", - "htpass" => "tinytext DEFAULT '' NOT NULL", - "en_ligne" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - "alea_actuel" => "tinytext", - "alea_futur" => "tinytext", - "prefs" => "tinytext", - "cookie_oubli" => "tinytext", - "source" => "VARCHAR(10) DEFAULT 'spip' NOT NULL", - "lang" => "VARCHAR(10) DEFAULT '' NOT NULL" + "id_auteur" => "bigint(21) NOT NULL", + "nom" => "text DEFAULT '' NOT NULL", + "bio" => "text DEFAULT '' NOT NULL", + "email" => "tinytext DEFAULT '' NOT NULL", + "nom_site" => "tinytext DEFAULT '' NOT NULL", + "url_site" => "text DEFAULT '' NOT NULL", + "login" => "VARCHAR(255) BINARY", + "pass" => "tinytext DEFAULT '' NOT NULL", + "low_sec" => "tinytext DEFAULT '' NOT NULL", + "statut" => "varchar(255) DEFAULT '0' NOT NULL", + "webmestre" => "varchar(3) DEFAULT 'non' NOT NULL", + "maj" => "TIMESTAMP", + "pgp" => "TEXT DEFAULT '' NOT NULL", + "htpass" => "tinytext DEFAULT '' NOT NULL", + "en_ligne" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "alea_actuel" => "tinytext", + "alea_futur" => "tinytext", + "prefs" => "tinytext", + "cookie_oubli" => "tinytext", + "source" => "VARCHAR(10) DEFAULT 'spip' NOT NULL", + "lang" => "VARCHAR(10) DEFAULT '' NOT NULL" ), 'key' => array( - "PRIMARY KEY" => "id_auteur", - "KEY login" => "login", - "KEY statut" => "statut", - "KEY en_ligne" => "en_ligne", + "PRIMARY KEY" => "id_auteur", + "KEY login" => "login", + "KEY statut" => "statut", + "KEY en_ligne" => "en_ligne", ), 'join' => array( - "id_auteur"=>"id_auteur", - "login"=>"login" + "id_auteur" => "id_auteur", + "login" => "login" ), 'rechercher_champs' => array( - 'nom' => 5, 'bio' => 1, 'email' => 1, 'nom_site' => 1, 'url_site' => 1, 'login' => 1 + 'nom' => 5, + 'bio' => 1, + 'email' => 1, + 'nom_site' => 1, + 'url_site' => 1, + 'login' => 1 ), // 2 conditions pour les auteurs : statut!=poubelle, // et avoir des articles publies - 'statut'=> array( + 'statut' => array( array( 'champ' => 'statut', 'publie' => '!5poubelle', @@ -239,37 +277,36 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ array('spip_auteurs_liens', 'id_auteur'), array( 'spip_articles', - array('id_objet','id_article','objet','article') + array('id_objet', 'id_article', 'objet', 'article') ), 'statut' ), 'publie' => 'publie', 'previsu' => '!', 'post_date' => 'date', - 'exception' => array('statut','lien','tout') + 'exception' => array('statut', 'lien', 'tout') ), ), 'statut_images' => array( 'auteur-6forum-16.png', - '0minirezo'=>'auteur-0minirezo-16.png', - '1comite'=>'auteur-1comite-16.png', - '6forum'=>'auteur-6forum-16.png', - '5poubelle'=>'auteur-5poubelle-16.png', - 'nouveau'=>'' + '0minirezo' => 'auteur-0minirezo-16.png', + '1comite' => 'auteur-1comite-16.png', + '6forum' => 'auteur-6forum-16.png', + '5poubelle' => 'auteur-5poubelle-16.png', + 'nouveau' => '' ), 'statut_titres' => array( 'titre_image_visiteur', - '0minirezo'=>'titre_image_administrateur', - '1comite'=>'titre_image_redacteur_02', - '6forum'=>'titre_image_visiteur', - '5poubelle'=>'titre_image_auteur_supprime', + '0minirezo' => 'titre_image_administrateur', + '1comite' => 'titre_image_redacteur_02', + '6forum' => 'titre_image_visiteur', + '5poubelle' => 'titre_image_auteur_supprime', ), - 'tables_jointures' => array( - #'auteurs_liens' // declaration generique plus bas + 'tables_jointures' => array(#'auteurs_liens' // declaration generique plus bas ), ), 'spip_rubriques' => array( - 'page'=>'rubrique', + 'page' => 'rubrique', 'url_voir' => 'rubrique', 'url_edit' => 'rubrique_edit', 'texte_retour' => 'icone_retour', @@ -279,127 +316,136 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ 'texte_creer' => 'icone_creer_rubrique', 'texte_ajouter' => 'titre_ajouter_une_rubrique', 'texte_creer_associer' => 'creer_et_associer_une_rubrique', - 'info_aucun_objet'=> 'info_aucun_rubrique', + 'info_aucun_objet' => 'info_aucun_rubrique', 'info_1_objet' => 'info_1_rubrique', 'info_nb_objets' => 'info_nb_rubriques', 'texte_logo_objet' => 'logo_rubrique', 'texte_langue_objet' => 'titre_langue_rubrique', 'texte_definir_comme_traduction_objet' => 'texte_definir_comme_traduction_rubrique', - 'titre'=>'titre, lang', + 'titre' => 'titre, lang', 'date' => 'date', 'principale' => 'oui', 'introduction_longueur' => '600', 'champs_editables' => array('titre', 'texte', 'descriptif', 'extra'), 'champs_versionnes' => array('titre', 'descriptif', 'texte'), 'field' => array( - "id_rubrique" => "bigint(21) NOT NULL", - "id_parent" => "bigint(21) DEFAULT '0' NOT NULL", - "titre" => "text DEFAULT '' NOT NULL", - "descriptif" => "text DEFAULT '' NOT NULL", - "texte" => "longtext DEFAULT '' NOT NULL", - "id_secteur" => "bigint(21) DEFAULT '0' NOT NULL", - "maj" => "TIMESTAMP", - "statut" => "varchar(10) DEFAULT '0' NOT NULL", - "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", - "lang" => "VARCHAR(10) DEFAULT '' NOT NULL", - "langue_choisie" => "VARCHAR(3) DEFAULT 'non'", - "statut_tmp" => "varchar(10) DEFAULT '0' NOT NULL", - "date_tmp" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "id_rubrique" => "bigint(21) NOT NULL", + "id_parent" => "bigint(21) DEFAULT '0' NOT NULL", + "titre" => "text DEFAULT '' NOT NULL", + "descriptif" => "text DEFAULT '' NOT NULL", + "texte" => "longtext DEFAULT '' NOT NULL", + "id_secteur" => "bigint(21) DEFAULT '0' NOT NULL", + "maj" => "TIMESTAMP", + "statut" => "varchar(10) DEFAULT '0' NOT NULL", + "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", + "lang" => "VARCHAR(10) DEFAULT '' NOT NULL", + "langue_choisie" => "VARCHAR(3) DEFAULT 'non'", + "statut_tmp" => "varchar(10) DEFAULT '0' NOT NULL", + "date_tmp" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", "profondeur" => "smallint(5) DEFAULT '0' NOT NULL" ), 'key' => array( - "PRIMARY KEY" => "id_rubrique", - "KEY lang" => "lang", - "KEY id_parent" => "id_parent", + "PRIMARY KEY" => "id_rubrique", + "KEY lang" => "lang", + "KEY id_parent" => "id_parent", ), 'rechercher_champs' => array( - 'titre' => 8, 'descriptif' => 5, 'texte' => 1 + 'titre' => 8, + 'descriptif' => 5, + 'texte' => 1 ), 'statut' => array( array( 'champ' => 'statut', 'publie' => 'publie', 'previsu' => '!', - 'exception' => array('statut','tout') + 'exception' => array('statut', 'tout') ), ), - 'tables_jointures' => array( - #'id_auteur' => 'auteurs_liens' // declaration generique plus bas + 'tables_jointures' => array(#'id_auteur' => 'auteurs_liens' // declaration generique plus bas ), ), // toutes les tables ont le droit a une jointure sur les auteurs - array('tables_jointures'=>array('id_auteur'=>'auteurs_liens')) + array('tables_jointures' => array('id_auteur' => 'auteurs_liens')) ); // avant d'appeller les pipeline qui peuvent generer une reentrance a l'install // initialiser la signature $md5 = md5(serialize($infos_tables)); - $GLOBALS['tables_principales'] = pipeline('declarer_tables_principales',$GLOBALS['tables_principales']); - $GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires',$GLOBALS['tables_auxiliaires']); - $infos_tables = pipeline('declarer_tables_objets_sql',$infos_tables); + $GLOBALS['tables_principales'] = pipeline('declarer_tables_principales', $GLOBALS['tables_principales']); + $GLOBALS['tables_auxiliaires'] = pipeline('declarer_tables_auxiliaires', $GLOBALS['tables_auxiliaires']); + $infos_tables = pipeline('declarer_tables_objets_sql', $infos_tables); // completer les informations manquantes ou implicites $all = array(); - foreach(array_keys($infos_tables) as $t) { + foreach (array_keys($infos_tables) as $t) { // les cles numeriques servent a declarer // les proprietes applicables a tous les objets // on les mets de cote if (is_numeric($t)) { - $all = array_merge_recursive($all,$infos_tables[$t]); + $all = array_merge_recursive($all, $infos_tables[$t]); unset($infos_tables[$t]); + } else { + $infos_tables[$t] = renseigner_table_objet_sql($t, $infos_tables[$t]); } - else - $infos_tables[$t] = renseigner_table_objet_sql($t,$infos_tables[$t]); } // repercuter les proprietes generales communes a tous les objets - foreach(array_keys($infos_tables) as $t) { - foreach($all as $i=>$v) - if (in_array($i,array('tables_jointures','champs_versionnes'))){ + foreach (array_keys($infos_tables) as $t) { + foreach ($all as $i => $v) { + if (in_array($i, array('tables_jointures', 'champs_versionnes'))) { $add = $all[$i]; // eviter les doublons de declaration de table jointure (ex des mots sur auteurs) // pour les declarations generiques avec cles numeriques - if ($i=='tables_jointures' AND isset($infos_tables[$t][$i]) AND count($infos_tables[$t][$i])) { - $doublons = array_intersect($infos_tables[$t][$i],$add); - foreach($doublons as $d){ - if (is_numeric(array_search($d,$infos_tables[$t][$i])) - AND is_numeric($k=array_search($d,$add))) + if ($i == 'tables_jointures' AND isset($infos_tables[$t][$i]) AND count($infos_tables[$t][$i])) { + $doublons = array_intersect($infos_tables[$t][$i], $add); + foreach ($doublons as $d) { + if (is_numeric(array_search($d, $infos_tables[$t][$i])) + AND is_numeric($k = array_search($d, $add)) + ) { unset($add[$k]); + } } } - $infos_tables[$t][$i] = array_merge(isset($infos_tables[$t][$i])?$infos_tables[$t][$i]:array(),$add); + $infos_tables[$t][$i] = array_merge(isset($infos_tables[$t][$i]) ? $infos_tables[$t][$i] : array(), $add); + } else { + $infos_tables[$t][$i] = array_merge_recursive(isset($infos_tables[$t][$i]) ? $infos_tables[$t][$i] : array(), + $all[$i]); } - else - $infos_tables[$t][$i] = array_merge_recursive(isset($infos_tables[$t][$i])?$infos_tables[$t][$i]:array(),$all[$i]); + } } // completer les tables principales et auxiliaires // avec celles declarees uniquement dans declarer_table_objets_sql // pour assurer la compat en transition - foreach($infos_tables as $table=>$infos) { - $principale_ou_auxiliaire = ($infos['principale']?'tables_principales':'tables_auxiliaires'); + foreach ($infos_tables as $table => $infos) { + $principale_ou_auxiliaire = ($infos['principale'] ? 'tables_principales' : 'tables_auxiliaires'); // memoriser des champs eventuels declares par des plugins dans le pipeline tables_xxx // qui a ete appelle avant - $mem = (isset($GLOBALS[$principale_ou_auxiliaire][$table])?$GLOBALS[$principale_ou_auxiliaire][$table]:array()); + $mem = (isset($GLOBALS[$principale_ou_auxiliaire][$table]) ? $GLOBALS[$principale_ou_auxiliaire][$table] : array()); // l'ajouter au tableau $GLOBALS[$principale_ou_auxiliaire][$table] = array(); - if (isset($infos['field']) AND isset($infos['key'])){ - foreach(array('field','key','join') as $k) - if (isset($infos_tables[$table][$k])) + if (isset($infos['field']) AND isset($infos['key'])) { + foreach (array('field', 'key', 'join') as $k) { + if (isset($infos_tables[$table][$k])) { $GLOBALS[$principale_ou_auxiliaire][$table][$k] = &$infos_tables[$table][$k]; - } - else { + } + } + } else { // ici on ne renvoie que les declarations, donc RIEN // pour avoir la vrai description en base, il faut passer par trouver_table $GLOBALS[$principale_ou_auxiliaire][$table] = array(); } - if (count($mem)){ - foreach(array_keys($mem) as $k) - if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) - $GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge($GLOBALS[$principale_ou_auxiliaire][$table][$k],$mem[$k]); - else + if (count($mem)) { + foreach (array_keys($mem) as $k) { + if (isset($GLOBALS[$principale_ou_auxiliaire][$table][$k])) { + $GLOBALS[$principale_ou_auxiliaire][$table][$k] = array_merge($GLOBALS[$principale_ou_auxiliaire][$table][$k], + $mem[$k]); + } else { $GLOBALS[$principale_ou_auxiliaire][$table][$k] = $mem[$k]; + } + } } } @@ -407,23 +453,26 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ // on ne le fait que dans un second temps pour que table_objet soit fonctionnel // dans le pipeline de declarer_tables_interfaces include_spip('public/interfaces'); - foreach(array_keys($infos_tables) as $t) { - $infos_tables[$t] = renseigner_table_objet_interfaces($t,$infos_tables[$t]); + foreach (array_keys($infos_tables) as $t) { + $infos_tables[$t] = renseigner_table_objet_interfaces($t, $infos_tables[$t]); } $deja_la = false; // signature $md5 = md5(serialize($infos_tables)); } - if ($table_sql==="::md5") + if ($table_sql === "::md5") { return $md5; - if ($table_sql AND !isset($infos_tables[$table_sql])){ + } + if ($table_sql AND !isset($infos_tables[$table_sql])) { #$desc = renseigner_table_objet_sql($table_sql,$desc); - $desc = renseigner_table_objet_interfaces($table_sql,$desc); + $desc = renseigner_table_objet_interfaces($table_sql, $desc); + return $desc; } - if ($table_sql) - return isset($infos_tables[$table_sql])?$infos_tables[$table_sql]:array(); + if ($table_sql) { + return isset($infos_tables[$table_sql]) ? $infos_tables[$table_sql] : array(); + } return $infos_tables; } @@ -437,23 +486,23 @@ function lister_tables_objets_sql($table_sql = null, $desc = array()){ * @param array $tables_principales * Description des tables principales déjà déclarées * @return void -**/ -function base_serial(&$tables_principales){ + **/ +function base_serial(&$tables_principales) { $spip_jobs = array( - "id_job" => "bigint(21) NOT NULL", - "descriptif" => "text DEFAULT '' NOT NULL", - "fonction" => "varchar(255) NOT NULL", //nom de la fonction - "args"=> "longblob DEFAULT '' NOT NULL", // arguments - "md5args"=> "char(32) NOT NULL default ''", // signature des arguments + "id_job" => "bigint(21) NOT NULL", + "descriptif" => "text DEFAULT '' NOT NULL", + "fonction" => "varchar(255) NOT NULL", //nom de la fonction + "args" => "longblob DEFAULT '' NOT NULL", // arguments + "md5args" => "char(32) NOT NULL default ''", // signature des arguments "inclure" => "varchar(255) NOT NULL", // fichier a inclure ou path/ pour charger_fonction - "priorite" => "smallint(6) NOT NULL default 0", + "priorite" => "smallint(6) NOT NULL default 0", "date" => "datetime DEFAULT '0000-00-00 00:00:00' NOT NULL", // date au plus tot "status" => "tinyint NOT NULL default 1", - ); + ); $spip_jobs_key = array( - "PRIMARY KEY" => "id_job", + "PRIMARY KEY" => "id_job", "KEY date" => "date", "KEY status" => "status", ); @@ -470,65 +519,73 @@ function base_serial(&$tables_principales){ * @param array $tables_auxiliaires * Description des tables auxiliaires déjà déclarées * @return void -**/ -function base_auxiliaires(&$tables_auxiliaires){ -$spip_resultats = array( - "recherche" => "char(16) DEFAULT '' NOT NULL", - "id" => "INT UNSIGNED NOT NULL", - "points" => "INT UNSIGNED DEFAULT '0' NOT NULL", - "table_objet" => "varchar(30) DEFAULT '' NOT NULL", - "serveur" => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal) - "maj" => "TIMESTAMP" ); - -$spip_resultats_key = array( -// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ... -); - -$spip_auteurs_liens = array( - "id_auteur" => "bigint(21) DEFAULT '0' NOT NULL", - "id_objet" => "bigint(21) DEFAULT '0' NOT NULL", - "objet" => "VARCHAR (25) DEFAULT '' NOT NULL", - "vu" => "VARCHAR(6) DEFAULT 'non' NOT NULL"); - -$spip_auteurs_liens_key = array( - "PRIMARY KEY" => "id_auteur,id_objet,objet", - "KEY id_auteur" => "id_auteur", - "KEY id_objet" => "id_objet", - "KEY objet" => "objet", -); - -$spip_meta = array( - "nom" => "VARCHAR (255) NOT NULL", - "valeur" => "text DEFAULT ''", - "impt" => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL", - "maj" => "TIMESTAMP"); - -$spip_meta_key = array( - "PRIMARY KEY" => "nom"); - -$spip_jobs_liens = array( - "id_job" => "bigint(21) DEFAULT '0' NOT NULL", - "id_objet" => "bigint(21) DEFAULT '0' NOT NULL", - "objet" => "VARCHAR (25) DEFAULT '' NOT NULL", -); - -$spip_jobs_liens_key = array( - "PRIMARY KEY" => "id_job,id_objet,objet", - "KEY id_job" => "id_job"); - -$tables_auxiliaires['spip_auteurs_liens'] = array( - 'field' => &$spip_auteurs_liens, - 'key' => &$spip_auteurs_liens_key); - -$tables_auxiliaires['spip_meta'] = array( - 'field' => &$spip_meta, - 'key' => &$spip_meta_key); -$tables_auxiliaires['spip_resultats'] = array( - 'field' => &$spip_resultats, - 'key' => &$spip_resultats_key); -$tables_auxiliaires['spip_jobs_liens'] = array( - 'field' => &$spip_jobs_liens, - 'key' => &$spip_jobs_liens_key); + **/ +function base_auxiliaires(&$tables_auxiliaires) { + $spip_resultats = array( + "recherche" => "char(16) DEFAULT '' NOT NULL", + "id" => "INT UNSIGNED NOT NULL", + "points" => "INT UNSIGNED DEFAULT '0' NOT NULL", + "table_objet" => "varchar(30) DEFAULT '' NOT NULL", + "serveur" => "char(16) DEFAULT '' NOT NULL", // hash md5 partiel du serveur de base ('' pour le serveur principal) + "maj" => "TIMESTAMP" + ); + + $spip_resultats_key = array(// pas de cle ni index, ca fait des insertions plus rapides et les requetes jointes utilisees en recheche ne sont pas plus lentes ... + ); + + $spip_auteurs_liens = array( + "id_auteur" => "bigint(21) DEFAULT '0' NOT NULL", + "id_objet" => "bigint(21) DEFAULT '0' NOT NULL", + "objet" => "VARCHAR (25) DEFAULT '' NOT NULL", + "vu" => "VARCHAR(6) DEFAULT 'non' NOT NULL" + ); + + $spip_auteurs_liens_key = array( + "PRIMARY KEY" => "id_auteur,id_objet,objet", + "KEY id_auteur" => "id_auteur", + "KEY id_objet" => "id_objet", + "KEY objet" => "objet", + ); + + $spip_meta = array( + "nom" => "VARCHAR (255) NOT NULL", + "valeur" => "text DEFAULT ''", + "impt" => "ENUM('non', 'oui') DEFAULT 'oui' NOT NULL", + "maj" => "TIMESTAMP" + ); + + $spip_meta_key = array( + "PRIMARY KEY" => "nom" + ); + + $spip_jobs_liens = array( + "id_job" => "bigint(21) DEFAULT '0' NOT NULL", + "id_objet" => "bigint(21) DEFAULT '0' NOT NULL", + "objet" => "VARCHAR (25) DEFAULT '' NOT NULL", + ); + + $spip_jobs_liens_key = array( + "PRIMARY KEY" => "id_job,id_objet,objet", + "KEY id_job" => "id_job" + ); + + $tables_auxiliaires['spip_auteurs_liens'] = array( + 'field' => &$spip_auteurs_liens, + 'key' => &$spip_auteurs_liens_key + ); + + $tables_auxiliaires['spip_meta'] = array( + 'field' => &$spip_meta, + 'key' => &$spip_meta_key + ); + $tables_auxiliaires['spip_resultats'] = array( + 'field' => &$spip_resultats, + 'key' => &$spip_resultats_key + ); + $tables_auxiliaires['spip_jobs_liens'] = array( + 'field' => &$spip_jobs_liens, + 'key' => &$spip_jobs_liens_key + ); } @@ -565,7 +622,7 @@ $tables_auxiliaires['spip_jobs_liens'] = array( * - champs_contenu : utlisé pour générer l'affichage par défaut du contenu * - editable * - champs_editables : utilisé pour prendre en compte le post lors de l'édition - * + * * - champs_versionnes * * L'objet doit définir de lui même ces champs pour gérer des statuts : @@ -577,7 +634,7 @@ $tables_auxiliaires['spip_jobs_liens'] = array( * - aide_changer_statut * * - modeles : permet de declarer les modeles associes a cet objet - * + * * Les infos non renseignées sont auto-déduites par conventions * ou laissées vides * @@ -585,8 +642,8 @@ $tables_auxiliaires['spip_jobs_liens'] = array( * @param array $infos * @return array */ -function renseigner_table_objet_sql($table_sql , &$infos){ - if (!isset($infos['type'])){ +function renseigner_table_objet_sql($table_sql, &$infos) { + if (!isset($infos['type'])) { // si on arrive de base/trouver_table, on a la cle primaire : // s'en servir pour extrapoler le type if (isset($infos['key']["PRIMARY KEY"])) { @@ -594,20 +651,24 @@ function renseigner_table_objet_sql($table_sql , &$infos){ $primary = explode(',', $primary); $primary = reset($primary); $infos['type'] = preg_replace(',^spip_|^id_|s$,', '', $primary); - } - else + } else { $infos['type'] = preg_replace(',^spip_|s$,', '', $table_sql); + } } - if (!isset($infos['type_surnoms'])) + if (!isset($infos['type_surnoms'])) { $infos['type_surnoms'] = array(); + } - if (!isset($infos['table_objet'])) + if (!isset($infos['table_objet'])) { $infos['table_objet'] = preg_replace(',^spip_,', '', $table_sql); - if (!isset($infos['table_objet_surnoms'])) + } + if (!isset($infos['table_objet_surnoms'])) { $infos['table_objet_surnoms'] = array(); + } - if (!isset($infos['principale'])) + if (!isset($infos['principale'])) { $infos['principale'] = (isset($GLOBALS['tables_principales'][$table_sql]) ? 'oui' : false); + } // normaliser pour pouvoir tester en php $infos['principale']? // et dans une boucle {principale=oui} @@ -615,69 +676,96 @@ function renseigner_table_objet_sql($table_sql , &$infos){ // declarer et normaliser pour pouvoir tester en php $infos['editable']? // et dans une boucle {editable=oui} - if (!isset($infos['editable'])) + if (!isset($infos['editable'])) { $infos['editable'] = 'oui'; - + } + $infos['editable'] = (($infos['editable'] AND $infos['editable'] != 'non') ? 'oui' : false); // les urls publiques sont par defaut page=type pour les tables principales, et rien pour les autres // seules les exceptions sont donc a declarer - if (!isset($infos['page'])) + if (!isset($infos['page'])) { $infos['page'] = ($infos['principale'] ? $infos['type'] : ''); + } - if (!isset($infos['url_voir'])) + if (!isset($infos['url_voir'])) { $infos['url_voir'] = $infos['type']; - if (!isset($infos['url_edit'])) + } + if (!isset($infos['url_edit'])) { $infos['url_edit'] = $infos['url_voir'] . ($infos['editable'] ? '_edit' : ''); - if (!isset($infos['icone_objet'])) + } + if (!isset($infos['icone_objet'])) { $infos['icone_objet'] = $infos['type']; + } // chaines de langue // par defaut : objet:icone_xxx_objet - if (!isset($infos['texte_retour'])) + if (!isset($infos['texte_retour'])) { $infos['texte_retour'] = 'icone_retour'; - if (!isset($infos['texte_modifier'])) + } + if (!isset($infos['texte_modifier'])) { $infos['texte_modifier'] = $infos['type'] . ':' . 'icone_modifier_' . $infos['type']; - if (!isset($infos['texte_creer'])) + } + if (!isset($infos['texte_creer'])) { $infos['texte_creer'] = $infos['type'] . ':' . 'icone_creer_' . $infos['type']; - if (!isset($infos['texte_creer_associer'])) + } + if (!isset($infos['texte_creer_associer'])) { $infos['texte_creer_associer'] = $infos['type'] . ':' . 'texte_creer_associer_' . $infos['type']; + } if (!isset($infos['texte_ajouter'])) // Ajouter un X + { $infos['texte_ajouter'] = $infos['type'] . ':' . 'texte_ajouter_' . $infos['type']; - if (!isset($infos['texte_objets'])) + } + if (!isset($infos['texte_objets'])) { $infos['texte_objets'] = $infos['type'] . ':' . 'titre_' . $infos['table_objet']; - if (!isset($infos['texte_objet'])) + } + if (!isset($infos['texte_objet'])) { $infos['texte_objet'] = $infos['type'] . ':' . 'titre_' . $infos['type']; + } if (!isset($infos['texte_logo_objet'])) // objet:titre_logo_objet "Logo de ce X" + { $infos['texte_logo_objet'] = $infos['type'] . ':' . 'titre_logo_' . $infos['type']; + } if (!isset($infos['texte_langue_objet'])) // objet:texte_langue_objet "Langue de ce X" + { $infos['texte_langue_objet'] = $infos['type'] . ':' . 'titre_langue_' . $infos['type']; + } if (!isset($infos['texte_definir_comme_traduction_objet'])) // "Ce X est une traduction du X numéro :" + { $infos['texte_definir_comme_traduction_objet'] = $infos['type'] . ':' . 'texte_definir_comme_traduction_' . $infos['type']; + } // objet:info_aucun_objet - if (!isset($infos['info_aucun_objet'])) - $infos['info_aucun_objet'] = $infos['type'].':'.'info_aucun_'.$infos['type']; + if (!isset($infos['info_aucun_objet'])) { + $infos['info_aucun_objet'] = $infos['type'] . ':' . 'info_aucun_' . $infos['type']; + } // objet:info_1_objet - if (!isset($infos['info_1_objet'])) - $infos['info_1_objet'] = $infos['type'].':'.'info_1_'.$infos['type']; + if (!isset($infos['info_1_objet'])) { + $infos['info_1_objet'] = $infos['type'] . ':' . 'info_1_' . $infos['type']; + } // objet:info_nb_objets - if (!isset($infos['info_nb_objets'])) - $infos['info_nb_objets'] = $infos['type'].':'.'info_nb_'.$infos['table_objet']; + if (!isset($infos['info_nb_objets'])) { + $infos['info_nb_objets'] = $infos['type'] . ':' . 'info_nb_' . $infos['table_objet']; + } - if (!isset($infos['champs_editables'])) + if (!isset($infos['champs_editables'])) { $infos['champs_editables'] = array(); - if (!isset($infos['champs_versionnes'])) + } + if (!isset($infos['champs_versionnes'])) { $infos['champs_versionnes'] = array(); - if (!isset($infos['rechercher_champs'])) + } + if (!isset($infos['rechercher_champs'])) { $infos['rechercher_champs'] = array(); - if (!isset($infos['rechercher_jointures'])) + } + if (!isset($infos['rechercher_jointures'])) { $infos['rechercher_jointures'] = array(); + } - if (!isset($infos['modeles'])) + if (!isset($infos['modeles'])) { $infos['modeles'] = array($infos['type']); + } return $infos; } @@ -685,7 +773,7 @@ function renseigner_table_objet_sql($table_sql , &$infos){ /** * Renseigner les infos d'interface compilateur pour les tables objets * complete la declaration precedente - * + * * titre * date * statut @@ -695,71 +783,80 @@ function renseigner_table_objet_sql($table_sql , &$infos){ * @param $infos * @return array */ -function renseigner_table_objet_interfaces($table_sql, &$infos){ - if (!isset($infos['titre'])){ - if (isset($infos['table_objet']) AND isset($GLOBALS['table_titre'][$infos['table_objet']])) +function renseigner_table_objet_interfaces($table_sql, &$infos) { + if (!isset($infos['titre'])) { + if (isset($infos['table_objet']) AND isset($GLOBALS['table_titre'][$infos['table_objet']])) { $infos['titre'] = $GLOBALS['table_titre'][$infos['table_objet']]; - else { + } else { $infos['titre'] = ((isset($infos['field']['titre'])) ? "titre," : "'' as titre,"); $infos['titre'] .= ((isset($infos['field']['lang'])) ? "lang" : "'' as lang"); } } - if (!isset($infos['date'])){ - if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) + if (!isset($infos['date'])) { + if (isset($infos['table_objet']) and isset($GLOBALS['table_date'][$infos['table_objet']])) { $infos['date'] = $GLOBALS['table_date'][$infos['table_objet']]; - else + } else { $infos['date'] = ((isset($infos['field']['date'])) ? "date" : ''); + } } - if (!isset($infos['statut'])) + if (!isset($infos['statut'])) { $infos['statut'] = isset($GLOBALS['table_statut'][$table_sql]) ? $GLOBALS['table_statut'][$table_sql] : ''; - if (!isset($infos['tables_jointures'])) + } + if (!isset($infos['tables_jointures'])) { $infos['tables_jointures'] = array(); - if (isset($GLOBALS['tables_jointures'][$table_sql])) + } + if (isset($GLOBALS['tables_jointures'][$table_sql])) { $infos['tables_jointures'] = array_merge($infos['tables_jointures'], $GLOBALS['tables_jointures'][$table_sql]); + } + return $infos; } /** - * Retourne la liste des tables principales et leurs descriptions + * Retourne la liste des tables principales et leurs descriptions * * @api * @return array * Liste et descriptions des tables principales -**/ -function lister_tables_principales(){ + **/ +function lister_tables_principales() { static $done = false; - if (!$done OR !count($GLOBALS['tables_principales'])){ + if (!$done OR !count($GLOBALS['tables_principales'])) { lister_tables_objets_sql(); $done = true; } + return $GLOBALS['tables_principales']; } /** - * Retourne la liste des tables auxiliaires et leurs descriptions + * Retourne la liste des tables auxiliaires et leurs descriptions * * @api * @return array * Liste et descriptions des tables auxiliaires -**/ -function lister_tables_auxiliaires(){ + **/ +function lister_tables_auxiliaires() { static $done = false; - if (!$done OR !count($GLOBALS['tables_auxiliaires'])){ + if (!$done OR !count($GLOBALS['tables_auxiliaires'])) { lister_tables_objets_sql(); $done = true; } + return $GLOBALS['tables_auxiliaires']; } /** * Recenser les surnoms de table_objet + * * @return array */ -function lister_tables_objets_surnoms(){ +function lister_tables_objets_surnoms() { static $surnoms = null; static $md5 = null; if (!$surnoms - OR $md5 != lister_tables_objets_sql('::md5')){ + OR $md5 != lister_tables_objets_sql('::md5') + ) { // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions // pour compatibilite, car il faut dorenavent utiliser // declarer_table_objets_sql @@ -772,52 +869,60 @@ function lister_tables_objets_surnoms(){ 'emb' => 'documents', )); $infos_tables = lister_tables_objets_sql(); - foreach($infos_tables as $t=>$infos){ + foreach ($infos_tables as $t => $infos) { // cas de base type=>table // et preg_replace(',^spip_|^id_|s$,',table)=>table - if ($infos['table_objet']){ // securite, si la fonction est appelee trop tot, c'est vide + if ($infos['table_objet']) { // securite, si la fonction est appelee trop tot, c'est vide // optimisations pour table_objet //$surnoms[$infos['type']] = $infos['table_objet']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['table_objet']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['table_objet']; - if (is_array($infos['table_objet_surnoms']) AND count($infos['table_objet_surnoms'])) - foreach($infos['table_objet_surnoms'] as $surnom) + if (is_array($infos['table_objet_surnoms']) AND count($infos['table_objet_surnoms'])) { + foreach ($infos['table_objet_surnoms'] as $surnom) { $surnoms[$surnom] = $infos['table_objet']; + } + } } } $md5 = lister_tables_objets_sql('::md5'); } + return $surnoms; } /** * Recenser les surnoms de table_objet + * * @return array */ -function lister_types_surnoms(){ +function lister_types_surnoms() { static $surnoms = null; static $md5 = null; if (!$surnoms - OR $md5 != lister_tables_objets_sql('::md5')){ + OR $md5 != lister_tables_objets_sql('::md5') + ) { // passer dans un pipeline qui permet aux plugins de declarer leurs exceptions // pour compatibilite, car il faut dorenavent utiliser // declarer_table_objets_sql - $surnoms = pipeline('declarer_type_surnoms', array('racine-site'=>'site')); + $surnoms = pipeline('declarer_type_surnoms', array('racine-site' => 'site')); $infos_tables = lister_tables_objets_sql(); - foreach($infos_tables as $t=>$infos){ - if ($infos['type']){ // securite, si la fonction est appelee trop tot, c'est vide + foreach ($infos_tables as $t => $infos) { + if ($infos['type']) { // securite, si la fonction est appelee trop tot, c'est vide // optimisations pour objet_type //$surnoms[$infos['type']] = $infos['type']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['table_objet'])] = $infos['type']; $surnoms[preg_replace(',^spip_|^id_|s$,', '', $infos['type'])] = $infos['type']; // surnoms declares - if (is_array($infos['type_surnoms']) AND count($infos['type_surnoms'])) - foreach($infos['type_surnoms'] as $surnom) + if (is_array($infos['type_surnoms']) AND count($infos['type_surnoms'])) { + foreach ($infos['type_surnoms'] as $surnom) { $surnoms[$surnom] = $infos['type']; + } + } } } $md5 = lister_tables_objets_sql('::md5'); } + return $surnoms; } @@ -825,32 +930,34 @@ function lister_types_surnoms(){ * Retourne la liste des tables SQL qui concernent SPIP * * Cette liste n'est calculée qu'une fois par serveur pour l'ensemble du hit - * + * * @param string $serveur * Nom du fichier de connexion à la base de données * @return array * Couples (nom de la table SQL => même nom, sans 'spip_' devant) -**/ -function lister_tables_spip($serveur = ''){ + **/ +function lister_tables_spip($serveur = '') { static $tables = array(); - if (!isset($tables[$serveur])){ + if (!isset($tables[$serveur])) { $tables[$serveur] = array(); - if (!function_exists("sql_alltable")) + if (!function_exists("sql_alltable")) { include_spip("base/abstract_sql"); - $ts = sql_alltable(null,$serveur); // toutes les tables "spip_" (ou prefixe perso) + } + $ts = sql_alltable(null, $serveur); // toutes les tables "spip_" (ou prefixe perso) $connexion = $GLOBALS['connexions'][$serveur ? $serveur : 0]; $spip = $connexion['prefixe'] . '_'; - foreach ($ts as $t){ - $t = substr($t,strlen($spip)); + foreach ($ts as $t) { + $t = substr($t, strlen($spip)); $tables[$serveur]["spip_$t"] = $t; } } + return $tables[$serveur]; } - + /** * Retrouve le nom d'objet à partir de la table - * + * * - spip_articles -> articles * - id_article -> articles * - article -> articles @@ -863,34 +970,38 @@ function lister_tables_spip($serveur = ''){ * Nom du connecteur * @return string * Nom de l'objet -**/ + **/ function table_objet($type, $serveur = '') { $surnoms = lister_tables_objets_surnoms(); $type = preg_replace(',^spip_|^id_|s$,', '', $type); - if (!$type) return; - if (isset($surnoms[$type])) + if (!$type) { + return; + } + if (isset($surnoms[$type])) { return $surnoms[$type]; + } - if ($serveur!==false){ - $t=lister_tables_spip($serveur); + if ($serveur !== false) { + $t = lister_tables_spip($serveur); $trouver_table = charger_fonction('trouver_table', 'base'); - $typetrim = rtrim($type,'s')."s"; + $typetrim = rtrim($type, 's') . "s"; if ( - (isset($t[$typetrim]) OR in_array($typetrim,$t)) - AND ($desc = $trouver_table(rtrim($type,'s')."s",$serveur)) - ) + (isset($t[$typetrim]) OR in_array($typetrim, $t)) + AND ($desc = $trouver_table(rtrim($type, 's') . "s", $serveur)) + ) { return $desc['id_table']; - elseif ( - (isset($t[$type]) OR in_array($type,$t)) - AND ($desc = $trouver_table($type,$serveur)) - ) + } elseif ( + (isset($t[$type]) OR in_array($type, $t)) + AND ($desc = $trouver_table($type, $serveur)) + ) { return $desc['id_table']; + } - spip_log( 'table_objet('.$type.') calculee sans verification'); + spip_log('table_objet(' . $type . ') calculee sans verification'); #spip_log(debug_backtrace(),'db'); } - return rtrim($type,'s')."s"; # cas historique ne devant plus servir, sauf si $serveur=false + return rtrim($type, 's') . "s"; # cas historique ne devant plus servir, sauf si $serveur=false } /** @@ -908,36 +1019,38 @@ function table_objet($type, $serveur = '') { * Nom du connecteur * @return string * Nom de la table SQL -**/ + **/ function table_objet_sql($type, $serveur = '') { $nom = table_objet($type, $serveur); if (!isset($GLOBALS['table_des_tables']['articles'])) // eviter de multiples inclusions + { include_spip('public/interfaces'); + } if (isset($GLOBALS['table_des_tables'][$nom])) { $nom = $GLOBALS['table_des_tables'][$nom]; $nom = "spip_$nom"; - } - else { + } else { $infos_tables = lister_tables_objets_sql(); - if (isset($infos_tables["spip_$nom"])) + if (isset($infos_tables["spip_$nom"])) { $nom = "spip_$nom"; - elseif($serveur!==false) { - $t=lister_tables_spip($serveur); - if (isset($t[$nom]) OR in_array($nom,$t)){ + } elseif ($serveur !== false) { + $t = lister_tables_spip($serveur); + if (isset($t[$nom]) OR in_array($nom, $t)) { $trouver_table = charger_fonction('trouver_table', 'base'); - if ($desc = $trouver_table($nom,$serveur)) + if ($desc = $trouver_table($nom, $serveur)) { return $desc['table_sql']; + } } } } - return $nom ; + return $nom; } /** * Retrouve la clé primaire à partir du nom d'objet ou de table - * + * * - articles -> id_article * - article -> id_article * - spip_articles -> id_article @@ -949,32 +1062,39 @@ function table_objet_sql($type, $serveur = '') { * Nom du connecteur * @return string * Nom de la clé primaire -**/ + **/ function id_table_objet($type, $serveur = '') { static $trouver_table = null; - $type = objet_type($type,$serveur); - if (!$type) return; + $type = objet_type($type, $serveur); + if (!$type) { + return; + } $t = table_objet($type); - if (!$trouver_table) + if (!$trouver_table) { $trouver_table = charger_fonction('trouver_table', 'base'); + } - $ts=lister_tables_spip($serveur); - if (in_array($t,$ts)){ - $desc = $trouver_table($t,$serveur); - if (isset($desc['key']['PRIMARY KEY'])) + $ts = lister_tables_spip($serveur); + if (in_array($t, $ts)) { + $desc = $trouver_table($t, $serveur); + if (isset($desc['key']['PRIMARY KEY'])) { return $desc['key']['PRIMARY KEY']; - if (!$desc OR isset($desc['field']["id_$type"])) + } + if (!$desc OR isset($desc['field']["id_$type"])) { return "id_$type"; + } // sinon renvoyer le premier champ de la table... $keys = array_keys($desc['field']); + return array_shift($keys); } + return "id_$type"; } /** * Retrouve le type d'objet à partir du nom d'objet ou de table - * + * * - articles -> article * - spip_articles -> article * - id_article -> article @@ -986,9 +1106,11 @@ function id_table_objet($type, $serveur = '') { * Nom du connecteur * @return string * Type de l'objet -**/ + **/ function objet_type($table_objet, $serveur = '') { - if (!$table_objet) return; + if (!$table_objet) { + return; + } $surnoms = lister_types_surnoms(); // scenario de base @@ -996,22 +1118,26 @@ function objet_type($table_objet, $serveur = '') { // et la marque du pluriel // on accepte id_xx en entree aussi $type = preg_replace(',^spip_|^id_|s$,', '', $table_objet); - if (isset($surnoms[$type])) + if (isset($surnoms[$type])) { return $surnoms[$type]; + } // securite : eliminer les caracteres non \w - $type = preg_replace(',[^\w-],','', $type); + $type = preg_replace(',[^\w-],', '', $type); // si le type redonne bien la table c'est bon // oui si table_objet ressemblait deja a un type - if ( $type==$table_objet - OR (table_objet($type,$serveur) == $table_objet) - OR (table_objet_sql($type,$serveur) == $table_objet)) - return $type; + if ($type == $table_objet + OR (table_objet($type, $serveur) == $table_objet) + OR (table_objet_sql($type, $serveur) == $table_objet) + ) { + return $type; + } // si on ne veut pas chercher en base - if ($serveur===false) + if ($serveur === false) { return $type; + } // sinon on passe par la cle primaire id_xx pour trouver le type // car le s a la fin est incertain @@ -1022,13 +1148,16 @@ function objet_type($table_objet, $serveur = '') { $trouver_table = charger_fonction('trouver_table', 'base'); $ts = lister_tables_spip($serveur); $desc = false; - if (in_array($table_objet,$ts)) + if (in_array($table_objet, $ts)) { $desc = $trouver_table($table_objet); - if (!$desc AND in_array($table_objet = table_objet($type, $serveur), $ts)) + } + if (!$desc AND in_array($table_objet = table_objet($type, $serveur), $ts)) { $desc = $trouver_table($table_objet, $serveur); + } // si le type est declare : bingo ! - if ($desc AND isset($desc['type'])) - return $desc['type']; + if ($desc AND isset($desc['type'])) { + return $desc['type']; + } // on a fait ce qu'on a pu return $type; @@ -1036,7 +1165,7 @@ function objet_type($table_objet, $serveur = '') { /** * 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 @@ -1049,8 +1178,9 @@ function objet_type($table_objet, $serveur = '') { 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)) + 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); @@ -1058,7 +1188,8 @@ function objet_test_si_publie($objet, $id_objet, $serveur = '') { $trouver_table = charger_fonction('trouver_table', 'base'); if ($desc = $trouver_table($table_objet, $serveur) AND isset($desc['statut']) - AND $desc['statut']){ + AND $desc['statut'] + ) { $boucle = new Boucle(); $boucle->show = $desc; $boucle->nom = 'objet_test_si_publie'; @@ -1072,9 +1203,12 @@ function objet_test_si_publie($objet, $id_objet, $serveur = '') { include_spip('public/compiler'); include_spip('public/composer'); instituer_boucle($boucle, false, true); - $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)) + $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; } diff --git a/ecrire/base/repair.php b/ecrire/base/repair.php index d163f2936b..12464ce103 100644 --- a/ecrire/base/repair.php +++ b/ecrire/base/repair.php @@ -15,8 +15,10 @@ * * @package SPIP\Core\SQL\Reparation */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Action de réparation de la base de données @@ -28,15 +30,15 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @uses admin_repair_tables() * @uses calculer_rubriques() * @uses propager_les_secteurs() - * - * @param string $titre Inutilisé + * + * @param string $titre Inutilisé * @param string $reprise Inutilisé -**/ + **/ function base_repair_dist($titre = '', $reprise = '') { $res = admin_repair_tables(); if (!$res) { - $res = "<div class='error'>"._T('avis_erreur_mysql').' '.sql_errno().': '.sql_error() ."</div>\n"; + $res = "<div class='error'>" . _T('avis_erreur_mysql') . ' ' . sql_errno() . ': ' . sql_error() . "</div>\n"; } else { include_spip('inc/rubriques'); calculer_rubriques(); @@ -45,7 +47,7 @@ function base_repair_dist($titre = '', $reprise = '') { include_spip('inc/minipres'); $res .= pipeline('base_admin_repair', $res); echo minipres(_T('texte_tentative_recuperation'), - $res . generer_form_ecrire('accueil', '','',_T('public:accueil_site'))); + $res . generer_form_ecrire('accueil', '', '', _T('public:accueil_site'))); } /** @@ -53,36 +55,39 @@ function base_repair_dist($titre = '', $reprise = '') { * * @deprecated Les fichiers .plat ne sont plus utilisés. Cette fonction n'est plus appelée depuis r14292 * @todo À supprimer ou déplacer dans le plugin Medias. - * + * * @return string Description des changements de chemins des documents -**/ -function admin_repair_plat(){ - spip_log( "verification des documents joints", _LOG_INFO_IMPORTANTE); + **/ +function admin_repair_plat() { + spip_log("verification des documents joints", _LOG_INFO_IMPORTANTE); $out = ""; $repertoire = array(); include_spip('inc/getdocument'); - $res = sql_select('*','spip_documents',"fichier REGEXP CONCAT('^',extension,'[^/\]') AND distant='non'"); + $res = sql_select('*', 'spip_documents', "fichier REGEXP CONCAT('^',extension,'[^/\]') AND distant='non'"); - while ($row=sql_fetch($res)){ + while ($row = sql_fetch($res)) { $ext = $row['extension']; if (!$ext) { spip_log("document sans extension: " . $row['id_document'], _LOG_INFO_IMPORTANTE); continue; } - if (!isset($repertoire[$ext])){ - if (@file_exists($plat = _DIR_IMG. $ext .".plat")) + if (!isset($repertoire[$ext])) { + if (@file_exists($plat = _DIR_IMG . $ext . ".plat")) { spip_unlink($plat); + } $repertoire[$ext] = creer_repertoire_documents($ext); - if (preg_match(',_$,',$repertoire[$ext])) + if (preg_match(',_$,', $repertoire[$ext])) { $repertoire[$ext] = false; + } } - if ($d=$repertoire[$ext]){ - $d = substr($d,strlen(_DIR_IMG)); + if ($d = $repertoire[$ext]) { + $d = substr($d, strlen(_DIR_IMG)); $src = $row['fichier']; - $dest = $d . substr($src,strlen($d)); + $dest = $d . substr($src, strlen($d)); if (@copy(_DIR_IMG . $src, _DIR_IMG . $dest) - AND file_exists(_DIR_IMG . $dest)) { - sql_updateq('spip_documents',array('fichier'=>$dest),'id_document='.intval($row['id_document'])); + AND file_exists(_DIR_IMG . $dest) + ) { + sql_updateq('spip_documents', array('fichier' => $dest), 'id_document=' . intval($row['id_document'])); spip_unlink(_DIR_IMG . $src); $out .= "$src => $dest<br />"; } @@ -97,13 +102,13 @@ function admin_repair_plat(){ * * Crée les tables et les champs manquants. * Applique sur les tables un REPAIR en SQL (si le serveur SQL l'accepte). - * + * * @return string * Code HTML expliquant les actions réalisées -**/ + **/ function admin_repair_tables() { - $repair = sql_repair('repair', NULL, 'continue'); + $repair = sql_repair('repair', null, 'continue'); // recreer les tables manquantes eventuelles include_spip('base/create'); @@ -112,9 +117,10 @@ function admin_repair_tables() { $connexion = $GLOBALS['connexions'][0]; $prefixe = $connexion['prefixe']; $rows = array(); - if ($res1 = sql_showbase()){ - while ($r = sql_fetch($res1)) + if ($res1 = sql_showbase()) { + while ($r = sql_fetch($res1)) { $rows[] = $r; + } sql_free($res1); } @@ -129,9 +135,11 @@ function admin_repair_tables() { // supprimer la meta avant de lancer la reparation // car le repair peut etre long ; on ne veut pas boucler effacer_meta('admin_repair'); - if ($repair){ + if ($repair) { $result_repair = sql_repair($tab); - if (!$result_repair) return false; + if (!$result_repair) { + return false; + } } // essayer de maj la table (creation de champs manquants) @@ -139,25 +147,32 @@ function admin_repair_tables() { $count = sql_countsel($tab); - if ($count>1) - $m .= "("._T('texte_compte_elements', array('count' => $count)).")\n"; - else if ($count==1) - $m .= "("._T('texte_compte_element', array('count' => $count)).")\n"; - else - $m .= "("._T('texte_vide').")\n"; + if ($count > 1) { + $m .= "(" . _T('texte_compte_elements', array('count' => $count)) . ")\n"; + } else { + if ($count == 1) { + $m .= "(" . _T('texte_compte_element', array('count' => $count)) . ")\n"; + } else { + $m .= "(" . _T('texte_vide') . ")\n"; + } + } if ($result_repair - AND $msg = join(" ", (is_resource($result_repair) or is_object($result_repair))?sql_fetch($result_repair):$result_repair) . ' ' - AND strpos($msg, ' OK ')===FALSE){ + AND $msg = join(" ", + (is_resource($result_repair) or is_object($result_repair)) ? sql_fetch($result_repair) : $result_repair) . ' ' + AND strpos($msg, ' OK ') === false + ) { $class = " class='notice'"; - $m .= "<br /><tt>".spip_htmlentities($msg)."</tt>\n"; + $m .= "<br /><tt>" . spip_htmlentities($msg) . "</tt>\n"; + } else { + $m .= " " . _T('texte_table_ok'); } - else - $m .= " "._T('texte_table_ok'); - $res .="<div$class>$m</div>"; - } + $res .= "<div$class>$m</div>"; + } } + return $res; } + ?> diff --git a/ecrire/base/serial.php b/ecrire/base/serial.php index 4f7ef4074f..92c8d8c770 100644 --- a/ecrire/base/serial.php +++ b/ecrire/base/serial.php @@ -18,9 +18,11 @@ * Ce fichier mais directement base/objets si nécessaire * * @package SPIP\Core\SQL\Tables -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/objets'); lister_tables_objets_sql(); diff --git a/ecrire/base/trouver_table.php b/ecrire/base/trouver_table.php index d0aab5d664..9dfdbb6c04 100644 --- a/ecrire/base/trouver_table.php +++ b/ecrire/base/trouver_table.php @@ -14,33 +14,35 @@ * Gestion de l'obtention des descriptions de tables SQL * * @package SPIP\Core\SQL\Tables -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/objets'); /** * Retourne la description d'une table SQL * * Cela sert notamment au moment de la compilation des boucles, critères et balise. - * + * * Les champs et clés de la tables sont retrouvés prioritairement via le * gestionnaire de base de données. Les descriptions sont complétées, * pour les tables éditoriales, des informations déclarées ou construites * par la déclaration des objets éditoriaux. - * + * * @example * $trouver_table = charger_fonction('trouver_table', 'base'); * $desc = $trouver_table('spip_groupes_mots'); - * + * * Cette fonction intervient à la compilation, mais aussi pour la balise * contextuelle EXPOSE ou certains critères. - * + * * L'ensemble des descriptions de table d'un serveur est stocké dans un * fichier cache/sql_desc.txt par soucis de performance. Un appel * avec $nom vide est une demande explicite de vidange de ce cache * * @see lister_tables_objets_sql() - * + * * @api * @param string $nom * Nom de la table @@ -58,15 +60,17 @@ include_spip('base/objets'); * - id_table : nom SPIP de la table (type de boucle) * le compilateur produit FROM $r['table'] AS $r['id_table'] * - Toutes les autres informations des objets éditoriaux si la table est l'un d'eux. - * * -**/ -function base_trouver_table_dist($nom, $serveur = '', $table_spip = true){ - static $nom_cache_desc_sql=array(); + * + **/ +function base_trouver_table_dist($nom, $serveur = '', $table_spip = true) { + static $nom_cache_desc_sql = array(); if (!spip_connect($serveur) - OR !preg_match('/^[a-zA-Z0-9._-]*/',$nom)) + OR !preg_match('/^[a-zA-Z0-9._-]*/', $nom) + ) { return null; + } $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $objets_sql = lister_tables_objets_sql("::md5"); @@ -74,28 +78,30 @@ function base_trouver_table_dist($nom, $serveur = '', $table_spip = true){ // le nom du cache depend du serveur mais aussi du nom de la db et du prefixe // ce qui permet une auto invalidation en cas de modif manuelle du fichier // de connexion, et tout risque d'ambiguite - if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])){ + if (!isset($nom_cache_desc_sql[$serveur][$objets_sql])) { $nom_cache_desc_sql[$serveur][$objets_sql] = - _DIR_CACHE . 'sql_desc_' - . ($serveur ? "{$serveur}_":"") - . substr(md5($connexion['db'].":".$connexion['prefixe'].":$objets_sql"),0,8) - .'.txt'; + _DIR_CACHE . 'sql_desc_' + . ($serveur ? "{$serveur}_" : "") + . substr(md5($connexion['db'] . ":" . $connexion['prefixe'] . ":$objets_sql"), 0, 8) + . '.txt'; // nouveau nom de cache = nouvelle version en memoire unset($connexion['tables']); } // un appel avec $nom vide est une demande explicite de vidange du cache des descriptions - if (!$nom){ + if (!$nom) { spip_unlink($nom_cache_desc_sql[$serveur][$objets_sql]); $connexion['tables'] = array(); + return null; } $nom_sql = $nom; - if (preg_match('/\.(.*)$/', $nom, $s)) + if (preg_match('/\.(.*)$/', $nom, $s)) { $nom_sql = $s[1]; - else + } else { $nom_sql = $nom; + } $fdesc = $desc = ''; $connexion = &$GLOBALS['connexions'][$serveur ? $serveur : 0]; @@ -113,25 +119,29 @@ function base_trouver_table_dist($nom, $serveur = '', $table_spip = true){ // on essaye de recharger le cache des decriptions de ce serveur // dans le fichier cache if (!isset($connexion['tables'][$nom_sql]) - AND defined('_VAR_MODE') AND _VAR_MODE!=='recalcul' - AND (!isset($connexion['tables']) OR !$connexion['tables'])) { - if (lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql],$desc_cache) - AND $desc_cache=unserialize($desc_cache)) - $connexion['tables'] = $desc_cache; + AND defined('_VAR_MODE') AND _VAR_MODE !== 'recalcul' + AND (!isset($connexion['tables']) OR !$connexion['tables']) + ) { + if (lire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], $desc_cache) + AND $desc_cache = unserialize($desc_cache) + ) { + $connexion['tables'] = $desc_cache; + } } if ($table_spip AND !isset($connexion['tables'][$nom_sql])) { - if (isset($GLOBALS['tables_principales'][$nom_sql])) + if (isset($GLOBALS['tables_principales'][$nom_sql])) { $fdesc = $GLOBALS['tables_principales'][$nom_sql]; + } // meme si pas d'abreviation declaree, trouver la table spip_$nom // si c'est une table principale, // puisqu'on le fait aussi pour les tables auxiliaires - elseif ($nom_sql==$nom AND isset($GLOBALS['tables_principales']['spip_' .$nom])){ + elseif ($nom_sql == $nom AND isset($GLOBALS['tables_principales']['spip_' . $nom])) { $nom_sql = 'spip_' . $nom; $fdesc = &$GLOBALS['tables_principales'][$nom_sql]; - } - elseif (isset($GLOBALS['tables_auxiliaires'][$n=$nom]) - OR isset($GLOBALS['tables_auxiliaires'][$n='spip_'.$nom])) { + } elseif (isset($GLOBALS['tables_auxiliaires'][$n = $nom]) + OR isset($GLOBALS['tables_auxiliaires'][$n = 'spip_' . $nom]) + ) { $nom_sql = $n; $fdesc = &$GLOBALS['tables_auxiliaires'][$n]; } # table locale a cote de SPIP, comme non SPIP: @@ -142,40 +152,42 @@ function base_trouver_table_dist($nom, $serveur = '', $table_spip = true){ $desc = sql_showtable($nom_sql, $table_spip, $serveur); if (!$desc OR !$desc['field']) { if (!$fdesc) { - spip_log("trouver_table: table inconnue '$serveur' '$nom'",_LOG_INFO_IMPORTANTE); + spip_log("trouver_table: table inconnue '$serveur' '$nom'", _LOG_INFO_IMPORTANTE); + return null; } // on ne sait pas lire la structure de la table : // on retombe sur la description donnee dans les fichiers spip $desc = $fdesc; $desc['exist'] = false; - } - else { + } else { $desc['exist'] = true; } $desc['table'] = $desc['table_sql'] = $nom_sql; - $desc['connexion']= $serveur; + $desc['connexion'] = $serveur; // charger les infos declarees pour cette table // en lui passant les infos connues // $desc est prioritaire pour la description de la table - $desc = array_merge(lister_tables_objets_sql($nom_sql,$desc),$desc); + $desc = array_merge(lister_tables_objets_sql($nom_sql, $desc), $desc); // si tables_objets_sql est bien fini d'init, on peut cacher $connexion['tables'][$nom_sql] = $desc; $res = &$connexion['tables'][$nom_sql]; // une nouvelle table a ete decrite // mettons donc a jour le cache des descriptions de ce serveur - if (is_writeable(_DIR_CACHE)) - ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql],serialize($connexion['tables']),true); - } - else + if (is_writeable(_DIR_CACHE)) { + ecrire_fichier($nom_cache_desc_sql[$serveur][$objets_sql], serialize($connexion['tables']), true); + } + } else { $res = &$connexion['tables'][$nom_sql]; + } // toujours retourner $nom dans id_table - $res['id_table']=$nom; + $res['id_table'] = $nom; return $res; } + ?> diff --git a/ecrire/base/upgrade.php b/ecrire/base/upgrade.php index fff2652407..662b5499f7 100644 --- a/ecrire/base/upgrade.php +++ b/ecrire/base/upgrade.php @@ -15,12 +15,14 @@ * * @package SPIP\Core\SQL\Upgrade */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Programme de mise à jour des tables SQL lors d'un changement de version. - * + * * L'entrée dans cette fonction est reservée aux mises à jour de SPIP coeur. * * Marche aussi pour les plugins en appelant directement la fonction `maj_plugin` @@ -32,21 +34,22 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @uses creer_base() * @uses maj_base() * @uses auth_synchroniser_distant() - * + * * @param string $titre * @param string $reprise Inutilisé * @return void */ -function base_upgrade_dist($titre = '', $reprise = '') -{ - if (!$titre) return; // anti-testeur automatique - if ($GLOBALS['spip_version_base']!=$GLOBALS['meta']['version_installee']) { +function base_upgrade_dist($titre = '', $reprise = '') { + if (!$titre) { + return; + } // anti-testeur automatique + if ($GLOBALS['spip_version_base'] != $GLOBALS['meta']['version_installee']) { if (!is_numeric(_request('reinstall'))) { include_spip('base/create'); - spip_log("recree les tables eventuellement disparues","maj."._LOG_INFO_IMPORTANTE); + spip_log("recree les tables eventuellement disparues", "maj." . _LOG_INFO_IMPORTANTE); creer_base(); } - + // quand on rentre par ici, c'est toujours une mise a jour de SPIP // lancement de l'upgrade SPIP $res = maj_base(); @@ -56,8 +59,8 @@ function base_upgrade_dist($titre = '', $reprise = '') exit; } } - spip_log("Fin de mise a jour SQL. Debut m-a-j acces et config","maj."._LOG_INFO_IMPORTANTE); - + spip_log("Fin de mise a jour SQL. Debut m-a-j acces et config", "maj." . _LOG_INFO_IMPORTANTE); + // supprimer quelques fichiers temporaires qui peuvent se retrouver invalides @spip_unlink(_CACHE_RUBRIQUES); @spip_unlink(_CACHE_PIPELINES); @@ -65,7 +68,7 @@ function base_upgrade_dist($titre = '', $reprise = '') @spip_unlink(_CACHE_PLUGINS_OPT); @spip_unlink(_CACHE_PLUGINS_FCT); @spip_unlink(_CACHE_CHEMIN); - @spip_unlink(_DIR_TMP."plugin_xml_cache.gz"); + @spip_unlink(_DIR_TMP . "plugin_xml_cache.gz"); include_spip('inc/auth'); auth_synchroniser_distant(); @@ -81,10 +84,10 @@ function base_upgrade_dist($titre = '', $reprise = '') * schéma actuel de la base de données. * * Les fonctions de mises à jour se trouvent dans `ecrire/maj/` - * + * * @uses upgrade_test() * @uses maj_while() - * + * * @param int $version_cible * @param string $redirect * @return array|bool @@ -99,64 +102,75 @@ function maj_base($version_cible = 0, $redirect = '') { // il y a eu le message d'avertissement il doit savoir ce qu'il fait // // version_installee = 1.702; quand on a besoin de forcer une MAJ - - spip_log("Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'],"maj."._LOG_INFO_IMPORTANTE); + + spip_log("Version anterieure: $version_installee. Courante: " . $GLOBALS['spip_version_base'], + "maj." . _LOG_INFO_IMPORTANTE); if (!$version_installee OR ($GLOBALS['spip_version_base'] < $version_installee)) { - sql_replace('spip_meta', - array('nom' => 'version_installee', - 'valeur' => $GLOBALS['spip_version_base'], - 'impt' => 'non')); + sql_replace('spip_meta', + array( + 'nom' => 'version_installee', + 'valeur' => $GLOBALS['spip_version_base'], + 'impt' => 'non' + )); + return false; } - if (!upgrade_test()) return true; - + if (!upgrade_test()) { + return true; + } + $cible = ($version_cible ? $version_cible : $GLOBALS['spip_version_base']); if ($version_installee <= 1.926) { - $n = floor($version_installee * 10); + $n = floor($version_installee*10); while ($n < 19) { - $nom = sprintf("v%03d",$n); + $nom = sprintf("v%03d", $n); $f = charger_fonction($nom, 'maj', true); if ($f) { - spip_log( "$f repercute les modifications de la version " . ($n/10),"maj."._LOG_INFO_IMPORTANTE); + spip_log("$f repercute les modifications de la version " . ($n/10), "maj." . _LOG_INFO_IMPORTANTE); $f($version_installee, $GLOBALS['spip_version_base']); - } else spip_log( "pas de fonction pour la maj $n $nom","maj."._LOG_INFO_IMPORTANTE); + } else { + spip_log("pas de fonction pour la maj $n $nom", "maj." . _LOG_INFO_IMPORTANTE); + } $n++; } include_spip('maj/v019_pre193'); v019_pre193($version_installee, $version_cible); } if ($version_installee < 2000) { - if ($version_installee < 2) + if ($version_installee < 2) { $version_installee = $version_installee*1000; + } include_spip('maj/v019'); } - if ($cible < 2) + if ($cible < 2) { $cible = $cible*1000; + } include_spip('maj/svn10000'); ksort($GLOBALS['maj']); - $res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee','meta', $redirect, true); + $res = maj_while($version_installee, $cible, $GLOBALS['maj'], 'version_installee', 'meta', $redirect, true); if ($res) { - if (!is_array($res)) - spip_log("Pb d'acces SQL a la mise a jour","maj."._LOG_INFO_ERREUR); - else { + if (!is_array($res)) { + spip_log("Pb d'acces SQL a la mise a jour", "maj." . _LOG_INFO_ERREUR); + } else { echo _T('avis_operation_echec') . ' ' . join(' ', $res); echo install_fin_html(); } } + return $res; } /** * Mise à jour d'un plugin de SPIP - * + * * Fonction appelée par la fonction de mise à jour d'un plugin. * On lui fournit un tableau de fonctions élementaires * dont l'indice est la version. * * @uses maj_while() - * + * * @param string $nom_meta_base_version * Nom de la meta informant de la version du schéma de données du plugin installé dans SPIP * @param string $version_cible @@ -171,7 +185,7 @@ function maj_base($version_cible = 0, $redirect = '') { * et les suivant les paramètres à lui passer * * Exemple : - * + * * ``` * array( * 'create' => array( @@ -185,50 +199,52 @@ function maj_base($version_cible = 0, $redirect = '') { * Nom de la table meta (sans le prefixe spip_) dans laquelle trouver la meta $nom_meta_base_version * @return void */ -function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = 'meta'){ +function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = 'meta') { - if ($table_meta!=='meta') + if ($table_meta !== 'meta') { lire_metas($table_meta); + } $current_version = null; - if ( (!isset($GLOBALS[$table_meta][$nom_meta_base_version]) ) - || (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version],$version_cible,'='))){ + if ((!isset($GLOBALS[$table_meta][$nom_meta_base_version])) + || (!spip_version_compare($current_version = $GLOBALS[$table_meta][$nom_meta_base_version], $version_cible, '=')) + ) { // $maj['create'] contient les directives propres a la premiere creation de base // c'est une operation derogatoire qui fait aboutir directement dans la version_cible - if (isset($maj['create'])){ - if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])){ + if (isset($maj['create'])) { + if (!isset($GLOBALS[$table_meta][$nom_meta_base_version])) { // installation : on ne fait que l'operation create - $maj = array("init"=>$maj['create']); + $maj = array("init" => $maj['create']); // et on lui ajoute un appel a inc/config // pour creer les metas par defaut - $config = charger_fonction('config','inc'); + $config = charger_fonction('config', 'inc'); $maj[$version_cible] = array(array($config)); } // dans tous les cas enlever cet index du tableau unset($maj['create']); } // si init, deja dans le bon ordre - if (!isset($maj['init'])){ + if (!isset($maj['init'])) { include_spip('inc/plugin'); // pour spip_version_compare - uksort($maj,'spip_version_compare'); + uksort($maj, 'spip_version_compare'); } // la redirection se fait par defaut sur la page d'administration des plugins // sauf lorsque nous sommes sur l'installation de SPIP // ou define _REDIRECT_MAJ_PLUGIN - $redirect = (defined('_REDIRECT_MAJ_PLUGIN')?_REDIRECT_MAJ_PLUGIN:generer_url_ecrire('admin_plugin')); + $redirect = (defined('_REDIRECT_MAJ_PLUGIN') ? _REDIRECT_MAJ_PLUGIN : generer_url_ecrire('admin_plugin')); if (defined('_ECRIRE_INSTALL')) { - $redirect = parametre_url(generer_url_ecrire('install'),'etape', _request('etape')); + $redirect = parametre_url(generer_url_ecrire('install'), 'etape', _request('etape')); } - + $res = maj_while($current_version, $version_cible, $maj, $nom_meta_base_version, $table_meta, $redirect); if ($res) { - if (!is_array($res)) - spip_log("Pb d'acces SQL a la mise a jour","maj."._LOG_INFO_ERREUR); - else { - echo "<p>"._T('avis_operation_echec') . ' ' . join(' ', $res)."</p>"; + if (!is_array($res)) { + spip_log("Pb d'acces SQL a la mise a jour", "maj." . _LOG_INFO_ERREUR); + } else { + echo "<p>" . _T('avis_operation_echec') . ' ' . join(' ', $res) . "</p>"; } } } @@ -236,26 +252,26 @@ function maj_plugin($nom_meta_base_version, $version_cible, $maj, $table_meta = /** * Relancer le hit de mise à jour avant timeout - * + * * si pas de redirect fourni, on redirige vers `exec=upgrade` pour finir * ce qui doit être une mise à jour SPIP * * @uses redirige_formulaire() - * + * * @param string $meta * @param string $table * @param string $redirect * @return void */ -function relance_maj($meta, $table, $redirect = ''){ +function relance_maj($meta, $table, $redirect = '') { include_spip('inc/headers'); - if (!$redirect){ + if (!$redirect) { // recuperer la valeur installee en cours // on la tronque numeriquement, elle ne sert pas reellement // sauf pour verifier que ce n'est pas oui ou non // sinon is_numeric va echouer sur un numero de version 1.2.3 $installee = intval($GLOBALS[$table][$meta]); - $redirect = generer_url_ecrire('upgrade',"reinstall=$installee&meta=$meta&table=$table",true); + $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true); } echo redirige_formulaire($redirect); exit(); @@ -264,27 +280,30 @@ function relance_maj($meta, $table, $redirect = ''){ /** * Initialiser la page pour l'affichage des progrès de l'upgrade * uniquement si la page n'a pas déjà été initilalisée - * + * * @param string $installee * @param string $meta * @param string $table * @return void */ -function maj_debut_page($installee, $meta, $table){ +function maj_debut_page($installee, $meta, $table) { static $done = false; - if ($done) return; + if ($done) { + return; + } include_spip('inc/minipres'); - @ini_set("zlib.output_compression","0"); // pour permettre l'affichage au fur et a mesure + @ini_set("zlib.output_compression", "0"); // pour permettre l'affichage au fur et a mesure $timeout = _UPGRADE_TIME_OUT*2; $titre = _T('titre_page_upgrade'); $balise_img = charger_filtre('balise_img'); $titre .= $balise_img(chemin_image('searching.gif')); - echo ( install_debut_html($titre)); + echo(install_debut_html($titre)); // script de rechargement auto sur timeout - $redirect = generer_url_ecrire('upgrade',"reinstall=$installee&meta=$meta&table=$table",true); - echo http_script("window.setTimeout('location.href=\"".$redirect."\";',".($timeout*1000).")"); + $redirect = generer_url_ecrire('upgrade', "reinstall=$installee&meta=$meta&table=$table", true); + echo http_script("window.setTimeout('location.href=\"" . $redirect . "\";'," . ($timeout*1000) . ")"); echo "<div style='text-align: left'>\n"; - ob_flush();flush(); + ob_flush(); + flush(); $done = true; } @@ -293,20 +312,20 @@ function maj_debut_page($installee, $meta, $table){ * avant que la durée d'exécution du script provoque un timeout * * @var int -**/ + **/ define('_UPGRADE_TIME_OUT', 20); /** * Gestion des mises à jour de SPIP et des plugins - * + * * À partir des versions > 1.926 (i.e SPIP > 1.9.2), cette fonction gere les MAJ. - * + * * Se relancer soi-même pour éviter l'interruption pendant une operation SQL * (qu'on espère pas trop longue chacune) évidemment en ecrivant dans la meta * à quel numero on en est. * * Cette fonction peut servir aux plugins qui doivent donner comme arguments : - * + * * 1. le numero de version courant (numéro de version 1.2.3 ou entier) * 2. le numero de version à atteindre (numéro de version 1.2.3 ou entier) * 3. le tableau des instructions de mise à jour à exécuter @@ -323,7 +342,7 @@ define('_UPGRADE_TIME_OUT', 20); * @uses maj_debut_page() * @uses serie_alter() * @uses relance_maj() - * + * * @param string $installee * @param string $cible * @param array $maj @@ -335,12 +354,11 @@ define('_UPGRADE_TIME_OUT', 20); * - tableau (étape, sous-étape) en cas d'échec, * - tableau vide sinon. */ -function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redirect = '', $debut_page = false) -{ +function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redirect = '', $debut_page = false) { # inclusions pour que les procedures d'upgrade disposent des fonctions de base include_spip('base/create'); include_spip('base/abstract_sql'); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); include_spip('inc/plugin'); // pour spip_version_compare $n = 0; $time = time(); @@ -354,37 +372,46 @@ function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redir * * @var int */ - define('_TIME_OUT', $time + _UPGRADE_TIME_OUT); + define('_TIME_OUT', $time+_UPGRADE_TIME_OUT); } reset($maj); - while (list($v,)=each($maj)) { + while (list($v,) = each($maj)) { // si une maj pour cette version - if ($v=='init' OR - (spip_version_compare($v,$installee,'>') - AND spip_version_compare($v,$cible,'<='))) { - if ($debut_page) - maj_debut_page($v,$meta,$table); + if ($v == 'init' OR + (spip_version_compare($v, $installee, '>') + AND spip_version_compare($v, $cible, '<=')) + ) { + if ($debut_page) { + maj_debut_page($v, $meta, $table); + } echo "MAJ $v"; $etape = serie_alter($v, $maj[$v], $meta, $table, $redirect); $trouver_table(''); // vider le cache des descriptions de table # echec sur une etape en cours ? # on sort - if ($etape) return array($v, $etape); - $n = time() - $time; - spip_log( "$table $meta: $v en $n secondes",'maj.'._LOG_INFO_IMPORTANTE); - if ($meta) ecrire_meta($meta, $installee=$v,'oui', $table); + if ($etape) { + return array($v, $etape); + } + $n = time()-$time; + spip_log("$table $meta: $v en $n secondes", 'maj.' . _LOG_INFO_IMPORTANTE); + if ($meta) { + ecrire_meta($meta, $installee = $v, 'oui', $table); + } echo "<br />"; } if (time() >= _TIME_OUT) { - relance_maj($meta,$table,$redirect); + relance_maj($meta, $table, $redirect); } } $trouver_table(''); // vider le cache des descriptions de table // indispensable pour les chgt de versions qui n'ecrivent pas en base // tant pis pour la redondance eventuelle avec ci-dessus - if ($meta) ecrire_meta($meta, $cible,'oui',$table); - spip_log( "MAJ terminee. $meta: $installee",'maj.'._LOG_INFO_IMPORTANTE); + if ($meta) { + ecrire_meta($meta, $cible, 'oui', $table); + } + spip_log("MAJ terminee. $meta: $installee", 'maj.' . _LOG_INFO_IMPORTANTE); + return array(); } @@ -394,7 +421,7 @@ function maj_while($installee, $cible, $maj, $meta = '', $table = 'meta', $redir * Alter crée une copie temporaire d'une table, c'est lourd. * * @uses relance_maj() - * + * * @param string $serie * numero de version upgrade * @param array $q @@ -414,32 +441,34 @@ function serie_alter($serie, $q = array(), $meta = '', $table = 'meta', $redirec if ($i >= $etape) { $msg = "maj $table $meta2 etape $i"; if (is_array($r) - AND function_exists($f = array_shift($r))) { + AND function_exists($f = array_shift($r)) + ) { // note: $r (arguments de la fonction $f) peut avoir des données tabulaires - spip_log( "$msg: $f " . @join(',',$r),'maj.'._LOG_INFO_IMPORTANTE); + spip_log("$msg: $f " . @join(',', $r), 'maj.' . _LOG_INFO_IMPORTANTE); // pour les fonctions atomiques sql_xx // on enregistre le meta avant de lancer la fonction, // de maniere a eviter de boucler sur timeout // mais pour les fonctions complexes, // il faut les rejouer jusqu'a achevement. // C'est a elle d'assurer qu'elles progressent a chaque rappel - if (strncmp($f,"sql_",4)==0) + if (strncmp($f, "sql_", 4) == 0) { ecrire_meta($meta2, $i+1, 'non', $table); + } echo " <span title='$i'>.</span>"; call_user_func_array($f, $r); // si temps imparti depasse, on relance sans ecrire en meta // car on est peut etre sorti sur timeout si c'est une fonction longue if (time() >= _TIME_OUT) { - relance_maj($meta,$table,$redirect); + relance_maj($meta, $table, $redirect); } ecrire_meta($meta2, $i+1, 'non', $table); - spip_log( "$meta2: ok", 'maj.'._LOG_INFO_IMPORTANTE); - } - else { - if (!is_array($r)) - spip_log("maj $i format incorrect","maj."._LOG_ERREUR); - else - spip_log("maj $i fonction $f non definie","maj."._LOG_ERREUR); + spip_log("$meta2: ok", 'maj.' . _LOG_INFO_IMPORTANTE); + } else { + if (!is_array($r)) { + spip_log("maj $i format incorrect", "maj." . _LOG_ERREUR); + } else { + spip_log("maj $i fonction $f non definie", "maj." . _LOG_ERREUR); + } // en cas d'erreur serieuse, on s'arrete // mais on permet de passer par dessus en rechargeant la page. return $i+1; @@ -447,11 +476,11 @@ function serie_alter($serie, $q = array(), $meta = '', $table = 'meta', $redirec } } effacer_meta($meta2, $table); + return 0; } - /** * Mise à jour des types MIME de documents * @@ -463,33 +492,36 @@ function serie_alter($serie, $q = array(), $meta = '', $table = 'meta', $redirec * @example * ``` * $GLOBALS['maj'][1953] = array(array('upgrade_types_documents')); - * + * * ``` * @uses creer_base_types_doc() - * -**/ + * + **/ function upgrade_types_documents() { if (include_spip('base/medias') - AND function_exists('creer_base_types_doc')) + AND function_exists('creer_base_types_doc') + ) { creer_base_types_doc(); + } } /** * Vérifie qu'il est possible d'ajouter une colonne à une table SQL * * @return bool True si possible. -**/ + **/ function upgrade_test() { sql_drop_table("spip_test", true); sql_create("spip_test", array('a' => 'int')); sql_alter("TABLE spip_test ADD b INT"); - sql_insertq('spip_test', array('b' => 1), array('field'=>array('b' => 'int'))); + sql_insertq('spip_test', array('b' => 1), array('field' => array('b' => 'int'))); $result = sql_select('b', "spip_test"); // ne pas garder le resultat de la requete sinon sqlite3 // ne peut pas supprimer la table spip_test lors du sql_alter qui suit // car cette table serait alors 'verouillee' - $result = $result?true:false; + $result = $result ? true : false; sql_alter("TABLE spip_test DROP b"); + return $result; } @@ -499,21 +531,21 @@ function upgrade_test() { * @deprecated Utiliser `maj_plugin()` ou la globale `maj` pour le core. * @see maj_plugin() * @see maj_base() - * + * * @param float $version * @param bool $test * @return void -**/ -function maj_version ($version, $test = true) { + **/ +function maj_version($version, $test = true) { if ($test) { - if ($version>=1.922) + if ($version >= 1.922) { ecrire_meta('version_installee', $version, 'oui'); - else { + } else { // on le fait manuellement, car ecrire_meta utilise le champs impt qui est absent sur les vieilles versions $GLOBALS['meta']['version_installee'] = $version; - sql_updateq('spip_meta', array('valeur' => $version), "nom=" . sql_quote('version_installee') ); + sql_updateq('spip_meta', array('valeur' => $version), "nom=" . sql_quote('version_installee')); } - spip_log( "mise a jour de la base en $version","maj."._LOG_INFO_IMPORTANTE); + spip_log("mise a jour de la base en $version", "maj." . _LOG_INFO_IMPORTANTE); } else { echo _T('alerte_maj_impossible', array('version' => $version)); exit; @@ -526,15 +558,16 @@ function maj_version ($version, $test = true) { * @deprecated Utiliser `maj_plugin()` ou la globale `maj` pour le core. * @see maj_plugin() * @see maj_base() - * + * * @param float $version * @param float $version_installee * @param int $version_cible * @return bool true si la mise à jour doit se réaliser -**/ -function upgrade_vers($version, $version_installee, $version_cible = 0){ - return ($version_installee<$version - AND (($version_cible>=$version) OR ($version_cible==0)) + **/ +function upgrade_vers($version, $version_installee, $version_cible = 0) { + return ($version_installee < $version + AND (($version_cible >= $version) OR ($version_cible == 0)) ); } + ?> diff --git a/ecrire/charsets/cp1250.php b/ecrire/charsets/cp1250.php index 612b2353ff..5be3df8ecb 100644 --- a/ecrire/charsets/cp1250.php +++ b/ecrire/charsets/cp1250.php @@ -7,50 +7,132 @@ * @link http://www.unicode.org/Public/MAPPINGS/VENDORS/MICSFT/WINDOWS/CP1250.TXT * * @package SPIP\Core\Charsets -**/ + **/ -$GLOBALS['CHARSET']['cp1250'] = array ( -0x80 => 0x20AC, 0x82 => 0x201A, -0x84 => 0x201E, 0x85 => 0x2026, 0x86 => 0x2020, -0x87 => 0x2021, 0x89 => 0x2030, 0x8A => 0x0160, -0x8B => 0x2039, 0x8C => 0x015A, 0x8D => 0x0164, -0x8E => 0x017D, 0x8F => 0x0179, 0x91 => 0x2018, -0x92 => 0x2019, 0x93 => 0x201C, 0x94 => 0x201D, -0x95 => 0x2022, 0x96 => 0x2013, 0x97 => 0x2014, -0x99 => 0x2122, 0x9A => 0x0161, 0x9B => 0x203A, -0x9C => 0x015B, 0x9D => 0x0165, 0x9E => 0x017E, -0x9F => 0x017A, 0xA0 => 0x00A0, 0xA1 => 0x02C7, -0xA2 => 0x02D8, 0xA3 => 0x0141, 0xA4 => 0x00A4, -0xA5 => 0x0104, 0xA6 => 0x00A6, 0xA7 => 0x00A7, -0xA8 => 0x00A8, 0xA9 => 0x00A9, 0xAA => 0x015E, -0xAB => 0x00AB, 0xAC => 0x00AC, 0xAD => 0x00AD, -0xAE => 0x00AE, 0xAF => 0x017B, 0xB0 => 0x00B0, -0xB1 => 0x00B1, 0xB2 => 0x02DB, 0xB3 => 0x0142, -0xB4 => 0x00B4, 0xB5 => 0x00B5, 0xB6 => 0x00B6, -0xB7 => 0x00B7, 0xB8 => 0x00B8, 0xB9 => 0x0105, -0xBA => 0x015F, 0xBB => 0x00BB, 0xBC => 0x013D, -0xBD => 0x02DD, 0xBE => 0x013E, 0xBF => 0x017C, -0xC0 => 0x0154, 0xC1 => 0x00C1, 0xC2 => 0x00C2, -0xC3 => 0x0102, 0xC4 => 0x00C4, 0xC5 => 0x0139, -0xC6 => 0x0106, 0xC7 => 0x00C7, 0xC8 => 0x010C, -0xC9 => 0x00C9, 0xCA => 0x0118, 0xCB => 0x00CB, -0xCC => 0x011A, 0xCD => 0x00CD, 0xCE => 0x00CE, -0xCF => 0x010E, 0xD0 => 0x0110, 0xD1 => 0x0143, -0xD2 => 0x0147, 0xD3 => 0x00D3, 0xD4 => 0x00D4, -0xD5 => 0x0150, 0xD6 => 0x00D6, 0xD7 => 0x00D7, -0xD8 => 0x0158, 0xD9 => 0x016E, 0xDA => 0x00DA, -0xDB => 0x0170, 0xDC => 0x00DC, 0xDD => 0x00DD, -0xDE => 0x0162, 0xDF => 0x00DF, 0xE0 => 0x0155, -0xE1 => 0x00E1, 0xE2 => 0x00E2, 0xE3 => 0x0103, -0xE4 => 0x00E4, 0xE5 => 0x013A, 0xE6 => 0x0107, -0xE7 => 0x00E7, 0xE8 => 0x010D, 0xE9 => 0x00E9, -0xEA => 0x0119, 0xEB => 0x00EB, 0xEC => 0x011B, -0xED => 0x00ED, 0xEE => 0x00EE, 0xEF => 0x010F, -0xF0 => 0x0111, 0xF1 => 0x0144, 0xF2 => 0x0148, -0xF3 => 0x00F3, 0xF4 => 0x00F4, 0xF5 => 0x0151, -0xF6 => 0x00F6, 0xF7 => 0x00F7, 0xF8 => 0x0159, -0xF9 => 0x016F, 0xFA => 0x00FA, 0xFB => 0x0171, -0xFC => 0x00FC, 0xFD => 0x00FD, 0xFE => 0x0163, -0xFF => 0x02D9 ); +$GLOBALS['CHARSET']['cp1250'] = array( + 0x80 => 0x20AC, + 0x82 => 0x201A, + 0x84 => 0x201E, + 0x85 => 0x2026, + 0x86 => 0x2020, + 0x87 => 0x2021, + 0x89 => 0x2030, + 0x8A => 0x0160, + 0x8B => 0x2039, + 0x8C => 0x015A, + 0x8D => 0x0164, + 0x8E => 0x017D, + 0x8F => 0x0179, + 0x91 => 0x2018, + 0x92 => 0x2019, + 0x93 => 0x201C, + 0x94 => 0x201D, + 0x95 => 0x2022, + 0x96 => 0x2013, + 0x97 => 0x2014, + 0x99 => 0x2122, + 0x9A => 0x0161, + 0x9B => 0x203A, + 0x9C => 0x015B, + 0x9D => 0x0165, + 0x9E => 0x017E, + 0x9F => 0x017A, + 0xA0 => 0x00A0, + 0xA1 => 0x02C7, + 0xA2 => 0x02D8, + 0xA3 => 0x0141, + 0xA4 => 0x00A4, + 0xA5 => 0x0104, + 0xA6 => 0x00A6, + 0xA7 => 0x00A7, + 0xA8 => 0x00A8, + 0xA9 => 0x00A9, + 0xAA => 0x015E, + 0xAB => 0x00AB, + 0xAC => 0x00AC, + 0xAD => 0x00AD, + 0xAE => 0x00AE, + 0xAF => 0x017B, + 0xB0 => 0x00B0, + 0xB1 => 0x00B1, + 0xB2 => 0x02DB, + 0xB3 => 0x0142, + 0xB4 => 0x00B4, + 0xB5 => 0x00B5, + 0xB6 => 0x00B6, + 0xB7 => 0x00B7, + 0xB8 => 0x00B8, + 0xB9 => 0x0105, + 0xBA => 0x015F, + 0xBB => 0x00BB, + 0xBC => 0x013D, + 0xBD => 0x02DD, + 0xBE => 0x013E, + 0xBF => 0x017C, + 0xC0 => 0x0154, + 0xC1 => 0x00C1, + 0xC2 => 0x00C2, + 0xC3 => 0x0102, + 0xC4 => 0x00C4, + 0xC5 => 0x0139, + 0xC6 => 0x0106, + 0xC7 => 0x00C7, + 0xC8 => 0x010C, + 0xC9 => 0x00C9, + 0xCA => 0x0118, + 0xCB => 0x00CB, + 0xCC => 0x011A, + 0xCD => 0x00CD, + 0xCE => 0x00CE, + 0xCF => 0x010E, + 0xD0 => 0x0110, + 0xD1 => 0x0143, + 0xD2 => 0x0147, + 0xD3 => 0x00D3, + 0xD4 => 0x00D4, + 0xD5 => 0x0150, + 0xD6 => 0x00D6, + 0xD7 => 0x00D7, + 0xD8 => 0x0158, + 0xD9 => 0x016E, + 0xDA => 0x00DA, + 0xDB => 0x0170, + 0xDC => 0x00DC, + 0xDD => 0x00DD, + 0xDE => 0x0162, + 0xDF => 0x00DF, + 0xE0 => 0x0155, + 0xE1 => 0x00E1, + 0xE2 => 0x00E2, + 0xE3 => 0x0103, + 0xE4 => 0x00E4, + 0xE5 => 0x013A, + 0xE6 => 0x0107, + 0xE7 => 0x00E7, + 0xE8 => 0x010D, + 0xE9 => 0x00E9, + 0xEA => 0x0119, + 0xEB => 0x00EB, + 0xEC => 0x011B, + 0xED => 0x00ED, + 0xEE => 0x00EE, + 0xEF => 0x010F, + 0xF0 => 0x0111, + 0xF1 => 0x0144, + 0xF2 => 0x0148, + 0xF3 => 0x00F3, + 0xF4 => 0x00F4, + 0xF5 => 0x0151, + 0xF6 => 0x00F6, + 0xF7 => 0x00F7, + 0xF8 => 0x0159, + 0xF9 => 0x016F, + 0xFA => 0x00FA, + 0xFB => 0x0171, + 0xFC => 0x00FC, + 0xFD => 0x00FD, + 0xFE => 0x0163, + 0xFF => 0x02D9 +); ?> diff --git a/ecrire/charsets/cp1251.php b/ecrire/charsets/cp1251.php index 92807eb70a..88ba75f1a2 100644 --- a/ecrire/charsets/cp1251.php +++ b/ecrire/charsets/cp1251.php @@ -6,34 +6,136 @@ * @link http://czyborra.com/charsets/cyrillic.html * * @package SPIP\Core\Charsets -**/ + **/ -$GLOBALS['CHARSET']['cp1251'] = array ( -0x80=>0x0402, 0x81=>0x0403, 0x82=>0x201A, 0x83=>0x0453, 0x84=>0x201E, -0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x20AC, 0x89=>0x2030, -0x8A=>0x0409, 0x8B=>0x2039, 0x8C=>0x040A, 0x8D=>0x040C, 0x8E=>0x040B, -0x8F=>0x040F, 0x90=>0x0452, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C, -0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x99=>0x2122, -0x9A=>0x0459, 0x9B=>0x203A, 0x9C=>0x045A, 0x9D=>0x045C, 0x9E=>0x045B, -0x9F=>0x045F, 0xA0=>0x00A0, 0xA1=>0x040E, 0xA2=>0x045E, 0xA3=>0x0408, -0xA4=>0x00A4, 0xA5=>0x0490, 0xA6=>0x00A6, 0xA7=>0x00A7, 0xA8=>0x0401, -0xA9=>0x00A9, 0xAA=>0x0404, 0xAB=>0x00AB, 0xAC=>0x00AC, 0xAD=>0x00AD, -0xAE=>0x00AE, 0xAF=>0x0407, 0xB0=>0x00B0, 0xB1=>0x00B1, 0xB2=>0x0406, -0xB3=>0x0456, 0xB4=>0x0491, 0xB5=>0x00B5, 0xB6=>0x00B6, 0xB7=>0x00B7, -0xB8=>0x0451, 0xB9=>0x2116, 0xBA=>0x0454, 0xBB=>0x00BB, 0xBC=>0x0458, -0xBD=>0x0405, 0xBE=>0x0455, 0xBF=>0x0457, 0xC0=>0x0410, 0xC1=>0x0411, -0xC2=>0x0412, 0xC3=>0x0413, 0xC4=>0x0414, 0xC5=>0x0415, 0xC6=>0x0416, -0xC7=>0x0417, 0xC8=>0x0418, 0xC9=>0x0419, 0xCA=>0x041A, 0xCB=>0x041B, -0xCC=>0x041C, 0xCD=>0x041D, 0xCE=>0x041E, 0xCF=>0x041F, 0xD0=>0x0420, -0xD1=>0x0421, 0xD2=>0x0422, 0xD3=>0x0423, 0xD4=>0x0424, 0xD5=>0x0425, -0xD6=>0x0426, 0xD7=>0x0427, 0xD8=>0x0428, 0xD9=>0x0429, 0xDA=>0x042A, -0xDB=>0x042B, 0xDC=>0x042C, 0xDD=>0x042D, 0xDE=>0x042E, 0xDF=>0x042F, -0xE0=>0x0430, 0xE1=>0x0431, 0xE2=>0x0432, 0xE3=>0x0433, 0xE4=>0x0434, -0xE5=>0x0435, 0xE6=>0x0436, 0xE7=>0x0437, 0xE8=>0x0438, 0xE9=>0x0439, -0xEA=>0x043A, 0xEB=>0x043B, 0xEC=>0x043C, 0xED=>0x043D, 0xEE=>0x043E, -0xEF=>0x043F, 0xF0=>0x0440, 0xF1=>0x0441, 0xF2=>0x0442, 0xF3=>0x0443, -0xF4=>0x0444, 0xF5=>0x0445, 0xF6=>0x0446, 0xF7=>0x0447, 0xF8=>0x0448, -0xF9=>0x0449, 0xFA=>0x044A, 0xFB=>0x044B, 0xFC=>0x044C, 0xFD=>0x044D, -0xFE=>0x044E, 0xFF=>0x044F); +$GLOBALS['CHARSET']['cp1251'] = array( + 0x80 => 0x0402, + 0x81 => 0x0403, + 0x82 => 0x201A, + 0x83 => 0x0453, + 0x84 => 0x201E, + 0x85 => 0x2026, + 0x86 => 0x2020, + 0x87 => 0x2021, + 0x88 => 0x20AC, + 0x89 => 0x2030, + 0x8A => 0x0409, + 0x8B => 0x2039, + 0x8C => 0x040A, + 0x8D => 0x040C, + 0x8E => 0x040B, + 0x8F => 0x040F, + 0x90 => 0x0452, + 0x91 => 0x2018, + 0x92 => 0x2019, + 0x93 => 0x201C, + 0x94 => 0x201D, + 0x95 => 0x2022, + 0x96 => 0x2013, + 0x97 => 0x2014, + 0x99 => 0x2122, + 0x9A => 0x0459, + 0x9B => 0x203A, + 0x9C => 0x045A, + 0x9D => 0x045C, + 0x9E => 0x045B, + 0x9F => 0x045F, + 0xA0 => 0x00A0, + 0xA1 => 0x040E, + 0xA2 => 0x045E, + 0xA3 => 0x0408, + 0xA4 => 0x00A4, + 0xA5 => 0x0490, + 0xA6 => 0x00A6, + 0xA7 => 0x00A7, + 0xA8 => 0x0401, + 0xA9 => 0x00A9, + 0xAA => 0x0404, + 0xAB => 0x00AB, + 0xAC => 0x00AC, + 0xAD => 0x00AD, + 0xAE => 0x00AE, + 0xAF => 0x0407, + 0xB0 => 0x00B0, + 0xB1 => 0x00B1, + 0xB2 => 0x0406, + 0xB3 => 0x0456, + 0xB4 => 0x0491, + 0xB5 => 0x00B5, + 0xB6 => 0x00B6, + 0xB7 => 0x00B7, + 0xB8 => 0x0451, + 0xB9 => 0x2116, + 0xBA => 0x0454, + 0xBB => 0x00BB, + 0xBC => 0x0458, + 0xBD => 0x0405, + 0xBE => 0x0455, + 0xBF => 0x0457, + 0xC0 => 0x0410, + 0xC1 => 0x0411, + 0xC2 => 0x0412, + 0xC3 => 0x0413, + 0xC4 => 0x0414, + 0xC5 => 0x0415, + 0xC6 => 0x0416, + 0xC7 => 0x0417, + 0xC8 => 0x0418, + 0xC9 => 0x0419, + 0xCA => 0x041A, + 0xCB => 0x041B, + 0xCC => 0x041C, + 0xCD => 0x041D, + 0xCE => 0x041E, + 0xCF => 0x041F, + 0xD0 => 0x0420, + 0xD1 => 0x0421, + 0xD2 => 0x0422, + 0xD3 => 0x0423, + 0xD4 => 0x0424, + 0xD5 => 0x0425, + 0xD6 => 0x0426, + 0xD7 => 0x0427, + 0xD8 => 0x0428, + 0xD9 => 0x0429, + 0xDA => 0x042A, + 0xDB => 0x042B, + 0xDC => 0x042C, + 0xDD => 0x042D, + 0xDE => 0x042E, + 0xDF => 0x042F, + 0xE0 => 0x0430, + 0xE1 => 0x0431, + 0xE2 => 0x0432, + 0xE3 => 0x0433, + 0xE4 => 0x0434, + 0xE5 => 0x0435, + 0xE6 => 0x0436, + 0xE7 => 0x0437, + 0xE8 => 0x0438, + 0xE9 => 0x0439, + 0xEA => 0x043A, + 0xEB => 0x043B, + 0xEC => 0x043C, + 0xED => 0x043D, + 0xEE => 0x043E, + 0xEF => 0x043F, + 0xF0 => 0x0440, + 0xF1 => 0x0441, + 0xF2 => 0x0442, + 0xF3 => 0x0443, + 0xF4 => 0x0444, + 0xF5 => 0x0445, + 0xF6 => 0x0446, + 0xF7 => 0x0447, + 0xF8 => 0x0448, + 0xF9 => 0x0449, + 0xFA => 0x044A, + 0xFB => 0x044B, + 0xFC => 0x044C, + 0xFD => 0x044D, + 0xFE => 0x044E, + 0xFF => 0x044F +); ?> diff --git a/ecrire/charsets/cp1256.php b/ecrire/charsets/cp1256.php index d026cd9eec..ff62ce4c6a 100644 --- a/ecrire/charsets/cp1256.php +++ b/ecrire/charsets/cp1256.php @@ -7,34 +7,137 @@ * @link http://www.microsoft.com/typography/unicode/1256.htm * * @package SPIP\Core\Charsets -**/ + **/ -$GLOBALS['CHARSET']['cp1256'] = array ( -0x80=>0x20AC, 0x81=>0x067E, 0x82=>0x201A, 0x83=>0x0192, 0x84=>0x201E, -0x85=>0x2026, 0x86=>0x2020, 0x87=>0x2021, 0x88=>0x02C6, 0x89=>0x2030, -0x8A=>0x0679, 0x8B=>0x2039, 0x8C=>0x0152, 0x8D=>0x0686, 0x8E=>0x0698, -0x8F=>0x0688, 0x90=>0x06AF, 0x91=>0x2018, 0x92=>0x2019, 0x93=>0x201C, -0x94=>0x201D, 0x95=>0x2022, 0x96=>0x2013, 0x97=>0x2014, 0x98=>0x06A9, -0x99=>0x2122, 0x9A=>0x0691, 0x9B=>0x203A, 0x9C=>0x0153, 0x9D=>0x200C, -0x9E=>0x200D, 0x9F=>0x06BA, 0xA0=>0x00A0, 0xA1=>0x060C, 0xA2=>0x00A2, -0xA3=>0x00A3, 0xA4=>0x00A4, 0xA5=>0x00A5, 0xA6=>0x00A6, 0xA7=>0x00A7, -0xA8=>0x00A8, 0xA9=>0x00A9, 0xAA=>0x06BE, 0xAB=>0x00AB, 0xAC=>0x00AC, -0xAD=>0x00AD, 0xAE=>0x00AE, 0xAF=>0x00AF, 0xB0=>0x00B0, 0xB1=>0x00B1, -0xB2=>0x00B2, 0xB3=>0x00B3, 0xB4=>0x00B4, 0xB5=>0x00B5, 0xB6=>0x00B6, -0xB7=>0x00B7, 0xB8=>0x00B8, 0xB9=>0x00B9, 0xBA=>0x061B, 0xBB=>0x00BB, -0xBC=>0x00BC, 0xBD=>0x00BD, 0xBE=>0x00BE, 0xBF=>0x061F, 0xC0=>0x06C1, -0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624, 0xC5=>0x0625, -0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629, 0xCA=>0x062A, -0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E, 0xCF=>0x062F, -0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633, 0xD4=>0x0634, -0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x00D7, 0xD8=>0x0637, 0xD9=>0x0638, -0xDA=>0x0639, 0xDB=>0x063A, 0xDC=>0x0640, 0xDD=>0x0641, 0xDE=>0x0642, -0xDF=>0x0643, 0xE0=>0x00E0, 0xE1=>0x0644, 0xE2=>0x00E2, 0xE3=>0x0645, -0xE4=>0x0646, 0xE5=>0x0647, 0xE6=>0x0648, 0xE7=>0x00E7, 0xE8=>0x00E8, -0xE9=>0x00E9, 0xEA=>0x00EA, 0xEB=>0x00EB, 0xEC=>0x0649, 0xED=>0x064A, -0xEE=>0x00EE, 0xEF=>0x00EF, 0xF0=>0x064B, 0xF1=>0x064C, 0xF2=>0x064D, -0xF3=>0x064E, 0xF4=>0x00F4, 0xF5=>0x064F, 0xF6=>0x0650, 0xF7=>0x00F7, -0xF8=>0x0651, 0xF9=>0x00F9, 0xFA=>0x0652, 0xFB=>0x00FB, 0xFC=>0x00FC, -0xFD=>0x200E, 0xFE=>0x200F, 0xFF=>0x06D2); +$GLOBALS['CHARSET']['cp1256'] = array( + 0x80 => 0x20AC, + 0x81 => 0x067E, + 0x82 => 0x201A, + 0x83 => 0x0192, + 0x84 => 0x201E, + 0x85 => 0x2026, + 0x86 => 0x2020, + 0x87 => 0x2021, + 0x88 => 0x02C6, + 0x89 => 0x2030, + 0x8A => 0x0679, + 0x8B => 0x2039, + 0x8C => 0x0152, + 0x8D => 0x0686, + 0x8E => 0x0698, + 0x8F => 0x0688, + 0x90 => 0x06AF, + 0x91 => 0x2018, + 0x92 => 0x2019, + 0x93 => 0x201C, + 0x94 => 0x201D, + 0x95 => 0x2022, + 0x96 => 0x2013, + 0x97 => 0x2014, + 0x98 => 0x06A9, + 0x99 => 0x2122, + 0x9A => 0x0691, + 0x9B => 0x203A, + 0x9C => 0x0153, + 0x9D => 0x200C, + 0x9E => 0x200D, + 0x9F => 0x06BA, + 0xA0 => 0x00A0, + 0xA1 => 0x060C, + 0xA2 => 0x00A2, + 0xA3 => 0x00A3, + 0xA4 => 0x00A4, + 0xA5 => 0x00A5, + 0xA6 => 0x00A6, + 0xA7 => 0x00A7, + 0xA8 => 0x00A8, + 0xA9 => 0x00A9, + 0xAA => 0x06BE, + 0xAB => 0x00AB, + 0xAC => 0x00AC, + 0xAD => 0x00AD, + 0xAE => 0x00AE, + 0xAF => 0x00AF, + 0xB0 => 0x00B0, + 0xB1 => 0x00B1, + 0xB2 => 0x00B2, + 0xB3 => 0x00B3, + 0xB4 => 0x00B4, + 0xB5 => 0x00B5, + 0xB6 => 0x00B6, + 0xB7 => 0x00B7, + 0xB8 => 0x00B8, + 0xB9 => 0x00B9, + 0xBA => 0x061B, + 0xBB => 0x00BB, + 0xBC => 0x00BC, + 0xBD => 0x00BD, + 0xBE => 0x00BE, + 0xBF => 0x061F, + 0xC0 => 0x06C1, + 0xC1 => 0x0621, + 0xC2 => 0x0622, + 0xC3 => 0x0623, + 0xC4 => 0x0624, + 0xC5 => 0x0625, + 0xC6 => 0x0626, + 0xC7 => 0x0627, + 0xC8 => 0x0628, + 0xC9 => 0x0629, + 0xCA => 0x062A, + 0xCB => 0x062B, + 0xCC => 0x062C, + 0xCD => 0x062D, + 0xCE => 0x062E, + 0xCF => 0x062F, + 0xD0 => 0x0630, + 0xD1 => 0x0631, + 0xD2 => 0x0632, + 0xD3 => 0x0633, + 0xD4 => 0x0634, + 0xD5 => 0x0635, + 0xD6 => 0x0636, + 0xD7 => 0x00D7, + 0xD8 => 0x0637, + 0xD9 => 0x0638, + 0xDA => 0x0639, + 0xDB => 0x063A, + 0xDC => 0x0640, + 0xDD => 0x0641, + 0xDE => 0x0642, + 0xDF => 0x0643, + 0xE0 => 0x00E0, + 0xE1 => 0x0644, + 0xE2 => 0x00E2, + 0xE3 => 0x0645, + 0xE4 => 0x0646, + 0xE5 => 0x0647, + 0xE6 => 0x0648, + 0xE7 => 0x00E7, + 0xE8 => 0x00E8, + 0xE9 => 0x00E9, + 0xEA => 0x00EA, + 0xEB => 0x00EB, + 0xEC => 0x0649, + 0xED => 0x064A, + 0xEE => 0x00EE, + 0xEF => 0x00EF, + 0xF0 => 0x064B, + 0xF1 => 0x064C, + 0xF2 => 0x064D, + 0xF3 => 0x064E, + 0xF4 => 0x00F4, + 0xF5 => 0x064F, + 0xF6 => 0x0650, + 0xF7 => 0x00F7, + 0xF8 => 0x0651, + 0xF9 => 0x00F9, + 0xFA => 0x0652, + 0xFB => 0x00FB, + 0xFC => 0x00FC, + 0xFD => 0x200E, + 0xFE => 0x200F, + 0xFF => 0x06D2 +); ?> diff --git a/ecrire/charsets/html.php b/ecrire/charsets/html.php index b00b47e660..55208ce403 100644 --- a/ecrire/charsets/html.php +++ b/ecrire/charsets/html.php @@ -3,38 +3,125 @@ /** * Déclaration des entités HTML (à completer éventuellement) et leur correspondances * en écriture unicode - * + * * @package SPIP\Core\Charsets -**/ + **/ -$GLOBALS['CHARSET']['html'] = array ( -'ldquo'=>'“', 'rdquo'=>'”', 'bdquo'=>'„', 'cent'=>'¢', 'pound'=>'£', -'curren'=>'¤', 'yen'=>'¥', 'brvbar'=>'¦', 'sect'=>'§', -'uml'=>'¨', 'ordf'=>'ª', 'laquo'=>'«', 'lsquo'=>'‘', 'rsquo'=>'’', 'not'=>'¬', -'shy'=>'­', 'macr'=>'¯', 'deg'=>'°', 'plusmn'=>'±', -'sup2'=>'²', 'sup3'=>'³', 'acute'=>'´', 'micro'=>'µ', -'para'=>'¶', 'middot'=>'·', 'cedil'=>'¸', 'sup1'=>'¹', -'ordm'=>'º', 'raquo'=>'»', 'iquest'=>'¿', 'Agrave'=>'À', -'Aacute'=>'Á', 'Acirc'=>'Â', 'Atilde'=>'Ã', 'Auml'=>'Ä', -'Aring'=>'Å', 'AElig'=>'Æ', 'Ccedil'=>'Ç', 'Egrave'=>'È', -'Eacute'=>'É', 'Ecirc'=>'Ê', 'Euml'=>'Ë', 'Igrave'=>'Ì', -'Iacute'=>'Í', 'Icirc'=>'Î', 'Iuml'=>'Ï', 'ETH'=>'Ð', -'Ntilde'=>'Ñ', 'Ograve'=>'Ò', 'Oacute'=>'Ó', 'Ocirc'=>'Ô', -'Otilde'=>'Õ', 'Ouml'=>'Ö', 'times'=>'×', 'Oslash'=>'Ø', -'Ugrave'=>'Ù', 'Uacute'=>'Ú', 'Ucirc'=>'Û', 'Uuml'=>'Ü', -'Yacute'=>'Ý', 'THORN'=>'Þ', 'szlig'=>'ß', 'agrave'=>'à', -'Scaron'=>'Š', 'scaron'=>'š', 'zcaron'=>'ž', 'Zcaron'=>'Ž', -'aacute'=>'á', 'acirc'=>'â', 'atilde'=>'ã', 'auml'=>'ä', -'aring'=>'å', 'aelig'=>'æ', 'ccedil'=>'ç', 'egrave'=>'è', -'eacute'=>'é', 'ecirc'=>'ê', 'euml'=>'ë', 'igrave'=>'ì', -'iacute'=>'í', 'icirc'=>'î', 'iuml'=>'ï', 'eth'=>'ð', -'ntilde'=>'ñ', 'ograve'=>'ò', 'oacute'=>'ó', 'ocirc'=>'ô', -'otilde'=>'õ', 'ouml'=>'ö', 'divide'=>'÷', 'oslash'=>'ø', -'ugrave'=>'ù', 'uacute'=>'ú', 'ucirc'=>'û', 'uuml'=>'ü', -'yacute'=>'ý', 'thorn'=>'þ', 'nbsp' => " ", 'thinsp' =>' ', 'ensp' =>' ', 'emsp' =>' ', 'copy' => "(c)", -'reg' => "(r)", 'frac14' => "1/4", 'frac12' => "1/2", 'frac34' => "3/4", -'apos' => "'", 'mdash' => '—', 'ndash' => '–', 'hellip' =>'…', -'euro' => '€', 'OElig' => 'Œ', 'oelig' => 'œ','iexcl' => '¡' +$GLOBALS['CHARSET']['html'] = array( + 'ldquo' => '“', + 'rdquo' => '”', + 'bdquo' => '„', + 'cent' => '¢', + 'pound' => '£', + 'curren' => '¤', + 'yen' => '¥', + 'brvbar' => '¦', + 'sect' => '§', + 'uml' => '¨', + 'ordf' => 'ª', + 'laquo' => '«', + 'lsquo' => '‘', + 'rsquo' => '’', + 'not' => '¬', + 'shy' => '­', + 'macr' => '¯', + 'deg' => '°', + 'plusmn' => '±', + 'sup2' => '²', + 'sup3' => '³', + 'acute' => '´', + 'micro' => 'µ', + 'para' => '¶', + 'middot' => '·', + 'cedil' => '¸', + 'sup1' => '¹', + 'ordm' => 'º', + 'raquo' => '»', + 'iquest' => '¿', + 'Agrave' => 'À', + 'Aacute' => 'Á', + 'Acirc' => 'Â', + 'Atilde' => 'Ã', + 'Auml' => 'Ä', + 'Aring' => 'Å', + 'AElig' => 'Æ', + 'Ccedil' => 'Ç', + 'Egrave' => 'È', + 'Eacute' => 'É', + 'Ecirc' => 'Ê', + 'Euml' => 'Ë', + 'Igrave' => 'Ì', + 'Iacute' => 'Í', + 'Icirc' => 'Î', + 'Iuml' => 'Ï', + 'ETH' => 'Ð', + 'Ntilde' => 'Ñ', + 'Ograve' => 'Ò', + 'Oacute' => 'Ó', + 'Ocirc' => 'Ô', + 'Otilde' => 'Õ', + 'Ouml' => 'Ö', + 'times' => '×', + 'Oslash' => 'Ø', + 'Ugrave' => 'Ù', + 'Uacute' => 'Ú', + 'Ucirc' => 'Û', + 'Uuml' => 'Ü', + 'Yacute' => 'Ý', + 'THORN' => 'Þ', + 'szlig' => 'ß', + 'agrave' => 'à', + 'Scaron' => 'Š', + 'scaron' => 'š', + 'zcaron' => 'ž', + 'Zcaron' => 'Ž', + 'aacute' => 'á', + 'acirc' => 'â', + 'atilde' => 'ã', + 'auml' => 'ä', + 'aring' => 'å', + 'aelig' => 'æ', + 'ccedil' => 'ç', + 'egrave' => 'è', + 'eacute' => 'é', + 'ecirc' => 'ê', + 'euml' => 'ë', + 'igrave' => 'ì', + 'iacute' => 'í', + 'icirc' => 'î', + 'iuml' => 'ï', + 'eth' => 'ð', + 'ntilde' => 'ñ', + 'ograve' => 'ò', + 'oacute' => 'ó', + 'ocirc' => 'ô', + 'otilde' => 'õ', + 'ouml' => 'ö', + 'divide' => '÷', + 'oslash' => 'ø', + 'ugrave' => 'ù', + 'uacute' => 'ú', + 'ucirc' => 'û', + 'uuml' => 'ü', + 'yacute' => 'ý', + 'thorn' => 'þ', + 'nbsp' => " ", + 'thinsp' => ' ', + 'ensp' => ' ', + 'emsp' => ' ', + 'copy' => "(c)", + 'reg' => "(r)", + 'frac14' => "1/4", + 'frac12' => "1/2", + 'frac34' => "3/4", + 'apos' => "'", + 'mdash' => '—', + 'ndash' => '–', + 'hellip' => '…', + 'euro' => '€', + 'OElig' => 'Œ', + 'oelig' => 'œ', + 'iexcl' => '¡' ); diff --git a/ecrire/charsets/iso-8859-1.php b/ecrire/charsets/iso-8859-1.php index b61b6bae38..b627cd6c7a 100644 --- a/ecrire/charsets/iso-8859-1.php +++ b/ecrire/charsets/iso-8859-1.php @@ -4,31 +4,142 @@ * Déclaration des correspondances entre charsets iso-8859-1 et unicode * * @package SPIP\Core\Charsets -**/ + **/ -$GLOBALS['CHARSET']['iso-8859-1'] = array ( +$GLOBALS['CHARSET']['iso-8859-1'] = array( // plage invalide en iso-8859-1 mais souvent utilisee quand meme (windows) // cf. http://openweb.eu.org/articles/caracteres_illegaux/ // voir aussi copie de ces valeurs dans inc/charsets.php -128=>8364, 129=>129 /* ?? */, 130=>8218, 131=>402, 132=>8222, 133=>8230, -134=>8224, 135=>8225, 136=>710, 137=>8240, 138=>352, 139=>8249, 140=>338, -141=>141 /* ?? */, 142=>381, 143=>143 /* ?? */, 144=>144 /* ?? */, 145=>8216, -146=>8217, 147=>8220, 148=>8221, 149=>8226, 150=>8211, 151=>8212, 152=>732, -153=>8482, 154=>353, 155=>8250, 156=>339, 157=>157 /* ?? */, 158=>382, 159=>376, + 128 => 8364, + 129 => 129 /* ?? */, + 130 => 8218, + 131 => 402, + 132 => 8222, + 133 => 8230, + 134 => 8224, + 135 => 8225, + 136 => 710, + 137 => 8240, + 138 => 352, + 139 => 8249, + 140 => 338, + 141 => 141 /* ?? */, + 142 => 381, + 143 => 143 /* ?? */, + 144 => 144 /* ?? */, + 145 => 8216, + 146 => 8217, + 147 => 8220, + 148 => 8221, + 149 => 8226, + 150 => 8211, + 151 => 8212, + 152 => 732, + 153 => 8482, + 154 => 353, + 155 => 8250, + 156 => 339, + 157 => 157 /* ?? */, + 158 => 382, + 159 => 376, -160=>160, 161=>161, 162=>162, 163=>163, 164=>164, 165=>165, 166=>166, 167=>167, -168=>168, 169=>169, 170=>170, 171=>171, 172=>172, 173=>173, 174=>174, 175=>175, -176=>176, 177=>177, 178=>178, 179=>179, 180=>180, 181=>181, 182=>182, 183=>183, -184=>184, 185=>185, 186=>186, 187=>187, 188=>188, 189=>189, 190=>190, 191=>191, -192=>192, 193=>193, 194=>194, 195=>195, 196=>196, 197=>197, 198=>198, 199=>199, -200=>200, 201=>201, 202=>202, 203=>203, 204=>204, 205=>205, 206=>206, 207=>207, -208=>208, 209=>209, 210=>210, 211=>211, 212=>212, 213=>213, 214=>214, 215=>215, -216=>216, 217=>217, 218=>218, 219=>219, 220=>220, 221=>221, 222=>222, 223=>223, -224=>224, 225=>225, 226=>226, 227=>227, 228=>228, 229=>229, 230=>230, 231=>231, -232=>232, 233=>233, 234=>234, 235=>235, 236=>236, 237=>237, 238=>238, 239=>239, -240=>240, 241=>241, 242=>242, 243=>243, 244=>244, 245=>245, 246=>246, 247=>247, -248=>248, 249=>249, 250=>250, 251=>251, 252=>252, 253=>253, 254=>254, 255=>255 + 160 => 160, + 161 => 161, + 162 => 162, + 163 => 163, + 164 => 164, + 165 => 165, + 166 => 166, + 167 => 167, + 168 => 168, + 169 => 169, + 170 => 170, + 171 => 171, + 172 => 172, + 173 => 173, + 174 => 174, + 175 => 175, + 176 => 176, + 177 => 177, + 178 => 178, + 179 => 179, + 180 => 180, + 181 => 181, + 182 => 182, + 183 => 183, + 184 => 184, + 185 => 185, + 186 => 186, + 187 => 187, + 188 => 188, + 189 => 189, + 190 => 190, + 191 => 191, + 192 => 192, + 193 => 193, + 194 => 194, + 195 => 195, + 196 => 196, + 197 => 197, + 198 => 198, + 199 => 199, + 200 => 200, + 201 => 201, + 202 => 202, + 203 => 203, + 204 => 204, + 205 => 205, + 206 => 206, + 207 => 207, + 208 => 208, + 209 => 209, + 210 => 210, + 211 => 211, + 212 => 212, + 213 => 213, + 214 => 214, + 215 => 215, + 216 => 216, + 217 => 217, + 218 => 218, + 219 => 219, + 220 => 220, + 221 => 221, + 222 => 222, + 223 => 223, + 224 => 224, + 225 => 225, + 226 => 226, + 227 => 227, + 228 => 228, + 229 => 229, + 230 => 230, + 231 => 231, + 232 => 232, + 233 => 233, + 234 => 234, + 235 => 235, + 236 => 236, + 237 => 237, + 238 => 238, + 239 => 239, + 240 => 240, + 241 => 241, + 242 => 242, + 243 => 243, + 244 => 244, + 245 => 245, + 246 => 246, + 247 => 247, + 248 => 248, + 249 => 249, + 250 => 250, + 251 => 251, + 252 => 252, + 253 => 253, + 254 => 254, + 255 => 255 ); diff --git a/ecrire/charsets/iso-8859-15.php b/ecrire/charsets/iso-8859-15.php index d94437d002..09e82fcdad 100644 --- a/ecrire/charsets/iso-8859-15.php +++ b/ecrire/charsets/iso-8859-15.php @@ -14,23 +14,25 @@ * Déclaration des correspondances entre charsets iso-8859-15 et unicode * * @author Gaetan Ryckeboer <gryckeboer@virtual-net.fr> - * + * * @package SPIP\Core\Charsets -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} load_charset('iso-8859-1'); $trans = $GLOBALS['CHARSET']['iso-8859-1']; -$trans[164]=8364; -$trans[166]=352; -$trans[168]=353; -$trans[180]=381; -$trans[184]=382; -$trans[188]=338; -$trans[189]=339; -$trans[190]=376; +$trans[164] = 8364; +$trans[166] = 352; +$trans[168] = 353; +$trans[180] = 381; +$trans[184] = 382; +$trans[188] = 338; +$trans[189] = 339; +$trans[190] = 376; $GLOBALS['CHARSET']['iso-8859-15'] = $trans; diff --git a/ecrire/charsets/iso-8859-6.php b/ecrire/charsets/iso-8859-6.php index ee2ac3ced4..e9109416bc 100644 --- a/ecrire/charsets/iso-8859-6.php +++ b/ecrire/charsets/iso-8859-6.php @@ -14,32 +14,75 @@ * Déclaration des correspondances entre charsets iso-8859-6 (arabic) et unicode * * @link http://czyborra.com/charsets/iso8859.html#ISO-8859-6 - * + * * @package SPIP\Core\Charsets -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} load_charset('iso-8859-1'); $trans = $GLOBALS['CHARSET']['iso-8859-1']; $mod = Array( -0xA0=>0x00A0, 0xA4=>0x00A4, 0xAC=>0x060C, 0xAD=>0x00AD, 0xBB=>0x061B, -0xBF=>0x061F, 0xC1=>0x0621, 0xC2=>0x0622, 0xC3=>0x0623, 0xC4=>0x0624, -0xC5=>0x0625, 0xC6=>0x0626, 0xC7=>0x0627, 0xC8=>0x0628, 0xC9=>0x0629, -0xCA=>0x062A, 0xCB=>0x062B, 0xCC=>0x062C, 0xCD=>0x062D, 0xCE=>0x062E, -0xCF=>0x062F, 0xD0=>0x0630, 0xD1=>0x0631, 0xD2=>0x0632, 0xD3=>0x0633, -0xD4=>0x0634, 0xD5=>0x0635, 0xD6=>0x0636, 0xD7=>0x0637, 0xD8=>0x0638, -0xD9=>0x0639, 0xDA=>0x063A, 0xE0=>0x0640, 0xE1=>0x0641, 0xE2=>0x0642, -0xE3=>0x0643, 0xE4=>0x0644, 0xE5=>0x0645, 0xE6=>0x0646, 0xE7=>0x0647, -0xE8=>0x0648, 0xE9=>0x0649, 0xEA=>0x064A, 0xEB=>0x064B, 0xEC=>0x064C, -0xED=>0x064D, 0xEE=>0x064E, 0xEF=>0x064F, 0xF0=>0x0650, 0xF1=>0x0651, -0xF2=>0x0652 + 0xA0 => 0x00A0, + 0xA4 => 0x00A4, + 0xAC => 0x060C, + 0xAD => 0x00AD, + 0xBB => 0x061B, + 0xBF => 0x061F, + 0xC1 => 0x0621, + 0xC2 => 0x0622, + 0xC3 => 0x0623, + 0xC4 => 0x0624, + 0xC5 => 0x0625, + 0xC6 => 0x0626, + 0xC7 => 0x0627, + 0xC8 => 0x0628, + 0xC9 => 0x0629, + 0xCA => 0x062A, + 0xCB => 0x062B, + 0xCC => 0x062C, + 0xCD => 0x062D, + 0xCE => 0x062E, + 0xCF => 0x062F, + 0xD0 => 0x0630, + 0xD1 => 0x0631, + 0xD2 => 0x0632, + 0xD3 => 0x0633, + 0xD4 => 0x0634, + 0xD5 => 0x0635, + 0xD6 => 0x0636, + 0xD7 => 0x0637, + 0xD8 => 0x0638, + 0xD9 => 0x0639, + 0xDA => 0x063A, + 0xE0 => 0x0640, + 0xE1 => 0x0641, + 0xE2 => 0x0642, + 0xE3 => 0x0643, + 0xE4 => 0x0644, + 0xE5 => 0x0645, + 0xE6 => 0x0646, + 0xE7 => 0x0647, + 0xE8 => 0x0648, + 0xE9 => 0x0649, + 0xEA => 0x064A, + 0xEB => 0x064B, + 0xEC => 0x064C, + 0xED => 0x064D, + 0xEE => 0x064E, + 0xEF => 0x064F, + 0xF0 => 0x0650, + 0xF1 => 0x0651, + 0xF2 => 0x0652 ); -foreach ($mod as $num=>$val) - $trans[$num]=$val; +foreach ($mod as $num => $val) { + $trans[$num] = $val; +} $GLOBALS['CHARSET']['iso-8859-6'] = $trans; diff --git a/ecrire/charsets/iso-8859-9.php b/ecrire/charsets/iso-8859-9.php index 7c734475fb..0a0a6ff8e3 100644 --- a/ecrire/charsets/iso-8859-9.php +++ b/ecrire/charsets/iso-8859-9.php @@ -14,21 +14,23 @@ * Déclaration des correspondances entre charsets iso-8859-9 (Turc) et unicode * * @author <alexis@nds.k12.tr> - * + * * @package SPIP\Core\Charsets -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} load_charset('iso-8859-1'); $trans = $GLOBALS['CHARSET']['iso-8859-1']; -$trans[240]=287; //gbreve -$trans[208]=286; //Gbreve -$trans[221]=304; //Idot -$trans[253]=305; //inodot -$trans[254]=351; //scedil -$trans[222]=350; //Scedil +$trans[240] = 287; //gbreve +$trans[208] = 286; //Gbreve +$trans[221] = 304; //Idot +$trans[253] = 305; //inodot +$trans[254] = 351; //scedil +$trans[222] = 350; //Scedil $GLOBALS['CHARSET']['iso-8859-9'] = $trans; diff --git a/ecrire/charsets/mathml.php b/ecrire/charsets/mathml.php index c20f8896d7..8e91214c8f 100644 --- a/ecrire/charsets/mathml.php +++ b/ecrire/charsets/mathml.php @@ -2,1694 +2,1694 @@ /** * Déclaration des entités MathML et leur correspondances en écriture unicode - * + * * @package SPIP\Core\Charsets -**/ -$GLOBALS['CHARSET']['mathml'] = array ( + **/ +$GLOBALS['CHARSET']['mathml'] = array( -'ac' => '', -'acd' => '', -'acE' => '&E#290;', -'acute' => '́', -'Afr' => '', -'afr' => '', -'aleph' => 'ℵ', -'alpha' => 'α', -'amalg' => '', -'amp' => '&', -'And' => '∧', -'and' => '∧', -'andand' => '', -'andd' => '', -'andslope' => '', -'andv' => '', -'ang' => '∠', -'ange' => '', -'angle' => '∠', -'angmsd' => '∡', -'angmsdaa' => '', -'angmsdab' => '', -'angmsdac' => '', -'angmsdad' => '', -'angmsdae' => '', -'angmsdaf' => '', -'angmsdag' => '', -'angmsdah' => '', -'angrt' => '∟', -'angrtvb' => '', -'angrtvbd' => '', -'angsph' => '∢', -'angst' => 'Å', -'angzarr' => '', -'Aopf' => '', -'ap' => '≈', -'apacir' => '', -'apE' => '', -'ape' => '≊', -'apid' => '≋', -'apos' => ''', -'approx' => '≈', -'approxeq' => '≊', -'Ascr' => '', -'ascr' => '', -'ast' => '∗', -'asymp' => '≍', -'awconint' => '∳', -'awint' => '', -'backcong' => '≌', -'backepsilon' => '', -'backprime' => '‵', -'backsim' => '∽', -'backsimeq' => '⋍', -'Backslash' => '∖', -'Barv' => '', -'barvee' => '⊽', -'Barwed' => '⌆', -'barwed' => '⊼', -'barwedge' => '⊼', -'bbrk' => '', -'bbrktbrk' => '', -'bcong' => '≌', -'becaus' => '∵', -'Because' => '∵', -'because' => '∵', -'bemptyv' => '', -'benzen' => '', -'benzena' => '', -'benzenb' => '', -'benzenc' => '', -'benzend' => '', -'benzene' => '', -'benzenf' => '', -'benzeng' => '', -'benzenh' => '', -'benzeni' => '', -'benzenj' => '', -'benzenk' => '', -'benzenl' => '', -'benzenm' => '', -'benzenn' => '', -'benzeno' => '', -'benzenp' => '', -'benzenq' => '', -'benzenr' => '', -'bepsi' => '', -'bernou' => 'ℬ', -'beta' => 'β', -'beth' => 'ℶ', -'between' => '≬', -'Bfr' => '', -'bfr' => '', -'bigcap' => '⋂', -'bigcirc' => '○', -'bigcup' => '⋃', -'bigodot' => '⊙', -'bigoplus' => '⊕', -'bigotimes' => '⊗', -'bigsqcup' => '⊔', -'bigstar' => '★', -'bigtriangledown' => '▽', -'bigtriangleup' => '△', -'biguplus' => '⊎', -'bigvee' => '⋁', -'bigwedge' => '⋀', -'bkarow' => '', -'blacklozenge' => '', -'blacksquare' => '■', -'blacktriangle' => '▴', -'blacktriangledown' => '▾', -'blacktriangleleft' => '◂', -'blacktriangleright' => '▸', -'blank' => '', -'blk12' => '▒', -'blk14' => '░', -'blk34' => '▓', -'block' => '█', -'bne' => '', -'bnequiv' => '', -'bNot' => '', -'bnot' => '⌐', -'Bopf' => '', -'bot' => '⊥', -'bottom' => '⊥', -'bowtie' => '⋈', -'boxbox' => '', -'boxminus' => '⊟', -'boxplus' => '⊞', -'boxtimes' => '⊠', -'bprime' => '‵', -'Breve' => '̆', -'breve' => '̆', -'brvbar' => '¦', -'Bscr' => '', -'bscr' => '', -'bsemi' => '', -'bsim' => '∽', -'bsime' => '⋍', -'bsol' => '\', -'bsolb' => '', -'bsolhsub' => '', -'bull' => '•', -'bullet' => '•', -'bump' => '≎', -'bumpe' => '≏', -'Bumpeq' => '≎', -'bumpeq' => '≏', -'Cap' => '⋒', -'cap' => '∩', -'capand' => '', -'capbrcup' => '', -'capcap' => '', -'capcup' => '', -'capdot' => '', -'caps' => '', -'caret' => '‸', -'caron' => '̌', -'ccaps' => '', -'Cconint' => '∰', -'ccups' => '', -'ccupssm' => '', -'cdot' => '⋅', -'cedil' => '̧', -'Cedilla' => '̧', -'cemptyv' => '', -'cent' => '¢', -'CenterDot' => '·', -'centerdot' => '·', -'Cfr' => '', -'cfr' => '', -'check' => '✓', -'checkmark' => '✓', -'chi' => 'χ', -'cir' => '∘', -'circ' => '∘', -'circeq' => '≗', -'circle' => '', -'circlearrowleft' => '↺', -'circlearrowright' => '↻', -'circledast' => '⊛', -'circledcirc' => '⊚', -'circleddash' => '⊝', -'CircleDot' => '⊙', -'circledR' => '¯', -'circledS' => '', -'circlef' => '●', -'circlefb' => '◒', -'circlefl' => '◐', -'circlefr' => '◑', -'circleft' => '◓', -'CircleMinus' => '⊖', -'CirclePlus' => '⊕', -'CircleTimes' => '⊗', -'cirE' => '', -'cire' => '≗', -'cirfnint' => '', -'cirmid' => '', -'cirscir' => '', -'ClockwiseContourIntegral' => '∲', -'CloseCurlyDoubleQuote' => '”', -'CloseCurlyQuote' => '’', -'clubs' => '♣', -'clubsuit' => '♣', -'Colon' => '∷', -'colon' => ':', -'Colone' => '', -'colone' => '≔', -'coloneq' => '≔', -'comma' => ',', -'commat' => '@', -'comp' => '∁', -'compfn' => '∘', -'complement' => '∁', -'cong' => '≅', -'congdot' => '', -'Congruent' => '≡', -'Conint' => '∯', -'conint' => '∮', -'ContourIntegral' => '∮', -'Copf' => 'ℂ', -'coprod' => '∐', -'Coproduct' => '∐', -'copy' => '©', -'copysr' => '℗', -'CounterClockwiseContourIntegral' => '∳', -'cross' => '☒', -'Cscr' => '', -'cscr' => '', -'csub' => '', -'csube' => '', -'csup' => '', -'csupe' => '', -'ctdot' => '⋯', -'cudarrl' => '', -'cudarrr' => '', -'cuepr' => '⋞', -'cuesc' => '⋟', -'cularr' => '↶', -'cularrp' => '', -'Cup' => '⌣', -'cup' => '∪', -'cupbrcap' => '', -'CupCap' => '≍', -'cupcap' => '', -'cupcup' => '', -'cupdot' => '⊍', -'cupor' => '', -'cups' => '', -'curarr' => '↷', -'curarrm' => '', -'curlyeqprec' => '⋞', -'curlyeqsucc' => '⋟', -'curlyvee' => '⋎', -'curlywedge' => '⋏', -'curren' => '¤', -'curvearrowleft' => '↶', -'curvearrowright' => '↷', -'cuvee' => '⋎', -'cuwed' => '⋏', -'cwconint' => '∲', -'cwint' => '∱', -'cylcty' => '⌭', -'Dagger' => '‡', -'dagger' => '†', -'daleth' => 'ℸ', -'Darr' => '↡', -'dArr' => '⇓', -'darr' => '↓', -'dash' => '‐', -'Dashv' => '', -'dashv' => '⊣', -'dbkarow' => '', -'dblac' => '̋', -'ddagger' => '‡', -'ddarr' => '⇊', -'DDotrahd' => '', -'ddotseq' => '', -'deg' => '°', -'Del' => '∇', -'Delta' => 'Δ', -'delta' => 'δ', -'demptyv' => '', -'dfisht' => '', -'Dfr' => '', -'dfr' => '', -'dHar' => '', -'dharl' => '⇃', -'dharr' => '⇂', -'DiacriticalAcute' => '́', -'DiacriticalDot' => '̇', -'DiacriticalDoubleAcute' => '̋', -'DiacriticalGrave' => '̀', -'DiacriticalLeftArrow' => '⃖', -'DiacriticalLeftRightArrow' => '⃡', -'DiacriticalLeftRightVector' => '', -'DiacriticalLeftVector' => '⃐', -'DiacriticalRightArrow' => '⃗', -'DiacriticalRightVector' => '⃑', -'DiacriticalTilde' => '̃', -'diam' => '⋄', -'diamond' => '⋄', -'diamondf' => '', -'diamondsuit' => '♢', -'diamonfb' => '', -'diamonfl' => '', -'diamonfr' => '', -'diamonft' => '', -'diams' => '♢', -'die' => '̈', -'digamma' => 'Ϝ', -'disin' => '', -'div' => '÷', -'divide' => '÷', -'divideontimes' => '⋇', -'divonx' => '⋇', -'dlcorn' => '⌞', -'dlcrop' => '⌍', -'dollar' => '$', -'Dopf' => '', -'Dot' => '̈', -'dot' => '̇', -'DotDot' => '⃜', -'doteq' => '≐', -'doteqdot' => '≑', -'DotEqual' => '≐', -'dotminus' => '∸', -'dotplus' => '∔', -'dotsquare' => '⊡', -'doublebarwedge' => '⌆', -'DoubleContourIntegral' => '∯', -'DoubleDot' => '̈', -'DoubleDownArrow' => '⇓', -'DoubleLeftArrow' => '⇐', -'DoubleLeftRightArrow' => '⇔', -'DoubleLongLeftArrow' => '', -'DoubleLongLeftRightArrow' => '', -'DoubleLongRightArrow' => '', -'DoubleRightArrow' => '⇒', -'DoubleRightTee' => '⊨', -'DoubleUpArrow' => '⇑', -'DoubleUpDownArrow' => '⇕', -'DoubleVerticalBar' => '∥', -'DownArrow' => '↓', -'Downarrow' => '⇓', -'downarrow' => '↓', -'DownArrowUpArrow' => '', -'downdownarrows' => '⇊', -'downharpoonleft' => '⇃', -'downharpoonright' => '⇂', -'DownLeftVector' => '↽', -'DownRightVector' => '⇁', -'DownTee' => '⊤', -'drbkarow' => '', -'drcorn' => '⌟', -'drcrop' => '⌌', -'Dscr' => '', -'dscr' => '', -'dsol' => '', -'dtdot' => '⋱', -'dtri' => '▿', -'dtrif' => '▾', -'duarr' => '', -'duhar' => '', -'dwangle' => '', -'dzigrarr' => '⇝', -'easter' => '≛', -'ecir' => '≖', -'ecolon' => '≕', -'eDDot' => '', -'eDot' => '≑', -'efDot' => '≒', -'Efr' => '', -'efr' => '', -'eg' => '', -'egs' => '⋝', -'egsdot' => '', -'el' => '', -'Element' => '∈', -'elinters' => '', -'ell' => 'ℓ', -'els' => '⋜', -'elsdot' => '', -'empty' => '', -'emptyset' => '', -'emptyv' => '∅', -'emsp' => ' ', -'emsp13' => ' ', -'emsp14' => ' ', -'ensp' => ' ', -'Eopf' => '', -'epar' => '⋕', -'eparsl' => '', -'eplus' => '', -'epsi' => '∊', -'epsiv' => 'ε', -'eqcirc' => '≖', -'eqcolon' => '≕', -'eqsim' => '≂', -'eqslantgtr' => '⋝', -'eqslantless' => '⋜', -'equals' => '=', -'EqualTilde' => '≂', -'equest' => '≟', -'Equilibrium' => '⇌', -'equiv' => '≡', -'equivDD' => '', -'eqvparsl' => '', -'erarr' => '', -'erDot' => '≓', -'Escr' => '', -'escr' => '', -'esdot' => '≐', -'Esim' => '', -'esim' => '≂', -'eta' => 'η', -'excl' => '!', -'exist' => '∃', -'Exists' => '∃', -'fallingdotseq' => '≒', -'female' => '♀', -'ffilig' => 'ffi', -'fflig' => 'ff', -'ffllig' => 'ffl', -'Ffr' => '', -'ffr' => '', -'filig' => 'fi', -'fjlig' => '', -'flat' => '♭', -'fllig' => 'fl', -'fltns' => '', -'Fopf' => '', -'ForAll' => '∀', -'forall' => '∀', -'fork' => '⋔', -'forkv' => '', -'fpartint' => '', -'frac12' => '½', -'frac13' => '⅓', -'frac14' => '¼', -'frac15' => '⅕', -'frac16' => '⅙', -'frac18' => '⅛', -'frac23' => '≔', -'frac25' => '⅖', -'frac34' => '¾', -'frac35' => '⅗', -'frac38' => '⅜', -'frac45' => '⅘', -'frac56' => '⅚', -'frac58' => '⅝', -'frac78' => '⅞', -'frown' => '⌢', -'Fscr' => '', -'fscr' => '', -'Gamma' => 'Γ', -'gamma' => 'γ', -'Gammad' => 'Ϝ', -'gammad' => 'Ϝ', -'gap' => '≳', -'gE' => '≧', -'ge' => '≥', -'gEl' => '⋛', -'gel' => '⋛', -'geq' => '≥', -'geqq' => '≧', -'geqslant' => '', -'ges' => '', -'gescc' => '', -'gesdot' => '', -'gesdoto' => '', -'gesdotol' => '', -'gesl' => '', -'gesles' => '', -'Gfr' => '', -'gfr' => '', -'Gg' => '⋙', -'gg' => '≫', -'ggg' => '⋙', -'gimel' => 'ℷ', -'gl' => '≷', -'gla' => '', -'glE' => '', -'glj' => '', -'gnap' => '', -'gnapprox' => '', -'gnE' => '≩', -'gne' => '≩', -'gneq' => '≩', -'gneqq' => '≩', -'gnsim' => '⋧', -'Gopf' => '', -'grave' => '̀', -'GreaterEqual' => '≥', -'GreaterEqualLess' => '⋛', -'GreaterFullEqual' => '≧', -'GreaterLess' => '≷', -'GreaterSlantEqual' => '', -'GreaterTilde' => '≳', -'Gscr' => '', -'gscr' => '', -'gsim' => '≳', -'gsime' => '', -'gsiml' => '', -'Gt' => '≫', -'gt' => '>', -'gtcc' => '', -'gtcir' => '', -'gtdot' => '⋗', -'gtlPar' => '', -'gtquest' => '', -'gtrapprox' => '≳', -'gtrarr' => '', -'gtrdot' => '⋗', -'gtreqless' => '⋛', -'gtreqqless' => '⋛', -'gtrless' => '≷', -'gtrsim' => '≳', -'gvertneqq' => '', -'gvnE' => '', -'Hacek' => '̌', -'hairsp' => ' ', -'half' => '½', -'hamilt' => 'ℋ', -'hArr' => '⇔', -'harr' => '↔', -'harrcir' => '', -'harrw' => '↭', -'Hat' => '̂', -'hbar' => '', -'hbenzen' => '', -'hbenzena' => '', -'hbenzenb' => '', -'hbenzenc' => '', -'hbenzend' => '', -'hbenzene' => '', -'hbenzenf' => '', -'hbenzeng' => '', -'hbenzenh' => '', -'hbenzeni' => '', -'hbenzenj' => '', -'hbenzenk' => '', -'hbenzenl' => '', -'hbenzenm' => '', -'hbenzenn' => '', -'hbenzeno' => '', -'hbenzenp' => '', -'hbenzenq' => '', -'hbenzenr' => '', -'hearts' => '♡', -'heartsuit' => '♡', -'hellip' => '…', -'hercon' => '⊹', -'Hfr' => '', -'hfr' => '', -'hksearow' => '', -'hkswarow' => '', -'hoarr' => '', -'homtht' => '∻', -'hookleftarrow' => '↩', -'hookrightarrow' => '↪', -'Hopf' => '', -'horbar' => '―', -'Hscr' => '', -'hscr' => '', -'hslash' => 'ℏ', -'HumpDownHump' => '≎', -'HumpEqual' => '≏', -'hybull' => '⁃', -'hyphen' => '', -'iexcl' => '¡', -'iff' => '', -'Ifr' => '', -'ifr' => '', -'iiiint' => '', -'iiint' => '∭', -'iinfin' => '', -'iiota' => '℩', -'Im' => 'ℑ', -'image' => 'ℑ', -'imath' => 'ı', -'imof' => '⊷', -'imped' => '', -'Implies' => '⇒', -'in' => '∊', -'incare' => '℅', -'infin' => '∞', -'infintie' => '', -'Int' => '∬', -'int' => '∫', -'intcal' => '⊺', -'Integral' => '∫', -'intercal' => '⊺', -'Intersection' => '⋂', -'intlarhk' => '', -'intprod' => '', -'Iopf' => '', -'iota' => 'ι', -'iprod' => '', -'iquest' => '¿', -'Iscr' => '', -'iscr' => '', -'isin' => '∊', -'isindot' => '', -'isinE' => '', -'isins' => '', -'isinsv' => '', -'isinv' => '∈', -'Jfr' => '', -'jfr' => '', -'jmath' => '', -'Jopf' => '', -'Jscr' => '', -'jscr' => '', -'kappa' => 'κ', -'kappav' => 'ϰ', -'Kfr' => '', -'kfr' => '', -'Kopf' => '', -'Kscr' => '', -'kscr' => '', -'lAarr' => '⇚', -'laemptyv' => '', -'lagran' => 'ℒ', -'Lambda' => 'Λ', -'lambda' => 'λ', -'Lang' => '《', -'lang' => '〈', -'langd' => '', -'langle' => '〈', -'lap' => '≲', -'laquo' => '«', -'Larr' => '↞', -'lArr' => '⇐', -'larr' => '←', -'larrbfs' => '', -'larrfs' => '', -'larrhk' => '↩', -'larrlp' => '↫', -'larrpl' => '', -'larrsim' => '', -'larrtl' => '↢', -'lat' => '', -'lAtail' => '', -'latail' => '', -'late' => '', -'lates' => '', -'lBarr' => '', -'lbarr' => '', -'lbbrk' => '〔', -'lbrace' => '{', -'lbrack' => '[', -'lbrke' => '', -'lbrksld' => '', -'lbrkslu' => '', -'lceil' => '⌈', -'lcub' => '{', -'ldca' => '', -'ldquo' => '“', -'ldquor' => '„', -'ldrdhar' => '', -'ldrushar' => '', -'ldsh' => '↲', -'lE' => '≦', -'le' => '≤', -'LeftAngleBracket' => '〈', -'LeftArrow' => '←', -'Leftarrow' => '⇐', -'leftarrow' => '←', -'LeftArrowRightArrow' => '⇆', -'leftarrowtail' => '↢', -'LeftCeiling' => '⌈', -'LeftDownVector' => '⇃', -'LeftFloor' => '⌊', -'leftharpoondown' => '↽', -'leftharpoonup' => '↼', -'leftleftarrows' => '⇇', -'LeftRightArrow' => '↔', -'Leftrightarrow' => '⇔', -'leftrightarrow' => '↔', -'leftrightarrows' => '⇆', -'leftrightharpoons' => '⇋', -'leftrightsquigarrow' => '↭', -'LeftTee' => '⊣', -'leftthreetimes' => '⋋', -'LeftTriangle' => '⊲', -'LeftTriangleEqual' => '⊴', -'LeftUpVector' => '↿', -'LeftVector' => '↼', -'lEg' => '⋚', -'leg' => '⋚', -'leq' => '≤', -'leqq' => '≦', -'leqslant' => '', -'les' => '', -'lescc' => '', -'lesdot' => '', -'lesdoto' => '', -'lesdotor' => '', -'lesg' => '', -'lesges' => '', -'lessapprox' => '≲', -'lessdot' => '⋖', -'lesseqgtr' => '⋚', -'lesseqqgtr' => '⋚', -'LessEqualGreater' => '⋚', -'LessFullEqual' => '≦', -'LessGreater' => '≶', -'lessgtr' => '≶', -'lesssim' => '≲', -'LessSlantEqual' => '', -'LessTilde' => '≲', -'lfisht' => '', -'lfloor' => '⌊', -'Lfr' => '', -'lfr' => '', -'lg' => '≶', -'lgE' => '', -'lHar' => '', -'lhard' => '↽', -'lharu' => '↼', -'lharul' => '', -'lhblk' => '▄', -'Ll' => '⋘', -'ll' => '≪', -'llarr' => '⇇', -'llcorner' => '⌞', -'Lleftarrow' => '⇚', -'llhard' => '', -'lltri' => '', -'lmoust' => '', -'lmoustache' => '', -'lnap' => '', -'lnapprox' => '', -'lnE' => '≨', -'lne' => '≨', -'lneq' => '≨', -'lneqq' => '≨', -'lnsim' => '⋦', -'loang' => '〘', -'loarr' => '', -'lobrk' => '〚', -'LongLeftArrow' => '', -'Longleftarrow' => '', -'longleftarrow' => '', -'LongLeftRightArrow' => '', -'Longleftrightarrow' => '', -'longleftrightarrow' => '', -'longmapsto' => '', -'LongRightArrow' => '', -'Longrightarrow' => '', -'longrightarrow' => '', -'looparrowleft' => '↫', -'looparrowright' => '↬', -'lopar' => '', -'Lopf' => '', -'loplus' => '', -'lotimes' => '', -'lowast' => '∗', -'lowbar' => '_', -'LowerLeftArrow' => '↙', -'LowerRightArrow' => '↘', -'loz' => '◊', -'lozenge' => '◊', -'lozf' => '', -'lpar' => '(', -'lparlt' => '', -'lrarr' => '⇆', -'lrcorner' => '⌟', -'lrhar' => '⇋', -'lrhard' => '', -'lrtri' => '', -'Lscr' => '', -'lscr' => '', -'Lsh' => '↰', -'lsh' => '↰', -'lsim' => '≲', -'lsime' => '', -'lsimg' => '', -'lsqb' => '[', -'lsquo' => '‘', -'lsquor' => '‚', -'Lt' => '≪', -'lt' => '<', -'ltcc' => '', -'ltcir' => '', -'ltdot' => '⋖', -'lthree' => '⋋', -'ltimes' => '⋉', -'ltlarr' => '', -'ltquest' => '', -'ltri' => '◃', -'ltrie' => '⊴', -'ltrif' => '◂', -'ltrPar' => '', -'lurdshar' => '', -'luruhar' => '', -'lvertneqq' => '', -'lvnE' => '', -'macr' => '̄', -'male' => '♂', -'malt' => '✠', -'maltese' => '✠', -'Map' => '', -'map' => '↦', -'mapsto' => '↦', -'marker' => '', -'mcomma' => '', -'mdash' => '—', -'mDDot' => '∺', -'measuredangle' => '∡', -'Mfr' => '', -'mfr' => '', -'mho' => '℧', -'micro' => 'µ', -'mid' => '∣', -'midast' => '∗', -'midcir' => '', -'middot' => '·', -'minus' => '−', -'minusb' => '⊟', -'minusd' => '∸', -'minusdu' => '', -'MinusPlus' => '∓', -'mlcp' => '', -'mldr' => '', -'mnplus' => '∓', -'models' => '⊧', -'Mopf' => '', -'mp' => '∓', -'Mscr' => '', -'mscr' => '', -'mstpos' => '∾', -'mu' => 'μ', -'multimap' => '⊸', -'mumap' => '⊸', -'nabla' => '∇', -'nang' => '', -'nap' => '≉', -'napE' => '', -'napid' => '', -'napprox' => '≉', -'natur' => '♮', -'natural' => '♮', -'nbsp' => ' ', -'ncap' => '', -'ncong' => '≇', -'ncongdot' => '', -'ncup' => '', -'ndash' => '–', -'ne' => '≠', -'nearhk' => '', -'neArr' => '⇗', -'nearr' => '↗', -'nearrow' => '↗', -'nedot' => '', -'nequiv' => '≢', -'nesear' => '', -'NestedGreaterGreater' => '≫', -'NestedLessLess' => '≪', -'nexist' => '∄', -'nexists' => '∄', -'Nfr' => '', -'nfr' => '', -'ngE' => '≱', -'nge' => '', -'ngeq' => '', -'ngeqq' => '≱', -'ngeqslant' => '≱', -'nges' => '≱', -'nGg' => '', -'ngsim' => '≵', -'nGt' => '', -'ngt' => '≯', -'ngtr' => '≯', -'nGtv' => '', -'nhArr' => '⇎', -'nharr' => '↮', -'nhpar' => '', -'ni' => '∍', -'nis' => '', -'nisd' => '', -'niv' => '∋', -'nlArr' => '⇍', -'nlarr' => '↚', -'nldr' => '‥', -'nlE' => '≰', -'nle' => '', -'nLeftarrow' => '⇍', -'nleftarrow' => '↚', -'nLeftrightarrow' => '⇎', -'nleftrightarrow' => '↮', -'nleq' => '', -'nleqq' => '≰', -'nleqslant' => '≰', -'nles' => '≰', -'nless' => '≮', -'nLl' => '', -'nlsim' => '≴', -'nLt' => '', -'nlt' => '≮', -'nltri' => '⋪', -'nltrie' => '⋬', -'nLtv' => '', -'nmid' => '∤', -'Nopf' => 'ℕ', -'Not' => '', -'not' => '¬', -'NotCongruent' => '≢', -'NotDoubleVerticalBar' => '∦', -'NotElement' => '∉', -'NotEqual' => '≠', -'NotExists' => '∄', -'NotGreater' => '≯', -'NotGreaterEqual' => '', -'NotGreaterFullEqual' => '≰', -'NotGreaterGreater' => '', -'NotGreaterLess' => '≹', -'NotGreaterSlantEqual' => '≱', -'NotGreaterTilde' => '≵', -'notin' => '∉', -'notindot' => '', -'notinE' => '', -'notinva' => '', -'notinvb' => '', -'notinvc' => '', -'NotLeftTriangle' => '⋪', -'NotLeftTriangleEqual' => '⋬', -'NotLess' => '≮', -'NotLessEqual' => '', -'NotLessFullEqual' => '≰', -'NotLessGreater' => '≸', -'NotLessLess' => '', -'NotLessSlantEqual' => '≰', -'NotLessTilde' => '≴', -'notni' => '∌', -'notniva' => '∌', -'notnivb' => '', -'notnivc' => '', -'NotPrecedes' => '⊀', -'NotPrecedesEqual' => '', -'NotPrecedesSlantEqual' => '⋠', -'NotReverseElement' => '∌', -'NotRightTriangle' => '⋫', -'NotRightTriangleEqual' => '⋭', -'NotSquareSubsetEqual' => '⋢', -'NotSquareSupersetEqual' => '⋣', -'NotSubset' => '⊄', -'NotSucceeds' => '⊁', -'NotSucceedsEqual' => '', -'NotSucceedsSlantEqual' => '⋡', -'NotSuperset' => '⊅', -'NotTilde' => '≁', -'NotTildeEqual' => '≄', -'NotTildeFullEqual' => '≇', -'NotTildeTilde' => '≉', -'NotVerticalBar' => '∤', -'npar' => '∦', -'nparallel' => '∦', -'nparsl' => '', -'npart' => '', -'npolint' => '', -'npr' => '⊀', -'nprcue' => '⋠', -'npre' => '', -'nprec' => '⊀', -'npreceq' => '', -'nrArr' => '⇏', -'nrarr' => '↛', -'nrarrc' => '', -'nrarrw' => '', -'nRightarrow' => '⇏', -'nrightarrow' => '↛', -'nrtri' => '⋫', -'nrtrie' => '⋭', -'nsc' => '⊁', -'nsccue' => '⋡', -'nsce' => '', -'Nscr' => '', -'nscr' => '', -'nshortmid' => '', -'nshortparallel' => '', -'nsim' => '≁', -'nsime' => '≄', -'nsimeq' => '≄', -'nsmid' => '', -'nspar' => '', -'nsqsube' => '⋢', -'nsqsupe' => '⋣', -'nsub' => '⊄', -'nsubE' => '⊈', -'nsube' => '⊈', -'nsubset' => '⊄', -'nsubseteq' => '⊈', -'nsubseteqq' => '⊈', -'nsucc' => '⊁', -'nsucceq' => '', -'nsup' => '⊅', -'nsupE' => '⊉', -'nsupe' => '⊉', -'nsupset' => '⊅', -'nsupseteq' => '⊉', -'nsupseteqq' => '⊉', -'ntgl' => '≹', -'ntlg' => '≸', -'ntriangleleft' => '⋪', -'ntrianglelefteq' => '⋬', -'ntriangleright' => '⋫', -'ntrianglerighteq' => '⋭', -'ntvgl' => '≹', -'ntvlg' => '≸', -'nu' => 'ν', -'num' => '#', -'numsp' => ' ', -'nvap' => '', -'nVDash' => '⊯', -'nVdash' => '⊮', -'nvDash' => '⊭', -'nvdash' => '⊬', -'nvge' => '≱', -'nvgt' => '≯', -'nvhArr*' => '⇎', -'nvinfin' => '', -'nvlArr' => '⇍', -'nvle' => '≰', -'nvlt' => '≮', -'nvltrie' => '', -'nvrArr' => '⇏', -'nvrtrie' => '', -'nvsim' => '', -'nwarhk' => '', -'nwArr' => '⇖', -'nwarr' => '↖', -'nwarrow' => '↖', -'nwnear' => '', -'oast' => '⊛', -'ocir' => '⊚', -'odash' => '⊝', -'odiv' => '', -'odot' => '⊙', -'odsold' => '', -'ofcir' => '', -'Ofr' => '', -'ofr' => '', -'ogon' => '̨', -'ogt' => '', -'ohbar' => '', -'ohm' => 'Ω', -'oint' => '∮', -'olarr' => '↺', -'olcir' => '', -'olcross' => '', -'olt' => '', -'Omega' => 'Ω', -'omega' => 'ω', -'omicron' => 'ξ', -'omid' => '', -'ominus' => '⊖', -'Oopf' => '', -'opar' => '', -'OpenCurlyDoubleQuote' => '“', -'OpenCurlyQuote' => '‘', -'operp' => '', -'oplus' => '⊕', -'Or' => '', -'or' => '∨', -'orarr' => '↻', -'ord' => '', -'order' => 'ℴ', -'ordf' => 'ª', -'ordm' => 'º', -'origof' => '⊶', -'oror' => '', -'orslope' => '', -'orv' => '', -'oS' => '', -'Oscr' => '', -'oscr' => '', -'oslash' => '⊘', -'osol' => '⊘', -'Otimes' => '', -'otimes' => '⊗', -'otimesas' => '', -'ovbar' => '', -'OverLine' => '̅', -'par' => '∥', -'para' => '¶', -'parallel' => '∥', -'parsim' => '', -'parsl' => '', -'part' => '∂', -'PartialD' => '∂', -'percnt' => '%', -'period' => '.', -'permil' => '‰', -'perp' => '⊥', -'pertenk' => '‱', -'Pfr' => '', -'pfr' => '', -'Phi' => 'Φ', -'phi' => 'φ', -'phiv' => 'ϕ', -'phmmat' => 'ℳ', -'phone' => '☎', -'Pi' => 'Π', -'pi' => 'π', -'pitchfork' => '⋔', -'piv' => 'ϖ', -'plank' => '', -'plankv' => 'ℏ', -'plus' => '+', -'plusacir' => '', -'plusb' => '⊞', -'pluscir' => '', -'plusdo' => '∔', -'plusdu' => '', -'pluse' => '', -'PlusMinus' => '±', -'plusmn' => '±', -'plussim' => '', -'plustwo' => '', -'pm' => '±', -'pointint' => '', -'Popf' => 'ℙ', -'pound' => '£', -'Pr' => '', -'pr' => '≺', -'prap' => '≾', -'prcue' => '≼', -'prE' => '≼', -'pre' => '≼', -'prec' => '≺', -'precapprox' => '≾', -'preccurlyeq' => '≼', -'Precedes' => '≺', -'PrecedesEqual' => '≼', -'PrecedesSlantEqual' => '≼', -'PrecedesTilde' => '≾', -'preceq' => '≼', -'precnapprox' => '⋨', -'precneqq' => '', -'precnsim' => '⋨', -'precsim' => '≾', -'Prime' => '″', -'prime' => '′', -'prnap' => '⋨', -'prnE' => '', -'prnsim' => '⋨', -'profalar' => '⌮', -'profline' => '⌒', -'profsurf' => '⌓', -'prop' => '∝', -'Proportion' => '∷', -'Proportional' => '∝', -'propto' => '∝', -'prsim' => '≾', -'prurel' => '⊰', -'Pscr' => '', -'pscr' => '', -'Psi' => 'Ψ', -'psi' => 'ψ', -'puncsp' => ' ', -'Qfr' => '', -'qfr' => '', -'qint' => '', -'Qopf' => 'ℚ', -'qprime' => '', -'Qscr' => '', -'qscr' => '', -'quatint' => '', -'quest' => '?', -'questeq' => '≟', -'quot' => '"', -'rAarr' => '⇛', -'race' => '', -'radic' => '√', -'raemptyv' => '', -'Rang' => '》', -'rang' => '〉', -'rangd' => '', -'range' => '', -'rangle' => '〉', -'raquo' => '»', -'Rarr' => '↠', -'rArr' => '⇒', -'rarr' => '→', -'rarrap' => '', -'rarrbfs' => '', -'rarrc' => '', -'rarrfs' => '', -'rarrhk' => '↪', -'rarrlp' => '↬', -'rarrpl' => '', -'rarrsim' => '', -'Rarrtl' => '', -'rarrtl' => '↣', -'rarrw' => '↝', -'rAtail' => '', -'ratail' => '↣', -'ratio' => '∶', -'RBarr' => '', -'rBarr' => '', -'rbarr' => '', -'rbbrk' => '〕', -'rbrace' => '}', -'rbrack' => ']', -'rbrke' => '', -'rbrksld' => '', -'rbrkslu' => '', -'rceil' => '⌉', -'rcub' => '}', -'rdca' => '', -'rdldhar' => '', -'rdquo' => '”', -'rdquor' => '‛', -'rdsh' => '↳', -'Re' => 'ℜ', -'real' => 'ℜ', -'rect' => '', -'reg' => '¯', -'ReverseElement' => '∋', -'ReverseEquilibrium' => '⇋', -'ReverseUpEquilibrium' => '', -'rfisht' => '', -'rfloor' => '⌋', -'Rfr' => '', -'rfr' => '', -'rHar' => '', -'rhard' => '⇁', -'rharu' => '⇀', -'rharul' => '', -'rho' => 'ρ', -'rhov' => 'ϱ', -'RightAngleBracket' => '〉', -'RightArrow' => '→', -'Rightarrow' => '⇒', -'rightarrow' => '→', -'RightArrowLeftArrow' => '⇄', -'rightarrowtail' => '↣', -'RightCeiling' => '⌉', -'RightDownVector' => '⇂', -'RightFloor' => '⌋', -'rightharpoondown' => '⇁', -'rightharpoonup' => '⇀', -'rightleftarrows' => '⇄', -'rightleftharpoons' => '⇌', -'rightrightarrows' => '⇉', -'rightsquigarrow' => '↝', -'RightTee' => '⊢', -'RightTeeArrow' => '↦', -'rightthreetimes' => '⋌', -'RightTriangle' => '⊳', -'RightTriangleEqual' => '⊵', -'RightUpVector' => '↾', -'RightVector' => '⇀', -'ring' => '̊', -'risingdotseq' => '≓', -'rlarr' => '⇄', -'rlhar' => '⇌', -'rmoust' => '', -'rmoustache' => '', -'rnmid' => '', -'roang' => '〙', -'roarr' => '', -'robrk' => '〛', -'ropar' => '', -'Ropf' => 'ℝ', -'roplus' => '', -'rotimes' => '', -'rpar' => ')', -'rpargt' => '', -'rppolint' => '', -'rrarr' => '⇉', -'Rrightarrow' => '⇛', -'Rscr' => '', -'rscr' => 'ℛ', -'Rsh' => '↱', -'rsh' => '↱', -'rsqb' => ']', -'rsquo' => '’', -'rsquor' => '‟', -'rthree' => '⋌', -'rtimes' => '⋊', -'rtri' => '▹', -'rtrie' => '⊵', -'rtrif' => '▸', -'rtriltri' => '', -'ruluhar' => '', -'rx' => '℞', -'Sc' => '', -'sc' => '≻', -'scap' => '≿', -'sccue' => '≽', -'scE' => '≾', -'sce' => '≽', -'scnap' => '⋩', -'scnE' => '', -'scnsim' => '⋩', -'scpolint' => '', -'scsim' => '≿', -'sdot' => '⋅', -'sdotb' => '⊡', -'sdote' => '', -'searhk' => '', -'seArr' => '⇘', -'searr' => '↘', -'searrow' => '↘', -'sect' => '§', -'semi' => ';', -'seswar' => '', -'setminus' => '∖', -'setmn' => '∖', -'sext' => '', -'Sfr' => '', -'sfr' => '', -'sfrown' => '', -'sharp' => '♯', -'ShortLeftArrow' => '', -'shortmid' => '', -'shortparallel' => '', -'ShortRightArrow' => '', -'shy' => '­', -'Sigma' => 'Σ', -'sigma' => 'σ', -'sigmav' => 'ς', -'sim' => '∼', -'simdot' => '', -'sime' => '≃', -'simeq' => '≃', -'simg' => '', -'simgE' => '', -'siml' => '', -'simlE' => '', -'simne' => '≆', -'simplus' => '', -'simrarr' => '', -'slarr' => '', -'SmallCircle' => '∘', -'smallfrown' => '', -'smallsetminus' => '', -'smallsmile' => '', -'smashp' => '', -'smeparsl' => '', -'smid' => '', -'smile' => '⌣', -'smt' => '', -'smte' => '', -'smtes' => '', -'sol' => '/', -'solb' => '', -'solbar' => '', -'Sopf' => '', -'spades' => '♠', -'spadesuit' => '♠', -'spar' => '', -'sqcap' => '⊓', -'sqcaps' => '', -'sqcup' => '⊔', -'sqcups' => '', -'Sqrt' => '√', -'sqsub' => '⊏', -'sqsube' => '⊑', -'sqsubset' => '⊏', -'sqsubseteq' => '⊑', -'sqsup' => '⊐', -'sqsupe' => '⊒', -'sqsupset' => '⊐', -'sqsupseteq' => '⊒', -'squ' => '□', -'square' => '□', -'SquareIntersection' => '⊓', -'SquareSubset' => '⊏', -'SquareSubsetEqual' => '⊑', -'SquareSuperset' => '⊐', -'SquareSupersetEqual' => '⊒', -'SquareUnion' => '⊔', -'squarf' => '■', -'squarfb' => '', -'squarfbl' => '', -'squarfbr' => '◪', -'squarfl' => '◧', -'squarfr' => '◨', -'squarft' => '', -'squarftl' => '◩', -'squarftr' => '', -'squf' => '▪', -'srarr' => '', -'Sscr' => '', -'sscr' => '', -'ssetmn' => '', -'ssmile' => '', -'sstarf' => '⋆', -'Star' => '⋆', -'star' => '⋆', -'starf' => '★', -'straightepsilon' => '∊', -'straightphi' => 'φ', -'strns' => '', -'Sub' => '⋐', -'sub' => '⊂', -'subdot' => '', -'subE' => '⊆', -'sube' => '⊆', -'subedot' => '', -'submult' => '', -'subnE' => '⊊', -'subne' => '⊊', -'subplus' => '', -'subrarr' => '', -'Subset' => '⋐', -'subset' => '⊂', -'subseteq' => '⊆', -'subseteqq' => '⊆', -'SubsetEqual' => '⊆', -'subsetneq' => '⊊', -'subsetneqq' => '⊊', -'subsim' => '', -'subsub' => '', -'subsup' => '', -'succ' => '≻', -'succapprox' => '≿', -'succcurlyeq' => '≽', -'Succeeds' => '≻', -'SucceedsEqual' => '≽', -'SucceedsSlantEqual' => '≽', -'SucceedsTilde' => '≿', -'succeq' => '≽', -'succnapprox' => '⋩', -'succneqq' => '', -'succnsim' => '⋩', -'succsim' => '≿', -'SuchThat' => '∍', -'Sum' => '∑', -'sum' => '∑', -'sung' => '♩', -'Sup' => '⋑', -'sup' => '⊃', -'sup1' => '¹', -'sup2' => '²', -'sup3' => '³', -'supdot' => '', -'supdsub' => '', -'supE' => '⊇', -'supe' => '⊇', -'supedot' => '', -'Superset' => '⊃', -'SupersetEqual' => '⊇', -'suphsol' => '', -'suphsub' => '', -'suplarr' => '', -'supmult' => '', -'supnE' => '⊋', -'supne' => '⊋', -'supplus' => '', -'Supset' => '⋑', -'supset' => '⊃', -'supseteq' => '⊇', -'supseteqq' => '⊇', -'supsetneq' => '⊋', -'supsetneqq' => '⊋', -'supsim' => '', -'supsub' => '', -'supsup' => '', -'swarhk' => '', -'swArr' => '⇙', -'swarr' => '↙', -'swarrow' => '↙', -'swnwar' => '', -'target' => '⌖', -'tau' => 'τ', -'tbrk' => '', -'tdot' => '⃛', -'telrec' => '⌕', -'Tfr' => '', -'tfr' => '', -'there4' => '∴', -'Therefore' => '∴', -'therefore' => '∴', -'Theta' => 'Θ', -'theta' => 'θ', -'thetav' => 'ϑ', -'thickapprox' => '', -'thicksim' => '', -'thinsp' => ' ', -'thkap' => '', -'thksim' => '', -'Tilde' => '∼', -'tilde' => '̃', -'TildeEqual' => '≃', -'TildeFullEqual' => '≅', -'TildeTilde' => '≈', -'times' => '×', -'timesb' => '⊠', -'timesbar' => '', -'timesd' => '', -'tint' => '∭', -'toea' => '', -'top' => '⊤', -'topbot' => '⌶', -'topcir' => '', -'Topf' => '', -'topfork' => '', -'tosa' => '', -'tprime' => '‴', -'trade' => '™', -'triangle' => '▵', -'triangledown' => '▿', -'triangleleft' => '◃', -'trianglelefteq' => '⊴', -'triangleq' => '≜', -'triangleright' => '▹', -'trianglerighteq' => '⊵', -'tridot' => '◬', -'trie' => '≜', -'triminus' => '', -'TripleDot' => '⃛', -'triplus' => '', -'trisb' => '', -'tritime' => '', -'trpezium' => '', -'Tscr' => '', -'tscr' => '', -'twixt' => '≬', -'twoheadleftarrow' => '↞', -'twoheadrightarrow' => '↠', -'Uarr' => '↟', -'uArr' => '⇑', -'uarr' => '↑', -'Uarrocir' => '', -'udarr' => '⇅', -'udhar' => '', -'ufisht' => '', -'Ufr' => '', -'ufr' => '', -'uHar' => '', -'uharl' => '↿', -'uharr' => '↾', -'uhblk' => '▀', -'ulcorn' => '⌜', -'ulcorner' => '⌜', -'ulcrop' => '⌏', -'ultri' => '', -'uml' => '̈', -'UnderLine' => '̲', -'Union' => '⋃', -'UnionPlus' => '⊎', -'Uopf' => '', -'UpArrow' => '↑', -'Uparrow' => '⇑', -'uparrow' => '↑', -'UpArrowDownArrow' => '⇅', -'UpDownArrow' => '↕', -'Updownarrow' => '⇕', -'updownarrow' => '↕', -'UpEquilibrium' => '', -'upharpoonleft' => '↿', -'upharpoonright' => '↾', -'uplus' => '⊎', -'UpperLeftArrow' => '↖', -'UpperRightArrow' => '↗', -'Upsi' => 'ϒ', -'upsi' => 'υ', -'Upsilon' => 'ϒ', -'upsilon' => 'υ', -'UpTee' => '⊥', -'upuparrows' => '⇈', -'urcorn' => '⌝', -'urcorner' => '⌝', -'urcrop' => '⌎', -'urtri' => '', -'Uscr' => '', -'uscr' => '', -'utdot' => '⋰', -'utri' => '▵', -'utrif' => '▴', -'uuarr' => '⇈', -'uwangle' => '', -'vangrt' => '⊾', -'varepsilon' => 'ε', -'varkappa' => 'ϰ', -'varnothing' => '∅', -'varphi' => 'ϕ', -'varpi' => 'ϖ', -'varpropto' => '∝', -'vArr' => '⇕', -'varr' => '↕', -'varrho' => 'ϱ', -'varsigma' => 'ς', -'varsubsetneq' => '', -'varsubsetneqq' => '', -'varsupsetneq' => '', -'varsupsetneqq' => '', -'vartheta' => 'ϑ', -'vartriangleleft' => '⊲', -'vartriangleright' => '⊳', -'Vbar' => '', -'vBar' => '', -'vBarv' => '', -'VDash' => '⊫', -'Vdash' => '⊩', -'vDash' => '⊨', -'vdash' => '⊢', -'Vdashl' => '', -'Vee' => '⋁', -'vee' => '∨', -'veebar' => '⊻', -'veeeq' => '≚', -'vellip' => '⋮', -'Verbar' => '‖', -'verbar' => '|', -'Vert' => '‖', -'vert' => '|', -'VerticalBar' => '∣', -'VerticalTilde' => '≀', -'Vfr' => '', -'vfr' => '', -'vltri' => '⊲', -'vnsub' => '⊄', -'vnsup' => '⊅', -'Vopf' => '', -'vprop' => '∝', -'vrtri' => '⊳', -'Vscr' => '', -'vscr' => '', -'vsubnE' => '', -'vsubne' => '', -'vsupnE' => '', -'vsupne' => '', -'Vvdash' => '⊪', -'vzigzag' => '', -'wedbar' => '', -'Wedge' => '⋀', -'wedge' => '∧', -'wedgeq' => '≙', -'weierp' => '℘', -'Wfr' => '', -'wfr' => '', -'Wopf' => '', -'wp' => '℘', -'wr' => '≀', -'wreath' => '≀', -'Wscr' => '', -'wscr' => '', -'xcap' => '⋂', -'xcirc' => '○', -'xcup' => '⋃', -'xdtri' => '▽', -'Xfr' => '', -'xfr' => '', -'xhArr' => '', -'xharr' => '', -'Xi' => 'Ξ', -'xi' => 'ξ', -'xlArr' => '', -'xlarr' => '', -'xmap' => '', -'xnis' => '', -'xodot' => '⊙', -'Xopf' => '', -'xoplus' => '⊕', -'xotime' => '⊗', -'xrArr' => '', -'xrarr' => '', -'Xscr' => '', -'xscr' => '', -'xsqcup' => '⊔', -'xuplus' => '⊎', -'xutri' => '△', -'xvee' => '⋁', -'xwedge' => '⋀', -'yen' => '¥', -'Yfr' => '', -'yfr' => '', -'Yopf' => '', -'Yscr' => '', -'yscr' => '', -'zeta' => 'ζ', -'Zfr' => 'ℤ', -'zfr' => '', -'zigrarr' => '', -'Zopf' => '', -'Zscr' => '', -'zscr' => '' + 'ac' => '', + 'acd' => '', + 'acE' => '&E#290;', + 'acute' => '́', + 'Afr' => '', + 'afr' => '', + 'aleph' => 'ℵ', + 'alpha' => 'α', + 'amalg' => '', + 'amp' => '&', + 'And' => '∧', + 'and' => '∧', + 'andand' => '', + 'andd' => '', + 'andslope' => '', + 'andv' => '', + 'ang' => '∠', + 'ange' => '', + 'angle' => '∠', + 'angmsd' => '∡', + 'angmsdaa' => '', + 'angmsdab' => '', + 'angmsdac' => '', + 'angmsdad' => '', + 'angmsdae' => '', + 'angmsdaf' => '', + 'angmsdag' => '', + 'angmsdah' => '', + 'angrt' => '∟', + 'angrtvb' => '', + 'angrtvbd' => '', + 'angsph' => '∢', + 'angst' => 'Å', + 'angzarr' => '', + 'Aopf' => '', + 'ap' => '≈', + 'apacir' => '', + 'apE' => '', + 'ape' => '≊', + 'apid' => '≋', + 'apos' => ''', + 'approx' => '≈', + 'approxeq' => '≊', + 'Ascr' => '', + 'ascr' => '', + 'ast' => '∗', + 'asymp' => '≍', + 'awconint' => '∳', + 'awint' => '', + 'backcong' => '≌', + 'backepsilon' => '', + 'backprime' => '‵', + 'backsim' => '∽', + 'backsimeq' => '⋍', + 'Backslash' => '∖', + 'Barv' => '', + 'barvee' => '⊽', + 'Barwed' => '⌆', + 'barwed' => '⊼', + 'barwedge' => '⊼', + 'bbrk' => '', + 'bbrktbrk' => '', + 'bcong' => '≌', + 'becaus' => '∵', + 'Because' => '∵', + 'because' => '∵', + 'bemptyv' => '', + 'benzen' => '', + 'benzena' => '', + 'benzenb' => '', + 'benzenc' => '', + 'benzend' => '', + 'benzene' => '', + 'benzenf' => '', + 'benzeng' => '', + 'benzenh' => '', + 'benzeni' => '', + 'benzenj' => '', + 'benzenk' => '', + 'benzenl' => '', + 'benzenm' => '', + 'benzenn' => '', + 'benzeno' => '', + 'benzenp' => '', + 'benzenq' => '', + 'benzenr' => '', + 'bepsi' => '', + 'bernou' => 'ℬ', + 'beta' => 'β', + 'beth' => 'ℶ', + 'between' => '≬', + 'Bfr' => '', + 'bfr' => '', + 'bigcap' => '⋂', + 'bigcirc' => '○', + 'bigcup' => '⋃', + 'bigodot' => '⊙', + 'bigoplus' => '⊕', + 'bigotimes' => '⊗', + 'bigsqcup' => '⊔', + 'bigstar' => '★', + 'bigtriangledown' => '▽', + 'bigtriangleup' => '△', + 'biguplus' => '⊎', + 'bigvee' => '⋁', + 'bigwedge' => '⋀', + 'bkarow' => '', + 'blacklozenge' => '', + 'blacksquare' => '■', + 'blacktriangle' => '▴', + 'blacktriangledown' => '▾', + 'blacktriangleleft' => '◂', + 'blacktriangleright' => '▸', + 'blank' => '', + 'blk12' => '▒', + 'blk14' => '░', + 'blk34' => '▓', + 'block' => '█', + 'bne' => '', + 'bnequiv' => '', + 'bNot' => '', + 'bnot' => '⌐', + 'Bopf' => '', + 'bot' => '⊥', + 'bottom' => '⊥', + 'bowtie' => '⋈', + 'boxbox' => '', + 'boxminus' => '⊟', + 'boxplus' => '⊞', + 'boxtimes' => '⊠', + 'bprime' => '‵', + 'Breve' => '̆', + 'breve' => '̆', + 'brvbar' => '¦', + 'Bscr' => '', + 'bscr' => '', + 'bsemi' => '', + 'bsim' => '∽', + 'bsime' => '⋍', + 'bsol' => '\', + 'bsolb' => '', + 'bsolhsub' => '', + 'bull' => '•', + 'bullet' => '•', + 'bump' => '≎', + 'bumpe' => '≏', + 'Bumpeq' => '≎', + 'bumpeq' => '≏', + 'Cap' => '⋒', + 'cap' => '∩', + 'capand' => '', + 'capbrcup' => '', + 'capcap' => '', + 'capcup' => '', + 'capdot' => '', + 'caps' => '', + 'caret' => '‸', + 'caron' => '̌', + 'ccaps' => '', + 'Cconint' => '∰', + 'ccups' => '', + 'ccupssm' => '', + 'cdot' => '⋅', + 'cedil' => '̧', + 'Cedilla' => '̧', + 'cemptyv' => '', + 'cent' => '¢', + 'CenterDot' => '·', + 'centerdot' => '·', + 'Cfr' => '', + 'cfr' => '', + 'check' => '✓', + 'checkmark' => '✓', + 'chi' => 'χ', + 'cir' => '∘', + 'circ' => '∘', + 'circeq' => '≗', + 'circle' => '', + 'circlearrowleft' => '↺', + 'circlearrowright' => '↻', + 'circledast' => '⊛', + 'circledcirc' => '⊚', + 'circleddash' => '⊝', + 'CircleDot' => '⊙', + 'circledR' => '¯', + 'circledS' => '', + 'circlef' => '●', + 'circlefb' => '◒', + 'circlefl' => '◐', + 'circlefr' => '◑', + 'circleft' => '◓', + 'CircleMinus' => '⊖', + 'CirclePlus' => '⊕', + 'CircleTimes' => '⊗', + 'cirE' => '', + 'cire' => '≗', + 'cirfnint' => '', + 'cirmid' => '', + 'cirscir' => '', + 'ClockwiseContourIntegral' => '∲', + 'CloseCurlyDoubleQuote' => '”', + 'CloseCurlyQuote' => '’', + 'clubs' => '♣', + 'clubsuit' => '♣', + 'Colon' => '∷', + 'colon' => ':', + 'Colone' => '', + 'colone' => '≔', + 'coloneq' => '≔', + 'comma' => ',', + 'commat' => '@', + 'comp' => '∁', + 'compfn' => '∘', + 'complement' => '∁', + 'cong' => '≅', + 'congdot' => '', + 'Congruent' => '≡', + 'Conint' => '∯', + 'conint' => '∮', + 'ContourIntegral' => '∮', + 'Copf' => 'ℂ', + 'coprod' => '∐', + 'Coproduct' => '∐', + 'copy' => '©', + 'copysr' => '℗', + 'CounterClockwiseContourIntegral' => '∳', + 'cross' => '☒', + 'Cscr' => '', + 'cscr' => '', + 'csub' => '', + 'csube' => '', + 'csup' => '', + 'csupe' => '', + 'ctdot' => '⋯', + 'cudarrl' => '', + 'cudarrr' => '', + 'cuepr' => '⋞', + 'cuesc' => '⋟', + 'cularr' => '↶', + 'cularrp' => '', + 'Cup' => '⌣', + 'cup' => '∪', + 'cupbrcap' => '', + 'CupCap' => '≍', + 'cupcap' => '', + 'cupcup' => '', + 'cupdot' => '⊍', + 'cupor' => '', + 'cups' => '', + 'curarr' => '↷', + 'curarrm' => '', + 'curlyeqprec' => '⋞', + 'curlyeqsucc' => '⋟', + 'curlyvee' => '⋎', + 'curlywedge' => '⋏', + 'curren' => '¤', + 'curvearrowleft' => '↶', + 'curvearrowright' => '↷', + 'cuvee' => '⋎', + 'cuwed' => '⋏', + 'cwconint' => '∲', + 'cwint' => '∱', + 'cylcty' => '⌭', + 'Dagger' => '‡', + 'dagger' => '†', + 'daleth' => 'ℸ', + 'Darr' => '↡', + 'dArr' => '⇓', + 'darr' => '↓', + 'dash' => '‐', + 'Dashv' => '', + 'dashv' => '⊣', + 'dbkarow' => '', + 'dblac' => '̋', + 'ddagger' => '‡', + 'ddarr' => '⇊', + 'DDotrahd' => '', + 'ddotseq' => '', + 'deg' => '°', + 'Del' => '∇', + 'Delta' => 'Δ', + 'delta' => 'δ', + 'demptyv' => '', + 'dfisht' => '', + 'Dfr' => '', + 'dfr' => '', + 'dHar' => '', + 'dharl' => '⇃', + 'dharr' => '⇂', + 'DiacriticalAcute' => '́', + 'DiacriticalDot' => '̇', + 'DiacriticalDoubleAcute' => '̋', + 'DiacriticalGrave' => '̀', + 'DiacriticalLeftArrow' => '⃖', + 'DiacriticalLeftRightArrow' => '⃡', + 'DiacriticalLeftRightVector' => '', + 'DiacriticalLeftVector' => '⃐', + 'DiacriticalRightArrow' => '⃗', + 'DiacriticalRightVector' => '⃑', + 'DiacriticalTilde' => '̃', + 'diam' => '⋄', + 'diamond' => '⋄', + 'diamondf' => '', + 'diamondsuit' => '♢', + 'diamonfb' => '', + 'diamonfl' => '', + 'diamonfr' => '', + 'diamonft' => '', + 'diams' => '♢', + 'die' => '̈', + 'digamma' => 'Ϝ', + 'disin' => '', + 'div' => '÷', + 'divide' => '÷', + 'divideontimes' => '⋇', + 'divonx' => '⋇', + 'dlcorn' => '⌞', + 'dlcrop' => '⌍', + 'dollar' => '$', + 'Dopf' => '', + 'Dot' => '̈', + 'dot' => '̇', + 'DotDot' => '⃜', + 'doteq' => '≐', + 'doteqdot' => '≑', + 'DotEqual' => '≐', + 'dotminus' => '∸', + 'dotplus' => '∔', + 'dotsquare' => '⊡', + 'doublebarwedge' => '⌆', + 'DoubleContourIntegral' => '∯', + 'DoubleDot' => '̈', + 'DoubleDownArrow' => '⇓', + 'DoubleLeftArrow' => '⇐', + 'DoubleLeftRightArrow' => '⇔', + 'DoubleLongLeftArrow' => '', + 'DoubleLongLeftRightArrow' => '', + 'DoubleLongRightArrow' => '', + 'DoubleRightArrow' => '⇒', + 'DoubleRightTee' => '⊨', + 'DoubleUpArrow' => '⇑', + 'DoubleUpDownArrow' => '⇕', + 'DoubleVerticalBar' => '∥', + 'DownArrow' => '↓', + 'Downarrow' => '⇓', + 'downarrow' => '↓', + 'DownArrowUpArrow' => '', + 'downdownarrows' => '⇊', + 'downharpoonleft' => '⇃', + 'downharpoonright' => '⇂', + 'DownLeftVector' => '↽', + 'DownRightVector' => '⇁', + 'DownTee' => '⊤', + 'drbkarow' => '', + 'drcorn' => '⌟', + 'drcrop' => '⌌', + 'Dscr' => '', + 'dscr' => '', + 'dsol' => '', + 'dtdot' => '⋱', + 'dtri' => '▿', + 'dtrif' => '▾', + 'duarr' => '', + 'duhar' => '', + 'dwangle' => '', + 'dzigrarr' => '⇝', + 'easter' => '≛', + 'ecir' => '≖', + 'ecolon' => '≕', + 'eDDot' => '', + 'eDot' => '≑', + 'efDot' => '≒', + 'Efr' => '', + 'efr' => '', + 'eg' => '', + 'egs' => '⋝', + 'egsdot' => '', + 'el' => '', + 'Element' => '∈', + 'elinters' => '', + 'ell' => 'ℓ', + 'els' => '⋜', + 'elsdot' => '', + 'empty' => '', + 'emptyset' => '', + 'emptyv' => '∅', + 'emsp' => ' ', + 'emsp13' => ' ', + 'emsp14' => ' ', + 'ensp' => ' ', + 'Eopf' => '', + 'epar' => '⋕', + 'eparsl' => '', + 'eplus' => '', + 'epsi' => '∊', + 'epsiv' => 'ε', + 'eqcirc' => '≖', + 'eqcolon' => '≕', + 'eqsim' => '≂', + 'eqslantgtr' => '⋝', + 'eqslantless' => '⋜', + 'equals' => '=', + 'EqualTilde' => '≂', + 'equest' => '≟', + 'Equilibrium' => '⇌', + 'equiv' => '≡', + 'equivDD' => '', + 'eqvparsl' => '', + 'erarr' => '', + 'erDot' => '≓', + 'Escr' => '', + 'escr' => '', + 'esdot' => '≐', + 'Esim' => '', + 'esim' => '≂', + 'eta' => 'η', + 'excl' => '!', + 'exist' => '∃', + 'Exists' => '∃', + 'fallingdotseq' => '≒', + 'female' => '♀', + 'ffilig' => 'ffi', + 'fflig' => 'ff', + 'ffllig' => 'ffl', + 'Ffr' => '', + 'ffr' => '', + 'filig' => 'fi', + 'fjlig' => '', + 'flat' => '♭', + 'fllig' => 'fl', + 'fltns' => '', + 'Fopf' => '', + 'ForAll' => '∀', + 'forall' => '∀', + 'fork' => '⋔', + 'forkv' => '', + 'fpartint' => '', + 'frac12' => '½', + 'frac13' => '⅓', + 'frac14' => '¼', + 'frac15' => '⅕', + 'frac16' => '⅙', + 'frac18' => '⅛', + 'frac23' => '≔', + 'frac25' => '⅖', + 'frac34' => '¾', + 'frac35' => '⅗', + 'frac38' => '⅜', + 'frac45' => '⅘', + 'frac56' => '⅚', + 'frac58' => '⅝', + 'frac78' => '⅞', + 'frown' => '⌢', + 'Fscr' => '', + 'fscr' => '', + 'Gamma' => 'Γ', + 'gamma' => 'γ', + 'Gammad' => 'Ϝ', + 'gammad' => 'Ϝ', + 'gap' => '≳', + 'gE' => '≧', + 'ge' => '≥', + 'gEl' => '⋛', + 'gel' => '⋛', + 'geq' => '≥', + 'geqq' => '≧', + 'geqslant' => '', + 'ges' => '', + 'gescc' => '', + 'gesdot' => '', + 'gesdoto' => '', + 'gesdotol' => '', + 'gesl' => '', + 'gesles' => '', + 'Gfr' => '', + 'gfr' => '', + 'Gg' => '⋙', + 'gg' => '≫', + 'ggg' => '⋙', + 'gimel' => 'ℷ', + 'gl' => '≷', + 'gla' => '', + 'glE' => '', + 'glj' => '', + 'gnap' => '', + 'gnapprox' => '', + 'gnE' => '≩', + 'gne' => '≩', + 'gneq' => '≩', + 'gneqq' => '≩', + 'gnsim' => '⋧', + 'Gopf' => '', + 'grave' => '̀', + 'GreaterEqual' => '≥', + 'GreaterEqualLess' => '⋛', + 'GreaterFullEqual' => '≧', + 'GreaterLess' => '≷', + 'GreaterSlantEqual' => '', + 'GreaterTilde' => '≳', + 'Gscr' => '', + 'gscr' => '', + 'gsim' => '≳', + 'gsime' => '', + 'gsiml' => '', + 'Gt' => '≫', + 'gt' => '>', + 'gtcc' => '', + 'gtcir' => '', + 'gtdot' => '⋗', + 'gtlPar' => '', + 'gtquest' => '', + 'gtrapprox' => '≳', + 'gtrarr' => '', + 'gtrdot' => '⋗', + 'gtreqless' => '⋛', + 'gtreqqless' => '⋛', + 'gtrless' => '≷', + 'gtrsim' => '≳', + 'gvertneqq' => '', + 'gvnE' => '', + 'Hacek' => '̌', + 'hairsp' => ' ', + 'half' => '½', + 'hamilt' => 'ℋ', + 'hArr' => '⇔', + 'harr' => '↔', + 'harrcir' => '', + 'harrw' => '↭', + 'Hat' => '̂', + 'hbar' => '', + 'hbenzen' => '', + 'hbenzena' => '', + 'hbenzenb' => '', + 'hbenzenc' => '', + 'hbenzend' => '', + 'hbenzene' => '', + 'hbenzenf' => '', + 'hbenzeng' => '', + 'hbenzenh' => '', + 'hbenzeni' => '', + 'hbenzenj' => '', + 'hbenzenk' => '', + 'hbenzenl' => '', + 'hbenzenm' => '', + 'hbenzenn' => '', + 'hbenzeno' => '', + 'hbenzenp' => '', + 'hbenzenq' => '', + 'hbenzenr' => '', + 'hearts' => '♡', + 'heartsuit' => '♡', + 'hellip' => '…', + 'hercon' => '⊹', + 'Hfr' => '', + 'hfr' => '', + 'hksearow' => '', + 'hkswarow' => '', + 'hoarr' => '', + 'homtht' => '∻', + 'hookleftarrow' => '↩', + 'hookrightarrow' => '↪', + 'Hopf' => '', + 'horbar' => '―', + 'Hscr' => '', + 'hscr' => '', + 'hslash' => 'ℏ', + 'HumpDownHump' => '≎', + 'HumpEqual' => '≏', + 'hybull' => '⁃', + 'hyphen' => '', + 'iexcl' => '¡', + 'iff' => '', + 'Ifr' => '', + 'ifr' => '', + 'iiiint' => '', + 'iiint' => '∭', + 'iinfin' => '', + 'iiota' => '℩', + 'Im' => 'ℑ', + 'image' => 'ℑ', + 'imath' => 'ı', + 'imof' => '⊷', + 'imped' => '', + 'Implies' => '⇒', + 'in' => '∊', + 'incare' => '℅', + 'infin' => '∞', + 'infintie' => '', + 'Int' => '∬', + 'int' => '∫', + 'intcal' => '⊺', + 'Integral' => '∫', + 'intercal' => '⊺', + 'Intersection' => '⋂', + 'intlarhk' => '', + 'intprod' => '', + 'Iopf' => '', + 'iota' => 'ι', + 'iprod' => '', + 'iquest' => '¿', + 'Iscr' => '', + 'iscr' => '', + 'isin' => '∊', + 'isindot' => '', + 'isinE' => '', + 'isins' => '', + 'isinsv' => '', + 'isinv' => '∈', + 'Jfr' => '', + 'jfr' => '', + 'jmath' => '', + 'Jopf' => '', + 'Jscr' => '', + 'jscr' => '', + 'kappa' => 'κ', + 'kappav' => 'ϰ', + 'Kfr' => '', + 'kfr' => '', + 'Kopf' => '', + 'Kscr' => '', + 'kscr' => '', + 'lAarr' => '⇚', + 'laemptyv' => '', + 'lagran' => 'ℒ', + 'Lambda' => 'Λ', + 'lambda' => 'λ', + 'Lang' => '《', + 'lang' => '〈', + 'langd' => '', + 'langle' => '〈', + 'lap' => '≲', + 'laquo' => '«', + 'Larr' => '↞', + 'lArr' => '⇐', + 'larr' => '←', + 'larrbfs' => '', + 'larrfs' => '', + 'larrhk' => '↩', + 'larrlp' => '↫', + 'larrpl' => '', + 'larrsim' => '', + 'larrtl' => '↢', + 'lat' => '', + 'lAtail' => '', + 'latail' => '', + 'late' => '', + 'lates' => '', + 'lBarr' => '', + 'lbarr' => '', + 'lbbrk' => '〔', + 'lbrace' => '{', + 'lbrack' => '[', + 'lbrke' => '', + 'lbrksld' => '', + 'lbrkslu' => '', + 'lceil' => '⌈', + 'lcub' => '{', + 'ldca' => '', + 'ldquo' => '“', + 'ldquor' => '„', + 'ldrdhar' => '', + 'ldrushar' => '', + 'ldsh' => '↲', + 'lE' => '≦', + 'le' => '≤', + 'LeftAngleBracket' => '〈', + 'LeftArrow' => '←', + 'Leftarrow' => '⇐', + 'leftarrow' => '←', + 'LeftArrowRightArrow' => '⇆', + 'leftarrowtail' => '↢', + 'LeftCeiling' => '⌈', + 'LeftDownVector' => '⇃', + 'LeftFloor' => '⌊', + 'leftharpoondown' => '↽', + 'leftharpoonup' => '↼', + 'leftleftarrows' => '⇇', + 'LeftRightArrow' => '↔', + 'Leftrightarrow' => '⇔', + 'leftrightarrow' => '↔', + 'leftrightarrows' => '⇆', + 'leftrightharpoons' => '⇋', + 'leftrightsquigarrow' => '↭', + 'LeftTee' => '⊣', + 'leftthreetimes' => '⋋', + 'LeftTriangle' => '⊲', + 'LeftTriangleEqual' => '⊴', + 'LeftUpVector' => '↿', + 'LeftVector' => '↼', + 'lEg' => '⋚', + 'leg' => '⋚', + 'leq' => '≤', + 'leqq' => '≦', + 'leqslant' => '', + 'les' => '', + 'lescc' => '', + 'lesdot' => '', + 'lesdoto' => '', + 'lesdotor' => '', + 'lesg' => '', + 'lesges' => '', + 'lessapprox' => '≲', + 'lessdot' => '⋖', + 'lesseqgtr' => '⋚', + 'lesseqqgtr' => '⋚', + 'LessEqualGreater' => '⋚', + 'LessFullEqual' => '≦', + 'LessGreater' => '≶', + 'lessgtr' => '≶', + 'lesssim' => '≲', + 'LessSlantEqual' => '', + 'LessTilde' => '≲', + 'lfisht' => '', + 'lfloor' => '⌊', + 'Lfr' => '', + 'lfr' => '', + 'lg' => '≶', + 'lgE' => '', + 'lHar' => '', + 'lhard' => '↽', + 'lharu' => '↼', + 'lharul' => '', + 'lhblk' => '▄', + 'Ll' => '⋘', + 'll' => '≪', + 'llarr' => '⇇', + 'llcorner' => '⌞', + 'Lleftarrow' => '⇚', + 'llhard' => '', + 'lltri' => '', + 'lmoust' => '', + 'lmoustache' => '', + 'lnap' => '', + 'lnapprox' => '', + 'lnE' => '≨', + 'lne' => '≨', + 'lneq' => '≨', + 'lneqq' => '≨', + 'lnsim' => '⋦', + 'loang' => '〘', + 'loarr' => '', + 'lobrk' => '〚', + 'LongLeftArrow' => '', + 'Longleftarrow' => '', + 'longleftarrow' => '', + 'LongLeftRightArrow' => '', + 'Longleftrightarrow' => '', + 'longleftrightarrow' => '', + 'longmapsto' => '', + 'LongRightArrow' => '', + 'Longrightarrow' => '', + 'longrightarrow' => '', + 'looparrowleft' => '↫', + 'looparrowright' => '↬', + 'lopar' => '', + 'Lopf' => '', + 'loplus' => '', + 'lotimes' => '', + 'lowast' => '∗', + 'lowbar' => '_', + 'LowerLeftArrow' => '↙', + 'LowerRightArrow' => '↘', + 'loz' => '◊', + 'lozenge' => '◊', + 'lozf' => '', + 'lpar' => '(', + 'lparlt' => '', + 'lrarr' => '⇆', + 'lrcorner' => '⌟', + 'lrhar' => '⇋', + 'lrhard' => '', + 'lrtri' => '', + 'Lscr' => '', + 'lscr' => '', + 'Lsh' => '↰', + 'lsh' => '↰', + 'lsim' => '≲', + 'lsime' => '', + 'lsimg' => '', + 'lsqb' => '[', + 'lsquo' => '‘', + 'lsquor' => '‚', + 'Lt' => '≪', + 'lt' => '<', + 'ltcc' => '', + 'ltcir' => '', + 'ltdot' => '⋖', + 'lthree' => '⋋', + 'ltimes' => '⋉', + 'ltlarr' => '', + 'ltquest' => '', + 'ltri' => '◃', + 'ltrie' => '⊴', + 'ltrif' => '◂', + 'ltrPar' => '', + 'lurdshar' => '', + 'luruhar' => '', + 'lvertneqq' => '', + 'lvnE' => '', + 'macr' => '̄', + 'male' => '♂', + 'malt' => '✠', + 'maltese' => '✠', + 'Map' => '', + 'map' => '↦', + 'mapsto' => '↦', + 'marker' => '', + 'mcomma' => '', + 'mdash' => '—', + 'mDDot' => '∺', + 'measuredangle' => '∡', + 'Mfr' => '', + 'mfr' => '', + 'mho' => '℧', + 'micro' => 'µ', + 'mid' => '∣', + 'midast' => '∗', + 'midcir' => '', + 'middot' => '·', + 'minus' => '−', + 'minusb' => '⊟', + 'minusd' => '∸', + 'minusdu' => '', + 'MinusPlus' => '∓', + 'mlcp' => '', + 'mldr' => '', + 'mnplus' => '∓', + 'models' => '⊧', + 'Mopf' => '', + 'mp' => '∓', + 'Mscr' => '', + 'mscr' => '', + 'mstpos' => '∾', + 'mu' => 'μ', + 'multimap' => '⊸', + 'mumap' => '⊸', + 'nabla' => '∇', + 'nang' => '', + 'nap' => '≉', + 'napE' => '', + 'napid' => '', + 'napprox' => '≉', + 'natur' => '♮', + 'natural' => '♮', + 'nbsp' => ' ', + 'ncap' => '', + 'ncong' => '≇', + 'ncongdot' => '', + 'ncup' => '', + 'ndash' => '–', + 'ne' => '≠', + 'nearhk' => '', + 'neArr' => '⇗', + 'nearr' => '↗', + 'nearrow' => '↗', + 'nedot' => '', + 'nequiv' => '≢', + 'nesear' => '', + 'NestedGreaterGreater' => '≫', + 'NestedLessLess' => '≪', + 'nexist' => '∄', + 'nexists' => '∄', + 'Nfr' => '', + 'nfr' => '', + 'ngE' => '≱', + 'nge' => '', + 'ngeq' => '', + 'ngeqq' => '≱', + 'ngeqslant' => '≱', + 'nges' => '≱', + 'nGg' => '', + 'ngsim' => '≵', + 'nGt' => '', + 'ngt' => '≯', + 'ngtr' => '≯', + 'nGtv' => '', + 'nhArr' => '⇎', + 'nharr' => '↮', + 'nhpar' => '', + 'ni' => '∍', + 'nis' => '', + 'nisd' => '', + 'niv' => '∋', + 'nlArr' => '⇍', + 'nlarr' => '↚', + 'nldr' => '‥', + 'nlE' => '≰', + 'nle' => '', + 'nLeftarrow' => '⇍', + 'nleftarrow' => '↚', + 'nLeftrightarrow' => '⇎', + 'nleftrightarrow' => '↮', + 'nleq' => '', + 'nleqq' => '≰', + 'nleqslant' => '≰', + 'nles' => '≰', + 'nless' => '≮', + 'nLl' => '', + 'nlsim' => '≴', + 'nLt' => '', + 'nlt' => '≮', + 'nltri' => '⋪', + 'nltrie' => '⋬', + 'nLtv' => '', + 'nmid' => '∤', + 'Nopf' => 'ℕ', + 'Not' => '', + 'not' => '¬', + 'NotCongruent' => '≢', + 'NotDoubleVerticalBar' => '∦', + 'NotElement' => '∉', + 'NotEqual' => '≠', + 'NotExists' => '∄', + 'NotGreater' => '≯', + 'NotGreaterEqual' => '', + 'NotGreaterFullEqual' => '≰', + 'NotGreaterGreater' => '', + 'NotGreaterLess' => '≹', + 'NotGreaterSlantEqual' => '≱', + 'NotGreaterTilde' => '≵', + 'notin' => '∉', + 'notindot' => '', + 'notinE' => '', + 'notinva' => '', + 'notinvb' => '', + 'notinvc' => '', + 'NotLeftTriangle' => '⋪', + 'NotLeftTriangleEqual' => '⋬', + 'NotLess' => '≮', + 'NotLessEqual' => '', + 'NotLessFullEqual' => '≰', + 'NotLessGreater' => '≸', + 'NotLessLess' => '', + 'NotLessSlantEqual' => '≰', + 'NotLessTilde' => '≴', + 'notni' => '∌', + 'notniva' => '∌', + 'notnivb' => '', + 'notnivc' => '', + 'NotPrecedes' => '⊀', + 'NotPrecedesEqual' => '', + 'NotPrecedesSlantEqual' => '⋠', + 'NotReverseElement' => '∌', + 'NotRightTriangle' => '⋫', + 'NotRightTriangleEqual' => '⋭', + 'NotSquareSubsetEqual' => '⋢', + 'NotSquareSupersetEqual' => '⋣', + 'NotSubset' => '⊄', + 'NotSucceeds' => '⊁', + 'NotSucceedsEqual' => '', + 'NotSucceedsSlantEqual' => '⋡', + 'NotSuperset' => '⊅', + 'NotTilde' => '≁', + 'NotTildeEqual' => '≄', + 'NotTildeFullEqual' => '≇', + 'NotTildeTilde' => '≉', + 'NotVerticalBar' => '∤', + 'npar' => '∦', + 'nparallel' => '∦', + 'nparsl' => '', + 'npart' => '', + 'npolint' => '', + 'npr' => '⊀', + 'nprcue' => '⋠', + 'npre' => '', + 'nprec' => '⊀', + 'npreceq' => '', + 'nrArr' => '⇏', + 'nrarr' => '↛', + 'nrarrc' => '', + 'nrarrw' => '', + 'nRightarrow' => '⇏', + 'nrightarrow' => '↛', + 'nrtri' => '⋫', + 'nrtrie' => '⋭', + 'nsc' => '⊁', + 'nsccue' => '⋡', + 'nsce' => '', + 'Nscr' => '', + 'nscr' => '', + 'nshortmid' => '', + 'nshortparallel' => '', + 'nsim' => '≁', + 'nsime' => '≄', + 'nsimeq' => '≄', + 'nsmid' => '', + 'nspar' => '', + 'nsqsube' => '⋢', + 'nsqsupe' => '⋣', + 'nsub' => '⊄', + 'nsubE' => '⊈', + 'nsube' => '⊈', + 'nsubset' => '⊄', + 'nsubseteq' => '⊈', + 'nsubseteqq' => '⊈', + 'nsucc' => '⊁', + 'nsucceq' => '', + 'nsup' => '⊅', + 'nsupE' => '⊉', + 'nsupe' => '⊉', + 'nsupset' => '⊅', + 'nsupseteq' => '⊉', + 'nsupseteqq' => '⊉', + 'ntgl' => '≹', + 'ntlg' => '≸', + 'ntriangleleft' => '⋪', + 'ntrianglelefteq' => '⋬', + 'ntriangleright' => '⋫', + 'ntrianglerighteq' => '⋭', + 'ntvgl' => '≹', + 'ntvlg' => '≸', + 'nu' => 'ν', + 'num' => '#', + 'numsp' => ' ', + 'nvap' => '', + 'nVDash' => '⊯', + 'nVdash' => '⊮', + 'nvDash' => '⊭', + 'nvdash' => '⊬', + 'nvge' => '≱', + 'nvgt' => '≯', + 'nvhArr*' => '⇎', + 'nvinfin' => '', + 'nvlArr' => '⇍', + 'nvle' => '≰', + 'nvlt' => '≮', + 'nvltrie' => '', + 'nvrArr' => '⇏', + 'nvrtrie' => '', + 'nvsim' => '', + 'nwarhk' => '', + 'nwArr' => '⇖', + 'nwarr' => '↖', + 'nwarrow' => '↖', + 'nwnear' => '', + 'oast' => '⊛', + 'ocir' => '⊚', + 'odash' => '⊝', + 'odiv' => '', + 'odot' => '⊙', + 'odsold' => '', + 'ofcir' => '', + 'Ofr' => '', + 'ofr' => '', + 'ogon' => '̨', + 'ogt' => '', + 'ohbar' => '', + 'ohm' => 'Ω', + 'oint' => '∮', + 'olarr' => '↺', + 'olcir' => '', + 'olcross' => '', + 'olt' => '', + 'Omega' => 'Ω', + 'omega' => 'ω', + 'omicron' => 'ξ', + 'omid' => '', + 'ominus' => '⊖', + 'Oopf' => '', + 'opar' => '', + 'OpenCurlyDoubleQuote' => '“', + 'OpenCurlyQuote' => '‘', + 'operp' => '', + 'oplus' => '⊕', + 'Or' => '', + 'or' => '∨', + 'orarr' => '↻', + 'ord' => '', + 'order' => 'ℴ', + 'ordf' => 'ª', + 'ordm' => 'º', + 'origof' => '⊶', + 'oror' => '', + 'orslope' => '', + 'orv' => '', + 'oS' => '', + 'Oscr' => '', + 'oscr' => '', + 'oslash' => '⊘', + 'osol' => '⊘', + 'Otimes' => '', + 'otimes' => '⊗', + 'otimesas' => '', + 'ovbar' => '', + 'OverLine' => '̅', + 'par' => '∥', + 'para' => '¶', + 'parallel' => '∥', + 'parsim' => '', + 'parsl' => '', + 'part' => '∂', + 'PartialD' => '∂', + 'percnt' => '%', + 'period' => '.', + 'permil' => '‰', + 'perp' => '⊥', + 'pertenk' => '‱', + 'Pfr' => '', + 'pfr' => '', + 'Phi' => 'Φ', + 'phi' => 'φ', + 'phiv' => 'ϕ', + 'phmmat' => 'ℳ', + 'phone' => '☎', + 'Pi' => 'Π', + 'pi' => 'π', + 'pitchfork' => '⋔', + 'piv' => 'ϖ', + 'plank' => '', + 'plankv' => 'ℏ', + 'plus' => '+', + 'plusacir' => '', + 'plusb' => '⊞', + 'pluscir' => '', + 'plusdo' => '∔', + 'plusdu' => '', + 'pluse' => '', + 'PlusMinus' => '±', + 'plusmn' => '±', + 'plussim' => '', + 'plustwo' => '', + 'pm' => '±', + 'pointint' => '', + 'Popf' => 'ℙ', + 'pound' => '£', + 'Pr' => '', + 'pr' => '≺', + 'prap' => '≾', + 'prcue' => '≼', + 'prE' => '≼', + 'pre' => '≼', + 'prec' => '≺', + 'precapprox' => '≾', + 'preccurlyeq' => '≼', + 'Precedes' => '≺', + 'PrecedesEqual' => '≼', + 'PrecedesSlantEqual' => '≼', + 'PrecedesTilde' => '≾', + 'preceq' => '≼', + 'precnapprox' => '⋨', + 'precneqq' => '', + 'precnsim' => '⋨', + 'precsim' => '≾', + 'Prime' => '″', + 'prime' => '′', + 'prnap' => '⋨', + 'prnE' => '', + 'prnsim' => '⋨', + 'profalar' => '⌮', + 'profline' => '⌒', + 'profsurf' => '⌓', + 'prop' => '∝', + 'Proportion' => '∷', + 'Proportional' => '∝', + 'propto' => '∝', + 'prsim' => '≾', + 'prurel' => '⊰', + 'Pscr' => '', + 'pscr' => '', + 'Psi' => 'Ψ', + 'psi' => 'ψ', + 'puncsp' => ' ', + 'Qfr' => '', + 'qfr' => '', + 'qint' => '', + 'Qopf' => 'ℚ', + 'qprime' => '', + 'Qscr' => '', + 'qscr' => '', + 'quatint' => '', + 'quest' => '?', + 'questeq' => '≟', + 'quot' => '"', + 'rAarr' => '⇛', + 'race' => '', + 'radic' => '√', + 'raemptyv' => '', + 'Rang' => '》', + 'rang' => '〉', + 'rangd' => '', + 'range' => '', + 'rangle' => '〉', + 'raquo' => '»', + 'Rarr' => '↠', + 'rArr' => '⇒', + 'rarr' => '→', + 'rarrap' => '', + 'rarrbfs' => '', + 'rarrc' => '', + 'rarrfs' => '', + 'rarrhk' => '↪', + 'rarrlp' => '↬', + 'rarrpl' => '', + 'rarrsim' => '', + 'Rarrtl' => '', + 'rarrtl' => '↣', + 'rarrw' => '↝', + 'rAtail' => '', + 'ratail' => '↣', + 'ratio' => '∶', + 'RBarr' => '', + 'rBarr' => '', + 'rbarr' => '', + 'rbbrk' => '〕', + 'rbrace' => '}', + 'rbrack' => ']', + 'rbrke' => '', + 'rbrksld' => '', + 'rbrkslu' => '', + 'rceil' => '⌉', + 'rcub' => '}', + 'rdca' => '', + 'rdldhar' => '', + 'rdquo' => '”', + 'rdquor' => '‛', + 'rdsh' => '↳', + 'Re' => 'ℜ', + 'real' => 'ℜ', + 'rect' => '', + 'reg' => '¯', + 'ReverseElement' => '∋', + 'ReverseEquilibrium' => '⇋', + 'ReverseUpEquilibrium' => '', + 'rfisht' => '', + 'rfloor' => '⌋', + 'Rfr' => '', + 'rfr' => '', + 'rHar' => '', + 'rhard' => '⇁', + 'rharu' => '⇀', + 'rharul' => '', + 'rho' => 'ρ', + 'rhov' => 'ϱ', + 'RightAngleBracket' => '〉', + 'RightArrow' => '→', + 'Rightarrow' => '⇒', + 'rightarrow' => '→', + 'RightArrowLeftArrow' => '⇄', + 'rightarrowtail' => '↣', + 'RightCeiling' => '⌉', + 'RightDownVector' => '⇂', + 'RightFloor' => '⌋', + 'rightharpoondown' => '⇁', + 'rightharpoonup' => '⇀', + 'rightleftarrows' => '⇄', + 'rightleftharpoons' => '⇌', + 'rightrightarrows' => '⇉', + 'rightsquigarrow' => '↝', + 'RightTee' => '⊢', + 'RightTeeArrow' => '↦', + 'rightthreetimes' => '⋌', + 'RightTriangle' => '⊳', + 'RightTriangleEqual' => '⊵', + 'RightUpVector' => '↾', + 'RightVector' => '⇀', + 'ring' => '̊', + 'risingdotseq' => '≓', + 'rlarr' => '⇄', + 'rlhar' => '⇌', + 'rmoust' => '', + 'rmoustache' => '', + 'rnmid' => '', + 'roang' => '〙', + 'roarr' => '', + 'robrk' => '〛', + 'ropar' => '', + 'Ropf' => 'ℝ', + 'roplus' => '', + 'rotimes' => '', + 'rpar' => ')', + 'rpargt' => '', + 'rppolint' => '', + 'rrarr' => '⇉', + 'Rrightarrow' => '⇛', + 'Rscr' => '', + 'rscr' => 'ℛ', + 'Rsh' => '↱', + 'rsh' => '↱', + 'rsqb' => ']', + 'rsquo' => '’', + 'rsquor' => '‟', + 'rthree' => '⋌', + 'rtimes' => '⋊', + 'rtri' => '▹', + 'rtrie' => '⊵', + 'rtrif' => '▸', + 'rtriltri' => '', + 'ruluhar' => '', + 'rx' => '℞', + 'Sc' => '', + 'sc' => '≻', + 'scap' => '≿', + 'sccue' => '≽', + 'scE' => '≾', + 'sce' => '≽', + 'scnap' => '⋩', + 'scnE' => '', + 'scnsim' => '⋩', + 'scpolint' => '', + 'scsim' => '≿', + 'sdot' => '⋅', + 'sdotb' => '⊡', + 'sdote' => '', + 'searhk' => '', + 'seArr' => '⇘', + 'searr' => '↘', + 'searrow' => '↘', + 'sect' => '§', + 'semi' => ';', + 'seswar' => '', + 'setminus' => '∖', + 'setmn' => '∖', + 'sext' => '', + 'Sfr' => '', + 'sfr' => '', + 'sfrown' => '', + 'sharp' => '♯', + 'ShortLeftArrow' => '', + 'shortmid' => '', + 'shortparallel' => '', + 'ShortRightArrow' => '', + 'shy' => '­', + 'Sigma' => 'Σ', + 'sigma' => 'σ', + 'sigmav' => 'ς', + 'sim' => '∼', + 'simdot' => '', + 'sime' => '≃', + 'simeq' => '≃', + 'simg' => '', + 'simgE' => '', + 'siml' => '', + 'simlE' => '', + 'simne' => '≆', + 'simplus' => '', + 'simrarr' => '', + 'slarr' => '', + 'SmallCircle' => '∘', + 'smallfrown' => '', + 'smallsetminus' => '', + 'smallsmile' => '', + 'smashp' => '', + 'smeparsl' => '', + 'smid' => '', + 'smile' => '⌣', + 'smt' => '', + 'smte' => '', + 'smtes' => '', + 'sol' => '/', + 'solb' => '', + 'solbar' => '', + 'Sopf' => '', + 'spades' => '♠', + 'spadesuit' => '♠', + 'spar' => '', + 'sqcap' => '⊓', + 'sqcaps' => '', + 'sqcup' => '⊔', + 'sqcups' => '', + 'Sqrt' => '√', + 'sqsub' => '⊏', + 'sqsube' => '⊑', + 'sqsubset' => '⊏', + 'sqsubseteq' => '⊑', + 'sqsup' => '⊐', + 'sqsupe' => '⊒', + 'sqsupset' => '⊐', + 'sqsupseteq' => '⊒', + 'squ' => '□', + 'square' => '□', + 'SquareIntersection' => '⊓', + 'SquareSubset' => '⊏', + 'SquareSubsetEqual' => '⊑', + 'SquareSuperset' => '⊐', + 'SquareSupersetEqual' => '⊒', + 'SquareUnion' => '⊔', + 'squarf' => '■', + 'squarfb' => '', + 'squarfbl' => '', + 'squarfbr' => '◪', + 'squarfl' => '◧', + 'squarfr' => '◨', + 'squarft' => '', + 'squarftl' => '◩', + 'squarftr' => '', + 'squf' => '▪', + 'srarr' => '', + 'Sscr' => '', + 'sscr' => '', + 'ssetmn' => '', + 'ssmile' => '', + 'sstarf' => '⋆', + 'Star' => '⋆', + 'star' => '⋆', + 'starf' => '★', + 'straightepsilon' => '∊', + 'straightphi' => 'φ', + 'strns' => '', + 'Sub' => '⋐', + 'sub' => '⊂', + 'subdot' => '', + 'subE' => '⊆', + 'sube' => '⊆', + 'subedot' => '', + 'submult' => '', + 'subnE' => '⊊', + 'subne' => '⊊', + 'subplus' => '', + 'subrarr' => '', + 'Subset' => '⋐', + 'subset' => '⊂', + 'subseteq' => '⊆', + 'subseteqq' => '⊆', + 'SubsetEqual' => '⊆', + 'subsetneq' => '⊊', + 'subsetneqq' => '⊊', + 'subsim' => '', + 'subsub' => '', + 'subsup' => '', + 'succ' => '≻', + 'succapprox' => '≿', + 'succcurlyeq' => '≽', + 'Succeeds' => '≻', + 'SucceedsEqual' => '≽', + 'SucceedsSlantEqual' => '≽', + 'SucceedsTilde' => '≿', + 'succeq' => '≽', + 'succnapprox' => '⋩', + 'succneqq' => '', + 'succnsim' => '⋩', + 'succsim' => '≿', + 'SuchThat' => '∍', + 'Sum' => '∑', + 'sum' => '∑', + 'sung' => '♩', + 'Sup' => '⋑', + 'sup' => '⊃', + 'sup1' => '¹', + 'sup2' => '²', + 'sup3' => '³', + 'supdot' => '', + 'supdsub' => '', + 'supE' => '⊇', + 'supe' => '⊇', + 'supedot' => '', + 'Superset' => '⊃', + 'SupersetEqual' => '⊇', + 'suphsol' => '', + 'suphsub' => '', + 'suplarr' => '', + 'supmult' => '', + 'supnE' => '⊋', + 'supne' => '⊋', + 'supplus' => '', + 'Supset' => '⋑', + 'supset' => '⊃', + 'supseteq' => '⊇', + 'supseteqq' => '⊇', + 'supsetneq' => '⊋', + 'supsetneqq' => '⊋', + 'supsim' => '', + 'supsub' => '', + 'supsup' => '', + 'swarhk' => '', + 'swArr' => '⇙', + 'swarr' => '↙', + 'swarrow' => '↙', + 'swnwar' => '', + 'target' => '⌖', + 'tau' => 'τ', + 'tbrk' => '', + 'tdot' => '⃛', + 'telrec' => '⌕', + 'Tfr' => '', + 'tfr' => '', + 'there4' => '∴', + 'Therefore' => '∴', + 'therefore' => '∴', + 'Theta' => 'Θ', + 'theta' => 'θ', + 'thetav' => 'ϑ', + 'thickapprox' => '', + 'thicksim' => '', + 'thinsp' => ' ', + 'thkap' => '', + 'thksim' => '', + 'Tilde' => '∼', + 'tilde' => '̃', + 'TildeEqual' => '≃', + 'TildeFullEqual' => '≅', + 'TildeTilde' => '≈', + 'times' => '×', + 'timesb' => '⊠', + 'timesbar' => '', + 'timesd' => '', + 'tint' => '∭', + 'toea' => '', + 'top' => '⊤', + 'topbot' => '⌶', + 'topcir' => '', + 'Topf' => '', + 'topfork' => '', + 'tosa' => '', + 'tprime' => '‴', + 'trade' => '™', + 'triangle' => '▵', + 'triangledown' => '▿', + 'triangleleft' => '◃', + 'trianglelefteq' => '⊴', + 'triangleq' => '≜', + 'triangleright' => '▹', + 'trianglerighteq' => '⊵', + 'tridot' => '◬', + 'trie' => '≜', + 'triminus' => '', + 'TripleDot' => '⃛', + 'triplus' => '', + 'trisb' => '', + 'tritime' => '', + 'trpezium' => '', + 'Tscr' => '', + 'tscr' => '', + 'twixt' => '≬', + 'twoheadleftarrow' => '↞', + 'twoheadrightarrow' => '↠', + 'Uarr' => '↟', + 'uArr' => '⇑', + 'uarr' => '↑', + 'Uarrocir' => '', + 'udarr' => '⇅', + 'udhar' => '', + 'ufisht' => '', + 'Ufr' => '', + 'ufr' => '', + 'uHar' => '', + 'uharl' => '↿', + 'uharr' => '↾', + 'uhblk' => '▀', + 'ulcorn' => '⌜', + 'ulcorner' => '⌜', + 'ulcrop' => '⌏', + 'ultri' => '', + 'uml' => '̈', + 'UnderLine' => '̲', + 'Union' => '⋃', + 'UnionPlus' => '⊎', + 'Uopf' => '', + 'UpArrow' => '↑', + 'Uparrow' => '⇑', + 'uparrow' => '↑', + 'UpArrowDownArrow' => '⇅', + 'UpDownArrow' => '↕', + 'Updownarrow' => '⇕', + 'updownarrow' => '↕', + 'UpEquilibrium' => '', + 'upharpoonleft' => '↿', + 'upharpoonright' => '↾', + 'uplus' => '⊎', + 'UpperLeftArrow' => '↖', + 'UpperRightArrow' => '↗', + 'Upsi' => 'ϒ', + 'upsi' => 'υ', + 'Upsilon' => 'ϒ', + 'upsilon' => 'υ', + 'UpTee' => '⊥', + 'upuparrows' => '⇈', + 'urcorn' => '⌝', + 'urcorner' => '⌝', + 'urcrop' => '⌎', + 'urtri' => '', + 'Uscr' => '', + 'uscr' => '', + 'utdot' => '⋰', + 'utri' => '▵', + 'utrif' => '▴', + 'uuarr' => '⇈', + 'uwangle' => '', + 'vangrt' => '⊾', + 'varepsilon' => 'ε', + 'varkappa' => 'ϰ', + 'varnothing' => '∅', + 'varphi' => 'ϕ', + 'varpi' => 'ϖ', + 'varpropto' => '∝', + 'vArr' => '⇕', + 'varr' => '↕', + 'varrho' => 'ϱ', + 'varsigma' => 'ς', + 'varsubsetneq' => '', + 'varsubsetneqq' => '', + 'varsupsetneq' => '', + 'varsupsetneqq' => '', + 'vartheta' => 'ϑ', + 'vartriangleleft' => '⊲', + 'vartriangleright' => '⊳', + 'Vbar' => '', + 'vBar' => '', + 'vBarv' => '', + 'VDash' => '⊫', + 'Vdash' => '⊩', + 'vDash' => '⊨', + 'vdash' => '⊢', + 'Vdashl' => '', + 'Vee' => '⋁', + 'vee' => '∨', + 'veebar' => '⊻', + 'veeeq' => '≚', + 'vellip' => '⋮', + 'Verbar' => '‖', + 'verbar' => '|', + 'Vert' => '‖', + 'vert' => '|', + 'VerticalBar' => '∣', + 'VerticalTilde' => '≀', + 'Vfr' => '', + 'vfr' => '', + 'vltri' => '⊲', + 'vnsub' => '⊄', + 'vnsup' => '⊅', + 'Vopf' => '', + 'vprop' => '∝', + 'vrtri' => '⊳', + 'Vscr' => '', + 'vscr' => '', + 'vsubnE' => '', + 'vsubne' => '', + 'vsupnE' => '', + 'vsupne' => '', + 'Vvdash' => '⊪', + 'vzigzag' => '', + 'wedbar' => '', + 'Wedge' => '⋀', + 'wedge' => '∧', + 'wedgeq' => '≙', + 'weierp' => '℘', + 'Wfr' => '', + 'wfr' => '', + 'Wopf' => '', + 'wp' => '℘', + 'wr' => '≀', + 'wreath' => '≀', + 'Wscr' => '', + 'wscr' => '', + 'xcap' => '⋂', + 'xcirc' => '○', + 'xcup' => '⋃', + 'xdtri' => '▽', + 'Xfr' => '', + 'xfr' => '', + 'xhArr' => '', + 'xharr' => '', + 'Xi' => 'Ξ', + 'xi' => 'ξ', + 'xlArr' => '', + 'xlarr' => '', + 'xmap' => '', + 'xnis' => '', + 'xodot' => '⊙', + 'Xopf' => '', + 'xoplus' => '⊕', + 'xotime' => '⊗', + 'xrArr' => '', + 'xrarr' => '', + 'Xscr' => '', + 'xscr' => '', + 'xsqcup' => '⊔', + 'xuplus' => '⊎', + 'xutri' => '△', + 'xvee' => '⋁', + 'xwedge' => '⋀', + 'yen' => '¥', + 'Yfr' => '', + 'yfr' => '', + 'Yopf' => '', + 'Yscr' => '', + 'yscr' => '', + 'zeta' => 'ζ', + 'Zfr' => 'ℤ', + 'zfr' => '', + 'zigrarr' => '', + 'Zopf' => '', + 'Zscr' => '', + 'zscr' => '' ); diff --git a/ecrire/charsets/translit.php b/ecrire/charsets/translit.php index c4911c7a07..84ab0eb5b3 100644 --- a/ecrire/charsets/translit.php +++ b/ecrire/charsets/translit.php @@ -3,101 +3,392 @@ /** * Déclaration pour la translitteration simple des correspondances entre * caractères unicodes spécifiques et caractères simples la plage ASCII - * + * * @package SPIP\Core\Charsets -**/ + **/ -$GLOBALS['CHARSET']['translit'] = array ( +$GLOBALS['CHARSET']['translit'] = array( // latin [fausse plage] -128=>'EUR', 131=>'f', 140=>'OE', 147=>'\'\'', 148=>'\'\'', -153=>'(TM)', 156=>'oe', 159=>'Y', + 128 => 'EUR', + 131 => 'f', + 140 => 'OE', + 147 => '\'\'', + 148 => '\'\'', + 153 => '(TM)', + 156 => 'oe', + 159 => 'Y', // latin [legal] -160=>' ', 161=>'!', 162=>'c', 163=>'L', 164=>'O', 165=>'yen',166=>'|', -167=>'p',169=>'(c)', 171=>'<<',172=>'-',173=>'-',174=>'(R)', -176=>'o',177=>'+-',181=>'mu',182=>'p',183=>'.',186=>'o ',187=>'>>', -191=>'?', 192=>'A', -193=>'A', 194=>'A', 195=>'A', 196=>'A', 197=>'A', 198=>'AE', 199=>'C', -200=>'E', 201=>'E', 202=>'E', 203=>'E', 204=>'I', 205=>'I', 206=>'I', -207=>'I', 209=>'N', 210=>'O', 211=>'O', 212=>'O', 213=>'O', 214=>'O', -216=>'O', 217=>'U', 218=>'U', 219=>'U', 220=>'U', 223=>'ss', 224=>'a', -225=>'a', 226=>'a', 227=>'a', 228=>'a', 229=>'a', 230=>'ae', 231=>'c', -232=>'e', 233=>'e', 234=>'e', 235=>'e', 236=>'i', 237=>'i', 238=>'i', -239=>'i', 241=>'n', 242=>'o', 243=>'o', 244=>'o', 245=>'o', 246=>'o', -248=>'o', 249=>'u', 250=>'u', 251=>'u', 252=>'u', 255=>'y', + 160 => ' ', + 161 => '!', + 162 => 'c', + 163 => 'L', + 164 => 'O', + 165 => 'yen', + 166 => '|', + 167 => 'p', + 169 => '(c)', + 171 => '<<', + 172 => '-', + 173 => '-', + 174 => '(R)', + 176 => 'o', + 177 => '+-', + 181 => 'mu', + 182 => 'p', + 183 => '.', + 186 => 'o ', + 187 => '>>', + 191 => '?', + 192 => 'A', + 193 => 'A', + 194 => 'A', + 195 => 'A', + 196 => 'A', + 197 => 'A', + 198 => 'AE', + 199 => 'C', + 200 => 'E', + 201 => 'E', + 202 => 'E', + 203 => 'E', + 204 => 'I', + 205 => 'I', + 206 => 'I', + 207 => 'I', + 209 => 'N', + 210 => 'O', + 211 => 'O', + 212 => 'O', + 213 => 'O', + 214 => 'O', + 216 => 'O', + 217 => 'U', + 218 => 'U', + 219 => 'U', + 220 => 'U', + 223 => 'ss', + 224 => 'a', + 225 => 'a', + 226 => 'a', + 227 => 'a', + 228 => 'a', + 229 => 'a', + 230 => 'ae', + 231 => 'c', + 232 => 'e', + 233 => 'e', + 234 => 'e', + 235 => 'e', + 236 => 'i', + 237 => 'i', + 238 => 'i', + 239 => 'i', + 241 => 'n', + 242 => 'o', + 243 => 'o', + 244 => 'o', + 245 => 'o', + 246 => 'o', + 248 => 'o', + 249 => 'u', + 250 => 'u', + 251 => 'u', + 252 => 'u', + 255 => 'y', // turc -286=>'G', 287=>'g', 304=>'I', 305=>'i', 350=>'S', 351=>'s', + 286 => 'G', + 287 => 'g', + 304 => 'I', + 305 => 'i', + 350 => 'S', + 351 => 's', // esperanto -264 => 'Cx',265 => 'cx', -284 => 'Gx',285 => 'gx', -292 => 'Hx',293 => 'hx', -308 => 'Jx',309 => 'jx', -348 => 'Sx',349 => 'sx', -364 => 'Ux',365 => 'ux', + 264 => 'Cx', + 265 => 'cx', + 284 => 'Gx', + 285 => 'gx', + 292 => 'Hx', + 293 => 'hx', + 308 => 'Jx', + 309 => 'jx', + 348 => 'Sx', + 349 => 'sx', + 364 => 'Ux', + 365 => 'ux', // latin2 [Czech] -283=>'e', 353=>'s', 269=>'c', 345=>'r', 382=>'z', -367=>'u', 328=>'n', 357=>'t', 271=>'d', 449=>'o', -282=>'E', 352=>'S', 268=>'C', 344=>'R', 381=>'Z', -366=>'U', 327=>'N', 356=>'T', 270=>'D', 467=>'O', + 283 => 'e', + 353 => 's', + 269 => 'c', + 345 => 'r', + 382 => 'z', + 367 => 'u', + 328 => 'n', + 357 => 't', + 271 => 'd', + 449 => 'o', + 282 => 'E', + 352 => 'S', + 268 => 'C', + 344 => 'R', + 381 => 'Z', + 366 => 'U', + 327 => 'N', + 356 => 'T', + 270 => 'D', + 467 => 'O', // francais -338=>'OE', 339=>'oe', 376=>'Y', 402=>'f', + 338 => 'OE', + 339 => 'oe', + 376 => 'Y', + 402 => 'f', //polskie -260=>'A', 261=>'a', 262=>'C', 263=>'c', -280=>'E', 281=>'e', 321=>'L', 322=>'l', -323=>'N', 324=>'n', 346=>'S', 347=>'s', -377=>'Z', 378=>'z', 379=>'Z', 380=>'z', + 260 => 'A', + 261 => 'a', + 262 => 'C', + 263 => 'c', + 280 => 'E', + 281 => 'e', + 321 => 'L', + 322 => 'l', + 323 => 'N', + 324 => 'n', + 346 => 'S', + 347 => 's', + 377 => 'Z', + 378 => 'z', + 379 => 'Z', + 380 => 'z', //roumain -258=>'A', 259=>'a', 350=>'S', 351=>'s', 354=>'T', 355=>'t', + 258 => 'A', + 259 => 'a', + 350 => 'S', + 351 => 's', + 354 => 'T', + 355 => 't', // cyrillique -1026=>'D%', 1027=>'G%', 8218=>'\'', 1107=>'g%', 8222=>'"', 8230=>'...', -8224=>'/-', 8225=>'/=', 8364=>'EUR', 8240=>'0/00', 1033=>'LJ', -8249=>'<', 1034=>'NJ', 1036=>'KJ', 1035=>'Ts', 1039=>'DZ', 1106=>'d%', -8216=>'`', 8217=>'\'', 8220=>'"', 8221=>'"', 8226=>' o ', 8211=>'-', -8212=>'--', 8212=>'~', 8482=>'(TM)', 1113=>'lj', 8250=>'>', 1114=>'nj', -1116=>'kj', 1115=>'ts', 1119=>'dz', 1038=>'V%', 1118=>'v%', 1032=>'J%', -1168=>'G3', 1025=>'IO', 1028=>'IE', 1031=>'YI', 1030=>'II', -1110=>'ii', 1169=>'g3', 1105=>'io', 8470=>'No.', 1108=>'ie', -1112=>'j%', 1029=>'DS', 1109=>'ds', 1111=>'yi', 1040=>'A', 1041=>'B', -1042=>'V', 1043=>'G', 1044=>'D', 1045=>'E', 1046=>'ZH', 1047=>'Z', -1048=>'I', 1049=>'J', 1050=>'K', 1051=>'L', 1052=>'M', 1053=>'N', -1054=>'O', 1055=>'P', 1056=>'R', 1057=>'S', 1058=>'T', 1059=>'U', -1060=>'F', 1061=>'H', 1062=>'C', 1063=>'CH', 1064=>'SH', 1065=>'SCH', -1066=>'"', 1067=>'Y', 1068=>'\'', 1069=>'`E', 1070=>'YU', 1071=>'YA', -1072=>'a', 1073=>'b', 1074=>'v', 1075=>'g', 1076=>'d', 1077=>'e', -1078=>'zh', 1079=>'z', 1080=>'i', 1081=>'j', 1082=>'k', 1083=>'l', -1084=>'m', 1085=>'n', 1086=>'o', 1087=>'p', 1088=>'r', 1089=>'s', -1090=>'t', 1091=>'u', 1092=>'f', 1093=>'h', 1094=>'c', 1095=>'ch', -1096=>'sh', 1097=>'sch', 1098=>'"', 1099=>'y', 1100=>'\'', 1101=>'`e', -1102=>'yu', 1103=>'ya', + 1026 => 'D%', + 1027 => 'G%', + 8218 => '\'', + 1107 => 'g%', + 8222 => '"', + 8230 => '...', + 8224 => '/-', + 8225 => '/=', + 8364 => 'EUR', + 8240 => '0/00', + 1033 => 'LJ', + 8249 => '<', + 1034 => 'NJ', + 1036 => 'KJ', + 1035 => 'Ts', + 1039 => 'DZ', + 1106 => 'd%', + 8216 => '`', + 8217 => '\'', + 8220 => '"', + 8221 => '"', + 8226 => ' o ', + 8211 => '-', + 8212 => '--', + 8212 => '~', + 8482 => '(TM)', + 1113 => 'lj', + 8250 => '>', + 1114 => 'nj', + 1116 => 'kj', + 1115 => 'ts', + 1119 => 'dz', + 1038 => 'V%', + 1118 => 'v%', + 1032 => 'J%', + 1168 => 'G3', + 1025 => 'IO', + 1028 => 'IE', + 1031 => 'YI', + 1030 => 'II', + 1110 => 'ii', + 1169 => 'g3', + 1105 => 'io', + 8470 => 'No.', + 1108 => 'ie', + 1112 => 'j%', + 1029 => 'DS', + 1109 => 'ds', + 1111 => 'yi', + 1040 => 'A', + 1041 => 'B', + 1042 => 'V', + 1043 => 'G', + 1044 => 'D', + 1045 => 'E', + 1046 => 'ZH', + 1047 => 'Z', + 1048 => 'I', + 1049 => 'J', + 1050 => 'K', + 1051 => 'L', + 1052 => 'M', + 1053 => 'N', + 1054 => 'O', + 1055 => 'P', + 1056 => 'R', + 1057 => 'S', + 1058 => 'T', + 1059 => 'U', + 1060 => 'F', + 1061 => 'H', + 1062 => 'C', + 1063 => 'CH', + 1064 => 'SH', + 1065 => 'SCH', + 1066 => '"', + 1067 => 'Y', + 1068 => '\'', + 1069 => '`E', + 1070 => 'YU', + 1071 => 'YA', + 1072 => 'a', + 1073 => 'b', + 1074 => 'v', + 1075 => 'g', + 1076 => 'd', + 1077 => 'e', + 1078 => 'zh', + 1079 => 'z', + 1080 => 'i', + 1081 => 'j', + 1082 => 'k', + 1083 => 'l', + 1084 => 'm', + 1085 => 'n', + 1086 => 'o', + 1087 => 'p', + 1088 => 'r', + 1089 => 's', + 1090 => 't', + 1091 => 'u', + 1092 => 'f', + 1093 => 'h', + 1094 => 'c', + 1095 => 'ch', + 1096 => 'sh', + 1097 => 'sch', + 1098 => '"', + 1099 => 'y', + 1100 => '\'', + 1101 => '`e', + 1102 => 'yu', + 1103 => 'ya', // vietnamien en translitteration de base -7843=>"a",7841=>"a",7845=>"a",7847=>"a",7849=>"a",7851=>"a",7853=>"a", -7855=>"a",7857=>"a",7859=>"a",7861=>"a",7863=>"a", -7842=>"A",7840=>"A",7844=>"A",7846=>"A",7848=>"A", -7850=>"A",7852=>"A",7854=>"A",7856=>"A",7858=>"A",7860=>"A", -7862=>"A",7867=>"e",7869=>"e",7865=>"e", -7871=>"e",7873=>"e",7875=>"e",7877=>"e",7879=>"e", -7866=>"E",7868=>"E",7864=>"E",7870=>"E",7872=>"E",7874=>"E", -7876=>"E",7878=>"E",7881=>"i",7883=>"i", -7880=>"I",7882=>"I", -7887=>"o",7885=>"o",7889=>"o",7891=>"o",7893=>"o", -7895=>"o",7897=>"o",417=>"o",7899=>"o",7901=>"o",7903=>"o",7905=>"o", -7907=>"o",7886=>"O",7884=>"O", -7888=>"O",7890=>"O",7892=>"O",7894=>"O",7896=>"O",416=>"O",7898=>"O", -7900=>"O",7902=>"O",7904=>"O",7906=>"O",7911=>"u", -361=>"u",7909=>"u",432=>"u",7913=>"u",7915=>"u",7917=>"u",7919=>"u", -7921=>"u",7910=>"U",360=>"U",7908=>"U",431=>"U", -7912=>"U",7914=>"U",7916=>"U",7918=>"U",7920=>"U",253=>"y",7923=>"y", -7927=>"y",7929=>"y",7925=>"y",221=>"Y",7922=>"Y",7926=>"Y",7928=>"Y", -7924=>"Y",273=>"d" + 7843 => "a", + 7841 => "a", + 7845 => "a", + 7847 => "a", + 7849 => "a", + 7851 => "a", + 7853 => "a", + 7855 => "a", + 7857 => "a", + 7859 => "a", + 7861 => "a", + 7863 => "a", + 7842 => "A", + 7840 => "A", + 7844 => "A", + 7846 => "A", + 7848 => "A", + 7850 => "A", + 7852 => "A", + 7854 => "A", + 7856 => "A", + 7858 => "A", + 7860 => "A", + 7862 => "A", + 7867 => "e", + 7869 => "e", + 7865 => "e", + 7871 => "e", + 7873 => "e", + 7875 => "e", + 7877 => "e", + 7879 => "e", + 7866 => "E", + 7868 => "E", + 7864 => "E", + 7870 => "E", + 7872 => "E", + 7874 => "E", + 7876 => "E", + 7878 => "E", + 7881 => "i", + 7883 => "i", + 7880 => "I", + 7882 => "I", + 7887 => "o", + 7885 => "o", + 7889 => "o", + 7891 => "o", + 7893 => "o", + 7895 => "o", + 7897 => "o", + 417 => "o", + 7899 => "o", + 7901 => "o", + 7903 => "o", + 7905 => "o", + 7907 => "o", + 7886 => "O", + 7884 => "O", + 7888 => "O", + 7890 => "O", + 7892 => "O", + 7894 => "O", + 7896 => "O", + 416 => "O", + 7898 => "O", + 7900 => "O", + 7902 => "O", + 7904 => "O", + 7906 => "O", + 7911 => "u", + 361 => "u", + 7909 => "u", + 432 => "u", + 7913 => "u", + 7915 => "u", + 7917 => "u", + 7919 => "u", + 7921 => "u", + 7910 => "U", + 360 => "U", + 7908 => "U", + 431 => "U", + 7912 => "U", + 7914 => "U", + 7916 => "U", + 7918 => "U", + 7920 => "U", + 253 => "y", + 7923 => "y", + 7927 => "y", + 7929 => "y", + 7925 => "y", + 221 => "Y", + 7922 => "Y", + 7926 => "Y", + 7928 => "Y", + 7924 => "Y", + 273 => "d" ); diff --git a/ecrire/charsets/translitcomplexe.php b/ecrire/charsets/translitcomplexe.php index 49953fb94e..369eba8358 100644 --- a/ecrire/charsets/translitcomplexe.php +++ b/ecrire/charsets/translitcomplexe.php @@ -15,44 +15,166 @@ * caractères unicodes spécifiques et caractères simples la plage ASCII * * Ajoute des caractères supplémentaires à la déclaration de translitteration simple - * + * * @package SPIP\Core\Charsets -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} load_charset('translit'); $trans = $GLOBALS['CHARSET']['translit']; -$translit_c = array ( +$translit_c = array( // vietnamien -225=>"a'", 224=>"a`",7843=>"a?",227=>"a~",7841=>"a.", -226=>"a^",7845=>"a^'",7847=>"a^`",7849=>"a^?",7851=>"a^~",7853=>"a^.",259=>"a(", -7855=>"a('",7857=>"a(`",7859=>"a(?",7861=>"a(~",7863=>"a(.",193=>"A'",192=>"A`", -7842=>"A?",195=>"A~",7840=>"A.",194=>"A^",7844=>"A^'",7846=>"A^`",7848=>"A^?", -7850=>"A^~",7852=>"A^.",258=>"A(",7854=>"A('",7856=>"A(`",7858=>"A(?",7860=>"A(~", -7862=>"A(.",233=>"e'",232=>"e`",7867=>"e?",7869=>"e~",7865=>"e.",234=>"e^", -7871=>"e^'",7873=>"e^`",7875=>"e^?",7877=>"e^~",7879=>"e^.",201=>"E'",200=>"E`", -7866=>"E?",7868=>"E~",7864=>"E.",202=>"E^",7870=>"E^'",7872=>"E^`",7874=>"E^?", -7876=>"E^~",7878=>"E^.",237=>"i'",236=>"i`",7881=>"i?",297=>"i~",7883=>"i.", -205=>"I'",204=>"I`",7880=>"I?",296=>"I~",7882=>"I.",243=>"o'",242=>"o`", -7887=>"o?",245=>"o~",7885=>"o.",244=>"o^",7889=>"o^'",7891=>"o^`",7893=>"o^?", -7895=>"o^~",7897=>"o^.",417=>"o+",7899=>"o+'",7901=>"o+`",7903=>"o+?",7905=>"o+~", -7907=>"o+.",211=>"O'",210=>"O`",7886=>"O?",213=>"O~",7884=>"O.",212=>"O^", -7888=>"O^'",7890=>"O^`",7892=>"O^?",7894=>"O^~",7896=>"O^.",416=>"O+",7898=>"O+'", -7900=>"O+`",7902=>"O+?",7904=>"O+~",7906=>"O+.",250=>"u'",249=>"u`",7911=>"u?", -361=>"u~",7909=>"u.",432=>"u+",7913=>"u+'",7915=>"u+`",7917=>"u+?",7919=>"u+~", -7921=>"u+.",218=>"U'",217=>"U`",7910=>"U?",360=>"U~",7908=>"U.",431=>"U+", -7912=>"U+'",7914=>"U+`",7916=>"U+?",7918=>"U+~",7920=>"U+.",253=>"y'",7923=>"y`", -7927=>"y?",7929=>"y~",7925=>"y.",221=>"Y'",7922=>"Y`",7926=>"Y?",7928=>"Y~", -7924=>"Y.",273=>"d-",208=>"D-", + 225 => "a'", + 224 => "a`", + 7843 => "a?", + 227 => "a~", + 7841 => "a.", + 226 => "a^", + 7845 => "a^'", + 7847 => "a^`", + 7849 => "a^?", + 7851 => "a^~", + 7853 => "a^.", + 259 => "a(", + 7855 => "a('", + 7857 => "a(`", + 7859 => "a(?", + 7861 => "a(~", + 7863 => "a(.", + 193 => "A'", + 192 => "A`", + 7842 => "A?", + 195 => "A~", + 7840 => "A.", + 194 => "A^", + 7844 => "A^'", + 7846 => "A^`", + 7848 => "A^?", + 7850 => "A^~", + 7852 => "A^.", + 258 => "A(", + 7854 => "A('", + 7856 => "A(`", + 7858 => "A(?", + 7860 => "A(~", + 7862 => "A(.", + 233 => "e'", + 232 => "e`", + 7867 => "e?", + 7869 => "e~", + 7865 => "e.", + 234 => "e^", + 7871 => "e^'", + 7873 => "e^`", + 7875 => "e^?", + 7877 => "e^~", + 7879 => "e^.", + 201 => "E'", + 200 => "E`", + 7866 => "E?", + 7868 => "E~", + 7864 => "E.", + 202 => "E^", + 7870 => "E^'", + 7872 => "E^`", + 7874 => "E^?", + 7876 => "E^~", + 7878 => "E^.", + 237 => "i'", + 236 => "i`", + 7881 => "i?", + 297 => "i~", + 7883 => "i.", + 205 => "I'", + 204 => "I`", + 7880 => "I?", + 296 => "I~", + 7882 => "I.", + 243 => "o'", + 242 => "o`", + 7887 => "o?", + 245 => "o~", + 7885 => "o.", + 244 => "o^", + 7889 => "o^'", + 7891 => "o^`", + 7893 => "o^?", + 7895 => "o^~", + 7897 => "o^.", + 417 => "o+", + 7899 => "o+'", + 7901 => "o+`", + 7903 => "o+?", + 7905 => "o+~", + 7907 => "o+.", + 211 => "O'", + 210 => "O`", + 7886 => "O?", + 213 => "O~", + 7884 => "O.", + 212 => "O^", + 7888 => "O^'", + 7890 => "O^`", + 7892 => "O^?", + 7894 => "O^~", + 7896 => "O^.", + 416 => "O+", + 7898 => "O+'", + 7900 => "O+`", + 7902 => "O+?", + 7904 => "O+~", + 7906 => "O+.", + 250 => "u'", + 249 => "u`", + 7911 => "u?", + 361 => "u~", + 7909 => "u.", + 432 => "u+", + 7913 => "u+'", + 7915 => "u+`", + 7917 => "u+?", + 7919 => "u+~", + 7921 => "u+.", + 218 => "U'", + 217 => "U`", + 7910 => "U?", + 360 => "U~", + 7908 => "U.", + 431 => "U+", + 7912 => "U+'", + 7914 => "U+`", + 7916 => "U+?", + 7918 => "U+~", + 7920 => "U+.", + 253 => "y'", + 7923 => "y`", + 7927 => "y?", + 7929 => "y~", + 7925 => "y.", + 221 => "Y'", + 7922 => "Y`", + 7926 => "Y?", + 7928 => "Y~", + 7924 => "Y.", + 273 => "d-", + 208 => "D-", // allemand -228=>'ae',246=>'oe',252=>'ue',196=>'Ae',214=>'Oe',220=>'Ue' + 228 => 'ae', + 246 => 'oe', + 252 => 'ue', + 196 => 'Ae', + 214 => 'Oe', + 220 => 'Ue' ); -foreach($translit_c as $u=>$t) +foreach ($translit_c as $u => $t) { $trans[$u] = $t; +} $GLOBALS['CHARSET']['translitcomplexe'] = $trans; ?> diff --git a/ecrire/exec/403.php b/ecrire/exec/403.php index d4688d2ff2..d1e51533ca 100644 --- a/ecrire/exec/403.php +++ b/ecrire/exec/403.php @@ -12,16 +12,20 @@ /** * Gestion d'affichage d'accès interdit + * * @package SPIP\Core\Exec */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Un exec d'acces interdit + * * @param string $message */ -function exec_403_dist($message = ''){ +function exec_403_dist($message = '') { $exec = _request('exec'); @@ -29,32 +33,34 @@ function exec_403_dist($message = ''){ $navigation = ""; $extra = ""; - if (!$message) - $message = _L("Vous n'avez pas le droit d'accéder à la page <b>@exec@</b>.",array('exec'=>_request('exec'))); + if (!$message) { + $message = _L("Vous n'avez pas le droit d'accéder à la page <b>@exec@</b>.", + array('exec' => _request('exec'))); + } - $contenu = "<h1 class='grostitre'>"._T('info_acces_interdit')."</h1>" . $message; + $contenu = "<h1 class='grostitre'>" . _T('info_acces_interdit') . "</h1>" . $message; if (_request('var_zajax')) { include_spip('inc/actions'); ajax_retour($contenu); - } - else { + } else { include_spip('inc/presentation'); // alleger les inclusions avec un inc/presentation_mini - $commencer_page = charger_fonction('commencer_page','inc'); + $commencer_page = charger_fonction('commencer_page', 'inc'); echo $commencer_page($titre); - echo debut_gauche("403_$exec",true); - echo recuperer_fond('prive/squelettes/navigation/dist',array()); - echo pipeline('affiche_gauche',array('args'=>array('exec'=>'403','exec_erreur'=>$exec),'data'=>'')); + echo debut_gauche("403_$exec", true); + echo recuperer_fond('prive/squelettes/navigation/dist', array()); + echo pipeline('affiche_gauche', array('args' => array('exec' => '403', 'exec_erreur' => $exec), 'data' => '')); - echo creer_colonne_droite("403",true); - echo pipeline('affiche_droite',array('args'=>array('exec'=>'403','exec_erreur'=>$exec),'data'=>'')); + echo creer_colonne_droite("403", true); + echo pipeline('affiche_droite', array('args' => array('exec' => '403', 'exec_erreur' => $exec), 'data' => '')); - echo debut_droite("403",true); - echo pipeline('affiche_milieu',array('args'=>array('exec'=>'403','exec_erreur'=>$exec),'data'=>$contenu)); + echo debut_droite("403", true); + echo pipeline('affiche_milieu', + array('args' => array('exec' => '403', 'exec_erreur' => $exec), 'data' => $contenu)); - echo fin_gauche(),fin_page(); + echo fin_gauche(), fin_page(); } } diff --git a/ecrire/exec/404.php b/ecrire/exec/404.php index 1688938ded..e77bd92b54 100644 --- a/ecrire/exec/404.php +++ b/ecrire/exec/404.php @@ -12,15 +12,18 @@ /** * Gestion d'affichage de page introuvable + * * @package SPIP\Core\Exec */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Un exec d'erreur */ -function exec_404_dist(){ +function exec_404_dist() { $exec = _request('exec'); @@ -29,20 +32,20 @@ function exec_404_dist(){ $extra = ""; include_spip('inc/presentation'); // alleger les inclusions avec un inc/presentation_mini - $commencer_page = charger_fonction('commencer_page','inc'); + $commencer_page = charger_fonction('commencer_page', 'inc'); echo $commencer_page($titre); - echo debut_gauche("404_$exec",true); - echo pipeline('affiche_gauche',array('args'=>array('exec'=>'404','exec_erreur'=>$exec),'data'=>'')); + echo debut_gauche("404_$exec", true); + echo pipeline('affiche_gauche', array('args' => array('exec' => '404', 'exec_erreur' => $exec), 'data' => '')); - echo creer_colonne_droite("404",true); - echo pipeline('affiche_droite',array('args'=>array('exec'=>'404','exec_erreur'=>$exec),'data'=>'')); + echo creer_colonne_droite("404", true); + echo pipeline('affiche_droite', array('args' => array('exec' => '404', 'exec_erreur' => $exec), 'data' => '')); - echo debut_droite("404",true); - echo "<h1 class='grostitre'>"._T('fichier_introuvable',array('fichier'=>$exec))."</h1>"; - echo pipeline('affiche_milieu',array('args'=>array('exec'=>'404','exec_erreur'=>$exec),'data'=>'')); + echo debut_droite("404", true); + echo "<h1 class='grostitre'>" . _T('fichier_introuvable', array('fichier' => $exec)) . "</h1>"; + echo pipeline('affiche_milieu', array('args' => array('exec' => '404', 'exec_erreur' => $exec), 'data' => '')); - echo fin_gauche(),fin_page(); + echo fin_gauche(), fin_page(); } ?> diff --git a/ecrire/exec/admin_plugin.php b/ecrire/exec/admin_plugin.php index 0dbf3317bb..4e4b4f2f97 100644 --- a/ecrire/exec/admin_plugin.php +++ b/ecrire/exec/admin_plugin.php @@ -12,10 +12,13 @@ /** * Gestion d'affichage de l'administration des plugins + * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/config'); include_spip('inc/plugin'); @@ -28,33 +31,32 @@ include_spip('inc/securiser_action'); * Affichage de la page de gestion des plugins * * Relance la page si des plugins ont été modifiés, sinon affiche la liste. - * + * * @uses actualise_plugins_actifs() * @param string $retour Inutilisé */ - function exec_admin_plugin_dist($retour = '') { +function exec_admin_plugin_dist($retour = '') { if (!autoriser('configurer', '_plugins')) { include_spip('inc/minipres'); echo minipres(); } else { - // on fait la verif du path avant tout, - // et l'installation des qu'on est dans la colonne principale - // si jamais la liste des plugins actifs change, il faut faire un refresh du hit - // pour etre sur que les bons fichiers seront charges lors de l'install + // on fait la verif du path avant tout, + // et l'installation des qu'on est dans la colonne principale + // si jamais la liste des plugins actifs change, il faut faire un refresh du hit + // pour etre sur que les bons fichiers seront charges lors de l'install $new = actualise_plugins_actifs(); - if ($new AND _request('actualise')<2) { + if ($new AND _request('actualise') < 2) { include_spip('inc/headers'); - redirige_par_entete(parametre_url(self(),'actualise',_request('actualise')+1,'&')); - } - else { + redirige_par_entete(parametre_url(self(), 'actualise', _request('actualise')+1, '&')); + } else { admin_plug_args(_request('voir'), _request('erreur'), _request('format')); } } } /** - * Affichage spécifique de la page de gestion des plugins + * Affichage spécifique de la page de gestion des plugins * * Affiche la liste des plugins demandés et les erreurs éventuelles. * @@ -62,21 +64,22 @@ include_spip('inc/securiser_action'); * @uses liste_chemin_plugin() * @uses plugin_installes_meta() * @uses affiche_les_plugins_verrouilles() - * + * * @pipeline_appel affiche_gauche * @pipeline_appel affiche_droit * @pipeline_appel affiche_milieu - * + * * @param string $quoi * Quels plugins afficher ? actifs, ou autre * @param string $erreur * Erreur éventuelle à afficher * @param string $format * Format d'affichage (liste ou arborescence) -**/ -function admin_plug_args($quoi, $erreur, $format) -{ - if (!$quoi) $quoi = 'actifs'; + **/ +function admin_plug_args($quoi, $erreur, $format) { + if (!$quoi) { + $quoi = 'actifs'; + } // empecher l'affichage des erreurs dans le bandeau, on le donne ensuite // format brut par plugin $GLOBALS['erreurs_activation_raw'] = plugin_donne_erreurs(true, false); @@ -85,105 +88,115 @@ function admin_plug_args($quoi, $erreur, $format) $commencer_page = charger_fonction('commencer_page', 'inc'); echo $commencer_page(_T('icone_admin_plugin'), "configuration", "plugin"); - echo debut_gauche('plugin',true); - echo recuperer_fond('prive/squelettes/navigation/configurer',array('exec'=>'admin_plugin')); + echo debut_gauche('plugin', true); + echo recuperer_fond('prive/squelettes/navigation/configurer', array('exec' => 'admin_plugin')); echo pipeline('affiche_gauche', array( - 'args'=>array('exec'=>'admin_plugin'), - 'data'=>afficher_librairies() + 'args' => array('exec' => 'admin_plugin'), + 'data' => afficher_librairies() ) ); echo debut_droite('plugin', true); - echo gros_titre(_T('icone_admin_plugin'),'',false); + echo gros_titre(_T('icone_admin_plugin'), '', false); // Barre d'onglets de premier niveau echo barre_onglets("plugins", "plugins_actifs"); // Barre d'onglets de second niveau - $onglet2 = $quoi=='actifs' ? 'plugins_actifs' : 'admin_plugin'; + $onglet2 = $quoi == 'actifs' ? 'plugins_actifs' : 'admin_plugin'; echo debut_onglet('onglets_simple second'); echo onglet(_T('plugins_tous_liste'), generer_url_ecrire("admin_plugin", "voir=tous"), 'admin_plugin', $onglet2); echo onglet(_T('plugins_actifs_liste'), generer_url_ecrire("admin_plugin"), 'plugins_actifs', $onglet2); echo fin_onglet(); // message d'erreur au retour d'une operation - if ($erreur) + if ($erreur) { echo "<div class='error'>$erreur</div>"; - if ($erreur_activation){ + } + if ($erreur_activation) { echo "<div class='error'>$erreur_activation</div>"; } // la mise a jour de cette meta a ete faite par ecrire_plugin_actifs $actifs = unserialize($GLOBALS['meta']['plugin']); - $lcpa = $actifs + unserialize($GLOBALS['meta']['plugin_attente']); + $lcpa = $actifs+unserialize($GLOBALS['meta']['plugin_attente']); // Les affichages se basent sur le repertoire, pas sur le nom $actifs = liste_chemin_plugin($actifs, ''); - if (defined('_DIR_PLUGINS_SUPPL')) - $lcpas = liste_chemin_plugin($lcpa,_DIR_PLUGINS_SUPPL); + if (defined('_DIR_PLUGINS_SUPPL')) { + $lcpas = liste_chemin_plugin($lcpa, _DIR_PLUGINS_SUPPL); + } $lcpa = liste_chemin_plugin($lcpa); - + // on installe les plugins maintenant, // cela permet aux scripts d'install de faire des affichages (moches...) plugin_installes_meta(); echo "<div class='liste-plugins formulaire_spip'>"; - echo debut_cadre_trait_couleur('plugin-24.png',true,'',_T('plugins_liste'), 'plugins'); + echo debut_cadre_trait_couleur('plugin-24.png', true, '', _T('plugins_liste'), 'plugins'); - if ($quoi!=='actifs'){ + if ($quoi !== 'actifs') { $lpf = liste_plugin_files(); - if ($lpf) - echo "<p>"._T('texte_presente_plugin')."</p>"; - else { - if (!@is_dir(_DIR_PLUGINS)) - echo "<p>"._T('plugin_info_automatique_ftp',array('rep'=>joli_repertoire(_DIR_PLUGINS))) - . " — "._T('plugin_info_automatique_creer')."</p>"; + if ($lpf) { + echo "<p>" . _T('texte_presente_plugin') . "</p>"; + } else { + if (!@is_dir(_DIR_PLUGINS)) { + echo "<p>" . _T('plugin_info_automatique_ftp', array('rep' => joli_repertoire(_DIR_PLUGINS))) + . " — " . _T('plugin_info_automatique_creer') . "</p>"; + } } $lcpaffiche = $lpf; - if (defined('_DIR_PLUGINS_SUPPL')) + if (defined('_DIR_PLUGINS_SUPPL')) { $lcpaffichesup = liste_plugin_files(_DIR_PLUGINS_SUPPL); - } - else { + } + } else { // la liste // $quoi=='actifs' $lcpaffiche = $lcpa; - if (defined('_DIR_PLUGINS_SUPPL')) + if (defined('_DIR_PLUGINS_SUPPL')) { $lcpaffichesup = $lcpas; + } } - if ($quoi=='actifs' OR $lpf){ + if ($quoi == 'actifs' OR $lpf) { $nb = count($lcpa); - if (defined('_DIR_PLUGINS_SUPPL')) + if (defined('_DIR_PLUGINS_SUPPL')) { $nb += count($lcpas); - echo "<h3>".sinon(singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'), _T('plugins_actif_aucun'))."</h3>"; + } + echo "<h3>" . sinon(singulier_ou_pluriel($nb, 'plugins_actif_un', 'plugins_actifs', 'count'), + _T('plugins_actif_aucun')) . "</h3>"; } - if (empty($format)) - $format = 'liste'; - elseif (!in_array($format,array('liste','repertoires'))) + if (empty($format)) { + $format = 'liste'; + } elseif (!in_array($format, array('liste', 'repertoires'))) { $format = 'repertoires'; + } - $afficher = charger_fonction("afficher_$format",'plugins'); - $corps = $afficher(self(),$lcpaffiche, $lcpa, $actifs); - if (defined('_DIR_PLUGINS_SUPPL')) - $corps .= $afficher(self(),$lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL); + $afficher = charger_fonction("afficher_$format", 'plugins'); + $corps = $afficher(self(), $lcpaffiche, $lcpa, $actifs); + if (defined('_DIR_PLUGINS_SUPPL')) { + $corps .= $afficher(self(), $lcpaffichesup, $lcpas, $actifs, _DIR_PLUGINS_SUPPL); + } - if ($corps) - $corps .= "\n<div class='boutons' style='display:none;'>" - . "<input type='submit' class='submit save' value='"._T('bouton_enregistrer') - ."' />" - . "</div>"; + if ($corps) { + $corps .= "\n<div class='boutons' style='display:none;'>" + . "<input type='submit' class='submit save' value='" . _T('bouton_enregistrer') + . "' />" + . "</div>"; + } - echo redirige_action_post('activer_plugins','activer','admin_plugin','', $corps); + echo redirige_action_post('activer_plugins', 'activer', 'admin_plugin', '', $corps); echo fin_cadre_trait_couleur(true); - if ($quoi=='actifs') + if ($quoi == 'actifs') { echo affiche_les_plugins_verrouilles($actifs); + } echo "</div>"; - - echo http_script(" + + echo http_script(" jQuery(function(){ jQuery('.plugins li.item a[rel=info]').click(function(){ var li = jQuery(this).parents('li').eq(0); @@ -211,8 +224,8 @@ function admin_plug_args($quoi, $erreur, $format) echo pipeline('affiche_milieu', array( - 'args'=>array('exec'=>'admin_plugin'), - 'data'=>'' + 'args' => array('exec' => 'admin_plugin'), + 'data' => '' ) ); @@ -223,25 +236,26 @@ function admin_plug_args($quoi, $erreur, $format) * Crée le code HTML de la liste des plugins verrouillés * * @uses liste_plugin_files() - * + * * @param array $actifs * Liste des plugins actifs * @return string * Code HTML -**/ -function affiche_les_plugins_verrouilles($actifs) -{ - if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) return ''; + **/ +function affiche_les_plugins_verrouilles($actifs) { + if ((!$liste = liste_plugin_files(_DIR_PLUGINS_DIST))) { + return ''; + } - $afficher = charger_fonction("afficher_liste",'plugins'); + $afficher = charger_fonction("afficher_liste", 'plugins'); $liste = $afficher(self(), $liste, array(), $actifs, _DIR_PLUGINS_DIST); - return + return "<div id='plugins_dist'>" - . debut_cadre_trait_couleur('',true,'',_T('plugins_liste_dist'), 'liste_plugins_dist') + . debut_cadre_trait_couleur('', true, '', _T('plugins_liste_dist'), 'liste_plugins_dist') . "<p>" . _T('plugin_info_plugins_dist_1', array('plugins_dist' => joli_repertoire(_DIR_PLUGINS_DIST))) - . '<br />'. _T('plugin_info_plugins_dist_2') + . '<br />' . _T('plugin_info_plugins_dist_2') . "</p>" . $liste . fin_cadre_trait_couleur(true) @@ -252,41 +266,50 @@ function affiche_les_plugins_verrouilles($actifs) * Crée le code HTML de la liste des librairies présentes * * @uses liste_librairies() - * + * * @return string Code HTML */ -function afficher_librairies(){ +function afficher_librairies() { - if (!$libs = liste_librairies()) return ''; + if (!$libs = liste_librairies()) { + return ''; + } ksort($libs); $res = debut_cadre_enfonce('', true, '', _T('plugin_librairies_installees')); $res .= '<dl>'; - foreach ($libs as $lib => $rep) - $res .= "<dt>$lib</dt><dd>".joli_repertoire($rep)."</dd>\n"; + foreach ($libs as $lib => $rep) { + $res .= "<dt>$lib</dt><dd>" . joli_repertoire($rep) . "</dd>\n"; + } $res .= '</dl>'; $res .= fin_cadre_enfonce(true); + return $res; } /** * Faire la liste des librairies disponibles - * + * * @return array * Tableau (nom de la lib => repertoire , ...) */ function liste_librairies() { $libs = array(); foreach (array_reverse(creer_chemin()) as $d) { - if (is_dir($dir = $d.'lib/') - AND $t = @opendir($dir)) { + if (is_dir($dir = $d . 'lib/') + AND $t = @opendir($dir) + ) { while (($f = readdir($t)) !== false) { if ($f[0] != '.' - AND is_dir("$dir/$f")) + AND is_dir("$dir/$f") + ) { $libs[$f] = $dir; + } } } } + return $libs; } + ?> diff --git a/ecrire/exec/base_delete_all.php b/ecrire/exec/base_delete_all.php index 9911e6288a..d7eef5139f 100644 --- a/ecrire/exec/base_delete_all.php +++ b/ecrire/exec/base_delete_all.php @@ -12,38 +12,43 @@ /** * Gestion d'affichage de la page de destruction des tables de SPIP + * * @package SPIP\Core\Exec */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Exec de la page de destruction des tables de SPIP -**/ -function exec_base_delete_all_dist() -{ + **/ +function exec_base_delete_all_dist() { include_spip('inc/autoriser'); if (!autoriser('detruire')) { include_spip('inc/minipres'); echo minipres(); } else { include_spip('base/dump'); - $res = base_lister_toutes_tables('',array(),array(),true); + $res = base_lister_toutes_tables('', array(), array(), true); if (!$res) { - include_spip('inc/minipres'); + include_spip('inc/minipres'); spip_log("Erreur base de donnees"); - echo minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'). "<p><tt>".sql_errno()." ".sql_error()."</tt></p>"); + echo minipres(_T('info_travaux_titre'), + _T('titre_probleme_technique') . "<p><tt>" . sql_errno() . " " . sql_error() . "</tt></p>"); } else { $res = base_saisie_tables('delete', $res); include_spip('inc/headers'); $res = "\n<ol style='text-align:left'><li>\n" . - join("</li>\n<li>", $res) . - '</li></ol>'; + join("</li>\n<li>", $res) . + '</li></ol>'; $admin = charger_fonction('admin', 'inc'); $res = $admin('delete_all', _T('titre_page_delete_all'), $res); - if (!$res) - redirige_url_ecrire('install',''); - else echo $res; + if (!$res) { + redirige_url_ecrire('install', ''); + } else { + echo $res; + } } } } diff --git a/ecrire/exec/base_repair.php b/ecrire/exec/base_repair.php index 08027b93b4..b769ff7fb7 100644 --- a/ecrire/exec/base_repair.php +++ b/ecrire/exec/base_repair.php @@ -12,33 +12,33 @@ /** * Gestion d'affichage de la page de réparation de la base de données - * + * * ## REMARQUE IMPORTANTE : SÉCURITÉ - * + * * Ce systeme de réparation doit pouvoir fonctionner même si * la table spip_auteurs est en panne : index.php n'appelle donc pas * inc_auth ; seule l'authentification FTP est exigée. * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Réparer la base de données */ -function exec_base_repair_dist() -{ +function exec_base_repair_dist() { $ok = false; - if (!spip_connect()) - $message = _T('titre_probleme_technique'); - else { + if (!spip_connect()) { + $message = _T('titre_probleme_technique'); + } else { $version_sql = sql_version(); - if (!$version_sql) + if (!$version_sql) { $message = _T('avis_erreur_connexion_mysql'); - else { + } else { $message = _T('texte_requetes_echouent'); $ok = true; } @@ -52,4 +52,5 @@ function exec_base_repair_dist() echo minipres(_T('titre_reparation'), "<p>$message</p>"); } } + ?> diff --git a/ecrire/exec/demande_mise_a_jour.php b/ecrire/exec/demande_mise_a_jour.php index fc85e8cfef..2d72483c99 100644 --- a/ecrire/exec/demande_mise_a_jour.php +++ b/ecrire/exec/demande_mise_a_jour.php @@ -16,11 +16,13 @@ * * Chargé depuis ecrire/index.php lorsque les numéros de versions de base * entre les fichiers et la meta ne sont pas identiques. - * + * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -32,7 +34,7 @@ function exec_demande_mise_a_jour_dist() { // si jamais la liste des plugins actifs change, il faut faire un refresh du hit // pour etre sur que les bons fichiers seront charges lors de l'install include_spip('inc/plugin'); - if (actualise_plugins_actifs()){ + if (actualise_plugins_actifs()) { include_spip('inc/headers'); redirige_par_entete(self()); } @@ -40,17 +42,18 @@ function exec_demande_mise_a_jour_dist() { include_spip('inc/presentation'); include_spip('inc/filtres_boites'); $commencer_page = charger_fonction('commencer_page', 'inc'); - echo $commencer_page('','','','',true,false,false); + echo $commencer_page('', '', '', '', true, false, false); echo debut_grand_cadre(true); - echo boite_ouvrir(_T('info_message_technique'),'notice'); - echo "<p>"._T('info_procedure_maj_version')."</p>", - "<p>"._T('info_administrateur_site_01')."</p>"; - echo bouton_action(_T('bouton_mettre_a_jour_base'),generer_url_ecrire("upgrade","reinstall=non")); + echo boite_ouvrir(_T('info_message_technique'), 'notice'); + echo "<p>" . _T('info_procedure_maj_version') . "</p>", + "<p>" . _T('info_administrateur_site_01') . "</p>"; + echo bouton_action(_T('bouton_mettre_a_jour_base'), generer_url_ecrire("upgrade", "reinstall=non")); echo boite_fermer(); // masquer les erreurs sql sur cette page car proviennent de la base pas a jour ! echo '<style type="text/css">#debug-nav {display: none;}</style>'; echo fin_grand_cadre(true); echo fin_page(); } + ?> diff --git a/ecrire/exec/fond.php b/ecrire/exec/fond.php index 4e4edec9af..5d5e1f15cf 100644 --- a/ecrire/exec/fond.php +++ b/ecrire/exec/fond.php @@ -16,11 +16,13 @@ * Chargé depuis ecrire/index.php lorsqu'une page demandée est présente * en tant que squelettes dans `prive/squelettes/contenu` ou que le * squelette peut être échaffaudé - * + * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} $fond = _request('exec'); @@ -28,14 +30,15 @@ $GLOBALS['delais'] = 0;// pas de cache ! // Securite if (strstr($fond, '/')) { if (!include_spip('inc/autoriser') - OR !autoriser('webmestre')) { + OR !autoriser('webmestre') + ) { include_spip('inc/minipres'); echo minipres(); exit; } -} -else +} else { $fond = "prive/squelettes/$fond"; +} // quelques inclusions et ini prealables include_spip('inc/commencer_page'); @@ -44,19 +47,20 @@ include_spip('inc/commencer_page'); * Fonction appelée en cas d'arrêt de php sur une erreur * * @todo supprimer cette fonction vide ? -**/ -function shutdown_error(){ + **/ +function shutdown_error() { // si on arrive ici avec un tampon non ferme : erreur fatale -/* if (ob_get_level()){ - // envoyer tous les tampons - while (ob_get_level()) - ob_end_flush(); + /* if (ob_get_level()){ + // envoyer tous les tampons + while (ob_get_level()) + ob_end_flush(); - var_dump(error_get_last()); - #echo "<hr />"."Erreur fatale (memoire ?)<hr />"; - @flush(); - }*/ + var_dump(error_get_last()); + #echo "<hr />"."Erreur fatale (memoire ?)<hr />"; + @flush(); + }*/ } + register_shutdown_function('shutdown_error'); @@ -73,10 +77,10 @@ ob_end_flush(); /** * Un exec générique qui branche sur un squelette Z pour écrire - * + * * La fonction ne fait rien, c'est l'inclusion du fichier qui déclenche le traitement */ -function exec_fond_dist(){ +function exec_fond_dist() { } diff --git a/ecrire/exec/fond_monobloc.php b/ecrire/exec/fond_monobloc.php index 0aae94136b..1c4b6a7d97 100644 --- a/ecrire/exec/fond_monobloc.php +++ b/ecrire/exec/fond_monobloc.php @@ -18,106 +18,109 @@ * * @deprecated * Il faut créer les squelettes de l'espace privé dans `prive/squelettes` - * + * * @package SPIP\Core\Exec */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Un exec générique qui utilise le fond homonyme de l'exec demandé * dans l'URL - * + * * Ancien système transitoire basé sur un squelette unique avec un * pseudo balisage par commentaires HTML - * + * * @deprecated Ne plus utiliser. Migrer vers `prive/squelettes/` - * + * * @pipeline_appel affiche_hierarchie * @pipeline_appel affiche_gauche * @pipeline_appel affiche_droite * @pipeline_appel affiche_milieu * */ -function exec_fond_monobloc_dist(){ +function exec_fond_monobloc_dist() { // pas d'autorisation // c'est au fond de les gerer avec #AUTORISER, et de renvoyer un fond vide le cas echeant // qui declenchera un minipres acces interdit $exec = _request('exec'); - $fond = trim(recuperer_fond("prive/exec/$exec",$_REQUEST)); + $fond = trim(recuperer_fond("prive/exec/$exec", $_REQUEST)); if (!$fond) { include_spip('inc/minipres'); echo minipres(); } else { - $titre = "exec_$exec"; - $hierarchie = ""; - $navigation = ""; - $extra = ""; - - // recuperer le titre dans le premier hn de la page - if (preg_match(",<h[1-6][^>]*>(.+)</h[1-6]>,Uims",$fond,$match)){ - $titre = $match[1]; - } - - // recuperer la hierarchie (au-dessus du contenu) - if (preg_match(",<!--#hierarchie-->.+<!--/#hierarchie-->,Uims",$fond,$match)){ - $hierarchie = $match[0]; - $fond = str_replace($hierarchie,"",$fond); - } - - // recuperer la navigation (colonne de gauche) - if (preg_match(",<!--#navigation-->.+<!--/#navigation-->,Uims",$fond,$match)){ - $navigation = $match[0]; - $fond = str_replace($navigation,"",$fond); - } - - // recuperer les extras (colonne de droite) - if (preg_match(",<!--#extra-->.+<!--/#extra-->,Uims",$fond,$match)){ - $extra = $match[0]; - $fond = str_replace($extra,"",$fond); - } - - include_spip('inc/presentation'); // alleger les inclusions avec un inc/presentation_mini - $commencer_page = charger_fonction('commencer_page','inc'); - echo $commencer_page($titre); - - if ($hierarchie){ - echo debut_grand_cadre(true); - echo pipeline( - 'affiche_hierarchie', - array( - 'args' => array( - 'exec' => $exec - ), - 'data' => $hierarchie - ) - ); - echo fin_grand_cadre(true); - } - - echo debut_gauche("exec_$exec",true); - - $contexte = array('exec'=>$exec); - if ($objet_exec = trouver_objet_exec($exec)){ - $id = $objet_exec['id_table_objet']; - if (_request($id)) - $contexte[$id] = _request($id); - } - - echo $navigation; - echo pipeline('affiche_gauche',array('args'=>$contexte,'data'=>'')); - - echo creer_colonne_droite("exec_$exec",true); - echo $extra; - echo pipeline('affiche_droite',array('args'=>$contexte,'data'=>'')); - - echo debut_droite("exec_$exec",true); - echo $fond; - echo pipeline('affiche_milieu',array('args'=>$contexte,'data'=>'')); - - echo fin_gauche(),fin_page(); + $titre = "exec_$exec"; + $hierarchie = ""; + $navigation = ""; + $extra = ""; + + // recuperer le titre dans le premier hn de la page + if (preg_match(",<h[1-6][^>]*>(.+)</h[1-6]>,Uims", $fond, $match)) { + $titre = $match[1]; + } + + // recuperer la hierarchie (au-dessus du contenu) + if (preg_match(",<!--#hierarchie-->.+<!--/#hierarchie-->,Uims", $fond, $match)) { + $hierarchie = $match[0]; + $fond = str_replace($hierarchie, "", $fond); + } + + // recuperer la navigation (colonne de gauche) + if (preg_match(",<!--#navigation-->.+<!--/#navigation-->,Uims", $fond, $match)) { + $navigation = $match[0]; + $fond = str_replace($navigation, "", $fond); + } + + // recuperer les extras (colonne de droite) + if (preg_match(",<!--#extra-->.+<!--/#extra-->,Uims", $fond, $match)) { + $extra = $match[0]; + $fond = str_replace($extra, "", $fond); + } + + include_spip('inc/presentation'); // alleger les inclusions avec un inc/presentation_mini + $commencer_page = charger_fonction('commencer_page', 'inc'); + echo $commencer_page($titre); + + if ($hierarchie) { + echo debut_grand_cadre(true); + echo pipeline( + 'affiche_hierarchie', + array( + 'args' => array( + 'exec' => $exec + ), + 'data' => $hierarchie + ) + ); + echo fin_grand_cadre(true); + } + + echo debut_gauche("exec_$exec", true); + + $contexte = array('exec' => $exec); + if ($objet_exec = trouver_objet_exec($exec)) { + $id = $objet_exec['id_table_objet']; + if (_request($id)) { + $contexte[$id] = _request($id); + } + } + + echo $navigation; + echo pipeline('affiche_gauche', array('args' => $contexte, 'data' => '')); + + echo creer_colonne_droite("exec_$exec", true); + echo $extra; + echo pipeline('affiche_droite', array('args' => $contexte, 'data' => '')); + + echo debut_droite("exec_$exec", true); + echo $fond; + echo pipeline('affiche_milieu', array('args' => $contexte, 'data' => '')); + + echo fin_gauche(), fin_page(); } } diff --git a/ecrire/exec/info_plugin.php b/ecrire/exec/info_plugin.php index 7db46f9d56..d167050299 100644 --- a/ecrire/exec/info_plugin.php +++ b/ecrire/exec/info_plugin.php @@ -2,16 +2,19 @@ /** * Gestion d'affichage d'un descriptif de plugin en ajax + * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); /** * Affichage de la description d'un plugin (en ajax) - + * * @uses plugins_get_infos_dist() * @uses plugins_afficher_plugin_dist() * @uses affiche_bloc_plugin() @@ -23,16 +26,18 @@ function exec_info_plugin_dist() { echo minipres(); } else { $plug = _DIR_RACINE . _request('plugin'); - $get_infos = charger_fonction('get_infos','plugins'); + $get_infos = charger_fonction('get_infos', 'plugins'); $dir = ""; - if (strncmp($plug,_DIR_PLUGINS,strlen(_DIR_PLUGINS))==0) + if (strncmp($plug, _DIR_PLUGINS, strlen(_DIR_PLUGINS)) == 0) { $dir = _DIR_PLUGINS; - elseif (strncmp($plug,_DIR_PLUGINS_DIST,strlen(_DIR_PLUGINS_DIST))==0) + } elseif (strncmp($plug, _DIR_PLUGINS_DIST, strlen(_DIR_PLUGINS_DIST)) == 0) { $dir = _DIR_PLUGINS_DIST; - if ($dir) - $plug = substr($plug,strlen($dir)); - $info = $get_infos($plug,false,$dir); - $afficher_plugin = charger_fonction("afficher_plugin","plugins"); + } + if ($dir) { + $plug = substr($plug, strlen($dir)); + } + $info = $get_infos($plug, false, $dir); + $afficher_plugin = charger_fonction("afficher_plugin", "plugins"); ajax_retour(affiche_bloc_plugin($plug, $info, $dir)); } } diff --git a/ecrire/exec/informer.php b/ecrire/exec/informer.php index 420e41585f..3d5ec02072 100644 --- a/ecrire/exec/informer.php +++ b/ecrire/exec/informer.php @@ -12,10 +12,13 @@ /** * Gestion d'affichage ajax d'une rubrique sélectionnée dans le mini navigateur + * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); @@ -24,20 +27,24 @@ include_spip('inc/actions'); * * @uses inc_informer_dist() * @uses ajax_retour() -**/ -function exec_informer_dist() -{ + **/ +function exec_informer_dist() { $id = intval(_request('id')); $col = intval(_request('col')); $exclus = intval(_request('exclus')); $do = _request('do'); if (preg_match('/^\w*$/', $do)) { - if (!$do) $do = 'aff'; - + if (!$do) { + $do = 'aff'; + } + $informer = charger_fonction('informer', 'inc'); $res = $informer($id, $col, $exclus, _request('rac'), _request('type'), $do); - } else $res = ''; + } else { + $res = ''; + } ajax_retour($res); } + ?> diff --git a/ecrire/exec/install.php b/ecrire/exec/install.php index df2c9f85e9..02a4ae6fe5 100644 --- a/ecrire/exec/install.php +++ b/ecrire/exec/install.php @@ -12,11 +12,13 @@ /** * Affichage des étapes d'installation de SPIP - * + * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/minipres'); include_spip('inc/install'); @@ -30,17 +32,16 @@ define('_FILE_TMP', '_install'); * * Affiche l'étape d'installation en cours, en fonction du paramètre * d'url `etape` - * + * * @uses inc_auth_dist() * @uses verifier_visiteur() * * @uses install_etape__dist() * Affiche l'écran d'accueil de l'installation, * si aucune étape n'est encore définie. - * -**/ -function exec_install_dist() -{ + * + **/ +function exec_install_dist() { $etape = _request('etape'); $deja = (_FILE_CONNECT AND analyse_fichier_connection(_FILE_CONNECT)); @@ -59,7 +60,7 @@ function exec_install_dist() } if ($deja) { // Rien a faire ici - echo minipres(); + echo minipres(); } else { include_spip('base/create'); $fonc = charger_fonction("etape_$etape", 'install'); diff --git a/ecrire/exec/plonger.php b/ecrire/exec/plonger.php index 782399cf06..5780d61421 100644 --- a/ecrire/exec/plonger.php +++ b/ecrire/exec/plonger.php @@ -12,33 +12,40 @@ /** * Gestion d'affichage ajax des sous rubriques dans le mini navigateur + * * @package SPIP\Core\Exec */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Afficher en ajax les sous-rubriques d'une rubrique (composant du mini-navigateur) * * @uses inc_plonger_dist() * @uses ajax_retour() -**/ -function exec_plonger_dist() -{ + **/ +function exec_plonger_dist() { include_spip('inc/actions'); - + $rac = _request('rac'); $id = intval(_request('id')); $exclus = intval(_request('exclus')); $col = intval(_request('col')); - $do = _request('do'); + $do = _request('do'); if (preg_match('/^\w*$/', $do)) { - if (!$do) $do = 'aff'; + if (!$do) { + $do = 'aff'; + } $plonger = charger_fonction('plonger', 'inc'); $r = $plonger($id, spip_htmlentities($rac), array(), $col, $exclus, $do); - } else $r = ''; + } else { + $r = ''; + } ajax_retour($r); } + ?> diff --git a/ecrire/exec/puce_statut.php b/ecrire/exec/puce_statut.php index bed10c07b1..66a06cf34c 100644 --- a/ecrire/exec/puce_statut.php +++ b/ecrire/exec/puce_statut.php @@ -14,9 +14,11 @@ * Gestion des puces d'action rapide * * @package SPIP\Core\Puce_statut -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/presentation'); @@ -25,13 +27,12 @@ include_spip('inc/presentation'); * * Récupère l'identifiant id et le type d'objet dans les données postées * et appelle la fonction de traitement de cet exec. - * + * * @uses exec_puce_statut_args() * @return string Code HTML -**/ -function exec_puce_statut_dist() -{ - exec_puce_statut_args(_request('id'), _request('type')); + **/ +function exec_puce_statut_dist() { + exec_puce_statut_args(_request('id'), _request('type')); } /** @@ -43,35 +44,35 @@ function exec_puce_statut_dist() * * @uses inc_puce_statut_dist() * @uses ajax_retour() - * + * * @param int $id * Identifiant de l'objet * @param string $type * Type d'objet * @return string Code HTML -**/ -function exec_puce_statut_args($id, $type) -{ + **/ +function exec_puce_statut_args($id, $type) { if ($table_objet_sql = table_objet_sql($type) AND $d = lister_tables_objets_sql($table_objet_sql) AND isset($d['statut_textes_instituer']) - AND $d['statut_textes_instituer']) - { + AND $d['statut_textes_instituer'] + ) { $prim = id_table_objet($type); $id = intval($id); - if (isset($d['field']['id_rubrique'])) + if (isset($d['field']['id_rubrique'])) { $select = "id_rubrique,statut"; - else + } else { $select = "0 as id_rubrique,statut"; + } $r = sql_fetsel($select, $table_objet_sql, "$prim=$id"); $statut = $r['statut']; $id_rubrique = $r['id_rubrique']; - } - else { + } else { $id_rubrique = intval($id); $statut = 'prop'; // arbitraire } $puce_statut = charger_fonction('puce_statut', 'inc'); - ajax_retour($puce_statut($id,$statut,$id_rubrique,$type, true)); + ajax_retour($puce_statut($id, $statut, $id_rubrique, $type, true)); } + ?> diff --git a/ecrire/exec/rechercher.php b/ecrire/exec/rechercher.php index ecb8598904..8616fee2ce 100644 --- a/ecrire/exec/rechercher.php +++ b/ecrire/exec/rechercher.php @@ -13,53 +13,59 @@ * Gestion de la recherche ajax du mini navigateur de rubriques * * Cette possibilité de recherche apparaît s'il y a beaucoup de rubriques dans le site. - * + * * @package SPIP\Core\Rechercher -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); include_spip('inc/texte'); /** * Prépare la fonction de recherche ajax du mini navigateur de rubriques - * + * * @uses exec_rechercher_args() Formate le rendu de la recherche. * @uses ajax_retour() -**/ -function exec_rechercher_dist(){ + **/ +function exec_rechercher_dist() { $id = intval(_request('id')); $exclus = intval(_request('exclus')); $rac = spip_htmlentities(_request('rac')); $type = _request('type'); $do = _request('do'); - if (preg_match('/^\w*$/', $do)) + if (preg_match('/^\w*$/', $do)) { $r = exec_rechercher_args($id, $type, $exclus, $rac, $do); - else $r = ''; + } else { + $r = ''; + } ajax_retour($r); } /** * Formate le rendu de la recherche ajax du mini navigateur de rubriques - * + * * @see calcul_branche_in() * @see proposer_item() - * + * * @param int $id * @param string $type * @param string|int|array $exclus * @param string|bool $rac * @param string $do * @return string -**/ -function exec_rechercher_args($id, $type, $exclus, $rac, $do){ - if (!$do) $do = 'aff'; + **/ +function exec_rechercher_args($id, $type, $exclus, $rac, $do) { + if (!$do) { + $do = 'aff'; + } $where = preg_split(",\s+,", $type); - if ($where){ - foreach ($where as $k => $v){ - $where[$k] = "'%" . substr(str_replace("%", "\%", sql_quote($v,'','string')), 1, -1) . "%'"; + if ($where) { + foreach ($where as $k => $v) { + $where[$k] = "'%" . substr(str_replace("%", "\%", sql_quote($v, '', 'string')), 1, -1) . "%'"; } $where_titre = ("(titre LIKE " . join(" AND titre LIKE ", $where) . ")"); $where_desc = ("(descriptif LIKE " . join(" AND descriptif LIKE ", $where) . ")"); @@ -70,16 +76,18 @@ function exec_rechercher_args($id, $type, $exclus, $rac, $do){ $where_id = " 1=2"; } - if ($exclus){ + if ($exclus) { include_spip('inc/rubriques'); $where_exclus = " AND " . sql_in('id_rubrique', calcul_branche_in($exclus), 'NOT'); - } else $where_exclus = ''; + } else { + $where_exclus = ''; + } $res = sql_select("id_rubrique, id_parent, titre", "spip_rubriques", "$where_id$where_exclus"); $points = $rub = array(); - while ($row = sql_fetch($res)){ + while ($row = sql_fetch($res)) { $id_rubrique = $row["id_rubrique"]; $rub[$id_rubrique]["titre"] = typo($row["titre"]); $rub[$id_rubrique]["id_parent"] = $row["id_parent"]; @@ -87,29 +95,33 @@ function exec_rechercher_args($id, $type, $exclus, $rac, $do){ } $res = sql_select("id_rubrique, id_parent, titre", "spip_rubriques", "$where_titre$where_exclus"); - while ($row = sql_fetch($res)){ + while ($row = sql_fetch($res)) { $id_rubrique = $row["id_rubrique"]; $rub[$id_rubrique]["titre"] = typo($row["titre"]); $rub[$id_rubrique]["id_parent"] = $row["id_parent"]; - if (isset($points[$id_rubrique])) + if (isset($points[$id_rubrique])) { $points[$id_rubrique] += 2; - else $points[$id_rubrique] = 0; + } else { + $points[$id_rubrique] = 0; + } } $res = sql_select("id_rubrique, id_parent, titre", "spip_rubriques", "$where_desc$where_exclus"); - while ($row = sql_fetch($res)){ + while ($row = sql_fetch($res)) { $id_rubrique = $row["id_rubrique"]; $rub[$id_rubrique]["titre"] = typo($row["titre"]); $rub[$id_rubrique]["id_parent"] = $row["id_parent"]; - if (isset($points[$id_rubrique])) + if (isset($points[$id_rubrique])) { $points[$id_rubrique] += 1; - else $points[$id_rubrique] = 0; + } else { + $points[$id_rubrique] = 0; + } } - if ($points){ + if ($points) { arsort($points); $style = " style='background-image: url(" . chemin_image('secteur-12.png') . ")'"; - foreach ($rub as $k => $v){ + foreach ($rub as $k => $v) { $rub[$k]['atts'] = ($v["id_parent"] ? $style : '') . " class='petite-rubrique'"; } @@ -126,22 +138,23 @@ function exec_rechercher_args($id, $type, $exclus, $rac, $do){ * @note * `onkey_rechercher()` testera s'il comporte une seule balise au premier niveau * car cela qui indique qu'un seul résultat a été trouvé. - * + * * Attention donc à composer le message d'erreur avec au moins 2 balises. - * + * * @param array $ids * @param array|string $titles * @param string|bool $rac * @param string $type * @param string $do * @return string -**/ -function proposer_item($ids, $titles, $rac, $type, $do){ + **/ +function proposer_item($ids, $titles, $rac, $type, $do) { - if (!$ids) + if (!$ids) { return "<br /><br /><div style='padding: 5px; color: red;'><b>" . spip_htmlentities($type) . "</b> : " . _T('avis_aucun_resultat') . "</div>"; + } $ret = ''; $info = generer_url_ecrire('informer', "type=rubrique&rac=$rac&id="); @@ -150,9 +163,10 @@ function proposer_item($ids, $titles, $rac, $type, $do){ $ondbClick = "$do(this.firstChild.firstChild.nodeValue,this.firstChild.title,'selection_rubrique', 'id_parent');"; - foreach ($ids as $id => $bof){ + foreach ($ids as $id => $bof) { - $titre = strtr(str_replace("'", "’", str_replace('"', """, textebrut($titles[$id]["titre"]))), "\n\r", " "); + $titre = strtr(str_replace("'", "’", str_replace('"', """, textebrut($titles[$id]["titre"]))), "\n\r", + " "); $ret .= "<div class='highlight off'\nonclick=\"changerhighlight(this); " . $onClick @@ -165,6 +179,7 @@ function proposer_item($ids, $titles, $rac, $type, $do){ . $titre . "</div></div>"; } + return $ret; } diff --git a/ecrire/exec/selectionner.php b/ecrire/exec/selectionner.php index a760b2edad..f75f9b5b73 100644 --- a/ecrire/exec/selectionner.php +++ b/ecrire/exec/selectionner.php @@ -14,8 +14,10 @@ * Gestion le l'affichage du sélecteur de rubrique AJAX * * @package SPIP\Core\Rubriques -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); @@ -24,21 +26,25 @@ include_spip('inc/actions'); * * @uses inc_selectionner_dist() * @uses ajax_retour() -**/ -function exec_selectionner_dist() -{ + **/ +function exec_selectionner_dist() { $id = intval(_request('id')); $exclus = intval(_request('exclus')); $type = _request('type'); $rac = _request('racine'); - $do = _request('do'); + $do = _request('do'); if (preg_match('/^\w*$/', $do)) { - if (!$do) $do = 'aff'; + if (!$do) { + $do = 'aff'; + } $selectionner = charger_fonction('selectionner', 'inc'); - $r = $selectionner($id, "choix_parent", $exclus, $rac, $type!='breve', $do); - } else $r = ''; + $r = $selectionner($id, "choix_parent", $exclus, $rac, $type != 'breve', $do); + } else { + $r = ''; + } ajax_retour($r); } + ?> diff --git a/ecrire/exec/upgrade.php b/ecrire/exec/upgrade.php index 4dd89844ca..f2435d4dc9 100644 --- a/ecrire/exec/upgrade.php +++ b/ecrire/exec/upgrade.php @@ -12,70 +12,75 @@ /** * Gestion de l'installation et de la mise à jour de SPIP - * + * * @package SPIP\Core\Upgrade */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); include_spip('inc/headers'); /** * Fonction d'installation et de mise à jour du core de SPIP - * + * * @return void -**/ -function exec_upgrade_dist() -{ + **/ +function exec_upgrade_dist() { - if (!_FILE_CONNECT) + if (!_FILE_CONNECT) { redirige_url_ecrire("install"); + } // Si reinstallation necessaire, message ad hoc - if (_request('reinstall')=='oui'){ + if (_request('reinstall') == 'oui') { include_spip('inc/minipres'); $r = minipres(_T('titre_page_upgrade'), - "<p><b>" - ._T('texte_nouvelle_version_spip_1') - ."</b><p> " - ._T('texte_nouvelle_version_spip_2', - array('connect' => '<tt>'._FILE_CONNECT.'</tt>')) - .generer_form_ecrire('upgrade', "<input type='hidden' name='reinstall' value='non' />", '', _T('bouton_relancer_installation'))); + "<p><b>" + . _T('texte_nouvelle_version_spip_1') + . "</b><p> " + . _T('texte_nouvelle_version_spip_2', + array('connect' => '<tt>' . _FILE_CONNECT . '</tt>')) + . generer_form_ecrire('upgrade', "<input type='hidden' name='reinstall' value='non' />", '', + _T('bouton_relancer_installation'))); echo $r; - } - elseif (_request('fin')) { + } elseif (_request('fin')) { include_spip('inc/plugin'); actualise_plugins_actifs(); include_spip('inc/headers'); - $res = generer_url_ecrire('admin_plugin','var_mode=recalcul'); + $res = generer_url_ecrire('admin_plugin', 'var_mode=recalcul'); echo redirige_formulaire($res); - } - else { + } else { - if (!isset($GLOBALS['meta']['version_installee'])) + if (!isset($GLOBALS['meta']['version_installee'])) { $GLOBALS['meta']['version_installee'] = 0.0; - else $GLOBALS['meta']['version_installee'] = - (double)str_replace(',', '.', $GLOBALS['meta']['version_installee']); + } else { + $GLOBALS['meta']['version_installee'] = + (double)str_replace(',', '.', $GLOBALS['meta']['version_installee']); + } # NB: str_replace car, sur club-internet, il semble que version_installe soit # enregistree au format '1,812' et non '1.812' // Erreur downgrade // (cas de double installation de fichiers SPIP sur une meme base) - if ($GLOBALS['spip_version_base']<$GLOBALS['meta']['version_installee']) + if ($GLOBALS['spip_version_base'] < $GLOBALS['meta']['version_installee']) { $commentaire = _T('info_mise_a_niveau_base_2'); - // Commentaire standard upgrade - else $commentaire = _T('texte_mise_a_niveau_base_1'); + } // Commentaire standard upgrade + else { + $commentaire = _T('texte_mise_a_niveau_base_1'); + } - $commentaire .= "<br />[".$GLOBALS['meta']['version_installee']."/".$GLOBALS['spip_version_base']."]"; + $commentaire .= "<br />[" . $GLOBALS['meta']['version_installee'] . "/" . $GLOBALS['spip_version_base'] . "]"; $_POST['reinstall'] = 'non'; // pour copy_request dans admin include_spip('inc/headers'); $admin = charger_fonction('admin', 'inc'); $res = $admin('upgrade', _T('info_mise_a_niveau_base'), $commentaire); - if ($res) + if ($res) { echo $res; - else { + } else { // effacer les alea pour forcer leur relecture // si jamais ils ont change pendant l'upgrade unset($GLOBALS['meta']['alea_ephemere']); diff --git a/ecrire/exec/valider_xml.php b/ecrire/exec/valider_xml.php index 58603ba575..dd4dfe1be1 100644 --- a/ecrire/exec/valider_xml.php +++ b/ecrire/exec/valider_xml.php @@ -12,11 +12,13 @@ /** * Gestion de la validation XML selon une DTD - * + * * @package SPIP\Core\Valider_XML */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/presentation'); include_spip('public/debusquer'); @@ -37,13 +39,14 @@ include_spip('public/debusquer'); * ``` * * @uses valider_xml_ok() -**/ -function exec_valider_xml_dist() -{ + **/ +function exec_valider_xml_dist() { if (!autoriser('sauvegarder')) { include_spip('inc/minipres'); echo minipres(); - } else valider_xml_ok(_request('var_url'), _request('ext'), intval(_request('limit')), _request('recur')); + } else { + valider_xml_ok(_request('var_url'), _request('ext'), intval(_request('limit')), _request('recur')); + } } /** @@ -58,12 +61,13 @@ function exec_valider_xml_dist() * @param int $limit * @param array|bool $rec * -**/ -function valider_xml_ok($url, $req_ext, $limit, $rec) -{ + **/ +function valider_xml_ok($url, $req_ext, $limit, $rec) { $url = urldecode($url); $rec = !$rec ? false : array(); - if (!$limit) $limit = 200; + if (!$limit) { + $limit = 200; + } $titre = _T('analyse_xml'); if (!$url) { $url_aff = 'http://'; @@ -73,17 +77,19 @@ function valider_xml_ok($url, $req_ext, $limit, $rec) include_spip('inc/distant'); if (is_dir($url)) { - $dir = (substr($url,-1,1) === '/') ? $url : "$url/"; + $dir = (substr($url, -1, 1) === '/') ? $url : "$url/"; $ext = !preg_match('/^[.*\w]+$/', $req_ext) ? 'php' : $req_ext; - $files = preg_files($dir, "$ext$", $limit, $rec); - if (!$files AND $ext!=='html') { + $files = preg_files($dir, "$ext$", $limit, $rec); + if (!$files AND $ext !== 'html') { $files = preg_files($dir, 'html$', $limit, $rec); - if ($files) $ext = 'html'; + if ($files) { + $ext = 'html'; + } } if ($files) { $res = valider_dir($files, $ext, $url); list($err, $res) = valider_resultats($res, $ext === 'html'); - $err = ' (' . $err . '/' . count($files) .')'; + $err = ' (' . $err . '/' . count($files) . ')'; } else { $res = _T('texte_vide'); $err = ''; @@ -91,17 +97,22 @@ function valider_xml_ok($url, $req_ext, $limit, $rec) $bandeau = $dir . '*' . $ext . $err; } else { if (preg_match('@^((?:[.]/)?[^?]*)[?]([0-9a-z_]+)=([^&]*)(.*)$@', $url, $r)) { - list(,$server, $dir, $script, $args) = $r; + list(, $server, $dir, $script, $args) = $r; if (((!$server) OR ($server == './') - OR strpos($server, url_de_base()) === 0) - AND is_dir($dir)) { - $url = $script; - // Pour quand le validateur saura simuler - // une query-string... - // $args = preg_split('/&(amp;)?[a-z0-9_]+=/', $args); - $args = true; + OR strpos($server, url_de_base()) === 0) + AND is_dir($dir) + ) { + $url = $script; + // Pour quand le validateur saura simuler + // une query-string... + // $args = preg_split('/&(amp;)?[a-z0-9_]+=/', $args); + $args = true; } - } else { $dir = 'exec'; $script = $url; $args = true;} + } else { + $dir = 'exec'; + $script = $url; + $args = true; + } $transformer_xml = charger_fonction('valider', 'xml'); $onfocus = "this.value='" . addslashes($url) . "';"; @@ -118,8 +129,8 @@ function valider_xml_ok($url, $req_ext, $limit, $rec) } $res = - "<div style='text-align: center'>" . $err . "</div>" . - "<div style='margin: 10px; text-align: left'>" . $texte . '</div>'; + "<div style='text-align: center'>" . $err . "</div>" . + "<div style='margin: 10px; text-align: left'>" . $texte . '</div>'; $bandeau = "<a href='$url_aff'>$url</a>"; } } @@ -129,13 +140,13 @@ function valider_xml_ok($url, $req_ext, $limit, $rec) $jq = http_script("", 'jquery.js'); echo str_replace('<head>', "<head>$jq", $debut); - $onfocus = '<input type="text" size="70" value="' .$url_aff .'" name="var_url" id="var_url" onfocus="'.$onfocus . '" />'; + $onfocus = '<input type="text" size="70" value="' . $url_aff . '" name="var_url" id="var_url" onfocus="' . $onfocus . '" />'; $onfocus = generer_form_ecrire('valider_xml', $onfocus, " method='get'"); echo "<h1>", $titre, '<br>', $bandeau, '</h1>', - "<div style='text-align: center'>", $onfocus, "</div>", - $res, - fin_page(); + "<div style='text-align: center'>", $onfocus, "</div>", + $res, + fin_page(); } /** @@ -145,50 +156,57 @@ function valider_xml_ok($url, $req_ext, $limit, $rec) * @param array $res * @param string $mode * @return array -**/ -function valider_resultats($res, $mode) -{ + **/ +function valider_resultats($res, $mode) { $i = $j = 0; $table = ''; rsort($res); - foreach($res as $l) { + foreach ($res as $l) { $i++; - $class = 'row_'.alterner($i, 'even', 'odd'); + $class = 'row_' . alterner($i, 'even', 'odd'); list($nb, $texte, $erreurs, $script, $appel, $temps) = $l; if ($texte < 0) { - $texte = (0- $texte); + $texte = (0-$texte); $color = ";color: red"; - } else {$color = '';} + } else { + $color = ''; + } $err = (!intval($nb)) ? '' : - ($erreurs[0][0] . ' ' . _T('ligne') . ' ' . - $erreurs[0][1] .($nb==1? '': ' ...')); - if ($err) $j++; + ($erreurs[0][0] . ' ' . _T('ligne') . ' ' . + $erreurs[0][1] . ($nb == 1 ? '' : ' ...')); + if ($err) { + $j++; + } $h = $mode - ? ($appel . '&var_mode=debug&var_mode_affiche=validation') - : generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel)); + ? ($appel . '&var_mode=debug&var_mode_affiche=validation') + : generer_url_ecrire('valider_xml', "var_url=" . urlencode($appel)); $table .= "<tr class='$class'>" - . "<td style='text-align: right'>$nb</td>" - . "<td style='text-align: right$color'>$texte</td>" - . "<td style='text-align: right'>$temps</td>" - . "<td style='text-align: left'>$err</td>" - . "<td>$script</td>" - . "<td><a href='$h'>$appel</a></td>"; + . "<td style='text-align: right'>$nb</td>" + . "<td style='text-align: right$color'>$texte</td>" + . "<td style='text-align: right'>$temps</td>" + . "<td style='text-align: left'>$err</td>" + . "<td>$script</td>" + . "<td><a href='$h'>$appel</a></td>"; } - return array($j, "<table class='spip'>" - . "<tr><th>" - . _T('erreur_texte') - . "</th><th>" - . _T('taille_octets', array('taille' => ' ')) - . "</th><th>" - . _T('zbug_profile', array('time' =>'')) - . "</th><th>" - . _T('message') - . "</th><th>Page</th><th>args" - . "</th></tr>" - . $table - . "</table>"); + + return array( + $j, + "<table class='spip'>" + . "<tr><th>" + . _T('erreur_texte') + . "</th><th>" + . _T('taille_octets', array('taille' => ' ')) + . "</th><th>" + . _T('zbug_profile', array('time' => '')) + . "</th><th>" + . _T('message') + . "</th><th>Page</th><th>args" + . "</th></tr>" + . $table + . "</table>" + ); } /** @@ -205,15 +223,15 @@ function valider_resultats($res, $mode) * Nom de l'extension du fichier contenant la fonction à vérifier. * @return array */ -function valider_script($transformer_xml, $script, $dir, $ext) -{ +function valider_script($transformer_xml, $script, $dir, $ext) { $script = basename($script, '.php'); $dir = basename($dir); $f = charger_fonction($script, $dir, true); - // ne pas se controler soi-meme ni l'index du repertoire ni un fichier annexe - if ($script == _request('exec') OR $script=='index' OR !$f) - return array('/', 0, '', $script,''); + // ne pas se controler soi-meme ni l'index du repertoire ni un fichier annexe + if ($script == _request('exec') OR $script == 'index' OR !$f) { + return array('/', 0, '', $script, ''); + } $val = $transformer_xml($f, true); $appel = ''; @@ -227,19 +245,24 @@ function valider_script($transformer_xml, $script, $dir, $ext) if (strpos($val->page, "id='minipres'")) { if (!$g = charger_fonction($script . '_args', $dir, true)) { - $res = 0 - strlen($val->page); + $res = 0-strlen($val->page); } else { $args = array(1, 'id_article', 1); $val = $transformer_xml($g, $args); $appel = 'id_article=1&type=id_article&id=1'; if (strpos($val->page, "id='minipres'")) { - $res = 0 - strlen($val->page); - } else $res = strlen($val->page); + $res = 0-strlen($val->page); + } else { + $res = strlen($val->page); + } } - } else $res = strlen($val->page); + } else { + $res = strlen($val->page); + } $appel = valider_pseudo_url($dir, $script, $appel); $err = $val->err; + return array(count($err), $res, $err, $script, $appel); } @@ -252,11 +275,10 @@ function valider_script($transformer_xml, $script, $dir, $ext) * @param string $args [description] * @return string */ -function valider_pseudo_url($dir, $script, $args = '') -{ - return ($dir == 'exec') - ? generer_url_ecrire($script, $args, false, true) - : ("./?$dir=$script" . ($args ? "&$args" : '')); +function valider_pseudo_url($dir, $script, $args = '') { + return ($dir == 'exec') + ? generer_url_ecrire($script, $args, false, true) + : ("./?$dir=$script" . ($args ? "&$args" : '')); } /** @@ -269,13 +291,15 @@ function valider_pseudo_url($dir, $script, $args = '') * @param string $ext * @return array */ -function valider_skel($transformer_xml, $file, $dir, $ext) -{ - if (!lire_fichier ($file, $text)) return array('/', '/', $file,''); +function valider_skel($transformer_xml, $file, $dir, $ext) { + if (!lire_fichier($file, $text)) { + return array('/', '/', $file, ''); + } if (!strpos($text, 'DOCTYPE')) { preg_match(",Content[-]Type: *\w+/(\S)+,", $text, $r); - if ($r[1] === 'css' OR $r[1] === 'plain') - return array('/', 'DOCTYPE?', $file,''); + if ($r[1] === 'css' OR $r[1] === 'plain') { + return array('/', 'DOCTYPE?', $file, ''); + } } if ($ext != 'html') { @@ -284,20 +308,25 @@ function valider_skel($transformer_xml, $file, $dir, $ext) $url = url_de_base() . _DIR_RESTREINT_ABS . $file; $script = $file; } else { - $script = basename($file,'.html'); + $script = basename($file, '.html'); // pas de validation solitaire pour les squelettes internes, a revoir. if (substr_count($dir, '/') <= 1) { $url = generer_url_public($script, $contexte); - } else $url = ''; + } else { + $url = ''; + } $composer = charger_fonction('composer', 'public'); list($skel_nom, $skel_code) = $composer($text, 'html', 'html', $file); - spip_log("compilation de $file en " . strlen($skel_code) . " octets de nom $skel_nom"); - if (!$skel_nom) return array('/', '/', $file,''); + spip_log("compilation de $file en " . strlen($skel_code) . " octets de nom $skel_nom"); + if (!$skel_nom) { + return array('/', '/', $file, ''); + } $contexte = valider_contexte($skel_code, $file); - $page = $skel_nom(array('cache'=>''), array($contexte)); + $page = $skel_nom(array('cache' => ''), array($contexte)); } $res = $transformer_xml($page['texte']); + return array(count($res->err), strlen($res->page), $res->err, $script, $url); } @@ -315,39 +344,44 @@ function valider_skel($transformer_xml, $file, $dir, $ext) * @param string $file * @return array */ -function valider_contexte($code, $file) -{ +function valider_contexte($code, $file) { static $exceptions = array('action', 'doublons', 'lang'); preg_match_all('/(\S*)[$]Pile[[]0[]][[].(\w+).[]](\S*)/', $code, $r, PREG_SET_ORDER); $args = array(); // evacuer les repetitions et les faux parametres - foreach($r as $v) { - list(,$f, $nom, $suite) = $v; + foreach ($r as $v) { + list(, $f, $nom, $suite) = $v; if (!in_array($nom, $exceptions) - AND (!isset($args[$nom]) OR !$args[$nom])) + AND (!isset($args[$nom]) OR !$args[$nom]) + ) { $args[$nom] = ((strpos($f, 'sql_quote') !== false) - AND strpos($suite, "'int'") !==false); + AND strpos($suite, "'int'") !== false); + } } - $contexte= array(); // etudier l'ajout de: + $contexte = array(); // etudier l'ajout de: // 'lang' => $GLOBALS['spip_lang'], // 'date' => date('Y-m-d H:i:s')); foreach ($args as $nom => $f) { - if (!$f) - $val = 'id_article'; - else { - // on suppose que arg numerique => primary-key d'une table - // chercher laquelle et prendre un numero existant - $val = 0; - $type = (strpos($nom, 'id_') === 0) ? substr($nom,3) : $nom; - $trouver_table = charger_fonction('trouver_table', 'base'); - $table = $trouver_table(table_objet_sql($type)); - if ($table) - $val = @sql_getfetsel($nom, $table['table'], '', '','',"0,1"); - // porte de sortie si ca marche pas, - if (!$val) $val = 1; + if (!$f) { + $val = 'id_article'; + } else { + // on suppose que arg numerique => primary-key d'une table + // chercher laquelle et prendre un numero existant + $val = 0; + $type = (strpos($nom, 'id_') === 0) ? substr($nom, 3) : $nom; + $trouver_table = charger_fonction('trouver_table', 'base'); + $table = $trouver_table(table_objet_sql($type)); + if ($table) { + $val = @sql_getfetsel($nom, $table['table'], '', '', '', "0,1"); + } + // porte de sortie si ca marche pas, + if (!$val) { + $val = 1; + } } - $contexte[$nom] = $val; + $contexte[$nom] = $val; } + return $contexte; } @@ -361,20 +395,21 @@ function valider_contexte($code, $file) * @param string $dir * Chemin du répertoire * @return array -**/ -function valider_dir($files, $ext, $dir) -{ + **/ +function valider_dir($files, $ext, $dir) { $res = array(); $transformer_xml = charger_fonction('valider', 'xml'); - $valideur = $ext=='php' ? 'valider_script' : 'valider_skel' ; - foreach($files as $f) { + $valideur = $ext == 'php' ? 'valider_script' : 'valider_skel'; + foreach ($files as $f) { spip_timer($f); $val = $valideur($transformer_xml, $f, $dir, $ext); $n = spip_timer($f); - $val[]= $n; + $val[] = $n; spip_log("validation de $f en $n secondes"); - $res[]= $val; + $res[] = $val; } + return $res; } + ?> diff --git a/ecrire/genie/mail.php b/ecrire/genie/mail.php index fc636b2bde..7aa38dcc57 100644 --- a/ecrire/genie/mail.php +++ b/ecrire/genie/mail.php @@ -16,11 +16,13 @@ * @package SPIP\Core\Mail */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Envoi du Mail des nouveautés - * + * * Ce mail est basé sur le squelette nouveautes.html * * La meta `dernier_envoi_neuf` permet de marquer la date du dernier envoi @@ -34,25 +36,28 @@ function genie_mail_dist($t) { $jours_neuf = $GLOBALS['meta']['jours_neuf']; $now = time(); - if (!isset($GLOBALS['meta']['dernier_envoi_neuf'])) - ecrire_meta('dernier_envoi_neuf',date('Y-m-d H:i:s',$now - (3600 * 24 * $jours_neuf))); + if (!isset($GLOBALS['meta']['dernier_envoi_neuf'])) { + ecrire_meta('dernier_envoi_neuf', date('Y-m-d H:i:s', $now-(3600*24*$jours_neuf))); + } - $page = recuperer_fond('nouveautes',array('date'=>$GLOBALS['meta']['dernier_envoi_neuf'],'jours_neuf'=>$jours_neuf),array('raw'=>true)); + $page = recuperer_fond('nouveautes', + array('date' => $GLOBALS['meta']['dernier_envoi_neuf'], 'jours_neuf' => $jours_neuf), array('raw' => true)); - if (strlen(trim($page['texte']))){ + if (strlen(trim($page['texte']))) { // recuperer les entetes envoyes par #HTTP_HEADER $headers = ""; - if (isset($page['entetes']) AND count($page['entetes'])){ - foreach ($page['entetes'] as $k => $v) - $headers .= (strlen($v)?"$k: $v":$k)."\n"; + if (isset($page['entetes']) AND count($page['entetes'])) { + foreach ($page['entetes'] as $k => $v) { + $headers .= (strlen($v) ? "$k: $v" : $k) . "\n"; + } } include_spip("inc/notifications"); - notifications_envoyer_mails($adresse_neuf,$page['texte'],"","",$headers); - ecrire_meta('dernier_envoi_neuf',date('Y-m-d H:i:s',$now)); - } - else + notifications_envoyer_mails($adresse_neuf, $page['texte'], "", "", $headers); + ecrire_meta('dernier_envoi_neuf', date('Y-m-d H:i:s', $now)); + } else { spip_log("mail nouveautes : rien de neuf depuis $jours_neuf jours"); + } return 1; } diff --git a/ecrire/genie/maintenance.php b/ecrire/genie/maintenance.php index 6a15b45bd5..a6dcf2459a 100644 --- a/ecrire/genie/maintenance.php +++ b/ecrire/genie/maintenance.php @@ -16,12 +16,14 @@ * @package SPIP\Core\Genie\Maintenance */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Diverses tâches de maintenance - * - * - (re)mettre .htaccess avec 'Deny from all' + * + * - (re)mettre .htaccess avec 'Deny from all' * dans les deux répertoires dits inaccessibles par http * - Vérifier qu'aucune table ne s'est crashée * @@ -31,7 +33,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param object $t * @return bool Toujours à true. */ -function genie_maintenance_dist ($t) { +function genie_maintenance_dist($t) { // (re)mettre .htaccess avec deny from all // dans les deux repertoires dits inaccessibles par http @@ -40,8 +42,9 @@ function genie_maintenance_dist ($t) { verifier_htaccess(_DIR_TMP); // Verifier qu'aucune table n'est crashee - if (!_request('reinstall')) + if (!_request('reinstall')) { verifier_crash_tables(); + } return 1; } @@ -51,7 +54,7 @@ function genie_maintenance_dist ($t) { * Vérifier si une table a crashé * * Pour cela, on vérifie si on peut se connecter à la base de données. - * + * * @see message_crash_tables() * * @return bool|array @@ -66,9 +69,12 @@ function verifier_crash_tables() { $crash = array(); foreach (array('tables_principales', 'tables_auxiliaires') as $com) { foreach ($GLOBALS[$com] as $table => $desc) { - if (!sql_select('*', $table,'','','', 1) - AND !defined('spip_interdire_cache')) # cas "LOST CONNECTION" + if (!sql_select('*', $table, '', '', '', 1) + AND !defined('spip_interdire_cache') + ) # cas "LOST CONNECTION" + { $crash[] = $table; + } } } #$crash[] = 'test'; @@ -88,25 +94,24 @@ function verifier_crash_tables() { /** * Vérifier si une table a crashé et crée un message en conséquence. - * + * * S'il y a un crash, on affiche un message avec le nom * de la ou des tables qui ont crashé. - * On génère un lien vers la page permettant la + * On génère un lien vers la page permettant la * réparation de la base de données. - * + * * @uses verifier_crash_tables() * * @return string */ function message_crash_tables() { if ($crash = verifier_crash_tables()) { - return - '<strong>' . _T('texte_recuperer_base') . '</strong><br />' - . ' <tt>'.join(', ', $crash).'</tt><br />' - . generer_form_ecrire('base_repair', - _T('texte_crash_base'), '', - _T('bouton_tenter_recuperation')) - ; + return + '<strong>' . _T('texte_recuperer_base') . '</strong><br />' + . ' <tt>' . join(', ', $crash) . '</tt><br />' + . generer_form_ecrire('base_repair', + _T('texte_crash_base'), '', + _T('bouton_tenter_recuperation')); } } diff --git a/ecrire/genie/mise_a_jour.php b/ecrire/genie/mise_a_jour.php index 08e9b29c26..1b966dd19e 100644 --- a/ecrire/genie/mise_a_jour.php +++ b/ecrire/genie/mise_a_jour.php @@ -16,7 +16,9 @@ * @package SPIP\Core\Genie\Mise_a_jour */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Verifier si une mise a jour est disponible @@ -24,20 +26,21 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param int $t * @return int */ -function genie_mise_a_jour_dist($t){ +function genie_mise_a_jour_dist($t) { include_spip('inc/meta'); $maj = info_maj('spip', 'SPIP', $GLOBALS['spip_version_branche']); - ecrire_meta('info_maj_spip',$maj?($GLOBALS['spip_version_branche']."|$maj"):"",'non'); + ecrire_meta('info_maj_spip', $maj ? ($GLOBALS['spip_version_branche'] . "|$maj") : "", 'non'); mise_a_jour_ecran_securite(); - spip_log("Verification version SPIP : ".($maj?$maj:"version a jour"),"verifie_maj"); + spip_log("Verification version SPIP : " . ($maj ? $maj : "version a jour"), "verifie_maj"); + return 1; } // TODO : fournir une URL sur spip.net pour maitriser la diffusion d'une nouvelle version de l'ecran via l'update auto // ex : http://www.spip.net/auto-update/ecran_securite.php -define('_URL_ECRAN_SECURITE','http://zone.spip.org/trac/spip-zone/browser/_core_/securite/ecran_securite.php?format=txt'); +define('_URL_ECRAN_SECURITE', 'http://zone.spip.org/trac/spip-zone/browser/_core_/securite/ecran_securite.php?format=txt'); define('_VERSIONS_SERVEUR', 'http://files.spip.org/'); define('_VERSIONS_LISTE', 'archives.xml'); @@ -48,41 +51,43 @@ define('_VERSIONS_LISTE', 'archives.xml'); * Cela peut permettre de diffuser un ecran different selon la version de SPIP si besoin * ou de ne repondre une 304 que si le md5 est bon */ -function mise_a_jour_ecran_securite(){ +function mise_a_jour_ecran_securite() { // TODO : url https avec verification du certificat return; // si l'ecran n'est pas deja present ou pas updatable, sortir if (!_URL_ECRAN_SECURITE - OR !file_exists($filename = _DIR_ETC."ecran_securite.php") - OR !is_writable($filename) - OR !$last_modified = filemtime($filename) - OR !$md5 = md5_file($filename)) + OR !file_exists($filename = _DIR_ETC . "ecran_securite.php") + OR !is_writable($filename) + OR !$last_modified = filemtime($filename) + OR !$md5 = md5_file($filename) + ) { return false; + } include_spip('inc/distant'); $tmp_file = _DIR_TMP . "ecran_securite.php"; - $url = parametre_url(_URL_ECRAN_SECURITE,"md5",$md5); - $url = parametre_url($url,"vspip",$GLOBALS['spip_version_branche']); - $res = recuperer_url($url,array( + $url = parametre_url(_URL_ECRAN_SECURITE, "md5", $md5); + $url = parametre_url($url, "vspip", $GLOBALS['spip_version_branche']); + $res = recuperer_url($url, array( 'if_modified_since' => $last_modified, 'file' => $tmp_file )); // si il y a une version plus recente que l'on a recu correctement - if ($res['status']==200 - AND $res['length'] - AND $tmp_file = $res['file']){ + if ($res['status'] == 200 + AND $res['length'] + AND $tmp_file = $res['file'] + ) { - if ($md5 !== md5_file($tmp_file)){ + if ($md5 !== md5_file($tmp_file)) { // on essaye de l'inclure pour verifier que ca ne fait pas erreur fatale include_once $tmp_file; // ok, on le copie a la place de l'ecran existant // en backupant l'ecran avant, au cas ou @copy($filename, $filename . "-bck-" . date('Y-m-d-His', $last_modified)); @rename($tmp_file, $filename); - } - else { + } else { @unlink($tmp_file); } } @@ -102,10 +107,10 @@ function mise_a_jour_ecran_securite(){ * * @return string */ -function info_maj($dir, $file, $version){ +function info_maj($dir, $file, $version) { include_spip('inc/plugin'); - list($maj,$min,$rev) = preg_split('/\D+/', $version); + list($maj, $min, $rev) = preg_split('/\D+/', $version); $nom = _DIR_CACHE_XML . _VERSIONS_LISTE; $page = !file_exists($nom) ? '' : file_get_contents($nom); @@ -115,14 +120,14 @@ function info_maj($dir, $file, $version){ // (a revoir quand on arrivera a SPIP V10 ...) $p = substr("0123456789", intval($maj)); $p = ',/' . $file . '\D+([' . $p . ']+)\D+(\d+)(\D+(\d+))?.*?[.]zip",i'; - preg_match_all($p, $page, $m, PREG_SET_ORDER); + preg_match_all($p, $page, $m, PREG_SET_ORDER); $page = $page_majeure = ''; - + // branche en cours d'utilisation $branche = implode('.', array_slice(explode('.', $version, 3), 0, 2)); - + foreach ($m as $v) { - list(, $maj2, $min2,, $rev2) = $v; + list(, $maj2, $min2, , $rev2) = $v; $branche_maj = $maj2 . '.' . $min2; $version_maj = $maj2 . '.' . $min2 . '.' . $rev2; // d'abord les mises à jour de la même branche @@ -140,11 +145,13 @@ function info_maj($dir, $file, $version){ $page_majeure = $version_maj; } } - if (!$page AND !$page_majeure) return ""; - - $message = $page ? _T('nouvelle_version_spip',array('version'=>$page)) . ($page_majeure ? ' | ' : '' ) : ''; - $message .= $page_majeure ? _T('nouvelle_version_spip_majeure',array('version'=>$page_majeure)) : ''; - + if (!$page AND !$page_majeure) { + return ""; + } + + $message = $page ? _T('nouvelle_version_spip', array('version' => $page)) . ($page_majeure ? ' | ' : '') : ''; + $message .= $page_majeure ? _T('nouvelle_version_spip_majeure', array('version' => $page_majeure)) : ''; + return "<a class='info_maj_spip' href='http://www.spip.net/fr_update' title='$page'>" . $message . '</a>'; } @@ -165,20 +172,25 @@ function info_maj($dir, $file, $version){ * @return string * Contenu du fichier de cache de l'info de maj de SPIP. */ -function info_maj_cache($nom, $dir, $page = ''){ +function info_maj_cache($nom, $dir, $page = '') { $re = '<archives id="a' . $GLOBALS['meta']["alea_ephemere"] . '">'; - if (preg_match("/$re/", $page)) return $page; + if (preg_match("/$re/", $page)) { + return $page; + } $url = _VERSIONS_SERVEUR . $dir . '/' . _VERSIONS_LISTE; $a = file_exists($nom) ? filemtime($nom) : ''; include_spip('inc/distant'); - $res = recuperer_lapage($url, false, 'GET', _COPIE_LOCALE_MAX_SIZE, '',false, $a); + $res = recuperer_lapage($url, false, 'GET', _COPIE_LOCALE_MAX_SIZE, '', false, $a); // Si rien de neuf (ou inaccessible), garder l'ancienne - if ($res) list(, $page) = $res; + if ($res) { + list(, $page) = $res; + } // Placer l'indicateur de fraicheur $page = preg_replace('/^<archives.*?>/', $re, $page); sous_repertoire(_DIR_CACHE_XML); ecrire_fichier($nom, $page); + return $page; } diff --git a/ecrire/genie/optimiser.php b/ecrire/genie/optimiser.php index cbc7163317..9515b221b7 100644 --- a/ecrire/genie/optimiser.php +++ b/ecrire/genie/optimiser.php @@ -11,12 +11,14 @@ \***************************************************************************/ /** - * Gestion des optimisations de la base de données en cron + * Gestion des optimisations de la base de données en cron * * @package SPIP\Core\Genie\Optimiser -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); @@ -24,12 +26,12 @@ include_spip('base/abstract_sql'); * Cron d'optimisation de la base de données * * Tache appelée régulièrement - * + * * @param int $t * Timestamp de la date de dernier appel de la tâche * @return int * Timestamp de la date du prochain appel de la tâche -**/ + **/ function genie_optimiser_dist($t) { optimiser_base_une_table(); @@ -39,7 +41,7 @@ function genie_optimiser_dist($t) { // sachant qu'on a un delai de 48h, on renvoie aujourd'hui a 4h du mat // avec une periode de flou entre 2h et 6h pour ne pas saturer un hebergeur // qui aurait beaucoup de sites SPIP - return -(mktime(2,0,0) + rand(0, 3600*4)); + return -(mktime(2, 0, 0)+rand(0, 3600*4)); } /** @@ -52,7 +54,7 @@ function genie_optimiser_dist($t) { * @param int $attente * Attente entre 2 exécutions de la tache en secondes * @return void -**/ + **/ function optimiser_base($attente = 86400) { optimiser_base_disparus($attente); } @@ -64,11 +66,11 @@ function optimiser_base($attente = 86400) { * * À chaque appel, une nouvelle table est optimisée (la suivante dans la * liste par rapport à la dernière fois). - * + * * @see sql_optimize() - * - * @global int $GLOBALS['meta']['optimiser_table'] -**/ + * + * @global int $GLOBALS ['meta']['optimiser_table'] + **/ function optimiser_base_une_table() { $tables = array(); @@ -77,17 +79,20 @@ function optimiser_base_une_table() { // on n'optimise qu'une seule table a chaque fois, // pour ne pas vautrer le systeme // lire http://dev.mysql.com/doc/refman/5.0/fr/optimize-table.html - while ($row = sql_fetch($result)) + while ($row = sql_fetch($result)) { $tables[] = array_shift($row); + } if ($tables) { - $table_op = intval($GLOBALS['meta']['optimiser_table']+1) % sizeof($tables); + $table_op = intval($GLOBALS['meta']['optimiser_table']+1)%sizeof($tables); ecrire_meta('optimiser_table', $table_op); $q = $tables[$table_op]; spip_log("debut d'optimisation de la table $q"); - if (sql_optimize($q)) + if (sql_optimize($q)) { spip_log("fin d'optimisation de la table $q"); - else spip_log("Pas d'optimiseur necessaire"); + } else { + spip_log("Pas d'optimiseur necessaire"); + } } } @@ -100,7 +105,7 @@ function optimiser_base_une_table() { * Mysql < 4.0 refuse les requetes DELETE multi table * et elles ont une syntaxe differente entre 4.0 et 4.1 * On passe donc par un SELECT puis DELETE avec IN - * + * * @param string $table * Nom de la table SQL, exemple : spip_articles * @param string $id @@ -112,17 +117,19 @@ function optimiser_base_une_table() { * Condition AND à appliquer en plus sur la requête de suppression * @return int * Nombre de suppressions -**/ -function optimiser_sansref($table, $id, $sel, $and = '') -{ + **/ +function optimiser_sansref($table, $id, $sel, $and = '') { $in = array(); - while ($row = sql_fetch($sel)) $in[$row['id']] = true; + while ($row = sql_fetch($sel)) { + $in[$row['id']] = true; + } sql_free($sel); if ($in) { - sql_delete($table, sql_in($id,array_keys($in)) . ($and ? " AND $and" : '')); + sql_delete($table, sql_in($id, array_keys($in)) . ($and ? " AND $and" : '')); spip_log("Numeros des entrees $id supprimees dans la table $table: $in"); } + return count($in); } @@ -138,15 +145,15 @@ function optimiser_sansref($table, $id, $sel, $and = '') * mais on garde la compatibilité avec les versions précédentes. * * @pipeline_appel optimiser_base_disparus - * + * * @param int $attente * Attente entre 2 exécutions de la tache en secondes * @return void -**/ + **/ function optimiser_base_disparus($attente = 86400) { # format = 20060610110141, si on veut forcer une optimisation tout de suite - $mydate = sql_quote(date("Y-m-d H:i:s", time() - $attente)); + $mydate = sql_quote(date("Y-m-d H:i:s", time()-$attente)); $n = 0; @@ -159,14 +166,14 @@ function optimiser_base_disparus($attente = 86400) { # specialement affectes a une rubrique non-existante (plugin, # cf. http://trac.rezo.net/trac/spip/ticket/1549 ) $res = sql_select("A.id_article AS id", - "spip_articles AS A + "spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique", - "A.id_rubrique > 0 + "A.id_rubrique > 0 AND R.id_rubrique IS NULL AND A.maj < $mydate"); - $n+= optimiser_sansref('spip_articles', 'id_article', $res); + $n += optimiser_sansref('spip_articles', 'id_article', $res); // les articles a la poubelle sql_delete("spip_articles", "statut='poubelle' AND maj < $mydate"); @@ -178,21 +185,21 @@ function optimiser_base_disparus($attente = 86400) { include_spip('action/editer_liens'); // optimiser les liens de tous les auteurs vers des objets effaces // et depuis des auteurs effaces - $n+= objet_optimiser_liens(array('auteur'=>'*'),'*'); + $n += objet_optimiser_liens(array('auteur' => '*'), '*'); # effacer les auteurs poubelle qui ne sont lies a rien $res = sql_select("A.id_auteur AS id", - "spip_auteurs AS A + "spip_auteurs AS A LEFT JOIN spip_auteurs_liens AS L ON L.id_auteur=A.id_auteur", - "L.id_auteur IS NULL + "L.id_auteur IS NULL AND A.statut='5poubelle' AND A.maj < $mydate"); - $n+= optimiser_sansref('spip_auteurs', 'id_auteur', $res); + $n += optimiser_sansref('spip_auteurs', 'id_auteur', $res); # supprimer les auteurs 'nouveau' qui n'ont jamais donne suite # au mail de confirmation (45 jours pour repondre, ca devrait suffire) - sql_delete("spip_auteurs", "statut='nouveau' AND maj < ". sql_quote(date('Y-m-d', time()-45*24*3600))); + sql_delete("spip_auteurs", "statut='nouveau' AND maj < " . sql_quote(date('Y-m-d', time()-45*24*3600))); /** * Permet aux plugins de compléter l'optimisation suite aux éléments disparus @@ -201,15 +208,18 @@ function optimiser_base_disparus($attente = 86400) { * qui ont été réalisées (par exemple le nombre de suppressions faites) * et qui doit être incrémenté par les fonctions * utilisant ce pipeline si elles suppriment des éléments. - * + * * @pipeline_appel optimiser_base_disparus */ $n = pipeline('optimiser_base_disparus', array( - 'args'=>array( - 'attente' => $attente, - 'date' => $mydate), - 'data'=>$n + 'args' => array( + 'attente' => $attente, + 'date' => $mydate + ), + 'data' => $n )); - - if (!$n) spip_log("Optimisation des tables: aucun lien mort"); + + if (!$n) { + spip_log("Optimisation des tables: aucun lien mort"); + } } diff --git a/ecrire/inc/acces.php b/ecrire/inc/acces.php index 45ff7c6c2f..4f6da3b900 100644 --- a/ecrire/inc/acces.php +++ b/ecrire/inc/acces.php @@ -14,9 +14,11 @@ * Gestion des nombres aléatoires et de certains accès au site * * @package SPIP\Core\Authentification -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Créer un mot de passe @@ -27,9 +29,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Clé pour un salage supplémentaire * @return string * Mot de passe -**/ + **/ function creer_pass_aleatoire($longueur = 8, $sel = "") { - $seed = (int) round((microtime() + 1) * time()); + $seed = (int)round((microtime()+1)*time()); mt_srand($seed); srand($seed); @@ -38,22 +40,37 @@ function creer_pass_aleatoire($longueur = 8, $sel = "") { for ($i = 0; $i < $longueur; $i++) { if (!$s) { $s = mt_rand(); - if (!$s) $s = rand(); - $s = substr(md5(uniqid($s).$sel), 0, 16); + if (!$s) { + $s = rand(); + } + $s = substr(md5(uniqid($s) . $sel), 0, 16); } - $r = unpack("Cr", pack("H2", $s.$s)); + $r = unpack("Cr", pack("H2", $s . $s)); $x = $r['r'] & 63; - if ($x < 10) $x = chr($x + 48); - else if ($x < 36) $x = chr($x + 55); - else if ($x < 62) $x = chr($x + 61); - else if ($x == 63) $x = '/'; - else $x = '.'; + if ($x < 10) { + $x = chr($x+48); + } else { + if ($x < 36) { + $x = chr($x+55); + } else { + if ($x < 62) { + $x = chr($x+61); + } else { + if ($x == 63) { + $x = '/'; + } else { + $x = '.'; + } + } + } + } $pass .= $x; $s = substr($s, 2); } $pass = preg_replace("@[./]@", "a", $pass); $pass = preg_replace("@[I1l]@", "L", $pass); $pass = preg_replace("@[0O]@", "o", $pass); + return $pass; } @@ -66,23 +83,26 @@ function creer_uniqid() { static $seeded; if (!$seeded) { - $seed = (int) round((microtime() + 1) * time()); + $seed = (int)round((microtime()+1)*time()); mt_srand($seed); srand($seed); $seeded = true; } $s = mt_rand(); - if (!$s) $s = rand(); + if (!$s) { + $s = rand(); + } + return uniqid($s, 1); } /** * Renouveller l'alea (utilisé pour sécuriser les scripts du répertoire `action/`) -**/ + **/ function renouvelle_alea() { - if (!isset($GLOBALS['meta']['alea_ephemere'])){ + if (!isset($GLOBALS['meta']['alea_ephemere'])) { include_spip('base/abstract_sql'); $GLOBALS['meta']['alea_ephemere'] = sql_getfetsel('valeur', 'spip_meta', "nom='alea_ephemere'"); } @@ -108,21 +128,21 @@ function renouvelle_alea() { * Identifiant de l'auteur * @return string * Clé de sécurité. -**/ + **/ function low_sec($id_auteur) { // Pas d'id_auteur : low_sec if (!$id_auteur = intval($id_auteur)) { if (!$low_sec = $GLOBALS['meta']['low_sec']) { ecrire_meta('low_sec', $low_sec = creer_pass_aleatoire()); } - } - else { + } else { $low_sec = sql_getfetsel("low_sec", "spip_auteurs", "id_auteur = $id_auteur"); if (!$low_sec) { $low_sec = creer_pass_aleatoire(); sql_updateq("spip_auteurs", array("low_sec" => $low_sec), "id_auteur = $id_auteur"); } } + return $low_sec; } @@ -133,31 +153,34 @@ function low_sec($id_auteur) { * Cas particulier du statut pour compatibilité ancien rss/suivi_revisions * * @param string $op - * @param array $args + * @param array $args * @param string $lang * @param string $mime * Par défaut 'rss'. * @return string */ -function param_low_sec($op, $args = array(), $lang = '', $mime = 'rss') -{ +function param_low_sec($op, $args = array(), $lang = '', $mime = 'rss') { $a = $b = ''; - foreach ($args as $val => $var) + foreach ($args as $val => $var) { if ($var) { - if ($val<>'statut') $a .= ':' . $val . '-' . $var; + if ($val <> 'statut') { + $a .= ':' . $val . '-' . $var; + } $b .= $val . '=' . $var . '&'; } - $a = substr($a,1); + } + $a = substr($a, 1); $id = intval(@$GLOBALS['connect_id_auteur']); + return $b - . "op=" - . $op - . "&id=" - . $id - . "&cle=" - . afficher_low_sec($id, "$mime $op $a") - . (!$a ? '' : "&args=$a") - . (!$lang ? '' : "&lang=$lang"); + . "op=" + . $op + . "&id=" + . $id + . "&cle=" + . afficher_low_sec($id, "$mime $op $a") + . (!$a ? '' : "&args=$a") + . (!$lang ? '' : "&lang=$lang"); } /** @@ -171,9 +194,9 @@ function param_low_sec($op, $args = array(), $lang = '', $mime = 'rss') * Action désirée * @return string * Clé -**/ -function afficher_low_sec ($id_auteur, $action = '') { - return substr(md5($action.low_sec($id_auteur)),0,8); + **/ +function afficher_low_sec($id_auteur, $action = '') { + return substr(md5($action . low_sec($id_auteur)), 0, 8); } /** @@ -189,8 +212,8 @@ function afficher_low_sec ($id_auteur, $action = '') { * Action désirée * @return bool * true si les clés corresponde, false sinon -**/ -function verifier_low_sec ($id_auteur, $cle, $action = '') { + **/ +function verifier_low_sec($id_auteur, $cle, $action = '') { return ($cle == afficher_low_sec($id_auteur, $action)); } @@ -199,9 +222,11 @@ function verifier_low_sec ($id_auteur, $cle, $action = '') { * * @param int $id_auteur * Identifiant de l'auteur -**/ + **/ function effacer_low_sec($id_auteur) { - if (!$id_auteur = intval($id_auteur)) return; // jamais trop prudent ;) + if (!$id_auteur = intval($id_auteur)) { + return; + } // jamais trop prudent ;) sql_updateq("spip_auteurs", array("low_sec" => ''), "id_auteur = $id_auteur"); } @@ -212,8 +237,11 @@ function effacer_low_sec($id_auteur) { */ function initialiser_sel() { - if (CRYPT_MD5) $GLOBALS['htsalt'] = '$1$'.creer_pass_aleatoire(); - else return ""; + if (CRYPT_MD5) { + $GLOBALS['htsalt'] = '$1$' . creer_pass_aleatoire(); + } else { + return ""; + } } /** @@ -228,7 +256,7 @@ function initialiser_sel() { * @return null|void * - null si pas de htpasswd à créer, ou si LDAP * - void sinon. -**/ + **/ function ecrire_acces() { $htaccess = _DIR_RESTREINT . _ACCESS_FILE_NAME; $htpasswd = _DIR_TMP . _AUTH_USER_FILE; @@ -237,10 +265,12 @@ function ecrire_acces() { // par exemple acces_restreint ; // si .htaccess existe, outrepasser spip_meta if ((!isset($GLOBALS['meta']['creer_htpasswd']) - OR ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) - AND !@file_exists($htaccess)) { + OR ($GLOBALS['meta']['creer_htpasswd'] != 'oui')) + AND !@file_exists($htaccess) + ) { spip_unlink($htpasswd); - spip_unlink($htpasswd."-admin"); + spip_unlink($htpasswd . "-admin"); + return; } @@ -249,21 +279,24 @@ function ecrire_acces() { // attention, il faut au prealable se connecter a la base (necessaire car utilise par install) // TODO: factoriser avec auth/spip qui fait deja ce job et generaliser le test spip_connect_ldap() - if (spip_connect_ldap()) return; + if (spip_connect_ldap()) { + return; + } $p1 = ''; // login:htpass pour tous $p2 = ''; // login:htpass pour les admins - $s = sql_select("login, htpass, statut", "spip_auteurs", sql_in("statut", array('1comite','0minirezo','nouveau'))); + $s = sql_select("login, htpass, statut", "spip_auteurs", sql_in("statut", array('1comite', '0minirezo', 'nouveau'))); while ($t = sql_fetch($s)) { if (strlen($t['login']) AND strlen($t['htpass'])) { - $p1 .= $t['login'].':'.$t['htpass']."\n"; - if ($t['statut'] == '0minirezo') - $p2 .= $t['login'].':'.$t['htpass']."\n"; + $p1 .= $t['login'] . ':' . $t['htpass'] . "\n"; + if ($t['statut'] == '0minirezo') { + $p2 .= $t['login'] . ':' . $t['htpass'] . "\n"; + } } } if ($p1) { - ecrire_fichier($htpasswd, $p1); - ecrire_fichier($htpasswd.'-admin', $p2); - spip_log("Ecriture de $htpasswd et $htpasswd-admin"); + ecrire_fichier($htpasswd, $p1); + ecrire_fichier($htpasswd . '-admin', $p2); + spip_log("Ecriture de $htpasswd et $htpasswd-admin"); } } @@ -272,12 +305,12 @@ function ecrire_acces() { * Créer un password htaccess * * @link http://docs.php.net/manual/fr/function.crypt.php Documentation de `crypt()` - * + * * @global string $htsalt * Une chaîne de sel sur laquelle sera fondée le hachage. * @param string $pass * Le mot de passe - * @return void|string + * @return void|string * La chaîne hachée si fonction crypt présente, rien sinon. */ function generer_htpass($pass) { @@ -289,7 +322,7 @@ function generer_htpass($pass) { /** * Installe ou vérifie un fichier .htaccess, y compris sa prise en compte par Apache - * + * * @uses recuperer_lapage() * @param string $rep * Nom du répertoire où SPIP doit vérifier l'existence d'un fichier .htaccess @@ -297,13 +330,14 @@ function generer_htpass($pass) { * @return boolean */ function verifier_htaccess($rep, $force = false) { - $htaccess = rtrim($rep,"/") . "/" . _ACCESS_FILE_NAME; - if (((@file_exists($htaccess)) OR defined('_TEST_DIRS')) AND !$force) + $htaccess = rtrim($rep, "/") . "/" . _ACCESS_FILE_NAME; + if (((@file_exists($htaccess)) OR defined('_TEST_DIRS')) AND !$force) { return true; + } // directive deny compatible Apache 2.0+ $deny = -"# Deny all requests from Apache 2.4+. + "# Deny all requests from Apache 2.4+. <IfModule mod_authz_core.c> Require all denied </IfModule> @@ -313,7 +347,7 @@ function verifier_htaccess($rep, $force = false) { </IfModule> "; // support des vieilles versions Apache 1.x mais uniquement si elles l'annoncent (pas en mode PROD) - if (function_exists('apache_get_version') AND $v = apache_get_version() AND strncmp($v,"Apache/1.",9) == 0){ + if (function_exists('apache_get_version') AND $v = apache_get_version() AND strncmp($v, "Apache/1.", 9) == 0) { $deny = "deny from all\n"; } @@ -321,11 +355,11 @@ function verifier_htaccess($rep, $force = false) { fputs($ht, $deny); fclose($ht); @chmod($htaccess, _SPIP_CHMOD & 0666); - $t = rtrim($rep,"/") . "/.ok"; + $t = rtrim($rep, "/") . "/.ok"; if ($ht = @fopen($t, "w")) { @fclose($ht); include_spip('inc/distant'); - $t = substr($t,strlen(_DIR_RACINE)); + $t = substr($t, strlen(_DIR_RACINE)); $t = url_de_base() . $t; $ht = recuperer_lapage($t, false, 'HEAD', 0); // htaccess inoperant si on a recupere des entetes HTTP @@ -334,19 +368,19 @@ function verifier_htaccess($rep, $force = false) { } } spip_log("Creation de $htaccess " . ($ht ? " reussie" : " manquee")); + return $ht; } - /** - * Créer un fichier .htaccess pour chaque répertoire d'extension + * Créer un fichier .htaccess pour chaque répertoire d'extension * dans `_DIR_IMG` si la configuration le demande * - * @note - * La variable de configuration `creer_htaccess` peut être posée + * @note + * La variable de configuration `creer_htaccess` peut être posée * par un plugin tel acces_restreint. - * + * * @uses _DIR_IMG * @uses verifier_htaccess() * @@ -359,13 +393,16 @@ function gerer_htaccess() { $f = isset($GLOBALS['meta']['creer_htaccess']) and ($GLOBALS['meta']['creer_htaccess'] === 'oui'); $dirs = sql_allfetsel('extension', 'spip_types_documents'); $dirs[] = array('extension' => 'distant'); - foreach($dirs as $e) { + foreach ($dirs as $e) { if (is_dir($dir = _DIR_IMG . $e['extension'])) { - if ($f) + if ($f) { verifier_htaccess($dir); - else spip_unlink($dir . '/' . _ACCESS_FILE_NAME); + } else { + spip_unlink($dir . '/' . _ACCESS_FILE_NAME); + } } } + return isset($GLOBALS['meta']['creer_htaccess']) ? $GLOBALS['meta']['creer_htaccess'] : ''; } diff --git a/ecrire/inc/actions.php b/ecrire/inc/actions.php index 7992dbccf4..c9422f2660 100644 --- a/ecrire/inc/actions.php +++ b/ecrire/inc/actions.php @@ -14,15 +14,17 @@ * Gestion des actions sécurisées * * @package SPIP\Core\Actions -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Retourne une URL ou un formulaire securisé * * @uses inc_securiser_action_dist() - * + * * @param string $action * Nom du fichier/action appelé (dans le répertoire action) * @param string $arg @@ -40,8 +42,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return array|string * URL, code HTML du formulaire ou tableau (action, arg, hash) */ -function generer_action_auteur($action, $arg, $redirect = '', $mode = false, $att = '', $public = false){ +function generer_action_auteur($action, $arg, $redirect = '', $mode = false, $att = '', $public = false) { $securiser_action = charger_fonction('securiser_action', 'inc'); + return $securiser_action($action, $arg, $redirect, $mode, $att, $public); } @@ -74,14 +77,15 @@ function generer_action_auteur($action, $arg, $redirect = '', $mode = false, $at * @return string * Code HTML du formulaire */ -function redirige_action_auteur($action, $arg, $ret, $gra = '', $mode = false, $atts = '', $public = false){ - $r = ($public ? _DIR_RESTREINT_ABS : _DIR_RESTREINT) .generer_url_ecrire($ret, $gra, true, true); +function redirige_action_auteur($action, $arg, $ret, $gra = '', $mode = false, $atts = '', $public = false) { + $r = ($public ? _DIR_RESTREINT_ABS : _DIR_RESTREINT) . generer_url_ecrire($ret, $gra, true, true); + return generer_action_auteur($action, $arg, $r, $mode, $atts, $public); } /** * Retourne une URL ou un formulaire sécurisé en méthode POST - * + * * @param string $action * Nom du fichier/action appelé (dans le répertoire action) * @param string $arg @@ -100,9 +104,10 @@ function redirige_action_auteur($action, $arg, $ret, $gra = '', $mode = false, $ * @return array|string * URL, code HTML du formulaire ou tableau (action, arg, hash) */ -function redirige_action_post($action, $arg, $ret, $gra, $corps, $att = ''){ - $r = _DIR_RESTREINT.generer_url_ecrire($ret, $gra, false, true); - return generer_action_auteur($action, $arg, $r, $corps, $att." method='post'"); +function redirige_action_post($action, $arg, $ret, $gra, $corps, $att = '') { + $r = _DIR_RESTREINT . generer_url_ecrire($ret, $gra, false, true); + + return generer_action_auteur($action, $arg, $r, $corps, $att . " method='post'"); } @@ -116,32 +121,33 @@ function redirige_action_post($action, $arg, $ret, $gra, $corps, $att = ''){ * La valeur speciale false fournit text/html sans entete xml. Elle equivaut a * passer "text/html" comme $content_type */ -function ajax_retour($corps, $content_type = null){ +function ajax_retour($corps, $content_type = null) { $xml = false; - if (is_null($content_type) OR $content_type===true){ + if (is_null($content_type) OR $content_type === true) { $xml = true; $content_type = 'text/html'; - } - elseif (!$content_type OR !is_string($content_type) OR strpos($content_type,'/')===false) { + } elseif (!$content_type OR !is_string($content_type) OR strpos($content_type, '/') === false) { $content_type = 'text/html'; } - + $e = ""; if (isset($_COOKIE['spip_admin']) - AND ((_request('var_mode')=='debug') OR !empty($GLOBALS['tableau_des_temps']))) + AND ((_request('var_mode') == 'debug') OR !empty($GLOBALS['tableau_des_temps'])) + ) { $e = erreur_squelette(); - if (isset($GLOBALS['transformer_xml']) OR (isset($GLOBALS['exec']) AND $GLOBALS['exec']=='valider_xml')){ + } + if (isset($GLOBALS['transformer_xml']) OR (isset($GLOBALS['exec']) AND $GLOBALS['exec'] == 'valider_xml')) { $debut = _DOCTYPE_ECRIRE - ."<html><head><title>Debug Spip Ajax</title></head>" - ."<body><div>\n\n" - ."<!-- %%%%%%%%%%%%%%%%%%% Ajax %%%%%%%%%%%%%%%%%%% -->\n"; + . "<html><head><title>Debug Spip Ajax</title></head>" + . "<body><div>\n\n" + . "<!-- %%%%%%%%%%%%%%%%%%% Ajax %%%%%%%%%%%%%%%%%%% -->\n"; $fin = '</div></body></html>'; } else { $c = $GLOBALS['meta']["charset"]; - header('Content-Type: '.$content_type.'; charset='.$c); - $debut = (($xml AND strlen(trim($corps))) ? '<'."?xml version='1.0' encoding='".$c."'?".">\n" : ''); + header('Content-Type: ' . $content_type . '; charset=' . $c); + $debut = (($xml AND strlen(trim($corps))) ? '<' . "?xml version='1.0' encoding='" . $c . "'?" . ">\n" : ''); $fin = ""; } echo $debut, $corps, $fin, $e; diff --git a/ecrire/inc/admin.php b/ecrire/inc/admin.php index ef722bb0f2..b31e54a4f0 100644 --- a/ecrire/inc/admin.php +++ b/ecrire/inc/admin.php @@ -14,15 +14,17 @@ * Gestion d'administration d'un SPIP * * @param SPIP\Core\Admin -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Teste qu'un utilisateur a des droits sur les fichiers du site et * exécute l'action (en base) demandée si c'est le cas. - * + * * Demande / vérifie le droit de création de répertoire par le demandeur; * Mémorise dans les meta que ce script est en cours d'exécution. * Si elle y est déjà c'est qu'il y a eu suspension du script, on reprend. @@ -30,7 +32,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @uses debut_admin() * @uses admin_verifie_session() * @uses fin_admin() - * + * * @param string $script * Script d'action (en base) à exécuter si on a des droits d'accès aux fichiers * @param string $titre @@ -42,24 +44,29 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return string * Code HTML de la page (pour vérifier les droits), * sinon code HTML de la page après le traitement effectué. -**/ -function inc_admin_dist($script, $titre, $comment = '', $anonymous = false) -{ + **/ +function inc_admin_dist($script, $titre, $comment = '', $anonymous = false) { $reprise = true; if (!isset($GLOBALS['meta'][$script]) - OR !isset($GLOBALS['meta']['admin'])) { + OR !isset($GLOBALS['meta']['admin']) + ) { $reprise = false; - $res = debut_admin($script, $titre, $comment); - if ($res) return $res; + $res = debut_admin($script, $titre, $comment); + if ($res) { + return $res; + } spip_log("meta: $script " . join(',', $_POST)); ecrire_meta($script, serialize($_POST)); - } + } - $res = admin_verifie_session($script,$anonymous); - if ($res) return $res; + $res = admin_verifie_session($script, $anonymous); + if ($res) { + return $res; + } $base = charger_fonction($script, 'base'); - $base($titre,$reprise); + $base($titre, $reprise); fin_admin($script); + return ''; } @@ -83,7 +90,7 @@ function inc_admin_dist($script, $titre, $comment = '', $anonymous = false) * se passe mal, on la stoppe * * @uses fichier_admin() - * + * * @param string $script * Script d'action (en base) * @param bool $anonymous @@ -94,27 +101,32 @@ function inc_admin_dist($script, $titre, $comment = '', $anonymous = false) function admin_verifie_session($script, $anonymous = false) { include_spip('base/abstract_sql'); - $pref = sprintf("_%d_",$GLOBALS['visiteur_session']['id_auteur']); + $pref = sprintf("_%d_", $GLOBALS['visiteur_session']['id_auteur']); $signal = fichier_admin($script, "$script$pref"); $valeur = sql_getfetsel('valeur', 'spip_meta', "nom='admin'"); - if ($valeur === NULL) { + if ($valeur === null) { ecrire_meta('admin', $signal, 'non'); } else { if (!$anonymous AND ($valeur != $signal)) { if (!preg_match('/^(.*)_(\d+)_/', $GLOBALS['meta']["admin"], $l) - OR intval($l[2])!=$GLOBALS['visiteur_session']['id_auteur']) { + OR intval($l[2]) != $GLOBALS['visiteur_session']['id_auteur'] + ) { include_spip('inc/minipres'); spip_log("refus de lancer $script, priorite a $valeur"); - return minipres(_T('info_travaux_texte'), '', array('status'=>503)); + + return minipres(_T('info_travaux_texte'), '', array('status' => 503)); } } } $journal = "spip"; if (autoriser('configurer')) // c'est une action webmestre, soit par ftp soit par statut webmestre + { $journal = 'webmestre'; + } // on pourrait statuer automatiquement les webmestres a l'init d'une action auth par ftp ... ? - spip_log("admin $pref" . ($valeur ? " (reprise)" : ' (init)'),$journal); + spip_log("admin $pref" . ($valeur ? " (reprise)" : ' (init)'), $journal); + return ''; } @@ -123,16 +135,15 @@ function admin_verifie_session($script, $anonymous = false) { * * Dans le répertoire temporaire si on est admin, sinon dans le répertoire * de transfert des admins restreints - * + * * @return string * Chemin du répertoire. -**/ -function dir_admin() -{ + **/ +function dir_admin() { if (autoriser('configurer')) { return _DIR_TMP; } else { - return _DIR_TRANSFERT . $GLOBALS['visiteur_session']['login'] . '/'; + return _DIR_TRANSFERT . $GLOBALS['visiteur_session']['login'] . '/'; } } @@ -149,11 +160,11 @@ function dir_admin() * Préfixe au nom du fichier calculé * @return string * Nom du fichier -**/ + **/ function fichier_admin($action, $pref = 'admin_') { - return $pref . - substr(md5($action.(time() & ~2047).$GLOBALS['visiteur_session']['login']), 0, 10); + return $pref . + substr(md5($action . (time() & ~2047) . $GLOBALS['visiteur_session']['login']), 0, 10); } /** @@ -164,10 +175,10 @@ function fichier_admin($action, $pref = 'admin_') { * de tester la création du répertoire (toutes sauf repair ou delete_all). * On considère qu'un webmestre a déjà du prouver ses droits sur les fichiers. * Dans ce cas, on quitte sans rien faire également. - * + * * @uses dir_admin() * @uses fichier_admin() - * + * * @param string $script * Script d'action (en base) à exécuter ensuite * @param string $action @@ -177,49 +188,53 @@ function fichier_admin($action, $pref = 'admin_') { * @return string * Code HTML de la page (pour vérifier les droits), * sinon chaîne vide si déjà fait. -**/ + **/ function debut_admin($script, $action = '', $corps = '') { if ((!$action) || !(autoriser('webmestre') OR autoriser('chargerftp'))) { include_spip('inc/minipres'); + return minipres(); } else { $dir = dir_admin(); $signal = fichier_admin($script); if (@file_exists($dir . $signal)) { - spip_log ("Action admin: $action"); + spip_log("Action admin: $action"); + return ''; } include_spip('inc/minipres'); - // Si on est un super-admin, un bouton de validation suffit - // sauf dans les cas destroy + // Si on est un super-admin, un bouton de validation suffit + // sauf dans les cas destroy if ((autoriser('webmestre') OR $script === 'repair') - AND $script != 'delete_all') { + AND $script != 'delete_all' + ) { if (_request('validation_admin') == $signal) { - spip_log ("Action super-admin: $action"); + spip_log("Action super-admin: $action"); + return ''; } - $corps .= '<input type="hidden" name="validation_admin" value="'.$signal.'" />'; + $corps .= '<input type="hidden" name="validation_admin" value="' . $signal . '" />'; $suivant = _T('bouton_valider'); $js = ''; } else { // cet appel permet d'assurer un copier-coller du nom du repertoire a creer dans tmp (esj) // l'insertion du script a cet endroit n'est pas xhtml licite mais evite de l'embarquer dans toutes les pages minipres - $corps .= http_script('', "spip_barre.js"); + $corps .= http_script('', "spip_barre.js"); $corps .= "<fieldset><legend>" - . _T('info_authentification_ftp') - . aide("ftp_auth") - . "</legend>\n<label for='fichier'>" - . _T('info_creer_repertoire') - . "</label>\n" - . "<span id='signal' class='formo'>".$signal."</span>" - . "<input type='hidden' id='fichier' name='fichier' value='" - . $signal - . "' />" - . _T('info_creer_repertoire_2', array('repertoire' => joli_repertoire($dir))) - . "</fieldset>"; + . _T('info_authentification_ftp') + . aide("ftp_auth") + . "</legend>\n<label for='fichier'>" + . _T('info_creer_repertoire') + . "</label>\n" + . "<span id='signal' class='formo'>" . $signal . "</span>" + . "<input type='hidden' id='fichier' name='fichier' value='" + . $signal + . "' />" + . _T('info_creer_repertoire_2', array('repertoire' => joli_repertoire($dir))) + . "</fieldset>"; $suivant = _T('bouton_recharger_page'); @@ -234,10 +249,12 @@ function debut_admin($script, $action = '', $corps = '') { // admin/xxx correspond // a exec/base_xxx de preference // et exec/xxx sinon (compat) - if (tester_url_ecrire("base_$script")) + if (tester_url_ecrire("base_$script")) { $script = "base_$script"; + } $form = copy_request($script, $corps, $suivant); $info_action = _T('info_action', array('action' => "$action")); + return minipres($info_action, $form, $js); } } @@ -248,7 +265,7 @@ function debut_admin($script, $action = '', $corps = '') { * * @param string $action * Nom de l'action (en base) qui a été exécutée -**/ + **/ function fin_admin($action) { $signal = dir_admin() . fichier_admin($action); spip_unlink($signal); @@ -273,16 +290,18 @@ function fin_admin($action) { * Texte du bouton de validation * @return string * Code HTML du formulaire -**/ -function copy_request($script, $suite, $submit = '') -{ + **/ +function copy_request($script, $suite, $submit = '') { include_spip('inc/filtres'); - foreach(array_merge($_POST,$_GET) as $n => $c) { - if (!in_array($n,array('fichier','exec','validation_admin')) AND !is_array($c)) - $suite .= "\n<input type='hidden' name='".spip_htmlspecialchars($n)."' value='" . - entites_html($c) . - "' />"; + foreach (array_merge($_POST, $_GET) as $n => $c) { + if (!in_array($n, array('fichier', 'exec', 'validation_admin')) AND !is_array($c)) { + $suite .= "\n<input type='hidden' name='" . spip_htmlspecialchars($n) . "' value='" . + entites_html($c) . + "' />"; + } } - return generer_form_ecrire($script, $suite, '', $submit); + + return generer_form_ecrire($script, $suite, '', $submit); } + ?> diff --git a/ecrire/inc/aider.php b/ecrire/inc/aider.php index f904365cfa..2a1bd76ca0 100644 --- a/ecrire/inc/aider.php +++ b/ecrire/inc/aider.php @@ -16,21 +16,23 @@ * L'aide en ligne de SPIP est disponible sous forme d'articles de www.spip.net * qui ont des repères nommés arttitre, artdesc etc. * - * La fonction `inc_aider_dist` reçoit soit ces repères, + * La fonction `inc_aider_dist` reçoit soit ces repères, * soit le nom du champ de saisie, le nom du squelette le contenant et enfin * l'environnement d'exécution du squelette (inutilisé pour le moment). * * Le tableau global `aider_index` donne ces repères. - * + * * @package SPIP\Core\Aider */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres'); $GLOBALS['aider_index'] = array( - 'editer_article.html' => array ( + 'editer_article.html' => array( 'surtitre' => 'arttitre', 'titre' => 'arttitre', 'soustitre' => 'arttitre', @@ -38,51 +40,57 @@ $GLOBALS['aider_index'] = array( 'descriptif' => 'artdesc', 'virtuel' => 'artvirt', 'chapo' => 'arttitre', - 'text_area' => 'arttexte'), + 'text_area' => 'arttexte' + ), 'editer_breve.html' => array( 'id_parent' => 'brevesrub', 'lien_titre' => 'breveslien', - 'statut' => 'brevesstatut'), + 'statut' => 'brevesstatut' + ), 'editer_groupe_mot.html' => array( - 'titre' => 'motsgroupes'), + 'titre' => 'motsgroupes' + ), 'editer_mot.html' => array( 'titre' => 'mots', - 'id_groupe' => 'motsgroupes'), + 'id_groupe' => 'motsgroupes' + ), 'editer_rubrique.html' => array( 'titre' => 'arttitre', 'id_parent' => 'rubrub', - 'text_area' => 'raccourcis') - - ); + 'text_area' => 'raccourcis' + ) +); /** * Générer un lien d'aide (icône + lien) * * @uses aider_icone() - * + * * @param string $aide - * clé d'identification de l'aide souhaitée + * clé d'identification de l'aide souhaitée * @param strink $skel - * Nom du squelette qui appelle ce bouton d'aide + * Nom du squelette qui appelle ce bouton d'aide * @param array $env - * Environnement du squelette + * Environnement du squelette * @param bool $aide_spip_directe - * false : Le lien généré est relatif à notre site (par défaut) - * true : Le lien est réalisé sur spip.net/aide/ directement... + * false : Le lien généré est relatif à notre site (par défaut) + * true : Le lien est réalisé sur spip.net/aide/ directement... * @return string -**/ + **/ function inc_aider_dist($aide = '', $skel = '', $env = array(), $aide_spip_directe = false) { if (($skel = basename($skel)) - AND isset($GLOBALS['aider_index'][$skel]) - AND isset($GLOBALS['aider_index'][$skel][$aide])) + AND isset($GLOBALS['aider_index'][$skel]) + AND isset($GLOBALS['aider_index'][$skel][$aide]) + ) { $aide = $GLOBALS['aider_index'][$skel][$aide]; + } if ($aide_spip_directe) { // on suppose que spip.net est le premier present @@ -97,15 +105,16 @@ function inc_aider_dist($aide = '', $skel = '', $env = array(), $aide_spip_direc $args = "aide=$aide&var_lang=" . $GLOBALS['spip_lang']; $url = generer_url_ecrire("aide", $args); } - + return aider_icone($url); } + /** * Créer l'icône d'aide - * + * * @global string $spip_lang * @global string $spip_lang_rtl - * + * * @param string $url * URL vers l'aide * @param string $clic @@ -113,17 +122,17 @@ function inc_aider_dist($aide = '', $skel = '', $env = array(), $aide_spip_direc * @return string * Icone d'aide */ -function aider_icone($url, $clic= '') -{ +function aider_icone($url, $clic = '') { if (!$clic) { $t = _T('titre_image_aide'); - $clic = http_img_pack("aide".aide_lang_dir($GLOBALS['spip_lang'],$GLOBALS['spip_lang_rtl'])."-16.png", + $clic = http_img_pack("aide" . aide_lang_dir($GLOBALS['spip_lang'], $GLOBALS['spip_lang_rtl']) . "-16.png", _T('info_image_aide'), " title=\"$t\" class='aide'"); } + return "\n <a class='aide popin'\nhref='" - . $url + . $url . "' target='_blank'>" . $clic . "</a>"; @@ -133,27 +142,27 @@ function aider_icone($url, $clic= '') * Calcul de la direction du texte et la mise en page selon la langue * * En hébreu le ? ne doit pas être inversé. - * + * * @param string $spip_lang * @param string $spip_lang_rtl * @return string */ function aide_lang_dir($spip_lang, $spip_lang_rtl) { - return ($spip_lang<>'he') ? $spip_lang_rtl : ''; + return ($spip_lang <> 'he') ? $spip_lang_rtl : ''; } /** Les sections d'un fichier aide sont reperées ainsi. */ -define('_SECTIONS_AIDE', ',<h([12])(?:\s+class="spip")?'. '>([^/]+?)(?:/(.+?))?</h\1>,ism'); +define('_SECTIONS_AIDE', ',<h([12])(?:\s+class="spip")?' . '>([^/]+?)(?:/(.+?))?</h\1>,ism'); /** * Création des fichiers de l'aide de SPIP - * - * @uses _DIR_AIDE + * + * @uses _DIR_AIDE * @uses _SECTIONS_AIDE - * + * * @uses copie_locale() * @uses aide_fixe_img() * @uses aide_section() - * + * * @param string $path * @param array $help_server * @return array @@ -161,7 +170,7 @@ define('_SECTIONS_AIDE', ',<h([12])(?:\s+class="spip")?'. '>([^/]+?)(?:/(.+?))?< function aide_fichier($path, $help_server) { $md5 = md5(serialize($help_server)); - $fichier_aide = _DIR_AIDE . substr($md5,0,16) . "-" . $path; + $fichier_aide = _DIR_AIDE . substr($md5, 0, 16) . "-" . $path; $lastm = @filemtime($fichier_aide); $lastversion = @filemtime(_DIR_RESTREINT . 'inc_version.php'); $here = @(is_readable($fichier_aide) AND ($lastm >= $lastversion)); @@ -169,84 +178,93 @@ function aide_fichier($path, $help_server) { if ($here) { lire_fichier($fichier_aide, $contenu); + return array($contenu, $lastm); } // mettre en cache (tant pis si echec) - sous_repertoire(_DIR_AIDE,'','',true); + sous_repertoire(_DIR_AIDE, '', '', true); $contenu = array(); include_spip('inc/distant'); foreach ($help_server as $k => $server) { // Remplacer les liens aux images par leur gestionnaire de cache $url = "$server/$path"; - $local = _DIR_AIDE.substr(md5($url),0,8)."-".preg_replace(",[^\w.]+,i","_",$url); + $local = _DIR_AIDE . substr(md5($url), 0, 8) . "-" . preg_replace(",[^\w.]+,i", "_", $url); $local = _DIR_RACINE . copie_locale($url, 'modif', $local); - lire_fichier($local,$page); - $page = aide_fixe_img($page,$server); + lire_fichier($local, $page); + $page = aide_fixe_img($page, $server); // les liens internes ne doivent pas etre deguises en externes $url = parse_url($url); $re = '@(<a\b[^>]*\s+href=["\'])' . - '(?:' . $url['scheme'] . '://' . $url['host'] . ')?' . - $url['path'] . '([^"\']*)@ims'; - $page = preg_replace($re,'\\1\\2', $page); + '(?:' . $url['scheme'] . '://' . $url['host'] . ')?' . + $url['path'] . '([^"\']*)@ims'; + $page = preg_replace($re, '\\1\\2', $page); preg_match_all(_SECTIONS_AIDE, $page, $sections, PREG_SET_ORDER); // Fusionner les aides ayant meme nom de section $vus = array(); foreach ($sections as $section) { - list($tout,$prof, $sujet,) = $section; - if (in_array($sujet, $vus)) continue; + list($tout, $prof, $sujet,) = $section; + if (in_array($sujet, $vus)) { + continue; + } $corps = aide_section($sujet, $page, $prof); foreach ($contenu as $k => $s) { - if ($sujet == $k) { - // Section deja vue qu'il faut completer - // Si le complement a des sous-sections, - // ne pas en tenir compte quand on les rencontrera - // lors des prochains passages dans la boucle - preg_match_all(_SECTIONS_AIDE, $corps, $s, PREG_PATTERN_ORDER); - if ($s) {$vus = array_merge($vus, $s[2]);} - $contenu[$k] .= $corps; - $corps = ''; - break; - } + if ($sujet == $k) { + // Section deja vue qu'il faut completer + // Si le complement a des sous-sections, + // ne pas en tenir compte quand on les rencontrera + // lors des prochains passages dans la boucle + preg_match_all(_SECTIONS_AIDE, $corps, $s, PREG_PATTERN_ORDER); + if ($s) { + $vus = array_merge($vus, $s[2]); + } + $contenu[$k] .= $corps; + $corps = ''; + break; + } } // Si totalement nouveau, inserer le titre // mais pas le corps s'il contient des sous-sections: // elles vont venir dans les passages suivants if ($corps) { - $corps = aide_section($sujet, $page); - $contenu[$sujet] = $tout . "\n" . $corps; + $corps = aide_section($sujet, $page); + $contenu[$sujet] = $tout . "\n" . $corps; } } } - $contenu = '<div>' . join('',$contenu) . '</div>'; + $contenu = '<div>' . join('', $contenu) . '</div>'; // Renvoyer les liens vraiment externes dans une autre fenetre $contenu = preg_replace('@<a href="(http://[^"]+)"([^>]*)>@', - '<a href="\\1"\\2 target="_blank">', - $contenu); + '<a href="\\1"\\2 target="_blank">', + $contenu); // Correction typo dans la langue demandee #changer_typo($lang_aide); $contenu = '<body>' . $contenu . '</body>'; - if (strlen($contenu) <= 100) return array(false, false); - ecrire_fichier ($fichier_aide, $contenu); + if (strlen($contenu) <= 100) { + return array(false, false); + } + ecrire_fichier($fichier_aide, $contenu); + return array($contenu, time()); } + /** * Générer l'url des images de l'aide - * + * * @param string|array $args - * Arguments à transmettre à l'URL : - * - string : tel que `arg1=yy&arg2=zz` + * Arguments à transmettre à l'URL : + * - string : tel que `arg1=yy&arg2=zz` * - array : tel que `array( arg1 => yy, arg2 => zz )` * @return string * URL */ -function generer_url_aide_img($args){ +function generer_url_aide_img($args) { return generer_url_action('aide_img', $args, false, true); } @@ -259,7 +277,7 @@ define('_REPLACE_IMG_PACK', "@(<img([^<>]* +)?\s*src=['\"])img_pack\/@ims"); /** * Remplacer les URL des images par l'URL du gestionnaire de cache local - * + * * @uses _REPLACE_IMG_PACK * @uses _DIR_IMG_PACK * @@ -267,28 +285,28 @@ define('_REPLACE_IMG_PACK', "@(<img([^<>]* +)?\s*src=['\"])img_pack\/@ims"); * @param string $server * @return string */ -function aide_fixe_img($contenu, $server){ +function aide_fixe_img($contenu, $server) { $html = ""; $re = "@(<img([^<>]* +)?\s*src=['\"])((AIDE|IMG|local)/([-_a-zA-Z0-9]*/?)([^'\"<>]*))@imsS"; while (preg_match($re, $contenu, $r)) { $p = strpos($contenu, $r[0]); $i = $server . '/' . $r[3]; - $html .= substr($contenu, 0, $p) . $r[1] . $i; - $contenu = substr($contenu, $p + strlen($r[0])); + $html .= substr($contenu, 0, $p) . $r[1] . $i; + $contenu = substr($contenu, $p+strlen($r[0])); } $html .= $contenu; // traiter les vieilles doc - return preg_replace(_REPLACE_IMG_PACK,"\\1"._DIR_IMG_PACK, $html); + return preg_replace(_REPLACE_IMG_PACK, "\\1" . _DIR_IMG_PACK, $html); } /** * Extraire une section d'aide * - * Extraire la seule section demandée, qui commence par son nom entourée d'une + * Extraire la seule section demandée, qui commence par son nom entourée d'une * balise h2 et se termine par la prochaine balise h2 ou h1 ou le /body final. - * + * * @param string $aide * Titre de la section d'aide * @param string $contenu @@ -296,13 +314,15 @@ function aide_fixe_img($contenu, $server){ * Dans quel hn doit-on mettre le titre de section * @return string */ -function aide_section($aide, $contenu, $prof = 2){ - $maxprof = ($prof >=2) ? "12" : "1"; +function aide_section($aide, $contenu, $prof = 2) { + $maxprof = ($prof >= 2) ? "12" : "1"; $r = "@<h$prof" . '(?: class="spip")?' . '>\s*' . $aide - ."\s*(?:/.+?)?</h$prof>(.*?)<(?:(?:h[$maxprof])|/body)@ism"; + . "\s*(?:/.+?)?</h$prof>(.*?)<(?:(?:h[$maxprof])|/body)@ism"; + + if (preg_match($r, $contenu, $m)) { + return $m[1]; + } - if (preg_match($r, $contenu, $m)) - return $m[1]; # spip_log("aide inconnue $r dans " . substr($contenu, 0, 150)); return ''; } diff --git a/ecrire/inc/auth.php b/ecrire/inc/auth.php index e3d9d785f8..246690d730 100644 --- a/ecrire/inc/auth.php +++ b/ecrire/inc/auth.php @@ -14,20 +14,21 @@ * Gestion des authentifications * * @package SPIP\Core\Authentification -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); - /** * Teste l'authentification d'un visiteur * * Cette fonction ne fait pas l'authentification en soit ; * elle vérifie simplement qu'une personne est connectée ou non. - * + * * @return array|int|string * - URL de connexion si on ne sait rien (pas de cookie, pas Auth_user); * - un tableau si visiteur sans droit (tableau = sa ligne SQL) @@ -38,9 +39,13 @@ function inc_auth_dist() { $row = auth_mode(); - if ($row) return auth_init_droits($row); + if ($row) { + return auth_init_droits($row); + } - if (!$GLOBALS['connect_login']) return auth_a_loger(); + if (!$GLOBALS['connect_login']) { + return auth_a_loger(); + } // Cas ou l'auteur a ete identifie mais on n'a pas d'info sur lui // C'est soit parce que la base est inutilisable, @@ -48,12 +53,16 @@ function inc_auth_dist() { // Pas la peine d'insister. // Renvoyer le nom fautif et une URL de remise a zero - if (spip_connect()) - return array('login' => $GLOBALS['connect_login'], - 'site' => generer_url_public('', "action=logout&logout=prive")); + if (spip_connect()) { + return array( + 'login' => $GLOBALS['connect_login'], + 'site' => generer_url_public('', "action=logout&logout=prive") + ); + } $n = intval(sql_errno()); spip_log("Erreur base de donnees $n " . sql_error()); + return $n ? $n : 1; } @@ -65,8 +74,7 @@ function inc_auth_dist() { * @param $raison * @return array|string */ -function auth_echec($raison) -{ +function auth_echec($raison) { include_spip('inc/minipres'); include_spip('inc/headers'); // pas authentifie. Pourquoi ? @@ -77,23 +85,25 @@ function auth_echec($raison) $raison = redirige_formulaire($raison); } elseif (is_int($raison)) { // erreur SQL a afficher - $raison = minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'). "<p><tt>".sql_errno()." ".sql_error()."</tt></p>"); + $raison = minipres(_T('info_travaux_titre'), + _T('titre_probleme_technique') . "<p><tt>" . sql_errno() . " " . sql_error() . "</tt></p>"); } elseif (@$raison['statut']) { // un simple visiteur n'a pas acces a l'espace prive spip_log("connexion refusee a " . @$raison['id_auteur']); - $raison = minipres(_T('avis_erreur_connexion'),_T('avis_erreur_visiteur')); + $raison = minipres(_T('avis_erreur_connexion'), _T('avis_erreur_visiteur')); } else { // auteur en fin de droits ... $h = $raison['site']; $raison = minipres(_T('avis_erreur_connexion'), - "<br /><br /><p>" - . _T('texte_inc_auth_1', + "<br /><br /><p>" + . _T('texte_inc_auth_1', array('auth_login' => $raison['login'])) - . " <a href='$h'>" - . _T('texte_inc_auth_2') - . "</a>" - . _T('texte_inc_auth_3')); + . " <a href='$h'>" + . _T('texte_inc_auth_2') + . "</a>" + . _T('texte_inc_auth_3')); } + return $raison; } @@ -103,15 +113,14 @@ function auth_echec($raison) * * @return array|bool|string */ -function auth_mode() -{ +function auth_mode() { // // Initialiser variables (eviter hacks par URL) // $GLOBALS['connect_login'] = ''; - $id_auteur = NULL; + $id_auteur = null; $GLOBALS['auth_can_disconnect'] = false; // @@ -123,11 +132,13 @@ function auth_mode() if (isset($_COOKIE['spip_session'])) { $session = charger_fonction('session', 'inc'); if ($id_auteur = $session() - OR $id_auteur===0 // reprise sur restauration + OR $id_auteur === 0 // reprise sur restauration ) { $GLOBALS['auth_can_disconnect'] = true; $GLOBALS['connect_login'] = session_get('login'); - } else unset($_COOKIE['spip_session']); + } else { + unset($_COOKIE['spip_session']); + } } // Essayer auth http si significatif @@ -135,42 +146,47 @@ function auth_mode() if (!$GLOBALS['ignore_auth_http']) { if ( (isset($_SERVER['PHP_AUTH_USER']) AND isset($_SERVER['PHP_AUTH_PW']) - AND $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) + AND $r = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW'])) OR // Si auth http differtente de basic, PHP_AUTH_PW // est indisponible mais tentons quand meme pour // autocreation via LDAP (isset($_SERVER['REMOTE_USER']) - AND $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], '')) - ) { - if (!$id_auteur) { - $_SERVER['PHP_AUTH_PW'] = ''; - $GLOBALS['auth_can_disconnect'] = true; - $GLOBALS['visiteur_session'] = $r; - $GLOBALS['connect_login'] = session_get('login'); - $id_auteur = $r['id_auteur']; - } else { - // cas de la session en plus de PHP_AUTH - /* if ($id_auteur != $r['id_auteur']){ - spip_log("vol de session $id_auteur" . join(', ', $r)); - unset($_COOKIE['spip_session']); - $id_auteur = ''; - } */ - } + AND $r = lire_php_auth($_SERVER['PHP_AUTH_USER'] = $_SERVER['REMOTE_USER'], '')) + ) { + if (!$id_auteur) { + $_SERVER['PHP_AUTH_PW'] = ''; + $GLOBALS['auth_can_disconnect'] = true; + $GLOBALS['visiteur_session'] = $r; + $GLOBALS['connect_login'] = session_get('login'); + $id_auteur = $r['id_auteur']; + } else { + // cas de la session en plus de PHP_AUTH + /* if ($id_auteur != $r['id_auteur']){ + spip_log("vol de session $id_auteur" . join(', ', $r)); + unset($_COOKIE['spip_session']); + $id_auteur = ''; + } */ + } } // Authentification .htaccess old style, car .htaccess semble // souvent definir *aussi* PHP_AUTH_USER et PHP_AUTH_PW - else if (isset($_SERVER['REMOTE_USER'])) - $GLOBALS['connect_login'] = $_SERVER['REMOTE_USER']; + else { + if (isset($_SERVER['REMOTE_USER'])) { + $GLOBALS['connect_login'] = $_SERVER['REMOTE_USER']; + } + } } $where = (is_numeric($id_auteur) - /*AND $id_auteur>0*/ // reprise lors des restaurations + /*AND $id_auteur>0*/ // reprise lors des restaurations ) ? - "id_auteur=$id_auteur" : - (!strlen($GLOBALS['connect_login']) ? '' : "login=" . sql_quote($GLOBALS['connect_login'],'','text')); + "id_auteur=$id_auteur" : + (!strlen($GLOBALS['connect_login']) ? '' : "login=" . sql_quote($GLOBALS['connect_login'], '', 'text')); - if (!$where) return ''; + if (!$where) { + return ''; + } // Trouver les autres infos dans la table auteurs. // le champ 'quand' est utilise par l'agenda @@ -180,21 +196,20 @@ function auth_mode() /** * Initialisation des globales pour tout l'espace privé si visiteur connu - * + * * Le tableau global visiteur_session contient toutes les infos pertinentes et * à jour (tandis que `$visiteur_session` peut avoir des valeurs un peu datées * s'il est pris dans le fichier de session) - * + * * Les plus utiles sont aussi dans les variables simples ci-dessus * si la globale est vide ce n'est pas un tableau, on la force pour empêcher un warning. * * @param array $row * @return array|string */ -function auth_init_droits($row) -{ +function auth_init_droits($row) { - if ($row['statut']=='nouveau'){ + if ($row['statut'] == 'nouveau') { include_spip('action/inscrire_auteur'); $row = confirmer_statut_inscription($row); } @@ -222,14 +237,15 @@ function auth_init_droits($row) $r = @unserialize($row['prefs']); $GLOBALS['visiteur_session']['prefs'] = ($r ? $r : array()); // si prefs pas definies, les definir par defaut - if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])){ + if (!isset($GLOBALS['visiteur_session']['prefs']['couleur'])) { $GLOBALS['visiteur_session']['prefs']['couleur'] = 9; $GLOBALS['visiteur_session']['prefs']['display'] = 2; $GLOBALS['visiteur_session']['prefs']["display_navigation"] = "navigation_avec_icones"; $GLOBALS['visiteur_session']['prefs']["display_outils"] = "oui"; } - $GLOBALS['visiteur_session'] = pipeline('preparer_visiteur_session',array('args'=>array('row'=>$row),'data'=>$GLOBALS['visiteur_session'])); + $GLOBALS['visiteur_session'] = pipeline('preparer_visiteur_session', + array('args' => array('row' => $row), 'data' => $GLOBALS['visiteur_session'])); // Etablir les droits selon le codage attendu // dans ecrire/index.php ecrire/prive.php @@ -240,8 +256,9 @@ function auth_init_droits($row) // qui ne figure pas dans le fichier de session include_spip('inc/autoriser'); - if (!autoriser('ecrire')) + if (!autoriser('ecrire')) { return $row; + } // autoriser('ecrire') ne laisse passer que les Admin et les Redac @@ -256,6 +273,7 @@ function auth_init_droits($row) $GLOBALS['connect_toutes_rubriques'] = !$GLOBALS['connect_id_rubrique']; } } + // Pour les redacteurs, inc_version a fait l'initialisation minimale return ''; // i.e. pas de pb. @@ -266,22 +284,23 @@ function auth_init_droits($row) * * @return string */ -function auth_a_loger() -{ +function auth_a_loger() { $redirect = generer_url_public('login', - "url=" . rawurlencode(self('&',true)), '&'); + "url=" . rawurlencode(self('&', true)), '&'); // un echec au "bonjour" (login initial) quand le statut est // inconnu signale sans doute un probleme de cookies - if (isset($_GET['bonjour'])) + if (isset($_GET['bonjour'])) { $redirect = parametre_url($redirect, 'var_erreur', (!isset($GLOBALS['visiteur_session']['statut']) - ? 'cookie' - : 'statut' - ), - '&' - ); + ? 'cookie' + : 'statut' + ), + '&' + ); + } + return $redirect; } @@ -289,25 +308,26 @@ function auth_a_loger() * Tracer en base la date de dernière connexion de l'auteur * * @pipeline_appel trig_auth_trace - * + * * @param array $row * @param null|string $date */ -function auth_trace($row, $date = null) -{ +function auth_trace($row, $date = null) { // Indiquer la connexion. A la minute pres ca suffit. - if (!is_numeric($connect_quand = isset($row['quand'])?$row['quand']:'')) + if (!is_numeric($connect_quand = isset($row['quand']) ? $row['quand'] : '')) { $connect_quand = strtotime($connect_quand); + } - if (is_null($date)) + if (is_null($date)) { $date = date('Y-m-d H:i:s'); + } - if (abs(strtotime($date) - $connect_quand) >= 60) { - sql_updateq("spip_auteurs", array("en_ligne" => $date), "id_auteur=" .$row['id_auteur']); + if (abs(strtotime($date)-$connect_quand) >= 60) { + sql_updateq("spip_auteurs", array("en_ligne" => $date), "id_auteur=" . $row['id_auteur']); $row['en_ligne'] = $date; } - pipeline('trig_auth_trace',array('args'=>array('row'=>$row,'date'=>$date))); + pipeline('trig_auth_trace', array('args' => array('row' => $row, 'date' => $date))); } @@ -318,29 +338,30 @@ function auth_trace($row, $date = null) /** * Fonction privée d'aiguillage des fonctions d'authentification * - * Charge une fonction d'authentification présente dans un répertoire `auth/`. - * Ainsi, utiliser `auth_administrer('informer_login', array('spip', ...)` appellera + * Charge une fonction d'authentification présente dans un répertoire `auth/`. + * Ainsi, utiliser `auth_administrer('informer_login', array('spip', ...)` appellera * `auth_spip_informer_login()` de `ecrire/auth/spip.php`. - * + * * @uses charger_fonction() - * + * * @param string $fonction * Nom de la fonction d'authentification * @param array $args - * Le premier élément du tableau doit être le nom du système d'authentification - * choisi, tel que `spip` (par défaut) ou encore `ldap`. + * Le premier élément du tableau doit être le nom du système d'authentification + * choisi, tel que `spip` (par défaut) ou encore `ldap`. * @param mixed $defaut * @return mixed */ -function auth_administrer($fonction, $args, $defaut = false){ +function auth_administrer($fonction, $args, $defaut = false) { $auth_methode = array_shift($args); $auth_methode = $auth_methode ? $auth_methode : 'spip'; // valeur par defaut au cas ou - if ($auth = charger_fonction($auth_methode,'auth',true) - AND function_exists($f="auth_{$auth_methode}_$fonction") - ) + if ($auth = charger_fonction($auth_methode, 'auth', true) + AND function_exists($f = "auth_{$auth_methode}_$fonction") + ) { return call_user_func_array($f, $args); - else + } else { return $defaut; + } } /** @@ -349,14 +370,15 @@ function auth_administrer($fonction, $args, $defaut = false){ * @param array $flux * @return array */ -function auth_formulaire_login($flux){ - foreach ($GLOBALS['liste_des_authentifications'] as $methode) - $flux = auth_administrer('formulaire_login',array($methode,$flux),$flux); +function auth_formulaire_login($flux) { + foreach ($GLOBALS['liste_des_authentifications'] as $methode) { + $flux = auth_administrer('formulaire_login', array($methode, $flux), $flux); + } + return $flux; } - /** * Retrouver le login interne lie a une info login saisie * la saisie peut correspondre a un login delegue @@ -366,19 +388,20 @@ function auth_formulaire_login($flux){ * @param string $serveur * @return string/bool */ -function auth_retrouver_login($login, $serveur = ''){ +function auth_retrouver_login($login, $serveur = '') { if (!spip_connect($serveur)) { include_spip('inc/minipres'); echo minipres(_T('info_travaux_titre'), - _T('titre_probleme_technique')); + _T('titre_probleme_technique')); exit; } foreach ($GLOBALS['liste_des_authentifications'] as $methode) { - if ($auteur = auth_administrer('retrouver_login',array($methode, $login, $serveur))) { + if ($auteur = auth_administrer('retrouver_login', array($methode, $login, $serveur))) { return $auteur; } } + return false; } @@ -394,29 +417,30 @@ function auth_retrouver_login($login, $serveur = ''){ * @param string $serveur * @return array */ -function auth_informer_login($login, $serveur = ''){ +function auth_informer_login($login, $serveur = '') { if (!$login OR !$login = auth_retrouver_login($login, $serveur) - OR !$row = sql_fetsel('*','spip_auteurs','login='.sql_quote($login,$serveur,'text'),'','','','',$serveur) - ) + OR !$row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur) + ) { return array(); + } $prefs = unserialize($row['prefs']); $infos = array( - 'id_auteur'=>$row['id_auteur'], - 'login'=>$row['login'], + 'id_auteur' => $row['id_auteur'], + 'login' => $row['login'], 'cnx' => ($prefs['cnx'] == 'perma') ? '1' : '0', 'logo' => recuperer_fond('formulaires/inc-logo_auteur', $row), ); // desactiver le hash md5 si pas auteur spip ? - if ($row['source']!=='spip'){ - $row['alea_actuel']= ''; - $row['alea_futur']= ''; + if ($row['source'] !== 'spip') { + $row['alea_actuel'] = ''; + $row['alea_futur'] = ''; } verifier_visiteur(); - return auth_administrer('informer_login',array($row['source'],$infos, $row, $serveur),$infos); + return auth_administrer('informer_login', array($row['source'], $infos, $row, $serveur), $infos); } @@ -429,20 +453,22 @@ function auth_informer_login($login, $serveur = ''){ * @param string $serveur * @return mixed */ -function auth_identifier_login($login, $password, $serveur = ''){ +function auth_identifier_login($login, $password, $serveur = '') { $erreur = ""; foreach ($GLOBALS['liste_des_authentifications'] as $methode) { - if ($auth = charger_fonction($methode, 'auth',true)){ + if ($auth = charger_fonction($methode, 'auth', true)) { $auteur = $auth($login, $password, $serveur); if (is_array($auteur) AND count($auteur)) { spip_log("connexion de $login par methode $methode"); $auteur['auth'] = $methode; + return $auteur; - } - elseif (is_string($auteur)) + } elseif (is_string($auteur)) { $erreur .= "$auteur "; + } } } + return $erreur; } @@ -456,23 +482,26 @@ function auth_identifier_login($login, $password, $serveur = ''){ * @param string $serveur * @return string */ -function auth_url_retour_login($auth_methode, $login, $redirect = '', $serveur = ''){ - $securiser_action = charger_fonction('securiser_action','inc'); +function auth_url_retour_login($auth_methode, $login, $redirect = '', $serveur = '') { + $securiser_action = charger_fonction('securiser_action', 'inc'); + return $securiser_action('auth', "$auth_methode/$login", $redirect, true); } + /** * Terminer l'action d'authentification d'un auteur - * + * * @uses auth_administrer() - * + * * @param string $auth_methode * @param string $login * @param string $serveur * @return mixed */ -function auth_terminer_identifier_login($auth_methode, $login, $serveur = ''){ +function auth_terminer_identifier_login($auth_methode, $login, $serveur = '') { $args = func_get_args(); - $auteur = auth_administrer('terminer_identifier_login',$args); + $auteur = auth_administrer('terminer_identifier_login', $args); + return $auteur; } @@ -482,9 +511,10 @@ function auth_terminer_identifier_login($auth_methode, $login, $serveur = ''){ * @param array $auteur * @return bool */ -function auth_loger($auteur){ - if (!is_array($auteur) OR !count($auteur)) +function auth_loger($auteur) { + if (!is_array($auteur) OR !count($auteur)) { return false; + } // initialiser et poser le cookie de session unset($_COOKIE['spip_session']); @@ -495,33 +525,33 @@ function auth_loger($auteur){ $p['cnx'] = (isset($auteur['cookie']) and $auteur['cookie'] == 'oui') ? 'perma' : ''; sql_updateq('spip_auteurs', - array('prefs' => serialize($p)), - "id_auteur=" . $auteur['id_auteur']); + array('prefs' => serialize($p)), + "id_auteur=" . $auteur['id_auteur']); // Si on est admin, poser le cookie de correspondance include_spip('inc/cookie'); if ($auteur['statut'] == '0minirezo') { - spip_setcookie('spip_admin', '@'.$auteur['login'], - time() + 7 * 24 * 3600); - } - // sinon le supprimer ... + spip_setcookie('spip_admin', '@' . $auteur['login'], + time()+7*24*3600); + } // sinon le supprimer ... else { - spip_setcookie('spip_admin', '',1); + spip_setcookie('spip_admin', '', 1); } // bloquer ici le visiteur qui tente d'abuser de ses droits verifier_visiteur(); + return true; } /** * Déconnexion de l'auteur - * + * * @uses action_logout_dist() * return void -**/ -function auth_deloger(){ - $logout = charger_fonction('logout','action'); + **/ +function auth_deloger() { + $logout = charger_fonction('logout', 'action'); $logout(); } @@ -530,14 +560,15 @@ function auth_deloger(){ * pour la méthode donnée * * @uses auth_administrer() - * + * * @param string $auth_methode * @param string $serveur * @return bool */ -function auth_autoriser_modifier_login($auth_methode, $serveur = ''){ +function auth_autoriser_modifier_login($auth_methode, $serveur = '') { $args = func_get_args(); - return auth_administrer('autoriser_modifier_login',$args); + + return auth_administrer('autoriser_modifier_login', $args); } /** @@ -551,9 +582,10 @@ function auth_autoriser_modifier_login($auth_methode, $serveur = ''){ * @return string * message d'erreur ou chaine vide si pas d'erreur */ -function auth_verifier_login($auth_methode, $new_login, $id_auteur = 0, $serveur = ''){ +function auth_verifier_login($auth_methode, $new_login, $id_auteur = 0, $serveur = '') { $args = func_get_args(); - return auth_administrer('verifier_login',$args,''); + + return auth_administrer('verifier_login', $args, ''); } /** @@ -565,9 +597,10 @@ function auth_verifier_login($auth_methode, $new_login, $id_auteur = 0, $serveur * @param string $serveur * @return bool */ -function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur = ''){ +function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur = '') { $args = func_get_args(); - return auth_administrer('modifier_login',$args); + + return auth_administrer('modifier_login', $args); } /** @@ -579,11 +612,12 @@ function auth_modifier_login($auth_methode, $new_login, $id_auteur, $serveur = ' * @param string $auth_methode * @param string $serveur * @return bool - * succès ou échec + * succès ou échec */ -function auth_autoriser_modifier_pass($auth_methode, $serveur = ''){ +function auth_autoriser_modifier_pass($auth_methode, $serveur = '') { $args = func_get_args(); - return auth_administrer('autoriser_modifier_pass',$args); + + return auth_administrer('autoriser_modifier_pass', $args); } /** @@ -596,11 +630,12 @@ function auth_autoriser_modifier_pass($auth_methode, $serveur = ''){ * @param int $id_auteur * @param string $serveur * @return string - * message d'erreur ou chaine vide si pas d'erreur + * message d'erreur ou chaine vide si pas d'erreur */ -function auth_verifier_pass($auth_methode, $login, $new_pass, $id_auteur = 0, $serveur = ''){ +function auth_verifier_pass($auth_methode, $login, $new_pass, $id_auteur = 0, $serveur = '') { $args = func_get_args(); - return auth_administrer('verifier_pass',$args,''); + + return auth_administrer('verifier_pass', $args, ''); } /** @@ -613,11 +648,12 @@ function auth_verifier_pass($auth_methode, $login, $new_pass, $id_auteur = 0, $s * @param int $id_auteur * @param string $serveur * @return bool - * succes ou echec + * succes ou echec */ -function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur, $serveur = ''){ +function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur, $serveur = '') { $args = func_get_args(); - return auth_administrer('modifier_pass',$args); + + return auth_administrer('modifier_pass', $args); } /** @@ -632,52 +668,66 @@ function auth_modifier_pass($auth_methode, $login, $new_pass, $id_auteur, $serve * @param string $serveur * @return void */ -function auth_synchroniser_distant($auth_methode = true, $id_auteur = 0, $champs = array(), $options = array(), $serveur = ''){ +function auth_synchroniser_distant( + $auth_methode = true, + $id_auteur = 0, + $champs = array(), + $options = array(), + $serveur = '' +) { $args = func_get_args(); - if ($auth_methode===true OR (isset($options['all']) AND $options['all']==true)){ + if ($auth_methode === true OR (isset($options['all']) AND $options['all'] == true)) { $options['all'] = true; // ajouter une option all=>true pour chaque auth $args = array(true, $id_auteur, $champs, $options, $serveur); foreach ($GLOBALS['liste_des_authentifications'] as $methode) { array_shift($args); - array_unshift($args,$methode); - auth_administrer('synchroniser_distant',$args); + array_unshift($args, $methode); + auth_administrer('synchroniser_distant', $args); } + } else { + auth_administrer('synchroniser_distant', $args); } - else - auth_administrer('synchroniser_distant',$args); } /** * Vérifier si l'auteur est bien authentifié - * + * * @param string $login * @param string $pw * @param string $serveur * @return array|bool */ -function lire_php_auth($login, $pw, $serveur = ''){ +function lire_php_auth($login, $pw, $serveur = '') { - $row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login,$serveur,'text'),'','','','',$serveur); + $row = sql_fetsel('*', 'spip_auteurs', 'login=' . sql_quote($login, $serveur, 'text'), '', '', '', '', $serveur); if (!$row) { if (spip_connect_ldap($serveur) - AND $auth_ldap = charger_fonction('ldap', 'auth', true)) + AND $auth_ldap = charger_fonction('ldap', 'auth', true) + ) { return $auth_ldap($login, $pw, $serveur, true); + } + return false; } // su pas de source definie // ou auth/xxx introuvable, utiliser 'spip' if (!$auth_methode = $row['source'] - OR !$auth = charger_fonction($auth_methode, 'auth', true)) + OR !$auth = charger_fonction($auth_methode, 'auth', true) + ) { $auth = charger_fonction('spip', 'auth', true); + } - $auteur=''; - if ($auth) + $auteur = ''; + if ($auth) { $auteur = $auth($login, $pw, $serveur, true); + } // verifier que ce n'est pas un message d'erreur - if (is_array($auteur) AND count($auteur)) + if (is_array($auteur) AND count($auteur)) { return $auteur; + } + return false; } @@ -685,7 +735,7 @@ function lire_php_auth($login, $pw, $serveur = ''){ * entête php_auth (est-encore utilisé ?) * * @uses minipres() - * + * * @param string $pb * @param string $raison * @param string $retour @@ -699,16 +749,18 @@ function ask_php_auth($pb, $raison, $retour = '', $url = '', $re = '', $lien = ' $corps = ""; $public = generer_url_public(); $ecrire = generer_url_ecrire(); - $retour = $retour?$retour:_T('icone_retour'); + $retour = $retour ? $retour : _T('icone_retour'); $corps .= "<p>$raison</p>[<a href='$public'>$retour</a>] "; if ($url) { - $corps .= "[<a href='" . generer_url_action('cookie',"essai_auth_http=oui&$url") . "'>$re</a>]"; + $corps .= "[<a href='" . generer_url_action('cookie', "essai_auth_http=oui&$url") . "'>$re</a>]"; } - if ($lien) - $corps .= " [<a href='$ecrire'>"._T('login_espace_prive')."</a>]"; + if ($lien) { + $corps .= " [<a href='$ecrire'>" . _T('login_espace_prive') . "</a>]"; + } include_spip('inc/minipres'); - echo minipres($pb,$corps); + echo minipres($pb, $corps); exit; } + ?> diff --git a/ecrire/inc/autoriser.php b/ecrire/inc/autoriser.php index 230eeae5f5..3140146068 100644 --- a/ecrire/inc/autoriser.php +++ b/ecrire/inc/autoriser.php @@ -14,8 +14,10 @@ * Gestion de l'API autoriser et fonctions d'autorisations de SPIP * * @package SPIP\Core\Autorisations -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); @@ -23,7 +25,7 @@ include_spip('base/abstract_sql'); /** * Gérer les admins restreints ? - * + * * @todo une option à activer */ defined('_ADMINS_RESTREINTS') || define('_ADMINS_RESTREINTS', true); @@ -42,69 +44,73 @@ if ($f = find_in_path('mes_fonctions.php')) { if (!function_exists('autoriser')) { -/** - * Autoriser une action - * - * Teste si une personne (par défaut le visiteur en cours) peut effectuer - * une certaine action. Cette fonction est le point d'entrée de toutes - * les autorisations. - * - * La fonction se charge d'appeler des fonctions d'autorisations spécifiques - * aux actions demandées si elles existent. Elle cherche donc les fonctions - * dans cet ordre : - * - * - autoriser_{type}_{faire}, sinon avec _dist - * - autoriser_{type}, sinon avec _dist - * - autoriser_{faire}, sinon avec _dist - * - autoriser_{defaut}, sinon avec _dist - * - * Seul le premier argument est obligatoire. - * - * @note - * Le paramètre `$type` attend par défaut un type d'objet éditorial, et à ce titre, - * la valeur transmise se verra appliquer la fonction 'objet_type' pour uniformiser - * cette valeur. - * - * Si ce paramètre n'a rien n'a voir avec un objet éditorial, par exemple - * 'statistiques', un souligné avant le terme est ajouté afin d'indiquer - * explicitement à la fonction autoriser de ne pas transformer la chaîne en type - * d'objet. Cela donne pour cet exemple : `autoriser('detruire', '_statistiques')` - * - * @note - * Le paramètre `$type`, en plus de l'uniformisation en type d'objet, se voit retirer - * tous les soulignés du terme. Ainsi le type d'objet `livre_art` deviendra `livreart` - * et SPIP cherchera une fonction `autoriser_livreart_{faire}`. Ceci permet - * d'éviter une possible confusion si une fonction `autoriser_livre_art` existait : - * quel serait le type, quel serait l'action ? - * - * Pour résumer, si le type d'objet éditorial a un souligné, tel que 'livre_art', - * la fonction d'autorisation correspondante ne l'aura pas. - * Exemple : `function autoriser_livreart_modifier_dist(...){...}` - * - * @api - * @see autoriser_dist() - * - * @param string $faire - * une action ('modifier', 'publier'...) - * @param string $type - * type d'objet ou nom de table ('article') - * @param int $id - * id de l'objet sur lequel on veut agir - * @param null|int|array $qui - * - si null on prend alors visiteur_session - * - un id_auteur (on regarde dans la base) - * - un tableau auteur complet, y compris [restreint] - * @param null|array $opt - * options sous forme de tableau associatif - * @return bool - * true si la personne peut effectuer l'action - */ - function autoriser($faire, $type = '', $id = 0, $qui = NULL, $opt = NULL) { + /** + * Autoriser une action + * + * Teste si une personne (par défaut le visiteur en cours) peut effectuer + * une certaine action. Cette fonction est le point d'entrée de toutes + * les autorisations. + * + * La fonction se charge d'appeler des fonctions d'autorisations spécifiques + * aux actions demandées si elles existent. Elle cherche donc les fonctions + * dans cet ordre : + * + * - autoriser_{type}_{faire}, sinon avec _dist + * - autoriser_{type}, sinon avec _dist + * - autoriser_{faire}, sinon avec _dist + * - autoriser_{defaut}, sinon avec _dist + * + * Seul le premier argument est obligatoire. + * + * @note + * Le paramètre `$type` attend par défaut un type d'objet éditorial, et à ce titre, + * la valeur transmise se verra appliquer la fonction 'objet_type' pour uniformiser + * cette valeur. + * + * Si ce paramètre n'a rien n'a voir avec un objet éditorial, par exemple + * 'statistiques', un souligné avant le terme est ajouté afin d'indiquer + * explicitement à la fonction autoriser de ne pas transformer la chaîne en type + * d'objet. Cela donne pour cet exemple : `autoriser('detruire', '_statistiques')` + * + * @note + * Le paramètre `$type`, en plus de l'uniformisation en type d'objet, se voit retirer + * tous les soulignés du terme. Ainsi le type d'objet `livre_art` deviendra `livreart` + * et SPIP cherchera une fonction `autoriser_livreart_{faire}`. Ceci permet + * d'éviter une possible confusion si une fonction `autoriser_livre_art` existait : + * quel serait le type, quel serait l'action ? + * + * Pour résumer, si le type d'objet éditorial a un souligné, tel que 'livre_art', + * la fonction d'autorisation correspondante ne l'aura pas. + * Exemple : `function autoriser_livreart_modifier_dist(...){...}` + * + * @api + * @see autoriser_dist() + * + * @param string $faire + * une action ('modifier', 'publier'...) + * @param string $type + * type d'objet ou nom de table ('article') + * @param int $id + * id de l'objet sur lequel on veut agir + * @param null|int|array $qui + * - si null on prend alors visiteur_session + * - un id_auteur (on regarde dans la base) + * - un tableau auteur complet, y compris [restreint] + * @param null|array $opt + * options sous forme de tableau associatif + * @return bool + * true si la personne peut effectuer l'action + */ + function autoriser($faire, $type = '', $id = 0, $qui = null, $opt = null) { // Charger les fonctions d'autorisation supplementaires static $pipe; - if (!isset($pipe)) { $pipe = 1; pipeline('autoriser'); } + if (!isset($pipe)) { + $pipe = 1; + pipeline('autoriser'); + } $args = func_get_args(); + return call_user_func_array('autoriser_dist', $args); } } @@ -112,11 +118,11 @@ if (!function_exists('autoriser')) { /** * Autoriser une action - * + * * Voir autoriser() pour une description complète - * + * * @see autoriser() - * + * * @param string $faire * une action ('modifier', 'publier'...) * @param string $type @@ -132,15 +138,15 @@ if (!function_exists('autoriser')) { * @return bool * true si la personne peut effectuer l'action */ -function autoriser_dist($faire, $type = '', $id = 0, $qui = NULL, $opt = NULL) { +function autoriser_dist($faire, $type = '', $id = 0, $qui = null, $opt = null) { // Qui ? visiteur_session ? // si null ou '' (appel depuis #AUTORISER) on prend l'auteur loge - if ($qui === NULL OR $qui==='') { + if ($qui === null OR $qui === '') { $qui = $GLOBALS['visiteur_session'] ? $GLOBALS['visiteur_session'] : array(); $qui = array_merge(array('statut' => '', 'id_auteur' => 0, 'webmestre' => 'non'), $qui); } elseif (is_numeric($qui)) { - $qui = sql_fetsel("*", "spip_auteurs", "id_auteur=".$qui); + $qui = sql_fetsel("*", "spip_auteurs", "id_auteur=" . $qui); } // Admins restreints, on construit ici (pas generique mais...) @@ -149,91 +155,97 @@ function autoriser_dist($faire, $type = '', $id = 0, $qui = NULL, $opt = NULL) { $qui['restreint'] = isset($qui['id_auteur']) ? liste_rubriques_auteur($qui['id_auteur']) : array(); } - spip_log("autoriser $faire $type $id (" . (isset($qui['nom']) ? $qui['nom'] : '') . ") ?","autoriser"._LOG_DEBUG); + spip_log("autoriser $faire $type $id (" . (isset($qui['nom']) ? $qui['nom'] : '') . ") ?", "autoriser" . _LOG_DEBUG); // passer par objet_type pour avoir les alias // et supprimer les _ - $type = str_replace('_','', strncmp($type,"_",1)==0?$type:objet_type($type,false)); + $type = str_replace('_', '', strncmp($type, "_", 1) == 0 ? $type : objet_type($type, false)); // Si une exception a ete decretee plus haut dans le code, l'appliquer if (isset($GLOBALS['autoriser_exception'][$faire][$type][$id]) - AND autoriser_exception($faire,$type,$id,'verifier')) + AND autoriser_exception($faire, $type, $id, 'verifier') + ) { return true; + } // Chercher une fonction d'autorisation // Dans l'ordre on va chercher autoriser_type_faire[_dist], autoriser_type[_dist], // autoriser_faire[_dist], autoriser_defaut[_dist] $fonctions = $type - ? array ( - 'autoriser_'.$type.'_'.$faire, - 'autoriser_'.$type.'_'.$faire.'_dist', - 'autoriser_'.$type, - 'autoriser_'.$type.'_dist', - 'autoriser_'.$faire, - 'autoriser_'.$faire.'_dist', + ? array( + 'autoriser_' . $type . '_' . $faire, + 'autoriser_' . $type . '_' . $faire . '_dist', + 'autoriser_' . $type, + 'autoriser_' . $type . '_dist', + 'autoriser_' . $faire, + 'autoriser_' . $faire . '_dist', 'autoriser_defaut', 'autoriser_defaut_dist' ) - : array ( - 'autoriser_'.$faire, - 'autoriser_'.$faire.'_dist', + : array( + 'autoriser_' . $faire, + 'autoriser_' . $faire . '_dist', 'autoriser_defaut', 'autoriser_defaut_dist' ); foreach ($fonctions as $f) { if (function_exists($f)) { - $a = $f($faire,$type,$id,$qui,$opt); + $a = $f($faire, $type, $id, $qui, $opt); break; } } - spip_log("$f($faire,$type,$id," . (isset($qui['nom']) ? $qui['nom'] : '') . "): ".($a?'OK':'niet'),"autoriser"._LOG_DEBUG); + spip_log("$f($faire,$type,$id," . (isset($qui['nom']) ? $qui['nom'] : '') . "): " . ($a ? 'OK' : 'niet'), + "autoriser" . _LOG_DEBUG); return $a; } // une globale pour aller au plus vite dans la fonction generique ci dessus -$GLOBALS['autoriser_exception']=array(); +$GLOBALS['autoriser_exception'] = array(); /** * Accorder une autorisation exceptionnel pour le hit en cours, ou la revoquer * * http://code.spip.net/@autoriser_exception * - * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet + * @param string $faire Action demandée + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet * @param bool $autoriser accorder (true) ou revoquer (false) * @return bool */ -function autoriser_exception($faire, $type, $id, $autoriser = true){ +function autoriser_exception($faire, $type, $id, $autoriser = true) { // une static innaccessible par url pour verifier que la globale est positionnee a bon escient static $autorisation; - if ($autoriser==='verifier') - return isset($autorisation[$faire][$type][$id]); - if ($autoriser===true) + if ($autoriser === 'verifier') { + return isset($autorisation[$faire][$type][$id]); + } + if ($autoriser === true) { $GLOBALS['autoriser_exception'][$faire][$type][$id] = $autorisation[$faire][$type][$id] = true; - if ($autoriser===false) { + } + if ($autoriser === false) { unset($GLOBALS['autoriser_exception'][$faire][$type][$id]); unset($autorisation[$faire][$type][$id]); } + return false; } - + /** * Autorisation par defaut * * Les admins complets OK, les autres non * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) { return $qui['statut'] == '0minirezo' @@ -243,14 +255,14 @@ function autoriser_defaut_dist($faire, $type, $id, $qui, $opt) { /** * Autorisation d'accès à l'espace privé ? - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) { return isset($qui['statut']) and in_array($qui['statut'], array('0minirezo', '1comite')); } @@ -260,14 +272,14 @@ function autoriser_ecrire_dist($faire, $type, $id, $qui, $opt) { * * Accordée par defaut ceux qui accèdent à l'espace privé, * peut-être surchargée au cas par cas - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_creer_dist($faire, $type, $id, $qui, $opt) { return in_array($qui['statut'], array('0minirezo', '1comite')); } @@ -276,14 +288,14 @@ function autoriser_creer_dist($faire, $type, $id, $qui, $opt) { * Autorisation de prévisualiser un contenu * * @uses test_previsualiser_objet_champ() - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) { // Le visiteur a-t-il un statut prevu par la config ? @@ -301,14 +313,15 @@ function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) { // A-t-on un token valable ? if (is_array($GLOBALS['visiteur_session']) - AND $token = session_get('previewtoken') - AND preg_match('/^(\d+)\*(.*)$/', $token, $r) - AND $action = 'previsualiser' - AND (include_spip('inc/securiser_action')) - AND ( - $r[2] == _action_auteur($action, $r[1], null, 'alea_ephemere') - OR $r[2] == _action_auteur($action, $r[1], null, 'alea_ephemere_ancien') - )) { + AND $token = session_get('previewtoken') + AND preg_match('/^(\d+)\*(.*)$/', $token, $r) + AND $action = 'previsualiser' + AND (include_spip('inc/securiser_action')) + AND ( + $r[2] == _action_auteur($action, $r[1], null, 'alea_ephemere') + OR $r[2] == _action_auteur($action, $r[1], null, 'alea_ephemere_ancien') + ) + ) { return true; } @@ -317,7 +330,7 @@ function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) { /** * Teste qu'un objet éditorial peut être prévisualisé - * + * * Cela permet ainsi de commander l'affichage dans l'espace prive du bouton "previsualiser" * voir `prive/objets/infos/article.html` etc. * @@ -329,13 +342,13 @@ function autoriser_previsualiser_dist($faire, $type, $id, $qui, $opt) { * pour que ce statut autorise la prévisualisation. * * Exemple pour les articles : `'previsu' => 'publie,prop,prepa/auteur',` - * + * * @uses lister_tables_objets_sql() - * - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return boolean True si autorisé, false sinon. */ function test_previsualiser_objet_champ($type = null, $id = 0, $qui = array(), $opt = array()) { @@ -348,19 +361,27 @@ function test_previsualiser_objet_champ($type = null, $id = 0, $qui = array(), $ include_spip('base/objets'); $infos = lister_tables_objets_sql(table_objet_sql($type)); if (isset($infos['statut'])) { - foreach($infos['statut'] as $c){ - if (isset($c['publie'])){ - if (!isset($c['previsu'])) return false; // pas de previsu definie => NIET + foreach ($infos['statut'] as $c) { + if (isset($c['publie'])) { + if (!isset($c['previsu'])) { + return false; + } // pas de previsu definie => NIET $champ = $c['champ']; - if (!isset($opt[$champ])) return false; // pas de champ passe a la demande => NIET - $previsu = explode(',',$c['previsu']); + if (!isset($opt[$champ])) { + return false; + } // pas de champ passe a la demande => NIET + $previsu = explode(',', $c['previsu']); // regarder si ce statut est autorise pour l'auteur - if (in_array($opt[$champ]."/auteur",$previsu)){ - if (!sql_countsel("spip_auteurs_liens","id_auteur=".intval($qui['id_auteur'])." AND objet=".sql_quote($type)." AND id_objet=".intval($id))) - return false; // pas auteur de cet objet => NIET - } - elseif (!in_array($opt[$champ],$previsu)) // le statut n'est pas dans ceux definis par la previsu => NIET + if (in_array($opt[$champ] . "/auteur", $previsu)) { + if (!sql_countsel("spip_auteurs_liens", + "id_auteur=" . intval($qui['id_auteur']) . " AND objet=" . sql_quote($type) . " AND id_objet=" . intval($id)) + ) { + return false; + } // pas auteur de cet objet => NIET + } elseif (!in_array($opt[$champ], $previsu)) // le statut n'est pas dans ceux definis par la previsu => NIET + { return false; + } } } } @@ -372,91 +393,103 @@ function test_previsualiser_objet_champ($type = null, $id = 0, $qui = array(), $ * Autorisation de changer de langue un contenu * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_changerlangue_dist($faire, $type, $id, $qui, $opt) { $multi_objets = explode(',', lire_config('multi_objets')); $gerer_trad_objets = explode(',', lire_config('gerer_trad_objets')); $table = table_objet_sql($type); - if (in_array($table, $multi_objets) or in_array($table, $gerer_trad_objets)) { // affichage du formulaire si la configuration l'accepte + if (in_array($table, $multi_objets) or in_array($table, + $gerer_trad_objets) + ) { // affichage du formulaire si la configuration l'accepte $multi_secteurs = lire_config('multi_secteurs'); $champs = objet_info($type, 'field'); - if ($multi_secteurs == 'oui' and array_key_exists('id_rubrique', $champs)) { // multilinguisme par secteur et objet rattaché à une rubrique + if ($multi_secteurs == 'oui' and array_key_exists('id_rubrique', + $champs) + ) { // multilinguisme par secteur et objet rattaché à une rubrique $primary = id_table_objet($type); - if ($table!='spip_rubriques'){ + if ($table != 'spip_rubriques') { $id_rubrique = sql_getfetsel('id_rubrique', "$table", "$primary=" . intval($id)); } else { $id_rubrique = $id; } $id_secteur = sql_getfetsel('id_secteur', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); - if (!$id_secteur>0) + if (!$id_secteur > 0) { $id_secteur = $id_rubrique; + } $langue_secteur = sql_getfetsel('lang', "spip_rubriques", "id_rubrique=" . intval($id_secteur)); $langue_objet = sql_getfetsel('lang', "$table", "$primary=" . intval($id)); - if ($langue_secteur!=$langue_objet){ // configuration incohérente, on laisse l'utilisateur corriger la situation + if ($langue_secteur != $langue_objet) { // configuration incohérente, on laisse l'utilisateur corriger la situation return true; } if ($table != 'spip_rubriques') { // le choix de la langue se fait seulement sur les rubriques return false; } else { - $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.intval($id)); + $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id)); if ($id_parent != 0) // sous-rubriques : pas de choix de langue + { return false; + } } } } else { return false; } - return autoriser('modifier',$type,$id,$qui,$opt); + + return autoriser('modifier', $type, $id, $qui, $opt); } /** * Autorisation de changer le lien de traduction * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_changertraduction_dist($faire, $type, $id, $qui, $opt) { - return autoriser('modifier',$type,$id,$qui,$opt); + return autoriser('modifier', $type, $id, $qui, $opt); } /** * Autorisation de changer la date d'un contenu * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_dater_dist($faire, $type, $id, $qui, $opt) { - if (!isset($opt['statut'])){ + if (!isset($opt['statut'])) { $table = table_objet($type); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table); - if (!$desc) + if (!$desc) { return false; - if (isset($desc['field']['statut'])){ - $statut = sql_getfetsel("statut", $desc['table'], id_table_objet($type)."=".intval($id)); } - else - $statut = 'publie'; // pas de statut => publie - } - else + if (isset($desc['field']['statut'])) { + $statut = sql_getfetsel("statut", $desc['table'], id_table_objet($type) . "=" . intval($id)); + } else { + $statut = 'publie'; + } // pas de statut => publie + } else { $statut = $opt['statut']; + } if ($statut == 'publie' - OR ($statut == 'prop' AND $type=='article' AND $GLOBALS['meta']["post_dates"] == "non")) + OR ($statut == 'prop' AND $type == 'article' AND $GLOBALS['meta']["post_dates"] == "non") + ) { return autoriser('modifier', $type, $id); + } + return false; } @@ -467,28 +500,28 @@ function autoriser_dater_dist($faire, $type, $id, $qui, $opt) { * Par défaut, il faut l'autorisation de modifier le contenu * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_instituer_dist($faire, $type, $id, $qui, $opt) { - return autoriser('modifier',$type,$id,$qui,$opt); + return autoriser('modifier', $type, $id, $qui, $opt); } /** * Autorisation de publier dans une rubrique $id * * Il faut être administrateur ou administrateur restreint de la rubrique - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) { return ($qui['statut'] == '0minirezo') @@ -502,18 +535,18 @@ function autoriser_rubrique_publierdans_dist($faire, $type, $id, $qui, $opt) { * Autorisation de créer une rubrique * * Il faut être administrateur pour pouvoir publier à la racine - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_rubrique_creer_dist($faire, $type, $id, $qui, $opt) { - return - ((!$id AND autoriser('defaut',null,null,$qui, $opt)) - OR $id AND autoriser('creerrubriquedans','rubrique', $id, $qui, $opt) + return + ((!$id AND autoriser('defaut', null, null, $qui, $opt)) + OR $id AND autoriser('creerrubriquedans', 'rubrique', $id, $qui, $opt) ); } @@ -521,37 +554,37 @@ function autoriser_rubrique_creer_dist($faire, $type, $id, $qui, $opt) { * Autorisation de créer une sous rubrique dans une rubrique $id * * Il faut être administrateur et pouvoir publier dans la rubrique - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_rubrique_creerrubriquedans_dist($faire, $type, $id, $qui, $opt) { return ($id OR ($qui['statut'] == '0minirezo' AND !$qui['restreint'])) - AND autoriser('voir','rubrique',$id) - AND autoriser('publierdans','rubrique',$id); + AND autoriser('voir', 'rubrique', $id) + AND autoriser('publierdans', 'rubrique', $id); } /** * Autorisation de créer un article dans une rubrique $id * * Il faut pouvoir voir la rubrique et pouvoir créer un article… - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt) { return $id - AND autoriser('voir','rubrique', $id) + AND autoriser('voir', 'rubrique', $id) AND autoriser('creer', 'article'); } @@ -560,14 +593,14 @@ function autoriser_rubrique_creerarticledans_dist($faire, $type, $id, $qui, $opt * Autorisation de modifier une rubrique $id * * Il faut pouvoir publier dans cette rubrique - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) { return autoriser('publierdans', 'rubrique', $id, $qui, $opt); @@ -577,30 +610,36 @@ function autoriser_rubrique_modifier_dist($faire, $type, $id, $qui, $opt) { * Autorisation de supprimer une rubrique $id * * Il faut quelle soit vide (pas d'enfant) et qu'on ait le droit de la modifier - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_rubrique_supprimer_dist($faire, $type, $id, $qui, $opt) { - if (!$id = intval($id)) + if (!$id = intval($id)) { return false; + } - if (sql_countsel('spip_rubriques', "id_parent=".intval($id))) + if (sql_countsel('spip_rubriques', "id_parent=" . intval($id))) { return false; + } - if (sql_countsel('spip_articles', "id_rubrique=".intval($id)." AND (statut<>'poubelle')")) + if (sql_countsel('spip_articles', "id_rubrique=" . intval($id) . " AND (statut<>'poubelle')")) { return false; + } - $compte = pipeline('objet_compte_enfants',array('args'=>array('objet'=>'rubrique','id_objet'=>$id),'data'=>array())); - foreach($compte as $objet => $n) - if ($n) + $compte = pipeline('objet_compte_enfants', + array('args' => array('objet' => 'rubrique', 'id_objet' => $id), 'data' => array())); + foreach ($compte as $objet => $n) { + if ($n) { return false; + } + } - return autoriser('modifier','rubrique',$id); + return autoriser('modifier', 'rubrique', $id); } @@ -609,19 +648,20 @@ function autoriser_rubrique_supprimer_dist($faire, $type, $id, $qui, $opt) { * * Il faut pouvoir publier dans le parent * ou, si on change le statut en proposé ou préparation être auteur de l'article - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) { - $r = sql_fetsel("id_rubrique,statut", "spip_articles", "id_article=".sql_quote($id)); + $r = sql_fetsel("id_rubrique,statut", "spip_articles", "id_article=" . sql_quote($id)); - if (!function_exists('auteurs_article')) - include_spip('inc/auth'); // pour auteurs_article si espace public + if (!function_exists('auteurs_article')) { + include_spip('inc/auth'); + } // pour auteurs_article si espace public return $r @@ -629,28 +669,28 @@ function autoriser_article_modifier_dist($faire, $type, $id, $qui, $opt) { ( autoriser('publierdans', 'rubrique', $r['id_rubrique'], $qui, $opt) OR ( - (!isset($opt['statut']) OR $opt['statut']!=='publie') + (!isset($opt['statut']) OR $opt['statut'] !== 'publie') AND in_array($qui['statut'], array('0minirezo', '1comite')) - AND in_array($r['statut'], array('prop','prepa', 'poubelle')) - AND auteurs_article($id, "id_auteur=".$qui['id_auteur']) + AND in_array($r['statut'], array('prop', 'prepa', 'poubelle')) + AND auteurs_article($id, "id_auteur=" . $qui['id_auteur']) ) ); } - /** +/** * Autorisation de créer un article * * Il faut qu'une rubrique existe et être au moins rédacteur - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) { - return (sql_countsel('spip_rubriques')>0 AND in_array($qui['statut'], array('0minirezo', '1comite'))); + return (sql_countsel('spip_rubriques') > 0 AND in_array($qui['statut'], array('0minirezo', '1comite'))); } /** @@ -658,25 +698,29 @@ function autoriser_article_creer_dist($faire, $type, $id, $qui, $opt) { * * Il faut être admin ou auteur de l'article, sinon il faut que l'article * soit publié ou proposé. - * + * * Peut-être appelée sans $id, mais avec un $opt['statut'] pour tester * la liste des status autorisés en fonction de $qui['statut'] - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon */ -function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt){ - if ($qui['statut'] == '0minirezo') return true; +function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt) { + if ($qui['statut'] == '0minirezo') { + return true; + } // cas des articles : depend du statut de l'article et de l'auteur - if (isset($opt['statut'])) + if (isset($opt['statut'])) { $statut = $opt['statut']; - else { - if (!$id) return false; - $statut = sql_getfetsel("statut", "spip_articles", "id_article=".intval($id)); + } else { + if (!$id) { + return false; + } + $statut = sql_getfetsel("statut", "spip_articles", "id_article=" . intval($id)); } return @@ -686,8 +730,8 @@ function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt){ // sinon si on est auteur, on a le droit de le voir, evidemment ! OR ($id AND $qui['id_auteur'] - AND (function_exists('auteurs_article') OR include_spip('inc/auth')) - AND auteurs_article($id, "id_auteur=".$qui['id_auteur'])); + AND (function_exists('auteurs_article') OR include_spip('inc/auth')) + AND auteurs_article($id, "id_auteur=" . $qui['id_auteur'])); } @@ -695,24 +739,27 @@ function autoriser_article_voir_dist($faire, $type, $id, $qui, $opt){ * Autorisation de voir un objet * * Tout est visible par défaut, sauf les auteurs où il faut au moins être rédacteur. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_voir_dist($faire, $type, $id, $qui, $opt) { # securite, mais on aurait pas du arriver ici ! - if (function_exists($f='autoriser_'.$type.'_voir') OR function_exists($f='autoriser_'.$type.'_voir_dist')){ + if (function_exists($f = 'autoriser_' . $type . '_voir') OR function_exists($f = 'autoriser_' . $type . '_voir_dist')) { return $f($faire, $type, $id, $qui, $opt); } - if ($qui['statut'] == '0minirezo') return true; + if ($qui['statut'] == '0minirezo') { + return true; + } // admins et redacteurs peuvent voir un auteur - if ($type == 'auteur') + if ($type == 'auteur') { return in_array($qui['statut'], array('0minirezo', '1comite')); + } // sinon par defaut tout est visible // sauf cas particuliers traites separemment (ie article) return true; @@ -724,76 +771,73 @@ function autoriser_voir_dist($faire, $type, $id, $qui, $opt) { * * Est-on webmestre ? Signifie qu'on n'a même pas besoin de passer par ftp * pour modifier les fichiers, cf. notamment inc/admin - * + * * Soit la liste des webmestres est définie via une constante _ID_WEBMESTRES, * soit on regarde l'état "webmestre" de l'auteur - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_webmestre_dist($faire, $type, $id, $qui, $opt) { return - (defined('_ID_WEBMESTRES')? + (defined('_ID_WEBMESTRES') ? in_array($qui['id_auteur'], explode(':', _ID_WEBMESTRES)) - :$qui['webmestre']=='oui') + : $qui['webmestre'] == 'oui') AND $qui['statut'] == '0minirezo' - AND !$qui['restreint'] - ; + AND !$qui['restreint']; } /** * Autorisation Configurer le site * * Il faut être administrateur complet - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_configurer_dist($faire, $type, $id, $qui, $opt) { return $qui['statut'] == '0minirezo' - AND !$qui['restreint'] - ; + AND !$qui['restreint']; } /** * Autorisation de sauvegarder la base de données * * Il faut être administrateur (y compris restreint) - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_sauvegarder_dist($faire, $type, $id, $qui, $opt) { return - $qui['statut'] == '0minirezo' - ; + $qui['statut'] == '0minirezo'; } /** * Autorisation d'effacer la base de données * * Il faut être webmestre - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_detruire_dist($faire, $type, $id, $qui, $opt) { return autoriser('webmestre', null, null, $qui, $opt); @@ -804,20 +848,26 @@ function autoriser_detruire_dist($faire, $type, $id, $qui, $opt) { * * Il faut être administrateur ou que l'auteur à prévisualiser * ait au moins publié un article - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) { // les admins peuvent "previsualiser" une page auteur if ($qui['statut'] == '0minirezo' - AND !$qui['restreint']) return true; + AND !$qui['restreint'] + ) { + return true; + } // "Voir en ligne" si l'auteur a un article publie - $n = sql_fetsel('A.id_article', 'spip_auteurs_liens AS L LEFT JOIN spip_articles AS A ON (L.objet=\'article\' AND L.id_objet=A.id_article)', "A.statut='publie' AND L.id_auteur=".sql_quote($id)); + $n = sql_fetsel('A.id_article', + 'spip_auteurs_liens AS L LEFT JOIN spip_articles AS A ON (L.objet=\'article\' AND L.id_objet=A.id_article)', + "A.statut='publie' AND L.id_auteur=" . sql_quote($id)); + return $n ? true : false; } @@ -833,18 +883,18 @@ function autoriser_auteur_previsualiser_dist($faire, $type, $id, $qui, $opt) { * d'un auteur, son statut est 'poubelle'. C'est l'autorisation * de modifier qui permet de changer les informations sensibles * (statut, login, pass, etc.) à l'institution. - * + * * @see auteur_inserer() * @see auteur_instituer() - * @see autoriser_auteur_modifier_dist() - * + * @see autoriser_auteur_modifier_dist() + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) { return ($qui['statut'] == '0minirezo'); } @@ -856,19 +906,20 @@ function autoriser_auteur_creer_dist($faire, $type, $id, $qui, $opt) { * Attention tout depend de ce qu'on veut modifier. Il faut être au moins * rédacteur, mais on ne peut pas promouvoir (changer le statut) un auteur * avec des droits supérieurs au sien. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) { // Ni admin ni redacteur => non - if (!in_array($qui['statut'], array('0minirezo', '1comite'))) + if (!in_array($qui['statut'], array('0minirezo', '1comite'))) { return false; + } // Un redacteur peut modifier ses propres donnees mais ni son login/email // ni son statut (qui sont le cas echeant passes comme option) @@ -876,8 +927,9 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) { if (isset($opt['webmestre']) and $opt['webmestre']) { return false; } elseif ((isset($opt['statut']) and $opt['statut']) - OR (isset($opt['restreintes']) and $opt['restreintes']) - OR $opt['email']) { + OR (isset($opt['restreintes']) and $opt['restreintes']) + OR $opt['email'] + ) { return false; } elseif ($id == $qui['id_auteur']) { return true; @@ -892,7 +944,8 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) { if (isset($opt['webmestre']) and $opt['webmestre']) { return false; } elseif ((isset($opt['statut']) AND ($opt['statut'] == '0minirezo')) - OR (isset($opt['restreintes']) and $opt['restreintes'])) { + OR (isset($opt['restreintes']) and $opt['restreintes']) + ) { return false; } else { if ($id == $qui['id_auteur']) { @@ -901,17 +954,19 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) { } else { return true; } - } - else if ($id_auteur = intval($id)) { - $t = sql_fetsel("statut", "spip_auteurs", "id_auteur=$id_auteur"); - if ($t AND $t['statut'] != '0minirezo') + } else { + if ($id_auteur = intval($id)) { + $t = sql_fetsel("statut", "spip_auteurs", "id_auteur=$id_auteur"); + if ($t AND $t['statut'] != '0minirezo') { + return true; + } else { + return false; + } + } // id = 0 => creation + else { return true; - else - return false; + } } - // id = 0 => creation - else - return true; } } @@ -922,13 +977,14 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) { } // et toucher au statut webmestre si il ne l'est pas lui meme // ou si les webmestres sont fixes par constante (securite) - elseif (isset($opt['webmestre']) AND $opt['webmestre'] AND (defined('_ID_WEBMESTRES') OR !autoriser('webmestre'))) + elseif (isset($opt['webmestre']) AND $opt['webmestre'] AND (defined('_ID_WEBMESTRES') OR !autoriser('webmestre'))) { return false; - // et modifier un webmestre si il ne l'est pas lui meme - elseif (intval($id) AND autoriser('webmestre','',0,$id) AND !autoriser('webmestre')) + } // et modifier un webmestre si il ne l'est pas lui meme + elseif (intval($id) AND autoriser('webmestre', '', 0, $id) AND !autoriser('webmestre')) { return false; - else + } else { return true; + } } @@ -936,15 +992,15 @@ function autoriser_auteur_modifier_dist($faire, $type, $id, $qui, $opt) { * Autorisation d'associer un auteur sur un objet * * Il faut pouvoir modifier l'objet en question - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt) { return autoriser('modifier', $type, $id, $qui, $opt); } @@ -953,14 +1009,14 @@ function autoriser_associerauteurs_dist($faire, $type, $id, $qui, $opt){ * Autorisation d'upload FTP * * Il faut être administrateur. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) { return $qui['statut'] == '0minirezo'; } @@ -969,14 +1025,14 @@ function autoriser_chargerftp_dist($faire, $type, $id, $qui, $opt) { * Autorisation d'activer le mode debug * * Il faut être administrateur. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_debug_dist($faire, $type, $id, $qui, $opt) { return $qui['statut'] == '0minirezo'; } @@ -989,29 +1045,36 @@ function autoriser_debug_dist($faire, $type, $id, $qui, $opt) { * * Mémorise le resultat dans un tableau statique indéxé par les id_auteur. * On peut reinitialiser un élément en passant un 2e argument non vide - * - * @param int $id_auteur Identifiant de l'auteur - * @param bool $raz Recalculer le résultat connu pour cet auteur + * + * @param int $id_auteur Identifiant de l'auteur + * @param bool $raz Recalculer le résultat connu pour cet auteur * @return array Liste des rubriques -**/ + **/ function liste_rubriques_auteur($id_auteur, $raz = false) { static $restreint = array(); - if (!$id_auteur = intval($id_auteur)) return array(); - if ($raz) unset($restreint[$id_auteur]); - elseif (isset($restreint[$id_auteur])) return $restreint[$id_auteur]; + if (!$id_auteur = intval($id_auteur)) { + return array(); + } + if ($raz) { + unset($restreint[$id_auteur]); + } elseif (isset($restreint[$id_auteur])) { + return $restreint[$id_auteur]; + } $rubriques = array(); if ( - (!isset($GLOBALS['meta']['version_installee']) OR $GLOBALS['meta']['version_installee']>16428) - AND $r = sql_allfetsel('id_objet', 'spip_auteurs_liens', "id_auteur=".intval($id_auteur)." AND objet='rubrique' AND id_objet!=0") - AND count($r)) { - $r = array_map('reset',$r); + (!isset($GLOBALS['meta']['version_installee']) OR $GLOBALS['meta']['version_installee'] > 16428) + AND $r = sql_allfetsel('id_objet', 'spip_auteurs_liens', + "id_auteur=" . intval($id_auteur) . " AND objet='rubrique' AND id_objet!=0") + AND count($r) + ) { + $r = array_map('reset', $r); // recuperer toute la branche, au format chaine enumeration include_spip('inc/rubriques'); $r = calcul_branche_in($r); - $r = explode(',',$r); + $r = explode(',', $r); // passer les rubriques en index, elimine les doublons $r = array_flip($r); @@ -1019,13 +1082,15 @@ function liste_rubriques_auteur($id_auteur, $raz = false) { $r = array_keys($r); // combiner pour avoir un tableau id_rubrique=>id_rubrique // est-ce vraiment utile ? (on preserve la forme donnee par le code precedent) - $rubriques = array_combine($r,$r); + $rubriques = array_combine($r, $r); } // Affecter l'auteur session le cas echeant if (isset($GLOBALS['visiteur_session']['id_auteur']) - AND $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur) + AND $GLOBALS['visiteur_session']['id_auteur'] == $id_auteur + ) { $GLOBALS['visiteur_session']['restreint'] = $rubriques; + } return $restreint[$id_auteur] = $rubriques; @@ -1035,14 +1100,14 @@ function liste_rubriques_auteur($id_auteur, $raz = false) { * Autorisation de modifier l'URL d'un objet * * Il faut pouvoir modifier l'objet. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_modifierurl_dist($faire, $type, $id, $qui, $opt) { return autoriser('modifier', $type, $id, $qui, $opt); } @@ -1051,15 +1116,15 @@ function autoriser_modifierurl_dist($faire, $type, $id, $qui, $opt) { * Autorisation de prévisualiser une rubrique * * Il faut pouvoir prévisualiser. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_rubrique_previsualiser_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_rubrique_previsualiser_dist($faire, $type, $id, $qui, $opt) { return autoriser('previsualiser'); } @@ -1067,15 +1132,15 @@ function autoriser_rubrique_previsualiser_dist($faire, $type, $id, $qui, $opt){ * Autorisation d'iconifier une rubrique (mettre un logo) * * Il faut pouvoir publier dans la rubrique. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_rubrique_iconifier_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_rubrique_iconifier_dist($faire, $type, $id, $qui, $opt) { return autoriser('publierdans', 'rubrique', $id, $qui, $opt); } @@ -1083,32 +1148,32 @@ function autoriser_rubrique_iconifier_dist($faire, $type, $id, $qui, $opt){ * Autorisation d'iconifier un auteur (mettre un logo) * * Il faut un administrateur ou que l'auteur soit celui qui demande l'autorisation - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_auteur_iconifier_dist($faire, $type, $id, $qui, $opt){ - return (($id == $qui['id_auteur']) OR - (($qui['statut'] == '0minirezo') AND !$qui['restreint'])); + **/ +function autoriser_auteur_iconifier_dist($faire, $type, $id, $qui, $opt) { + return (($id == $qui['id_auteur']) OR + (($qui['statut'] == '0minirezo') AND !$qui['restreint'])); } /** * Autorisation d'iconifier un objet (mettre un logo) * * Il faut pouvoir modifier l'objet - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_iconifier_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_iconifier_dist($faire, $type, $id, $qui, $opt) { // par defaut, on a le droit d'iconifier si on a le droit de modifier return autoriser('modifier', $type, $id, $qui, $opt); } @@ -1119,14 +1184,14 @@ function autoriser_iconifier_dist($faire, $type, $id, $qui, $opt){ * * Autorise toujours ! * Fonction sans surprise pour permettre les tests. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true -**/ + **/ function autoriser_ok_dist($faire, $type, $id, $qui, $opt) { return true; } /** @@ -1134,31 +1199,32 @@ function autoriser_ok_dist($faire, $type, $id, $qui, $opt) { return true; } * * Refuse toujours ! * Fonction sans surprise pour permettre les tests. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool false -**/ + **/ function autoriser_niet_dist($faire, $type, $id, $qui, $opt) { return false; } /** * Autorisation de réparer la base de données * * Il faut pouvoir la détruire (et ne pas être en cours de réinstallation) - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool false -**/ + **/ function autoriser_base_reparer_dist($faire, $type, $id, $qui, $opt) { - if (!autoriser('detruire') OR _request('reinstall')) + if (!autoriser('detruire') OR _request('reinstall')) { return false; + } return true; } @@ -1167,14 +1233,14 @@ function autoriser_base_reparer_dist($faire, $type, $id, $qui, $opt) { * Autorisation de voir l'onglet infosperso * * Toujours OK - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_infosperso_dist($faire, $type, $id, $qui, $opt) { return true; } @@ -1183,14 +1249,14 @@ function autoriser_infosperso_dist($faire, $type, $id, $qui, $opt) { * Autorisation de voir le formulaire configurer_langage * * Toujours OK - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_langage_configurer_dist($faire, $type, $id, $qui, $opt) { return true; } @@ -1199,14 +1265,14 @@ function autoriser_langage_configurer_dist($faire, $type, $id, $qui, $opt) { * Autorisation de voir l'onglet configurerlangage * * Calquée sur l'autorisation de voir le formulaire configurer_langage - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_configurerlangage_dist($faire, $type, $id, $qui, $opt) { return autoriser('configurer', '_langage', $id, $qui, $opt); } @@ -1215,14 +1281,14 @@ function autoriser_configurerlangage_dist($faire, $type, $id, $qui, $opt) { * Autorisation de voir le formulaire configurer_preferences * * Toujours OK - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_preferences_configurer_dist($faire, $type, $id, $qui, $opt) { return true; } @@ -1231,14 +1297,14 @@ function autoriser_preferences_configurer_dist($faire, $type, $id, $qui, $opt) { * Autorisation de voir l'onglet configurerpreferences * * Calquée sur l'autorisation de voir le formulaire configurer_preferences - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_configurerpreferences_dist($faire, $type, $id, $qui, $opt) { return autoriser('configurer', '_preferences', $id, $qui, $opt); } @@ -1247,15 +1313,15 @@ function autoriser_configurerpreferences_dist($faire, $type, $id, $qui, $opt) { * Autorisation d'afficher le menu développement * * Dépend de la préférences utilisateur - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_menudeveloppement_menugrandeentree_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_menudeveloppement_menugrandeentree_dist($faire, $type, $id, $qui, $opt) { return (isset($GLOBALS['visiteur_session']['prefs']['activer_menudev']) AND $GLOBALS['visiteur_session']['prefs']['activer_menudev'] == 'oui'); } @@ -1265,15 +1331,15 @@ function autoriser_menudeveloppement_menugrandeentree_dist($faire, $type, $id, $ * * Par defaut les grandes entrees (accueil, édition, publication, etc.) * sont visibles de tous - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_menugrandeentree_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_menugrandeentree_dist($faire, $type, $id, $qui, $opt) { return true; } @@ -1283,55 +1349,55 @@ function autoriser_menugrandeentree_dist($faire, $type, $id, $qui, $opt){ * Toujours OK * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_auteurs_menu_dist($faire, $type, $id, $qui, $opt){return true;} + **/ +function autoriser_auteurs_menu_dist($faire, $type, $id, $qui, $opt) { return true; } /** * Autorisation de voir le menu articles * * Toujours OK - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_articles_menu_dist($faire, $type, $id, $qui, $opt){return true;} + **/ +function autoriser_articles_menu_dist($faire, $type, $id, $qui, $opt) { return true; } /** * Autorisation de voir le menu rubriques * * Toujours OK - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_rubriques_menu_dist($faire, $type, $id, $qui, $opt){return true;} + **/ +function autoriser_rubriques_menu_dist($faire, $type, $id, $qui, $opt) { return true; } /** - * Autorisation de voir le menu articlecreer + * Autorisation de voir le menu articlecreer * * Il faut au moins une rubrique présente. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_articlecreer_menu_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_articlecreer_menu_dist($faire, $type, $id, $qui, $opt) { return verifier_table_non_vide(); } @@ -1340,16 +1406,16 @@ function autoriser_articlecreer_menu_dist($faire, $type, $id, $qui, $opt){ * Autorisation de voir le menu auteurcreer * * Il faut pouvoir créer un auteur ! - * + * * @see autoriser_auteur_creer_dist() - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ + **/ function autoriser_auteurcreer_menu_dist($faire, $type, $id, $qui, $opt) { return autoriser('creer', 'auteur', $id, $qui, $opt); } @@ -1358,47 +1424,47 @@ function autoriser_auteurcreer_menu_dist($faire, $type, $id, $qui, $opt) { * Autorisation de voir le menu suiviedito * * Il faut être administrateur (y compris restreint). - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_suiviedito_menu_dist($faire, $type, $id, $qui, $opt){ - return $qui['statut']=='0minirezo'; + **/ +function autoriser_suiviedito_menu_dist($faire, $type, $id, $qui, $opt) { + return $qui['statut'] == '0minirezo'; } /** * Autorisation de voir le menu synchro * * Il faut être administrateur (y compris restreint). - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_synchro_menu_dist($faire, $type, $id, $qui, $opt){ - return $qui['statut']=='0minirezo'; + **/ +function autoriser_synchro_menu_dist($faire, $type, $id, $qui, $opt) { + return $qui['statut'] == '0minirezo'; } /** * Autorisation de purger la queue de travaux * * Il faut être webmestre. - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt){ + **/ +function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt) { return autoriser('webmestre'); } @@ -1408,45 +1474,46 @@ function autoriser_queue_purger_dist($faire, $type, $id, $qui, $opt){ * * Il faut être dans l'espace privé (et authentifié), * sinon il faut être webmestre (pas de fuite d'informations publiées) - * + * * @param string $faire Action demandée - * @param string $type Type d'objet sur lequel appliquer l'action - * @param int $id Identifiant de l'objet - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $type Type d'objet sur lequel appliquer l'action + * @param int $id Identifiant de l'objet + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon -**/ -function autoriser_echafauder_dist($faire, $type, $id, $qui, $opt){ - if (test_espace_prive()) - return intval($qui['id_auteur'])?true:false; - else - return autoriser('webmestre','',$id,$qui,$opt); + **/ +function autoriser_echafauder_dist($faire, $type, $id, $qui, $opt) { + if (test_espace_prive()) { + return intval($qui['id_auteur']) ? true : false; + } else { + return autoriser('webmestre', '', $id, $qui, $opt); + } } /** * Lister les auteurs d'un article - * + * * Fonction générique utilisée par plusieurs autorisations * * @param int $id_article Identifiant de l'article - * @param string $cond Condition en plus dans le where de la requête + * @param string $cond Condition en plus dans le where de la requête * @return array|bool * - array : liste des id_auteur trouvés * - false : serveur SQL indisponible */ -function auteurs_article($id_article, $cond = '') -{ - return sql_allfetsel("id_auteur", "spip_auteurs_liens", "objet='article' AND id_objet=$id_article". ($cond ? " AND $cond" : '')); +function auteurs_article($id_article, $cond = '') { + return sql_allfetsel("id_auteur", "spip_auteurs_liens", + "objet='article' AND id_objet=$id_article" . ($cond ? " AND $cond" : '')); } /** * Tester si on est admin restreint sur une rubrique donnée - * + * * Fonction générique utilisee dans des autorisations ou assimilée * - * @param int $id_rubrique Identifiant de la rubrique + * @param int $id_rubrique Identifiant de la rubrique * @return bool true si administrateur de cette rubrique, false sinon. */ function acces_restreint_rubrique($id_rubrique) { @@ -1457,16 +1524,18 @@ function acces_restreint_rubrique($id_rubrique) { /** * Verifier qu'il existe au moins un parent - * + * * Fonction utilisee dans des autorisations des boutons / menus du prive des objets enfants (articles, breves, sites) * - * @param string $table la table a vérifier + * @param string $table la table a vérifier * @return bool true si un parent existe */ function verifier_table_non_vide($table = 'spip_rubriques') { static $done = array(); - if (!isset($done[$table])) - $done[$table] = sql_countsel($table)>0; + if (!isset($done[$table])) { + $done[$table] = sql_countsel($table) > 0; + } + return $done[$table]; } @@ -1476,33 +1545,34 @@ function verifier_table_non_vide($table = 'spip_rubriques') { * Pour un statut et un éventuel id_rubrique donné, indique, * à l'aide de la liste globale des statuts (tableau mode => nom du mode) * si le visiteur peut s'inscrire sur le site. - * + * * Utile pour le formulaire d'inscription. - * + * * Par défaut, seuls `6forum` et `1comite` sont possibles, les autres sont * en `false`. Pour un nouveau mode il suffit de définir l'autorisation * spécifique. * * @param string $faire Action demandée - * @param string $quoi Statut demandé - * @param int $id Identifiant éventuel, par exemple de rubrique - * @param array $qui Description de l'auteur demandant l'autorisation - * @param array $opt Options de cette autorisation + * @param string $quoi Statut demandé + * @param int $id Identifiant éventuel, par exemple de rubrique + * @param array $qui Description de l'auteur demandant l'autorisation + * @param array $opt Options de cette autorisation * @return bool true s'il a le droit, false sinon */ -function autoriser_inscrireauteur_dist($faire, $quoi, $id, $qui, $opt){ +function autoriser_inscrireauteur_dist($faire, $quoi, $id, $qui, $opt) { $s = array_search($quoi, $GLOBALS['liste_des_statuts']); switch ($s) { case 'info_redacteurs' : - return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui'); + return ($GLOBALS['meta']['accepter_inscriptions'] == 'oui'); case 'info_visiteurs' : - return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' OR $GLOBALS['meta']['forums_publics'] == 'abo'); + return ($GLOBALS['meta']['accepter_visiteurs'] == 'oui' OR $GLOBALS['meta']['forums_publics'] == 'abo'); } return false; } + ?> diff --git a/ecrire/inc/bandeau.php b/ecrire/inc/bandeau.php index 7552b08540..c830e0594c 100644 --- a/ecrire/inc/bandeau.php +++ b/ecrire/inc/bandeau.php @@ -12,11 +12,13 @@ /** * Ce fichier gère le bandeau supérieur de l'espace privé - * + * * @package SPIP\Core\Bandeau -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/boutons'); @@ -27,40 +29,44 @@ include_spip('inc/boutons'); * à partir du nom du fichier exec, si celui ci correspond à un objet * éditorial de SPIP (et qu'il possède ces champs), et dans ce cas, * l'ajoute au contexte. - * + * * @param null|array $contexte * Contexte connu. * S'il n'est pas transmis, on prend `$_GET` * @return array * Contexte -**/ -function definir_barre_contexte($contexte = null){ - if (is_null($contexte)) + **/ +function definir_barre_contexte($contexte = null) { + if (is_null($contexte)) { $contexte = $_GET; - elseif(is_string($contexte)) + } elseif (is_string($contexte)) { $contexte = unserialize($contexte); - if (!isset($contexte['id_rubrique']) AND isset($contexte['exec'])){ - if (!function_exists('trouver_objet_exec')) + } + if (!isset($contexte['id_rubrique']) AND isset($contexte['exec'])) { + if (!function_exists('trouver_objet_exec')) { include_spip('inc/pipelines_ecrire'); - if ($e=trouver_objet_exec($contexte['exec'])){ + } + if ($e = trouver_objet_exec($contexte['exec'])) { $_id = $e['id_table_objet']; - if (isset($contexte[$_id]) AND $id=intval($contexte[$_id])){ + if (isset($contexte[$_id]) AND $id = intval($contexte[$_id])) { $table = $e['table_objet_sql']; - $row = sql_fetsel('*',$table,"$_id=".intval($id)); - if (isset($row['id_rubrique'])){ + $row = sql_fetsel('*', $table, "$_id=" . intval($id)); + if (isset($row['id_rubrique'])) { $contexte['id_rubrique'] = $row['id_rubrique']; - if (isset($row['id_secteur'])) + if (isset($row['id_secteur'])) { $contexte['id_secteur'] = $row['id_secteur']; + } } } } } + return $contexte; } /** * Définir la liste des boutons du haut et de ses sous-menus - * + * * On defini les boutons à mettre selon les droits de l'utilisateur * puis on balance le tout au pipeline "ajouter_menus" pour que des plugins * puissent y mettre leur grain de sel @@ -71,51 +77,63 @@ function definir_barre_contexte($contexte = null){ * @return array */ function definir_barre_boutons($contexte = array(), $icones = true, $autorise = true) { - include_spip('inc/autoriser'); - $boutons_admin=array(); + include_spip('inc/autoriser'); + $boutons_admin = array(); // les boutons du core, issus de prive/navigation.xml $liste_boutons = array(); // ajouter les boutons issus des plugin via plugin.xml if (function_exists('boutons_plugins') - AND is_array($liste_boutons_plugins = boutons_plugins())) + AND is_array($liste_boutons_plugins = boutons_plugins()) + ) { $liste_boutons = &$liste_boutons_plugins; + } - foreach($liste_boutons as $id => $infos){ + foreach ($liste_boutons as $id => $infos) { $parent = ""; // les boutons principaux ne sont pas soumis a autorisation - if (!isset($infos['parent']) OR !($parent = $infos['parent']) OR !$autorise OR autoriser('menu',"_$id",0,NULL,array('contexte'=>$contexte))){ + if (!isset($infos['parent']) OR !($parent = $infos['parent']) OR !$autorise OR autoriser('menu', "_$id", 0, null, + array('contexte' => $contexte)) + ) { if ($parent - AND $parent = preg_replace(',^bando_,','menu_',$parent) - AND isset($boutons_admin[$parent])){ - if (!is_array($boutons_admin[$parent]->sousmenu)) + AND $parent = preg_replace(',^bando_,', 'menu_', $parent) + AND isset($boutons_admin[$parent]) + ) { + if (!is_array($boutons_admin[$parent]->sousmenu)) { $boutons_admin[$parent]->sousmenu = array(); + } $position = (isset($infos['position']) AND strlen($infos['position'])) ? intval($infos['position']) : count($boutons_admin[$parent]->sousmenu); - if ($position<0) $position = count($boutons_admin[$parent]->sousmenu)+1+$position; - $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu,0,$position) - + array($id=> new Bouton( - ($icones AND !empty($infos['icone']))?find_in_theme($infos['icone']):'', // icone - $infos['titre'], // titre - (isset($infos['action']) AND $infos['action'])?$infos['action']:null, - (isset($infos['parametres']) AND $infos['parametres'])?$infos['parametres']:null - )) - + array_slice($boutons_admin[$parent]->sousmenu,$position,100); + if ($position < 0) { + $position = count($boutons_admin[$parent]->sousmenu)+1+$position; + } + $boutons_admin[$parent]->sousmenu = array_slice($boutons_admin[$parent]->sousmenu, 0, $position) + +array( + $id => new Bouton( + ($icones AND !empty($infos['icone'])) ? find_in_theme($infos['icone']) : '', // icone + $infos['titre'], // titre + (isset($infos['action']) AND $infos['action']) ? $infos['action'] : null, + (isset($infos['parametres']) AND $infos['parametres']) ? $infos['parametres'] : null + ) + ) + +array_slice($boutons_admin[$parent]->sousmenu, $position, 100); } if (!$parent // provisoire, eviter les vieux boutons - AND (!in_array($id,array('forum','statistiques_visites'))) - AND (!$autorise OR autoriser('menugrandeentree',"_$id",0,NULL,array('contexte'=>$contexte))) + AND (!in_array($id, array('forum', 'statistiques_visites'))) + AND (!$autorise OR autoriser('menugrandeentree', "_$id", 0, null, array('contexte' => $contexte))) ) { $position = (isset($infos['position']) and $infos['position']) ? $infos['position'] : count($boutons_admin); - $boutons_admin = array_slice($boutons_admin,0,$position) - +array($id=> new Bouton( - ($icones AND isset($infos['icone']) AND $infos['icone'])?find_in_theme($infos['icone']):'', // icone - $infos['titre'], // titre - (isset($infos['action']) AND $infos['action'])?$infos['action']:null, - (isset($infos['parametres']) AND $infos['parametres'])?$infos['parametres']:null - )) - + array_slice($boutons_admin,$position,100); + $boutons_admin = array_slice($boutons_admin, 0, $position) + +array( + $id => new Bouton( + ($icones AND isset($infos['icone']) AND $infos['icone']) ? find_in_theme($infos['icone']) : '', // icone + $infos['titre'], // titre + (isset($infos['action']) AND $infos['action']) ? $infos['action'] : null, + (isset($infos['parametres']) AND $infos['parametres']) ? $infos['parametres'] : null + ) + ) + +array_slice($boutons_admin, $position, 100); } } } @@ -131,21 +149,24 @@ function definir_barre_boutons($contexte = array(), $icones = true, $autorise = * @param array|null $contexte * @return string */ -function bandeau_creer_url($url, $args = "", $contexte = null){ - if (!preg_match(',[\/\?],',$url)) { - $url = generer_url_ecrire($url,$args,true); +function bandeau_creer_url($url, $args = "", $contexte = null) { + if (!preg_match(',[\/\?],', $url)) { + $url = generer_url_ecrire($url, $args, true); // recuperer les parametres du contexte demande par l'url sous la forme // &truc=@machin@ // @machin@ etant remplace par _request('machin') - $url = str_replace('&','&',$url); - while (preg_match(",[&?]([a-z_]+)=@([a-z_]+)@,i",$url,$matches)){ - if ($matches[2]=='id_secteur' AND !isset($contexte['id_secteur']) AND isset($contexte['id_rubrique'])) - $contexte['id_secteur'] = sql_getfetsel('id_secteur','spip_rubriques','id_rubrique='.intval($contexte['id_rubrique'])); - $val = _request($matches[2],$contexte); - $url = parametre_url($url,$matches[1],$val?$val:'','&'); + $url = str_replace('&', '&', $url); + while (preg_match(",[&?]([a-z_]+)=@([a-z_]+)@,i", $url, $matches)) { + if ($matches[2] == 'id_secteur' AND !isset($contexte['id_secteur']) AND isset($contexte['id_rubrique'])) { + $contexte['id_secteur'] = sql_getfetsel('id_secteur', 'spip_rubriques', + 'id_rubrique=' . intval($contexte['id_rubrique'])); + } + $val = _request($matches[2], $contexte); + $url = parametre_url($url, $matches[1], $val ? $val : '', '&'); } - $url = str_replace('&','&',$url); + $url = str_replace('&', '&', $url); } + return $url; } @@ -157,7 +178,7 @@ function bandeau_creer_url($url, $args = "", $contexte = null){ * Code HTML du bandeau */ function inc_bandeau_dist() { - return recuperer_fond('prive/squelettes/inclure/barre-nav',$_GET); + return recuperer_fond('prive/squelettes/inclure/barre-nav', $_GET); } ?> diff --git a/ecrire/inc/boutons.php b/ecrire/inc/boutons.php index 54efae9d2c..a2a1fb8ce0 100644 --- a/ecrire/inc/boutons.php +++ b/ecrire/inc/boutons.php @@ -16,7 +16,9 @@ * @package SPIP\Core\Boutons */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Classe définissant un bouton dans la barre du haut de l'interface @@ -30,42 +32,42 @@ class Bouton { var $libelle; /** @var null|string L'URL de la page (null => ?exec=nom) */ - var $url= null; + var $url = null; /** @var null|string|array Arguments supplementaires de l'URL */ - var $urlArg= null; + var $urlArg = null; /** @var null|string URL du javascript */ - var $url2= null; + var $url2 = null; /** @var null|string Pour ouvrir dans une fenetre a part */ - var $target= null; + var $target = null; /** @var null|mixed Sous-barre de boutons / onglets */ - var $sousmenu= null; + var $sousmenu = null; /** - * Définit un bouton - * - * @param string $icone - * L'icone à mettre dans le bouton - * @param string $libelle - * Le nom de l'entrée i18n associé - * @param null|string $url - * L'URL de la page - * @param null|string|array $urlArg - * Arguments supplémentaires de l'URL - * @param null|string $url2 - * URL du javascript - * @param null|mixed $target - * Pour ouvrir une fenêtre à part - */ - function __construct($icone, $libelle, $url = null, $urlArg = null, $url2=null, $target=null) { - $this->icone = $icone; - $this->libelle= $libelle; - $this->url = $url; + * Définit un bouton + * + * @param string $icone + * L'icone à mettre dans le bouton + * @param string $libelle + * Le nom de l'entrée i18n associé + * @param null|string $url + * L'URL de la page + * @param null|string|array $urlArg + * Arguments supplémentaires de l'URL + * @param null|string $url2 + * URL du javascript + * @param null|mixed $target + * Pour ouvrir une fenêtre à part + */ + function __construct($icone, $libelle, $url = null, $urlArg = null, $url2 = null, $target = null) { + $this->icone = $icone; + $this->libelle = $libelle; + $this->url = $url; $this->urlArg = $urlArg; - $this->url2 = $url2; + $this->url2 = $url2; $this->target = $target; } } @@ -84,7 +86,7 @@ class Bouton { */ function definir_barre_onglets($script) { - $onglets=array(); + $onglets = array(); $liste_onglets = array(); // ajouter les onglets issus des plugin via paquet.xml @@ -93,21 +95,23 @@ function definir_barre_onglets($script) { } - foreach($liste_onglets as $id => $infos){ + foreach ($liste_onglets as $id => $infos) { if (($parent = $infos['parent']) && $parent == $script - && autoriser('onglet',"_$id")) { - $onglets[$id] = new Bouton( - isset($infos['icone']) ? find_in_theme($infos['icone']) : '', // icone - $infos['titre'], // titre - (isset($infos['action']) and $infos['action']) - ? generer_url_ecrire($infos['action'],(isset($infos['parametres']) AND $infos['parametres'])?$infos['parametres']:'') - : null - ); + && autoriser('onglet', "_$id") + ) { + $onglets[$id] = new Bouton( + isset($infos['icone']) ? find_in_theme($infos['icone']) : '', // icone + $infos['titre'], // titre + (isset($infos['action']) and $infos['action']) + ? generer_url_ecrire($infos['action'], + (isset($infos['parametres']) AND $infos['parametres']) ? $infos['parametres'] : '') + : null + ); } } - return pipeline('ajouter_onglets', array('data'=>$onglets,'args'=>$script)); + return pipeline('ajouter_onglets', array('data' => $onglets, 'args' => $script)); } @@ -125,17 +129,17 @@ function definir_barre_onglets($script) { * @param string $class * @return string */ -function barre_onglets($rubrique, $ongletCourant, $class = "barre_onglet"){ +function barre_onglets($rubrique, $ongletCourant, $class = "barre_onglet") { include_spip('inc/presentation'); $res = ''; - foreach(definir_barre_onglets($rubrique) as $exec => $onglet) { - $url= $onglet->url ? $onglet->url : generer_url_ecrire($exec); + foreach (definir_barre_onglets($rubrique) as $exec => $onglet) { + $url = $onglet->url ? $onglet->url : generer_url_ecrire($exec); $res .= onglet(_T($onglet->libelle), $url, $exec, $ongletCourant, $onglet->icone); } - return !$res ? '' : (debut_onglet($class) . $res . fin_onglet()); + return !$res ? '' : (debut_onglet($class) . $res . fin_onglet()); } diff --git a/ecrire/inc/charger_php_extension.php b/ecrire/inc/charger_php_extension.php index 82bfb714a0..e1d8fb7605 100644 --- a/ecrire/inc/charger_php_extension.php +++ b/ecrire/inc/charger_php_extension.php @@ -4,9 +4,11 @@ * Chargement d'une extension PHP * * @package SPIP\Core\Outils -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Permet de charger un module PHP dont le nom est donné en argument @@ -23,13 +25,13 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * * @note * La fonction `dl()` n'est plus présente à partir de PHP 5.3. - * + * * @param string $module * Nom du module à charger (tel que 'mysql') * @return bool * true en cas de succes -**/ -function inc_charger_php_extension_dist($module){ + **/ +function inc_charger_php_extension_dist($module) { if (extension_loaded($module)) { return true; } @@ -37,9 +39,10 @@ function inc_charger_php_extension_dist($module){ // A-t-on le droit de faire un dl() ; si on peut, on memorise la reponse, // lourde a calculer, dans les meta if (!isset($GLOBALS['meta']['dl_allowed'])) { - if (!@ini_get('safe_mode') - && @ini_get('enable_dl') - && @function_exists('dl')) { + if (!@ini_get('safe_mode') + && @ini_get('enable_dl') + && @function_exists('dl') + ) { ob_start(); phpinfo(INFO_GENERAL); /* Only general info */ $a = strip_tags(ob_get_contents()); @@ -69,7 +72,8 @@ function inc_charger_php_extension_dist($module){ } $prefix = (PHP_SHLIB_SUFFIX === 'dll') ? 'php_' : ''; - + return @dl($prefix . $module_file . PHP_SHLIB_SUFFIX); } + ?> diff --git a/ecrire/inc/charsets.php b/ecrire/inc/charsets.php index f8252ec0d4..0a0a941db5 100644 --- a/ecrire/inc/charsets.php +++ b/ecrire/inc/charsets.php @@ -16,12 +16,14 @@ * Ce fichier contient les fonctions relatives à la gestion de charsets, * à la conversion de textes dans différents charsets et * propose des fonctions émulant la librairie mb si elle est absente - * + * * @package SPIP\Core\Texte\Charsets -**/ + **/ // securité -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // se faciliter la lecture du charset include_spip('inc/config'); @@ -38,30 +40,45 @@ include_spip('inc/config'); * @return string|bool * - Nom du charset * - false si le charset n'est pas décrit dans le répertoire charsets/ -**/ -function load_charset ($charset = 'AUTO') { - if ($charset == 'AUTO') + **/ +function load_charset($charset = 'AUTO') { + if ($charset == 'AUTO') { $charset = $GLOBALS['meta']['charset']; + } $charset = trim(strtolower($charset)); - if (isset($GLOBALS['CHARSET'][$charset])) + if (isset($GLOBALS['CHARSET'][$charset])) { return $charset; + } if ($charset == 'utf-8') { $GLOBALS['CHARSET'][$charset] = array(); + return $charset; } // Quelques synonymes - if ($charset == '') $charset = 'iso-8859-1'; - else if ($charset == 'windows-1250') $charset = 'cp1250'; - else if ($charset == 'windows-1251') $charset = 'cp1251'; - else if ($charset == 'windows-1256') $charset = 'cp1256'; + if ($charset == '') { + $charset = 'iso-8859-1'; + } else { + if ($charset == 'windows-1250') { + $charset = 'cp1250'; + } else { + if ($charset == 'windows-1251') { + $charset = 'cp1251'; + } else { + if ($charset == 'windows-1256') { + $charset = 'cp1256'; + } + } + } + } if (find_in_path($charset . '.php', 'charsets/', true)) { return $charset; } else { spip_log("Erreur: pas de fichier de conversion 'charsets/$charset'"); $GLOBALS['CHARSET'][$charset] = array(); + return false; } } @@ -72,7 +89,7 @@ function load_charset ($charset = 'AUTO') { * * @return bool * true si toutes les fonctions mb nécessaires sont présentes -**/ + **/ function init_mb_string() { static $mb; @@ -80,18 +97,19 @@ function init_mb_string() { // et que le charset interne est connu de mb_string if (!$mb) { if (function_exists('mb_internal_encoding') - AND function_exists('mb_detect_order') - AND function_exists('mb_substr') - AND function_exists('mb_strlen') - AND function_exists('mb_encode_mimeheader') - AND function_exists('mb_encode_numericentity') - AND function_exists('mb_decode_numericentity') - AND mb_detect_order(lire_config('charset', _DEFAULT_CHARSET)) + AND function_exists('mb_detect_order') + AND function_exists('mb_substr') + AND function_exists('mb_strlen') + AND function_exists('mb_encode_mimeheader') + AND function_exists('mb_encode_numericentity') + AND function_exists('mb_decode_numericentity') + AND mb_detect_order(lire_config('charset', _DEFAULT_CHARSET)) ) { mb_internal_encoding('utf-8'); $mb = 1; - } else + } else { $mb = -1; + } } return ($mb == 1); @@ -107,20 +125,22 @@ function init_mb_string() { * * @return bool * true si iconv fonctionne correctement -**/ + **/ function test_iconv() { static $iconv_ok; if (!$iconv_ok) { - if (!function_exists('iconv')) + if (!function_exists('iconv')) { $iconv_ok = -1; - else { - if (utf_32_to_unicode(@iconv('utf-8', 'utf-32', 'chaine de test')) == 'chaine de test') + } else { + if (utf_32_to_unicode(@iconv('utf-8', 'utf-32', 'chaine de test')) == 'chaine de test') { $iconv_ok = 1; - else + } else { $iconv_ok = -1; + } } } + return ($iconv_ok == 1); } @@ -132,15 +152,19 @@ function test_iconv() { * * @return bool * true si PCRE supporte l'UTF-8 correctement -**/ + **/ function test_pcre_unicode() { static $pcre_ok = 0; if (!$pcre_ok) { - $s = " ".chr(195).chr(169)."t".chr(195).chr(169)." "; - if (preg_match(',\W...\W,u', $s)) $pcre_ok = 1; - else $pcre_ok = -1; + $s = " " . chr(195) . chr(169) . "t" . chr(195) . chr(169) . " "; + if (preg_match(',\W...\W,u', $s)) { + $pcre_ok = 1; + } else { + $pcre_ok = -1; + } } + return $pcre_ok == 1; } @@ -155,7 +179,7 @@ function test_pcre_unicode() { * Servait à inc/ortho passé dans le grenier * @return string * Plage de caractères -**/ + **/ function pcre_lettres_unicode() { static $plage_unicode; @@ -166,12 +190,12 @@ function pcre_lettres_unicode() { . '\x{100}-\x{24f}' // europeen etendu . '\x{300}-\x{1cff}' // des tas de trucs ; - } - else { + } else { // fallback a trois sous $plage_unicode = '\w'; } } + return $plage_unicode; } @@ -188,7 +212,7 @@ function pcre_lettres_unicode() { * Servait à inc/ortho passé dans le grenier * @return string * Plage de caractères -**/ + **/ function plage_punct_unicode() { return '\xE2(\x80[\x80-\xBF]|\x81[\x80-\xAF])'; } @@ -208,7 +232,7 @@ function plage_punct_unicode() { * Charset de destination (unicode par défaut) * @return string|array * Texte corrigé -**/ + **/ function corriger_caracteres_windows($texte, $charset = 'AUTO', $charset_cible = 'unicode') { static $trans; @@ -216,65 +240,69 @@ function corriger_caracteres_windows($texte, $charset = 'AUTO', $charset_cible = return array_map('corriger_caracteres_windows', $texte); } - if ($charset=='AUTO') { + if ($charset == 'AUTO') { $charset = lire_config('charset', _DEFAULT_CHARSET); } if ($charset == 'utf-8') { $p = chr(194); - if (strpos($texte,$p)==false) + if (strpos($texte, $p) == false) { return $texte; - } else if ($charset == 'iso-8859-1') { - $p = ''; - } else - return $texte; + } + } else { + if ($charset == 'iso-8859-1') { + $p = ''; + } else { + return $texte; + } + } if (!isset($trans[$charset][$charset_cible])) { $trans[$charset][$charset_cible] = array( - $p.chr(128) => "€", - $p.chr(129) => ' ', # pas affecte - $p.chr(130) => "‚", - $p.chr(131) => "ƒ", - $p.chr(132) => "„", - $p.chr(133) => "…", - $p.chr(134) => "†", - $p.chr(135) => "‡", - $p.chr(136) => "ˆ", - $p.chr(137) => "‰", - $p.chr(138) => "Š", - $p.chr(139) => "‹", - $p.chr(140) => "Œ", - $p.chr(141) => ' ', # pas affecte - $p.chr(142) => "Ž", - $p.chr(143) => ' ', # pas affecte - $p.chr(144) => ' ', # pas affecte - $p.chr(145) => "‘", - $p.chr(146) => "’", - $p.chr(147) => "“", - $p.chr(148) => "”", - $p.chr(149) => "•", - $p.chr(150) => "–", - $p.chr(151) => "—", - $p.chr(152) => "˜", - $p.chr(153) => "™", - $p.chr(154) => "š", - $p.chr(155) => "›", - $p.chr(156) => "œ", - $p.chr(157) => ' ', # pas affecte - $p.chr(158) => "ž", - $p.chr(159) => "Ÿ", + $p . chr(128) => "€", + $p . chr(129) => ' ', # pas affecte + $p . chr(130) => "‚", + $p . chr(131) => "ƒ", + $p . chr(132) => "„", + $p . chr(133) => "…", + $p . chr(134) => "†", + $p . chr(135) => "‡", + $p . chr(136) => "ˆ", + $p . chr(137) => "‰", + $p . chr(138) => "Š", + $p . chr(139) => "‹", + $p . chr(140) => "Œ", + $p . chr(141) => ' ', # pas affecte + $p . chr(142) => "Ž", + $p . chr(143) => ' ', # pas affecte + $p . chr(144) => ' ', # pas affecte + $p . chr(145) => "‘", + $p . chr(146) => "’", + $p . chr(147) => "“", + $p . chr(148) => "”", + $p . chr(149) => "•", + $p . chr(150) => "–", + $p . chr(151) => "—", + $p . chr(152) => "˜", + $p . chr(153) => "™", + $p . chr(154) => "š", + $p . chr(155) => "›", + $p . chr(156) => "œ", + $p . chr(157) => ' ', # pas affecte + $p . chr(158) => "ž", + $p . chr(159) => "Ÿ", ); - if ($charset_cible!='unicode'){ - foreach($trans[$charset][$charset_cible] as $k=>$c) + if ($charset_cible != 'unicode') { + foreach ($trans[$charset][$charset_cible] as $k => $c) { $trans[$charset][$charset_cible][$k] = unicode2charset($c, $charset_cible); + } } } return @str_replace(array_keys($trans[$charset][$charset_cible]), - array_values($trans[$charset][$charset_cible]),$texte); + array_values($trans[$charset][$charset_cible]), $texte); } - /** * Transforme les entités HTML en unicode * @@ -286,9 +314,11 @@ function corriger_caracteres_windows($texte, $charset = 'AUTO', $charset_cible = * true pour *ne pas convertir* les caracteres malins < & etc. * @return string * Texte converti -**/ + **/ function html2unicode($texte, $secure = false) { - if (strpos($texte,'&') === false) return $texte; + if (strpos($texte, '&') === false) { + return $texte; + } static $trans = array(); if (!$trans) { load_charset('html'); @@ -297,12 +327,13 @@ function html2unicode($texte, $secure = false) { } } - if ($secure) - return str_replace(array_keys($trans),array_values($trans),$texte); - else - return str_replace(array('&', '"', '<', '>'),array('&', '"', '<', '>'), - str_replace(array_keys($trans),array_values($trans),$texte) + if ($secure) { + return str_replace(array_keys($trans), array_values($trans), $texte); + } else { + return str_replace(array('&', '"', '<', '>'), array('&', '"', '<', '>'), + str_replace(array_keys($trans), array_values($trans), $texte) ); + } } @@ -315,17 +346,18 @@ function html2unicode($texte, $secure = false) { * Texte à convertir * @return string * Texte converti -**/ + **/ function mathml2unicode($texte) { static $trans; if (!$trans) { load_charset('mathml'); - foreach ($GLOBALS['CHARSET']['mathml'] as $key => $val) + foreach ($GLOBALS['CHARSET']['mathml'] as $key => $val) { $trans["&$key;"] = $val; + } } - return str_replace(array_keys($trans),array_values($trans),$texte); + return str_replace(array_keys($trans), array_values($trans), $texte); } @@ -345,7 +377,7 @@ function mathml2unicode($texte) { * Par défaut (AUTO), le charset est celui du site. * @return string * Texte converti en unicode -**/ + **/ function charset2unicode($texte, $charset = 'AUTO' /* $forcer: obsolete*/) { static $trans; @@ -353,51 +385,62 @@ function charset2unicode($texte, $charset = 'AUTO' /* $forcer: obsolete*/) { $charset = lire_config('charset', _DEFAULT_CHARSET); } - if ($charset == '') $charset = 'iso-8859-1'; + if ($charset == '') { + $charset = 'iso-8859-1'; + } $charset = strtolower($charset); switch ($charset) { - case 'utf-8': - case 'utf8': - return utf_8_to_unicode($texte); + case 'utf-8': + case 'utf8': + return utf_8_to_unicode($texte); - case 'iso-8859-1': - $texte = corriger_caracteres_windows($texte, 'iso-8859-1'); + case 'iso-8859-1': + $texte = corriger_caracteres_windows($texte, 'iso-8859-1'); // pas de break; ici, on suit sur default: - default: - // mbstring presente ? - if (init_mb_string()) { - if ($order = mb_detect_order() # mb_string connait-il $charset? - AND mb_detect_order($charset)) { - $s = mb_convert_encoding($texte, 'utf-8', $charset); - if ($s && $s != $texte) return utf_8_to_unicode($s); + default: + // mbstring presente ? + if (init_mb_string()) { + if ($order = mb_detect_order() # mb_string connait-il $charset? + AND mb_detect_order($charset) + ) { + $s = mb_convert_encoding($texte, 'utf-8', $charset); + if ($s && $s != $texte) { + return utf_8_to_unicode($s); + } + } + mb_detect_order($order); # remettre comme precedemment } - mb_detect_order($order); # remettre comme precedemment - } - // Sinon, peut-etre connaissons-nous ce charset ? - if (!isset($trans[$charset])) { - if ($cset = load_charset($charset) - AND is_array($GLOBALS['CHARSET'][$cset])) - foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) { - $trans[$charset][chr($key)] = '&#'.$val.';'; + // Sinon, peut-etre connaissons-nous ce charset ? + if (!isset($trans[$charset])) { + if ($cset = load_charset($charset) + AND is_array($GLOBALS['CHARSET'][$cset]) + ) { + foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) { + $trans[$charset][chr($key)] = '&#' . $val . ';'; + } + } + } + if (count($trans[$charset])) { + return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte); } - } - if (count($trans[$charset])) - return str_replace(array_keys($trans[$charset]),array_values($trans[$charset]),$texte); - - // Sinon demander a iconv (malgre le fait qu'il coupe quand un - // caractere n'appartient pas au charset, mais c'est un probleme - // surtout en utf-8, gere ci-dessus) - if (test_iconv()) { - $s = iconv($charset, 'utf-32le', $texte); - if ($s) return utf_32_to_unicode($s); - } - // Au pire ne rien faire - spip_log("erreur charset '$charset' non supporte"); - return $texte; + // Sinon demander a iconv (malgre le fait qu'il coupe quand un + // caractere n'appartient pas au charset, mais c'est un probleme + // surtout en utf-8, gere ci-dessus) + if (test_iconv()) { + $s = iconv($charset, 'utf-32le', $texte); + if ($s) { + return utf_32_to_unicode($s); + } + } + + // Au pire ne rien faire + spip_log("erreur charset '$charset' non supporte"); + + return $texte; } } @@ -415,7 +458,7 @@ function charset2unicode($texte, $charset = 'AUTO' /* $forcer: obsolete*/) { * Par défaut (AUTO), le charset sera celui du site. * @return string * Texte transformé dans le charset souhaité -**/ + **/ function unicode2charset($texte, $charset = 'AUTO') { static $CHARSET_REVERSE; static $trans = array(); @@ -424,36 +467,36 @@ function unicode2charset($texte, $charset = 'AUTO') { $charset = lire_config('charset', _DEFAULT_CHARSET); } - switch($charset) { - case 'utf-8': - return unicode_to_utf_8($texte); - break; + switch ($charset) { + case 'utf-8': + return unicode_to_utf_8($texte); + break; - default: - $charset = load_charset($charset); + default: + $charset = load_charset($charset); - if (!is_array($CHARSET_REVERSE[$charset])) { - $CHARSET_REVERSE[$charset] = array_flip($GLOBALS['CHARSET'][$charset]); - } + if (!is_array($CHARSET_REVERSE[$charset])) { + $CHARSET_REVERSE[$charset] = array_flip($GLOBALS['CHARSET'][$charset]); + } - if (!isset($trans[$charset])){ - $trans[$charset]=array(); - $t = &$trans[$charset]; - for($e=128;$e<255;$e++){ - $h = dechex($e); - if ($s = isset($CHARSET_REVERSE[$charset][$e])){ - $s = $CHARSET_REVERSE[$charset][$e]; - $t['&#'.$e.';'] = $t['�'.$e.';'] = $t['�'.$e.';'] = chr($s); - $t['&#x'.$h.';'] = $t['�'.$h.';'] = $t['�'.$h.';'] = chr($s); - } - else{ - $t['&#'.$e.';'] = $t['�'.$e.';'] = $t['�'.$e.';'] = chr($e); - $t['&#x'.$h.';'] = $t['�'.$h.';'] = $t['�'.$h.';'] = chr($e); + if (!isset($trans[$charset])) { + $trans[$charset] = array(); + $t = &$trans[$charset]; + for ($e = 128; $e < 255; $e++) { + $h = dechex($e); + if ($s = isset($CHARSET_REVERSE[$charset][$e])) { + $s = $CHARSET_REVERSE[$charset][$e]; + $t['&#' . $e . ';'] = $t['�' . $e . ';'] = $t['�' . $e . ';'] = chr($s); + $t['&#x' . $h . ';'] = $t['�' . $h . ';'] = $t['�' . $h . ';'] = chr($s); + } else { + $t['&#' . $e . ';'] = $t['�' . $e . ';'] = $t['�' . $e . ';'] = chr($e); + $t['&#x' . $h . ';'] = $t['�' . $h . ';'] = $t['�' . $h . ';'] = chr($e); + } } } - } - $texte = str_replace(array_keys($trans[$charset]),array_values($trans[$charset]),$texte); - return $texte; + $texte = str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte); + + return $texte; } } @@ -470,15 +513,16 @@ function unicode2charset($texte, $charset = 'AUTO') { * Par défaut (AUTO), le charset d'origine est celui du site. * @return string * Texte transformé dans le charset site -**/ + **/ function importer_charset($texte, $charset = 'AUTO') { static $trans = array(); // on traite le cas le plus frequent iso-8859-1 vers utf directement pour aller plus vite ! - if (($charset == 'iso-8859-1') && ($GLOBALS['meta']['charset']=='utf-8')){ - $texte = corriger_caracteres_windows($texte, 'iso-8859-1',$GLOBALS['meta']['charset']); + if (($charset == 'iso-8859-1') && ($GLOBALS['meta']['charset'] == 'utf-8')) { + $texte = corriger_caracteres_windows($texte, 'iso-8859-1', $GLOBALS['meta']['charset']); if (init_mb_string()) { if ($order = mb_detect_order() # mb_string connait-il $charset? - AND mb_detect_order($charset)) { + AND mb_detect_order($charset) + ) { $s = mb_convert_encoding($texte, 'utf-8', $charset); } mb_detect_order($order); # remettre comme precedemment @@ -487,15 +531,20 @@ function importer_charset($texte, $charset = 'AUTO') { // Sinon, peut-etre connaissons-nous ce charset ? if (!isset($trans[$charset])) { if ($cset = load_charset($charset) - AND is_array($GLOBALS['CHARSET'][$cset])) + AND is_array($GLOBALS['CHARSET'][$cset]) + ) { foreach ($GLOBALS['CHARSET'][$cset] as $key => $val) { - $trans[$charset][chr($key)] = unicode2charset('&#'.$val.';'); + $trans[$charset][chr($key)] = unicode2charset('&#' . $val . ';'); + } } } - if (count($trans[$charset])) - return str_replace(array_keys($trans[$charset]),array_values($trans[$charset]),$texte); + if (count($trans[$charset])) { + return str_replace(array_keys($trans[$charset]), array_values($trans[$charset]), $texte); + } + return $texte; } + return unicode2charset(charset2unicode($texte, $charset)); } @@ -504,17 +553,18 @@ function importer_charset($texte, $charset = 'AUTO') { * Transforme un texte UTF-8 en unicode * * Utilise la librairie mb si présente - * + * * @param string $source * Texte UTF-8 à transformer * @return string * Texte transformé en unicode -**/ + **/ function utf_8_to_unicode($source) { // mb_string : methode rapide if (init_mb_string()) { $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF); + return mb_encode_numericentity($source, $convmap, 'UTF-8'); } @@ -544,56 +594,58 @@ function utf_8_to_unicode($source) { } $pos = 0; - $len = strlen ($source); + $len = strlen($source); $encodedString = ''; while ($pos < $len) { $char = ''; $ischar = false; - $asciiPos = ord (substr ($source, $pos, 1)); + $asciiPos = ord(substr($source, $pos, 1)); if (($asciiPos >= 240) && ($asciiPos <= 255)) { // 4 chars representing one unicode character - $thisLetter = substr ($source, $pos, 4); + $thisLetter = substr($source, $pos, 4); $pos += 4; - } - else if (($asciiPos >= 224) && ($asciiPos <= 239)) { - // 3 chars representing one unicode character - $thisLetter = substr ($source, $pos, 3); - $pos += 3; - } - else if (($asciiPos >= 192) && ($asciiPos <= 223)) { - // 2 chars representing one unicode character - $thisLetter = substr ($source, $pos, 2); - $pos += 2; - } - else { - // 1 char (lower ascii) - $thisLetter = substr ($source, $pos, 1); - $pos += 1; - $char = $thisLetter; - $ischar = true; + } else { + if (($asciiPos >= 224) && ($asciiPos <= 239)) { + // 3 chars representing one unicode character + $thisLetter = substr($source, $pos, 3); + $pos += 3; + } else { + if (($asciiPos >= 192) && ($asciiPos <= 223)) { + // 2 chars representing one unicode character + $thisLetter = substr($source, $pos, 2); + $pos += 2; + } else { + // 1 char (lower ascii) + $thisLetter = substr($source, $pos, 1); + $pos += 1; + $char = $thisLetter; + $ischar = true; + } + } } - if ($ischar) + if ($ischar) { $encodedString .= $char; - else { // process the string representing the letter to a unicode entity - $thisLen = strlen ($thisLetter); + } else { // process the string representing the letter to a unicode entity + $thisLen = strlen($thisLetter); $thisPos = 0; $decimalCode = 0; while ($thisPos < $thisLen) { - $thisCharOrd = ord (substr ($thisLetter, $thisPos, 1)); + $thisCharOrd = ord(substr($thisLetter, $thisPos, 1)); if ($thisPos == 0) { - $charNum = intval ($thisCharOrd - $decrement[$thisLen]); + $charNum = intval($thisCharOrd-$decrement[$thisLen]); $decimalCode += ($charNum << $shift[$thisLen][$thisPos]); } else { - $charNum = intval ($thisCharOrd - 128); + $charNum = intval($thisCharOrd-128); $decimalCode += ($charNum << $shift[$thisLen][$thisPos]); } $thisPos++; } - $encodedLetter = "&#". preg_replace('/^0+/', '', $decimalCode) . ';'; + $encodedLetter = "&#" . preg_replace('/^0+/', '', $decimalCode) . ';'; $encodedString .= $encodedLetter; } } + return $encodedString; } @@ -605,18 +657,19 @@ function utf_8_to_unicode($source) { * * Mais on l'optimise quand meme par mb_string * => tout ca sera osolete quand on sera surs d'avoir mb_string - * + * * @param string $source * Texte UTF-8 à transformer * @return string * Texte transformé en unicode -**/ + **/ function utf_32_to_unicode($source) { // mb_string : methode rapide if (init_mb_string()) { $convmap = array(0x7F, 0xFFFFFF, 0x0, 0xFFFFFF); $source = mb_encode_numericentity($source, $convmap, 'UTF-32LE'); + return str_replace(chr(0), '', $source); } @@ -626,13 +679,17 @@ function utf_32_to_unicode($source) { $words = unpack("V*", substr($source, 0, 1024)); $source = substr($source, 1024); foreach ($words as $word) { - if ($word < 128) + if ($word < 128) { $texte .= chr($word); - // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html - else if ($word != 65279) - $texte .= '&#'.$word.';'; + } // ignorer le BOM - http://www.unicode.org/faq/utf_bom.html + else { + if ($word != 65279) { + $texte .= '&#' . $word . ';'; + } + } } } + return $texte; } @@ -640,116 +697,132 @@ function utf_32_to_unicode($source) { /** * Transforme un numéro unicode en caractère utf-8 - * + * * Ce bloc provient de php.net + * * @author Ronen - * + * * @param int $num * Numéro de l'entité unicode * @return char * Caractère utf8 si trouvé, '' sinon -**/ + **/ function caractere_utf_8($num) { $num = intval($num); - if($num<128) + if ($num < 128) { return chr($num); - if($num<2048) - return chr(($num>>6)+192).chr(($num&63)+128); - if($num<65536) - return chr(($num>>12)+224).chr((($num>>6)&63)+128).chr(($num&63)+128); - if($num<1114112) - return chr(($num>>18)+240).chr((($num>>12)&63)+128).chr((($num>>6)&63)+128). chr(($num&63)+128); + } + if ($num < 2048) { + return chr(($num >> 6)+192) . chr(($num & 63)+128); + } + if ($num < 65536) { + return chr(($num >> 12)+224) . chr((($num >> 6) & 63)+128) . chr(($num & 63)+128); + } + if ($num < 1114112) { + return chr(($num >> 18)+240) . chr((($num >> 12) & 63)+128) . chr((($num >> 6) & 63)+128) . chr(($num & 63)+128); + } + return ''; } /** * Convertit un texte unicode en utf-8 - * + * * @param string $texte * Texte à convertir * @return string * Texte converti -**/ + **/ function unicode_to_utf_8($texte) { // 1. Entites € et suivantes $vu = array(); if (preg_match_all(',�*([1-9][0-9][0-9]+);,S', - $texte, $regs, PREG_SET_ORDER)) - foreach ($regs as $reg) { - if ($reg[1]>127 AND !isset($vu[$reg[0]])) - $vu[$reg[0]] = caractere_utf_8($reg[1]); + $texte, $regs, PREG_SET_ORDER)) { + foreach ($regs as $reg) { + if ($reg[1] > 127 AND !isset($vu[$reg[0]])) { + $vu[$reg[0]] = caractere_utf_8($reg[1]); + } + } } //$texte = str_replace(array_keys($vu), array_values($vu), $texte); // 2. Entites > ÿ //$vu = array(); if (preg_match_all(',�*([1-9a-f][0-9a-f][0-9a-f]+);,iS', - $texte, $regs, PREG_SET_ORDER)) - foreach ($regs as $reg) { - if (!isset($vu[$reg[0]])) - $vu[$reg[0]] = caractere_utf_8(hexdec($reg[1])); + $texte, $regs, PREG_SET_ORDER)) { + foreach ($regs as $reg) { + if (!isset($vu[$reg[0]])) { + $vu[$reg[0]] = caractere_utf_8(hexdec($reg[1])); + } + } } + return str_replace(array_keys($vu), array_values($vu), $texte); } /** * Convertit les unicode Ĉ en javascript \u0108 - * + * * @param string $texte * Texte à convertir * @return string * Texte converti -**/ + **/ function unicode_to_javascript($texte) { $vu = array(); while (preg_match(',�*([0-9]+);,S', $texte, $regs) AND !isset($vu[$regs[1]])) { $num = $regs[1]; $vu[$num] = true; - $s = '\u'.sprintf("%04x", $num); + $s = '\u' . sprintf("%04x", $num); $texte = str_replace($regs[0], $s, $texte); } + return $texte; } /** * Convertit les %uxxxx (envoyés par javascript) en &#yyy unicode - * + * * @param string $texte * Texte à convertir * @return string * Texte converti -**/ -function javascript_to_unicode ($texte) { - while (preg_match(",%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F]),", $texte, $regs)) - $texte = str_replace($regs[0],"&#".hexdec($regs[1]).";", $texte); + **/ +function javascript_to_unicode($texte) { + while (preg_match(",%u([0-9A-F][0-9A-F][0-9A-F][0-9A-F]),", $texte, $regs)) { + $texte = str_replace($regs[0], "&#" . hexdec($regs[1]) . ";", $texte); + } + return $texte; } /** * Convertit les %E9 (envoyés par le browser) en chaîne du charset du site (binaire) - * + * * @param string $texte * Texte à convertir * @return string * Texte converti -**/ -function javascript_to_binary ($texte) { - while (preg_match(",%([0-9A-F][0-9A-F]),", $texte, $regs)) - $texte = str_replace($regs[0],chr(hexdec($regs[1])), $texte); + **/ +function javascript_to_binary($texte) { + while (preg_match(",%([0-9A-F][0-9A-F]),", $texte, $regs)) { + $texte = str_replace($regs[0], chr(hexdec($regs[1])), $texte); + } + return $texte; } /** * Substition rapide de chaque graphème selon le charset sélectionné. - * + * * @uses caractere_utf_8() - * + * * @global array $CHARSET * @staticvar array $trans - * + * * @param string $texte * @param string $charset * @param string $complexe @@ -757,34 +830,37 @@ function javascript_to_binary ($texte) { */ function translitteration_rapide($texte, $charset = 'AUTO', $complexe = '') { static $trans; - if ($charset == 'AUTO') + if ($charset == 'AUTO') { $charset = $GLOBALS['meta']['charset']; - if (!strlen($texte)) + } + if (!strlen($texte)) { return $texte; + } - $table_translit ='translit'.$complexe; + $table_translit = 'translit' . $complexe; // 2. Translitterer grace a la table predefinie if (!$trans[$complexe]) { load_charset($table_translit); - foreach ($GLOBALS['CHARSET'][$table_translit] as $key => $val) + foreach ($GLOBALS['CHARSET'][$table_translit] as $key => $val) { $trans[$complexe][caractere_utf_8($key)] = $val; + } } - return str_replace(array_keys($trans[$complexe]),array_values($trans[$complexe]),$texte); + return str_replace(array_keys($trans[$complexe]), array_values($trans[$complexe]), $texte); } /** * Translittération charset => ascii (pour l'indexation) - * + * * Attention les caractères non reconnus sont renvoyés en utf-8 - * + * * @uses corriger_caracteres() * @uses unicode_to_utf_8() * @uses html2unicode() * @uses charset2unicode() * @uses translitteration_rapide() - * + * * @param string $texte * @param string $charset * @param string $complexe @@ -798,7 +874,7 @@ function translitteration($texte, $charset = 'AUTO', $complexe = '') { // 1. Passer le charset et les é en utf-8 $texte = unicode_to_utf_8(html2unicode(charset2unicode($texte, $charset, true))); - return translitteration_rapide($texte,$charset,$complexe); + return translitteration_rapide($texte, $charset, $complexe); } /** @@ -806,14 +882,14 @@ function translitteration($texte, $charset = 'AUTO', $complexe = '') { * * `à` est retourné sous la forme ``a` `` et pas `à ` * mais si `$chiffre=true`, on retourne `a8` (vietnamien) - * + * * @uses translitteration() * @param string $texte * @param bool $chiffres * @return string */ function translitteration_complexe($texte, $chiffres = false) { - $texte = translitteration($texte,'AUTO','complexe'); + $texte = translitteration($texte, 'AUTO', 'complexe'); if ($chiffres) { $texte = preg_replace("/[aeiuoyd]['`?~.^+(-]{1,2}/eS", @@ -822,11 +898,12 @@ function translitteration_complexe($texte, $chiffres = false) { return $texte; } + /** * Translittération chiffrée - * + * * Remplace des caractères dans une chaîne par des chiffres - * + * * @param string $car * @return string */ @@ -842,52 +919,52 @@ function translitteration_chiffree($car) { * Texte dont on vérifie la présence du BOM * @return bool * true s'il a un BOM -**/ + **/ function bom_utf8($texte) { - return (substr($texte, 0,3) == chr(0xEF).chr(0xBB).chr(0xBF)); + return (substr($texte, 0, 3) == chr(0xEF) . chr(0xBB) . chr(0xBF)); } /** * Vérifie qu'une chaîne est en utf-8 valide - * + * * Note: preg_replace permet de contourner un "stack overflow" sur PCRE - * + * * @link http://us2.php.net/manual/fr/function.mb-detect-encoding.php#50087 * @link http://w3.org/International/questions/qa-forms-utf-8.html - * + * * @param string $string * Texte dont on vérifie qu'il est de l'utf-8 * @return bool * true si c'est le cas -**/ + **/ function is_utf8($string) { return !strlen( - preg_replace( - ',[\x09\x0A\x0D\x20-\x7E]' # ASCII - . '|[\xC2-\xDF][\x80-\xBF]' # non-overlong 2-byte - . '|\xE0[\xA0-\xBF][\x80-\xBF]' # excluding overlongs - . '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' # straight 3-byte - . '|\xED[\x80-\x9F][\x80-\xBF]' # excluding surrogates - . '|\xF0[\x90-\xBF][\x80-\xBF]{2}' # planes 1-3 - . '|[\xF1-\xF3][\x80-\xBF]{3}' # planes 4-15 - . '|\xF4[\x80-\x8F][\x80-\xBF]{2}' # plane 16 - . ',sS', - '', $string)); + preg_replace( + ',[\x09\x0A\x0D\x20-\x7E]' # ASCII + . '|[\xC2-\xDF][\x80-\xBF]' # non-overlong 2-byte + . '|\xE0[\xA0-\xBF][\x80-\xBF]' # excluding overlongs + . '|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}' # straight 3-byte + . '|\xED[\x80-\x9F][\x80-\xBF]' # excluding surrogates + . '|\xF0[\x90-\xBF][\x80-\xBF]{2}' # planes 1-3 + . '|[\xF1-\xF3][\x80-\xBF]{3}' # planes 4-15 + . '|\xF4[\x80-\x8F][\x80-\xBF]{2}' # plane 16 + . ',sS', + '', $string)); } /** * Vérifie qu'une chaîne est en ascii valide - * + * * @param string $string * Texte dont on vérifie qu'il est de l'ascii * @return bool * true si c'est le cas -**/ + **/ function is_ascii($string) { return !strlen( - preg_replace( - ',[\x09\x0A\x0D\x20-\x7E],sS', - '', $string)); + preg_replace( + ',[\x09\x0A\x0D\x20-\x7E],sS', + '', $string)); } /** @@ -903,7 +980,7 @@ function is_ascii($string) { * Éventuels headers HTTP liés à cette page * @return string * Texte transcodé dans le charset du site -**/ + **/ function transcoder_page($texte, $headers = '') { // Si tout est < 128 pas la peine d'aller plus loin @@ -915,36 +992,45 @@ function transcoder_page($texte, $headers = '') { // Reconnaitre le BOM utf-8 (0xEFBBBF) if (bom_utf8($texte)) { $charset = 'utf-8'; - $texte = substr($texte,3); + $texte = substr($texte, 3); + } // charset precise par le contenu (xml) + else { + if (preg_match( + ',<[?]xml[^>]*encoding[^>]*=[^>]*([-_a-z0-9]+?),UimsS', $texte, $regs)) { + $charset = trim(strtolower($regs[1])); + } // charset precise par le contenu (html) + else { + if (preg_match( + ',<(meta|html|body)[^>]*charset[^>]*=[^>]*([-_a-z0-9]+?),UimsS', + $texte, $regs) + # eviter #CHARSET des squelettes + AND (($tmp = trim(strtolower($regs[2]))) != 'charset') + ) { + $charset = $tmp; + } // charset de la reponse http + else { + if (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs)) { + $charset = trim(strtolower($regs[1])); + } else { + $charset = ''; + } + } + } } - - // charset precise par le contenu (xml) - else if (preg_match( - ',<[?]xml[^>]*encoding[^>]*=[^>]*([-_a-z0-9]+?),UimsS', $texte, $regs)) - $charset = trim(strtolower($regs[1])); - // charset precise par le contenu (html) - else if (preg_match( - ',<(meta|html|body)[^>]*charset[^>]*=[^>]*([-_a-z0-9]+?),UimsS', - $texte, $regs) - # eviter #CHARSET des squelettes - AND (($tmp = trim(strtolower($regs[2]))) != 'charset')) - $charset = $tmp; - // charset de la reponse http - else if (preg_match(',charset=([-_a-z0-9]+),i', $headers, $regs)) - $charset = trim(strtolower($regs[1])); - else $charset = ''; // normaliser les noms du shif-jis japonais - if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset)) + if (preg_match(',^(x|shift)[_-]s?jis$,i', $charset)) { $charset = 'shift-jis'; + } if ($charset) { spip_log("charset: $charset"); } else { // valeur par defaut - if (is_utf8($texte)) + if (is_utf8($texte)) { $charset = 'utf-8'; - else + } else { $charset = 'iso-8859-1'; + } spip_log("charset probable: $charset"); } @@ -964,28 +1050,30 @@ function transcoder_page($texte, $headers = '') { * @link http://fr.php.net/manual/fr/function.mb-substr.php * @link http://www.php.net/manual/fr/function.substr.php * @uses spip_substr_manuelle() si les fonctions php mb sont absentes - * - * @param string $c Le texte - * @param int $start Début - * @param null|int $length Longueur ou fin + * + * @param string $c Le texte + * @param int $start Début + * @param null|int $length Longueur ou fin * @return string * Le texte coupé -**/ -function spip_substr($c, $start = 0, $length = NULL) { + **/ +function spip_substr($c, $start = 0, $length = null) { // Si ce n'est pas utf-8, utiliser substr if ($GLOBALS['meta']['charset'] != 'utf-8') { - if ($length) + if ($length) { return substr($c, $start, $length); - else + } else { substr($c, $start); + } } // Si utf-8, voir si on dispose de mb_string if (init_mb_string()) { - if ($length) + if ($length) { return mb_substr($c, $start, $length); - else + } else { return mb_substr($c, $start); + } } // Version manuelle (cf. ci-dessous) @@ -999,36 +1087,44 @@ function spip_substr($c, $start = 0, $length = NULL) { * Version manuelle de substr utf8, pour php vieux et/ou mal installe * * @link http://fr.php.net/manual/fr/function.mb-substr.php - * - * @param string $c Le texte - * @param int $start Début - * @param null|int $length Longueur ou fin + * + * @param string $c Le texte + * @param int $start Début + * @param null|int $length Longueur ou fin * @return string * Le texte coupé -**/ -function spip_substr_manuelle($c, $start, $length = NULL) { + **/ +function spip_substr_manuelle($c, $start, $length = null) { // Cas pathologique - if ($length === 0) + if ($length === 0) { return ''; + } // S'il y a un demarrage, on se positionne - if ($start > 0) + if ($start > 0) { $c = substr($c, strlen(spip_substr_manuelle($c, 0, $start))); - elseif ($start < 0) + } elseif ($start < 0) { return spip_substr_manuelle($c, spip_strlen($c)+$start, $length); + } - if (!$length) + if (!$length) { return $c; + } if ($length > 0) { // on prend n fois la longueur desiree, pour etre surs d'avoir tout // (un caractere utf-8 prenant au maximum n bytes) - $n = 0; while (preg_match(',[\x80-\xBF]{'.(++$n).'},', $c)); + $n = 0; + while (preg_match(',[\x80-\xBF]{' . (++$n) . '},', $c)) { + ; + } $c = substr($c, 0, $n*$length); // puis, tant qu'on est trop long, on coupe... - while (($l = spip_strlen($c)) > $length) - $c = substr($c, 0, $length - $l); + while (($l = spip_strlen($c)) > $length) { + $c = substr($c, 0, $length-$l); + } + return $c; } @@ -1038,31 +1134,34 @@ function spip_substr_manuelle($c, $start, $length = NULL) { /** * Rend majuscule le premier caractère d'une chaîne utf-8 - * + * * Version utf-8 d'ucfirst - * + * * @param string $c * La chaîne à transformer * @return string - * La chaîne avec une majuscule sur le premier mot + * La chaîne avec une majuscule sur le premier mot */ -function spip_ucfirst($c){ +function spip_ucfirst($c) { // Si ce n'est pas utf-8, utiliser ucfirst - if ($GLOBALS['meta']['charset'] != 'utf-8') + if ($GLOBALS['meta']['charset'] != 'utf-8') { return ucfirst($c); + } // Si on n'a pas mb_* on utilise ucfirst - if (!init_mb_string()) + if (!init_mb_string()) { return ucfirst($c); + } - $lettre1 = mb_strtoupper(spip_substr($c,0,1)); - return $lettre1.spip_substr($c,1); + $lettre1 = mb_strtoupper(spip_substr($c, 0, 1)); + + return $lettre1 . spip_substr($c, 1); } /** * Retourne la longueur d'une chaîne utf-8 - * + * * Version utf-8 de strlen - * + * * @param string $c * La chaîne à compter * @return int @@ -1073,12 +1172,14 @@ function spip_strlen($c) { $c = str_replace("\r\n", "\n", $c); // Si ce n'est pas utf-8, utiliser strlen - if ($GLOBALS['meta']['charset'] != 'utf-8') + if ($GLOBALS['meta']['charset'] != 'utf-8') { return strlen($c); + } // Sinon, utiliser mb_strlen() si disponible - if (init_mb_string()) + if (init_mb_string()) { return mb_strlen($c); + } // Methode manuelle : on supprime les bytes 10......, // on compte donc les ascii (0.......) et les demarrages @@ -1093,12 +1194,13 @@ $GLOBALS['CHARSET'] = Array(); // dans les preg_replace pour ne pas casser certaines lettres accentuees : // en utf-8 chr(195).chr(160) = a` alors qu'en iso-latin chr(160) = nbsp if (!isset($GLOBALS['meta']['pcre_u']) - OR (isset($_GET['var_mode']) AND !isset($_GET['var_profile']))) { + OR (isset($_GET['var_mode']) AND !isset($_GET['var_profile'])) +) { include_spip('inc/meta'); ecrire_meta('pcre_u', $u = (lire_config('charset', _DEFAULT_CHARSET) - AND test_pcre_unicode()) - ? 'u' :'' + AND test_pcre_unicode()) + ? 'u' : '' ); } @@ -1107,7 +1209,7 @@ if (!isset($GLOBALS['meta']['pcre_u']) * Transforme une chaîne utf-8 en utf-8 sans "planes" * ce qui permet de la donner à MySQL "utf8", qui n'est pas un utf-8 complet * L'alternative serait d'utiliser utf8mb4 - * + * * @param string $x * La chaîne à transformer * @return string @@ -1121,11 +1223,12 @@ function utf8_noplanes($x) { | \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16 )/xS'; if (preg_match_all($regexp_utf8_4bytes, $x, $z, PREG_PATTERN_ORDER)) { - foreach($z[0] as $k) { + foreach ($z[0] as $k) { $ku = utf_8_to_unicode($k); $x = str_replace($k, $ku, $x); } } + return $x; } diff --git a/ecrire/inc/chercher_logo.php b/ecrire/inc/chercher_logo.php index d8f56d3f38..25c17265b4 100644 --- a/ecrire/inc/chercher_logo.php +++ b/ecrire/inc/chercher_logo.php @@ -14,15 +14,17 @@ * Recherche de logo * * @package SPIP\Core\Logos -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Cherche le logo d'un élément d'objet * * @global formats_logos Extensions possibles des logos * @uses type_du_logo() - * + * * @param int $id * Identifiant de l'objet * @param string $_id_objet @@ -32,7 +34,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return array * - Liste (chemin complet du fichier, répertoire de logos, nom du logo, extension du logo, date de modification) * - array vide aucun logo trouvé. -**/ + **/ function inc_chercher_logo_dist($id, $_id_objet, $mode = 'on') { # attention au cas $id = '0' pour LOGO_SITE_SPIP : utiliser intval() @@ -44,6 +46,7 @@ function inc_chercher_logo_dist($id, $_id_objet, $mode = 'on') { return array($d, _DIR_LOGOS, $nom, $format, @filemtime($d)); } } + # coherence de type pour servir comme filtre (formulaire_login) return array(); } @@ -56,22 +59,22 @@ function inc_chercher_logo_dist($id, $_id_objet, $mode = 'on') { * déclarées par la globale `$table_logos` * * @global table_logos Exceptions des types de logo - * + * * @param string $_id_objet * Nom de la clé primaire de l'objet * @return string * Type du logo -**/ + **/ function type_du_logo($_id_objet) { return isset($GLOBALS['table_logos'][$_id_objet]) ? $GLOBALS['table_logos'][$_id_objet] - : objet_type(preg_replace(',^id_,','',$_id_objet)); + : objet_type(preg_replace(',^id_,', '', $_id_objet)); } // Exceptions standards (historique) $GLOBALS['table_logos'] = array( - 'id_article' => 'art', - 'id_auteur' => 'aut', + 'id_article' => 'art', + 'id_auteur' => 'aut', 'id_rubrique' => 'rub', 'id_groupe' => 'groupe', ); diff --git a/ecrire/inc/chercher_rubrique.php b/ecrire/inc/chercher_rubrique.php index 7f35fae14d..a34cda2d78 100644 --- a/ecrire/inc/chercher_rubrique.php +++ b/ecrire/inc/chercher_rubrique.php @@ -15,9 +15,11 @@ * dans une hiérarchie de rubriques * * @package SPIP\Core\Rubriques -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} define('_SPIP_SELECT_RUBRIQUES', 20); /* mettre 100000 pour desactiver ajax */ @@ -27,7 +29,7 @@ define('_SPIP_SELECT_RUBRIQUES', 20); /* mettre 100000 pour desactiver ajax */ * * @uses selecteur_rubrique_html() * @uses selecteur_rubrique_ajax() - * + * * @param int $id_rubrique * Identifiant de rubrique courante (0 si NEW) * @param string $type @@ -45,20 +47,23 @@ define('_SPIP_SELECT_RUBRIQUES', 20); /* mettre 100000 pour desactiver ajax */ * Type d'action * @return string * Code HTML du sélecteur -**/ -function inc_chercher_rubrique_dist ($id_rubrique, $type, $restreint, $idem = 0, $do = 'aff') { - if (sql_countsel('spip_rubriques')<1) + **/ +function inc_chercher_rubrique_dist($id_rubrique, $type, $restreint, $idem = 0, $do = 'aff') { + if (sql_countsel('spip_rubriques') < 1) { return ''; + } // Mode sans Ajax : // - soit parce que le cookie ajax n'est pas la // - soit parce qu'il y a peu de rubriques if (_SPIP_AJAX < 1 - OR $type == 'breve' - OR sql_countsel('spip_rubriques') < _SPIP_SELECT_RUBRIQUES) + OR $type == 'breve' + OR sql_countsel('spip_rubriques') < _SPIP_SELECT_RUBRIQUES + ) { return selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem); - - else return selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem, $do); + } else { + return selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem, $do); + } } @@ -73,29 +78,32 @@ $GLOBALS['selecteur_rubrique'] = 'inc_chercher_rubrique_dist'; * Profondeur de la rubrique * @return array * Liste (classe CSS, styles en ligne, Espaces insécables) -**/ + **/ function style_menu_rubriques($i) { $espace = ''; if (preg_match(",mozilla,i", $GLOBALS['browser_name'])) { $style = "padding-" . $GLOBALS['spip_lang_left'] . ": 16px; " - . "margin-" . $GLOBALS['spip_lang_left'] . ": ".(($i-1)*16)."px;"; + . "margin-" . $GLOBALS['spip_lang_left'] . ": " . (($i-1)*16) . "px;"; } else { $style = ''; - for ($count = 0; $count <= $i; $count ++) + for ($count = 0; $count <= $i; $count++) { $espace .= " "; + } + } + if ($i == 1) { + $espace = ""; } - if ($i ==1) - $espace= ""; $class = "niveau_$i"; - return array($class,$style,$espace); + + return array($class, $style, $espace); } /** * Sélecteur de sous rubriques pour l'espace privé * * @uses style_menu_rubriques() - * + * * @param int $id_rubrique * Identifiant de parente * @param int $root @@ -110,13 +118,16 @@ function style_menu_rubriques($i) { * Type de l'objet à placer. * @return string * Code HTML du sélecteur -**/ + **/ function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $exclus, $restreint, $type) { static $decalage_secteur; // Si on a demande l'exclusion ne pas descendre dans la rubrique courante if ($exclus > 0 - AND $root == $exclus) return ''; + AND $root == $exclus + ) { + return ''; + } // en fonction du niveau faire un affichage plus ou moins kikoo @@ -133,30 +144,35 @@ function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $excl if (isset($data[$root])) # pas de racine sauf pour les rubriques { $r = "<option$selected value='$root' class='$class' style='$style'>$espace" - .$data[$root] - .'</option>'."\n"; - } else $r = ''; - + . $data[$root] + . '</option>' . "\n"; + } else { + $r = ''; + } + // et le sous-menu pour ses enfants $sous = ''; - if (isset($enfants[$root])) - foreach ($enfants[$root] as $sousrub) + if (isset($enfants[$root])) { + foreach ($enfants[$root] as $sousrub) { $sous .= sous_menu_rubriques($id_rubrique, $sousrub, $niv+1, $data, $enfants, $exclus, $restreint, $type); + } + } // si l'objet a deplacer est publie, verifier qu'on a acces aux rubriques - if ($restreint AND $root!=$id_rubrique AND !autoriser('publierdans','rubrique',$root)) + if ($restreint AND $root != $id_rubrique AND !autoriser('publierdans', 'rubrique', $root)) { return $sous; + } // et voila le travail - return $r.$sous; + return $r . $sous; } /** * Sélecteur de rubriques pour l'espace privé en mode classique (menu) * * @uses sous_menu_rubriques() - * + * * @param int $id_rubrique * Identifiant de rubrique courante (0 si NEW) * @param string $type @@ -168,53 +184,63 @@ function sous_menu_rubriques($id_rubrique, $root, $niv, &$data, &$enfants, $excl * En mode rubrique, identifiant de soi-même * @return string * Code HTML du sélecteur -**/ + **/ function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem = 0) { $data = array(); - if ($type == 'rubrique' AND autoriser('publierdans','rubrique',0)) + if ($type == 'rubrique' AND autoriser('publierdans', 'rubrique', 0)) { $data[0] = _T('info_racine_site'); + } # premier choix = neant # si auteur (rubriques restreintes) # ou si creation avec id_rubrique=0 - elseif ($type == 'auteur' OR !$id_rubrique) + elseif ($type == 'auteur' OR !$id_rubrique) { $data[0] = ' '; + } // // creer une structure contenant toute l'arborescence // include_spip('base/abstract_sql'); - $q = sql_select("id_rubrique, id_parent, titre, statut, lang, langue_choisie", "spip_rubriques", ($type == 'breve' ? ' id_parent=0 ' : ''), '', "0+titre,titre"); + $q = sql_select("id_rubrique, id_parent, titre, statut, lang, langue_choisie", "spip_rubriques", + ($type == 'breve' ? ' id_parent=0 ' : ''), '', "0+titre,titre"); while ($r = sql_fetch($q)) { - if (autoriser('voir','rubrique',$r['id_rubrique'])){ + if (autoriser('voir', 'rubrique', $r['id_rubrique'])) { // titre largeur maxi a 50 - $titre = couper(supprimer_tags(typo($r['titre']))." ", 50); + $titre = couper(supprimer_tags(typo($r['titre'])) . " ", 50); if ($GLOBALS['meta']['multi_rubriques'] == 'oui' - AND ($r['langue_choisie'] == "oui" OR $r['id_parent'] == 0)) - $titre .= ' ['.traduire_nom_langue($r['lang']).']'; + AND ($r['langue_choisie'] == "oui" OR $r['id_parent'] == 0) + ) { + $titre .= ' [' . traduire_nom_langue($r['lang']) . ']'; + } $data[$r['id_rubrique']] = $titre; $enfants[$r['id_parent']][] = $r['id_rubrique']; - if ($id_rubrique == $r['id_rubrique']) $id_parent = $r['id_parent']; + if ($id_rubrique == $r['id_rubrique']) { + $id_parent = $r['id_parent']; + } } } // si une seule rubrique comme choix possible, // inutile de mettre le selecteur sur un choix vide par defaut // sauf si le selecteur s'adresse a une rubrique puisque on peut la mettre a la racine dans ce cas - if (count($data)==2 - AND isset($data[0]) - AND !in_array($type,array('auteur','rubrique')) - AND !$id_rubrique) + if (count($data) == 2 + AND isset($data[0]) + AND !in_array($type, array('auteur', 'rubrique')) + AND !$id_rubrique + ) { unset($data[0]); + } - $opt = sous_menu_rubriques($id_rubrique,0, 0,$data,$enfants,$idem, $restreint, $type); + $opt = sous_menu_rubriques($id_rubrique, 0, 0, $data, $enfants, $idem, $restreint, $type); $att = " id='id_parent' name='id_parent'\nclass='selecteur_parent verdana1'"; - if (preg_match(',^<option[^<>]*value=.(\d*).[^<>]*>([^<]*)</option>$,',$opt,$r)) - $r = "<input$att type='hidden' value='" . $r[1] . "' />" . $r[2] ; - else - $r = "<select".$att." size='1'>\n$opt</select>\n"; + if (preg_match(',^<option[^<>]*value=.(\d*).[^<>]*>([^<]*)</option>$,', $opt, $r)) { + $r = "<input$att type='hidden' value='" . $r[1] . "' />" . $r[2]; + } else { + $r = "<select" . $att . " size='1'>\n$opt</select>\n"; + } # message pour neuneus (a supprimer ?) # if ($type != 'auteur' AND $type != 'breve') @@ -231,13 +257,13 @@ function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem = 0) { * aux rubriques éditables par l'admin restreint... or, ca ne marche pas. * Pour la version HTML c'est bon (cf. ci-dessus), mais pour l'ajax... * je laisse ça aux spécialistes de l'ajax & des admins restreints - * + * * Toutefois c'est juste un pb d'interface, car question securite * la vérification est faite à l'arrivée des données (Fil) * * @uses construire_selecteur() - * @see exec_selectionner_dist() Pour l'obtention du contenu AJAX ensuite - * + * @see exec_selectionner_dist() Pour l'obtention du contenu AJAX ensuite + * * @param int $id_rubrique * Identifiant de rubrique courante (0 si NEW) * @param string $type @@ -255,19 +281,22 @@ function selecteur_rubrique_html($id_rubrique, $type, $restreint, $idem = 0) { function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem = 0, $do) { if ($id_rubrique) { - $titre = sql_getfetsel("titre", "spip_rubriques", "id_rubrique=".intval($id_rubrique)); - } else if ($type == 'auteur') - $titre = ' '; - else - $titre = _T('info_racine_site'); + $titre = sql_getfetsel("titre", "spip_rubriques", "id_rubrique=" . intval($id_rubrique)); + } else { + if ($type == 'auteur') { + $titre = ' '; + } else { + $titre = _T('info_racine_site'); + } + } $titre = str_replace('&', '&', entites_html(textebrut(typo($titre)))); $init = " disabled='disabled' type='text' value=\"" . $titre . "\"\nstyle='width:300px;'"; - $url = generer_url_ecrire('selectionner',"id=$id_rubrique&type=$type&do=$do" - . (!$idem ? '' : "&exclus=$idem") - . ($restreint ? "" : "&racine=oui") - . (isset($GLOBALS['var_profile']) ? '&var_profile=1' : '')); + $url = generer_url_ecrire('selectionner', "id=$id_rubrique&type=$type&do=$do" + . (!$idem ? '' : "&exclus=$idem") + . ($restreint ? "" : "&racine=oui") + . (isset($GLOBALS['var_profile']) ? '&var_profile=1' : '')); return construire_selecteur($url, '', 'selection_rubrique', 'id_parent', $init, $id_rubrique); @@ -283,7 +312,7 @@ function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem = 0, $do * Attention: changer le onclick si on change le code Html. * (la fonction JS charger_node ignore l'attribut id qui ne sert en fait pas; * getElement en mode Ajax est trop couteux). - * + * * @param string $url * URL qui retournera le contenu du sélecteur en AJAX * @param string $js @@ -298,28 +327,30 @@ function selecteur_rubrique_ajax($id_rubrique, $type, $restreint, $idem = 0, $do * Valeur actuelle du champ * @return string * Code HTML du sélecteur de rubrique AJAX -**/ -function construire_selecteur($url, $js, $idom, $name, $init = '', $id = 0){ - $icone = (strpos($idom, 'auteur')!==false) ? 'auteur-24.png' : 'rechercher-20.png'; + **/ +function construire_selecteur($url, $js, $idom, $name, $init = '', $id = 0) { + $icone = (strpos($idom, 'auteur') !== false) ? 'auteur-24.png' : 'rechercher-20.png'; + return - "<div class='rubrique_actuelle'><a href='#' onclick=\"" - . $js - . "return charger_node_url_si_vide('" - . $url - . "', this.parentNode.nextSibling, this.nextSibling,'',event)\" title='".attribut_html(_T('titre_image_selecteur'))."'><img src='" - . chemin_image($icone) - . "'\nstyle='vertical-align: middle;' alt='".attribut_html(_T('titre_image_selecteur'))."' /></a><img src='" - . chemin_image('searching.gif') - . "' id='img_" - . $idom - . "'\nstyle='visibility: hidden;' alt='*' />" - . "<input id='titreparent' name='titreparent'" - . $init - . " />" - . "<input type='hidden' id='$name' name='$name' value='" - . $id - . "' /><div class='nettoyeur'></div></div><div id='" - . $idom - . "'\nstyle='display: none;'></div>"; + "<div class='rubrique_actuelle'><a href='#' onclick=\"" + . $js + . "return charger_node_url_si_vide('" + . $url + . "', this.parentNode.nextSibling, this.nextSibling,'',event)\" title='" . attribut_html(_T('titre_image_selecteur')) . "'><img src='" + . chemin_image($icone) + . "'\nstyle='vertical-align: middle;' alt='" . attribut_html(_T('titre_image_selecteur')) . "' /></a><img src='" + . chemin_image('searching.gif') + . "' id='img_" + . $idom + . "'\nstyle='visibility: hidden;' alt='*' />" + . "<input id='titreparent' name='titreparent'" + . $init + . " />" + . "<input type='hidden' id='$name' name='$name' value='" + . $id + . "' /><div class='nettoyeur'></div></div><div id='" + . $idom + . "'\nstyle='display: none;'></div>"; } + ?> diff --git a/ecrire/inc/commencer_page.php b/ecrire/inc/commencer_page.php index 988a622547..a4ffd8f6ff 100644 --- a/ecrire/inc/commencer_page.php +++ b/ecrire/inc/commencer_page.php @@ -14,9 +14,11 @@ * Présentation de l'interface privee (exec PHP), début du HTML * * @package SPIP\Core\Presentation -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Débute une page HTML pour l'espace privé @@ -39,18 +41,26 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param bool $minipres ? * @param bool $alertes ? * @return string Code HTML -**/ -function inc_commencer_page_dist($titre = "", $rubrique = "accueil", $sous_rubrique = "accueil", $id_rubrique = "", $menu = true, $minipres = false, $alertes = true) { + **/ +function inc_commencer_page_dist( + $titre = "", + $rubrique = "accueil", + $sous_rubrique = "accueil", + $id_rubrique = "", + $menu = true, + $minipres = false, + $alertes = true +) { include_spip('inc/headers'); http_no_cache(); return init_entete($titre, $id_rubrique, $minipres) - . init_body($rubrique, $sous_rubrique, $id_rubrique,$menu) + . init_body($rubrique, $sous_rubrique, $id_rubrique, $menu) . "<div id='page'>" . auteurs_recemment_connectes($GLOBALS['connect_id_auteur']) - . ($alertes?alertes_auteur($GLOBALS['connect_id_auteur']):'') + . ($alertes ? alertes_auteur($GLOBALS['connect_id_auteur']) : '') . '<div class="largeur">'; } @@ -73,13 +83,14 @@ function inc_commencer_page_dist($titre = "", $rubrique = "accueil", $sous_rubri */ function init_entete($titre = '', $dummy = 0, $minipres = false) { include_spip('inc/texte'); - if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']["nom_site"]))) - $nom_site_spip= _T('info_mon_site_spip'); + if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']["nom_site"]))) { + $nom_site_spip = _T('info_mon_site_spip'); + } $titre = "[" . $nom_site_spip . "]" - . ($titre ? " ".textebrut(typo($titre)):""); + . ($titre ? " " . textebrut(typo($titre)) : ""); return _DOCTYPE_ECRIRE . html_lang_attributes() @@ -99,7 +110,7 @@ function init_entete($titre = '', $dummy = 0, $minipres = false) { * @return string */ function init_head($titre = '', $dummy = 0, $minipres = false) { - return recuperer_fond("prive/squelettes/head/dist",array('titre'=>$titre,'minipres'=>$minipres?' ':'')); + return recuperer_fond("prive/squelettes/head/dist", array('titre' => $titre, 'minipres' => $minipres ? ' ' : '')); } /** @@ -121,18 +132,20 @@ function init_head($titre = '', $dummy = 0, $minipres = false) { */ function init_body($rubrique = 'accueil', $sous_rubrique = 'accueil', $id_rubrique = '', $menu = true) { - $res = pipeline('body_prive',"<body class='" - . init_body_class()." "._request('exec')."'" - . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : "") - .'>'); + $res = pipeline('body_prive', "<body class='" + . init_body_class() . " " . _request('exec') . "'" + . ($GLOBALS['spip_lang_rtl'] ? " dir='rtl'" : "") + . '>'); - if (!$menu) return $res; + if (!$menu) { + return $res; + } $bandeau = charger_fonction('bandeau', 'inc'); return $res - . $bandeau(); + . $bandeau(); } /** @@ -151,22 +164,29 @@ function init_body_class() { ? $GLOBALS['visiteur_session']['prefs']['display_navigation'] : 'navigation_avec_icones'; $spip_display_outils = isset($GLOBALS['visiteur_session']['prefs']['display_outils']) - ? ($GLOBALS['visiteur_session']['prefs']['display_outils']?'navigation_avec_outils':'navigation_sans_outils') + ? ($GLOBALS['visiteur_session']['prefs']['display_outils'] ? 'navigation_avec_outils' : 'navigation_sans_outils') : 'navigation_avec_outils'; $GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] : "etroit"; - $display_class=array(0=>'icones_img_texte'/*init*/,1=>'icones_texte',2=>'icones_img_texte',3=>'icones_img'); - return $GLOBALS['spip_ecran'] . " $spip_display_navigation $spip_display_outils ".$display_class[$GLOBALS['spip_display']]; + $display_class = array( + 0 => 'icones_img_texte' + /*init*/, + 1 => 'icones_texte', + 2 => 'icones_img_texte', + 3 => 'icones_img' + ); + + return $GLOBALS['spip_ecran'] . " $spip_display_navigation $spip_display_outils " . $display_class[$GLOBALS['spip_display']]; } /** * Afficher la liste des auteurs connectés à l'espace privé - * + * * @param integer $id_auteur * @return string */ -function auteurs_recemment_connectes($id_auteur){ +function auteurs_recemment_connectes($id_auteur) { return recuperer_fond('prive/objets/liste/auteurs_enligne'); } diff --git a/ecrire/inc/config.php b/ecrire/inc/config.php index 977979e98a..fc1e59e583 100644 --- a/ecrire/inc/config.php +++ b/ecrire/inc/config.php @@ -14,9 +14,11 @@ * Fonctions utilitaires pour le stockage et lecture de configuration * * @package SPIP\Core\Config -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -31,30 +33,31 @@ function inc_config_dist() { /** * Expliquer une clé de configuration - * + * * Analyser la clé de configuration pour déterminer * - la table (ex: spip_metas), * - le casier, la clé principale (ex: dada) * - et le sous-casier éventuel, chemin dans la clé principale (ex: truc/muche) * * @param string $cfg - * Clé de configuration, tel que 'dada/truc/muche' + * Clé de configuration, tel que 'dada/truc/muche' * @return array * Liste (table, casier, sous_casier) */ -function expliquer_config($cfg){ +function expliquer_config($cfg) { // par defaut, sur la table des meta $table = 'meta'; $casier = null; $sous_casier = array(); - $cfg = explode('/',$cfg); + $cfg = explode('/', $cfg); // si le premier argument est vide, c'est une syntaxe /table/ ou un appel vide '' - if (!reset($cfg) AND count($cfg)>1) { + if (!reset($cfg) AND count($cfg) > 1) { array_shift($cfg); $table = array_shift($cfg); - if (!isset($GLOBALS[$table])) + if (!isset($GLOBALS[$table])) { lire_metas($table); + } } // si on a demande #CONFIG{/meta,'',0} @@ -65,10 +68,11 @@ function expliquer_config($cfg){ } } - if (count($cfg)) + if (count($cfg)) { $sous_casier = $cfg; + } - return array($table,$casier,$sous_casier); + return array($table, $casier, $sous_casier); } /** @@ -85,10 +89,10 @@ function expliquer_config($cfg){ * * $unserialize est mis par l'histoire * - * @param string $cfg + * @param string $cfg * Clé de configuration * @param mixed $def - * Valeur par défaut + * Valeur par défaut * @param boolean $unserialize * N'affecte que le dépôt 'meta' : * True pour désérialiser automatiquement la valeur @@ -102,49 +106,58 @@ function lire_config($cfg = '', $def = null, $unserialize = true) { // traiter en priorite le cas simple et frequent // de lecture direct $GLOBALS['meta']['truc'], si $cfg ne contient ni / ni : - if ($cfg AND strpbrk($cfg,'/:')===false){ - $r = isset($GLOBALS['meta'][$cfg])? - ((!$unserialize - // ne pas essayer de deserialiser autre chose qu'une chaine - OR !is_string($GLOBALS['meta'][$cfg]) - // ne pas essayer de deserialiser si ce n'est visiblement pas une chaine serializee - OR strpos($GLOBALS['meta'][$cfg],':')===false - OR ($t=@unserialize($GLOBALS['meta'][$cfg]))===false)?$GLOBALS['meta'][$cfg]:$t) - :$def; + if ($cfg AND strpbrk($cfg, '/:') === false) { + $r = isset($GLOBALS['meta'][$cfg]) ? + ((!$unserialize + // ne pas essayer de deserialiser autre chose qu'une chaine + OR !is_string($GLOBALS['meta'][$cfg]) + // ne pas essayer de deserialiser si ce n'est visiblement pas une chaine serializee + OR strpos($GLOBALS['meta'][$cfg], ':') === false + OR ($t = @unserialize($GLOBALS['meta'][$cfg])) === false) ? $GLOBALS['meta'][$cfg] : $t) + : $def; + return $r; } // Brancher sur methodes externes si besoin - if ($cfg AND $p=strpos($cfg,'::')){ - $methode = substr($cfg,0,$p); + if ($cfg AND $p = strpos($cfg, '::')) { + $methode = substr($cfg, 0, $p); $lire_config = charger_fonction($methode, 'lire_config'); - return $lire_config(substr($cfg,$p+2),$def,$unserialize); + + return $lire_config(substr($cfg, $p+2), $def, $unserialize); } - list($table,$casier,$sous_casier) = expliquer_config($cfg); + list($table, $casier, $sous_casier) = expliquer_config($cfg); - if (!isset($GLOBALS[$table])) - return $def; + if (!isset($GLOBALS[$table])) { + return $def; + } $r = $GLOBALS[$table]; // si on a demande #CONFIG{/meta,'',0} - if (!$casier) + if (!$casier) { return $unserialize ? $r : serialize($r); + } // casier principal : // le deserializer si demande // ou si on a besoin // d'un sous casier - $r = isset($r[$casier])?$r[$casier]:null; - if (($unserialize OR count($sous_casier)) AND $r AND is_string($r)) - $r = (($t=@unserialize($r))===false?$r:$t); + $r = isset($r[$casier]) ? $r[$casier] : null; + if (($unserialize OR count($sous_casier)) AND $r AND is_string($r)) { + $r = (($t = @unserialize($r)) === false ? $r : $t); + } // aller chercher le sous_casier - while(!is_null($r) AND $casier = array_shift($sous_casier)) - $r = isset($r[$casier])?$r[$casier]:null; + while (!is_null($r) AND $casier = array_shift($sous_casier)) { + $r = isset($r[$casier]) ? $r[$casier] : null; + } + + if (is_null($r)) { + return $def; + } - if (is_null($r)) return $def; return $r; } @@ -152,7 +165,7 @@ function lire_config($cfg = '', $def = null, $unserialize = true) { * metapack est inclue dans lire_config, mais on traite le cas ou il est explicite * metapack:: dans le $cfg de lire_config. * On renvoie simplement sur lire_config - * + * * @param string $cfg * @param mixed $def * @param bool $unserialize @@ -172,25 +185,29 @@ function lire_config_metapack_dist($cfg = '', $def = null, $unserialize = true) */ function ecrire_config($cfg, $store) { // Brancher sur methodes externes si besoin - if ($cfg AND $p=strpos($cfg,'::')){ - $methode = substr($cfg,0,$p); + if ($cfg AND $p = strpos($cfg, '::')) { + $methode = substr($cfg, 0, $p); $ecrire_config = charger_fonction($methode, 'ecrire_config'); - return $ecrire_config(substr($cfg,$p+2),$store); + + return $ecrire_config(substr($cfg, $p+2), $store); } - - list($table,$casier,$sous_casier) = expliquer_config($cfg); + + list($table, $casier, $sous_casier) = expliquer_config($cfg); // il faut au moins un casier pour ecrire - if (!$casier) return false; + if (!$casier) { + return false; + } // trouvons ou creons le pointeur sur le casier - $st = isset($GLOBALS[$table][$casier])?$GLOBALS[$table][$casier]:null; + $st = isset($GLOBALS[$table][$casier]) ? $GLOBALS[$table][$casier] : null; if (!is_array($st) AND ($sous_casier OR is_array($store))) { $st = unserialize($st); - if ($st===false) { + if ($st === false) { // ne rien creer si c'est une demande d'effacement - if (is_null($store)) + if (is_null($store)) { return false; - $st=array(); + } + $st = array(); } } @@ -199,13 +216,14 @@ function ecrire_config($cfg, $store) { if ($c = $sous_casier) { $sc = &$st; $pointeurs = array(); - while (count($c) AND $cc=array_shift($c)) { + while (count($c) AND $cc = array_shift($c)) { // creer l'entree si elle n'existe pas if (!isset($sc[$cc])) { // si on essaye d'effacer une config qui n'existe pas // ne rien creer mais sortir - if (is_null($store)) + if (is_null($store)) { return false; + } $sc[$cc] = array(); } $pointeurs[$cc] = &$sc; @@ -213,23 +231,24 @@ function ecrire_config($cfg, $store) { } // si c'est une demande d'effacement - if (is_null($store)){ + if (is_null($store)) { $c = $sous_casier; $sous = array_pop($c); // effacer, et remonter pour effacer les parents vides do { unset($pointeurs[$sous][$sous]); } while ($sous = array_pop($c) AND !count($pointeurs[$sous][$sous])); - + // si on a vide tous les sous casiers, // et que le casier est vide // vider aussi la meta - if (!$sous AND !count($st)) + if (!$sous AND !count($st)) { $st = null; - } - // dans tous les autres cas, on ecrase - else + } + } // dans tous les autres cas, on ecrase + else { $sc = $store; + } // Maintenant que $st est modifiee // reprenons la comme valeur a stocker dans le casier principal @@ -237,25 +256,29 @@ function ecrire_config($cfg, $store) { } if (is_null($store)) { - if (is_null($st) AND !$sous_casier) - return false; // la config n'existait deja pas ! - effacer_meta ($casier, $table); + if (is_null($st) AND !$sous_casier) { + return false; + } // la config n'existait deja pas ! + effacer_meta($casier, $table); if (!count($GLOBALS[$table]) - OR count($GLOBALS[$table])==1 AND isset($GLOBALS[$table]['charset'])) { + OR count($GLOBALS[$table]) == 1 AND isset($GLOBALS[$table]['charset']) + ) { effacer_meta('charset', $table); // enlevons cette meta supprimer_table_meta($table); // supprimons la table (si elle est bien vide) } - } - // les meta ne peuvent etre que des chaines : il faut serializer le reste + } // les meta ne peuvent etre que des chaines : il faut serializer le reste else { - if (!isset($GLOBALS[$table])) + if (!isset($GLOBALS[$table])) { installer_table_meta($table); + } // si ce n'est pas une chaine // il faut serializer - if (!is_string($store)) - $store=serialize($store); + if (!is_string($store)) { + $store = serialize($store); + } ecrire_meta($casier, $store, null, $table); } + // verifier que lire_config($cfg)==$store ? return true; } @@ -274,18 +297,22 @@ function ecrire_config_metapack_dist($cfg, $store) { // cas particulier en metapack:: // si on ecrit une chaine deja serializee, il faut la reserializer pour la rendre // intacte en sortie ... - if (is_string($store) AND strpos($store,':') AND unserialize($store)) + if (is_string($store) AND strpos($store, ':') AND unserialize($store)) { $store = serialize($store); + } + return ecrire_config($cfg, $store); } /** * Effacer une configuration : revient a ecrire une valeur null + * * @param string $cfg * @return bool */ -function effacer_config($cfg){ +function effacer_config($cfg) { ecrire_config($cfg, null); + return true; } @@ -293,32 +320,32 @@ function effacer_config($cfg){ * Lister toutes les pages de configuration du site. * * Y compris celles fournies par des plugins. - * + * * @uses _EXTENSION_SQUELETTES * @uses find_all_in_path() * @uses find_in_theme() * @uses lister_formulaires_configurer() - * + * * @param array $exclure * @return array */ -function lister_configurer($exclure = array()){ +function lister_configurer($exclure = array()) { return array(); - + // lister les pages de config deja dans les menus $deja = array(); - foreach($exclure as $id=>$b) { + foreach ($exclure as $id => $b) { $url = ($b['url'] ? $b['url'] : $id); if (!$b['url'] or !isset($exclure[$url])) { - if (strncmp($url,'configurer_',11)==0) { + if (strncmp($url, 'configurer_', 11) == 0) { $deja[$url] = $b; - } elseif($b['url']=='configurer' AND preg_match(',cfg=([a-z0-9_]+),i',$b['args'],$match)) { - $deja["configurer_".$match[1]] = $b; + } elseif ($b['url'] == 'configurer' AND preg_match(',cfg=([a-z0-9_]+),i', $b['args'], $match)) { + $deja["configurer_" . $match[1]] = $b; } } - + } - $exclure = $exclure + $deja; + $exclure = $exclure+$deja; $icone_defaut = "images/configuration-16.png"; $liste = array(); @@ -327,42 +354,44 @@ function lister_configurer($exclure = array()){ // trouver toutes les pages configurer_xxx de l'espace prive // et construire un tableau des entrees qui ne sont pas dans $deja - $pages = find_all_in_path("prive/squelettes/contenu/", "configurer_.*[.]"._EXTENSION_SQUELETTES.'$'); + $pages = find_all_in_path("prive/squelettes/contenu/", "configurer_.*[.]" . _EXTENSION_SQUELETTES . '$'); - foreach($pages as $page) { - $configurer = basename($page,"."._EXTENSION_SQUELETTES); + foreach ($pages as $page) { + $configurer = basename($page, "." . _EXTENSION_SQUELETTES); if (!isset($exclure[$configurer])) { $liste[$configurer] = array( - 'parent' => 'bando_configuration', - 'url' => $configurer, - 'titre' => _T("configurer:{$configurer}_titre"), - 'icone' => find_in_theme($i="images/{$configurer}-16.png")?$i:$icone_defaut, + 'parent' => 'bando_configuration', + 'url' => $configurer, + 'titre' => _T("configurer:{$configurer}_titre"), + 'icone' => find_in_theme($i = "images/{$configurer}-16.png") ? $i : $icone_defaut, ); } $skels[$configurer] = $page; } // analyser la liste des $skels pour voir les #FORMULAIRE_CONFIGURER_ inclus - foreach($skels as $file) { + foreach ($skels as $file) { $forms = array_merge($forms, lister_formulaires_configurer($file)); } $forms = array_flip($forms); // trouver tous les formulaires/configurer_ // et construire un tableau des entrees - $pages = find_all_in_path("formulaires/", "configurer_.*[.]"._EXTENSION_SQUELETTES.'$'); - foreach($pages as $page) { - $configurer = basename($page,"."._EXTENSION_SQUELETTES); + $pages = find_all_in_path("formulaires/", "configurer_.*[.]" . _EXTENSION_SQUELETTES . '$'); + foreach ($pages as $page) { + $configurer = basename($page, "." . _EXTENSION_SQUELETTES); if (!isset($forms[$configurer]) - AND !isset($liste[$configurer]) - AND !isset($exclure[$configurer])) + AND !isset($liste[$configurer]) + AND !isset($exclure[$configurer]) + ) { $liste[$configurer] = array( - 'parent' => 'bando_configuration', - 'url' => 'configurer', - 'args' => 'cfg='.substr($configurer,11), - 'titre' => _T("configurer:{$configurer}_titre"), - 'icone' => find_in_theme($i="images/{$configurer}-16.png")?$i:$icone_defaut, + 'parent' => 'bando_configuration', + 'url' => 'configurer', + 'args' => 'cfg=' . substr($configurer, 11), + 'titre' => _T("configurer:{$configurer}_titre"), + 'icone' => find_in_theme($i = "images/{$configurer}-16.png") ? $i : $icone_defaut, ); + } } return $liste; @@ -371,60 +400,60 @@ function lister_configurer($exclure = array()){ /** * Retourne la liste des formulaires de configuration - * présents dans le fichier dont l'adresse est donnée + * présents dans le fichier dont l'adresse est donnée * - * @param string $file + * @param string $file * Adresse du fichier - * @return array + * @return array * Liste des formulaires trouvés -**/ + **/ function lister_formulaires_configurer($file) { $forms = array(); - + lire_fichier($file, $skel); - if (preg_match_all(",#FORMULAIRE_(CONFIGURER_[A-Z0-9_]*),", $skel, $matches,PREG_SET_ORDER)) { - $matches = array_map('end',$matches); - $matches = array_map('strtolower',$matches); - $forms = array_merge($forms,$matches); + if (preg_match_all(",#FORMULAIRE_(CONFIGURER_[A-Z0-9_]*),", $skel, $matches, PREG_SET_ORDER)) { + $matches = array_map('end', $matches); + $matches = array_map('strtolower', $matches); + $forms = array_merge($forms, $matches); } // evaluer le fond en lui passant un exec coherent pour que les pipelines le reconnaissent // et reperer les formulaires CVT configurer_xx insereres par les plugins via pipeline - $config = basename(substr($file,0,-strlen("."._EXTENSION_SQUELETTES))); - spip_log('Calcul de '."prive/squelettes/contenu/$config"); + $config = basename(substr($file, 0, -strlen("." . _EXTENSION_SQUELETTES))); + spip_log('Calcul de ' . "prive/squelettes/contenu/$config"); $fond = recuperer_fond("prive/squelettes/contenu/$config", array("exec" => $config)); - + // passer dans le pipeline affiche_milieu pour que les plugins puissent ajouter leur formulaires... // et donc que l'on puisse les referencer aussi ! - $fond = pipeline('affiche_milieu', array('args'=>array("exec" => $config),'data'=>$fond)); + $fond = pipeline('affiche_milieu', array('args' => array("exec" => $config), 'data' => $fond)); // recuperer les noms des formulaires presents. - if (is_array($inputs = extraire_balises($fond,"input"))) { - foreach($inputs as $i) { - if (extraire_attribut($i,'name')=='formulaire_action') { - $forms[] = ($c=extraire_attribut($i,'value')); + if (is_array($inputs = extraire_balises($fond, "input"))) { + foreach ($inputs as $i) { + if (extraire_attribut($i, 'name') == 'formulaire_action') { + $forms[] = ($c = extraire_attribut($i, 'value')); } } } + return $forms; } /** * Définir les `meta` de configuration - * + * * @pipeline_appel configurer_liste_metas - * + * * @uses url_de_base() * @uses _DEFAULT_CHARSET * @uses _DIR_IMG * @uses _DIR_RACINE - * + * * @return array * Couples nom de la `meta` => valeur par défaut */ -function liste_metas() -{ +function liste_metas() { return pipeline('configurer_liste_metas', array( 'nom_site' => _T('info_mon_site_spip'), 'slogan_site' => '', @@ -453,8 +482,8 @@ function liste_metas() 'accepter_visiteurs' => 'non', 'prevenir_auteurs' => 'non', 'suivi_edito' => 'non', - 'adresse_suivi' =>'', - 'adresse_suivi_inscription' =>'', + 'adresse_suivi' => '', + 'adresse_suivi_inscription' => '', 'adresse_neuf' => '', 'jours_neuf' => '', 'quoi_de_neuf' => 'non', @@ -462,7 +491,7 @@ function liste_metas() 'syndication_integrale' => 'oui', 'charset' => _DEFAULT_CHARSET, - 'dir_img' => substr(_DIR_IMG,strlen(_DIR_RACINE)), + 'dir_img' => substr(_DIR_IMG, strlen(_DIR_RACINE)), 'multi_rubriques' => 'non', 'multi_secteurs' => 'non', @@ -475,24 +504,45 @@ function liste_metas() 'email_envoi' => '', 'email_webmaster' => '', - 'auto_compress_http'=>'non', + 'auto_compress_http' => 'non', )); } /** * Mets les `meta` à des valeurs conventionnelles quand elles sont vides * et recalcule les langues - * + * * @param array $liste_meta * @return void */ -function actualise_metas($liste_meta) -{ +function actualise_metas($liste_meta) { $meta_serveur = - array('version_installee','adresse_site','alea_ephemere_ancien','alea_ephemere','alea_ephemere_date','langue_site','langues_proposees','date_calcul_rubriques','derniere_modif','optimiser_table','drapeau_edition','creer_preview','taille_preview','creer_htpasswd','creer_htaccess','gd_formats_read','gd_formats', - 'netpbm_formats','formats_graphiques','image_process','plugin_header','plugin'); + array( + 'version_installee', + 'adresse_site', + 'alea_ephemere_ancien', + 'alea_ephemere', + 'alea_ephemere_date', + 'langue_site', + 'langues_proposees', + 'date_calcul_rubriques', + 'derniere_modif', + 'optimiser_table', + 'drapeau_edition', + 'creer_preview', + 'taille_preview', + 'creer_htpasswd', + 'creer_htaccess', + 'gd_formats_read', + 'gd_formats', + 'netpbm_formats', + 'formats_graphiques', + 'image_process', + 'plugin_header', + 'plugin' + ); // verifier le impt=non - sql_updateq('spip_meta',array('impt'=>'non'),sql_in('nom',$meta_serveur)); + sql_updateq('spip_meta', array('impt' => 'non'), sql_in('nom', $meta_serveur)); while (list($nom, $valeur) = each($liste_meta)) { if (!isset($GLOBALS['meta'][$nom]) OR !$GLOBALS['meta'][$nom]) { @@ -506,7 +556,6 @@ function actualise_metas($liste_meta) } - // // Gestion des modifs // @@ -515,21 +564,22 @@ function actualise_metas($liste_meta) * Appliquer les modifications apportées aux `metas` * * Si `$purger_skel` est à `true`, on purge le répertoire de cache des squelettes - * + * * @uses liste_metas() * @uses ecrire_meta() * @uses purger_repertoire() - * + * * @param bool $purger_skel * @return void */ function appliquer_modifs_config($purger_skel = false) { - foreach(liste_metas() as $i => $v) { - if (($x =_request($i))!==NULL) + foreach (liste_metas() as $i => $v) { + if (($x = _request($i)) !== null) { ecrire_meta($i, $x); - elseif (!isset($GLOBALS['meta'][$i])) + } elseif (!isset($GLOBALS['meta'][$i])) { ecrire_meta($i, $v); + } } if ($purger_skel) { @@ -541,20 +591,25 @@ function appliquer_modifs_config($purger_skel = false) { /** * Mettre à jour l'adresse du site à partir d'une valeur saisie * (ou auto détection si vide) - * + * * @param string $adresse_site * @return string */ -function appliquer_adresse_site($adresse_site){ - if ($adresse_site!==NULL){ - if (!strlen($adresse_site)) {$GLOBALS['profondeur_url']=_DIR_RESTREINT?0:1;$adresse_site = url_de_base();} +function appliquer_adresse_site($adresse_site) { + if ($adresse_site !== null) { + if (!strlen($adresse_site)) { + $GLOBALS['profondeur_url'] = _DIR_RESTREINT ? 0 : 1; + $adresse_site = url_de_base(); + } $adresse_site = preg_replace(",/?\s*$,", "", $adresse_site); - if (!tester_url_absolue($adresse_site)) + if (!tester_url_absolue($adresse_site)) { $adresse_site = "http://$adresse_site"; + } - ecrire_meta('adresse_site',$adresse_site); + ecrire_meta('adresse_site', $adresse_site); } + return $adresse_site; } diff --git a/ecrire/inc/cookie.php b/ecrire/inc/cookie.php index e3f2eefd61..52b206da6a 100644 --- a/ecrire/inc/cookie.php +++ b/ecrire/inc/cookie.php @@ -14,17 +14,19 @@ * Gestion des cookies * * @package SPIP\Core\Cookies -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Place un cookie (préfixé) sur le poste client - * + * * @global cookie_prefix Préfixe de cookie défini * @link http://fr.php.net/setcookie - * + * * @param string $name * Nom du cookie * @param string $value @@ -39,33 +41,35 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * cookie sécurisé ou non ? * @return bool * true si le cookie a été posé, false sinon. -**/ -function spip_setcookie ($name = '', $value = '', $expire = 0, $path = 'AUTO', $domain = '', $secure = '') { + **/ +function spip_setcookie($name = '', $value = '', $expire = 0, $path = 'AUTO', $domain = '', $secure = '') { // liste des cookies en httponly (a passer en define si besoin) $httponly = in_array($name, explode(' ', 'spip_session')); - $name = preg_replace ('/^spip_/', $GLOBALS['cookie_prefix'].'_', $name); - if ($path == 'AUTO') - $path = defined('_COOKIE_PATH')?_COOKIE_PATH:preg_replace(',^\w+://[^/]*,', '', url_de_base()); - if (!$domain AND defined('_COOKIE_DOMAIN')) + $name = preg_replace('/^spip_/', $GLOBALS['cookie_prefix'] . '_', $name); + if ($path == 'AUTO') { + $path = defined('_COOKIE_PATH') ? _COOKIE_PATH : preg_replace(',^\w+://[^/]*,', '', url_de_base()); + } + if (!$domain AND defined('_COOKIE_DOMAIN')) { $domain = _COOKIE_DOMAIN; + } #spip_log("cookie('$name', '$value', '$expire', '$path', '$domain', '$secure', '$httponly'"); $a = - ($httponly AND strnatcmp(phpversion(),'5.2.0') >= 0) ? - @setcookie ($name, $value, $expire, $path, $domain, $secure, $httponly) - : ($secure ? - @setcookie ($name, $value, $expire, $path, $domain, $secure) - : ($domain ? - @setcookie ($name, $value, $expire, $path, $domain) - : ($path ? - @setcookie ($name, $value, $expire, $path) - : ($expire ? - @setcookie ($name, $value, $expire) - : - @setcookie ($name, $value) - )))); + ($httponly AND strnatcmp(phpversion(), '5.2.0') >= 0) ? + @setcookie($name, $value, $expire, $path, $domain, $secure, $httponly) + : ($secure ? + @setcookie($name, $value, $expire, $path, $domain, $secure) + : ($domain ? + @setcookie($name, $value, $expire, $path, $domain) + : ($path ? + @setcookie($name, $value, $expire, $path) + : ($expire ? + @setcookie($name, $value, $expire) + : + @setcookie($name, $value) + )))); spip_cookie_envoye(true); @@ -79,16 +83,18 @@ function spip_setcookie ($name = '', $value = '', $expire = 0, $path = 'AUTO', $ * redirection à appliquer (serveur ou navigateur) * * @see redirige_par_entete() - * + * * @param bool|string $set * true pour déclarer les cookies comme envoyés * @return bool -**/ + **/ function spip_cookie_envoye($set = '') { - static $envoye = false; - if($set) - $envoye = true; - return $envoye; + static $envoye = false; + if ($set) { + $envoye = true; + } + + return $envoye; } /** @@ -102,22 +108,22 @@ function spip_cookie_envoye($set = '') { * Ainsi les appels dans le code n'ont pas besoin de gérer le préfixe, * ils appellent simplement `$_COOKIE['spip_xx']` qui sera forcément * la bonne donnée. - * + * * @param string $cookie_prefix * Préfixe des cookies de SPIP -**/ + **/ function recuperer_cookies_spip($cookie_prefix) { $prefix_long = strlen($cookie_prefix); foreach ($_COOKIE as $name => $value) { - if (substr($name,0,5)=='spip_' && substr($name,0,$prefix_long)!=$cookie_prefix) { + if (substr($name, 0, 5) == 'spip_' && substr($name, 0, $prefix_long) != $cookie_prefix) { unset($_COOKIE[$name]); unset($GLOBALS[$name]); } } foreach ($_COOKIE as $name => $value) { - if (substr($name,0,$prefix_long)==$cookie_prefix) { - $spipname = preg_replace ('/^'.$cookie_prefix.'_/', 'spip_', $name); + if (substr($name, 0, $prefix_long) == $cookie_prefix) { + $spipname = preg_replace('/^' . $cookie_prefix . '_/', 'spip_', $name); $_COOKIE[$spipname] = $value; $GLOBALS[$spipname] = $value; } @@ -130,16 +136,16 @@ function recuperer_cookies_spip($cookie_prefix) { * Teste si javascript est supporté par le navigateur et pose un cookie en conséquence * * Si la valeur d'environnement `js` arrive avec la valeur - * + * * - `-1` c'est un appel via une balise `<noscript>`. * - `1` c'est un appel via javascript * * Inscrit le résultat dans le cookie `spip_accepte_ajax` * - * @see html_tests_js() + * @see html_tests_js() * @uses spip_setcookie() - * -**/ + * + **/ function exec_test_ajax_dist() { switch (_request('js')) { // on est appele par <noscript> @@ -156,4 +162,5 @@ function exec_test_ajax_dist() { break; } } + ?> diff --git a/ecrire/inc/couleurs.php b/ecrire/inc/couleurs.php index e2dfde3ccd..5617229eec 100644 --- a/ecrire/inc/couleurs.php +++ b/ecrire/inc/couleurs.php @@ -12,120 +12,122 @@ /** * Couleurs de l'interface de l’espace privé de SPIP. - * + * * @package SPIP\Core\Couleurs */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Obtenir ou définir les différents jeux de couleurs de l'espace privé * * - Appelée _sans argument_, cette fonction retourne un tableau décrivant les jeux les couleurs possibles. - * - Avec un _argument numérique_, elle retourne les paramètres d'URL + * - Avec un _argument numérique_, elle retourne les paramètres d'URL * pour les feuilles de style calculées (cf. formulaire configurer_preferences) * - Avec un _argument de type tableau_ : * - soit elle remplace le tableau par défaut par celui donné en argument * - soit elle le complète, si `$ajouter` vaut `true`. - * + * * @see formulaires_configurer_preferences_charger_dist() - * + * * @staticvar array $couleurs_spip * @param null|int|array $choix * @param bool $ajouter * @return array|string */ -function inc_couleurs_dist($choix = NULL, $ajouter = false) -{ +function inc_couleurs_dist($choix = null, $ajouter = false) { static $couleurs_spip = array( // Vert -1 => array ( - "couleur_foncee" => "#9DBA00", - "couleur_claire" => "#C5E41C", - "couleur_lien" => "#657701", - "couleur_lien_off" => "#A6C113" + 1 => array( + "couleur_foncee" => "#9DBA00", + "couleur_claire" => "#C5E41C", + "couleur_lien" => "#657701", + "couleur_lien_off" => "#A6C113" ), // Violet clair -2 => array ( - "couleur_foncee" => "#eb68b3", - "couleur_claire" => "#ffa9e6", - "couleur_lien" => "#8F004D", - "couleur_lien_off" => "#BE6B97" + 2 => array( + "couleur_foncee" => "#eb68b3", + "couleur_claire" => "#ffa9e6", + "couleur_lien" => "#8F004D", + "couleur_lien_off" => "#BE6B97" ), // Orange -3 => array ( - "couleur_foncee" => "#fa9a00", - "couleur_claire" => "#ffc000", - "couleur_lien" => "#FF5B00", - "couleur_lien_off" => "#B49280" + 3 => array( + "couleur_foncee" => "#fa9a00", + "couleur_claire" => "#ffc000", + "couleur_lien" => "#FF5B00", + "couleur_lien_off" => "#B49280" ), // Saumon -4 => array ( - "couleur_foncee" => "#CDA261", - "couleur_claire" => "#FFDDAA", - "couleur_lien" => "#AA6A09", - "couleur_lien_off" => "#B79562" + 4 => array( + "couleur_foncee" => "#CDA261", + "couleur_claire" => "#FFDDAA", + "couleur_lien" => "#AA6A09", + "couleur_lien_off" => "#B79562" ), // Bleu pastel -5 => array ( - "couleur_foncee" => "#5da7c5", - "couleur_claire" => "#97d2e1", - "couleur_lien" => "#116587", - "couleur_lien_off" => "#81B7CD" + 5 => array( + "couleur_foncee" => "#5da7c5", + "couleur_claire" => "#97d2e1", + "couleur_lien" => "#116587", + "couleur_lien_off" => "#81B7CD" ), // Gris -6 => array ( - "couleur_foncee" => "#85909A", - "couleur_claire" => "#C0CAD4", - "couleur_lien" => "#3B5063", - "couleur_lien_off" => "#6D8499" + 6 => array( + "couleur_foncee" => "#85909A", + "couleur_claire" => "#C0CAD4", + "couleur_lien" => "#3B5063", + "couleur_lien_off" => "#6D8499" ), // Vert de gris -7 => array ( - "couleur_foncee" => "#999966", - "couleur_claire" => "#CCCC99", - "couleur_lien" => "#666633", - "couleur_lien_off" => "#999966" + 7 => array( + "couleur_foncee" => "#999966", + "couleur_claire" => "#CCCC99", + "couleur_lien" => "#666633", + "couleur_lien_off" => "#999966" ), // Rouge -8 => array ( - "couleur_foncee" => "#DF4543", - "couleur_claire" => "#FAACB0", - "couleur_lien" => "#D0000A", - "couleur_lien_off" => "#D96067" + 8 => array( + "couleur_foncee" => "#DF4543", + "couleur_claire" => "#FAACB0", + "couleur_lien" => "#D0000A", + "couleur_lien_off" => "#D96067" ), // Violet -9 => array ( - "couleur_foncee" => "#8F8FBD", - "couleur_claire" => "#C4C4DD", - "couleur_lien" => "#6071A5", - "couleur_lien_off" => "#5C5C8C" + 9 => array( + "couleur_foncee" => "#8F8FBD", + "couleur_claire" => "#C4C4DD", + "couleur_lien" => "#6071A5", + "couleur_lien_off" => "#5C5C8C" ), // Gris -10 => array ( - "couleur_foncee" => "#909090", - "couleur_claire" => "#D3D3D3", - "couleur_lien" => "#808080", - "couleur_lien_off" => "#909090" + 10 => array( + "couleur_foncee" => "#909090", + "couleur_claire" => "#D3D3D3", + "couleur_lien" => "#808080", + "couleur_lien_off" => "#909090" ), -); + ); if (is_numeric($choix)) { // Compatibilite ascendante (plug-ins notamment) - $GLOBALS["couleur_claire"] = $couleurs_spip[$choix]['couleur_claire']; - $GLOBALS["couleur_foncee"] = $couleurs_spip[$choix]['couleur_foncee']; - $GLOBALS["couleur_lien"] = $couleurs_spip[$choix]['couleur_lien']; + $GLOBALS["couleur_claire"] = $couleurs_spip[$choix]['couleur_claire']; + $GLOBALS["couleur_foncee"] = $couleurs_spip[$choix]['couleur_foncee']; + $GLOBALS["couleur_lien"] = $couleurs_spip[$choix]['couleur_lien']; $GLOBALS["couleur_lien_off"] = $couleurs_spip[$choix]['couleur_lien_off']; return - "couleur_claire=" . substr($couleurs_spip[$choix]['couleur_claire'], 1). + "couleur_claire=" . substr($couleurs_spip[$choix]['couleur_claire'], 1) . '&couleur_foncee=' . substr($couleurs_spip[$choix]['couleur_foncee'], 1); } else { if (is_array($choix)) { if ($ajouter) { - foreach($choix as $c) { + foreach ($choix as $c) { $couleurs_spip[] = $c; } + return $couleurs_spip; } else { return $couleurs_spip = $choix; @@ -133,6 +135,7 @@ function inc_couleurs_dist($choix = NULL, $ajouter = false) } } + return $couleurs_spip; } diff --git a/ecrire/inc/csv.php b/ecrire/inc/csv.php index 2cbd098543..04cb23c0aa 100644 --- a/ecrire/inc/csv.php +++ b/ecrire/inc/csv.php @@ -12,11 +12,13 @@ /** * Analyse de fichiers CSV - * + * * @package SPIP\Core\CSV */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Retourne les données d'un texte au format CSV @@ -27,79 +29,103 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Tableau des données en 3 index : * - Liste des noms des colonnes * - Liste des valeurs de chaque ligne et chaque colonne - * - Titre du tableau (si une seule colonne) -**/ -function analyse_csv($t) -{ + * - Titre du tableau (si une seule colonne) + **/ +function analyse_csv($t) { $virg = substr_count($t, ','); $pvirg = substr_count($t, ';'); $tab = substr_count($t, "\t"); - if ($virg > $pvirg) - { $sep = ','; $hs = ',';} - else { $sep = ';'; $hs = ';'; $virg = $pvirg;} - if ($tab > $virg) {$sep = "\t"; $hs = "\t";} + if ($virg > $pvirg) { + $sep = ','; + $hs = ','; + } else { + $sep = ';'; + $hs = ';'; + $virg = $pvirg; + } + if ($tab > $virg) { + $sep = "\t"; + $hs = "\t"; + } $t = preg_replace('/\r?\n/', "\n", - preg_replace('/[\r\n]+/', "\n", $t)); + preg_replace('/[\r\n]+/', "\n", $t)); // un separateur suivi de 3 guillemets attention ! // attention au ; suceptible d'etre confondu avec un separateur // on substitue un # et on remplacera a la fin - $t = preg_replace("/([\n$sep])\"\"\"/",'\\1""#',$t); - $t = str_replace('""','"#',$t); + $t = preg_replace("/([\n$sep])\"\"\"/", '\\1""#', $t); + $t = str_replace('""', '"#', $t); preg_match_all('/"[^"]*"/', $t, $r); - foreach($r[0] as $cell) + foreach ($r[0] as $cell) { $t = str_replace($cell, str_replace($sep, $hs, str_replace("\n", "<br />", - substr($cell,1,-1))), + substr($cell, 1, -1))), $t); - list($entete, $corps) = explode("\n",$t,2); + } + list($entete, $corps) = explode("\n", $t, 2); $caption = ''; // sauter la ligne de tete formee seulement de separateurs if (substr_count($entete, $sep) == strlen($entete)) { - list($entete, $corps) = explode("\n",$corps,2); + list($entete, $corps) = explode("\n", $corps, 2); } // si une seule colonne, en faire le titre if (preg_match("/^([^$sep]+)$sep+\$/", $entete, $l)) { - $caption = "\n||" . $l[1] . "|"; - list($entete, $corps) = explode("\n",$corps,2); + $caption = "\n||" . $l[1] . "|"; + list($entete, $corps) = explode("\n", $corps, 2); } // si premiere colonne vide, le raccourci doit quand meme produire <th... - if ($entete[0] == $sep) $entete = ' ' . $entete; + if ($entete[0] == $sep) { + $entete = ' ' . $entete; + } $lignes = explode("\n", $corps); // retrait des lignes vides finales - while(count($lignes) > 0 - AND preg_match("/^$sep*$/", $lignes[count($lignes)-1])) - unset($lignes[count($lignes)-1]); + while (count($lignes) > 0 + AND preg_match("/^$sep*$/", $lignes[count($lignes)-1])) { + unset($lignes[count($lignes)-1]); + } // calcul du nombre de colonne a chaque ligne $nbcols = array(); $max = $mil = substr_count($entete, $sep); - foreach($lignes as $k=>$v) { - if ($max <> ($nbcols[$k]= substr_count($v, $sep))) { - if ($max > $nbcols[$k]) - $mil = $nbcols[$k]; - else { $mil = $max; $max = $nbcols[$k];} - } + foreach ($lignes as $k => $v) { + if ($max <> ($nbcols[$k] = substr_count($v, $sep))) { + if ($max > $nbcols[$k]) { + $mil = $nbcols[$k]; + } else { + $mil = $max; + $max = $nbcols[$k]; + } + } } // Si pas le meme nombre, cadrer au nombre max - if ($mil <> $max) - foreach($nbcols as $k=>$v) { - if ($v < $max) $lignes[$k].= str_repeat($sep, $max-$v); - } + if ($mil <> $max) { + foreach ($nbcols as $k => $v) { + if ($v < $max) { + $lignes[$k] .= str_repeat($sep, $max-$v); + } + } + } // et retirer les colonnes integralement vides - while(true) { - $nbcols = ($entete[strlen($entete)-1]===$sep); - foreach($lignes as $v) $nbcols &= ($v[strlen($v)-1]===$sep); - if (!$nbcols) break; - $entete = substr($entete,0,-1); - foreach($lignes as $k=>$v) $lignes[$k] = substr($v,0,-1); + while (true) { + $nbcols = ($entete[strlen($entete)-1] === $sep); + foreach ($lignes as $v) { + $nbcols &= ($v[strlen($v)-1] === $sep); + } + if (!$nbcols) { + break; + } + $entete = substr($entete, 0, -1); + foreach ($lignes as $k => $v) { + $lignes[$k] = substr($v, 0, -1); + } } - foreach($lignes as &$l) { + foreach ($lignes as &$l) { $l = explode($sep, $l); } + return array(explode($sep, $entete), $lignes, $caption); } diff --git a/ecrire/inc/cvt_autosave.php b/ecrire/inc/cvt_autosave.php index 67ca4de518..ac5986f2ce 100644 --- a/ecrire/inc/cvt_autosave.php +++ b/ecrire/inc/cvt_autosave.php @@ -12,18 +12,21 @@ /** * Sauvegarde automatique des formulaires CVT - * + * * @package SPIP\Core\CVT\Autosave */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Nettoyer les échappements + * * @param $val * @return string */ -function autosave_clean_value($val){ +function autosave_clean_value($val) { return stripslashes(urldecode($val)); } @@ -34,25 +37,29 @@ function autosave_clean_value($val){ * @param array $flux * @return array */ -function cvtautosave_formulaire_charger($flux){ +function cvtautosave_formulaire_charger($flux) { if (is_array($flux['data']) - AND isset($flux['data']['_autosave_id']) - AND $cle_autosave = $flux['data']['_autosave_id']){ + AND isset($flux['data']['_autosave_id']) + AND $cle_autosave = $flux['data']['_autosave_id'] + ) { $form = $flux['args']['form']; $je_suis_poste = $flux['args']['je_suis_poste']; $cle_autosave = serialize($cle_autosave); - $cle_autosave = $form."_".md5($cle_autosave); + $cle_autosave = $form . "_" . md5($cle_autosave); // si on a un backup en session et qu'on est au premier chargement, non poste // on restitue les donnees - if (isset($GLOBALS['visiteur_session']['session_autosave_'.$cle_autosave]) - AND !$je_suis_poste) { - parse_str($GLOBALS['visiteur_session']['session_autosave_'.$cle_autosave], $vars); - foreach ($vars as $key=>$val) { - if (isset($flux['data'][$key])) - $flux['data'][$key] = (is_string($val)?autosave_clean_value($val):array_map('autosave_clean_value',$val)); + if (isset($GLOBALS['visiteur_session']['session_autosave_' . $cle_autosave]) + AND !$je_suis_poste + ) { + parse_str($GLOBALS['visiteur_session']['session_autosave_' . $cle_autosave], $vars); + foreach ($vars as $key => $val) { + if (isset($flux['data'][$key])) { + $flux['data'][$key] = (is_string($val) ? autosave_clean_value($val) : array_map('autosave_clean_value', + $val)); + } } } @@ -60,11 +67,12 @@ function cvtautosave_formulaire_charger($flux){ * Envoyer le input hidden et le bout de js qui l'utilisera */ $flux['data']['_hidden'] .= "<input type='hidden' name='autosave' class='autosaveactive' value='$cle_autosave' />" - .'<script type="text/javascript">/*<![CDATA[*/if (window.jQuery) jQuery(function(){ - $("input.autosaveactive").closest("form:not(.autosaveon)").autosave({url:"'.$GLOBALS['meta']['adresse_site'].'/"}).addClass("autosaveon"); + . '<script type="text/javascript">/*<![CDATA[*/if (window.jQuery) jQuery(function(){ + $("input.autosaveactive").closest("form:not(.autosaveon)").autosave({url:"' . $GLOBALS['meta']['adresse_site'] . '/"}).addClass("autosaveon"); });/*]]>*/</script>'; } + return $flux; } @@ -78,28 +86,31 @@ function cvtautosave_formulaire_charger($flux){ * @param array $flux * @return array */ -function cvtautosave_formulaire_traiter($flux){ +function cvtautosave_formulaire_traiter($flux) { // si on poste 'autosave' c'est qu'on n'a plus besoin de sauvegarder : // on elimine les donnees de la session - if ($cle_autosave = _request('autosave')){ + if ($cle_autosave = _request('autosave')) { include_spip('inc/session'); - session_set('session_autosave_'.$cle_autosave, null); + session_set('session_autosave_' . $cle_autosave, null); } - if (isset($GLOBALS['visiteur_session']) AND $GLOBALS['visiteur_session']){ + if (isset($GLOBALS['visiteur_session']) AND $GLOBALS['visiteur_session']) { // delai par defaut avant purge d'un backup de form : 72H - if (!defined('_AUTOSAVE_GB_DELAY')) define('_AUTOSAVE_GB_DELAY',72*3600); - $time_too_old = time() - _AUTOSAVE_GB_DELAY; + if (!defined('_AUTOSAVE_GB_DELAY')) { + define('_AUTOSAVE_GB_DELAY', 72*3600); + } + $time_too_old = time()-_AUTOSAVE_GB_DELAY; // purger aussi toutes les vieilles autosave $session = $GLOBALS['visiteur_session']; - foreach($session as $k=>$v){ - if (strncmp($k,'session_autosave_',17)==0){ + foreach ($session as $k => $v) { + if (strncmp($k, 'session_autosave_', 17) == 0) { $timestamp = 0; - if (preg_match(",&__timestamp=(\d+)$,",$v,$m)){ + if (preg_match(",&__timestamp=(\d+)$,", $v, $m)) { $timestamp = intval($m[1]); } - if ($timestamp<$time_too_old) + if ($timestamp < $time_too_old) { session_set($k, null); + } } } } diff --git a/ecrire/inc/cvt_configurer.php b/ecrire/inc/cvt_configurer.php index bc11666c49..0f73334a01 100644 --- a/ecrire/inc/cvt_configurer.php +++ b/ecrire/inc/cvt_configurer.php @@ -12,14 +12,16 @@ /** * Les formulaires CVT de configuration. - * - * Prendre en compte les `#FORMULAIRE_CONFIGURER_XX` + * + * Prendre en compte les `#FORMULAIRE_CONFIGURER_XX` * dans les squelettes de SPIP - * + * * @package SPIP\Core\Formulaires\CVT\Configurer */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/config'); @@ -29,28 +31,31 @@ include_spip('inc/config'); * @param array $flux * @return array */ -function cvtconf_formulaire_charger($flux){ +function cvtconf_formulaire_charger($flux) { if ( $form = $flux['args']['form'] - and strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX + and strncmp($form, 'configurer_', 11) == 0 // un #FORMULAIRE_CONFIGURER_XXX ) { // Pour tous les formulaires CONFIGURER, ayant une fonction charger ou pas, on teste si autorisé include_spip('inc/autoriser'); - if (!autoriser('configurer', '_'.substr($form,11))) { + if (!autoriser('configurer', '_' . substr($form, 11))) { return false; } - + // S'il n'y a pas de fonction charger(), on génère un contexte automatiquement - if (!charger_fonction("charger","formulaires/$form/",true)) { + if (!charger_fonction("charger", "formulaires/$form/", true)) { $flux['data'] = cvtconf_formulaires_configurer_recense($form); $flux['data']['editable'] = true; - if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ - if (!_AJAX) var_dump($flux['data']); + if (_request('var_mode') == 'configurer' AND autoriser('webmestre')) { + if (!_AJAX) { + var_dump($flux['data']); + } // reinjecter pour la trace au traitement $flux['data']['_hidden'] = "<input type='hidden' name='var_mode' value='configurer' />"; } } } + return $flux; } @@ -60,14 +65,15 @@ function cvtconf_formulaire_charger($flux){ * @param array $flux * @return array */ -function cvtconf_formulaire_traiter($flux){ +function cvtconf_formulaire_traiter($flux) { if ($form = $flux['args']['form'] - AND strncmp($form,'configurer_',11)==0 // un #FORMULAIRE_CONFIGURER_XXX - AND !charger_fonction("traiter","formulaires/$form/",true) // sans fonction traiter() - ) { - $trace = cvtconf_formulaires_configurer_enregistre($form,$flux['args']['args']); - $flux['data'] = array('message_ok'=>_T('config_info_enregistree').$trace,'editable'=>true); + AND strncmp($form, 'configurer_', 11) == 0 // un #FORMULAIRE_CONFIGURER_XXX + AND !charger_fonction("traiter", "formulaires/$form/", true) // sans fonction traiter() + ) { + $trace = cvtconf_formulaires_configurer_enregistre($form, $flux['args']['args']); + $flux['data'] = array('message_ok' => _T('config_info_enregistree') . $trace, 'editable' => true); } + return $flux; } @@ -83,35 +89,38 @@ function cvtconf_formulaire_traiter($flux){ * arguments de l'appel de la fonction traiter ($args = func_get_args();) * @return string */ -function cvtconf_formulaires_configurer_enregistre($form, $args){ - $valeurs = array(); - // charger les valeurs - // ce qui permet de prendre en charge une fonction charger() existante - // qui prend alors la main sur l'auto detection - if ($charger_valeurs = charger_fonction("charger","formulaires/$form/",true)) - $valeurs = call_user_func_array($charger_valeurs,$args); - $valeurs = pipeline( - 'formulaire_charger', - array( - 'args'=>array('form'=>$form,'args'=>$args,'je_suis_poste'=>false), - 'data'=>$valeurs) - ); - // ne pas stocker editable ! - unset($valeurs['editable']); - - // recuperer les valeurs postees - $store = array(); - foreach($valeurs as $k=>$v){ - if (substr($k,0,1)!=='_') - $store[$k] = _request($k); +function cvtconf_formulaires_configurer_enregistre($form, $args) { + $valeurs = array(); + // charger les valeurs + // ce qui permet de prendre en charge une fonction charger() existante + // qui prend alors la main sur l'auto detection + if ($charger_valeurs = charger_fonction("charger", "formulaires/$form/", true)) { + $valeurs = call_user_func_array($charger_valeurs, $args); + } + $valeurs = pipeline( + 'formulaire_charger', + array( + 'args' => array('form' => $form, 'args' => $args, 'je_suis_poste' => false), + 'data' => $valeurs + ) + ); + // ne pas stocker editable ! + unset($valeurs['editable']); + + // recuperer les valeurs postees + $store = array(); + foreach ($valeurs as $k => $v) { + if (substr($k, 0, 1) !== '_') { + $store[$k] = _request($k); } + } - return cvtconf_configurer_stocker($form,$valeurs,$store); + return cvtconf_configurer_stocker($form, $valeurs, $store); } /** * Définir la règle de conteneur, en fonction de la présence de certaines données - * + * * - `_meta_table` : nom de la table `spip_metas` ou stocker (par défaut 'meta') * - `_meta_casier` : nom du casier dans lequel sérialiser (par défaut xx de `formulaire_configurer_xx`) * - `_meta_prefixe` : préfixer les `meta` (alternative au casier) dans la table des meta (par defaur rien) @@ -122,25 +131,31 @@ function cvtconf_formulaires_configurer_enregistre($form, $args){ * @return array */ function cvtconf_definir_configurer_conteneur($form, $valeurs) { - // stocker en base - // par defaut, dans un casier serialize dans spip_meta (idem CFG) - $casier = substr($form,11); - $table = 'meta'; - $prefixe = ''; - $stockage = ''; - - if (isset($valeurs['_meta_casier'])) $casier = $valeurs['_meta_casier']; - if (isset($valeurs['_meta_prefixe'])) $prefixe = $valeurs['_meta_prefixe']; - if (isset($valeurs['_meta_stockage'])) $stockage = $valeurs['_meta_stockage'] . '::'; - - // si on indique juste une table, il faut vider les autres proprietes - // car par defaut on utilise ni casier ni prefixe dans ce cas - if (isset($valeurs['_meta_table'])) { - $table = $valeurs['_meta_table']; - $casier = (isset($valeurs['_meta_casier'])?$valeurs['_meta_casier']:''); - } - - return array($table,$casier,$prefixe,$stockage); + // stocker en base + // par defaut, dans un casier serialize dans spip_meta (idem CFG) + $casier = substr($form, 11); + $table = 'meta'; + $prefixe = ''; + $stockage = ''; + + if (isset($valeurs['_meta_casier'])) { + $casier = $valeurs['_meta_casier']; + } + if (isset($valeurs['_meta_prefixe'])) { + $prefixe = $valeurs['_meta_prefixe']; + } + if (isset($valeurs['_meta_stockage'])) { + $stockage = $valeurs['_meta_stockage'] . '::'; + } + + // si on indique juste une table, il faut vider les autres proprietes + // car par defaut on utilise ni casier ni prefixe dans ce cas + if (isset($valeurs['_meta_table'])) { + $table = $valeurs['_meta_table']; + $casier = (isset($valeurs['_meta_casier']) ? $valeurs['_meta_casier'] : ''); + } + + return array($table, $casier, $prefixe, $stockage); } /** @@ -150,44 +165,51 @@ function cvtconf_definir_configurer_conteneur($form, $valeurs) { * @param string $form * @return array */ -function cvtconf_formulaires_configurer_recense($form){ - $valeurs = array('editable'=>' '); +function cvtconf_formulaires_configurer_recense($form) { + $valeurs = array('editable' => ' '); // sinon cas analyse du squelette - if ($f = find_in_path($form.'.' . _EXTENSION_SQUELETTES, 'formulaires/') - AND lire_fichier($f, $contenu)) { + if ($f = find_in_path($form . '.' . _EXTENSION_SQUELETTES, 'formulaires/') + AND lire_fichier($f, $contenu) + ) { - for ($i=0;$i<2;$i++) { + for ($i = 0; $i < 2; $i++) { // a la seconde iteration, evaluer le fond avec les valeurs deja trouvees // permet de trouver aussi les name="#GET{truc}" - if ($i==1) $contenu = recuperer_fond("formulaires/$form",$valeurs); + if ($i == 1) { + $contenu = recuperer_fond("formulaires/$form", $valeurs); + } - $balises = array_merge(extraire_balises($contenu,'input'), - extraire_balises($contenu,'textarea'), - extraire_balises($contenu,'select')); + $balises = array_merge(extraire_balises($contenu, 'input'), + extraire_balises($contenu, 'textarea'), + extraire_balises($contenu, 'select')); - foreach($balises as $b) { + foreach ($balises as $b) { if ($n = extraire_attribut($b, 'name') - AND preg_match(",^([\w\-]+)(\[\w*\])?$,",$n,$r) - AND !in_array($n,array('formulaire_action','formulaire_action_args')) - AND extraire_attribut($b,'type')!=='submit') { - $valeurs[$r[1]] = ''; - // recuperer les valeurs _meta_xx qui peuvent etre fournies - // en input hidden dans le squelette - if (strncmp($r[1],'_meta_',6)==0) - $valeurs[$r[1]] = extraire_attribut($b,'value'); + AND preg_match(",^([\w\-]+)(\[\w*\])?$,", $n, $r) + AND !in_array($n, array('formulaire_action', 'formulaire_action_args')) + AND extraire_attribut($b, 'type') !== 'submit' + ) { + $valeurs[$r[1]] = ''; + // recuperer les valeurs _meta_xx qui peuvent etre fournies + // en input hidden dans le squelette + if (strncmp($r[1], '_meta_', 6) == 0) { + $valeurs[$r[1]] = extraire_attribut($b, 'value'); } + } } } } - cvtconf_configurer_lire_meta($form,$valeurs); + cvtconf_configurer_lire_meta($form, $valeurs); + return $valeurs; } /** * Stocker les metas + * * @param string $form * @param array $valeurs * @param array $store @@ -195,47 +217,50 @@ function cvtconf_formulaires_configurer_recense($form){ */ function cvtconf_configurer_stocker($form, $valeurs, $store) { $trace = ''; - list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs); + list($table, $casier, $prefixe, $stockage) = cvtconf_definir_configurer_conteneur($form, $valeurs); // stocker en base // par defaut, dans un casier serialize dans spip_meta (idem CFG) - if (!isset($GLOBALS[$table])) + if (!isset($GLOBALS[$table])) { lire_metas($table); + } + + $prefixe = ($prefixe ? $prefixe . '_' : ''); + $table = ($table) ? "/$table/" : ""; + $casier = ($casier) ? rtrim($casier, '/') . '/' : ""; // slash final, sinon rien - $prefixe = ($prefixe?$prefixe.'_':''); - $table = ($table) ? "/$table/" : ""; - $casier = ($casier) ? rtrim($casier,'/').'/' : ""; // slash final, sinon rien - - foreach($store as $k=>$v){ + foreach ($store as $k => $v) { ecrire_config("$stockage$table$prefixe$casier$k", $v); - if (_request('var_mode')=='configurer' AND autoriser('webmestre')){ - $trace .= "<br />table $table : ".$prefixe.$k." = $v;"; + if (_request('var_mode') == 'configurer' AND autoriser('webmestre')) { + $trace .= "<br />table $table : " . $prefixe . $k . " = $v;"; } } + return $trace; } /** * Lecture en base des metas d'un form + * * @param string $form * @param array $valeurs */ function cvtconf_configurer_lire_meta($form, &$valeurs) { - list($table,$casier,$prefixe,$stockage) = cvtconf_definir_configurer_conteneur($form,$valeurs); + list($table, $casier, $prefixe, $stockage) = cvtconf_definir_configurer_conteneur($form, $valeurs); - $table = ($table) ? "/$table/" : ""; - $prefixe = ($prefixe?$prefixe.'_':''); + $table = ($table) ? "/$table/" : ""; + $prefixe = ($prefixe ? $prefixe . '_' : ''); if ($casier) { $meta = lire_config("$stockage$table$prefixe$casier"); $prefixe = ''; - } - else { + } else { $table = rtrim($table, '/'); $meta = lire_config("$stockage$table"); } - foreach($valeurs as $k=>$v){ - if (substr($k,0,1)!=='_') - $valeurs[$k] = (isset($meta[$prefixe.$k])?$meta[$prefixe.$k]:''); + foreach ($valeurs as $k => $v) { + if (substr($k, 0, 1) !== '_') { + $valeurs[$k] = (isset($meta[$prefixe . $k]) ? $meta[$prefixe . $k] : ''); + } } } diff --git a/ecrire/inc/cvt_multietapes.php b/ecrire/inc/cvt_multietapes.php index 47df3f60bc..9c351d9fcd 100644 --- a/ecrire/inc/cvt_multietapes.php +++ b/ecrire/inc/cvt_multietapes.php @@ -32,7 +32,7 @@ * * Charger : * `formulaires_truc_charger_dist()` : - * passer '_etapes' => nombre total d'etapes de saisies (>1 !) + * passer '_etapes' => nombre total d'etapes de saisies (>1 !) * indiquer toutes les valeurs à saisir sur toutes les pages * comme si il s'agissait d'un formulaire unique * @@ -45,9 +45,9 @@ * - formulaires_truc_verifier_2_dist() : verifier les saisies de l'etape 2 * - formulaires_truc_verifier_n_dist() : verifier les saisies de l'etape n * - * Il est possible d'implémenter toutes les vérifications dans une fonction unique + * Il est possible d'implémenter toutes les vérifications dans une fonction unique * qui sera alors appelée avec en premier argument le numero de l'étape à vérifier - * `formulaires_truc_verifier_etape_dist($etape,...)` : vérifier les saisies + * `formulaires_truc_verifier_etape_dist($etape,...)` : vérifier les saisies * de l'étape `$etape` uniquement. * * À chaque étape x, les étapes 1 a x sont appelées en vérification @@ -60,12 +60,14 @@ * `formulaires_truc_traiter_dist()` : ne sera appelé que lorsque **toutes** * les étapes auront été saisies sans erreur. * - * La fonction traiter peut donc traiter l'ensemble des saisies comme si il - * s'agissait d'un formulaire unique dans lequel toutes les données auraient + * La fonction traiter peut donc traiter l'ensemble des saisies comme si il + * s'agissait d'un formulaire unique dans lequel toutes les données auraient * été saisies en une fois. */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Reinjecter dans _request() les valeurs postees @@ -74,70 +76,79 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param string $form * @return array */ -function cvtmulti_recuperer_post_precedents($form){ +function cvtmulti_recuperer_post_precedents($form) { include_spip('inc/filtres'); if ($form - AND $c = _request('cvtm_prev_post') - AND $c = decoder_contexte_ajax($c, $form)){ + AND $c = _request('cvtm_prev_post') + AND $c = decoder_contexte_ajax($c, $form) + ) { #var_dump($c); - + # reinjecter dans la bonne variable pour permettre de retrouver # toutes les saisies dans un seul tableau - if ($_SERVER['REQUEST_METHOD']=='POST') + if ($_SERVER['REQUEST_METHOD'] == 'POST') { $store = &$_POST; - else + } else { $store = &$_GET; + } - foreach($c as $k=>$v) - // on ecrase pas si saisi a nouveau ! - if (!isset($store[$k])) + foreach ($c as $k => $v) // on ecrase pas si saisi a nouveau ! + { + if (!isset($store[$k])) { $_REQUEST[$k] = $store[$k] = $v; - // mais si tableau des deux cotes, on merge avec priorite a la derniere saisie - elseif(is_array($store[$k]) - AND is_array($v) + } // mais si tableau des deux cotes, on merge avec priorite a la derniere saisie + elseif (is_array($store[$k]) + AND is_array($v) AND $z = array_keys($v) AND !is_numeric(reset($z)) AND $z = array_keys($store[$k]) AND !is_numeric(reset($z)) - ) - $_REQUEST[$k] = $store[$k] = array_merge($v,$store[$k]); + ) { + $_REQUEST[$k] = $store[$k] = array_merge($v, $store[$k]); + } + } // vider pour eviter un second appel a verifier_n // en cas de double implementation (unipotence) set_request('cvtm_prev_post'); - return array($c['_etape'],$c['_etapes']); + + return array($c['_etape'], $c['_etapes']); } + return false; } /** * Sauvegarder les valeurs postees dans une variable encodee * pour les recuperer a la prochaine etape - * + * * @param string $form * @param bool $je_suis_poste * @param array $valeurs * @return array */ -function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs){ - if (!isset($valeurs['_cvtm_prev_post'])){ - $post = array('_etape'=>$valeurs['_etape'],'_etapes'=>$valeurs['_etapes']); - foreach(array_keys($valeurs) as $champ){ - if (substr($champ,0,1)!=='_'){ +function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs) { + if (!isset($valeurs['_cvtm_prev_post'])) { + $post = array('_etape' => $valeurs['_etape'], '_etapes' => $valeurs['_etapes']); + foreach (array_keys($valeurs) as $champ) { + if (substr($champ, 0, 1) !== '_') { if ($je_suis_poste || (isset($valeurs['_forcer_request']) && $valeurs['_forcer_request'])) { - if (($v = _request($champ))!==NULL) + if (($v = _request($champ)) !== null) { $post[$champ] = $v; + } } } } include_spip('inc/filtres'); - $c = encoder_contexte_ajax($post,$form); - if (!isset($valeurs['_hidden'])) + $c = encoder_contexte_ajax($post, $form); + if (!isset($valeurs['_hidden'])) { $valeurs['_hidden'] = ''; + } $valeurs['_hidden'] .= "<input type='hidden' name='cvtm_prev_post' value='$c' />"; // marquer comme fait, pour eviter double encodage (unipotence) $valeurs['_cvtm_prev_post'] = true; } + return $valeurs; } @@ -145,26 +156,28 @@ function cvtmulti_sauver_post($form, $je_suis_poste, &$valeurs){ /** * Reperer une demande de formulaire CVT multi page * et la reformater - * + * * @param <type> $flux - * @return <type> + * @return <type> */ -function cvtmulti_formulaire_charger($flux){ +function cvtmulti_formulaire_charger($flux) { #var_dump($flux['data']['_etapes']); if (is_array($flux['data']) - AND isset($flux['data']['_etapes'])){ + AND isset($flux['data']['_etapes']) + ) { $form = $flux['args']['form']; $je_suis_poste = $flux['args']['je_suis_poste']; $nb_etapes = $flux['data']['_etapes']; $etape = _request('_etape'); - $etape = min(max($etape,1),$nb_etapes); - set_request('_etape',$etape); + $etape = min(max($etape, 1), $nb_etapes); + set_request('_etape', $etape); $flux['data']['_etape'] = $etape; // sauver les posts de cette etape pour les avoir a la prochaine etape $flux['data'] = cvtmulti_sauver_post($form, $je_suis_poste, $flux['data']); #var_dump($flux['data']); } + return $flux; } @@ -175,59 +188,64 @@ function cvtmulti_formulaire_charger($flux){ * @param array $flux * @return array */ -function cvtmulti_formulaire_verifier($flux){ +function cvtmulti_formulaire_verifier($flux) { #var_dump('Pipe verifier'); - + if ($form = $flux['args']['form'] - AND ($e = cvtmulti_recuperer_post_precedents($form))!==false){ + AND ($e = cvtmulti_recuperer_post_precedents($form)) !== false + ) { // recuperer l'etape saisie et le nombre d'etapes total - list($etape,$etapes) = $e; + list($etape, $etapes) = $e; $etape_demandee = _request('aller_a_etape'); // possibilite de poster en entier dans aller_a_etape // lancer les verifs pour chaque etape deja saisie de 1 a $etape $erreurs = array(); $derniere_etape_ok = 0; $e = 0; - while ($e<$etape AND $e<$etapes){ + while ($e < $etape AND $e < $etapes) { $e++; $erreurs[$e] = array(); - if ($verifier = charger_fonction("verifier_$e","formulaires/$form/",true)) + if ($verifier = charger_fonction("verifier_$e", "formulaires/$form/", true)) { $erreurs[$e] = call_user_func_array($verifier, $flux['args']['args']); - elseif ($verifier = charger_fonction("verifier_etape","formulaires/$form/",true)){ + } elseif ($verifier = charger_fonction("verifier_etape", "formulaires/$form/", true)) { $args = $flux['args']['args']; array_unshift($args, $e); $erreurs[$e] = call_user_func_array($verifier, $args); } - if ($derniere_etape_ok==$e-1 AND !count($erreurs[$e])) + if ($derniere_etape_ok == $e-1 AND !count($erreurs[$e])) { $derniere_etape_ok = $e; + } // possibilite de poster dans _retour_etape_x - if (!is_null(_request("_retour_etape_$e"))) + if (!is_null(_request("_retour_etape_$e"))) { $etape_demandee = $e; + } } // si la derniere etape OK etait la derniere // on renvoie le flux inchange et ca declenche traiter - if ($derniere_etape_ok==$etapes AND !$etape_demandee){ + if ($derniere_etape_ok == $etapes AND !$etape_demandee) { return $flux; - } - else { + } else { $etape = $derniere_etape_ok+1; - if ($etape_demandee>0 AND $etape_demandee<$etape) + if ($etape_demandee > 0 AND $etape_demandee < $etape) { $etape = $etape_demandee; - $etape = min($etape,$etapes); + } + $etape = min($etape, $etapes); #var_dump("prochaine etape $etape"); // retourner les erreurs de l'etape ciblee - $flux['data'] = isset($erreurs[$etape]) ? $erreurs[$etape] : array() ; + $flux['data'] = isset($erreurs[$etape]) ? $erreurs[$etape] : array(); // Ne pas se tromper dans le texte du message d'erreur : la clé '_etapes' n'est pas une erreur ! if ($flux['data']) { - $flux['data']['message_erreur'] = singulier_ou_pluriel(count($flux['data']), 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie'); + $flux['data']['message_erreur'] = singulier_ou_pluriel(count($flux['data']), 'avis_1_erreur_saisie', + 'avis_nb_erreurs_saisie'); } else { $flux['data']['message_erreur'] = ""; } $flux['data']['_etapes'] = "etape suivante $etape"; - set_request('_etape',$etape); + set_request('_etape', $etape); } } + return $flux; } @@ -235,19 +253,22 @@ function cvtmulti_formulaire_verifier($flux){ * Selectionner le bon fond en fonction de l'etape * L'etape 1 est sur le fond sans suffixe * Les autres etapes x sont sur le fond _x - * + * * @param array $flux * @return array */ -function cvtmulti_styliser($flux){ - if (strncmp($flux['args']['fond'],'formulaires/',12)==0 - AND isset($flux['args']['contexte']['_etapes']) - AND isset($flux['args']['contexte']['_etape']) - AND ($e=$flux['args']['contexte']['_etape'])>1 +function cvtmulti_styliser($flux) { + if (strncmp($flux['args']['fond'], 'formulaires/', 12) == 0 + AND isset($flux['args']['contexte']['_etapes']) + AND isset($flux['args']['contexte']['_etape']) + AND ($e = $flux['args']['contexte']['_etape']) > 1 AND $ext = $flux['args']['ext'] - AND $f=$flux['data'] - AND file_exists($f."_$e.$ext")) - $flux['data'] = $f."_$e"; + AND $f = $flux['data'] + AND file_exists($f . "_$e.$ext") + ) { + $flux['data'] = $f . "_$e"; + } + return $flux; } diff --git a/ecrire/inc/distant.php b/ecrire/inc/distant.php index 7d9ca70439..df458c1cda 100644 --- a/ecrire/inc/distant.php +++ b/ecrire/inc/distant.php @@ -15,13 +15,25 @@ * * @package SPIP\Core\Distant **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -if (!defined('_INC_DISTANT_VERSION_HTTP')) define('_INC_DISTANT_VERSION_HTTP', "HTTP/1.0"); -if (!defined('_INC_DISTANT_CONTENT_ENCODING')) define('_INC_DISTANT_CONTENT_ENCODING', "gzip"); -if (!defined('_INC_DISTANT_USER_AGENT')) define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . " (" . $GLOBALS['home_server'] . ")"); -if (!defined('_INC_DISTANT_MAX_SIZE')) define('_INC_DISTANT_MAX_SIZE', 2097152); -if (!defined('_INC_DISTANT_CONNECT_TIMEOUT')) define('_INC_DISTANT_CONNECT_TIMEOUT',10); +if (!defined('_INC_DISTANT_VERSION_HTTP')) { + define('_INC_DISTANT_VERSION_HTTP', "HTTP/1.0"); +} +if (!defined('_INC_DISTANT_CONTENT_ENCODING')) { + define('_INC_DISTANT_CONTENT_ENCODING', "gzip"); +} +if (!defined('_INC_DISTANT_USER_AGENT')) { + define('_INC_DISTANT_USER_AGENT', 'SPIP-' . $GLOBALS['spip_version_affichee'] . " (" . $GLOBALS['home_server'] . ")"); +} +if (!defined('_INC_DISTANT_MAX_SIZE')) { + define('_INC_DISTANT_MAX_SIZE', 2097152); +} +if (!defined('_INC_DISTANT_CONNECT_TIMEOUT')) { + define('_INC_DISTANT_CONNECT_TIMEOUT', 10); +} define('_REGEXP_COPIE_LOCALE', ',' . preg_replace('@^https?:@', 'https?:', @@ -51,18 +63,19 @@ define('_REGEXP_COPIE_LOCALE', ',' . * taille maxi de la copie local, par defaut _COPIE_LOCALE_MAX_SIZE * @return bool|string */ -function copie_locale($source, $mode = 'auto', $local = null, $taille_max=null){ +function copie_locale($source, $mode = 'auto', $local = null, $taille_max = null) { // si c'est la protection de soi-meme, retourner le path - if ($mode!=='force' AND preg_match(_REGEXP_COPIE_LOCALE, $source, $match)){ + if ($mode !== 'force' AND preg_match(_REGEXP_COPIE_LOCALE, $source, $match)) { $source = substr(_DIR_IMG, strlen(_DIR_RACINE)) . urldecode($match[1]); + return @file_exists($source) ? $source : false; } - if (is_null($local)) + if (is_null($local)) { $local = fichier_copie_locale($source); - else { - if (_DIR_RACINE AND strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE))==0){ + } else { + if (_DIR_RACINE AND strncmp(_DIR_RACINE, $local, strlen(_DIR_RACINE)) == 0) { $local = substr($local, strlen(_DIR_RACINE)); } } @@ -70,28 +83,37 @@ function copie_locale($source, $mode = 'auto', $local = null, $taille_max=null){ // si $local = '' c'est un fichier refuse par fichier_copie_locale(), // par exemple un fichier qui ne figure pas dans nos documents ; // dans ce cas on n'essaie pas de le telecharger pour ensuite echouer - if (!$local) return false; + if (!$local) { + return false; + } $localrac = _DIR_RACINE . $local; - $t = ($mode=='force') ? false : @file_exists($localrac); + $t = ($mode == 'force') ? false : @file_exists($localrac); // test d'existence du fichier - if ($mode=='test') return $t ? $local : ''; + if ($mode == 'test') { + return $t ? $local : ''; + } // sinon voir si on doit/peut le telecharger - if ($local==$source OR !tester_url_absolue($source)) + if ($local == $source OR !tester_url_absolue($source)) { return $local; + } - if ($mode=='modif' OR !$t){ + if ($mode == 'modif' OR !$t) { // passer par un fichier temporaire unique pour gerer les echecs en cours de recuperation // et des eventuelles recuperations concurantes include_spip("inc/acces"); - if (!$taille_max) $taille_max = _COPIE_LOCALE_MAX_SIZE; - $res = recuperer_url($source, array('file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '')); - if (!$res OR (!$res["length"] AND $res["status"]!=304)){ - spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . $res["status"], _LOG_INFO_IMPORTANTE); + if (!$taille_max) { + $taille_max = _COPIE_LOCALE_MAX_SIZE; } - if (!$res['length']){ + $res = recuperer_url($source, + array('file' => $localrac, 'taille_max' => $taille_max, 'if_modified_since' => $t ? filemtime($localrac) : '')); + if (!$res OR (!$res["length"] AND $res["status"] != 304)) { + spip_log("copie_locale : Echec recuperation $source sur $localrac status : " . $res["status"], + _LOG_INFO_IMPORTANTE); + } + if (!$res['length']) { // si $t c'est sans doute juste un not-modified-since return $t ? $local : false; } @@ -128,20 +150,20 @@ function copie_locale($source, $mode = 'auto', $local = null, $taille_max=null){ * @return array * entete,corps */ -function prepare_donnees_post($donnees, $boundary = ''){ +function prepare_donnees_post($donnees, $boundary = '') { // permettre a la fonction qui a demande le post de formater elle meme ses donnees // pour un appel soap par exemple // l'entete est separe des donnees par un double retour a la ligne // on s'occupe ici de passer tous les retours lignes (\r\n, \r ou \n) en \r\n - if (is_string($donnees) && strlen($donnees)){ + if (is_string($donnees) && strlen($donnees)) { $entete = ""; // on repasse tous les \r\n et \r en simples \n $donnees = str_replace("\r\n", "\n", $donnees); $donnees = str_replace("\r", "\n", $donnees); // un double retour a la ligne signifie la fin de l'entete et le debut des donnees $p = strpos($donnees, "\n\n"); - if ($p!==FALSE){ + if ($p !== false) { $entete = str_replace("\n", "\r\n", substr($donnees, 0, $p+1)); $donnees = substr($donnees, $p+2); } @@ -149,11 +171,11 @@ function prepare_donnees_post($donnees, $boundary = ''){ } else { /* boundary automatique */ // Si on a plus de 500 octects de donnees, on "boundarise" - if ($boundary===''){ + if ($boundary === '') { $taille = 0; - foreach ($donnees as $cle => $valeur){ - if (is_array($valeur)){ - foreach ($valeur as $val2){ + foreach ($donnees as $cle => $valeur) { + if (is_array($valeur)) { + foreach ($valeur as $val2) { $taille += strlen($val2); } } else { @@ -161,19 +183,19 @@ function prepare_donnees_post($donnees, $boundary = ''){ $taille += strlen($valeur); } } - if ($taille>500){ + if ($taille > 500) { $boundary = substr(md5(rand() . 'spip'), 0, 8); } } - if (is_string($boundary) and strlen($boundary)){ + if (is_string($boundary) and strlen($boundary)) { // fabrique une chaine HTTP pour un POST avec boundary $entete = "Content-Type: multipart/form-data; boundary=$boundary\r\n"; $chaine = ''; - if (is_array($donnees)){ - foreach ($donnees as $cle => $valeur){ - if (is_array($valeur)){ - foreach ($valeur as $val2){ + if (is_array($donnees)) { + foreach ($donnees as $cle => $valeur) { + if (is_array($valeur)) { + foreach ($valeur as $val2) { $chaine .= "\r\n--$boundary\r\n"; $chaine .= "Content-Disposition: form-data; name=\"{$cle}[]\"\r\n"; $chaine .= "\r\n"; @@ -192,10 +214,10 @@ function prepare_donnees_post($donnees, $boundary = ''){ // fabrique une chaine HTTP simple pour un POST $entete = 'Content-Type: application/x-www-form-urlencoded' . "\r\n"; $chaine = array(); - if (is_array($donnees)){ - foreach ($donnees as $cle => $valeur){ - if (is_array($valeur)){ - foreach ($valeur as $val2){ + if (is_array($donnees)) { + foreach ($donnees as $cle => $valeur) { + if (is_array($valeur)) { + foreach ($valeur as $val2) { $chaine[] = rawurlencode($cle) . '[]=' . rawurlencode($val2); } } else { @@ -208,6 +230,7 @@ function prepare_donnees_post($donnees, $boundary = ''){ } } } + return array($entete, $chaine); } @@ -246,7 +269,7 @@ function prepare_donnees_post($donnees, $boundary = ''){ * * string file : nom du fichier si enregistre dans un fichier */ -function recuperer_url($url, $options = array()){ +function recuperer_url($url, $options = array()) { $default = array( 'transcoder' => false, 'methode' => 'GET', @@ -264,41 +287,57 @@ function recuperer_url($url, $options = array()){ // copier directement dans un fichier ? $copy = $options['file']; - if ($options['methode']=="HEAD") + if ($options['methode'] == "HEAD") { $options['taille_max'] = 0; - if (is_null($options['taille_max'])) + } + if (is_null($options['taille_max'])) { $options['taille_max'] = $copy ? _COPIE_LOCALE_MAX_SIZE : _INC_DISTANT_MAX_SIZE; + } - if (!empty($options['datas'])){ + if (!empty($options['datas'])) { $options['methode'] = 'POST'; list($head, $postdata) = prepare_donnees_post($options['datas'], $options['boundary']); - if (stripos($head, "Content-Length:")===false) + if (stripos($head, "Content-Length:") === false) { $head .= 'Content-Length: ' . strlen($postdata); + } $options['datas'] = $head . "\r\n\r\n" . $postdata; } // Accepter les URLs au format feed:// ou qui ont oublie le http:// ou les urls relatives au protocole $url = preg_replace(',^feed://,i', 'http://', $url); - if (!tester_url_absolue($url)) $url = 'http://' . $url; - elseif (strncmp($url,"//",2)==0) $url = 'http:' . $url; + if (!tester_url_absolue($url)) { + $url = 'http://' . $url; + } elseif (strncmp($url, "//", 2) == 0) { + $url = 'http:' . $url; + } - $result = array('status' => 0, 'headers' => '', 'page' => '', 'length' => 0, 'last_modified' => '', 'location' => '', 'url' => $url); + $result = array( + 'status' => 0, + 'headers' => '', + 'page' => '', + 'length' => 0, + 'last_modified' => '', + 'location' => '', + 'url' => $url + ); // si on ecrit directement dans un fichier, pour ne pas manipuler en memoire refuser gz $refuser_gz = (($options['refuser_gz'] OR $copy) ? true : false); // ouvrir la connexion et envoyer la requete et ses en-tetes - list($handle, $fopen) = init_http($options['methode'], $url, $refuser_gz, $options['uri_referer'], $options['datas'], $options['version_http'], $options['if_modified_since']); - if (!$handle){ + list($handle, $fopen) = init_http($options['methode'], $url, $refuser_gz, $options['uri_referer'], $options['datas'], + $options['version_http'], $options['if_modified_since']); + if (!$handle) { spip_log("ECHEC init_http $url"); + return false; } // Sauf en fopen, envoyer le flux d'entree // et recuperer les en-tetes de reponses - if (!$fopen){ + if (!$fopen) { $res = recuperer_entetes_complets($handle, $options['if_modified_since']); - if (!$res){ + if (!$res) { fclose($handle); $t = @parse_url($url); $host = $t['host']; @@ -306,9 +345,9 @@ function recuperer_url($url, $options = array()){ // les actions liberticides de l'empire du milieu if (!need_proxy($host) AND $res = @file_get_contents($url) - ){ + ) { $result['length'] = strlen($res); - if ($copy){ + if ($copy) { ecrire_fichier($copy, $res); $result['file'] = $copy; } else { @@ -317,44 +356,51 @@ function recuperer_url($url, $options = array()){ $res = array( 'status' => 200, ); - } else + } else { return false; + } } elseif ($res['location'] AND $options['follow_location']) { $options['follow_location']--; fclose($handle); include_spip('inc/filtres'); $url = suivre_lien($url, $res['location']); spip_log("recuperer_url recommence sur $url"); + return recuperer_url($url, $options); - } elseif ($res['status']!==200) { + } elseif ($res['status'] !== 200) { spip_log("HTTP status " . $res['status'] . " pour $url"); } $result['status'] = $res['status']; - if (isset($res['headers'])) + if (isset($res['headers'])) { $result['headers'] = $res['headers']; - if (isset($res['last_modified'])) + } + if (isset($res['last_modified'])) { $result['last_modified'] = $res['last_modified']; - if (isset($res['location'])) + } + if (isset($res['location'])) { $result['location'] = $res['location']; + } } // on ne veut que les entetes - if (!$options['taille_max'] OR $options['methode']=='HEAD' OR $result['status']=="304") + if (!$options['taille_max'] OR $options['methode'] == 'HEAD' OR $result['status'] == "304") { return $result; + } // s'il faut deballer, le faire via un fichier temporaire // sinon la memoire explose pour les gros flux $gz = false; - if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) + if (preg_match(",\bContent-Encoding: .*gzip,is", $result['headers'])) { $gz = (_DIR_TMP . md5(uniqid(mt_rand())) . '.tmp.gz'); + } // si on a pas deja recuperer le contenu par une methode detournee - if (!$result['length']){ + if (!$result['length']) { $res = recuperer_body($handle, $options['taille_max'], $gz ? $gz : $copy); fclose($handle); - if ($copy){ + if ($copy) { $result['length'] = $res; $result['file'] = $copy; } elseif ($res) { @@ -362,17 +408,18 @@ function recuperer_url($url, $options = array()){ $result['length'] = strlen($result['page']); } } - if (!$result['page']) + if (!$result['page']) { return $result; + } // Decompresser au besoin - if ($gz){ + if ($gz) { $result['page'] = implode('', gzfile($gz)); supprimer_fichier($gz); } // Faut-il l'importer dans notre charset local ? - if ($options['transcoder']){ + if ($options['transcoder']) { include_spip('inc/charsets'); $result['page'] = transcoder_page($result['page'], $result['headers']); } @@ -384,6 +431,7 @@ function recuperer_url($url, $options = array()){ * Recuperer une URL si on l'a pas deja dans un cache fichier * le delai de cache est fourni par l'option delai_cache * les autres options et le format de retour sont identiques a recuperer_url_cache + * * @uses recuperer_url() * * @param string $url @@ -391,8 +439,10 @@ function recuperer_url($url, $options = array()){ * int delai_cache : anciennete acceptable pour le contenu (en seconde) * @return array|bool|mixed */ -function recuperer_url_cache($url, $options = array()){ - if (!defined('_DELAI_RECUPERER_URL_CACHE')) define('_DELAI_RECUPERER_URL_CACHE', 3600); +function recuperer_url_cache($url, $options = array()) { + if (!defined('_DELAI_RECUPERER_URL_CACHE')) { + define('_DELAI_RECUPERER_URL_CACHE', 3600); + } $default = array( 'transcoder' => false, 'methode' => 'GET', @@ -410,13 +460,15 @@ function recuperer_url_cache($url, $options = array()){ $options = array_merge($default, $options); // cas ou il n'est pas possible de cacher - if (!empty($options['data']) OR $options['methode']=='POST') + if (!empty($options['data']) OR $options['methode'] == 'POST') { return recuperer_url($url, $options); + } // ne pas tenter plusieurs fois la meme url en erreur (non cachee donc) static $errors = array(); - if (isset($errors[$url])) + if (isset($errors[$url])) { return $errors[$url]; + } $sig = $options; unset($sig['if_modified_since']); @@ -430,22 +482,23 @@ function recuperer_url_cache($url, $options = array()){ $res = false; $is_cached = file_exists($cache); if ($is_cached - AND (filemtime($cache)>$_SERVER['REQUEST_TIME']-$options['delai_cache']) - ){ + AND (filemtime($cache) > $_SERVER['REQUEST_TIME']-$options['delai_cache']) + ) { lire_fichier($cache, $res); - if ($res = unserialize($res)){ + if ($res = unserialize($res)) { // mettre le last_modified et le status=304 ? } } - if (!$res){ + if (!$res) { $res = recuperer_url($url, $options); // ne pas recharger cette url non cachee dans le meme hit puisque non disponible - if (!$res){ - if ($is_cached){ + if (!$res) { + if ($is_cached) { // on a pas reussi a recuperer mais on avait un cache : l'utiliser lire_fichier($cache, $res); $res = unserialize($res); } + return $errors[$url] = $res; } ecrire_fichier($cache, serialize($res)); @@ -488,19 +541,28 @@ function recuperer_url_cache($url, $options = array()){ * - Code de la page obtenue (avec ou sans entête) * - false si la page n'a pu être récupérée (status different de 200) **/ -function recuperer_page($url, $trans = false, $get_headers = false, - $taille_max = null, $datas = '', $boundary = '', $refuser_gz = false, - $date_verif = '', $uri_referer = ''){ +function recuperer_page( + $url, + $trans = false, + $get_headers = false, + $taille_max = null, + $datas = '', + $boundary = '', + $refuser_gz = false, + $date_verif = '', + $uri_referer = '' +) { // $copy = copier le fichier ? - $copy = (is_string($trans) AND strlen($trans)>5); // eviter "false" :-) + $copy = (is_string($trans) AND strlen($trans) > 5); // eviter "false" :-) - if (!is_null($taille_max) and ($taille_max==0)) + if (!is_null($taille_max) and ($taille_max == 0)) { $get = 'HEAD'; - else + } else { $get = 'GET'; + } $options = array( - 'transcoder' => $trans===true, + 'transcoder' => $trans === true, 'methode' => $get, 'datas' => $datas, 'boundary' => $boundary, @@ -510,13 +572,21 @@ function recuperer_page($url, $trans = false, $get_headers = false, 'file' => $copy ? $trans : '', 'follow_location' => 10, ); - if (!is_null($taille_max)) + if (!is_null($taille_max)) { $options['taille_max'] = $taille_max; + } // dix tentatives maximum en cas d'entetes 301... $res = recuperer_url($url, $options); - if (!$res) return false; - if ($res['status']!==200) return false; - if ($get_headers) return $res['headers'] . "\n" . $res['page']; + if (!$res) { + return false; + } + if ($res['status'] !== 200) { + return false; + } + if ($get_headers) { + return $res['headers'] . "\n" . $res['page']; + } + return $res['page']; } @@ -553,17 +623,27 @@ function recuperer_page($url, $trans = false, $get_headers = false, * - Un tableau (entête, corps) si ok, * - false sinon **/ -function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = 1048576, $datas = '', $refuser_gz = false, $date_verif = '', $uri_referer = ''){ +function recuperer_lapage( + $url, + $trans = false, + $get = 'GET', + $taille_max = 1048576, + $datas = '', + $refuser_gz = false, + $date_verif = '', + $uri_referer = '' +) { // $copy = copier le fichier ? - $copy = (is_string($trans) AND strlen($trans)>5); // eviter "false" :-) + $copy = (is_string($trans) AND strlen($trans) > 5); // eviter "false" :-) // si on ecrit directement dans un fichier, pour ne pas manipuler // en memoire refuser gz - if ($copy) + if ($copy) { $refuser_gz = true; + } $options = array( - 'transcoder' => $trans===true, + 'transcoder' => $trans === true, 'methode' => $get, 'datas' => $datas, 'refuser_gz' => $refuser_gz, @@ -572,14 +652,19 @@ function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = 1048 'file' => $copy ? $trans : '', 'follow_location' => false, ); - if (!is_null($taille_max)) + if (!is_null($taille_max)) { $options['taille_max'] = $taille_max; + } // dix tentatives maximum en cas d'entetes 301... $res = recuperer_url($url, $options); - if ($res) + if ($res) { + return false; + } + if ($res['status'] !== 200) { return false; - if ($res['status']!==200) return false; + } + return array($res['headers'], $res['result']); } @@ -597,37 +682,41 @@ function recuperer_lapage($url, $trans = false, $get = 'GET', $taille_max = 1048 * int taille du fichier si argument fichier fourni * string contenu de la resource */ -function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = ''){ +function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = '') { $taille = 0; $result = ''; $fp = false; - if ($fichier){ + if ($fichier) { include_spip("inc/acces"); $tmpfile = "$fichier." . creer_uniqid() . ".tmp"; $fp = spip_fopen_lock($tmpfile, 'w', LOCK_EX); - if (!$fp AND file_exists($fichier)){ + if (!$fp AND file_exists($fichier)) { return filesize($fichier); } - if (!$fp) + if (!$fp) { return false; + } $result = 0; // on renvoie la taille du fichier } - while (!feof($handle) AND $taille<$taille_max){ + while (!feof($handle) AND $taille < $taille_max) { $res = fread($handle, 16384); $taille += strlen($res); - if ($fp){ + if ($fp) { fwrite($fp, $res); $result = $taille; - } else + } else { $result .= $res; + } } - if ($fp){ + if ($fp) { spip_fclose_unlock($fp); spip_unlink($fichier); @rename($tmpfile, $fichier); - if (!file_exists($fichier)) + if (!file_exists($fichier)) { return false; + } } + return $result; } @@ -649,30 +738,31 @@ function recuperer_body($handle, $taille_max = _INC_DISTANT_MAX_SIZE, $fichier = * int last_modified * string location */ -function recuperer_entetes_complets($handle, $if_modified_since = false){ +function recuperer_entetes_complets($handle, $if_modified_since = false) { $result = array('status' => 0, 'headers' => array(), 'last_modified' => 0, 'location' => ''); $s = @trim(fgets($handle, 16384)); - if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)){ + if (!preg_match(',^HTTP/[0-9]+\.[0-9]+ ([0-9]+),', $s, $r)) { return false; } $result['status'] = intval($r[1]); - while ($s = trim(fgets($handle, 16384))){ + while ($s = trim(fgets($handle, 16384))) { $result['headers'][] = $s . "\n"; preg_match(',^([^:]*): *(.*)$,i', $s, $r); list(, $d, $v) = $r; - if (strtolower(trim($d))=='location' AND $result['status']>=300 AND $result['status']<400){ + if (strtolower(trim($d)) == 'location' AND $result['status'] >= 300 AND $result['status'] < 400) { $result['location'] = $v; - } elseif ($d=='Last-Modified') { + } elseif ($d == 'Last-Modified') { $result['last_modified'] = strtotime($v); } } if ($if_modified_since AND $result['last_modified'] - AND $if_modified_since>$result['last_modified'] - AND $result['status']==200 - ) + AND $if_modified_since > $result['last_modified'] + AND $result['status'] == 200 + ) { $result['status'] = 304; + } $result['headers'] = implode('', $result['headers']); @@ -697,13 +787,20 @@ function recuperer_entetes_complets($handle, $if_modified_since = false){ * - la valeur (numerique) du statut si different de 200, notamment Not-Modified * - le tableau des entetes dans tous les autres cas **/ -function recuperer_entetes($f, $date_verif = ''){ +function recuperer_entetes($f, $date_verif = '') { //Cas ou la page distante n'a pas bouge depuis //la derniere visite $res = recuperer_entetes_complets($f, $date_verif); - if (!$res) return false; - if ($res['location']) return $res['location']; - if ($res['status']!=200) return $res['status']; + if (!$res) { + return false; + } + if ($res['location']) { + return $res['location']; + } + if ($res['status'] != 200) { + return $res['status']; + } + return explode("\n", $res['headers']); } @@ -725,15 +822,16 @@ function recuperer_entetes($f, $date_verif = ''){ * @return string * Nom du fichier pour copie locale **/ -function nom_fichier_copie_locale($source, $extension){ +function nom_fichier_copie_locale($source, $extension) { include_spip('inc/documents'); $d = creer_repertoire_documents('distant'); # IMG/distant/ $d = sous_repertoire($d, $extension); # IMG/distant/pdf/ // on se place tout le temps comme si on etait a la racine - if (_DIR_RACINE) + if (_DIR_RACINE) { $d = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $d); + } $m = md5($source); @@ -757,11 +855,13 @@ function nom_fichier_copie_locale($source, $extension){ * @return string * Nom du fichier calculé **/ -function fichier_copie_locale($source){ +function fichier_copie_locale($source) { // Si c'est deja local pas de souci - if (!tester_url_absolue($source)){ - if (_DIR_RACINE) + if (!tester_url_absolue($source)) { + if (_DIR_RACINE) { $source = preg_replace(',^' . preg_quote(_DIR_RACINE) . ',', '', $source); + } + return $source; } @@ -777,27 +877,32 @@ function fichier_copie_locale($source){ AND preg_match(',^\w+$,', $ext) // pas de php?truc=1&... AND $f = nom_fichier_copie_locale($source, $ext) AND file_exists(_DIR_RACINE . $f) - ) + ) { return $f; + } // Si c'est deja dans la table des documents, // ramener le nom de sa copie potentielle - $ext = sql_getfetsel("extension", "spip_documents", "fichier=" . sql_quote($source) . " AND distant='oui' AND extension <> ''"); + $ext = sql_getfetsel("extension", "spip_documents", + "fichier=" . sql_quote($source) . " AND distant='oui' AND extension <> ''"); - if ($ext) return nom_fichier_copie_locale($source, $ext); + if ($ext) { + return nom_fichier_copie_locale($source, $ext); + } // voir si l'extension indiquee dans le nom du fichier est ok // et si il n'aurait pas deja ete rapatrie $ext = $path_parts ? $path_parts['extension'] : ''; - if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))){ + if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) { $f = nom_fichier_copie_locale($source, $ext); - if (file_exists(_DIR_RACINE . $f)) + if (file_exists(_DIR_RACINE . $f)) { return $f; + } } // Ping pour voir si son extension est connue et autorisee @@ -806,13 +911,13 @@ function fichier_copie_locale($source){ $cache = sous_repertoire(_DIR_CACHE, 'rid') . md5($source); if (!@file_exists($cache) OR !$path_parts = @unserialize(spip_file_get_contents($cache)) - OR _request('var_mode')=='recalcul' - ){ + OR _request('var_mode') == 'recalcul' + ) { $path_parts = recuperer_infos_distantes($source, 0, false); ecrire_fichier($cache, serialize($path_parts)); } $ext = !empty($path_parts['extension']) ? $path_parts['extension'] : ''; - if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))){ + if ($ext AND sql_getfetsel("extension", "spip_types_documents", "extension=" . sql_quote($ext))) { return nom_fichier_copie_locale($source, $ext); } spip_log("pas de copie locale pour $source"); @@ -841,7 +946,7 @@ function fichier_copie_locale($source){ * - 'fichier' = chaine * - 'mime_type' = chaine **/ -function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true){ +function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = true) { # charger les alias des types mime include_spip('base/typedoc'); @@ -851,17 +956,19 @@ function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = // On va directement charger le debut des images et des fichiers html, // de maniere a attrapper le maximum d'infos (titre, taille, etc). Si // ca echoue l'utilisateur devra les entrer... - if ($headers = recuperer_page($source, false, true, $max, '', '', true)){ + if ($headers = recuperer_page($source, false, true, $max, '', '', true)) { list($headers, $a['body']) = preg_split(',\n\n,', $headers, 2); - if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) + if (preg_match(",\nContent-Type: *([^[:space:];]*),i", "\n$headers", $regs)) { $mime_type = (trim($regs[1])); - else - $mime_type = ''; // inconnu + } else { + $mime_type = ''; + } // inconnu // Appliquer les alias - while (isset($GLOBALS['mime_alias'][$mime_type])) + while (isset($GLOBALS['mime_alias'][$mime_type])) { $mime_type = $GLOBALS['mime_alias'][$mime_type]; + } // Si on a un mime-type insignifiant // text/plain,application/octet-stream ou vide @@ -869,87 +976,94 @@ function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = // ce qu'il sert ; on va tenter de detecter via l'extension de l'url // ou le Content-Disposition: attachment; filename=... $t = null; - if (in_array($mime_type, array('text/plain', '', 'application/octet-stream'))){ + if (in_array($mime_type, array('text/plain', '', 'application/octet-stream'))) { if (!$t AND preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) - ){ + ) { $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text')); } if (!$t AND preg_match(",^Content-Disposition:\s*attachment;\s*filename=(.*)$,Uims", $headers, $m) AND preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $m[1], $rext) - ){ + ) { $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text')); } } // Autre mime/type (ou text/plain avec fichier d'extension inconnue) - if (!$t) + if (!$t) { $t = sql_fetsel("extension", "spip_types_documents", "mime_type=" . sql_quote($mime_type)); + } // Toujours rien ? (ex: audio/x-ogg au lieu de application/ogg) // On essaie de nouveau avec l'extension if (!$t - AND $mime_type!='text/plain' + AND $mime_type != 'text/plain' AND preg_match(',\.([a-z0-9]+)(\?.*)?$,i', $source, $rext) - ){ - $t = sql_fetsel("extension", "spip_types_documents", "extension=" . sql_quote($rext[1], '', 'text')); # eviter xxx.3 => 3gp (> SPIP 3) + ) { + $t = sql_fetsel("extension", "spip_types_documents", + "extension=" . sql_quote($rext[1], '', 'text')); # eviter xxx.3 => 3gp (> SPIP 3) } - if ($t){ + if ($t) { spip_log("mime-type $mime_type ok, extension " . $t['extension']); $a['extension'] = $t['extension']; } else { # par defaut on retombe sur '.bin' si c'est autorise spip_log("mime-type $mime_type inconnu"); $t = sql_fetsel("extension", "spip_types_documents", "extension='bin'"); - if (!$t) return false; + if (!$t) { + return false; + } $a['extension'] = $t['extension']; } if (preg_match(",\nContent-Length: *([^[:space:]]*),i", "\n$headers", $regs) - ) + ) { $a['taille'] = intval($regs[1]); + } } // Echec avec HEAD, on tente avec GET - if (!$a AND !$max){ + if (!$a AND !$max) { spip_log("tenter GET $source"); $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE); } // S'il s'agit d'une image pas trop grosse ou d'un fichier html, on va aller // recharger le document en GET et recuperer des donnees supplementaires... - if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)){ - if ($max==0 - AND $a['taille']<_INC_DISTANT_MAX_SIZE + if (preg_match(',^image/(jpeg|gif|png|swf),', $mime_type)) { + if ($max == 0 + AND $a['taille'] < _INC_DISTANT_MAX_SIZE AND isset($GLOBALS['meta']['formats_graphiques']) - AND (strpos($GLOBALS['meta']['formats_graphiques'], $a['extension'])!==false) + AND (strpos($GLOBALS['meta']['formats_graphiques'], $a['extension']) !== false) AND $charger_si_petite_image - ){ + ) { $a = recuperer_infos_distantes($source, _INC_DISTANT_MAX_SIZE); - } else if ($a['body']){ - $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $a['extension']); - ecrire_fichier($a['fichier'], $a['body']); - $size_image = @getimagesize($a['fichier']); - $a['largeur'] = intval($size_image[0]); - $a['hauteur'] = intval($size_image[1]); - $a['type_image'] = true; + } else { + if ($a['body']) { + $a['fichier'] = _DIR_RACINE . nom_fichier_copie_locale($source, $a['extension']); + ecrire_fichier($a['fichier'], $a['body']); + $size_image = @getimagesize($a['fichier']); + $a['largeur'] = intval($size_image[0]); + $a['hauteur'] = intval($size_image[1]); + $a['type_image'] = true; + } } } // Fichier swf, si on n'a pas la taille, on va mettre 425x350 par defaut // ce sera mieux que 0x0 - if ($a AND isset($a['extension']) and $a['extension']=='swf' + if ($a AND isset($a['extension']) and $a['extension'] == 'swf' AND empty($a['largeur']) - ){ + ) { $a['largeur'] = 425; $a['hauteur'] = 350; } - if ($mime_type=='text/html'){ + if ($mime_type == 'text/html') { include_spip('inc/filtres'); $page = recuperer_page($source, true, false, _INC_DISTANT_MAX_SIZE); if (preg_match(',<title>(.*?)</title>,ims', $page, $regs)) { @@ -967,7 +1081,7 @@ function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = /** * Tester si un host peut etre recuperer directement ou doit passer par un proxy - * + * * On peut passer en parametre le proxy et la liste des host exclus, * pour les besoins des tests, lors de la configuration * @@ -976,7 +1090,7 @@ function recuperer_infos_distantes($source, $max = 0, $charger_si_petite_image = * @param string $http_noproxy * @return string */ -function need_proxy($host, $http_proxy = null, $http_noproxy = null){ +function need_proxy($host, $http_proxy = null, $http_noproxy = null) { if (is_null($http_proxy)) { $http_proxy = isset($GLOBALS['meta']["http_proxy"]) ? $GLOBALS['meta']["http_proxy"] : null; } @@ -987,15 +1101,15 @@ function need_proxy($host, $http_proxy = null, $http_noproxy = null){ $domain = substr($host, strpos($host, '.')); return ($http_proxy - AND (strpos(" $http_noproxy ", " $host ")===false - AND (strpos(" $http_noproxy ", " $domain ")===false))) + AND (strpos(" $http_noproxy ", " $host ") === false + AND (strpos(" $http_noproxy ", " $domain ") === false))) ? $http_proxy : ''; } /** * Initialise une requete HTTP avec entetes - * + * * Décompose l'url en son schema+host+path+port et lance la requete. * Retourne le descripteur sur lequel lire la réponse. * @@ -1011,19 +1125,21 @@ function need_proxy($host, $http_proxy = null, $http_noproxy = null){ * @param string $date * @return array */ -function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = "", $vers = "HTTP/1.0", $date = ''){ +function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = "", $vers = "HTTP/1.0", $date = '') { $user = $via_proxy = $proxy_user = ''; $fopen = false; $t = @parse_url($url); $host = $t['host']; - if ($t['scheme']=='http'){ + if ($t['scheme'] == 'http') { $scheme = 'http'; $noproxy = ''; - } elseif ($t['scheme']=='https') { + } elseif ($t['scheme'] == 'https') { $scheme = 'tls'; $noproxy = 'tls://'; - if (!isset($t['port']) || !($port = $t['port'])) $t['port'] = 443; + if (!isset($t['port']) || !($port = $t['port'])) { + $t['port'] = 443; + } } else { $scheme = $t['scheme']; $noproxy = $scheme . '://'; @@ -1032,26 +1148,31 @@ function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = "" $user = array($t['user'], $t['pass']); } - if (!isset($t['port']) || !($port = $t['port'])) $port = 80; - if (!isset($t['path']) || !($path = $t['path'])) $path = "/"; + if (!isset($t['port']) || !($port = $t['port'])) { + $port = 80; + } + if (!isset($t['path']) || !($path = $t['path'])) { + $path = "/"; + } if (!empty($t['query'])) { $path .= "?" . $t['query']; } - $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, $date); - if (!$f OR !is_resource($f)){ + $f = lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz, $referer, $datas, $vers, + $date); + if (!$f OR !is_resource($f)) { // fallback : fopen si on a pas fait timeout dans lance_requete // ce qui correspond a $f===110 - if ($f!==110 + if ($f !== 110 AND !need_proxy($host) - AND !_request('tester_proxy') - AND (!isset($GLOBALS['inc_distant_allow_fopen']) OR $GLOBALS['inc_distant_allow_fopen'])){ + AND !_request('tester_proxy') + AND (!isset($GLOBALS['inc_distant_allow_fopen']) OR $GLOBALS['inc_distant_allow_fopen']) + ) { $f = @fopen($url, "rb"); spip_log("connexion vers $url par simple fopen"); $fopen = true; - } - else { + } else { // echec total $f = false; } @@ -1062,6 +1183,7 @@ function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = "" /** * Lancer la requete proprement dite + * * @param string $method * type de la requete (GET, HEAD, POST...) * @param string $scheme @@ -1090,40 +1212,59 @@ function init_http($method, $url, $refuse_gz = false, $referer = '', $datas = "" * false|int si echec * resource socket vers l'url demandee */ -function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $refuse_gz = false, $referer = '', $datas = "", $vers = "HTTP/1.0", $date = ''){ +function lance_requete( + $method, + $scheme, + $user, + $host, + $path, + $port, + $noproxy, + $refuse_gz = false, + $referer = '', + $datas = "", + $vers = "HTTP/1.0", + $date = '' +) { $proxy_user = ''; $http_proxy = need_proxy($host); - if ($user) $user = urlencode($user[0]) . ":" . urlencode($user[1]); + if ($user) { + $user = urlencode($user[0]) . ":" . urlencode($user[1]); + } $connect = ""; - if ($http_proxy){ - if (defined('_PROXY_HTTPS_VIA_CONNECT') AND $scheme=="tls"){ - $path_host = (!$user ? '' : "$user@") . $host . (($port!=80) ? ":$port" : ""); + if ($http_proxy) { + if (defined('_PROXY_HTTPS_VIA_CONNECT') AND $scheme == "tls") { + $path_host = (!$user ? '' : "$user@") . $host . (($port != 80) ? ":$port" : ""); $connect = "CONNECT " . $path_host . " $vers\r\n" . "Host: $path_host\r\n" . "Proxy-Connection: Keep-Alive\r\n"; } else { - $path = (($scheme=='tls') ? 'https://' : "$scheme://") + $path = (($scheme == 'tls') ? 'https://' : "$scheme://") . (!$user ? '' : "$user@") - . "$host" . (($port!=80) ? ":$port" : "") . $path; + . "$host" . (($port != 80) ? ":$port" : "") . $path; } $t2 = @parse_url($http_proxy); $first_host = $t2['host']; - if (!($port = $t2['port'])) $port = 80; - if ($t2['user']) + if (!($port = $t2['port'])) { + $port = 80; + } + if ($t2['user']) { $proxy_user = base64_encode($t2['user'] . ":" . $t2['pass']); - } - else { + } + } else { $first_host = $noproxy . $host; } - if ($connect){ + if ($connect) { $streamContext = stream_context_create(array('ssl' => array('verify_peer' => false, 'allow_self_signed' => true))); - $f = @stream_socket_client("tcp://$first_host:$port", $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT, STREAM_CLIENT_CONNECT, $streamContext); + $f = @stream_socket_client("tcp://$first_host:$port", $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT, + STREAM_CLIENT_CONNECT, $streamContext); spip_log("Recuperer $path sur $first_host:$port par $f (via CONNECT)", "connect"); if (!$f) { - spip_log("Erreur connexion $errno $errstr",_LOG_ERREUR); + spip_log("Erreur connexion $errno $errstr", _LOG_ERREUR); + return $errno; } stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); @@ -1133,10 +1274,11 @@ function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $ $res = fread($f, 1024); if (!$res OR !count($res = explode(' ', $res)) - OR $res[1]!=='200' - ){ + OR $res[1] !== '200' + ) { spip_log("Echec CONNECT sur $first_host:$port", "connect" . _LOG_INFO_IMPORTANTE); fclose($f); + return false; } // important, car sinon on lit trop vite et les donnees ne sont pas encore dispo @@ -1144,15 +1286,15 @@ function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $ // envoyer le handshake stream_socket_enable_crypto($f, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); spip_log("OK CONNECT sur $first_host:$port", "connect"); - } - else { + } else { $ntry = 3; do { $f = @fsockopen($first_host, $port, $errno, $errstr, _INC_DISTANT_CONNECT_TIMEOUT); - } while(!$f AND $ntry-- AND $errno!==110 AND sleep(1)); + } while (!$f AND $ntry-- AND $errno !== 110 AND sleep(1)); spip_log("Recuperer $path sur $first_host:$port par $f"); if (!$f) { - spip_log("Erreur connexion $errno $errstr",_LOG_ERREUR); + spip_log("Erreur connexion $errno $errstr", _LOG_ERREUR); + return $errno; } stream_set_timeout($f, _INC_DISTANT_CONNECT_TIMEOUT); @@ -1173,6 +1315,7 @@ function lance_requete($method, $scheme, $user, $host, $path, $port, $noproxy, $ # spip_log("Requete\n$req"); fputs($f, $req); fputs($f, $datas ? $datas : "\r\n"); + return $f; } diff --git a/ecrire/inc/documents.php b/ecrire/inc/documents.php index 87bae65742..fbc298051d 100644 --- a/ecrire/inc/documents.php +++ b/ecrire/inc/documents.php @@ -12,31 +12,34 @@ /** * Gestion des documents et de leur emplacement sur le serveur - * + * * @package SPIP\Core\Documents */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Donne le chemin du fichier relatif à `_DIR_IMG` * pour stockage 'tel quel' dans la base de données * * @uses _DIR_IMG - * + * * @param string $fichier * @return string */ function set_spip_doc($fichier) { - if (strpos($fichier, _DIR_IMG) === 0) + if (strpos($fichier, _DIR_IMG) === 0) { return substr($fichier, strlen(_DIR_IMG)); - else - return $fichier; // ex: fichier distant + } else { + return $fichier; + } // ex: fichier distant } /** * Donne le chemin complet du fichier - * + * * @uses _DIR_IMG * * @param string $fichier @@ -44,18 +47,20 @@ function set_spip_doc($fichier) { */ function get_spip_doc($fichier) { // fichier distant - if (tester_url_absolue($fichier)) + if (tester_url_absolue($fichier)) { return $fichier; + } // gestion d'erreurs, fichier='' - if (!strlen($fichier)) + if (!strlen($fichier)) { return false; + } $fichier = ( - strncmp($fichier,_DIR_IMG, strlen(_DIR_IMG))!=0 - ) + strncmp($fichier, _DIR_IMG, strlen(_DIR_IMG)) != 0 + ) ? _DIR_IMG . $fichier - : $fichier ; + : $fichier; // fichier normal return $fichier; @@ -63,11 +68,11 @@ function get_spip_doc($fichier) { /** * Créer un sous-répertoire IMG/$ext/ tel que IMG/pdf - * + * * @uses sous_repertoire() * @uses _DIR_IMG * @uses verifier_htaccess() - * + * * @param string $ext * @return string */ @@ -97,11 +102,15 @@ function creer_repertoire_documents($ext) { function effacer_repertoire_temporaire($nom) { $d = opendir($nom); while (($f = readdir($d)) !== false) { - if (is_file("$nom/$f")) + if (is_file("$nom/$f")) { spip_unlink("$nom/$f"); - else if ($f <> '.' AND $f <> '..' - AND is_dir("$nom/$f")) - effacer_repertoire_temporaire("$nom/$f"); + } else { + if ($f <> '.' AND $f <> '..' + AND is_dir("$nom/$f") + ) { + effacer_repertoire_temporaire("$nom/$f"); + } + } } closedir($d); @rmdir($nom); @@ -122,20 +131,23 @@ function copier_document($ext, $orig, $source) { $orig = preg_replace(',\.\.+,', '.', $orig); // pas de .. dans le nom du doc $dir = creer_repertoire_documents($ext); $dest = preg_replace("/[^.=\w-]+/", "_", - translitteration(preg_replace("/\.([^.]+)$/", "", - preg_replace("/<[^>]*>/", '', basename($orig))))); + translitteration(preg_replace("/\.([^.]+)$/", "", + preg_replace("/<[^>]*>/", '', basename($orig))))); // ne pas accepter de noms de la forme -r90.jpg qui sont reserves // pour les images transformees par rotation (action/documenter) $dest = preg_replace(',-r(90|180|270)$,', '', $dest); // Si le document "source" est deja au bon endroit, ne rien faire - if ($source == ($dir . $dest . '.' . $ext)) + if ($source == ($dir . $dest . '.' . $ext)) { return $source; + } // sinon tourner jusqu'a trouver un numero correct $n = 0; - while (@file_exists($newFile = $dir . $dest .($n++ ? ('-'.$n) : '').'.'.$ext)); + while (@file_exists($newFile = $dir . $dest . ($n++ ? ('-' . $n) : '') . '.' . $ext)) { + ; + } return deplacer_fichier_upload($source, $newFile); } @@ -147,17 +159,21 @@ function copier_document($ext, $orig, $source) { * @uses _DIR_TRANSFERT * @uses _DIR_TMP * @uses sous_repertoire() - * + * * @param string $type * @return bool|string */ function determine_upload($type = '') { - if(!function_exists('autoriser')) + if (!function_exists('autoriser')) { include_spip('inc/autoriser'); - + } + if (!autoriser('chargerftp') - OR $type == 'logos') # on ne le permet pas pour les logos + OR $type == 'logos' + ) # on ne le permet pas pour les logos + { return false; + } $repertoire = _DIR_TRANSFERT; if (!@is_dir($repertoire)) { @@ -165,10 +181,11 @@ function determine_upload($type = '') { $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } - if (!$GLOBALS['visiteur_session']['restreint']) + if (!$GLOBALS['visiteur_session']['restreint']) { return $repertoire; - else + } else { return sous_repertoire($repertoire, $GLOBALS['visiteur_session']['login']); + } } /** @@ -176,7 +193,7 @@ function determine_upload($type = '') { * * @uses _DIR_RACINE * @uses spip_unlink() - * + * * @param string $source * Fichier source à copier * @param string $dest @@ -188,26 +205,33 @@ function determine_upload($type = '') { */ function deplacer_fichier_upload($source, $dest, $move = false) { // Securite - if (substr($dest,0,strlen(_DIR_RACINE))==_DIR_RACINE) - $dest = _DIR_RACINE.preg_replace(',\.\.+,', '.', substr($dest,strlen(_DIR_RACINE))); - else + if (substr($dest, 0, strlen(_DIR_RACINE)) == _DIR_RACINE) { + $dest = _DIR_RACINE . preg_replace(',\.\.+,', '.', substr($dest, strlen(_DIR_RACINE))); + } else { $dest = preg_replace(',\.\.+,', '.', $dest); + } - if ($move) $ok = @rename($source, $dest); - else $ok = @copy($source, $dest); - if (!$ok) $ok = @move_uploaded_file($source, $dest); - if ($ok) + if ($move) { + $ok = @rename($source, $dest); + } else { + $ok = @copy($source, $dest); + } + if (!$ok) { + $ok = @move_uploaded_file($source, $dest); + } + if ($ok) { @chmod($dest, _SPIP_CHMOD & ~0111); - else { - $f = @fopen($dest,'w'); + } else { + $f = @fopen($dest, 'w'); if ($f) { - fclose ($f); + fclose($f); } else { include_spip('inc/flock'); raler_fichier($dest); } spip_unlink($dest); } + return $ok ? $dest : false; } @@ -218,12 +242,12 @@ function deplacer_fichier_upload($source, $dest, $move = false) { * Renvoie `false` si pas d'erreur * et `true` s'il n'y a pas de fichier à uploader. * Pour les autres erreurs, on affiche le message d'erreur et on arrête l'action. - * - * @link http://php.net/manual/fr/features.file-upload.errors.php + * + * @link http://php.net/manual/fr/features.file-upload.errors.php * Explication sur les messages d'erreurs de chargement de fichiers. * @uses propre() * @uses minipres() - * + * * @global string $spip_lang_right * @param integer $error * @param string $msg @@ -232,7 +256,9 @@ function deplacer_fichier_upload($source, $dest, $move = false) { */ function check_upload_error($error, $msg = '', $return = false) { - if (!$error) return false; + if (!$error) { + return false; + } spip_log("Erreur upload $error -- cf. http://php.net/manual/fr/features.file-upload.errors.php"); @@ -244,36 +270,39 @@ function check_upload_error($error, $msg = '', $return = false) { # on peut affiner les differents messages d'erreur case 1: /* UPLOAD_ERR_INI_SIZE */ $msg = _T('upload_limit', - array('max' => ini_get('upload_max_filesize'))); + array('max' => ini_get('upload_max_filesize'))); break; case 2: /* UPLOAD_ERR_FORM_SIZE */ $msg = _T('upload_limit', - array('max' => ini_get('upload_max_filesize'))); + array('max' => ini_get('upload_max_filesize'))); break; case 3: /* UPLOAD_ERR_PARTIAL */ $msg = _T('upload_limit', - array('max' => ini_get('upload_max_filesize'))); + array('max' => ini_get('upload_max_filesize'))); break; default: /* autre */ - if (!$msg) - $msg = _T('pass_erreur').' '. $error - . '<br />' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]"); + if (!$msg) { + $msg = _T('pass_erreur') . ' ' . $error + . '<br />' . propre("[->http://php.net/manual/fr/features.file-upload.errors.php]"); + } break; } - spip_log ("erreur upload $error"); - if ($return) + spip_log("erreur upload $error"); + if ($return) { return $msg; + } - if(_request("iframe")=="iframe") { - echo "<div class='upload_answer upload_error'>$msg</div>"; - exit; + if (_request("iframe") == "iframe") { + echo "<div class='upload_answer upload_error'>$msg</div>"; + exit; } include_spip('inc/minipres'); echo minipres($msg, - "<div style='text-align: ".$GLOBALS['spip_lang_right']."'><a href='" . rawurldecode($GLOBALS['redirect']) . "'><button type='button'>" . _T('ecrire:bouton_suivant') . "</button></a></div>"); + "<div style='text-align: " . $GLOBALS['spip_lang_right'] . "'><a href='" . rawurldecode($GLOBALS['redirect']) . "'><button type='button'>" . _T('ecrire:bouton_suivant') . "</button></a></div>"); exit; } + ?> diff --git a/ecrire/inc/drapeau_edition.php b/ecrire/inc/drapeau_edition.php index 1d401572a0..c36562c63e 100644 --- a/ecrire/inc/drapeau_edition.php +++ b/ecrire/inc/drapeau_edition.php @@ -14,7 +14,7 @@ * Gestion des drapeaux d'édition * * Drapeau d'edition : on regarde qui a ouvert quel objet éditorial en - * édition, et on le signale aux autres redacteurs pour éviter de se marcher + * édition, et on le signale aux autres redacteurs pour éviter de se marcher * sur les pieds * * Le format est une meta drapeau_edition qui contient un tableau sérialisé @@ -26,52 +26,63 @@ * Attention ce n'est pas un verrou "bloquant", juste un drapeau qui signale * que l'on bosse sur cet objet editorial ; les autres peuvent passer outre * (en cas de communication orale c'est plus pratique) - * + * * @package SPIP\Core\Drapeaux\Edition -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; - - + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** - * Retourne le tableau des éléments édités en cours après avoir supprimé + * Retourne le tableau des éléments édités en cours après avoir supprimé * les éléments trop vieux (de plus d'une heure) du tableau. * * @uses ecrire_tableau_edition() - * + * * @return array * Tableau des éléments édités actuellement, par objet et auteur, du type : * `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()` -**/ -function lire_tableau_edition () { + **/ +function lire_tableau_edition() { $edition = @unserialize($GLOBALS['meta']['drapeau_edition']); - if (!$edition) return array(); + if (!$edition) { + return array(); + } $changed = false; $bon_pour_le_service = time()-3600; // parcourir le tableau et virer les vieux foreach ($edition as $objet => $data) { - if (!is_array($data)) - unset ($edition[$objet]); // vieille version - else foreach ($data as $id => $tab) { - if (!is_array($tab)) - unset ($edition[$objet][$tab]); // vieille version - else foreach ($tab as $n => $duo) { - if (current($duo) < $bon_pour_le_service) { - unset($edition[$objet][$id][$n]); - $changed = true; + if (!is_array($data)) { + unset ($edition[$objet]); + } // vieille version + else { + foreach ($data as $id => $tab) { + if (!is_array($tab)) { + unset ($edition[$objet][$tab]); + } // vieille version + else { + foreach ($tab as $n => $duo) { + if (current($duo) < $bon_pour_le_service) { + unset($edition[$objet][$id][$n]); + $changed = true; + } + } + } + if (!$edition[$objet][$id]) { + unset($edition[$objet][$id]); } } - if (!$edition[$objet][$id]) - unset($edition[$objet][$id]); } - if (!$edition[$objet]) + if (!$edition[$objet]) { unset($edition[$objet]); + } } - if ($changed) + if ($changed) { ecrire_tableau_edition($edition); + } return $edition; } @@ -84,20 +95,20 @@ function lire_tableau_edition () { * @param array $edition * Tableau des éléments édités actuellement, par objet et auteur, du type : * `[ type d'objet ][id_objet][id_auteur][nom de l'auteur] = time()` -**/ + **/ function ecrire_tableau_edition($edition) { ecrire_meta('drapeau_edition', serialize($edition)); } /** * Signale qu'un auteur édite tel objet - * + * * Si l'objet est non éditable dans l'espace privé, ne pas retenir le signalement * qui correspond à un process unique. * * @see lire_tableau_edition() * @see ecrire_tableau_edition() - * + * * @param int $id * Identifiant de l'objet * @param array $auteur @@ -108,7 +119,7 @@ function ecrire_tableau_edition($edition) { function signale_edition($id, $auteur, $type = 'article') { include_spip('base/objets'); include_spip('inc/filtres'); - if (objet_info($type,'editable')!=='oui') { + if (objet_info($type, 'editable') !== 'oui') { return; } @@ -128,9 +139,9 @@ function signale_edition($id, $auteur, $type = 'article') { /** * Qui édite mon objet ? - * + * * @see lire_tableau_edition() - * + * * @param integer $id * Identifiant de l'objet * @param string $type @@ -138,7 +149,7 @@ function signale_edition($id, $auteur, $type = 'article') { * @return array * Tableau sous la forme `["id_auteur"]["nom de l'auteur"] = time()` */ -function qui_edite ($id, $type = 'article') { +function qui_edite($id, $type = 'article') { $edition = lire_tableau_edition(); @@ -147,15 +158,15 @@ function qui_edite ($id, $type = 'article') { /** * Afficher les auteurs ayant édités récemment l'objet. - * + * * @param integer $id - * Identifiant de l'objet + * Identifiant de l'objet * @param string $type - * Type de l'objet + * Type de l'objet * @return array * Liste de tableaux `['nom_auteur_modif' => x|y|z, 'date_diff' => n]` */ -function mention_qui_edite ($id, $type = 'article') { +function mention_qui_edite($id, $type = 'article') { $modif = qui_edite($id, $type); unset($modif[$GLOBALS['visiteur_session']['id_auteur']]); @@ -165,10 +176,11 @@ function mention_qui_edite ($id, $type = 'article') { $auteurs[] = typo(key($duo)); $quand = max($quand, current($duo)); } + // format lie a la chaine de langue 'avis_article_modifie' return array( 'nom_auteur_modif' => join(' | ', $auteurs), - 'date_diff' => ceil((time()-$quand) / 60) + 'date_diff' => ceil((time()-$quand)/60) ); } } @@ -177,45 +189,46 @@ function mention_qui_edite ($id, $type = 'article') { * Quels sont les objets en cours d'édition par `$id_auteur` ? * * @uses lire_tableau_edition() - * + * * @param int $id_auteur * Identifiant de l'auteur * @return array * Liste de tableaux `['objet' => x, 'id_objet' => n]` */ -function liste_drapeau_edition ($id_auteur) { +function liste_drapeau_edition($id_auteur) { $edition = lire_tableau_edition(); $objets_ouverts = array(); - foreach ($edition as $objet => $data) - foreach ($data as $id => $auteurs) - { + foreach ($edition as $objet => $data) { + foreach ($data as $id => $auteurs) { if (isset($auteurs[$id_auteur]) - AND is_array($auteurs[$id_auteur]) // precaution - AND (array_pop($auteurs[$id_auteur]) > time()-3600)) { + AND is_array($auteurs[$id_auteur]) // precaution + AND (array_pop($auteurs[$id_auteur]) > time()-3600) + ) { $objets_ouverts[] = array( - 'objet'=>$objet, + 'objet' => $objet, 'id_objet' => $id, ); } } + } + return $objets_ouverts; } /** * Quand l'auteur veut libérer tous ses objets (tous types) - * + * * @uses lire_tableau_edition() * @uses ecrire_tableau_edition() - * + * * @param integer $id_auteur * @return void */ function debloquer_tous($id_auteur) { $edition = lire_tableau_edition(); foreach ($edition as $objet => $data) { - foreach ($data as $id => $auteurs) - { + foreach ($data as $id => $auteurs) { if (isset($auteurs[$id_auteur])) { unset ($edition[$objet][$id][$id_auteur]); ecrire_tableau_edition($edition); @@ -226,10 +239,10 @@ function debloquer_tous($id_auteur) { /** * Quand l'auteur libère un objet précis - * + * * @uses lire_tableau_edition() * @uses ecrire_tableau_edition() - * + * * @param integer $id_auteur * Identifiant de l'auteur * @param integer $id_objet @@ -241,12 +254,12 @@ function debloquer_tous($id_auteur) { function debloquer_edition($id_auteur, $id_objet, $type = 'article') { $edition = lire_tableau_edition(); - foreach ($edition as $objet => $data){ + foreach ($edition as $objet => $data) { if ($objet == $type) { - foreach ($data as $id => $auteurs) - { + foreach ($data as $id => $auteurs) { if ($id == $id_objet - AND isset($auteurs[$id_auteur])) { + AND isset($auteurs[$id_auteur]) + ) { unset ($edition[$objet][$id][$id_auteur]); ecrire_tableau_edition($edition); } @@ -254,4 +267,5 @@ function debloquer_edition($id_auteur, $id_objet, $type = 'article') { } } } + ?> diff --git a/ecrire/inc/editer.php b/ecrire/inc/editer.php index 8fe651994d..3ac126c3ef 100644 --- a/ecrire/inc/editer.php +++ b/ecrire/inc/editer.php @@ -11,12 +11,14 @@ \***************************************************************************/ /** - * Fonctions d'aide à l'édition d'objets éditoriaux. + * Fonctions d'aide à l'édition d'objets éditoriaux. * * @package SPIP\Core\Edition -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); /** @@ -31,7 +33,7 @@ include_spip('base/abstract_sql'); * * @api * @see action_editer_objet_dist() - * + * * @param string $type * Type d'objet * @param int|string $id @@ -55,46 +57,54 @@ include_spip('base/abstract_sql'); * du formulaire. * @return array * Retour des traitements. -**/ -function formulaires_editer_objet_traiter($type, $id = 'new', $id_parent = 0, $lier_trad = 0, $retour = '', $config_fonc = 'articles_edit_config', $row = array(), $hidden = ''){ + **/ +function formulaires_editer_objet_traiter( + $type, + $id = 'new', + $id_parent = 0, + $lier_trad = 0, + $retour = '', + $config_fonc = 'articles_edit_config', + $row = array(), + $hidden = '' +) { $res = array(); // eviter la redirection forcee par l'action... set_request('redirect'); - if ($action_editer = charger_fonction("editer_$type",'action',true)) { - list($id,$err) = $action_editer($id); - } - else { - $action_editer = charger_fonction("editer_objet",'action'); - list($id,$err) = $action_editer($id,$type); + if ($action_editer = charger_fonction("editer_$type", 'action', true)) { + list($id, $err) = $action_editer($id); + } else { + $action_editer = charger_fonction("editer_objet", 'action'); + list($id, $err) = $action_editer($id, $type); } $id_table_objet = id_table_objet($type); $res[$id_table_objet] = $id; - if ($err OR !$id){ - $res['message_erreur'] = ($err?$err:_T('erreur')); - } - else{ + if ($err OR !$id) { + $res['message_erreur'] = ($err ? $err : _T('erreur')); + } else { // Un lien de trad a prendre en compte - if ($lier_trad){ + if ($lier_trad) { // referencer la traduction - $referencer_traduction = charger_fonction('referencer_traduction','action'); + $referencer_traduction = charger_fonction('referencer_traduction', 'action'); $referencer_traduction($type, $id, $lier_trad); // dupliquer tous les liens sauf les auteurs : le nouvel auteur est celui qui traduit // cf API editer_liens include_spip('action/editer_liens'); - objet_dupliquer_liens($type,$lier_trad,$id,null,array('auteur')); + objet_dupliquer_liens($type, $lier_trad, $id, null, array('auteur')); } $res['message_ok'] = _T('info_modification_enregistree'); if ($retour) { - if (strncmp($retour,'javascript:',11)==0){ - $res['message_ok'] .= '<script type="text/javascript">/*<![CDATA[*/'.substr($retour,11).'/*]]>*/</script>'; + if (strncmp($retour, 'javascript:', 11) == 0) { + $res['message_ok'] .= '<script type="text/javascript">/*<![CDATA[*/' . substr($retour, 11) . '/*]]>*/</script>'; $res['editable'] = true; + } else { + $res['redirect'] = parametre_url($retour, $id_table_objet, $id); } - else - $res['redirect'] = parametre_url($retour,$id_table_objet,$id); } } + return $res; } @@ -106,9 +116,9 @@ function formulaires_editer_objet_traiter($type, $id = 'new', $id_parent = 0, $l * dire que personne d'autre n'a modifié le champ entre le moment où on * a saisi et le moment où on a validé le formulaire * - tous les champs obligatoires (listés dans $oblis) sont remplis. - * + * * @api - * + * * @param string $type * Type d'objet * @param int|string $id @@ -117,25 +127,30 @@ function formulaires_editer_objet_traiter($type, $id = 'new', $id_parent = 0, $l * Liste de champs obligatoires : ils doivent avoir un contenu posté. * @return array * Tableau des erreurs -**/ -function formulaires_editer_objet_verifier($type, $id = 'new', $oblis = array()){ + **/ +function formulaires_editer_objet_verifier($type, $id = 'new', $oblis = array()) { $erreurs = array(); if (intval($id)) { - $conflits = controler_contenu($type,$id); + $conflits = controler_contenu($type, $id); if ($conflits AND count($conflits)) { - foreach($conflits as $champ=>$conflit) { - if (!isset($erreurs[$champ])) { $erreurs[$champ] = ''; } - $erreurs[$champ] .= _T("alerte_modif_info_concourante")."<br /><textarea readonly='readonly' class='forml'>".$conflit['base']."</textarea>"; + foreach ($conflits as $champ => $conflit) { + if (!isset($erreurs[$champ])) { + $erreurs[$champ] = ''; + } + $erreurs[$champ] .= _T("alerte_modif_info_concourante") . "<br /><textarea readonly='readonly' class='forml'>" . $conflit['base'] . "</textarea>"; } } } - foreach($oblis as $obli) { + foreach ($oblis as $obli) { $value = _request($obli); - if (is_null($value) OR !(is_array($value)?count($value):strlen($value))) { - if (!isset($erreurs[$obli])) { $erreurs[$obli] = ''; } + if (is_null($value) OR !(is_array($value) ? count($value) : strlen($value))) { + if (!isset($erreurs[$obli])) { + $erreurs[$obli] = ''; + } $erreurs[$obli] .= _T("info_obligatoire"); } } + return $erreurs; } @@ -152,9 +167,9 @@ function formulaires_editer_objet_verifier($type, $id = 'new', $oblis = array()) * d'un autre, la fonction tente de précharger le contenu de l'objet en * utilisant une fonction inc_precharger_{type}_dist permettant par exemple * de remplir le contenu avec du texte, notamment avec la traduction source. - * + * * @api - * + * * @param string $type * Type d'objet * @param int|string $id @@ -178,25 +193,40 @@ function formulaires_editer_objet_verifier($type, $id = 'new', $oblis = array()) * du formulaire. * @return array * Environnement du formulaire. -**/ -function formulaires_editer_objet_charger($type, $id = 'new', $id_parent = 0, $lier_trad = 0, $retour = '', $config_fonc = 'articles_edit_config', $row = array(), $hidden = ''){ + **/ +function formulaires_editer_objet_charger( + $type, + $id = 'new', + $id_parent = 0, + $lier_trad = 0, + $retour = '', + $config_fonc = 'articles_edit_config', + $row = array(), + $hidden = '' +) { $table_objet = table_objet($type); $table_objet_sql = table_objet_sql($type); $id_table_objet = id_table_objet($type); $new = !is_numeric($id); // Appel direct dans un squelette if (!$row) { - if (!$new OR $lier_trad) { - if ($select = charger_fonction("precharger_" . $type, 'inc', true)) + if (!$new OR $lier_trad) { + if ($select = charger_fonction("precharger_" . $type, 'inc', true)) { $row = $select($id, $id_parent, $lier_trad); - else $row = sql_fetsel('*',$table_objet_sql,$id_table_objet."=".intval($id)); - if (!$new) + } else { + $row = sql_fetsel('*', $table_objet_sql, $id_table_objet . "=" . intval($id)); + } + if (!$new) { $md5 = controles_md5($row); + } } if (!$row) { - $trouver_table = charger_fonction('trouver_table','base'); - if ($desc = $trouver_table($table_objet)) - foreach($desc['field'] as $k=>$v) $row[$k]=''; + $trouver_table = charger_fonction('trouver_table', 'base'); + if ($desc = $trouver_table($table_objet)) { + foreach ($desc['field'] as $k => $v) { + $row[$k] = ''; + } + } } } @@ -208,33 +238,39 @@ function formulaires_editer_objet_charger($type, $id = 'new', $id_parent = 0, $l $row[$id_table_objet] = $id; $contexte = $row; - if (strlen($id_parent) && is_numeric($id_parent) && (!isset($contexte['id_parent']) OR $new)){ - if (!isset($contexte['id_parent'])) unset($contexte['id_rubrique']); - $contexte['id_parent']=$id_parent; - } - elseif (!isset($contexte['id_parent'])){ + if (strlen($id_parent) && is_numeric($id_parent) && (!isset($contexte['id_parent']) OR $new)) { + if (!isset($contexte['id_parent'])) { + unset($contexte['id_rubrique']); + } + $contexte['id_parent'] = $id_parent; + } elseif (!isset($contexte['id_parent'])) { // id_rubrique dans id_parent si possible if (isset($contexte['id_rubrique'])) { $contexte['id_parent'] = $contexte['id_rubrique']; unset($contexte['id_rubrique']); - } - else{ + } else { $contexte['id_parent'] = ''; } if (!$contexte['id_parent'] - AND $preselectionner_parent_nouvel_objet = charger_fonction("preselectionner_parent_nouvel_objet","inc",true)) - $contexte['id_parent'] = $preselectionner_parent_nouvel_objet($type,$row); + AND $preselectionner_parent_nouvel_objet = charger_fonction("preselectionner_parent_nouvel_objet", "inc", true) + ) { + $contexte['id_parent'] = $preselectionner_parent_nouvel_objet($type, $row); + } } - if ($config_fonc) + if ($config_fonc) { $contexte['config'] = $config = $config_fonc($contexte); - if (!isset($config['lignes'])) $config['lignes'] = 0; + } + if (!isset($config['lignes'])) { + $config['lignes'] = 0; + } $att_text = " class='textarea' " - . " rows='" - . ($config['lignes'] +15) - . "' cols='40'"; - if (isset($contexte['texte'])) - list($contexte['texte'],$contexte['_texte_trop_long']) = editer_texte_recolle($contexte['texte'],$att_text); + . " rows='" + . ($config['lignes']+15) + . "' cols='40'"; + if (isset($contexte['texte'])) { + list($contexte['texte'], $contexte['_texte_trop_long']) = editer_texte_recolle($contexte['texte'], $att_text); + } // on veut conserver la langue de l'interface ; // on passe cette donnee sous un autre nom, au cas ou le squelette @@ -245,23 +281,23 @@ function formulaires_editer_objet_charger($type, $id = 'new', $id_parent = 0, $l } $contexte['_hidden'] = "<input type='hidden' name='editer_$type' value='oui' />\n" . - (!$lier_trad ? '' : - ("\n<input type='hidden' name='lier_trad' value='" . - $lier_trad . - "' />" . - "\n<input type='hidden' name='changer_lang' value='" . - $config['langue'] . - "' />")) - . $hidden - . (isset($md5) ? $md5 : ''); + (!$lier_trad ? '' : + ("\n<input type='hidden' name='lier_trad' value='" . + $lier_trad . + "' />" . + "\n<input type='hidden' name='changer_lang' value='" . + $config['langue'] . + "' />")) + . $hidden + . (isset($md5) ? $md5 : ''); // preciser que le formulaire doit passer dans un pipeline - $contexte['_pipeline'] = array('editer_contenu_objet',array('type'=>$type,'id'=>$id)); + $contexte['_pipeline'] = array('editer_contenu_objet', array('type' => $type, 'id' => $id)); // preciser que le formulaire doit etre securise auteur/action // n'est plus utile lorsque l'action accepte l'id en argument direct // on le garde pour compat - $contexte['_action'] = array("editer_$type",$id); + $contexte['_action'] = array("editer_$type", $id); return $contexte; } @@ -269,33 +305,34 @@ function formulaires_editer_objet_charger($type, $id = 'new', $id_parent = 0, $l /** * Gestion des textes trop longs (limitation brouteurs) * utile pour les textes > 32ko - * - * @param string $texte + * + * @param string $texte * @return array */ -function coupe_trop_long($texte){ +function coupe_trop_long($texte) { $aider = charger_fonction('aider', 'inc'); if (strlen($texte) > 28*1024) { - $texte = str_replace("\r\n","\n",$texte); - $pos = strpos($texte, "\n\n", 28*1024); // coupe para > 28 ko - if ($pos > 0 and $pos < 32 * 1024) { - $debut = substr($texte, 0, $pos)."\n\n<!--SPIP-->\n"; - $suite = substr($texte, $pos + 2); + $texte = str_replace("\r\n", "\n", $texte); + $pos = strpos($texte, "\n\n", 28*1024); // coupe para > 28 ko + if ($pos > 0 and $pos < 32*1024) { + $debut = substr($texte, 0, $pos) . "\n\n<!--SPIP-->\n"; + $suite = substr($texte, $pos+2); } else { - $pos = strpos($texte, " ", 28*1024); // sinon coupe espace - if (!($pos > 0 and $pos < 32 * 1024)) { - $pos = 28*1024; // au pire (pas d'espace trouv'e) + $pos = strpos($texte, " ", 28*1024); // sinon coupe espace + if (!($pos > 0 and $pos < 32*1024)) { + $pos = 28*1024; // au pire (pas d'espace trouv'e) $decalage = 0; // si y'a pas d'espace, il ne faut pas perdre le caract`ere } else { $decalage = 1; } - $debut = substr($texte,0,$pos + $decalage); // Il faut conserver l'espace s'il y en a un - $suite = substr($texte,$pos + $decalage); + $debut = substr($texte, 0, $pos+$decalage); // Il faut conserver l'espace s'il y en a un + $suite = substr($texte, $pos+$decalage); } - return (array($debut,$suite)); + + return (array($debut, $suite)); + } else { + return (array($texte, '')); } - else - return (array($texte,'')); } /** @@ -305,23 +342,25 @@ function coupe_trop_long($texte){ * @param string $att_text * @return array */ -function editer_texte_recolle($texte, $att_text) -{ - if ((strlen($texte)<29*1024) - OR (include_spip('inc/layer') AND ($GLOBALS['browser_name']!="MSIE")) ) - return array($texte,""); +function editer_texte_recolle($texte, $att_text) { + if ((strlen($texte) < 29*1024) + OR (include_spip('inc/layer') AND ($GLOBALS['browser_name'] != "MSIE")) + ) { + return array($texte, ""); + } include_spip('inc/barre'); - $textes_supplement = "<br /><span style='color: red'>"._T('info_texte_long')."</span>\n"; + $textes_supplement = "<br /><span style='color: red'>" . _T('info_texte_long') . "</span>\n"; $nombre = 0; - while (strlen($texte)>29*1024) { - $nombre ++; - list($texte1,$texte) = coupe_trop_long($texte); + while (strlen($texte) > 29*1024) { + $nombre++; + list($texte1, $texte) = coupe_trop_long($texte); $textes_supplement .= "<br />" . "<textarea id='texte$nombre' name='texte_plus[$nombre]'$att_text>$texte1</textarea>\n"; - } - return array($texte,$textes_supplement); + } + + return array($texte, $textes_supplement); } /** @@ -331,15 +370,17 @@ function editer_texte_recolle($texte, $att_text) * @param $champs_contenu * @param int $longueur */ -function titre_automatique($champ_titre, $champs_contenu, $longueur = null){ - if (!_request($champ_titre)){ - $titrer_contenu = charger_fonction('titrer_contenu','inc'); - if (!is_null($longueur)) - $t = $titrer_contenu($champs_contenu,null,$longueur); - else +function titre_automatique($champ_titre, $champs_contenu, $longueur = null) { + if (!_request($champ_titre)) { + $titrer_contenu = charger_fonction('titrer_contenu', 'inc'); + if (!is_null($longueur)) { + $t = $titrer_contenu($champs_contenu, null, $longueur); + } else { $t = $titrer_contenu($champs_contenu); - if ($t) - set_request($champ_titre,$t); + } + if ($t) { + set_request($champ_titre, $t); + } } } @@ -349,7 +390,7 @@ function titre_automatique($champ_titre, $champs_contenu, $longueur = null){ * * Les textes et le titre sont pris dans les champs postés (via `_request()`) * et le titre calculé est de même affecté en tant que champ posté. - * + * * @param array $champs_contenu * Liste des champs contenu textuels * @param array|null $c @@ -359,17 +400,18 @@ function titre_automatique($champ_titre, $champs_contenu, $longueur = null){ * Longueur de coupe du texte * @return string */ -function inc_titrer_contenu_dist($champs_contenu, $c = null, $longueur = 50){ +function inc_titrer_contenu_dist($champs_contenu, $c = null, $longueur = 50) { // trouver un champ texte non vide $t = ""; - foreach($champs_contenu as $champ){ - if ($t = _request($champ,$c)) + foreach ($champs_contenu as $champ) { + if ($t = _request($champ, $c)) { break; + } } - if ($t){ + if ($t) { include_spip('inc/texte_mini'); - $t = couper($t,$longueur,"..."); + $t = couper($t, $longueur, "..."); } return $t; @@ -377,10 +419,10 @@ function inc_titrer_contenu_dist($champs_contenu, $c = null, $longueur = 50){ /** * Calcule des clés de contrôles md5 d'un tableau de données. - * + * * Produit la liste des md5 d'un tableau de données, normalement un * tableau des colonnes/valeurs d'un objet éditorial. - * + * * @param array $data * Couples (colonne => valeur). La valeur est un entier ou un texte. * @param string $prefixe @@ -393,15 +435,16 @@ function inc_titrer_contenu_dist($champs_contenu, $c = null, $longueur = 50){ * - false si pas $data n'est pas un tableau * - string (avec format html) : contrôles dans des input hidden * - array sinon couples ('$prefixe$colonne => md5) -**/ -function controles_md5($data, $prefixe = 'ctr_', $format = 'html'){ - if (!is_array($data)) + **/ +function controles_md5($data, $prefixe = 'ctr_', $format = 'html') { + if (!is_array($data)) { return false; + } $ctr = array(); foreach ($data as $key => $val) { $m = md5($val); - $k = $prefixe.$key; + $k = $prefixe . $key; switch ($format) { case 'html': @@ -413,10 +456,11 @@ function controles_md5($data, $prefixe = 'ctr_', $format = 'html'){ } } - if ($format == 'html') - return "\n\n<!-- controles md5 -->\n".join("\n", $ctr)."\n\n"; - else + if ($format == 'html') { + return "\n\n<!-- controles md5 -->\n" . join("\n", $ctr) . "\n\n"; + } else { return $ctr; + } } /** @@ -453,7 +497,7 @@ function controles_md5($data, $prefixe = 'ctr_', $format = 'html'){ * la valeur un tableau avec 2 index : * - base : le contenu du champ en base * - post : le contenu posté -**/ + **/ function controler_contenu($type, $id, $options = array(), $c = false, $serveur = '') { include_spip('inc/filtres'); @@ -465,9 +509,11 @@ function controler_contenu($type, $id, $options = array(), $c = false, $serveur // Appels incomplets (sans $c) if (!is_array($c)) { - foreach($desc['field'] as $champ=>$ignore) - if(_request($champ)) + foreach ($desc['field'] as $champ => $ignore) { + if (_request($champ)) { $c[$champ] = _request($champ); + } + } } // Securite : certaines variables ne sont jamais acceptees ici @@ -481,17 +527,22 @@ function controler_contenu($type, $id, $options = array(), $c = false, $serveur unset($c['id_secteur']); // Gerer les champs non vides - if (isset($options['nonvide']) AND is_array($options['nonvide'])) - foreach ($options['nonvide'] as $champ => $sinon) - if ($c[$champ] === '') - $c[$champ] = $sinon; + if (isset($options['nonvide']) AND is_array($options['nonvide'])) { + foreach ($options['nonvide'] as $champ => $sinon) { + if ($c[$champ] === '') { + $c[$champ] = $sinon; + } + } + } // N'accepter que les champs qui existent // [TODO] ici aussi on peut valider les contenus en fonction du type $champs = array(); - foreach($desc['field'] as $champ => $ignore) - if (isset($c[$champ])) + foreach ($desc['field'] as $champ => $ignore) { + if (isset($c[$champ])) { $champs[$champ] = $c[$champ]; + } + } // Nettoyer les valeurs $champs = array_map('corriger_caracteres', $champs); @@ -503,9 +554,9 @@ function controler_contenu($type, $id, $options = array(), $c = false, $serveur 'table' => $spip_table_objet, // compatibilite 'table_objet' => $table_objet, 'spip_table_objet' => $spip_table_objet, - 'type' =>$type, + 'type' => $type, 'id_objet' => $id, - 'champs' => isset($options['champs'])?$options['champs']:array(), // [doc] c'est quoi ? + 'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] c'est quoi ? 'action' => 'controler', 'serveur' => $serveur, ), @@ -513,10 +564,13 @@ function controler_contenu($type, $id, $options = array(), $c = false, $serveur ) ); - if (!$champs) return false; + if (!$champs) { + return false; + } // Verifier si les mises a jour sont pertinentes, datees, en conflit etc - $conflits = controler_md5($champs, $_POST, $type, $id, $serveur, isset($options['prefix'])?$options['prefix']:'ctr_'); + $conflits = controler_md5($champs, $_POST, $type, $id, $serveur, + isset($options['prefix']) ? $options['prefix'] : 'ctr_'); return $conflits; } @@ -525,7 +579,7 @@ function controler_contenu($type, $id, $options = array(), $c = false, $serveur /** * Contrôle la liste des md5 envoyés, supprime les inchangés, * signale les modifiés depuis telle date - * + * * @param array $champs * Couples des champs saisis dans le formulaire (colonne => valeur postée) * @param array $ctr @@ -546,7 +600,7 @@ function controler_contenu($type, $id, $options = array(), $c = false, $serveur * la valeur un tableau avec 2 index : * - base : le contenu du champ en base * - post : le contenu posté -**/ + **/ function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctr_') { $table_objet = table_objet($type); $spip_table_objet = table_objet_sql($type); @@ -556,21 +610,27 @@ function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctr_') { // On elimine les donnees non modifiees par le formulaire (mais // potentiellement modifiees entre temps par un autre utilisateur) foreach ($champs as $key => $val) { - if (isset($ctr[$prefix.$key]) AND $m = $ctr[$prefix.$key]) { - if (is_scalar($val) and $m == md5($val)) + if (isset($ctr[$prefix . $key]) AND $m = $ctr[$prefix . $key]) { + if (is_scalar($val) and $m == md5($val)) { unset ($champs[$key]); + } } } - if (!$champs) return; + if (!$champs) { + return; + } // On veut savoir si notre modif va avoir un impact // par rapport aux donnees contenues dans la base // (qui peuvent etre differentes de celles ayant servi a calculer le ctr) $s = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=$id", $serveur); $intact = true; - foreach ($champs as $ch => $val) + foreach ($champs as $ch => $val) { $intact &= ($s[$ch] == $val); - if ($intact) return; + } + if ($intact) { + return; + } // Detection de conflits : // On verifie si notre modif ne provient pas d'un formulaire @@ -579,7 +639,7 @@ function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctr_') { // de conflit. $ctrh = $ctrq = $conflits = array(); foreach (array_keys($champs) as $key) { - if (isset($ctr[$prefix.$key]) AND $m = $ctr[$prefix.$key]) { + if (isset($ctr[$prefix . $key]) AND $m = $ctr[$prefix . $key]) { $ctrh[$key] = $m; $ctrq[] = $key; } @@ -588,7 +648,8 @@ function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctr_') { $ctrq = sql_fetsel($ctrq, $spip_table_objet, "$id_table_objet=$id", $serveur); foreach ($ctrh as $key => $m) { if ($m != md5($ctrq[$key]) - AND $champs[$key] !== $ctrq[$key]) { + AND $champs[$key] !== $ctrq[$key] + ) { $conflits[$key] = array( 'base' => $ctrq[$key], 'post' => $champs[$key] @@ -605,26 +666,27 @@ function controler_md5(&$champs, $ctr, $type, $id, $serveur, $prefix = 'ctr_') { * Afficher le contenu d'un champ selon sa longueur * soit dans un `textarea`, soit dans un `input` * - * @param string $x + * @param string $x * texte à afficher * @return string */ function display_conflit_champ($x) { - if (strstr($x, "\n") OR strlen($x)>80) - return "<textarea style='width:99%; height:10em;'>".entites_html($x)."</textarea>\n"; - else - return "<input type='text' size='40' style='width:99%' value=\"".entites_html($x)."\" />\n"; + if (strstr($x, "\n") OR strlen($x) > 80) { + return "<textarea style='width:99%; height:10em;'>" . entites_html($x) . "</textarea>\n"; + } else { + return "<input type='text' size='40' style='width:99%' value=\"" . entites_html($x) . "\" />\n"; + } } /** * Signaler une erreur entre 2 saisies d'un champ - * + * * @uses preparer_diff() * @uses propre_diff() * @uses afficher_para_modifies() * @uses afficher_diff() * @uses minipres() - * + * * @param array $conflits * Valeur des champs en conflit * @param string $redirect @@ -636,7 +698,7 @@ function signaler_conflits_edition($conflits, $redirect = '') { include_spip('afficher_diff/champ'); include_spip('inc/suivi_versions'); include_spip('inc/diff'); - foreach ($conflits as $champ=>$a) { + foreach ($conflits as $champ => $a) { // probleme de stockage ou conflit d'edition ? $base = isset($a['save']) ? $a['save'] : $a['base']; @@ -644,16 +706,17 @@ function signaler_conflits_edition($conflits, $redirect = '') { $n = preparer_diff($a['post']); $o = preparer_diff($base); $d = propre_diff( - afficher_para_modifies(afficher_diff($diff->comparer($n,$o)))); + afficher_para_modifies(afficher_diff($diff->comparer($n, $o)))); - $titre = isset($a['save']) ? _L('Echec lors de l\'enregistrement du champ @champ@', array('champ' => $champ)) : $champ; + $titre = isset($a['save']) ? _L('Echec lors de l\'enregistrement du champ @champ@', + array('champ' => $champ)) : $champ; $diffs[] = "<h2>$titre</h2>\n" - . "<h3>"._T('info_conflit_edition_differences')."</h3>\n" - . "<div style='max-height:8em; overflow: auto; width:99%;'>".$d."</div>\n" - . "<h4>"._T('info_conflit_edition_votre_version')."</h4>" + . "<h3>" . _T('info_conflit_edition_differences') . "</h3>\n" + . "<div style='max-height:8em; overflow: auto; width:99%;'>" . $d . "</div>\n" + . "<h4>" . _T('info_conflit_edition_votre_version') . "</h4>" . display_conflit_champ($a['post']) - . "<h4>"._T('info_conflit_edition_version_enregistree')."</h4>" + . "<h4>" . _T('info_conflit_edition_version_enregistree') . "</h4>" . display_conflit_champ($base); } @@ -661,18 +724,19 @@ function signaler_conflits_edition($conflits, $redirect = '') { $id = uniqid(rand()); $redirect = "<form action='$redirect' method='get' id='$id' - style='float:".$GLOBALS['spip_lang_right']."; margin-top:2em;'>\n" - .form_hidden($redirect) - ."<input type='submit' value='"._T('icone_retour')."' /> + style='float:" . $GLOBALS['spip_lang_right'] . "; margin-top:2em;'>\n" + . form_hidden($redirect) + . "<input type='submit' value='" . _T('icone_retour') . "' /> </form>\n"; // pour les documents, on est probablement en ajax : il faut ajaxer - if (_AJAX) + if (_AJAX) { $redirect .= '<script type="text/javascript">' - .'setTimeout(function(){$("#'.$id.'") - .ajaxForm({target:$("#'.$id.'").parent()}); + . 'setTimeout(function(){$("#' . $id . '") + .ajaxForm({target:$("#' . $id . '").parent()}); }, 200);' - ."</script>\n"; + . "</script>\n"; + } } @@ -690,11 +754,11 @@ function signaler_conflits_edition($conflits, $redirect = '') { .diff-para-deplace .diff-supprime { background: #ffb8b8; border: 1px solid #808080; } .diff-para-deplace .diff-deplace { background: #b8b8ff; border: 1px solid #808080; } </style>' - .'<p>'._T('info_conflit_edition_avis_non_sauvegarde').'</p>' - .'<p>'._T('texte_conflit_edition_correction').'</p>' - ."<div style='text-align:".$GLOBALS['spip_lang_left'].";'>" - . join("\n",$diffs) - ."</div>\n" + . '<p>' . _T('info_conflit_edition_avis_non_sauvegarde') . '</p>' + . '<p>' . _T('texte_conflit_edition_correction') . '</p>' + . "<div style='text-align:" . $GLOBALS['spip_lang_left'] . ";'>" + . join("\n", $diffs) + . "</div>\n" . $redirect ); diff --git a/ecrire/inc/envoyer_mail.php b/ecrire/inc/envoyer_mail.php index 3c4df22714..8385719c05 100644 --- a/ecrire/inc/envoyer_mail.php +++ b/ecrire/inc/envoyer_mail.php @@ -14,8 +14,10 @@ * Gestion des emails et de leur envoi * * @package SPIP\Core\Mail -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); include_spip('inc/texte'); @@ -50,15 +52,15 @@ function nettoyer_caracteres_mail($t) { if ($GLOBALS['meta']['charset'] <> 'utf-8') { $t = str_replace( - array("’","“","”"), - array("'", '"', '"'), - $t); + array("’", "“", "”"), + array("'", '"', '"'), + $t); } $t = str_replace( array("—", "&endash;"), - array("--","-" ), - $t); + array("--", "-"), + $t); return $t; } @@ -93,8 +95,12 @@ function nettoyer_caracteres_mail($t) { */ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $headers = "") { - if (!email_valide($destinataire)) return false; - if ($destinataire == _T('info_mail_fournisseur')) return false; // tres fort + if (!email_valide($destinataire)) { + return false; + } + if ($destinataire == _T('info_mail_fournisseur')) { + return false; + } // tres fort // Fournir si possible un Message-Id: conforme au RFC1036, // sinon SpamAssassin denoncera un MSGID_FROM_MTA_HEADER @@ -106,12 +112,12 @@ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $heade } $parts = ""; - if (is_array($corps)){ + if (is_array($corps)) { $texte = $corps['texte']; - $from = (isset($corps['from'])?$corps['from']:$from); - $headers = (isset($corps['headers'])?$corps['headers']:$headers); + $from = (isset($corps['from']) ? $corps['from'] : $from); + $headers = (isset($corps['headers']) ? $corps['headers'] : $headers); if (is_array($headers)) { - $headers = implode("\n",$headers); + $headers = implode("\n", $headers); } if ($corps['pieces_jointes'] AND function_exists('mail_embarquer_pieces_jointes')) { $parts = mail_embarquer_pieces_jointes($corps['pieces_jointes']); @@ -120,11 +126,14 @@ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $heade $texte = $corps; } - if (!$from) $from = $email_envoi; + if (!$from) { + $from = $email_envoi; + } // ceci est la RegExp NO_REAL_NAME faisant hurler SpamAssassin - if (preg_match('/^["\s]*\<?\S+\@\S+\>?\s*$/', $from)) - $from .= ' (' . str_replace(')','', translitteration(str_replace('@', ' at ', $from))) . ')'; + if (preg_match('/^["\s]*\<?\S+\@\S+\>?\s*$/', $from)) { + $from .= ' (' . str_replace(')', '', translitteration(str_replace('@', ' at ', $from))) . ')'; + } // nettoyer les é ’, &emdash; etc... // les 'cliquer ici' etc sont a eviter; voir: @@ -142,23 +151,24 @@ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $heade mb_internal_encoding('utf-8'); } - if (function_exists('wordwrap') && (preg_match(',multipart/mixed,',$headers) == 0)) + if (function_exists('wordwrap') && (preg_match(',multipart/mixed,', $headers) == 0)) { $texte = wordwrap($texte); + } list($headers, $texte) = mail_normaliser_headers($headers, $from, $destinataire, $texte, $parts); if (_OS_SERVEUR == 'windows') { - $texte = preg_replace ("@\r*\n@","\r\n", $texte); - $headers = preg_replace ("@\r*\n@","\r\n", $headers); - $sujet = preg_replace ("@\r*\n@","\r\n", $sujet); + $texte = preg_replace("@\r*\n@", "\r\n", $texte); + $headers = preg_replace("@\r*\n@", "\r\n", $headers); + $sujet = preg_replace("@\r*\n@", "\r\n", $sujet); } - spip_log("mail $destinataire\n$sujet\n$headers",'mails'); + spip_log("mail $destinataire\n$sujet\n$headers", 'mails'); // mode TEST : forcer l'email if (defined('_TEST_EMAIL_DEST')) { - if (!_TEST_EMAIL_DEST) + if (!_TEST_EMAIL_DEST) { return false; - else { + } else { $texte = "Dest : $destinataire\r\n" . $texte; $destinataire = _TEST_EMAIL_DEST; } @@ -166,26 +176,28 @@ function inc_envoyer_mail_dist($destinataire, $sujet, $corps, $from = "", $heade return @mail($destinataire, $sujet, $texte, $headers); } + /** * Formater correctement l'entête d'un email - * + * * @param string $headers - * @param string $from - * @param string $to - * @param string $texte - * @param string $parts + * @param string $from + * @param string $to + * @param string $texte + * @param string $parts * @return array */ -function mail_normaliser_headers($headers, $from, $to, $texte, $parts = "") -{ +function mail_normaliser_headers($headers, $from, $to, $texte, $parts = "") { $charset = $GLOBALS['meta']['charset']; // Ajouter le Content-Type et consort s'il n'y est pas deja - if (strpos($headers, "Content-Type: ") === false) + if (strpos($headers, "Content-Type: ") === false) { $type = - "Content-Type: text/plain;charset=\"$charset\";\n". - "Content-Transfer-Encoding: 8bit\n"; - else $type = ''; + "Content-Type: text/plain;charset=\"$charset\";\n" . + "Content-Transfer-Encoding: 8bit\n"; + } else { + $type = ''; + } // calculer un identifiant unique preg_match('/@\S+/', $from, $domain); @@ -193,7 +205,7 @@ function mail_normaliser_headers($headers, $from, $to, $texte, $parts = "") // Si multi-part, s'en servir comme borne ... if ($parts) { - $texte = "--$uniq\n$type\n" . $texte ."\n"; + $texte = "--$uniq\n$type\n" . $texte . "\n"; foreach ($parts as $part) { $n = strlen($part[1]) . ($part[0] ? "\n" : ''); $e = join("\n", $part[0]); @@ -211,11 +223,13 @@ function mail_normaliser_headers($headers, $from, $to, $texte, $parts = "") // indispensable pour les sites qui collent d'office From: serveur-http // sauf si deja mis par l'envoyeur - $rep = (strpos($headers,"Reply-To:")!==FALSE) ? '' : "Reply-To: $from\n"; + $rep = (strpos($headers, "Reply-To:") !== false) ? '' : "Reply-To: $from\n"; // Nettoyer les en-tetes envoyees // Ajouter le \n final - if (strlen($headers = trim($headers))) $headers .= "\n"; + if (strlen($headers = trim($headers))) { + $headers .= "\n"; + } // Et mentionner l'indeboulonable nomenclature ratee @@ -223,4 +237,5 @@ function mail_normaliser_headers($headers, $from, $to, $texte, $parts = "") return array($headers, $texte); } + ?> diff --git a/ecrire/inc/exporter_csv.php b/ecrire/inc/exporter_csv.php index 3123425a11..23817e6399 100644 --- a/ecrire/inc/exporter_csv.php +++ b/ecrire/inc/exporter_csv.php @@ -14,9 +14,11 @@ * Gestion d'export de données au format CSV * * @package SPIP\Core\CSV\Export -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); include_spip('inc/filtres'); @@ -25,7 +27,7 @@ include_spip('inc/texte'); /** * Exporter un champ pour un export CSV : pas de retour a la ligne, * et echapper les guillements par des doubles guillemets - * + * * @param string $champ * @return string */ @@ -35,14 +37,15 @@ function exporter_csv_champ($champ) { #$champ = str_replace("\n", ", ", $champ); $champ = preg_replace(',[\s]+,ms', ' ', $champ); $champ = str_replace('"', '""', $champ); - return '"'.$champ.'"'; + + return '"' . $champ . '"'; } /** * Exporter une ligne complete au format CSV, avec delimiteur fourni * * @uses exporter_csv_champ() - * + * * @param array $ligne * @param string $delim * @param string|null $importer_charset @@ -50,23 +53,24 @@ function exporter_csv_champ($champ) { * @return string */ function exporter_csv_ligne($ligne, $delim = ', ', $importer_charset = null) { - $output = join($delim, array_map('exporter_csv_champ', $ligne))."\r\n"; - if ($importer_charset){ + $output = join($delim, array_map('exporter_csv_champ', $ligne)) . "\r\n"; + if ($importer_charset) { $output = unicode2charset(html2unicode(charset2unicode($output)), $importer_charset); } + return $output; } /** * Exporte une ressource sous forme de fichier CSV - * + * * La ressource peut etre un tableau ou une resource SQL issue d'une requete * L'extension est choisie en fonction du delimiteur : * - si on utilise ',' c'est un vrai csv avec extension csv * - si on utilise ';' ou tabulation c'est pour E*cel, et on exporte en iso-truc, avec une extension .xls * * @uses exporter_csv_ligne() - * + * * @param string $titre * titre utilise pour nommer le fichier * @param array|resource $resource @@ -78,19 +82,22 @@ function exporter_csv_ligne($ligne, $delim = ', ', $importer_charset = null) { * pour envoyer le fichier exporte (permet le telechargement) * @return string */ -function inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null, $envoyer = true){ +function inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null, $envoyer = true) { $filename = preg_replace(',[^-_\w]+,', '_', translitteration(textebrut(typo($titre)))); - - if ($delim == 'TAB') $delim = "\t"; - if (!in_array($delim,array(',',';',"\t"))) + + if ($delim == 'TAB') { + $delim = "\t"; + } + if (!in_array($delim, array(',', ';', "\t"))) { $delim = ","; + } $charset = $GLOBALS['meta']['charset']; $importer_charset = null; - if ($delim == ',') + if ($delim == ',') { $extension = 'csv'; - else { + } else { $extension = 'xls'; # Excel n'accepte pas l'utf-8 ni les entites html... on transcode tout ce qu'on peut $importer_charset = $charset = 'iso-8859-1'; @@ -98,17 +105,17 @@ function inc_exporter_csv_dist($titre, $resource, $delim = ', ', $entetes = null $filename = "$filename.$extension"; if ($entetes AND is_array($entetes) AND count($entetes)) { - $output = exporter_csv_ligne($entetes,$delim,$importer_charset); + $output = exporter_csv_ligne($entetes, $delim, $importer_charset); } // on passe par un fichier temporaire qui permet de ne pas saturer la memoire // avec les gros exports - $fichier = sous_repertoire(_DIR_CACHE,"export") . $filename; + $fichier = sous_repertoire(_DIR_CACHE, "export") . $filename; $fp = fopen($fichier, 'w'); $length = fwrite($fp, $output); - while ($row=is_array($resource)?array_shift($resource):sql_fetch($resource)){ - $output = exporter_csv_ligne($row,$delim,$importer_charset); + while ($row = is_array($resource) ? array_shift($resource) : sql_fetch($resource)) { + $output = exporter_csv_ligne($row, $delim, $importer_charset); $length += fwrite($fp, $output); } fclose($fp); diff --git a/ecrire/inc/filtres.php b/ecrire/inc/filtres.php index 3affd497ff..f76d050faa 100644 --- a/ecrire/inc/filtres.php +++ b/ecrire/inc/filtres.php @@ -11,11 +11,13 @@ \***************************************************************************/ /** - * Déclaration de filtres pour les squelettes + * Déclaration de filtres pour les squelettes * * @package SPIP\Core\Filtres -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); include_spip('inc/filtres_mini'); @@ -25,7 +27,7 @@ include_spip('public/parametrer'); // charger les fichiers fonctions /** * Charger un filtre depuis le php - * + * * - on inclue tous les fichiers fonctions des plugins et du skel * - on appelle chercher_filtre * @@ -33,7 +35,7 @@ include_spip('public/parametrer'); // charger les fichiers fonctions * on transmet `filtre_identite_dist` en filtre par défaut. * * @uses filtre_identite_dist() Comme fonction par défaut - * + * * @param string $fonc Nom du filtre * @param string $default Filtre par défaut * @return string Fonction PHP correspondante du filtre @@ -48,8 +50,8 @@ function charger_filtre($fonc, $default = 'filtre_identite_dist') { * * @param string $texte Texte * @return string Texte -**/ -function filtre_identite_dist($texte){return $texte;} + **/ +function filtre_identite_dist($texte) { return $texte; } /** * Cherche un filtre @@ -61,9 +63,9 @@ function filtre_identite_dist($texte){return $texte;} * - F * * Peut gérer des appels par des fonctions statiques de classes tel que `Foo::Bar` - * + * * En absence de fonction trouvée, retourne la fonction par défaut indiquée. - * + * * @param string $fonc * Nom du filtre * @param null $default @@ -71,43 +73,50 @@ function filtre_identite_dist($texte){return $texte;} * @return string * Fonction PHP correspondante du filtre demandé */ -function chercher_filtre($fonc, $default = NULL) { - if (!$fonc) return $default; +function chercher_filtre($fonc, $default = null) { + if (!$fonc) { + return $default; + } // Cas des types mime, sans confondre avec les appels de fonction de classe // Foo::Bar // qui peuvent etre avec un namespace : space\Foo::Bar - if (preg_match(',^[\w]+/,',$fonc)){ - $nom = preg_replace(',\W,','_', $fonc); + if (preg_match(',^[\w]+/,', $fonc)) { + $nom = preg_replace(',\W,', '_', $fonc); $f = chercher_filtre($nom); // cas du sous-type MIME sans filtre associe, passer au type: // si filtre_text_plain pas defini, passe a filtre_text - if (!$f AND $nom!==$fonc) - $f = chercher_filtre(preg_replace(',\W.*$,','', $fonc)); + if (!$f AND $nom !== $fonc) { + $f = chercher_filtre(preg_replace(',\W.*$,', '', $fonc)); + } + return $f; } foreach ( - array('filtre_'.$fonc, 'filtre_'.$fonc.'_dist', $fonc) as $f){ - if (isset( $GLOBALS['spip_matrice'][$f]) AND is_string($g = $GLOBALS['spip_matrice'][$f])) - find_in_path($g,'', true); + array('filtre_' . $fonc, 'filtre_' . $fonc . '_dist', $fonc) as $f) { + if (isset($GLOBALS['spip_matrice'][$f]) AND is_string($g = $GLOBALS['spip_matrice'][$f])) { + find_in_path($g, '', true); + } if (function_exists($f) - OR (preg_match("/^(\w*)::(\w*)$/", $f, $regs) - AND is_callable(array($regs[1], $regs[2])) - )) { + OR (preg_match("/^(\w*)::(\w*)$/", $f, $regs) + AND is_callable(array($regs[1], $regs[2])) + ) + ) { return $f; } } + return $default; } /** * Applique un filtre - * + * * Fonction générique qui prend en argument l’objet (texte, etc) à modifier * et le nom du filtre. Retrouve les arguments du filtre demandé dans les arguments * transmis à cette fonction, via func_get_args(). * * @see filtrer() Assez proche - * + * * @param string $arg * Texte sur lequel appliquer le filtre * @param string $filtre @@ -117,21 +126,24 @@ function chercher_filtre($fonc, $default = NULL) { * @return string * Texte avec le filtre appliqué s'il a été trouvé, * Texte sans le filtre appliqué s'il n'a pas été trouvé et que $force n'a -* pas été fourni, + * pas été fourni, * Chaîne vide si le filtre n'a pas été trouvé et que $force a été fourni. -**/ -function appliquer_filtre($arg, $filtre, $force = NULL) { + **/ +function appliquer_filtre($arg, $filtre, $force = null) { $f = chercher_filtre($filtre); if (!$f) { - if (!$force) return ''; - else return $arg; + if (!$force) { + return ''; + } else { + return $arg; + } } $args = func_get_args(); array_shift($args); // enlever $arg array_shift($args); // enlever $filtre array_unshift($args, $arg); // remettre $arg - return call_user_func_array($f,$args); + return call_user_func_array($f, $args); } /** @@ -139,17 +151,19 @@ function appliquer_filtre($arg, $filtre, $force = NULL) { * * Si l'on retrouve un numéro de révision SVN, il est ajouté entre crochets. * Si effectivement le SPIP est installé par SVN, 'SVN' est ajouté avant sa révision. - * + * * @global spip_version_affichee Contient la version de SPIP * @uses version_svn_courante() Pour trouver le numéro de révision SVN - * + * * @return string * Version de SPIP -**/ + **/ function spip_version() { $version = $GLOBALS['spip_version_affichee']; - if ($svn_revision = version_svn_courante(_DIR_RACINE)) - $version .= ($svn_revision<0 ? ' SVN':'').' ['.abs($svn_revision).']'; + if ($svn_revision = version_svn_courante(_DIR_RACINE)) { + $version .= ($svn_revision < 0 ? ' SVN' : '') . ' [' . abs($svn_revision) . ']'; + } + return $version; } @@ -159,35 +173,41 @@ function spip_version() { * * Mention de la révision SVN courante d'un répertoire * Retourne un nombre négatif si on est sur .svn, et positif si on utilise svn.revision - * + * * @param string $dir Chemin du répertoire * @return int * * - 0 si aucune info trouvée * - NN (entier) si info trouvée par svn.revision (créé par le générateur de paquet Zip) * - -NN (entier) si info trouvée par .svn/entries - * -**/ + * + **/ function version_svn_courante($dir) { - if (!$dir) $dir = '.'; + if (!$dir) { + $dir = '.'; + } // version installee par paquet ZIP - if (lire_fichier($dir.'/svn.revision', $c) - AND preg_match(',Revision: (\d+),', $c, $d)) + if (lire_fichier($dir . '/svn.revision', $c) + AND preg_match(',Revision: (\d+),', $c, $d) + ) { return intval($d[1]); + } // version installee par SVN if (lire_fichier($dir . '/.svn/entries', $c) - AND ( - (preg_match_all( - ',committed-rev="([0-9]+)",', $c, $r1, PREG_PATTERN_ORDER) - AND $v = max($r1[1]) - ) - OR - (preg_match(',^\d.*dir[\r\n]+(\d+),ms', $c, $r1) # svn >= 1.4 - AND $v = $r1[1] - ))) + AND ( + (preg_match_all( + ',committed-rev="([0-9]+)",', $c, $r1, PREG_PATTERN_ORDER) + AND $v = max($r1[1]) + ) + OR + (preg_match(',^\d.*dir[\r\n]+(\d+),ms', $c, $r1) # svn >= 1.4 + AND $v = $r1[1] + )) + ) { return -$v; + } // Bug ou paquet fait main return 0; @@ -218,7 +238,6 @@ $GLOBALS['spip_matrice']['filtre_text_html_dist'] = 'inc/filtres_mime.php'; $GLOBALS['spip_matrice']['filtre_audio_x_pn_realaudio'] = 'inc/filtres_mime.php'; - /** * Charge et exécute un filtre (graphique ou non) * @@ -228,28 +247,29 @@ $GLOBALS['spip_matrice']['filtre_audio_x_pn_realaudio'] = 'inc/filtres_mime.php' * @api * @uses image_filtrer() Pour un filtre image * @uses chercher_filtre() Pour un autre filtre - * + * * @param string $filtre * Nom du filtre à appliquer * @return string * Code HTML retourné par le filtre -**/ + **/ function filtrer($filtre) { - if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])){ - find_in_path($f,'', true); + if (isset($GLOBALS['spip_matrice'][$filtre]) and is_string($f = $GLOBALS['spip_matrice'][$filtre])) { + find_in_path($f, '', true); $GLOBALS['spip_matrice'][$filtre] = true; } $tous = func_get_args(); - if (substr($filtre,0,6)=='image_' && $GLOBALS['spip_matrice'][$filtre]) + if (substr($filtre, 0, 6) == 'image_' && $GLOBALS['spip_matrice'][$filtre]) { return image_filtrer($tous); - elseif($f = chercher_filtre($filtre)) { + } elseif ($f = chercher_filtre($filtre)) { array_shift($tous); + return call_user_func_array($f, $tous); - } - else { + } else { // le filtre n'existe pas, on provoque une erreur - $msg = array('zbug_erreur_filtre', array('filtre'=>texte_script($filtre))); + $msg = array('zbug_erreur_filtre', array('filtre' => texte_script($filtre))); erreur_squelette($msg); + return ''; } } @@ -259,8 +279,8 @@ function filtrer($filtre) { * Filtre `set` qui sauve la valeur en entrée dans une variable * * La valeur pourra être retrouvée avec `#GET{variable}`. - * - * @example + * + * @example * `[(#CALCUL|set{toto})]` enregistre le résultat de `#CALCUL` * dans la variable `toto` et renvoie vide. * C'est équivalent à `[(#SET{toto, #CALCUL})]` dans ce cas. @@ -273,13 +293,14 @@ function filtrer($filtre) { * * @filtre * @param array $Pile Pile de données - * @param mixed $val Valeur à sauver + * @param mixed $val Valeur à sauver * @param string $key Clé d'enregistrement * @param bool $continue True pour retourner la valeur - * @return mixed + * @return mixed */ function filtre_set(&$Pile, $val, $key, $continue = null) { $Pile['vars'][$key] = $val; + return $continue ? $val : ''; } @@ -303,12 +324,12 @@ function filtre_set(&$Pile, $val, $key, $continue = null) { */ function filtre_debug($val, $key = null) { $debug = ( - is_null($key) ? '' : (var_export($key, true)." = ") - ) . var_export($val, true); + is_null($key) ? '' : (var_export($key, true) . " = ") + ) . var_export($val, true); include_spip('inc/autoriser'); if (autoriser('webmestre')) { - echo "<div class='spip_debug'>\n",$debug,"</div>\n"; + echo "<div class='spip_debug'>\n", $debug, "</div>\n"; } spip_log($debug, 'debug'); @@ -330,7 +351,7 @@ function filtre_debug($val, $key = null) { * l'appliquer à un document distant). * * Applique le filtre demande à chacune des occurrences - * + * * @param array $args * Liste des arguments : * @@ -339,21 +360,24 @@ function filtre_debug($val, $key = null) { * - les suivants sont les arguments du filtre image souhaité. * @return string * Texte qui a reçu les filtres -**/ -function image_filtrer($args){ + **/ +function image_filtrer($args) { $filtre = array_shift($args); # enlever $filtre $texte = array_shift($args); - if (!strlen($texte)) return; - find_in_path('filtres_images_mini.php','inc/', true); + if (!strlen($texte)) { + return; + } + find_in_path('filtres_images_mini.php', 'inc/', true); statut_effacer_images_temporaires(true); // activer la suppression des images temporaires car le compilo finit la chaine par un image_graver // Cas du nom de fichier local - if ( strpos(substr($texte,strlen(_DIR_RACINE)),'..')===FALSE - AND !preg_match(',^/|[<>]|\s,S', $texte) - AND ( - file_exists(preg_replace(',[?].*$,','',$texte)) - OR tester_url_absolue($texte) - )) { - array_unshift($args,"<img src='$texte' />"); + if (strpos(substr($texte, strlen(_DIR_RACINE)), '..') === false + AND !preg_match(',^/|[<>]|\s,S', $texte) + AND ( + file_exists(preg_replace(',[?].*$,', '', $texte)) + OR tester_url_absolue($texte) + ) + ) { + array_unshift($args, "<img src='$texte' />"); $res = call_user_func_array($filtre, $args); statut_effacer_images_temporaires(false); // desactiver pour les appels hors compilo return $res; @@ -364,33 +388,35 @@ function image_filtrer($args){ ',(<([a-z]+) [^<>]*spip_documents[^<>]*>)?\s*(<img\s.*>),UimsS', $texte, $tags, PREG_SET_ORDER)) { foreach ($tags as $tag) { - $class = extraire_attribut($tag[3],'class'); + $class = extraire_attribut($tag[3], 'class'); if (!$class OR - (strpos($class,'filtre_inactif')==false + (strpos($class, 'filtre_inactif') == false // compat historique a virer en 3.2 - AND strpos($class,'no_image_filtrer')===false)){ - array_unshift($args,$tag[3]); + AND strpos($class, 'no_image_filtrer') === false) + ) { + array_unshift($args, $tag[3]); if ($reduit = call_user_func_array($filtre, $args)) { // En cas de span spip_documents, modifier le style=...width: - if($tag[1]){ + if ($tag[1]) { $w = extraire_attribut($reduit, 'width'); - if (!$w AND preg_match(",width:\s*(\d+)px,S",extraire_attribut($reduit,'style'),$regs)) + if (!$w AND preg_match(",width:\s*(\d+)px,S", extraire_attribut($reduit, 'style'), $regs)) { $w = $regs[1]; - if ($w AND ($style = extraire_attribut($tag[1], 'style'))){ + } + if ($w AND ($style = extraire_attribut($tag[1], 'style'))) { $style = preg_replace(",width:\s*\d+px,S", "width:${w}px", $style); $replace = inserer_attribut($tag[1], 'style', $style); $texte = str_replace($tag[1], $replace, $texte); } } // traiter aussi un eventuel mouseover - if ($mouseover = extraire_attribut($reduit,'onmouseover')){ - if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)){ + if ($mouseover = extraire_attribut($reduit, 'onmouseover')) { + if (preg_match(",this[.]src=['\"]([^'\"]+)['\"],ims", $mouseover, $match)) { $srcover = $match[1]; array_shift($args); - array_unshift($args,"<img src='".$match[1]."' />"); + array_unshift($args, "<img src='" . $match[1] . "' />"); $srcover_filter = call_user_func_array($filtre, $args); - $srcover_filter = extraire_attribut($srcover_filter,'src'); - $reduit = str_replace($srcover,$srcover_filter,$reduit); + $srcover_filter = extraire_attribut($srcover_filter, 'src'); + $reduit = str_replace($srcover, $srcover_filter, $reduit); } } $texte = str_replace($tag[3], $reduit, $texte); @@ -408,56 +434,71 @@ function image_filtrer($args){ * Retourne les tailles d'une image * * Pour les filtres `largeur` et `hauteur` - * + * * @param string $img * Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante). * @return array * Liste (hauteur, largeur) en pixels -**/ + **/ function taille_image($img) { - static $largeur_img =array(), $hauteur_img= array(); + static $largeur_img = array(), $hauteur_img = array(); $srcWidth = 0; $srcHeight = 0; - $logo = extraire_attribut($img,'src'); + $logo = extraire_attribut($img, 'src'); - if (!$logo) $logo = $img; - else { - $srcWidth = extraire_attribut($img,'width'); - $srcHeight = extraire_attribut($img,'height'); + if (!$logo) { + $logo = $img; + } else { + $srcWidth = extraire_attribut($img, 'width'); + $srcHeight = extraire_attribut($img, 'height'); } // ne jamais operer directement sur une image distante pour des raisons de perfo // la copie locale a toutes les chances d'etre la ou de resservir - if (tester_url_absolue($logo)){ + if (tester_url_absolue($logo)) { include_spip('inc/distant'); $fichier = copie_locale($logo); $logo = $fichier ? _DIR_RACINE . $fichier : $logo; } - if (($p=strpos($logo,'?'))!==FALSE) - $logo=substr($logo,0,$p); + if (($p = strpos($logo, '?')) !== false) { + $logo = substr($logo, 0, $p); + } $srcsize = false; - if (isset($largeur_img[$logo])) + if (isset($largeur_img[$logo])) { $srcWidth = $largeur_img[$logo]; - if (isset($hauteur_img[$logo])) + } + if (isset($hauteur_img[$logo])) { $srcHeight = $hauteur_img[$logo]; - if (!$srcWidth OR !$srcHeight){ + } + if (!$srcWidth OR !$srcHeight) { if (file_exists($logo) - AND $srcsize = @getimagesize($logo)){ - if (!$srcWidth) $largeur_img[$logo] = $srcWidth = $srcsize[0]; - if (!$srcHeight) $hauteur_img[$logo] = $srcHeight = $srcsize[1]; + AND $srcsize = @getimagesize($logo) + ) { + if (!$srcWidth) { + $largeur_img[$logo] = $srcWidth = $srcsize[0]; + } + if (!$srcHeight) { + $hauteur_img[$logo] = $srcHeight = $srcsize[1]; + } } // $logo peut etre une reference a une image temporaire dont a n'a que le log .src // on s'y refere, l'image sera reconstruite en temps utile si necessaire - elseif(@file_exists($f = "$logo.src") - AND lire_fichier($f,$valeurs) - AND $valeurs=unserialize($valeurs)) { - if (!$srcWidth) $largeur_img[$logo] = $srcWidth = $valeurs["largeur_dest"]; - if (!$srcHeight) $hauteur_img[$logo] = $srcHeight = $valeurs["hauteur_dest"]; - } + elseif (@file_exists($f = "$logo.src") + AND lire_fichier($f, $valeurs) + AND $valeurs = unserialize($valeurs) + ) { + if (!$srcWidth) { + $largeur_img[$logo] = $srcWidth = $valeurs["largeur_dest"]; + } + if (!$srcHeight) { + $hauteur_img[$logo] = $srcHeight = $valeurs["hauteur_dest"]; + } + } } + return array($srcHeight, $srcWidth); } @@ -468,16 +509,19 @@ function taille_image($img) { * @filtre * @link http://www.spip.net/4296 * @uses taille_image() - * @see hauteur() - * + * @see hauteur() + * * @param string $img * Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante). * @return int|null * Largeur en pixels, NULL ou 0 si aucune image. -**/ + **/ function largeur($img) { - if (!$img) return; - list ($h,$l) = taille_image($img); + if (!$img) { + return; + } + list ($h, $l) = taille_image($img); + return $l; } @@ -487,16 +531,19 @@ function largeur($img) { * @filtre * @link http://www.spip.net/4291 * @uses taille_image() - * @see largeur() - * + * @see largeur() + * * @param string $img * Balise HTML `<img ... />` ou chemin de l'image (qui peut être une URL distante). * @return int|null * Hauteur en pixels, NULL ou 0 si aucune image. -**/ + **/ function hauteur($img) { - if (!$img) return; - list ($h,$l) = taille_image($img); + if (!$img) { + return; + } + list ($h, $l) = taille_image($img); + return $h; } @@ -515,9 +562,12 @@ function hauteur($img) { * @see corriger_toutes_entites_html() * @param string $texte * @return string -**/ + **/ function corriger_entites_html($texte) { - if (strpos($texte,'&') === false) return $texte; + if (strpos($texte, '&') === false) { + return $texte; + } + return preg_replace(',&(#[0-9][0-9][0-9]+;|amp;),iS', '&\1', $texte); } @@ -527,13 +577,16 @@ function corriger_entites_html($texte) { * * Identique à `corriger_entites_html()` en corrigeant aussi les * `&eacute;` en `é` - * + * * @see corriger_entites_html() * @param string $texte * @return string -**/ + **/ function corriger_toutes_entites_html($texte) { - if (strpos($texte,'&') === false) return $texte; + if (strpos($texte, '&') === false) { + return $texte; + } + return preg_replace(',&(#?[a-z0-9]+;),iS', '&\1', $texte); } @@ -542,15 +595,15 @@ function corriger_toutes_entites_html($texte) { * * @param string $texte * @return string -**/ -function proteger_amp($texte){ + **/ +function proteger_amp($texte) { return str_replace('&', '&', $texte); } /** * Échappe en entités HTML certains caractères d'un texte - * + * * Traduira un code HTML en transformant en entités HTML les caractères * en dehors du charset de la page ainsi que les `"`, `<` et `>`. * @@ -559,13 +612,13 @@ function proteger_amp($texte){ * * @filtre * @link http://www.spip.net/4280 - * + * * @uses echappe_html() * @uses echappe_retour() * @uses proteger_amp() * @uses corriger_entites_html() * @uses corriger_toutes_entites_html() - * + * * @param string $texte * chaine a echapper * @param bool $tout @@ -576,18 +629,21 @@ function proteger_amp($texte){ */ function entites_html($texte, $tout = false, $quote = true) { if (!is_string($texte) OR !$texte - OR strpbrk($texte, "&\"'<>")==false - ) return $texte; + OR strpbrk($texte, "&\"'<>") == false + ) { + return $texte; + } include_spip('inc/texte'); - $flags = ($quote?ENT_QUOTES:ENT_NOQUOTES); + $flags = ($quote ? ENT_QUOTES : ENT_NOQUOTES); if (defined('ENT_HTML401')) { $flags |= ENT_HTML401; } $texte = spip_htmlspecialchars(echappe_retour(echappe_html($texte, '', true), '', 'proteger_amp'), $flags); - if ($tout) + if ($tout) { return corriger_toutes_entites_html($texte); - else + } else { return corriger_entites_html($texte); + } } /** @@ -599,22 +655,26 @@ function entites_html($texte, $tout = false, $quote = true) { * * @filtre * @link http://www.spip.net/5513 - * + * * @param string $texte * Texte à convertir * @return string * Texte converti -**/ + **/ function filtrer_entites($texte) { - if (strpos($texte,'&') === false) return $texte; + if (strpos($texte, '&') === false) { + return $texte; + } // filtrer $texte = html2unicode($texte); // remettre le tout dans le charset cible $texte = unicode2charset($texte); // cas particulier des " et ' qu'il faut filtrer aussi // (on le faisait deja avec un ") - if (strpos($texte,"&#")!==false) - $texte = str_replace(array("'","'",""","""), array("'","'",'"','"'), $texte); + if (strpos($texte, "&#") !== false) { + $texte = str_replace(array("'", "'", """, """), array("'", "'", '"', '"'), $texte); + } + return $texte; } @@ -622,12 +682,12 @@ function filtrer_entites($texte) { * Supprime des caractères illégaux * * Remplace les caractères de controle par le caractère `-` - * + * * @link http://www.w3.org/TR/REC-xml/#charsets - * + * * @param string|array $texte * @return string|array -**/ + **/ function supprimer_caracteres_illegaux($texte) { static $from = "\x0\x1\x2\x3\x4\x5\x6\x7\x8\xB\xC\xE\xF\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"; static $to = null; @@ -636,7 +696,10 @@ function supprimer_caracteres_illegaux($texte) { return array_map('supprimer_caracteres_illegaux', $texte); } - if (!$to) $to = str_repeat('-', strlen($from)); + if (!$to) { + $to = str_repeat('-', strlen($from)); + } + return strtr($texte, $from, $to); } @@ -644,13 +707,14 @@ function supprimer_caracteres_illegaux($texte) { * Correction de caractères * * Supprimer les caracteres windows non conformes et les caracteres de controle illégaux - * + * * @param string|array $texte * @return string|array -**/ -function corriger_caracteres ($texte) { + **/ +function corriger_caracteres($texte) { $texte = corriger_caracteres_windows($texte); $texte = supprimer_caracteres_illegaux($texte); + return $texte; } @@ -661,7 +725,7 @@ function corriger_caracteres ($texte) { * * @filtre * @link http://www.spip.net/4287 - * + * * @param string $texte * Texte à transformer * @return string @@ -683,11 +747,11 @@ function texte_backend($texte) { // " -> " et tout ce genre de choses $u = $GLOBALS['meta']['pcre_u']; $texte = str_replace(" ", " ", $texte); - $texte = preg_replace('/\s{2,}/S'.$u, " ", $texte); + $texte = preg_replace('/\s{2,}/S' . $u, " ", $texte); // ne pas echapper les sinqle quotes car certains outils de syndication gerent mal $texte = entites_html($texte, false, false); // mais bien echapper les double quotes ! - $texte = str_replace('"','"',$texte); + $texte = str_replace('"', '"', $texte); // verifier le charset $texte = charset2unicode($texte); @@ -709,10 +773,10 @@ function texte_backend($texte) { * Encode et quote du HTML pour transmission XML notamment dans les flux RSS * * Comme texte_backend(), mais avec addslashes final pour squelettes avec PHP (rss) - * + * * @uses texte_backend() * @filtre - * + * * @param string $texte * Texte à transformer * @return string @@ -735,16 +799,16 @@ function texte_backendq($texte) { * ``` * [<h1>(#TITRE|supprimer_numero)</h1>] * ``` - * + * * @param string $texte * Texte * @return int|string * Numéro de titre, sinon chaîne vide -**/ + **/ function supprimer_numero($texte) { return preg_replace( - ",^[[:space:]]*([0-9]+)([.)]|".chr(194).'?'.chr(176).")[[:space:]]+,S", - "", $texte); + ",^[[:space:]]*([0-9]+)([.)]|" . chr(194) . '?' . chr(176) . ")[[:space:]]+,S", + "", $texte); } /** @@ -760,19 +824,20 @@ function supprimer_numero($texte) { * ``` * [(#TITRE|recuperer_numero)] * ``` - * + * * @param string $texte * Texte * @return int|string * Numéro de titre, sinon chaîne vide -**/ + **/ function recuperer_numero($texte) { if (preg_match( - ",^[[:space:]]*([0-9]+)([.)]|".chr(194).'?'.chr(176).")[[:space:]]+,S", - $texte, $regs)) + ",^[[:space:]]*([0-9]+)([.)]|" . chr(194) . '?' . chr(176) . ")[[:space:]]+,S", + $texte, $regs)) { return strval($regs[1]); - else + } else { return ''; + } } /** @@ -780,7 +845,7 @@ function recuperer_numero($texte) { * * Supprime tous les tags `<...>`. * Utilisé fréquemment pour écrire des RSS. - * + * * @filtre * @link http://www.spip.net/4315 * @example @@ -790,20 +855,21 @@ function recuperer_numero($texte) { * * @note * Ce filtre supprime aussi les signes inférieurs `<` rencontrés. - * + * * @param string $texte * Texte à échapper * @param string $rempl * Inutilisé. * @return string * Texte converti -**/ + **/ function supprimer_tags($texte, $rempl = "") { $texte = preg_replace(",<(!--|\w|/)[^>]*>,US", $rempl, $texte); // ne pas oublier un < final non ferme car coupe $texte = preg_replace(",<(!--|\w|/).*$,US", $rempl, $texte); // mais qui peut aussi etre un simple signe plus petit que $texte = str_replace('<', '<', $texte); + return $texte; } @@ -825,12 +891,13 @@ function supprimer_tags($texte, $rempl = "") { * Inutilisé. * @return string * Texte converti -**/ + **/ function echapper_tags($texte, $rempl = "") { $texte = preg_replace("/<([^>]*)>/", "<\\1>", $texte); + return $texte; } - + /** * Convertit un texte HTML en texte brut * @@ -847,18 +914,19 @@ function echapper_tags($texte, $rempl = "") { * Texte à convertir * @return string * Texte converti -**/ + **/ function textebrut($texte) { $u = $GLOBALS['meta']['pcre_u']; - $texte = preg_replace('/\s+/S'.$u, " ", $texte); - $texte = preg_replace("/<(p|br)( [^>]*)?".">/iS", "\n\n", $texte); + $texte = preg_replace('/\s+/S' . $u, " ", $texte); + $texte = preg_replace("/<(p|br)( [^>]*)?" . ">/iS", "\n\n", $texte); $texte = preg_replace("/^\n+/", "", $texte); $texte = preg_replace("/\n+$/", "", $texte); $texte = preg_replace("/\n +/", "\n", $texte); $texte = supprimer_tags($texte); $texte = preg_replace("/( | )+/S", " ", $texte); // nettoyer l'apostrophe curly qui pose probleme a certains rss-readers, lecteurs de mail... - $texte = str_replace("’","'",$texte); + $texte = str_replace("’", "'", $texte); + return $texte; } @@ -868,33 +936,35 @@ function textebrut($texte) { * * @filtre * @link http://www.spip.net/4297 - * + * * @param string $texte - * Texte avec des liens + * Texte avec des liens * @return string * Texte avec liens ouvrants -**/ -function liens_ouvrants ($texte) { + **/ +function liens_ouvrants($texte) { return preg_replace(",<a\s+([^>]*https?://[^>]*class=[\"']spip_(out|url)\b[^>]+)>,", "<a \\1 target=\"_blank\">", $texte); } /** * Ajouter un attribut rel="nofollow" sur tous les liens d'un texte + * * @param string $texte * @return string */ function liens_nofollow($texte) { - if (stripos($texte,"<a")===false) + if (stripos($texte, "<a") === false) { return $texte; + } - if (preg_match_all(",<a\b[^>]*>,UimsS",$texte, $regs, PREG_PATTERN_ORDER)){ - foreach($regs[0] as $a){ - $rel = extraire_attribut($a,"rel"); - if (strpos($rel,"nofollow")===false){ - $rel = "nofollow" . ($rel?" $rel":""); - $anofollow = inserer_attribut($a,"rel",$rel); - $texte = str_replace($a,$anofollow,$texte); + if (preg_match_all(",<a\b[^>]*>,UimsS", $texte, $regs, PREG_PATTERN_ORDER)) { + foreach ($regs[0] as $a) { + $rel = extraire_attribut($a, "rel"); + if (strpos($rel, "nofollow") === false) { + $rel = "nofollow" . ($rel ? " $rel" : ""); + $anofollow = inserer_attribut($a, "rel", $rel); + $texte = str_replace($a, $anofollow, $texte); } } } @@ -911,17 +981,18 @@ function liens_nofollow($texte) { * ``` * [<div>(#DESCRIPTIF|PtoBR)[(#NOTES|PtoBR)]</div>] * ``` - * + * * @param string $texte * Texte à transformer * @return string * Texte sans paraghaphes -**/ -function PtoBR($texte){ + **/ +function PtoBR($texte) { $u = $GLOBALS['meta']['pcre_u']; $texte = preg_replace("@</p>@iS", "\n", $texte); $texte = preg_replace("@<p\b.*>@UiS", "<br />", $texte); - $texte = preg_replace("@^\s*<br />@S".$u, "", $texte); + $texte = preg_replace("@^\s*<br />@S" . $u, "", $texte); + return $texte; } @@ -929,26 +1000,28 @@ function PtoBR($texte){ /** * Assure qu'un texte ne vas pas déborder d'un bloc * par la faute d'un mot trop long (souvent des URLs) - * + * * Ne devrait plus être utilisé et fait directement en CSS par un style * `word-wrap:break-word;` - * + * * @note * Pour assurer la compatibilité du filtre, on encapsule le contenu par * un `div` ou `span` portant ce style CSS inline. - * + * * @filtre * @link http://www.spip.net/4298 * @link http://www.alsacreations.com/tuto/lire/1038-gerer-debordement-contenu-css.html * @deprecated Utiliser le style CSS `word-wrap:break-word;` - * + * * @param string $texte Texte * @return string Texte encadré du style CSS */ function lignes_longues($texte) { - if (!strlen(trim($texte))) return $texte; + if (!strlen(trim($texte))) { + return $texte; + } include_spip('inc/texte'); - $tag = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $texte) ? + $tag = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $texte) ? 'div' : 'span'; return "<$tag style='word-wrap:break-word;'>$texte</$tag>"; @@ -959,7 +1032,7 @@ function lignes_longues($texte) { * * Encadre le texte du style CSS `text-transform: uppercase;`. * Le cas spécifique du i turc est géré. - * + * * @filtre * @example * ``` @@ -970,20 +1043,26 @@ function lignes_longues($texte) { * @return string Texte en majuscule */ function majuscules($texte) { - if (!strlen($texte)) return ''; + if (!strlen($texte)) { + return ''; + } // Cas du turc if ($GLOBALS['spip_lang'] == 'tr') { # remplacer hors des tags et des entites - if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) - foreach ($regs as $n => $match) + if (preg_match_all(',<[^<>]+>|&[^;]+;,S', $texte, $regs, PREG_SET_ORDER)) { + foreach ($regs as $n => $match) { $texte = str_replace($match[0], "@@SPIP_TURC$n@@", $texte); + } + } $texte = str_replace('i', 'İ', $texte); - if ($regs) - foreach ($regs as $n => $match) + if ($regs) { + foreach ($regs as $n => $match) { $texte = str_replace("@@SPIP_TURC$n@@", $match[0], $texte); + } + } } // Cas general @@ -992,24 +1071,25 @@ function majuscules($texte) { /** * Retourne une taille en octets humainement lisible - * + * * Tel que "127.4 ko" ou "3.1 Mo" - * + * * @example * - `[(#TAILLE|taille_en_octets)]` * - `[(#VAL{123456789}|taille_en_octets)]` affiche `117.7 Mo` - * + * * @filtre * @link http://www.spip.net/4316 * @param int $taille * @return string -**/ -function taille_en_octets ($taille) { + **/ +function taille_en_octets($taille) { if (!defined('_KILOBYTE')) { /** * Définit le nombre d'octets dans un Kilobyte - * @var int - **/ + * + * @var int + **/ define('_KILOBYTE', 1024); } @@ -1018,14 +1098,14 @@ function taille_en_octets ($taille) { } if ($taille < _KILOBYTE) { $taille = _T('taille_octets', array('taille' => $taille)); - } - elseif ($taille < _KILOBYTE*_KILOBYTE) { + } elseif ($taille < _KILOBYTE*_KILOBYTE) { $taille = _T('taille_ko', array('taille' => round($taille/_KILOBYTE, 1))); } elseif ($taille < _KILOBYTE*_KILOBYTE*_KILOBYTE) { $taille = _T('taille_mo', array('taille' => round($taille/_KILOBYTE/_KILOBYTE, 1))); } else { $taille = _T('taille_go', array('taille' => round($taille/_KILOBYTE/_KILOBYTE/_KILOBYTE, 2))); } + return $taille; } @@ -1034,28 +1114,29 @@ function taille_en_octets ($taille) { * Rend une chaine utilisable sans dommage comme attribut HTML * * @example `<a href="#URL_ARTICLE" title="[(#TITRE|attribut_html)]">#TITRE</a>` - * + * * @filtre * @link http://www.spip.net/4282 * @uses textebrut() * @uses texte_backend() - * + * * @param string $texte * Texte à mettre en attribut * @param bool $textebrut * Passe le texte en texte brut (enlève les balises html) ? * @return string * Texte prêt pour être utilisé en attribut HTML -**/ + **/ function attribut_html($texte, $textebrut = true) { $u = $GLOBALS['meta']['pcre_u']; if ($textebrut) { - $texte = preg_replace(array(",\n,",",\s(?=\s),msS".$u),array(" ",""),textebrut($texte)); + $texte = preg_replace(array(",\n,", ",\s(?=\s),msS" . $u), array(" ", ""), textebrut($texte)); } $texte = texte_backend($texte); - $texte = str_replace(array("'",'"'),array(''', '"'), $texte); + $texte = str_replace(array("'", '"'), array(''', '"'), $texte); - return preg_replace(array("/&(amp;|#38;)/","/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/"),array("&","&") , $texte); + return preg_replace(array("/&(amp;|#38;)/", "/&(?![A-Za-z]{0,4}\w{2,3};|#[0-9]{2,5};)/"), array("&", "&"), + $texte); } @@ -1066,57 +1147,60 @@ function attribut_html($texte, $textebrut = true) { * - échappe les entités et gère les `&` * * @uses entites_html() - * + * * @param string $url * URL à vérifier et échapper * @param bool $entites * `true` pour échapper les entités HTML. * @return string * URL ou chaîne vide -**/ + **/ function vider_url($url, $entites = true) { # un message pour abs_url $GLOBALS['mode_abs_url'] = 'url'; $url = trim($url); $r = ",^(?:" . _PROTOCOLES_STD . '):?/?/?$,iS'; - return preg_match($r, $url) ? '': ($entites ? entites_html($url) : $url); + + return preg_match($r, $url) ? '' : ($entites ? entites_html($url) : $url); } /** * Extrait une date d'un texte et renvoie le résultat au format de date SQL * - * L'année et le mois doivent être numériques. - * Le séparateur entre l'année et le mois peut être un `-`, un `:` ou un texte + * L'année et le mois doivent être numériques. + * Le séparateur entre l'année et le mois peut être un `-`, un `:` ou un texte * quelconque ne contenant pas de chiffres. * - * Les jours ne sont pas pris en compte et le résultat est toujours le 1er du mois. + * Les jours ne sont pas pris en compte et le résultat est toujours le 1er du mois. * * @link http://www.spip.net/5516 * @param string $texte * Texte contenant une date tel que `2008-04` * @return string * Date au format SQL tel que `2008-04-01` -**/ + **/ function extraire_date($texte) { // format = 2001-08 - if (preg_match(",([1-2][0-9]{3})[^0-9]*(1[0-2]|0?[1-9]),",$texte,$regs)) - return $regs[1]."-".sprintf("%02d", $regs[2])."-01"; + if (preg_match(",([1-2][0-9]{3})[^0-9]*(1[0-2]|0?[1-9]),", $texte, $regs)) { + return $regs[1] . "-" . sprintf("%02d", $regs[2]) . "-01"; + } } - + /** * Maquiller une adresse e-mail * * Remplace `@` par 3 caractères aléatoires. - * + * * @uses creer_pass_aleatoire() - * + * * @param string $texte Adresse email * @return string Adresse email maquillée -**/ + **/ function antispam($texte) { include_spip('inc/acces'); $masque = creer_pass_aleatoire(3); + return preg_replace("/@/", " $masque ", $texte); } @@ -1130,13 +1214,13 @@ function antispam($texte) { * @example * `[(#ID_AUTEUR|securiser_acces{#ENV{cle}, rss, #ENV{op}, #ENV{args}}|sinon_interdire_acces)]` * - * @see bouton_spip_rss() pour générer un lien de faible sécurité pour les RSS privés - * @see afficher_low_sec() pour calculer une clé valide + * @see bouton_spip_rss() pour générer un lien de faible sécurité pour les RSS privés + * @see afficher_low_sec() pour calculer une clé valide * @uses verifier_low_sec() - * + * * @filtre * @param int $id_auteur - * L'auteur qui demande la page + * L'auteur qui demande la page * @param string $cle * La clé à tester * @param string $dir @@ -1147,11 +1231,13 @@ function antispam($texte) { * Nom de l'argument calculé * @return bool * True si on a le droit d'accès, false sinon. -**/ -function securiser_acces($id_auteur, $cle, $dir, $op = '', $args = '') -{ + **/ +function securiser_acces($id_auteur, $cle, $dir, $op = '', $args = '') { include_spip('inc/acces'); - if ($op) $dir .= " $op $args"; + if ($op) { + $dir .= " $op $args"; + } + return verifier_low_sec($id_auteur, $cle, $dir); } @@ -1168,33 +1254,34 @@ function securiser_acces($id_auteur, $cle, $dir, $op = '', $args = '') * @note * L'utilisation de `|sinon` en tant que filtre de squelette * est directement compilé dans `public/references` par la fonction `filtre_logique()` - * + * * @param mixed $texte * Contenu de reference a tester * @param mixed $sinon * Contenu a retourner si le contenu de reference est vide * @return mixed * Retourne $texte, sinon $sinon. -**/ -function sinon ($texte, $sinon = '') { - if ($texte OR (!is_array($texte) AND strlen($texte))) + **/ +function sinon($texte, $sinon = '') { + if ($texte OR (!is_array($texte) AND strlen($texte))) { return $texte; - else + } else { return $sinon; + } } /** * Filtre `|choixsivide{vide, pas vide}` alias de `|?{si oui, si non}` avec les arguments inversés - * + * * @example * `[(#TEXTE|choixsivide{vide, plein})]` affiche vide si le `#TEXTE` * est considéré vide par PHP (chaîne vide, false, 0, tableau vide, etc…). * C'est l'équivalent de `[(#TEXTE|?{plein, vide})]` - * + * * @filtre * @see choixsiegal() * @link http://www.spip.net/4189 - * + * * @param mixed $a * La valeur à tester * @param mixed $vide @@ -1202,7 +1289,7 @@ function sinon ($texte, $sinon = '') { * @param mixed $pasvide * Ce qui est retourné sinon * @return mixed -**/ + **/ function choixsivide($a, $vide, $pasvide) { return $a ? $pasvide : $vide; } @@ -1213,10 +1300,10 @@ function choixsivide($a, $vide, $pasvide) { * @example * `#LANG_DIR|choixsiegal{ltr,left,right}` retourne `left` si * `#LANG_DIR` vaut `ltr` et `right` sinon. - * + * * @filtre * @link http://www.spip.net/4148 - * + * * @param mixed $a1 * La valeur à tester * @param mixed $a2 @@ -1226,7 +1313,7 @@ function choixsivide($a, $vide, $pasvide) { * @param mixed $f * Ce qui est retourné sinon * @return mixed -**/ + **/ function choixsiegal($a1, $a2, $v, $f) { return ($a1 == $a2) ? $v : $f; } @@ -1242,11 +1329,10 @@ function choixsiegal($a1, $a2, $v, $f) { * * @note * Si elle vient du contexte (public/parametrer.php), on force le jour - * + * * @filtre * @link http://www.spip.net/5518 * @uses vider_date() - * @param string $date * La date à normaliser * @param bool $forcer_jour @@ -1254,7 +1340,7 @@ function choixsiegal($a1, $a2, $v, $f) { * @return string * - une date au format datetime * - une chaîne vide si la date est considérée nulle -**/ + **/ function normaliser_date($date, $forcer_jour = false) { $date = vider_date($date); if ($date) { @@ -1263,33 +1349,42 @@ function normaliser_date($date, $forcer_jour = false) { } if (preg_match("#^([12][0-9]{3})([-/]00)?( [-0-9:]+)?$#", $date, $regs)) { $regs = array_pad($regs, 4, null); // eviter notice php - $date = $regs[1]."-00-00".$regs[3]; - } else if (preg_match("#^([12][0-9]{3}[-/][01]?[0-9])([-/]00)?( [-0-9:]+)?$#", $date, $regs)) { - $regs = array_pad($regs, 4, null); // eviter notice php - $date = preg_replace("@/@","-",$regs[1])."-00".$regs[3]; + $date = $regs[1] . "-00-00" . $regs[3]; } else { - $date = date("Y-m-d H:i:s", strtotime($date)); + if (preg_match("#^([12][0-9]{3}[-/][01]?[0-9])([-/]00)?( [-0-9:]+)?$#", $date, $regs)) { + $regs = array_pad($regs, 4, null); // eviter notice php + $date = preg_replace("@/@", "-", $regs[1]) . "-00" . $regs[3]; + } else { + $date = date("Y-m-d H:i:s", strtotime($date)); + } } if ($forcer_jour) { $date = str_replace('-00', '-01', $date); } } + return $date; } /** * Enlève une date considérée comme vide - * + * * @param string $letexte * @return string * - La date entrée (si elle n'est pas considérée comme nulle) * - Une chaine vide -**/ + **/ function vider_date($letexte) { - if (strncmp("0000-00-00", $letexte,10)==0) return ''; - if (strncmp("0001-01-01", $letexte,10)==0) return ''; - if (strncmp("1970-01-01", $letexte,10)==0) return ''; // eviter le bug GMT-1 + if (strncmp("0000-00-00", $letexte, 10) == 0) { + return ''; + } + if (strncmp("0001-01-01", $letexte, 10) == 0) { + return ''; + } + if (strncmp("1970-01-01", $letexte, 10) == 0) { + return ''; + } // eviter le bug GMT-1 return $letexte; } @@ -1297,21 +1392,22 @@ function vider_date($letexte) { * Retrouve à partir d'une chaîne les valeurs heures, minutes, secondes * * Retrouve une horaire au format `11:29:55` - * + * * @param string $date * Chaîne de date contenant éventuellement une horaire * @return array * - [heures, minutes, secondes] si horaire trouvée * - [0, 0, 0] sinon -**/ -function recup_heure($date){ + **/ +function recup_heure($date) { - static $d = array(0,0,0); + static $d = array(0, 0, 0); if (!preg_match('#([0-9]{1,2}):([0-9]{1,2}):([0-9]{1,2})#', $date, $r)) { return $d; } array_shift($r); + return $r; } @@ -1321,15 +1417,16 @@ function recup_heure($date){ * @filtre * @link http://www.spip.net/4293 * @uses recup_heure() - * + * * @param string $numdate La date à extraire * @return int heures, sinon 0 -**/ + **/ function heures($numdate) { $date_array = recup_heure($numdate); if ($date_array) { list($heures, $minutes, $secondes) = $date_array; } + return $heures; } @@ -1339,15 +1436,16 @@ function heures($numdate) { * @filtre * @link http://www.spip.net/4300 * @uses recup_heure() - * + * * @param string $numdate La date à extraire * @return int minutes, sinon 0 -**/ + **/ function minutes($numdate) { $date_array = recup_heure($numdate); if ($date_array) { list($heures, $minutes, $secondes) = $date_array; } + return $minutes; } @@ -1357,15 +1455,16 @@ function minutes($numdate) { * @filtre * @link http://www.spip.net/4312 * @uses recup_heure() - * + * * @param string $numdate La date à extraire * @return int secondes, sinon 0 -**/ + **/ function secondes($numdate) { $date_array = recup_heure($numdate); if ($date_array) { list($heures, $minutes, $secondes) = $date_array; } + return $secondes; } @@ -1377,12 +1476,12 @@ function secondes($numdate) { * * @filtre * @link http://www.spip.net/5519 - * + * * @param string $numdate La date à extraire * @return string L'heure formatée dans la langue en cours. -**/ + **/ function heures_minutes($numdate) { - return _T('date_fmt_heures_minutes', array('h'=> heures($numdate), 'm'=> minutes($numdate))); + return _T('date_fmt_heures_minutes', array('h' => heures($numdate), 'm' => minutes($numdate))); } /** @@ -1397,55 +1496,64 @@ function heures_minutes($numdate) { * * Annee, mois, jour, heures, minutes, secondes sont retrouvés si la date contient par exemple : * - '20151104111420' - * + * * @uses recup_heure() - * + * * @param string $numdate La date à extraire * @param bool $forcer_jour * True pour tout le temps renseigner un jour ou un mois (le 1) s'il * ne sont pas indiqués dans la date. * @return array [année, mois, jour, heures, minutes, secondes] -**/ -function recup_date($numdate, $forcer_jour = true){ - if (!$numdate) return ''; + **/ +function recup_date($numdate, $forcer_jour = true) { + if (!$numdate) { + return ''; + } $heures = $minutes = $secondes = 0; if (preg_match('#([0-9]{1,2})/([0-9]{1,2})/([0-9]{4}|[0-9]{1,2})#', $numdate, $regs)) { $jour = $regs[1]; $mois = $regs[2]; $annee = $regs[3]; - if ($annee < 90){ - $annee = 2000 + $annee; - } elseif ($annee<100) { - $annee = 1900 + $annee ; + if ($annee < 90) { + $annee = 2000+$annee; + } elseif ($annee < 100) { + $annee = 1900+$annee; } list($heures, $minutes, $secondes) = recup_heure($numdate); - } - elseif (preg_match('#([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})#',$numdate, $regs)) { + } elseif (preg_match('#([0-9]{4})-([0-9]{1,2})-([0-9]{1,2})#', $numdate, $regs)) { $annee = $regs[1]; $mois = $regs[2]; $jour = $regs[3]; list($heures, $minutes, $secondes) = recup_heure($numdate); - } - elseif (preg_match('#([0-9]{4})-([0-9]{2})#', $numdate, $regs)){ + } elseif (preg_match('#([0-9]{4})-([0-9]{2})#', $numdate, $regs)) { $annee = $regs[1]; $mois = $regs[2]; - $jour =''; + $jour = ''; list($heures, $minutes, $secondes) = recup_heure($numdate); - } - elseif (preg_match('#^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})$#', $numdate, $regs)){ + } elseif (preg_match('#^([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})$#', $numdate, $regs)) { $annee = $regs[1]; $mois = $regs[2]; $jour = $regs[3]; $heures = $regs[4]; $minutes = $regs[5]; $secondes = $regs[6]; - } else $annee = $mois = $jour =''; - if ($annee > 4000) $annee -= 9000; - if (substr($jour, 0, 1) == '0') $jour = substr($jour, 1); + } else { + $annee = $mois = $jour = ''; + } + if ($annee > 4000) { + $annee -= 9000; + } + if (substr($jour, 0, 1) == '0') { + $jour = substr($jour, 1); + } - if ($forcer_jour AND $jour == '0') $jour = '1'; - if ($forcer_jour AND $mois == '0') $mois = '1'; + if ($forcer_jour AND $jour == '0') { + $jour = '1'; + } + if ($forcer_jour AND $mois == '0') { + $mois = '1'; + } if ($annee OR $mois OR $jour OR $heures OR $minutes OR $secondes) { return array($annee, $mois, $jour, $heures, $minutes, $secondes); } @@ -1459,14 +1567,14 @@ function recup_date($numdate, $forcer_jour = true){ * - «il y a 3 minutes», * - «il y a 11 heures», * - «10 mai 2015 à 10h23min» - * + * * @example `[(#DATE|date_interface)]` - * + * * @filtre * @link http://www.spip.net/5520 * @uses date_relative() * @uses affdate_heure() utilisé si le décalage est trop grand - * + * * @param string $date * La date fournie * @param int $decalage_maxi @@ -1474,7 +1582,7 @@ function recup_date($numdate, $forcer_jour = true){ * Par défaut +/- 12h. * @return string * La date relative ou complète -**/ + **/ function date_interface($date, $decalage_maxi = 43200 /* 12*3600 */) { return sinon( date_relative($date, $decalage_maxi), @@ -1496,10 +1604,10 @@ function date_interface($date, $decalage_maxi = 43200 /* 12*3600 */) { * - `[(#DATE|date_relative)]` * - `[(#DATE|date_relative{43200})]` * - `[(#DATE|date_relative{0, #AUTRE_DATE})]` Calcul relatif à une date spécifique - * + * * @filtre * @link http://www.spip.net/4277 - * + * * @param string $date * La date fournie * @param int $decalage_maxi @@ -1510,77 +1618,91 @@ function date_interface($date, $decalage_maxi = 43200 /* 12*3600 */) { * @return string * - La date relative * - "" si un dépasse le décalage maximum est indiqué et dépassé. -**/ + **/ function date_relative($date, $decalage_maxi = 0, $ref_date = null) { - if (is_null($ref_date)) + if (is_null($ref_date)) { $ref_time = time(); - else + } else { $ref_time = strtotime($ref_date); - - if (!$date) return; - $decal = date("U",$ref_time) - date("U", strtotime($date)); + } - if ($decalage_maxi AND ($decal > $decalage_maxi OR $decal < 0)) + if (!$date) { + return; + } + $decal = date("U", $ref_time)-date("U", strtotime($date)); + + if ($decalage_maxi AND ($decal > $decalage_maxi OR $decal < 0)) { return ''; + } if ($decal < 0) { $il_y_a = "date_dans"; - $decal = -1 * $decal; + $decal = -1*$decal; } else { $il_y_a = "date_il_y_a"; } - if ($decal > 3600 * 24 * 30 * 6) + if ($decal > 3600*24*30*6) { return affdate_court($date); + } - if ($decal > 3600 * 24 * 30) { - $mois = floor ($decal / (3600 * 24 * 30)); - if ($mois < 2) - $delai = "$mois "._T("date_un_mois"); - else - $delai = "$mois "._T("date_mois"); - } - else if ($decal > 3600 * 24 * 7) { - $semaines = floor ($decal / (3600 * 24 * 7)); - if ($semaines < 2) - $delai = "$semaines "._T("date_une_semaine"); - else - $delai = "$semaines "._T("date_semaines"); - } - else if ($decal > 3600 * 24) { - $jours = floor ($decal / (3600 * 24)); - if ($jours < 2) - return $il_y_a=="date_dans"?_T("date_demain"):_T("date_hier"); - else - $delai = "$jours "._T("date_jours"); - } - else if ($decal >= 3600) { - $heures = floor ($decal / 3600); - if ($heures < 2) - $delai = "$heures "._T("date_une_heure"); - else - $delai = "$heures "._T("date_heures"); - } - else if ($decal >= 60) { - $minutes = floor($decal / 60); - if ($minutes < 2) - $delai = "$minutes "._T("date_une_minute"); - else - $delai = "$minutes "._T("date_minutes"); + if ($decal > 3600*24*30) { + $mois = floor($decal/(3600*24*30)); + if ($mois < 2) { + $delai = "$mois " . _T("date_un_mois"); + } else { + $delai = "$mois " . _T("date_mois"); + } } else { - $secondes = ceil($decal); - if ($secondes < 2) - $delai = "$secondes "._T("date_une_seconde"); - else - $delai = "$secondes "._T("date_secondes"); + if ($decal > 3600*24*7) { + $semaines = floor($decal/(3600*24*7)); + if ($semaines < 2) { + $delai = "$semaines " . _T("date_une_semaine"); + } else { + $delai = "$semaines " . _T("date_semaines"); + } + } else { + if ($decal > 3600*24) { + $jours = floor($decal/(3600*24)); + if ($jours < 2) { + return $il_y_a == "date_dans" ? _T("date_demain") : _T("date_hier"); + } else { + $delai = "$jours " . _T("date_jours"); + } + } else { + if ($decal >= 3600) { + $heures = floor($decal/3600); + if ($heures < 2) { + $delai = "$heures " . _T("date_une_heure"); + } else { + $delai = "$heures " . _T("date_heures"); + } + } else { + if ($decal >= 60) { + $minutes = floor($decal/60); + if ($minutes < 2) { + $delai = "$minutes " . _T("date_une_minute"); + } else { + $delai = "$minutes " . _T("date_minutes"); + } + } else { + $secondes = ceil($decal); + if ($secondes < 2) { + $delai = "$secondes " . _T("date_une_seconde"); + } else { + $delai = "$secondes " . _T("date_secondes"); + } + } + } + } + } } - return _T($il_y_a, array("delai"=> $delai)); + return _T($il_y_a, array("delai" => $delai)); } - /** * Retourne une date relative courte (passée ou à venir) * @@ -1588,10 +1710,10 @@ function date_relative($date, $decalage_maxi = 0, $ref_date = null) { * utilise `date_relative()` * * @example `[(#DATE|date_relativecourt)]` - * + * * @filtre * @uses date_relative() - * + * * @param string $date * La date fournie * @param int $decalage_maxi @@ -1600,29 +1722,32 @@ function date_relative($date, $decalage_maxi = 0, $ref_date = null) { * @return string * - La date relative * - "" si un dépasse le décalage maximum est indiqué et dépassé. -**/ + **/ function date_relativecourt($date, $decalage_maxi = 0) { - - if (!$date) return; - $decal = date("U",strtotime(date('Y-m-d'))-strtotime(date('Y-m-d',strtotime($date)))); - if ($decalage_maxi AND ($decal > $decalage_maxi OR $decal < 0)) + if (!$date) { + return; + } + $decal = date("U", strtotime(date('Y-m-d'))-strtotime(date('Y-m-d', strtotime($date)))); + + if ($decalage_maxi AND ($decal > $decalage_maxi OR $decal < 0)) { return ''; + } if ($decal < -24*3600) { $retour = date_relative($date, $decalage_maxi); - } - elseif ($decal < 0) { + } elseif ($decal < 0) { $retour = _T("date_demain"); - } - else if ($decal < (3600 * 24) ) { - $retour = _T("date_aujourdhui"); - } - else if ($decal < (3600 * 24 *2) ) { - $retour = _T("date_hier"); - } - else { - $retour = date_relative($date, $decalage_maxi); + } else { + if ($decal < (3600*24)) { + $retour = _T("date_aujourdhui"); + } else { + if ($decal < (3600*24*2)) { + $retour = _T("date_hier"); + } else { + $retour = date_relative($date, $decalage_maxi); + } + } } return $retour; @@ -1636,9 +1761,9 @@ function date_relativecourt($date, $decalage_maxi = 0) { * @param string $vue * Type de format souhaité ou expression pour `strtotime()` tel que `Y-m-d h:i:s` * @param array $options { - * @type string $param + * @type string $param * 'abbr' ou 'initiale' permet d'afficher les jours au format court ou initiale - * @type int $annee_courante + * @type int $annee_courante * Permet de definir l'annee de reference pour l'affichage des dates courtes * } * @return mixed|string @@ -1648,7 +1773,9 @@ function affdate_base($numdate, $vue, $options = array()) { $options = array('param' => $options); } $date_array = recup_date($numdate, false); - if (!$date_array) return; + if (!$date_array) { + return; + } list($annee, $mois, $jour, $heures, $minutes, $secondes) = $date_array; // 1er, 21st, etc. @@ -1659,102 +1786,143 @@ function affdate_base($numdate, $vue, $options = array()) { $njour = 0; } else { $njour = intval($jour); - if ($jourth = _T('date_jnum'.$jour)) + if ($jourth = _T('date_jnum' . $jour)) { $jour = $jourth; + } } $mois = intval($mois); if ($mois > 0 AND $mois < 13) { - $nommois = _T('date_mois_'.$mois); - if ($jour) - $jourmois = _T('date_de_mois_'.$mois, array('j'=>$jour, 'nommois'=>$nommois)); - else + $nommois = _T('date_mois_' . $mois); + if ($jour) { + $jourmois = _T('date_de_mois_' . $mois, array('j' => $jour, 'nommois' => $nommois)); + } else { $jourmois = $nommois; + } } else { $nommois = ''; $jourmois = ''; } if ($annee < 0) { - $annee = -$annee." "._T('date_avant_jc'); + $annee = -$annee . " " . _T('date_avant_jc'); $avjc = true; + } else { + $avjc = false; } - else $avjc = false; switch ($vue) { - case 'saison': - case 'saison_annee': - $saison = ''; - if ($mois > 0){ - $saison = ($options['param'] == 'sud') ? 3 : 1; - if (($mois == 3 AND $jour >= 21) OR $mois > 3) $saison = ($options['param'] == 'sud') ? 4 : 2; - if (($mois == 6 AND $jour >= 21) OR $mois > 6) $saison = ($options['param'] == 'sud') ? 1 : 3; - if (($mois == 9 AND $jour >= 21) OR $mois > 9) $saison = ($options['param'] == 'sud') ? 2 : 4; - if (($mois == 12 AND $jour >= 21) OR $mois > 12) $saison = ($options['param'] == 'sud') ? 3 : 1; - } - if($vue == 'saison') - return $saison?_T('date_saison_'.$saison):''; - else - return $saison?trim(_T('date_fmt_saison_annee', array('saison'=>_T('date_saison_'.$saison), 'annee'=>$annee))) :''; - - case 'court': - if ($avjc) return $annee; - $a = ((isset($options['annee_courante']) AND $options['annee_courante'])?$options['annee_courante']:date('Y')); - if ($annee < ($a - 100) OR $annee > ($a + 100)) return $annee; - if ($annee != $a) return _T('date_fmt_mois_annee', array ('mois'=>$mois, 'nommois'=>spip_ucfirst($nommois), 'annee'=>$annee)); - return _T('date_fmt_jour_mois', array ('jourmois'=>$jourmois, 'jour'=>$jour, 'mois'=>$mois, 'nommois'=>$nommois, 'annee'=>$annee)); - - case 'jourcourt': - if ($avjc) return $annee; - $a = ((isset($options['annee_courante']) AND $options['annee_courante'])?$options['annee_courante']:date('Y')); - if ($annee < ($a - 100) OR $annee > ($a + 100)) return $annee; - if ($annee != $a) return _T('date_fmt_jour_mois_annee', array ('jourmois'=>$jourmois, 'jour'=>$jour, 'mois'=>$mois, 'nommois'=>$nommois, 'annee'=>$annee)); - return _T('date_fmt_jour_mois', array ('jourmois'=>$jourmois, 'jour'=>$jour, 'mois'=>$mois, 'nommois'=>$nommois, 'annee'=>$annee)); - - case 'entier': - if ($avjc) return $annee; - if ($jour) - return _T('date_fmt_jour_mois_annee', array ('jourmois'=>$jourmois, 'jour'=>$jour, 'mois'=>$mois, 'nommois'=>$nommois, 'annee'=>$annee)); - elseif ($mois) - return trim(_T('date_fmt_mois_annee', array ('mois'=>$mois, 'nommois'=>$nommois, 'annee'=>$annee))); - else - return $annee; + case 'saison': + case 'saison_annee': + $saison = ''; + if ($mois > 0) { + $saison = ($options['param'] == 'sud') ? 3 : 1; + if (($mois == 3 AND $jour >= 21) OR $mois > 3) { + $saison = ($options['param'] == 'sud') ? 4 : 2; + } + if (($mois == 6 AND $jour >= 21) OR $mois > 6) { + $saison = ($options['param'] == 'sud') ? 1 : 3; + } + if (($mois == 9 AND $jour >= 21) OR $mois > 9) { + $saison = ($options['param'] == 'sud') ? 2 : 4; + } + if (($mois == 12 AND $jour >= 21) OR $mois > 12) { + $saison = ($options['param'] == 'sud') ? 3 : 1; + } + } + if ($vue == 'saison') { + return $saison ? _T('date_saison_' . $saison) : ''; + } else { + return $saison ? trim(_T('date_fmt_saison_annee', + array('saison' => _T('date_saison_' . $saison), 'annee' => $annee))) : ''; + } - case 'nom_mois': - $param = ((isset($options['param']) AND $options['param']) ? '_'.$options['param'] : ''); - if ($param and $mois) { - return _T('date_mois_'.$mois.$param); - } - return $nommois; + case 'court': + if ($avjc) { + return $annee; + } + $a = ((isset($options['annee_courante']) AND $options['annee_courante']) ? $options['annee_courante'] : date('Y')); + if ($annee < ($a-100) OR $annee > ($a+100)) { + return $annee; + } + if ($annee != $a) { + return _T('date_fmt_mois_annee', + array('mois' => $mois, 'nommois' => spip_ucfirst($nommois), 'annee' => $annee)); + } - case 'mois': - return sprintf("%02s",$mois); + return _T('date_fmt_jour_mois', + array('jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee)); - case 'jour': - return $jour; + case 'jourcourt': + if ($avjc) { + return $annee; + } + $a = ((isset($options['annee_courante']) AND $options['annee_courante']) ? $options['annee_courante'] : date('Y')); + if ($annee < ($a-100) OR $annee > ($a+100)) { + return $annee; + } + if ($annee != $a) { + return _T('date_fmt_jour_mois_annee', + array('jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee)); + } - case 'journum': - return $journum; + return _T('date_fmt_jour_mois', + array('jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee)); - case 'nom_jour': - if (!$mois OR !$njour) - return ''; - $nom = mktime(1,1,1,$mois,$njour,$annee); - $nom = 1+date('w',$nom); - $param = ((isset($options['param']) AND $options['param']) ? '_'.$options['param'] : ''); - return _T('date_jour_'.$nom.$param); + case 'entier': + if ($avjc) { + return $annee; + } + if ($jour) { + return _T('date_fmt_jour_mois_annee', + array('jourmois' => $jourmois, 'jour' => $jour, 'mois' => $mois, 'nommois' => $nommois, 'annee' => $annee)); + } elseif ($mois) { + return trim(_T('date_fmt_mois_annee', array('mois' => $mois, 'nommois' => $nommois, 'annee' => $annee))); + } else { + return $annee; + } + + case 'nom_mois': + $param = ((isset($options['param']) AND $options['param']) ? '_' . $options['param'] : ''); + if ($param and $mois) { + return _T('date_mois_' . $mois . $param); + } + + return $nommois; + + case 'mois': + return sprintf("%02s", $mois); + + case 'jour': + return $jour; + + case 'journum': + return $journum; + + case 'nom_jour': + if (!$mois OR !$njour) { + return ''; + } + $nom = mktime(1, 1, 1, $mois, $njour, $annee); + $nom = 1+date('w', $nom); + $param = ((isset($options['param']) AND $options['param']) ? '_' . $options['param'] : ''); - case 'mois_annee': - if ($avjc) return $annee; - return trim(_T('date_fmt_mois_annee', array('mois'=>$mois, 'nommois'=>$nommois, 'annee'=>$annee))); + return _T('date_jour_' . $nom . $param); - case 'annee': - return $annee; + case 'mois_annee': + if ($avjc) { + return $annee; + } + + return trim(_T('date_fmt_mois_annee', array('mois' => $mois, 'nommois' => $nommois, 'annee' => $annee))); + + case 'annee': + return $annee; - // Cas d'une vue non definie : retomber sur le format - // de date propose par http://www.php.net/date - default: - return date($vue, strtotime($numdate)); + // Cas d'une vue non definie : retomber sur le format + // de date propose par http://www.php.net/date + default: + return date($vue, strtotime($numdate)); } } @@ -1766,7 +1934,7 @@ function affdate_base($numdate, $vue, $options = array()) { * - `[(#DATE|nom_jour)]` lundi * - `[(#DATE|nom_jour{abbr})]` lun. * - `[(#DATE|nom_jour{initiale})]` l. - * + * * @filtre * @link http://www.spip.net/4305 * @uses affdate_base() @@ -1779,10 +1947,13 @@ function affdate_base($numdate, $vue, $options = array()) { * - abbr : abbréviation du jour * - '' : le nom complet (par défaut) * @return string - * Nom du jour -**/ + * Nom du jour + **/ function nom_jour($numdate, $forme = '') { - if(!($forme == 'abbr' OR $forme == 'initiale')) $forme = ''; + if (!($forme == 'abbr' OR $forme == 'initiale')) { + $forme = ''; + } + return affdate_base($numdate, 'nom_jour', $forme); } @@ -1793,17 +1964,17 @@ function nom_jour($numdate, $forme = '') { * en fonction de la langue utilisée. * * @example `[(#DATE|jour)]` - * + * * @filtre * @link http://www.spip.net/4295 * @uses affdate_base() - * @see journum() - * + * @see journum() + * * @param string $numdate * Une écriture de date * @return int - * Numéro du jour -**/ + * Numéro du jour + **/ function jour($numdate) { return affdate_base($numdate, 'jour'); } @@ -1815,13 +1986,13 @@ function jour($numdate) { * * @filtre * @uses affdate_base() - * @see jour() - * + * @see jour() + * * @param string $numdate * Une écriture de date * @return int - * Numéro du jour -**/ + * Numéro du jour + **/ function journum($numdate) { return affdate_base($numdate, 'journum'); } @@ -1830,27 +2001,27 @@ function journum($numdate) { * Affiche le numéro du mois (01 à 12) pour une date donnée * * @example `[(#DATE|mois)]` - * + * * @filtre * @link http://www.spip.net/4303 * @uses affdate_base() - * + * * @param string $numdate * Une écriture de date * @return string * Numéro du mois (sur 2 chiffres) -**/ + **/ function mois($numdate) { return affdate_base($numdate, 'mois'); } /** * Affiche le nom du mois pour une date donnée - * + * * @example * - `[(#DATE|nom_mois)]` novembre * - `[(#DATE|nom_mois{abbr})]` nov. - * + * * @filtre * @link http://www.spip.net/4306 * @uses affdate_base() @@ -1862,10 +2033,13 @@ function mois($numdate) { * - abbr : abbréviation du mois * - '' : le nom complet (par défaut) * @return string - * Nom du mois -**/ + * Nom du mois + **/ function nom_mois($numdate, $forme = '') { - if(!($forme == 'abbr')) $forme = ''; + if (!($forme == 'abbr')) { + $forme = ''; + } + return affdate_base($numdate, 'nom_mois', $forme); } @@ -1873,16 +2047,16 @@ function nom_mois($numdate, $forme = '') { * Affiche l'année sur 4 chiffres d'une date donnée * * @example `[(#DATE|annee)]` - * + * * @filtre * @link http://www.spip.net/4146 * @uses affdate_base() - * + * * @param string $numdate * Une écriture de date * @return int * Année (sur 4 chiffres) -**/ + **/ function annee($numdate) { return affdate_base($numdate, 'annee'); } @@ -1911,9 +2085,12 @@ function annee($numdate) { * Nom optionnel de l'hémisphère (sud ou nord) ; par défaut nord * @return string * La date formatée -**/ + **/ function saison($numdate, $hemisphere = 'nord') { - if ($hemisphere != 'sud') $hemisphere = 'nord'; + if ($hemisphere != 'sud') { + $hemisphere = 'nord'; + } + return affdate_base($numdate, 'saison', $hemisphere); } @@ -1941,9 +2118,12 @@ function saison($numdate, $hemisphere = 'nord') { * Nom optionnel de l'hémisphère (sud ou nord) ; par défaut nord * @return string * La date formatée -**/ + **/ function saison_annee($numdate, $hemisphere = 'nord') { - if ($hemisphere != 'sud') $hemisphere = 'nord'; + if ($hemisphere != 'sud') { + $hemisphere = 'nord'; + } + return affdate_base($numdate, 'saison_annee', $hemisphere); } @@ -1957,12 +2137,12 @@ function saison_annee($numdate, $hemisphere = 'nord') { * En squelettes * - `[(#DATE|affdate)]` * - `[(#DATE|affdate{Y-m-d})]` - * + * * @filtre * @link http://www.spip.net/4129 * @uses affdate_base() - * @see affdate_court() - * @see affdate_jourcourt() + * @see affdate_court() + * @see affdate_jourcourt() * * @param string $numdate * Une écriture de date @@ -1970,7 +2150,7 @@ function saison_annee($numdate, $hemisphere = 'nord') { * Type de format souhaité ou expression pour `strtotime()` tel que `Y-m-d h:i:s` * @return string * La date formatée -**/ + **/ function affdate($numdate, $format = 'entier') { return affdate_base($numdate, $format); } @@ -1984,12 +2164,12 @@ function affdate($numdate, $format = 'entier') { * mais retournera "juin 2013" si la date en entrée est le 21 juin 2013. * * @example `[(#DATE|affdate_court)]` - * + * * @filtre * @link http://www.spip.net/4130 * @uses affdate_base() - * @see affdate() - * @see affdate_jourcourt() + * @see affdate() + * @see affdate_jourcourt() * * @param string $numdate * Une écriture de date @@ -1997,9 +2177,9 @@ function affdate($numdate, $format = 'entier') { * L'année de comparaison, utilisera l'année en cours si omis. * @return string * La date formatée -**/ + **/ function affdate_court($numdate, $annee_courante = null) { - return affdate_base($numdate, 'court', array('annee_courante'=>$annee_courante)); + return affdate_base($numdate, 'court', array('annee_courante' => $annee_courante)); } @@ -2011,12 +2191,12 @@ function affdate_court($numdate, $annee_courante = null) { * mais retournera "21 juin 2013" si la date en entrée est le 21 juin 2013. * * @example `[(#DATE|affdate_jourcourt)]` - * + * * @filtre * @link http://www.spip.net/4131 * @uses affdate_base() - * @see affdate() - * @see affdate_court() + * @see affdate() + * @see affdate_court() * * @param string $numdate * Une écriture de date @@ -2024,16 +2204,16 @@ function affdate_court($numdate, $annee_courante = null) { * L'année de comparaison, utilisera l'année en cours si omis. * @return string * La date formatée -**/ + **/ function affdate_jourcourt($numdate, $annee_courante = null) { - return affdate_base($numdate, 'jourcourt', array('annee_courante'=>$annee_courante)); + return affdate_base($numdate, 'jourcourt', array('annee_courante' => $annee_courante)); } /** * Retourne le mois en toute lettre et l’année d'une date * * Ne retourne pas le jour donc. - * + * * @filtre * @link http://www.spip.net/4132 * @uses affdate_base() @@ -2042,7 +2222,7 @@ function affdate_jourcourt($numdate, $annee_courante = null) { * Une écriture de date * @return string * La date formatée -**/ + **/ function affdate_mois_annee($numdate) { return affdate_base($numdate, 'mois_annee'); } @@ -2051,7 +2231,7 @@ function affdate_mois_annee($numdate) { * Retourne la date suivie de l'heure * * @example `[(#DATE|affdate_heure)]` peut donner "11 novembre 2015 à 11h10min" - * + * * @filtre * @uses recup_date() * @uses affdate() @@ -2060,17 +2240,23 @@ function affdate_mois_annee($numdate) { * Une écriture de date * @return string * La date formatée -**/ + **/ function affdate_heure($numdate) { $date_array = recup_date($numdate); - if (!$date_array) return; - list($annee, $mois, $jour, $heures, $minutes, $sec)= $date_array; - return _T('date_fmt_jour_heure', array('jour' => affdate($numdate), 'heure' => _T('date_fmt_heures_minutes', array('h'=> $heures, 'm'=> $minutes)))); + if (!$date_array) { + return; + } + list($annee, $mois, $jour, $heures, $minutes, $sec) = $date_array; + + return _T('date_fmt_jour_heure', array( + 'jour' => affdate($numdate), + 'heure' => _T('date_fmt_heures_minutes', array('h' => $heures, 'm' => $minutes)) + )); } /** * Afficher de facon textuelle les dates de début et fin en fonction des cas - * + * * - Lundi 20 fevrier a 18h * - Le 20 fevrier de 18h a 20h * - Du 20 au 23 fevrier @@ -2096,17 +2282,23 @@ function affdate_heure($numdate) { * @return string * Texte de la date */ -function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme = ''){ +function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme = '') { $abbr = $jour = ''; $affdate = "affdate_jourcourt"; - if (strpos($forme,'abbr') !==false) $abbr = 'abbr'; - if (strpos($forme,'annee')!==false) $affdate = 'affdate'; - if (strpos($forme,'jour') !==false) $jour = 'jour'; - + if (strpos($forme, 'abbr') !== false) { + $abbr = 'abbr'; + } + if (strpos($forme, 'annee') !== false) { + $affdate = 'affdate'; + } + if (strpos($forme, 'jour') !== false) { + $jour = 'jour'; + } + $dtstart = $dtend = $dtabbr = ""; - if (strpos($forme,'hcal')!==false) { - $dtstart = "<abbr class='dtstart' title='".date_iso($date_debut)."'>"; - $dtend = "<abbr class='dtend' title='".date_iso($date_fin)."'>"; + if (strpos($forme, 'hcal') !== false) { + $dtstart = "<abbr class='dtstart' title='" . date_iso($date_debut) . "'>"; + $dtend = "<abbr class='dtend' title='" . date_iso($date_fin) . "'>"; $dtabbr = "</abbr>"; } @@ -2114,82 +2306,92 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme = '' $date_fin = strtotime($date_fin); $d = date("Y-m-d", $date_debut); $f = date("Y-m-d", $date_fin); - $h = ($horaire==='oui' OR $horaire===true); - $hd = _T('date_fmt_heures_minutes_court', array('h'=> date("H",$date_debut), 'm'=> date("i",$date_debut))); - $hf = _T('date_fmt_heures_minutes_court', array('h'=> date("H",$date_fin), 'm'=> date("i",$date_fin))); + $h = ($horaire === 'oui' OR $horaire === true); + $hd = _T('date_fmt_heures_minutes_court', array('h' => date("H", $date_debut), 'm' => date("i", $date_debut))); + $hf = _T('date_fmt_heures_minutes_court', array('h' => date("H", $date_fin), 'm' => date("i", $date_fin))); - if ($d==$f) - { // meme jour - $nomjour = nom_jour($d,$abbr); + if ($d == $f) { // meme jour + $nomjour = nom_jour($d, $abbr); $s = $affdate($d); - $s = _T('date_fmt_jour',array('nomjour'=>$nomjour,'jour' => $s)); - if ($h){ - if ($hd==$hf){ + $s = _T('date_fmt_jour', array('nomjour' => $nomjour, 'jour' => $s)); + if ($h) { + if ($hd == $hf) { // Lundi 20 fevrier a 18h25 - $s = spip_ucfirst(_T('date_fmt_jour_heure',array('jour'=>$s,'heure'=>$hd))); + $s = spip_ucfirst(_T('date_fmt_jour_heure', array('jour' => $s, 'heure' => $hd))); $s = "$dtstart$s$dtabbr"; - }else{ + } else { // Le <abbr...>lundi 20 fevrier de 18h00</abbr> a <abbr...>20h00</abbr> - if($dtabbr && $dtstart && $dtend) - $s = _T('date_fmt_jour_heure_debut_fin_abbr',array('jour'=>spip_ucfirst($s),'heure_debut'=>$hd,'heure_fin'=>$hf,'dtstart'=>$dtstart,'dtend'=>$dtend,'dtabbr'=>$dtabbr)); - // Le lundi 20 fevrier de 18h00 a 20h00 - else - $s = spip_ucfirst(_T('date_fmt_jour_heure_debut_fin',array('jour'=>$s,'heure_debut'=>$hd,'heure_fin'=>$hf))); + if ($dtabbr && $dtstart && $dtend) { + $s = _T('date_fmt_jour_heure_debut_fin_abbr', array( + 'jour' => spip_ucfirst($s), + 'heure_debut' => $hd, + 'heure_fin' => $hf, + 'dtstart' => $dtstart, + 'dtend' => $dtend, + 'dtabbr' => $dtabbr + )); + } // Le lundi 20 fevrier de 18h00 a 20h00 + else { + $s = spip_ucfirst(_T('date_fmt_jour_heure_debut_fin', + array('jour' => $s, 'heure_debut' => $hd, 'heure_fin' => $hf))); + } } - }else{ - if($dtabbr && $dtstart) - $s = $dtstart.spip_ucfirst($s).$dtabbr; - else + } else { + if ($dtabbr && $dtstart) { + $s = $dtstart . spip_ucfirst($s) . $dtabbr; + } else { $s = spip_ucfirst($s); + } } - } - else if ((date("Y-m",$date_debut))==date("Y-m",$date_fin)) - { // meme annee et mois, jours differents - if(!$h) - $date_debut = jour($d); - else - $date_debut = affdate_jourcourt($d,date("Y",$date_fin)); - $date_fin = $affdate($f); - if($jour){ - $nomjour_debut = nom_jour($d,$abbr); - $date_debut = _T('date_fmt_jour',array('nomjour'=>$nomjour_debut,'jour' => $date_debut)); - $nomjour_fin = nom_jour($f,$abbr); - $date_fin = _T('date_fmt_jour',array('nomjour'=>$nomjour_fin,'jour' => $date_fin)); - } - if ($h){ - $date_debut = _T('date_fmt_jour_heure',array('jour'=>$date_debut,'heure'=>$hd)); - $date_fin = _T('date_fmt_jour_heure',array('jour'=>$date_fin,'heure'=>$hf)); - } - $date_debut = $dtstart.$date_debut.$dtabbr; - $date_fin = $dtend.$date_fin.$dtabbr; - - $s = _T('date_fmt_periode',array('date_debut' => $date_debut,'date_fin'=>$date_fin)); - } - else { - $date_debut = affdate_jourcourt($d,date("Y",$date_fin)); - $date_fin = $affdate($f); - if($jour){ - $nomjour_debut = nom_jour($d,$abbr); - $date_debut = _T('date_fmt_jour',array('nomjour'=>$nomjour_debut,'jour' => $date_debut)); - $nomjour_fin = nom_jour($f,$abbr); - $date_fin = _T('date_fmt_jour',array('nomjour'=>$nomjour_fin,'jour' => $date_fin)); - } - if ($h){ - $date_debut = _T('date_fmt_jour_heure',array('jour'=>$date_debut,'heure'=>$hd)); - $date_fin = _T('date_fmt_jour_heure',array('jour'=>$date_fin,'heure'=>$hf)); + } else { + if ((date("Y-m", $date_debut)) == date("Y-m", $date_fin)) { // meme annee et mois, jours differents + if (!$h) { + $date_debut = jour($d); + } else { + $date_debut = affdate_jourcourt($d, date("Y", $date_fin)); + } + $date_fin = $affdate($f); + if ($jour) { + $nomjour_debut = nom_jour($d, $abbr); + $date_debut = _T('date_fmt_jour', array('nomjour' => $nomjour_debut, 'jour' => $date_debut)); + $nomjour_fin = nom_jour($f, $abbr); + $date_fin = _T('date_fmt_jour', array('nomjour' => $nomjour_fin, 'jour' => $date_fin)); + } + if ($h) { + $date_debut = _T('date_fmt_jour_heure', array('jour' => $date_debut, 'heure' => $hd)); + $date_fin = _T('date_fmt_jour_heure', array('jour' => $date_fin, 'heure' => $hf)); + } + $date_debut = $dtstart . $date_debut . $dtabbr; + $date_fin = $dtend . $date_fin . $dtabbr; + + $s = _T('date_fmt_periode', array('date_debut' => $date_debut, 'date_fin' => $date_fin)); + } else { + $date_debut = affdate_jourcourt($d, date("Y", $date_fin)); + $date_fin = $affdate($f); + if ($jour) { + $nomjour_debut = nom_jour($d, $abbr); + $date_debut = _T('date_fmt_jour', array('nomjour' => $nomjour_debut, 'jour' => $date_debut)); + $nomjour_fin = nom_jour($f, $abbr); + $date_fin = _T('date_fmt_jour', array('nomjour' => $nomjour_fin, 'jour' => $date_fin)); + } + if ($h) { + $date_debut = _T('date_fmt_jour_heure', array('jour' => $date_debut, 'heure' => $hd)); + $date_fin = _T('date_fmt_jour_heure', array('jour' => $date_fin, 'heure' => $hf)); + } + + $date_debut = $dtstart . $date_debut . $dtabbr; + $date_fin = $dtend . $date_fin . $dtabbr; + $s = _T('date_fmt_periode', array('date_debut' => $date_debut, 'date_fin' => $date_fin)); + } - - $date_debut = $dtstart.$date_debut.$dtabbr; - $date_fin=$dtend.$date_fin.$dtabbr; - $s = _T('date_fmt_periode',array('date_debut' => $date_debut,'date_fin'=>$date_fin)); - } + return $s; } /** * Alignements en HTML (Old-style, préférer CSS) - * + * * Cette fonction ne crée pas de paragraphe * * @deprecated Utiliser CSS @@ -2199,58 +2401,65 @@ function affdate_debut_fin($date_debut, $date_fin, $horaire = 'oui', $forme = '' */ function aligner($letexte, $justif = '') { $letexte = trim($letexte); - if (!strlen($letexte)) return ''; + if (!strlen($letexte)) { + return ''; + } // Paragrapher rapidement $letexte = "<div style='text-align:$justif'>" . $letexte - ."</div>"; + . "</div>"; return $letexte; } /** * Justifie en HTML (Old-style, préférer CSS) + * * @deprecated Utiliser CSS * @uses aligner() * @param string $letexte * @return string */ -function justifier($letexte) { return aligner($letexte, 'justify');} +function justifier($letexte) { return aligner($letexte, 'justify'); } /** * Aligne à droite en HTML (Old-style, préférer CSS) + * * @deprecated Utiliser CSS * @uses aligner() * @param string $letexte * @return string */ -function aligner_droite($letexte) { return aligner($letexte, 'right');} +function aligner_droite($letexte) { return aligner($letexte, 'right'); } /** * Aligne à gauche en HTML (Old-style, préférer CSS) + * * @deprecated Utiliser CSS * @uses aligner() * @param string $letexte * @return string */ -function aligner_gauche($letexte) {return aligner($letexte, 'left');} +function aligner_gauche($letexte) { return aligner($letexte, 'left'); } /** * Centre en HTML (Old-style, préférer CSS) + * * @deprecated Utiliser CSS * @uses aligner() * @param string $letexte * @return string */ -function centrer($letexte) {return aligner($letexte, 'center');} +function centrer($letexte) { return aligner($letexte, 'center'); } /** * Retourne un texte de style CSS aligné sur la langue en cours + * * @deprecated * @param mixed $bof Inutilisé * @return string Style CSS -**/ + **/ function style_align($bof) { return "text-align: " . $GLOBALS['spip_lang_left']; @@ -2267,10 +2476,10 @@ function style_align($bof) { * * @example `SUMMARY:[(#TITRE|filtrer_ical)]` * @filtre - * + * * @param string $texte * @return string -**/ + **/ function filtrer_ical($texte) { #include_spip('inc/charsets'); $texte = html2unicode($texte); @@ -2285,23 +2494,24 @@ function filtrer_ical($texte) { * Adapte une date pour être insérée dans une valeur de date d'un export ICAL * * Retourne une date au format `Ymd\THis`, tel que '20150428T163254' - * + * * @example `DTSTAMP:[(#DATE|date_ical)]` * @filtre * @uses recup_heure() * @uses recup_date() - * + * * @param string $date * La date * @param int $addminutes - * Ajouter autant de minutes à la date + * Ajouter autant de minutes à la date * @return string * Date au format ical -**/ + **/ function date_ical($date, $addminutes = 0) { list($heures, $minutes, $secondes) = recup_heure($date); list($annee, $mois, $jour) = recup_date($date); - return date("Ymd\THis", mktime($heures, $minutes + $addminutes, $secondes, $mois, $jour, $annee)); + + return date("Ymd\THis", mktime($heures, $minutes+$addminutes, $secondes, $mois, $jour, $annee)); } @@ -2309,13 +2519,13 @@ function date_ical($date, $addminutes = 0) { * Retourne une date formattée au format "RFC 3339" ou "ISO 8601" * * @example `[(#DATE|date_iso)]` peut donner "2015-11-11T10:13:45Z" - * + * * @filtre * @link http://www.spip.net/5641 * @link https://fr.wikipedia.org/wiki/ISO_8601 * @link http://www.ietf.org/rfc/rfc3339.txt * @link http://php.net/manual/fr/class.datetime.php - * + * * @uses recup_date() * @uses recup_heure() * @@ -2323,25 +2533,26 @@ function date_ical($date, $addminutes = 0) { * Une écriture de date * @return string * La date formatée -**/ + **/ function date_iso($date_heure) { list($annee, $mois, $jour) = recup_date($date_heure); list($heures, $minutes, $secondes) = recup_heure($date_heure); $time = @mktime($heures, $minutes, $secondes, $mois, $jour, $annee); + return gmdate('Y-m-d\TH:i:s\Z', $time); } /** - * Retourne une date formattée au format "RFC 822" + * Retourne une date formattée au format "RFC 822" * * Utilisé pour `<pubdate>` dans certains flux RSS - * + * * @example `[(#DATE|date_822)]` peut donner "Wed, 11 Nov 2015 11:13:45 +0100" - * + * * @filtre * @link http://www.spip.net/4276 * @link http://php.net/manual/fr/class.datetime.php - * + * * @uses recup_date() * @uses recup_heure() * @@ -2349,11 +2560,12 @@ function date_iso($date_heure) { * Une écriture de date * @return string * La date formatée -**/ + **/ function date_822($date_heure) { list($annee, $mois, $jour) = recup_date($date_heure); list($heures, $minutes, $secondes) = recup_heure($date_heure); $time = mktime($heures, $minutes, $secondes, $mois, $jour, $annee); + return date('r', $time); } @@ -2362,16 +2574,19 @@ function date_822($date_heure) { * * @example `date_anneemoisjour('2015-10-11 11:27:03')` retourne `20151011` * @see date_anneemois() - * + * * @param string $d * Une écriture de date commençant par un format `Y-m-d` (comme date ou datetime SQL). * Si vide, utilise la date actuelle. * @return string * Date au format `Ymd` -**/ -function date_anneemoisjour($d) { - if (!$d) $d = date("Y-m-d"); - return substr($d, 0, 4) . substr($d, 5, 2) .substr($d, 8, 2); + **/ +function date_anneemoisjour($d) { + if (!$d) { + $d = date("Y-m-d"); + } + + return substr($d, 0, 4) . substr($d, 5, 2) . substr($d, 8, 2); } /** @@ -2379,16 +2594,19 @@ function date_anneemoisjour($d) { * * @example `date_anneemoisjour('2015-10-11 11:27:03')` retourne `201510` * @see date_anneemoisjour() - * + * * @param string $d * Une écriture de date commençant par un format `Y-m` (comme date ou datetime SQL). * Si vide, utilise la date actuelle. * @return string * Date au format `Ym` -**/ -function date_anneemois($d) { - if (!$d) $d = date("Y-m-d"); - return substr($d, 0, 4) . substr($d, 5, 2); + **/ +function date_anneemois($d) { + if (!$d) { + $d = date("Y-m-d"); + } + + return substr($d, 0, 4) . substr($d, 5, 2); } /** @@ -2396,18 +2614,21 @@ function date_anneemois($d) { * * @example `date_debut_semaine(2015, 11, 11)` retourne `20151109` * @see date_fin_semaine() - * - * @param int $annee + * + * @param int $annee * @param int $mois * @param int $jour * @return string * Date au lundi de la même semaine au format `Ymd` -**/ + **/ function date_debut_semaine($annee, $mois, $jour) { - $w_day = date("w", mktime(0,0,0,$mois, $jour, $annee)); - if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero - $debut = $jour-$w_day+1; - return date("Ymd", mktime(0,0,0,$mois,$debut,$annee)); + $w_day = date("w", mktime(0, 0, 0, $mois, $jour, $annee)); + if ($w_day == 0) { + $w_day = 7; + } // Gaffe: le dimanche est zero + $debut = $jour-$w_day+1; + + return date("Ymd", mktime(0, 0, 0, $mois, $debut, $annee)); } /** @@ -2415,22 +2636,22 @@ function date_debut_semaine($annee, $mois, $jour) { * * @example `date_debut_semaine(2015, 11, 11)` retourne `20151115` * @see date_fin_semaine() - * - * @param int $annee + * + * @param int $annee * @param int $mois * @param int $jour * @return string * Date au dimanche de la même semaine au format `Ymd` -**/ + **/ function date_fin_semaine($annee, $mois, $jour) { - $w_day = date("w", mktime(0,0,0,$mois, $jour, $annee)); - if ($w_day == 0) $w_day = 7; // Gaffe: le dimanche est zero - $debut = $jour-$w_day+1; - return date("Ymd", mktime(0,0,0,$mois,$debut+6,$annee)); -} - - + $w_day = date("w", mktime(0, 0, 0, $mois, $jour, $annee)); + if ($w_day == 0) { + $w_day = 7; + } // Gaffe: le dimanche est zero + $debut = $jour-$w_day+1; + return date("Ymd", mktime(0, 0, 0, $mois, $debut+6, $annee)); +} /** @@ -2447,61 +2668,68 @@ function date_fin_semaine($annee, $mois, $jour) { * * @uses echappe_html() * @uses echappe_retour() - * + * * @param string $texte * @param string $delim * Ce par quoi sont remplacés les sauts * @return string -**/ + **/ function post_autobr($texte, $delim = "\n_ ") { - if (!function_exists('echappe_html')) + if (!function_exists('echappe_html')) { include_spip('inc/texte_mini'); + } $texte = str_replace("\r\n", "\r", $texte); $texte = str_replace("\r", "\n", $texte); - if (preg_match(",\n+$,", $texte, $fin)) + if (preg_match(",\n+$,", $texte, $fin)) { $texte = substr($texte, 0, -strlen($fin = $fin[0])); - else + } else { $fin = ''; + } $texte = echappe_html($texte, '', true); // echapper les modeles - if (strpos($texte,"<")!==false){ + if (strpos($texte, "<") !== false) { include_spip('inc/lien'); - if (defined('_PREG_MODELE')){ - $preg_modeles = "@"._PREG_MODELE."@imsS"; + if (defined('_PREG_MODELE')) { + $preg_modeles = "@" . _PREG_MODELE . "@imsS"; $texte = echappe_html($texte, '', true, $preg_modeles); } } $debut = ''; $suite = $texte; - while ($t = strpos('-'.$suite, "\n", 1)) { + while ($t = strpos('-' . $suite, "\n", 1)) { $debut .= substr($suite, 0, $t-1); $suite = substr($suite, $t); $car = substr($suite, 0, 1); - if (($car<>'-') AND ($car<>'_') AND ($car<>"\n") AND ($car<>"|") AND ($car<>"}") - AND !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S',($suite)) - AND !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut)) { + if (($car <> '-') AND ($car <> '_') AND ($car <> "\n") AND ($car <> "|") AND ($car <> "}") + AND !preg_match(',^\s*(\n|</?(quote|div|dl|dt|dd)|$),S', ($suite)) + AND !preg_match(',</?(quote|div|dl|dt|dd)> *$,iS', $debut) + ) { $debut .= $delim; - } else + } else { $debut .= "\n"; + } if (preg_match(",^\n+,", $suite, $regs)) { - $debut.=$regs[0]; + $debut .= $regs[0]; $suite = substr($suite, strlen($regs[0])); } } - $texte = $debut.$suite; + $texte = $debut . $suite; $texte = echappe_retour($texte); - return $texte.$fin; + + return $texte . $fin; } /** * Expression régulière pour obtenir le contenu des extraits polyglottes `<multi>` - * @var string */ + * + * @var string + */ define('_EXTRAIRE_MULTI', "@<multi>(.*?)</multi>@sS"); @@ -2528,14 +2756,14 @@ define('_EXTRAIRE_MULTI', "@<multi>(.*?)</multi>@sS"); * @uses lang_typo() * @uses code_echappement() * @uses echappe_retour() - * + * * @param string $letexte * @param string $lang * Langue à retrouver (si vide, utilise la langue en cours). * @param array $options Options { - * @type bool $echappe_span + * @type bool $echappe_span * True pour échapper les balises span (false par défaut) - * @type string $lang_defaut + * @type string $lang_defaut * Code de langue : permet de définir la langue utilisée par défaut, * en cas d'absence de traduction dans la langue demandée. * Par défaut la langue du site. @@ -2543,20 +2771,26 @@ define('_EXTRAIRE_MULTI', "@<multi>(.*?)</multi>@sS"); * exacte n'a pas été trouvée. * } * @return string -**/ + **/ function extraire_multi($letexte, $lang = null, $options = array()) { if ($letexte - AND preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER)) { - if (!$lang) $lang = $GLOBALS['spip_lang']; + AND preg_match_all(_EXTRAIRE_MULTI, $letexte, $regs, PREG_SET_ORDER) + ) { + if (!$lang) { + $lang = $GLOBALS['spip_lang']; + } // Compatibilité avec le prototype de fonction précédente qui utilisait un boolean - if (is_bool($options)) + if (is_bool($options)) { $options = array('echappe_span' => $options, 'lang_defaut' => _LANGUE_PAR_DEFAUT); - if (!isset($options['echappe_span'])) + } + if (!isset($options['echappe_span'])) { $options = array_merge($options, array('echappe_span' => false)); - if (!isset($options['lang_defaut'])) + } + if (!isset($options['lang_defaut'])) { $options = array_merge($options, array('lang_defaut' => _LANGUE_PAR_DEFAUT)); + } include_spip('inc/lang'); foreach ($regs as $reg) { @@ -2565,7 +2799,7 @@ function extraire_multi($letexte, $lang = null, $options = array()) { if ($l = approcher_langue($trads, $lang)) { $trad = $trads[$l]; } else { - if ($options['lang_defaut']=='aucune') { + if ($options['lang_defaut'] == 'aucune') { $trad = ''; } else { // langue absente, prendre le fr ou une langue précisée (meme comportement que inc/traduire.php) @@ -2581,14 +2815,16 @@ function extraire_multi($letexte, $lang = null, $options = array()) { // Tester si on echappe en span ou en div // il ne faut pas echapper en div si propre produit un seul paragraphe include_spip('inc/texte'); - $trad_propre = preg_replace(",(^<p[^>]*>|</p>$),Uims","",propre($trad)); - $mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; + $trad_propre = preg_replace(",(^<p[^>]*>|</p>$),Uims", "", propre($trad)); + $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $trad_propre) ? 'div' : 'span'; $trad = code_echappement($trad, 'multi', false, $mode); $trad = str_replace("'", '"', inserer_attribut($trad, 'lang', $l)); - if (lang_dir($l) !== lang_dir($lang)) + if (lang_dir($l) !== lang_dir($lang)) { $trad = str_replace("'", '"', inserer_attribut($trad, 'dir', lang_dir($l))); - if (!$options['echappe_span']) + } + if (!$options['echappe_span']) { $trad = echappe_retour($trad, 'multi'); + } } } $letexte = str_replace($reg[0], $trad, $letexte); @@ -2599,25 +2835,26 @@ function extraire_multi($letexte, $lang = null, $options = array()) { } /** - * Convertit le contenu d'une balise `<multi>` en un tableau + * Convertit le contenu d'une balise `<multi>` en un tableau * * Exemple de blocs. * - `texte par défaut [fr] en français [en] en anglais` * - `[fr] en français [en] en anglais` - * + * * @param string $bloc * Le contenu intérieur d'un bloc multi * @return array [code de langue => texte] * Peut retourner un code de langue vide, lorsqu'un texte par défaut est indiqué. -**/ + **/ function extraire_trads($bloc) { $lang = ''; // ce reg fait planter l'analyse multi s'il y a de l'{italique} dans le champ // while (preg_match("/^(.*?)[{\[]([a-z_]+)[}\]]/siS", $bloc, $regs)) { while (preg_match("/^(.*?)[\[]([a-z_]+)[\]]/siS", $bloc, $regs)) { $texte = trim($regs[1]); - if ($texte OR $lang) + if ($texte OR $lang) { $trads[$lang] = $texte; + } $bloc = substr($bloc, strlen($regs[0])); $lang = $regs[2]; } @@ -2633,8 +2870,8 @@ function extraire_trads($bloc) { * @param string $nom * @return string L'initiale en majuscule */ -function filtre_initiale($nom){ - return spip_substr(trim(strtoupper(extraire_multi($nom))),0,1); +function filtre_initiale($nom) { + return spip_substr(trim(strtoupper(extraire_multi($nom))), 0, 1); } @@ -2643,12 +2880,12 @@ function filtre_initiale($nom){ * * Il est possible de gérer différentes "familles" de données avec * le second paramètre. - * + * * @filtre * @link http://www.spip.net/4320 * @example * ``` - * [(#ID_SECTEUR|unique)] + * [(#ID_SECTEUR|unique)] * [(#ID_SECTEUR|unique{tete})] n'a pas d'incidence sur * [(#ID_SECTEUR|unique{pied})] * [(#ID_SECTEUR|unique{pied,1})] affiche le nombre d'éléments. @@ -2660,7 +2897,7 @@ function filtre_initiale($nom){ * * 1) si la donnée est grosse, mettre son md5 comme clé * 2) purger $mem quand on change de squelette (sinon bug inclusions) - * + * * @param string $donnee * Donnée que l'on souhaite unique * @param string $famille @@ -2675,19 +2912,21 @@ function filtre_initiale($nom){ * - string : Donnée si c'est la première fois qu'elle est vue * - void : si la donnée a déjà été vue * - int : si l'on demande le nombre d'éléments - * - array (interne) : si on dépile + * - array (interne) : si on dépile * - null (interne) : si on empile -**/ + **/ function unique($donnee, $famille = '', $cpt = false) { static $mem = array(); // permettre de vider la pile et de la restaurer // pour le calcul de introduction... - if ($famille=='_spip_raz_'){ + if ($famille == '_spip_raz_') { $tmp = $mem; $mem = array(); + return $tmp; - } elseif ($famille=='_spip_set_'){ + } elseif ($famille == '_spip_set_') { $mem = $donnee; + return; } // eviter une notice @@ -2714,8 +2953,8 @@ function unique($donnee, $famille = '', $cpt = false) { * à chaque incrément du compteur. * * S'il n'y a qu'un seul argument, et que c'est un tableau, - * l'alternance se fait sur les valeurs du tableau. - * + * l'alternance se fait sur les valeurs du tableau. + * * Souvent appliqué à l'intérieur d'une boucle, avec le compteur `#COMPTEUR_BOUCLE` * * @example @@ -2724,12 +2963,12 @@ function unique($donnee, $famille = '', $cpt = false) { * * @filtre * @link http://www.spip.net/4145 - * + * * @param int $i * Le compteur * @return mixed * Une des valeurs en fonction du compteur. -**/ + **/ function alterner($i) { // recuperer les arguments (attention fonctions un peu space) $num = func_num_args(); @@ -2752,7 +2991,7 @@ function alterner($i) { * la regexp est mortelle : cf. `tests/unit/filtres/extraire_attribut.php` * Si on a passé un tableau de balises, renvoyer un tableau de résultats * (dans ce cas l'option `$complet` n'est pas disponible) - * + * * @param string|array $balise * Texte ou liste de textes dont on veut extraire des balises * @param string $attribut @@ -2765,7 +3004,7 @@ function alterner($i) { * - Texte de l'attribut retourné, ou tableau des texte d'attributs * (si 1er argument tableau) * - Tableau complet (si 2e argument) -**/ + **/ function extraire_attribut($balise, $attribut, $complet = false) { if (is_array($balise)) { array_walk($balise, @@ -2773,35 +3012,38 @@ function extraire_attribut($balise, $attribut, $complet = false) { '$a = extraire_attribut($a,$t);' ), $attribut); + return $balise; } if (preg_match( - ',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+' - .$attribut - .'(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS', + ',(^.*?<(?:(?>\s*)(?>[\w:.-]+)(?>(?:=(?:"[^"]*"|\'[^\']*\'|[^\'"]\S*))?))*?)(\s+' + . $attribut + . '(?:=\s*("[^"]*"|\'[^\']*\'|[^\'"]\S*))?)()((?:[\s/][^>]*)?>.*),isS', - $balise, $r)) { + $balise, $r)) { if (isset($r[3][0]) and ($r[3][0] == '"' || $r[3][0] == "'")) { $r[4] = substr($r[3], 1, -1); $r[3] = $r[3][0]; - } elseif ($r[3]!=='') { - $r[4] = $r[3]; + } elseif ($r[3] !== '') { + $r[4] = $r[3]; $r[3] = ''; } else { - $r[4] = trim($r[2]); + $r[4] = trim($r[2]); } $att = $r[4]; - if (strpos($att,"&#")!==false) - $att = str_replace(array("'","'",""","""), array("'","'",'"','"'), $att); + if (strpos($att, "&#") !== false) { + $att = str_replace(array("'", "'", """, """), array("'", "'", '"', '"'), $att); + } $att = filtrer_entites($att); + } else { + $att = null; } - else - $att = NULL; - if ($complet) + if ($complet) { return array($att, $r); - else + } else { return $att; + } } /** @@ -2813,12 +3055,12 @@ function extraire_attribut($balise, $attribut, $complet = false) { * - `[(#FICHIER|image_reduire{40}|inserer_attribut{data-description, #DESCRIPTIF})]` * Laissera les balises HTML de la valeur (ici `#DESCRIPTIF`) si on n'applique pas le * filtre `attribut_html` dessus. - * + * * @filtre * @link http://www.spip.net/4294 * @uses attribut_html() * @uses extraire_attribut() - * + * * @param string $balise * Code html de la balise (ou contenant une balise) * @param string $attribut @@ -2831,53 +3073,56 @@ function extraire_attribut($balise, $attribut, $complet = false) { * True pour vider l'attribut. Une chaîne vide pour `$val` fera pareil. * @return string * Code html modifié -**/ + **/ function inserer_attribut($balise, $attribut, $val, $proteger = true, $vider = false) { // preparer l'attribut // supprimer les etc mais pas les balises html // qui ont un sens dans un attribut value d'un input - if ($proteger) $val = attribut_html($val,false); + if ($proteger) { + $val = attribut_html($val, false); + } // echapper les ' pour eviter tout bug $val = str_replace("'", "'", $val); - if ($vider AND strlen($val)==0) + if ($vider AND strlen($val) == 0) { $insert = ''; - else + } else { $insert = " $attribut='$val'"; + } list($old, $r) = extraire_attribut($balise, $attribut, true); - if ($old !== NULL) { + if ($old !== null) { // Remplacer l'ancien attribut du meme nom - $balise = $r[1].$insert.$r[5]; - } - else { + $balise = $r[1] . $insert . $r[5]; + } else { // preferer une balise " />" (comme <img />) - if (preg_match(',/>,', $balise)) - $balise = preg_replace(",\s?/>,S", $insert." />", $balise, 1); - // sinon une balise <a ...> ... </a> - else - $balise = preg_replace(",\s?>,S", $insert.">", $balise, 1); + if (preg_match(',/>,', $balise)) { + $balise = preg_replace(",\s?/>,S", $insert . " />", $balise, 1); + } // sinon une balise <a ...> ... </a> + else { + $balise = preg_replace(",\s?>,S", $insert . ">", $balise, 1); + } } return $balise; } /** - * Supprime un attribut HTML + * Supprime un attribut HTML * * @example `[(#LOGO_ARTICLE|vider_attribut{class})]` - * + * * @filtre * @link http://www.spip.net/4142 * @uses inserer_attribut() - * @see extraire_attribut() - * + * @see extraire_attribut() + * * @param string $balise Code HTML de l'élément * @param string $attribut Nom de l'attribut à enlever * @return string Code HTML sans l'attribut -**/ -function vider_attribut ($balise, $attribut) { + **/ +function vider_attribut($balise, $attribut) { return inserer_attribut($balise, $attribut, '', false, true); } @@ -2891,6 +3136,7 @@ function vider_attribut ($balise, $attribut) { */ function tester_config($id, $mode = '') { include_spip('action/inscrire_auteur'); + return tester_statut_inscription($mode, $id); } @@ -2900,7 +3146,7 @@ function tester_config($id, $mode = '') { /** * Additionne 2 nombres - * + * * @filtre * @link http://www.spip.net/4307 * @see moins() @@ -2908,18 +3154,18 @@ function tester_config($id, $mode = '') { * ``` * [(#VAL{28}|plus{14})] * ``` - * + * * @param int $a * @param int $b * @return int $a+$b -**/ + **/ function plus($a, $b) { return $a+$b; } /** * Soustrait 2 nombres - * + * * @filtre * @link http://www.spip.net/4302 * @see plus() @@ -2927,18 +3173,18 @@ function plus($a, $b) { * ``` * [(#VAL{28}|moins{14})] * ``` - * + * * @param int $a * @param int $b * @return int $a-$b -**/ + **/ function moins($a, $b) { return $a-$b; } /** * Multiplie 2 nombres - * + * * @filtre * @link http://www.spip.net/4304 * @see div() @@ -2947,11 +3193,11 @@ function moins($a, $b) { * ``` * [(#VAL{28}|mult{14})] * ``` - * + * * @param int $a * @param int $b * @return int $a*$b -**/ + **/ function mult($a, $b) { return $a*$b; } @@ -2967,13 +3213,13 @@ function mult($a, $b) { * ``` * [(#VAL{28}|div{14})] * ``` - * + * * @param int $a * @param int $b * @return int $a/$b (ou 0 si $b est nul) -**/ + **/ function div($a, $b) { - return $b?$a/$b:0; + return $b ? $a/$b : 0; } /** @@ -2987,14 +3233,14 @@ function div($a, $b) { * ``` * [(#VAL{28}|modulo{14})] * ``` - * + * * @param int $nb * @param int $mod * @param int $add * @return int ($nb % $mod) + $add -**/ + **/ function modulo($nb, $mod, $add = 0) { - return ($mod?$nb%$mod:0)+$add; + return ($mod ? $nb%$mod : 0)+$add; } @@ -3007,22 +3253,25 @@ function modulo($nb, $mod, $add = 0) { * @return bool * - false si pas conforme, * - true sinon -**/ + **/ function nom_acceptable($nom) { if (!is_string($nom)) { return false; } - if (!defined('_TAGS_NOM_AUTEUR')) define('_TAGS_NOM_AUTEUR',''); + if (!defined('_TAGS_NOM_AUTEUR')) { + define('_TAGS_NOM_AUTEUR', ''); + } $tags_acceptes = array_unique(explode(',', 'multi,' . _TAGS_NOM_AUTEUR)); - foreach($tags_acceptes as $tag) { + foreach ($tags_acceptes as $tag) { if (strlen($tag)) { - $remp1[] = '<'.trim($tag).'>'; - $remp1[] = '</'.trim($tag).'>'; - $remp2[] = '\x60'.trim($tag).'\x61'; - $remp2[] = '\x60/'.trim($tag).'\x61'; + $remp1[] = '<' . trim($tag) . '>'; + $remp1[] = '</' . trim($tag) . '>'; + $remp2[] = '\x60' . trim($tag) . '\x61'; + $remp2[] = '\x60/' . trim($tag) . '\x61'; } - } + } $v_nom = str_replace($remp2, $remp1, supprimer_tags(str_replace($remp1, $remp2, $nom))); + return str_replace('<', '<', $v_nom) == $nom; } @@ -3035,15 +3284,17 @@ function nom_acceptable($nom) { * @return bool|string * - false si pas conforme, * - la normalisation de la dernière adresse donnée sinon -**/ + **/ function email_valide($adresses) { // eviter d'injecter n'importe quoi dans preg_match - if (!is_string($adresses)) + if (!is_string($adresses)) { return false; + } // Si c'est un spammeur autant arreter tout de suite if (preg_match(",[\n\r].*(MIME|multipart|Content-),i", $adresses)) { spip_log("Tentative d'injection de mail : $adresses"); + return false; } @@ -3052,9 +3303,11 @@ function email_valide($adresses) { // "Marie Toto <Marie@toto.com>" $adresse = trim(preg_replace(",^[^<>\"]*<([^<>\"]+)>$,i", "\\1", $v)); // RFC 822 - if (!preg_match('#^[^()<>@,;:\\"/[:space:]]+(@([-_0-9a-z]+\.)*[-_0-9a-z]+)$#i', $adresse)) + if (!preg_match('#^[^()<>@,;:\\"/[:space:]]+(@([-_0-9a-z]+\.)*[-_0-9a-z]+)$#i', $adresse)) { return false; + } } + return $adresse; } @@ -3064,22 +3317,24 @@ function email_valide($adresses) { * * @filtre * @link http://www.spip.net/4134 - * + * * @param string $tags Texte * @return string Texte -**/ + **/ function afficher_enclosures($tags) { $s = array(); foreach (extraire_balises($tags, 'a') as $tag) { if (extraire_attribut($tag, 'rel') == 'enclosure' - AND $t = extraire_attribut($tag, 'href')) { - $s[] = preg_replace(',>[^<]+</a>,S', + AND $t = extraire_attribut($tag, 'href') + ) { + $s[] = preg_replace(',>[^<]+</a>,S', '>' - .http_img_pack('attachment-16.png', $t, - 'title="'.attribut_html($t).'"') - .'</a>', $tag); + . http_img_pack('attachment-16.png', $t, + 'title="' . attribut_html($t) . '"') + . '</a>', $tag); } } + return join(' ', $s); } @@ -3089,18 +3344,20 @@ function afficher_enclosures($tags) { * * @filtre * @link http://www.spip.net/4187 - * + * * @param string $tags Texte * @param string $rels Attribut `rel` à capturer (ou plusieurs séparés par des virgules) * @return string Liens trouvés -**/ + **/ function afficher_tags($tags, $rels = 'tag, directory') { $s = array(); foreach (extraire_balises($tags, 'a') as $tag) { $rel = extraire_attribut($tag, 'rel'); - if (strstr(",$rels,", ",$rel,")) + if (strstr(",$rels,", ",$rel,")) { $s[] = $tag; + } } + return join(', ', $s); } @@ -3113,29 +3370,31 @@ function afficher_tags($tags, $rels = 'tag, directory') { * au format microformat `<a rel="enclosure" href="fichier" ...>fichier</a>`. * * Peut recevoir un `<link` ou un `<media:content` parfois. - * + * * Attention : `length="zz"` devient `title="zz"`, pour rester conforme. - * + * * @filtre * @see microformat2enclosure() Pour l'inverse - * + * * @param string $e Tag RSS `<enclosure>` * @return string Tag HTML `<a>` avec microformat. -**/ + **/ function enclosure2microformat($e) { - if (!$url = filtrer_entites(extraire_attribut($e, 'url'))) + if (!$url = filtrer_entites(extraire_attribut($e, 'url'))) { $url = filtrer_entites(extraire_attribut($e, 'href')); + } $type = extraire_attribut($e, 'type'); if (!$length = extraire_attribut($e, 'length')) { # <media:content : longeur dans fileSize. On tente. $length = extraire_attribut($e, 'fileSize'); } $fichier = basename($url); + return '<a rel="enclosure"' - . ($url? ' href="'.spip_htmlspecialchars($url).'"' : '') - . ($type? ' type="'.spip_htmlspecialchars($type).'"' : '') - . ($length? ' title="'.spip_htmlspecialchars($length).'"' : '') - . '>'.$fichier.'</a>'; + . ($url ? ' href="' . spip_htmlspecialchars($url) . '"' : '') + . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') + . ($length ? ' title="' . spip_htmlspecialchars($length) . '"' : '') + . '>' . $fichier . '</a>'; } /** @@ -3145,28 +3404,31 @@ function enclosure2microformat($e) { * Passe un texte ayant des liens avec microformat * `<a rel="enclosure" href="fichier" ...>fichier</a>` * au format RSS `<enclosure url="fichier" ... />`. - * + * * @filtre * @see enclosure2microformat() Pour l'inverse - * + * * @param string $tags Texte HTML ayant des tag `<a>` avec microformat * @return string Tags RSS `<enclosure>`. -**/ + **/ function microformat2enclosure($tags) { $enclosures = array(); - foreach (extraire_balises($tags, 'a') as $e) - if (extraire_attribut($e, 'rel') == 'enclosure') { - $url = filtrer_entites(extraire_attribut($e, 'href')); - $type = extraire_attribut($e, 'type'); - if (!$length = intval(extraire_attribut($e, 'title'))) - $length = intval(extraire_attribut($e, 'length')); # vieux data - $fichier = basename($url); - $enclosures[] = '<enclosure' - . ($url? ' url="'.spip_htmlspecialchars($url).'"' : '') - . ($type? ' type="'.spip_htmlspecialchars($type).'"' : '') - . ($length? ' length="'.$length.'"' : '') - . ' />'; + foreach (extraire_balises($tags, 'a') as $e) { + if (extraire_attribut($e, 'rel') == 'enclosure') { + $url = filtrer_entites(extraire_attribut($e, 'href')); + $type = extraire_attribut($e, 'type'); + if (!$length = intval(extraire_attribut($e, 'title'))) { + $length = intval(extraire_attribut($e, 'length')); + } # vieux data + $fichier = basename($url); + $enclosures[] = '<enclosure' + . ($url ? ' url="' . spip_htmlspecialchars($url) . '"' : '') + . ($type ? ' type="' . spip_htmlspecialchars($type) . '"' : '') + . ($length ? ' length="' . $length . '"' : '') + . ' />'; + } } + return join("\n", $enclosures); } @@ -3178,19 +3440,20 @@ function microformat2enclosure($tags) { * en balise `<dc:subject></dc:subject>` pour les flux RSS au format Atom. * * @filtre - * - * @param string $tags Texte + * + * @param string $tags Texte * @return string Tags RSS Atom `<dc:subject>`. -**/ + **/ function tags2dcsubject($tags) { $subjects = ''; foreach (extraire_balises($tags, 'a') as $e) { if (extraire_attribut($e, rel) == 'tag') { $subjects .= '<dc:subject>' . texte_backend(textebrut($e)) - . '</dc:subject>'."\n"; + . '</dc:subject>' . "\n"; } } + return $subjects; } @@ -3200,7 +3463,7 @@ function tags2dcsubject($tags) { * Retourne le contenu d'une balise jusqu'à la première fermeture rencontrée * du même type. * Si on a passe un tableau de textes, retourne un tableau de resultats. - * + * * @example `[(#DESCRIPTIF|extraire_balise{img})]` * * @filtre @@ -3210,7 +3473,7 @@ function tags2dcsubject($tags) { * Attention : les résultats peuvent être incohérents sur des balises imbricables, * tel que demander à extraire `div` dans le texte `<div> un <div> mot </div> absent </div>`, * ce qui retournerait `<div> un <div> mot </div>` donc. - * + * * @param string|array $texte * Texte(s) dont on souhaite extraire une balise html * @param string $tag @@ -3218,7 +3481,7 @@ function tags2dcsubject($tags) { * @return void|string|array * - Code html de la balise, sinon rien * - Tableau de résultats, si tableau en entrée. -**/ + **/ function extraire_balise($texte, $tag = 'a') { if (is_array($texte)) { array_walk( @@ -3226,13 +3489,13 @@ function extraire_balise($texte, $tag = 'a') { create_function('&$a,$key,$t', '$a = extraire_balise($a,$t);'), $tag ); + return $texte; } if (preg_match( ",<$tag\b[^>]*(/>|>.*</$tag\b[^>]*>|>),UimsS", - $texte, $regs)) - { + $texte, $regs)) { return $regs[0]; } } @@ -3243,7 +3506,7 @@ function extraire_balise($texte, $tag = 'a') { * Retourne dans un tableau le contenu de chaque balise jusqu'à la première * fermeture rencontrée du même type. * Si on a passe un tableau de textes, retourne un tableau de resultats. - * + * * @example `[(#TEXTE|extraire_balises{img}|implode{" - "})]` * * @filtre @@ -3252,7 +3515,7 @@ function extraire_balise($texte, $tag = 'a') { * @note * Attention : les résultats peuvent être incohérents sur des balises imbricables, * tel que demander à extraire `div` dans un texte. - * + * * @param string|array $texte * Texte(s) dont on souhaite extraire une balise html * @param string $tag @@ -3260,7 +3523,7 @@ function extraire_balise($texte, $tag = 'a') { * @return array * - Liste des codes html des occurrences de la balise, sinon tableau vide * - Tableau de résultats, si tableau en entrée. -**/ + **/ function extraire_balises($texte, $tag = 'a') { if (is_array($texte)) { array_walk( @@ -3268,13 +3531,13 @@ function extraire_balises($texte, $tag = 'a') { create_function('&$a,$key,$t', '$a = extraire_balises($a,$t);'), $tag ); + return $texte; } if (preg_match_all( ",<${tag}\b[^>]*(/>|>.*</${tag}\b[^>]*>|>),UimsS", - $texte, $regs, PREG_PATTERN_ORDER)) - { + $texte, $regs, PREG_PATTERN_ORDER)) { return $regs[0]; } else { return array(); @@ -3282,7 +3545,7 @@ function extraire_balises($texte, $tag = 'a') { } /** - * Indique si le premier argument est contenu dans le second + * Indique si le premier argument est contenu dans le second * * Cette fonction est proche de `in_array()` en PHP avec comme principale * différence qu'elle ne crée pas d'erreur si le second argument n'est pas @@ -3305,9 +3568,12 @@ function extraire_balises($texte, $tag = 'a') { * - ' ' si la valeur cherchée est dans le tableau * - '' si la valeur n'est pas dans le tableau * - `$def` si on n'a pas transmis de tableau -**/ + **/ function in_any($val, $vals, $def = '') { - if (!is_array($vals) AND $v=unserialize($vals)) $vals = $v; + if (!is_array($vals) AND $v = unserialize($vals)) { + $vals = $v; + } + return (!is_array($vals) ? $def : (in_array($val, $vals) ? ' ' : '')); } @@ -3316,22 +3582,24 @@ function in_any($val, $vals, $def = '') { * Retourne le résultat d'une expression mathématique simple * * N'accepte que les *, + et - (à ameliorer si on l'utilise vraiment). - * + * * @filtre * @example * ``` * valeur_numerique("3*2") retourne 6 * ``` - * + * * @param string $expr * Expression mathématique `nombre operateur nombre` comme `3*2` * @return int * Résultat du calcul -**/ + **/ function valeur_numerique($expr) { $a = 0; - if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) + if (preg_match(',^[0-9]+(\s*[+*-]\s*[0-9]+)*$,S', trim($expr))) { eval("\$a = $expr;"); + } + return intval($a); } @@ -3343,16 +3611,15 @@ function valeur_numerique($expr) { * ``` * [(#VAL{6}|regledetrois{4,3})] retourne 8 * ``` - * + * * @param int $a * @param int $b * @param int $c * @return int * Retourne `$a*$b/$c` -**/ -function regledetrois($a, $b, $c) -{ - return round($a*$b/$c); + **/ +function regledetrois($a, $b, $c) { + return round($a*$b/$c); } @@ -3361,7 +3628,7 @@ function regledetrois($a, $b, $c) * * Fournit la suite de Input-Hidden correspondant aux paramètres de * l'URL donnée en argument, compatible avec les types_urls - * + * * @filtre * @link http://www.spip.net/4286 * @see balise_ACTION_FORMULAIRE() @@ -3373,25 +3640,28 @@ function regledetrois($a, $b, $c) * * @param string $action URL * @return string Suite de champs input hidden -**/ + **/ function form_hidden($action) { $contexte = array(); include_spip('inc/urls'); if ($p = urls_decoder_url($action, '') - AND reset($p)) { + AND reset($p) + ) { $fond = array_shift($p); - if ($fond!='404'){ + if ($fond != '404') { $contexte = array_shift($p); $contexte['page'] = $fond; - $action = preg_replace('/([?]'.preg_quote($fond).'[^&=]*[0-9]+)(&|$)/', '?&', $action); + $action = preg_replace('/([?]' . preg_quote($fond) . '[^&=]*[0-9]+)(&|$)/', '?&', $action); } } // defaire ce qu'a injecte urls_decoder_url : a revoir en modifiant la signature de urls_decoder_url - if (defined('_DEFINIR_CONTEXTE_TYPE') AND _DEFINIR_CONTEXTE_TYPE) + if (defined('_DEFINIR_CONTEXTE_TYPE') AND _DEFINIR_CONTEXTE_TYPE) { unset($contexte['type']); - if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') AND _DEFINIR_CONTEXTE_TYPE_PAGE) + } + if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') AND _DEFINIR_CONTEXTE_TYPE_PAGE) { unset($contexte['type-page']); + } // on va remplir un tableau de valeurs en prenant bien soin de ne pas // ecraser les elements de la forme mots[]=1&mots[]=2 @@ -3399,47 +3669,55 @@ function form_hidden($action) { // d'abord avec celles de l'url if (false !== ($p = strpos($action, '?'))) { - foreach(preg_split('/&(amp;)?/S',substr($action,$p+1)) as $c){ + foreach (preg_split('/&(amp;)?/S', substr($action, $p+1)) as $c) { $c = explode('=', $c, 2); $var = array_shift($c); $val = array_shift($c); if ($var) { - $val = rawurldecode($val); - $var = rawurldecode($var); // decoder les [] eventuels - if (preg_match(',\[\]$,S', $var)) + $val = rawurldecode($val); + $var = rawurldecode($var); // decoder les [] eventuels + if (preg_match(',\[\]$,S', $var)) { $values[] = array($var, $val); - else if (!isset($values[$var])) - $values[$var] = array($var, $val); + } else { + if (!isset($values[$var])) { + $values[$var] = array($var, $val); + } + } } } } // ensuite avec celles du contexte, sans doublonner ! - foreach($contexte as $var=>$val) - if (preg_match(',\[\]$,S', $var)) + foreach ($contexte as $var => $val) { + if (preg_match(',\[\]$,S', $var)) { $values[] = array($var, $val); - else if (!isset($values[$var])) - $values[$var] = array($var, $val); + } else { + if (!isset($values[$var])) { + $values[$var] = array($var, $val); + } + } + } // puis on rassemble le tout $hidden = array(); - foreach($values as $value) { - list($var,$val) = $value; + foreach ($values as $value) { + list($var, $val) = $value; $hidden[] = '<input name="' . entites_html($var) - .'"' + . '"' . (is_null($val) ? '' - : ' value="'.entites_html($val).'"' - ) - . ' type="hidden"'."\n/>"; + : ' value="' . entites_html($val) . '"' + ) + . ' type="hidden"' . "\n/>"; } + return join("", $hidden); } /** * Calcule les bornes d'une pagination - * + * * @filtre * * @param int $courante @@ -3450,14 +3728,16 @@ function form_hidden($action) { * Nombre d'éléments par page * @return int[] * Liste (première page, dernière page). -**/ + **/ function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) { - if($max<=0 OR $max>=$nombre) + if ($max <= 0 OR $max >= $nombre) { return array(1, $nombre); + } $premiere = max(1, $courante-floor(($max-1)/2)); $derniere = min($nombre, $premiere+$max-2); $premiere = $derniere == $nombre ? $derniere-$max+1 : $premiere; + return array($premiere, $derniere); } @@ -3468,17 +3748,17 @@ function filtre_bornes_pagination_dist($courante, $nombre, $max = 10) { * Plus précisément déplace le pointeur du tableau sur la première valeur et la retourne. * * @example `[(#LISTE{un,deux,trois}|reset)]` retourne 'un' - * + * * @filtre * @link http://php.net/manual/fr/function.reset.php * @see filtre_end() - * + * * @param array $array * @return mixed|null|false * - null si $array n'est pas un tableau, * - false si le tableau est vide * - la première valeur du tableau sinon. -**/ + **/ function filtre_reset($array) { return !is_array($array) ? null : reset($array); } @@ -3489,17 +3769,17 @@ function filtre_reset($array) { * Plus précisément déplace le pointeur du tableau sur la dernière valeur et la retourne. * * @example `[(#LISTE{un,deux,trois}|end)]` retourne 'trois' - * + * * @filtre * @link http://php.net/manual/fr/function.end.php * @see filtre_reset() - * + * * @param array $array * @return mixed|null|false * - null si $array n'est pas un tableau, * - false si le tableau est vide * - la dernière valeur du tableau sinon. -**/ + **/ function filtre_end($array) { return !is_array($array) ? null : end($array); } @@ -3508,22 +3788,23 @@ function filtre_end($array) { * Empile une valeur à la fin d'un tableau * * @example `[(#LISTE{un,deux,trois}|push{quatre}|print)]` - * + * * @filtre * @link http://www.spip.net/4571 * @link http://php.net/manual/fr/function.array-push.php - * + * * @param array $array - * @param mixed $val + * @param mixed $val * @return array|string * - '' si $array n'est pas un tableau ou si echec. * - le tableau complété de la valeur sinon. - * -**/ + * + **/ function filtre_push($array, $val) { if (!is_array($array) OR !array_push($array, $val)) { return ''; } + return $array; } @@ -3531,17 +3812,17 @@ function filtre_push($array, $val) { * Indique si une valeur est contenue dans un tableau * * @example `[(#LISTE{un,deux,trois}|find{quatre}|oui) ... ]` - * + * * @filtre * @link http://www.spip.net/4575 * @see in_any() Assez proche, avec les paramètres tableau et valeur inversés. - * + * * @param array $array - * @param mixed $val + * @param mixed $val * @return bool * - `false` si `$array` n'est pas un tableau * - `true` si la valeur existe dans le tableau, `false` sinon. -**/ + **/ function filtre_find($array, $val) { return (is_array($array) AND in_array($val, $array)); } @@ -3553,10 +3834,10 @@ function filtre_find($array, $val) { * Le filtre cherche le modèle `pagination.html` par défaut, mais peut * chercher un modèle de pagination particulier avec l'argument `$modele`. * S'il `$modele='prive'`, le filtre cherchera le modèle `pagination_prive.html`. - * + * * @filtre * @see balise_PAGINATION_dist() - * + * * @param int $total * Nombre total d'éléments * @param string $nom @@ -3576,24 +3857,38 @@ function filtre_find($array, $val) { * Environnement à transmettre au modèle * @return string * Code HTML de la pagination -**/ -function filtre_pagination_dist($total, $nom, $position, $pas, $liste = true, $modele = '', $connect = '', $env = array()) { + **/ +function filtre_pagination_dist( + $total, + $nom, + $position, + $pas, + $liste = true, + $modele = '', + $connect = '', + $env = array() +) { static $ancres = array(); - if ($pas<1) return ''; - $ancre = 'pagination'.$nom; // #pagination_articles - $debut = 'debut'.$nom; // 'debut_articles' + if ($pas < 1) { + return ''; + } + $ancre = 'pagination' . $nom; // #pagination_articles + $debut = 'debut' . $nom; // 'debut_articles' // n'afficher l'ancre qu'une fois - if (!isset($ancres[$ancre])) - $bloc_ancre = $ancres[$ancre] = "<a name='".$ancre."' id='".$ancre."'></a>"; - else $bloc_ancre = ''; + if (!isset($ancres[$ancre])) { + $bloc_ancre = $ancres[$ancre] = "<a name='" . $ancre . "' id='" . $ancre . "'></a>"; + } else { + $bloc_ancre = ''; + } // liste = false : on ne veut que l'ancre - if (!$liste) + if (!$liste) { return $ancres[$ancre]; + } $pagination = array( 'debut' => $debut, - 'url' => parametre_url(self(),'fragment',''), // nettoyer l'id ahah eventuel + 'url' => parametre_url(self(), 'fragment', ''), // nettoyer l'id ahah eventuel 'total' => $total, 'position' => intval($position), 'pas' => $pas, @@ -3602,16 +3897,20 @@ function filtre_pagination_dist($total, $nom, $position, $pas, $liste = true, $m 'ancre' => $ancre, 'bloc_ancre' => $bloc_ancre ); - if (is_array($env)) - $pagination = array_merge($env,$pagination); + if (is_array($env)) { + $pagination = array_merge($env, $pagination); + } // Pas de pagination - if ($pagination['nombre_pages']<=1) + if ($pagination['nombre_pages'] <= 1) { return ''; + } - if ($modele) $modele = '_'.$modele; + if ($modele) { + $modele = '_' . $modele; + } - return recuperer_fond("modeles/pagination$modele", $pagination, array('trim'=>true), $connect); + return recuperer_fond("modeles/pagination$modele", $pagination, array('trim' => true), $connect); } @@ -3619,21 +3918,21 @@ function filtre_pagination_dist($total, $nom, $position, $pas, $liste = true, $m * Passer les url relatives à la css d'origine en url absolues * * @uses suivre_lien() - * + * * @param string $contenu * Contenu du fichier CSS * @param string $source * Chemin du fichier CSS * @return string * Contenu avec urls en absolus -**/ + **/ function urls_absolues_css($contenu, $source) { - $path = suivre_lien(url_absolue($source),'./'); + $path = suivre_lien(url_absolue($source), './'); return preg_replace_callback( ",url\s*\(\s*['\"]?([^'\"/#\s][^:]*)['\"]?\s*\),Uims", create_function('$x', - 'return "url(\"".suivre_lien("'.$path.'",$x[1])."\")";' + 'return "url(\"".suivre_lien("' . $path . '",$x[1])."\")";' ), $contenu); } @@ -3658,101 +3957,115 @@ function urls_absolues_css($contenu, $source) { * @param string $voulue * Permet de forcer le sens voulu (en indiquant `ltr`, `rtl` ou un * code de langue). En absence, prend le sens de la langue en cours. - * + * * @return string * Chemin du fichier CSS inversé -**/ -function direction_css ($css, $voulue = '') { - if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) return $css; + **/ +function direction_css($css, $voulue = '') { + if (!preg_match(',(_rtl)?\.css$,i', $css, $r)) { + return $css; + } // si on a precise le sens voulu en argument, le prendre en compte if ($voulue = strtolower($voulue)) { - if ($voulue != 'rtl' AND $voulue != 'ltr') + if ($voulue != 'rtl' AND $voulue != 'ltr') { $voulue = lang_dir($voulue); + } + } else { + $voulue = lang_dir(); } - else - $voulue = lang_dir(); $r = count($r) > 1; $right = $r ? 'left' : 'right'; // 'right' de la css lue en entree $dir = $r ? 'rtl' : 'ltr'; $ndir = $r ? 'ltr' : 'rtl'; - if ($voulue == $dir) + if ($voulue == $dir) { return $css; + } if ( // url absolue - preg_match(",^http:,i",$css) + preg_match(",^http:,i", $css) // ou qui contient un ? - OR (($p=strpos($css,'?'))!==FALSE)) { + OR (($p = strpos($css, '?')) !== false) + ) { $distant = true; $cssf = parse_url($css); - $cssf = $cssf['path'].($cssf['query']?"?".$cssf['query']:""); + $cssf = $cssf['path'] . ($cssf['query'] ? "?" . $cssf['query'] : ""); $cssf = preg_replace(',[?:&=],', "_", $cssf); - } - else { + } else { $distant = false; $cssf = $css; // 1. regarder d'abord si un fichier avec la bonne direction n'est pas aussi //propose (rien a faire dans ce cas) - $f = preg_replace(',(_rtl)?\.css$,i', '_'.$ndir.'.css', $css); - if (@file_exists($f)) + $f = preg_replace(',(_rtl)?\.css$,i', '_' . $ndir . '.css', $css); + if (@file_exists($f)) { return $f; + } } // 2. - $dir_var = sous_repertoire (_DIR_VAR, 'cache-css'); + $dir_var = sous_repertoire(_DIR_VAR, 'cache-css'); $f = $dir_var . preg_replace(',.*/(.*?)(_rtl)?\.css,', '\1', $cssf) - . '.' . substr(md5($cssf), 0,4) . '_' . $ndir . '.css'; + . '.' . substr(md5($cssf), 0, 4) . '_' . $ndir . '.css'; // la css peut etre distante (url absolue !) - if ($distant){ + if ($distant) { include_spip('inc/distant'); $contenu = recuperer_page($css); - if (!$contenu) return $css; - } - else { + if (!$contenu) { + return $css; + } + } else { if ((@filemtime($f) > @filemtime($css)) - AND (_VAR_MODE != 'recalcul')) + AND (_VAR_MODE != 'recalcul') + ) { return $f; - if (!lire_fichier($css, $contenu)) + } + if (!lire_fichier($css, $contenu)) { return $css; + } } $contenu = str_replace( array('right', 'left', '@@@@L E F T@@@@'), array('@@@@L E F T@@@@', 'right', 'left'), $contenu); - + // reperer les @import auxquels il faut propager le direction_css - preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims",$contenu,$regs); - $src = array();$src_direction_css = array();$src_faux_abs=array(); + preg_match_all(",\@import\s*url\s*\(\s*['\"]?([^'\"/][^:]*)['\"]?\s*\),Uims", $contenu, $regs); + $src = array(); + $src_direction_css = array(); + $src_faux_abs = array(); $d = dirname($css); - foreach($regs[1] as $k=>$import_css){ - $css_direction = direction_css("$d/$import_css",$voulue); + foreach ($regs[1] as $k => $import_css) { + $css_direction = direction_css("$d/$import_css", $voulue); // si la css_direction est dans le meme path que la css d'origine, on tronque le path, elle sera passee en absolue - if (substr($css_direction,0,strlen($d)+1)=="$d/") $css_direction = substr($css_direction,strlen($d)+1); - // si la css_direction commence par $dir_var on la fait passer pour une absolue - elseif (substr($css_direction,0,strlen($dir_var))==$dir_var) { - $css_direction = substr($css_direction,strlen($dir_var)); - $src_faux_abs["/@@@@@@/".$css_direction] = $css_direction; - $css_direction = "/@@@@@@/".$css_direction; + if (substr($css_direction, 0, strlen($d)+1) == "$d/") { + $css_direction = substr($css_direction, strlen($d)+1); + } // si la css_direction commence par $dir_var on la fait passer pour une absolue + elseif (substr($css_direction, 0, strlen($dir_var)) == $dir_var) { + $css_direction = substr($css_direction, strlen($dir_var)); + $src_faux_abs["/@@@@@@/" . $css_direction] = $css_direction; + $css_direction = "/@@@@@@/" . $css_direction; } $src[] = $regs[0][$k]; - $src_direction_css[] = str_replace($import_css,$css_direction,$regs[0][$k]); + $src_direction_css[] = str_replace($import_css, $css_direction, $regs[0][$k]); } - $contenu = str_replace($src,$src_direction_css,$contenu); + $contenu = str_replace($src, $src_direction_css, $contenu); $contenu = urls_absolues_css($contenu, $css); // virer les fausses url absolues que l'on a mis dans les import - if (count($src_faux_abs)) - $contenu = str_replace(array_keys($src_faux_abs),$src_faux_abs,$contenu); + if (count($src_faux_abs)) { + $contenu = str_replace(array_keys($src_faux_abs), $src_faux_abs, $contenu); + } - if (!ecrire_fichier($f, $contenu)) + if (!ecrire_fichier($f, $contenu)) { return $css; + } return $f; } @@ -3769,13 +4082,13 @@ function direction_css ($css, $voulue = '') { * * @uses recuperer_page() si l'URL source n'est pas sur le même site * @uses urls_absolues_css() - * + * * @param string $css * Chemin ou URL du fichier CSS source * @return string * - Chemin du fichier CSS transformé (si source lisible et mise en cache réussie) * - Chemin ou URL du fichier CSS source sinon. -**/ + **/ function url_absolue_css($css) { if (!preg_match(',\.css$,i', $css, $r)) { return $css; @@ -3783,25 +4096,25 @@ function url_absolue_css($css) { $url_absolue_css = url_absolue($css); - $f = basename($css,'.css'); - $f = sous_repertoire (_DIR_VAR, 'cache-css') - . preg_replace(",(.*?)(_rtl|_ltr)?$,","\\1-urlabs-" . substr(md5("$css-urlabs"), 0,4) . "\\2",$f) + $f = basename($css, '.css'); + $f = sous_repertoire(_DIR_VAR, 'cache-css') + . preg_replace(",(.*?)(_rtl|_ltr)?$,", "\\1-urlabs-" . substr(md5("$css-urlabs"), 0, 4) . "\\2", $f) . '.css'; if ((@filemtime($f) > @filemtime($css)) AND (_VAR_MODE != 'recalcul')) { return $f; } - if ($url_absolue_css==$css){ - if (strncmp($GLOBALS['meta']['adresse_site'],$css,$l=strlen($GLOBALS['meta']['adresse_site']))!=0 - OR !lire_fichier(_DIR_RACINE . substr($css,$l), $contenu)){ - include_spip('inc/distant'); - if (!$contenu = recuperer_page($css)) { - return $css; - } + if ($url_absolue_css == $css) { + if (strncmp($GLOBALS['meta']['adresse_site'], $css, $l = strlen($GLOBALS['meta']['adresse_site'])) != 0 + OR !lire_fichier(_DIR_RACINE . substr($css, $l), $contenu) + ) { + include_spip('inc/distant'); + if (!$contenu = recuperer_page($css)) { + return $css; + } } - } - elseif (!lire_fichier($css, $contenu)) { + } elseif (!lire_fichier($css, $contenu)) { return $css; } @@ -3817,7 +4130,6 @@ function url_absolue_css($css) { } - /** * Récupère la valeur d'une clé donnée * dans un tableau (ou un objet). @@ -3828,7 +4140,7 @@ function url_absolue_css($css) { * ``` * [(#VALEUR|table_valeur{cle/sous/element})] * ``` - * + * * @param mixed $table * Tableau ou objet PHP * (ou chaîne serialisée de tableau, ce qui permet d'enchaîner le filtre) @@ -3841,37 +4153,39 @@ function url_absolue_css($css) { * Valeur par defaut retournée si la clé demandée n'existe pas * @return mixed * Valeur trouvée ou valeur par défaut. -**/ + **/ function table_valeur($table, $cle, $defaut = '') { foreach (explode('/', $cle) as $k) { $table = is_string($table) ? @unserialize($table) : $table; if (is_object($table)) { - $table = (($k !== "") and isset($table->$k)) ? $table->$k : $defaut; + $table = (($k !== "") and isset($table->$k)) ? $table->$k : $defaut; } elseif (is_array($table)) { $table = isset($table[$k]) ? $table[$k] : $defaut; } else { $table = $defaut; } } + return $table; } /** * Retrouve un motif dans un texte à partir d'une expression régulière * - * S'appuie sur la fonction `preg_match()` en PHP + * S'appuie sur la fonction `preg_match()` en PHP + * * @example * - `[(#TITRE|match{toto})]` * - `[(#TEXTE|match{^ceci$,Uims})]` * - `[(#TEXTE|match{truc(...)$, UimsS, 1})]` Capture de la parenthèse indiquée * - `[(#TEXTE|match{truc(...)$, 1})]` Équivalent, sans indiquer les modificateurs - * + * * @filtre * @link http://www.spip.net/4299 * @link http://php.net/manual/fr/function.preg-match.php Pour des infos sur `preg_match()` - * + * * @param string $texte * Texte dans lequel chercher * @param string|int $expression @@ -3885,21 +4199,23 @@ function table_valeur($table, $cle, $defaut = '') { * - false : l'expression n'a pas été trouvée * - true : expression trouvée, mais pas la parenthèse capturante * - string : expression trouvée. -**/ + **/ function match($texte, $expression, $modif = "UimsS", $capte = 0) { - if (intval($modif) AND $capte==0){ + if (intval($modif) AND $capte == 0) { $capte = $modif; $modif = "UimsS"; } - $expression=str_replace("\/","/",$expression); - $expression=str_replace("/","\/",$expression); + $expression = str_replace("\/", "/", $expression); + $expression = str_replace("/", "\/", $expression); - if (preg_match('/' . $expression . '/' . $modif,$texte, $r)) { - if (isset($r[$capte])) + if (preg_match('/' . $expression . '/' . $modif, $texte, $r)) { + if (isset($r[$capte])) { return $r[$capte]; - else + } else { return true; + } } + return false; } @@ -3914,7 +4230,7 @@ function match($texte, $expression, $modif = "UimsS", $capte = 0) { * ``` * [(#TEXTE|replace{^ceci$,cela,UimsS})] * ``` - * + * * @param string $texte * Texte * @param string $expression @@ -3924,11 +4240,12 @@ function match($texte, $expression, $modif = "UimsS", $capte = 0) { * @param string $modif * Modificateurs pour l'expression régulière. * @return string - * Texte -**/ + * Texte + **/ function replace($texte, $expression, $replace = '', $modif = "UimsS") { - $expression=str_replace("\/","/", $expression); - $expression=str_replace("/","\/",$expression); + $expression = str_replace("\/", "/", $expression); + $expression = str_replace("/", "\/", $expression); + return preg_replace('/' . $expression . '/' . $modif, $replace, $texte); } @@ -3937,23 +4254,24 @@ function replace($texte, $expression, $replace = '', $modif = "UimsS") { * Cherche les documents numerotés dans un texte traite par `propre()` * * Affecte la liste des doublons['documents'] - * + * * @param array $doublons * Liste des doublons * @param string $letexte * Le texte * @return string * Le texte -**/ + **/ function traiter_doublons_documents(&$doublons, $letexte) { // Verifier dans le texte & les notes (pas beau, helas) - $t = $letexte.$GLOBALS['les_notes']; + $t = $letexte . $GLOBALS['les_notes']; if (strstr($t, 'spip_document_') // evite le preg_match_all si inutile - AND preg_match_all( - ',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS', - $t, $matches, PREG_PATTERN_ORDER)) { + AND preg_match_all( + ',<[^>]+\sclass=["\']spip_document_([0-9]+)[\s"\'],imsS', + $t, $matches, PREG_PATTERN_ORDER) + ) { if (!isset($doublons['documents'])) { $doublons['documents'] = ""; } @@ -3969,11 +4287,11 @@ function traiter_doublons_documents(&$doublons, $letexte) { * @example * `[(#CALCUL|vide)]` n'affichera pas le résultat du calcul * @filtre - * + * * @param mixed $texte * @return string Chaîne vide -**/ -function vide($texte){ + **/ +function vide($texte) { return ""; } @@ -3994,16 +4312,16 @@ function vide($texte){ * * @filtre * @link http://www.spip.net/4005 - * + * * @param array|string $env * Tableau cle => valeur des paramètres à écrire, ou chaine sérialisée de ce tableau * @param array $ignore_params * Permet de compléter les clés ignorées du tableau. * @return string * Code HTML résultant -**/ + **/ function env_to_params($env, $ignore_params = array()) { - $ignore_params = array_merge ( + $ignore_params = array_merge( array('id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'), $ignore_params ); @@ -4014,10 +4332,11 @@ function env_to_params($env, $ignore_params = array()) { if ($env) { foreach ($env as $i => $j) { if (is_string($j) AND !in_array($i, $ignore_params)) { - $texte .= "<param name='".$i."'\n\tvalue='".$j."' />"; + $texte .= "<param name='" . $i . "'\n\tvalue='" . $j . "' />"; } } } + return $texte; } @@ -4032,16 +4351,16 @@ function env_to_params($env, $ignore_params = array()) { * * @example `<embed src='#URL_DOCUMENT' [(#ENV*|env_to_attributs)] width='#GET{largeur}' height='#GET{hauteur}'></embed>` * @filtre - * + * * @param array|string $env * Tableau cle => valeur des attributs à écrire, ou chaine sérialisée de ce tableau * @param array $ignore_params * Permet de compléter les clés ignorées du tableau. * @return string * Code HTML résultant -**/ -function env_to_attributs ($env, $ignore_params = array()) { - $ignore_params = array_merge ( + **/ +function env_to_attributs($env, $ignore_params = array()) { + $ignore_params = array_merge( array('id', 'lang', 'id_document', 'date', 'date_redac', 'align', 'fond', '', 'recurs', 'emb', 'dir_racine'), $ignore_params ); @@ -4051,18 +4370,19 @@ function env_to_attributs ($env, $ignore_params = array()) { $texte = ""; if ($env) { foreach ($env as $i => $j) { - if (is_string($j) AND !in_array($i,$ignore_params)) { - $texte .= $i."='".$j."' "; + if (is_string($j) AND !in_array($i, $ignore_params)) { + $texte .= $i . "='" . $j . "' "; } } } + return $texte; } /** * Concatène des chaînes - * + * * @filtre * @link http://www.spip.net/4150 * @example @@ -4071,9 +4391,10 @@ function env_to_attributs ($env, $ignore_params = array()) { * ``` * * @return string Chaînes concaténés -**/ -function concat(){ + **/ +function concat() { $args = func_get_args(); + return join('', $args); } @@ -4084,30 +4405,36 @@ function concat(){ * Les chemins sont cherchés dans le path de SPIP * * @see balise_INCLURE_dist() La balise `#INCLURE` peut appeler cette fonction - * + * * @param array|string $files * - array : Liste de fichiers - * - string : fichier ou fichiers séparés par `|` + * - string : fichier ou fichiers séparés par `|` * @param bool $script * - si true, considère que c'est un fichier js à chercher `javascript/` * @return string * Contenu du ou des fichiers, concaténé -**/ + **/ function charge_scripts($files, $script = true) { $flux = ""; - foreach(is_array($files)?$files:explode("|",$files) as $file) { - if (!is_string($file)) continue; + foreach (is_array($files) ? $files : explode("|", $files) as $file) { + if (!is_string($file)) { + continue; + } if ($script) { - $file = preg_match(",^\w+$,",$file) ? "javascript/$file.js" : ''; + $file = preg_match(",^\w+$,", $file) ? "javascript/$file.js" : ''; + } + if ($file) { + $path = find_in_path($file); + } + if ($path) { + $flux .= spip_file_get_contents($path); } - if ($file) $path = find_in_path($file); - if ($path) $flux .= spip_file_get_contents($path); } + return $flux; } - /** * Produit une balise img avec un champ alt d'office si vide * @@ -4124,52 +4451,56 @@ function charge_scripts($files, $script = true) { * @return string */ function http_img_pack($img, $alt, $atts = '', $title = '', $options = array()) { - if (!isset($options['chemin_image']) OR $options['chemin_image']==true) + if (!isset($options['chemin_image']) OR $options['chemin_image'] == true) { $img = chemin_image($img); - if (stripos($atts, 'width')===false){ + } + if (stripos($atts, 'width') === false) { // utiliser directement l'info de taille presente dans le nom - if ((!isset($options['utiliser_suffixe_size']) OR $options['utiliser_suffixe_size']==true) - AND preg_match(',-([0-9]+)[.](png|gif)$,',$img,$regs)){ + if ((!isset($options['utiliser_suffixe_size']) OR $options['utiliser_suffixe_size'] == true) + AND preg_match(',-([0-9]+)[.](png|gif)$,', $img, $regs) + ) { $largeur = $hauteur = intval($regs[1]); - } - else{ + } else { $taille = taille_image($img); - list($hauteur,$largeur) = $taille; - if (!$hauteur OR !$largeur) + list($hauteur, $largeur) = $taille; + if (!$hauteur OR !$largeur) { return ""; + } } - $atts.=" width='".$largeur."' height='".$hauteur."'"; + $atts .= " width='" . $largeur . "' height='" . $hauteur . "'"; } - return "<img src='$img' alt='" . attribut_html($alt ? $alt : $title) . "'" - . ($title ? ' title="'.attribut_html($title).'"' : '') - . " ".ltrim($atts) - . " />"; + + return "<img src='$img' alt='" . attribut_html($alt ? $alt : $title) . "'" + . ($title ? ' title="' . attribut_html($title) . '"' : '') + . " " . ltrim($atts) + . " />"; } /** * Générer une directive `style='background:url()'` à partir d'un fichier image - * + * * @param string $img * @param string $att * @return string */ -function http_style_background($img, $att = ''){ - return " style='background".($att?"":"-image").": url(\"".chemin_image($img)."\")" . ($att ? (' ' . $att) : '') . ";'"; +function http_style_background($img, $att = '') { + return " style='background" . ($att ? "" : "-image") . ": url(\"" . chemin_image($img) . "\")" . ($att ? (' ' . $att) : '') . ";'"; } /** * Générer une balise HTML `img` à partir d'un nom de fichier * * @uses http_img_pack() - * + * * @param string $img * @param string $alt * @param string $class * @return string * Code HTML de la balise IMG */ -function filtre_balise_img_dist($img, $alt = "", $class = ""){ - return http_img_pack($img, $alt, $class?" class='".attribut_html($class)."'":'', '', array('chemin_image'=>false,'utiliser_suffixe_size'=>false)); +function filtre_balise_img_dist($img, $alt = "", $class = "") { + return http_img_pack($img, $alt, $class ? " class='" . attribut_html($class) . "'" : '', '', + array('chemin_image' => false, 'utiliser_suffixe_size' => false)); } @@ -4182,24 +4513,25 @@ function filtre_balise_img_dist($img, $alt = "", $class = ""){ * * @filtre * @link http://www.spip.net/4248 - * + * * @param array $tableau * Tableau de données à afficher * @param string $modele * Nom du modèle à utiliser * @return string * Code HTML résultant -**/ + **/ function filtre_foreach_dist($tableau, $modele = 'foreach') { $texte = ''; if (is_array($tableau)) { - foreach($tableau as $k => $v) { - $res = recuperer_fond('modeles/'.$modele, + foreach ($tableau as $k => $v) { + $res = recuperer_fond('modeles/' . $modele, array_merge(array('cle' => $k), (is_array($v) ? $v : array('valeur' => $v))) ); $texte .= $res; } } + return $texte; } @@ -4209,7 +4541,7 @@ function filtre_foreach_dist($tableau, $modele = 'foreach') { * * @filtre * @uses liste_plugin_actifs() pour connaître les informations affichables - * + * * @param string $plugin * Préfixe du plugin ou chaîne vide * @param string $type_info @@ -4223,7 +4555,7 @@ function filtre_foreach_dist($tableau, $modele = 'foreach') { * - est_actif : renvoie true s'il est actif, false sinon * - x : retourne l'information x du plugin si présente (et plugin actif) * - tout : retourne toutes les informations du plugin actif -**/ + **/ function filtre_info_plugin_dist($plugin, $type_info, $reload = false) { include_spip('inc/plugin'); $plugin = strtoupper($plugin); @@ -4238,7 +4570,7 @@ function filtre_info_plugin_dist($plugin, $type_info, $reload = false) { } elseif (isset($plugins_actifs[$plugin][$type_info])) { return $plugins_actifs[$plugin][$type_info]; } else { - $get_infos = charger_fonction('get_infos','plugins'); + $get_infos = charger_fonction('get_infos', 'plugins'); // On prend en compte les extensions if (!is_dir($plugins_actifs[$plugin]['dir_type'])) { $dir_plugins = constant($plugins_actifs[$plugin]['dir_type']); @@ -4264,7 +4596,7 @@ function filtre_info_plugin_dist($plugin, $type_info, $reload = false) { * @see inc_puce_statut_dist() * * @filtre - * + * * @param int $id_objet * Identifiant de l'objet * @param string $statut @@ -4279,8 +4611,9 @@ function filtre_info_plugin_dist($plugin, $type_info, $reload = false) { * @return string * Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent) */ -function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax = false){ - $puce_statut = charger_fonction('puce_statut','inc'); +function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax = false) { + $puce_statut = charger_fonction('puce_statut', 'inc'); + return $puce_statut($id_objet, $statut, $id_rubrique, $type, $ajax); } @@ -4298,7 +4631,7 @@ function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax = * @see inc_puce_statut_dist() * * @filtre - * + * * @param string $statut * Statut actuel de l'objet * @param string $objet @@ -4310,11 +4643,14 @@ function puce_changement_statut($id_objet, $statut, $id_rubrique, $type, $ajax = * @return string * Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent) */ -function filtre_puce_statut_dist($statut, $objet, $id_objet = 0, $id_parent = 0){ +function filtre_puce_statut_dist($statut, $objet, $id_objet = 0, $id_parent = 0) { static $puce_statut = null; - if (!$puce_statut) - $puce_statut = charger_fonction('puce_statut','inc'); - return $puce_statut($id_objet, $statut, $id_parent, $objet, false, objet_info($objet,'editable')?_ACTIVER_PUCE_RAPIDE:false); + if (!$puce_statut) { + $puce_statut = charger_fonction('puce_statut', 'inc'); + } + + return $puce_statut($id_objet, $statut, $id_parent, $objet, false, + objet_info($objet, 'editable') ? _ACTIVER_PUCE_RAPIDE : false); } @@ -4323,12 +4659,12 @@ function filtre_puce_statut_dist($statut, $objet, $id_objet = 0, $id_parent = 0) * * Encoder le contexte, le signer avec une clé, le crypter * avec le secret du site, le gziper si possible. - * + * * L'entrée peut-être sérialisée (le `#ENV**` des fonds ajax et ajax_stat) * - * @see decoder_contexte_ajax() + * @see decoder_contexte_ajax() * @uses calculer_cle_action() - * + * * @param string|array $c * contexte, peut etre un tableau serialize * @param string $form @@ -4340,9 +4676,10 @@ function filtre_puce_statut_dist($statut, $objet, $id_objet = 0, $id_parent = 0) * @return string * hash du contexte */ -function encoder_contexte_ajax($c, $form = '', $emboite = NULL, $ajaxid = '') { +function encoder_contexte_ajax($c, $form = '', $emboite = null, $ajaxid = '') { if (is_string($c) - AND @unserialize($c)!==false) { + AND @unserialize($c) !== false + ) { $c = unserialize($c); } @@ -4350,18 +4687,19 @@ function encoder_contexte_ajax($c, $form = '', $emboite = NULL, $ajaxid = '') { // pour que la pagination ajax ne soit pas plantee // si on charge la page &debut_x=1 : car alors en cliquant sur l'item 0, // le debut_x=0 n'existe pas, et on resterait sur 1 - if (is_array($c)){ + if (is_array($c)) { foreach ($c as $k => $v) { - if (strpos($k,'debut_') === 0) { + if (strpos($k, 'debut_') === 0) { unset($c[$k]); } } } - if (!function_exists('calculer_cle_action')) + if (!function_exists('calculer_cle_action')) { include_spip("inc/securiser_action"); - $cle = calculer_cle_action($form.(is_array($c)?serialize($c):$c)); - $c = serialize(array($c,$cle)); + } + $cle = calculer_cle_action($form . (is_array($c) ? serialize($c) : $c)); + $c = serialize(array($c, $cle)); // on ne stocke pas les contextes dans des fichiers caches // par defaut, sauf si cette configuration a ete forcee @@ -4373,7 +4711,7 @@ function encoder_contexte_ajax($c, $form = '', $emboite = NULL, $ajaxid = '') { if (function_exists('gzdeflate') && function_exists('gzinflate')) { $env = gzdeflate($env); // http://core.spip.net/issues/2667 | https://bugs.php.net/bug.php?id=61287 - if (substr(phpversion(),0,5) == '5.4.0' AND !@gzinflate($env)) { + if (substr(phpversion(), 0, 5) == '5.4.0' AND !@gzinflate($env)) { $cache_contextes_ajax = true; spip_log("Contextes AJAX forces en fichiers ! Erreur PHP 5.4.0", _LOG_AVERTISSEMENT); } @@ -4382,7 +4720,8 @@ function encoder_contexte_ajax($c, $form = '', $emboite = NULL, $ajaxid = '') { $env = base64_encode($env); // tester Suhosin et la valeur maximale des variables en GET... if ($max_len = @ini_get('suhosin.get.max_value_length') - and $max_len < ($len = strlen($env))) { + and $max_len < ($len = strlen($env)) + ) { $cache_contextes_ajax = true; spip_log("Contextes AJAX forces en fichiers !" . " Cela arrive lorsque la valeur du contexte" @@ -4392,25 +4731,30 @@ function encoder_contexte_ajax($c, $form = '', $emboite = NULL, $ajaxid = '') { . " pour accepter au moins 1024 caracteres.", _LOG_AVERTISSEMENT); } } - + if ($cache_contextes_ajax) { $dir = sous_repertoire(_DIR_CACHE, 'contextes'); // stocker les contextes sur disque et ne passer qu'un hash dans l'url $md5 = md5($c); - ecrire_fichier("$dir/c$md5",$c); + ecrire_fichier("$dir/c$md5", $c); $env = $md5; - } - - if ($emboite === NULL) return $env; - if (!trim($emboite)) return ""; + } + + if ($emboite === null) { + return $env; + } + if (!trim($emboite)) { + return ""; + } // toujours encoder l'url source dans le bloc ajax $r = self(); - $r = ' data-origin="'.$r.'"'; + $r = ' data-origin="' . $r . '"'; $class = 'ajaxbloc'; - if ($ajaxid AND is_string($ajaxid)){ - $class .= ' ajax-id-'.$ajaxid; + if ($ajaxid AND is_string($ajaxid)) { + $class .= ' ajax-id-' . $ajaxid; } - return "<div class='$class' "."data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n"; + + return "<div class='$class' " . "data-ajax-env='$env'$r>\n$emboite</div><!--ajaxbloc-->\n"; } /** @@ -4418,7 +4762,7 @@ function encoder_contexte_ajax($c, $form = '', $emboite = NULL, $ajaxid = '') { * * Précude inverse de `encoder_contexte_ajax()` * - * @see encoder_contexte_ajax() + * @see encoder_contexte_ajax() * @uses calculer_cle_action() * * @param string $c @@ -4430,22 +4774,27 @@ function encoder_contexte_ajax($c, $form = '', $emboite = NULL, $ajaxid = '') { * - false : erreur de décodage */ function decoder_contexte_ajax($c, $form = '') { - if (!function_exists('calculer_cle_action')) + if (!function_exists('calculer_cle_action')) { include_spip("inc/securiser_action"); - if (( (defined('_CACHE_CONTEXTES_AJAX') AND _CACHE_CONTEXTES_AJAX) OR strlen($c)==32) + } + if (((defined('_CACHE_CONTEXTES_AJAX') AND _CACHE_CONTEXTES_AJAX) OR strlen($c) == 32) AND $dir = sous_repertoire(_DIR_CACHE, 'contextes') - AND lire_fichier("$dir/c$c",$contexte)) { - $c = $contexte; + AND lire_fichier("$dir/c$c", $contexte) + ) { + $c = $contexte; } else { $c = @base64_decode($c); $c = _xor($c); - if (function_exists('gzdeflate') && function_exists('gzinflate')) + if (function_exists('gzdeflate') && function_exists('gzinflate')) { $c = @gzinflate($c); + } } list($env, $cle) = @unserialize($c); - if ($cle == calculer_cle_action($form.(is_array($env)?serialize($env):$env))) + if ($cle == calculer_cle_action($form . (is_array($env) ? serialize($env) : $env))) { return $env; + } + return false; } @@ -4454,7 +4803,7 @@ function decoder_contexte_ajax($c, $form = '') { * Encrypte ou décrypte un message * * @link http://www.php.net/manual/fr/language.operators.bitwise.php#81358 - * + * * @param string $message * Message à encrypter ou décrypter * @param null|string $key @@ -4462,18 +4811,20 @@ function decoder_contexte_ajax($c, $form = '') { * Une clé sera calculée si non transmise * @return string * Message décrypté ou encrypté -**/ -function _xor($message, $key = null){ + **/ +function _xor($message, $key = null) { if (is_null($key)) { - if (!function_exists('calculer_cle_action')) + if (!function_exists('calculer_cle_action')) { include_spip("inc/securiser_action"); + } $key = pack("H*", calculer_cle_action('_xor')); } $keylen = strlen($key); $messagelen = strlen($message); - for($i=0; $i<$messagelen; $i++) - $message[$i] = ~($message[$i]^$key[$i%$keylen]); + for ($i = 0; $i < $messagelen; $i++) { + $message[$i] = ~($message[$i] ^ $key[$i%$keylen]); + } return $message; } @@ -4482,25 +4833,25 @@ function _xor($message, $key = null){ * Retourne une URL de réponse de forum (aucune action ici) * * @see filtre_url_reponse_forum() du plugin forum (prioritaire) - * @note + * @note * La vraie fonction est dans le plugin forum, * mais on évite ici une erreur du compilateur en absence du plugin - * @param string $texte - * @return string + * @param string $texte + * @return string */ -function url_reponse_forum($texte){return $texte;} +function url_reponse_forum($texte) { return $texte; } /** * retourne une URL de suivi rss d'un forum (aucune action ici) * * @see filtre_url_rss_forum() du plugin forum (prioritaire) - * @note + * @note * La vraie fonction est dans le plugin forum, * mais on évite ici une erreur du compilateur en absence du plugin - * @param string $texte - * @return string + * @param string $texte + * @return string */ -function url_rss_forum($texte){return $texte;} +function url_rss_forum($texte) { return $texte; } /** @@ -4532,20 +4883,22 @@ function url_rss_forum($texte){return $texte;} * @return string * Code HTML */ -function lien_ou_expose($url, $libelle = NULL, $on = false, $class = "", $title = "", $rel = "", $evt = ''){ +function lien_ou_expose($url, $libelle = null, $on = false, $class = "", $title = "", $rel = "", $evt = '') { if ($on) { $bal = "strong"; $att = "class='on'"; } else { $bal = 'a'; $att = "href='$url'" - .($title?" title='".attribut_html($title)."'":'') - .($class?" class='".attribut_html($class)."'":'') - .($rel?" rel='".attribut_html($rel)."'":'') - .$evt; + . ($title ? " title='" . attribut_html($title) . "'" : '') + . ($class ? " class='" . attribut_html($class) . "'" : '') + . ($rel ? " rel='" . attribut_html($rel) . "'" : '') + . $evt; } - if ($libelle === NULL) + if ($libelle === null) { $libelle = $url; + } + return "<$bal $att>$libelle</$bal>"; } @@ -4556,18 +4909,25 @@ function lien_ou_expose($url, $libelle = NULL, $on = false, $class = "", $title * "module:chaine" * * @param int $nb : le nombre - * @param string $chaine_un : l'item de langue si $nb vaut un - * @param string $chaine_plusieurs : l'item de lanque si $nb > 1 + * @param string $chaine_un : l'item de langue si $nb vaut un + * @param string $chaine_plusieurs : l'item de lanque si $nb > 1 * @param string $var : La variable à remplacer par $nb dans l'item de langue (facultatif, défaut "nb") * @param array $vars : Les autres variables nécessaires aux chaines de langues (facultatif) * @return string : la chaine de langue finale en utilisant la fonction _T() */ -function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = array()){ - if (!$nb=intval($nb)) return ""; - if (!is_array($vars)) return ""; +function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $vars = array()) { + if (!$nb = intval($nb)) { + return ""; + } + if (!is_array($vars)) { + return ""; + } $vars[$var] = $nb; - if ($nb>1) return _T($chaine_plusieurs, $vars); - else return _T($chaine_un,$vars); + if ($nb > 1) { + return _T($chaine_plusieurs, $vars); + } else { + return _T($chaine_un, $vars); + } } @@ -4589,59 +4949,63 @@ function singulier_ou_pluriel($nb, $chaine_un, $chaine_plusieurs, $var = 'nb', $ * classe supplementaire (horizontale, verticale, ajax ...) * @param string $javascript * "onclick='...'" par exemple - * @return string + * @return string */ -function prepare_icone_base($type, $lien, $texte, $fond, $fonction = "", $class = "", $javascript = ""){ - if (in_array($fonction,array("del","supprimer.gif"))) +function prepare_icone_base($type, $lien, $texte, $fond, $fonction = "", $class = "", $javascript = "") { + if (in_array($fonction, array("del", "supprimer.gif"))) { $class .= ' danger'; - elseif ($fonction == "rien.gif") + } elseif ($fonction == "rien.gif") { $fonction = ""; - elseif ($fonction == "delsafe") + } elseif ($fonction == "delsafe") { $fonction = "del"; + } // remappage des icone : article-24.png+new => article-new-24.png - if ($icone_renommer = charger_fonction('icone_renommer','inc',true)) - list($fond,$fonction) = $icone_renommer($fond,$fonction); + if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) { + list($fond, $fonction) = $icone_renommer($fond, $fonction); + } // ajouter le type d'objet dans la class de l'icone - $class .= " " . substr(basename($fond),0,-4); + $class .= " " . substr(basename($fond), 0, -4); $alt = attribut_html($texte); $title = " title=\"$alt\""; // est-ce pertinent de doubler le alt par un title ? $ajax = ""; - if (strpos($class,"ajax")!==false) { - $ajax="ajax"; - if (strpos($class,"preload")!==false) - $ajax.=" preload"; - if (strpos($class,"nocache")!==false) - $ajax.=" nocache"; - $ajax=" class='$ajax'"; + if (strpos($class, "ajax") !== false) { + $ajax = "ajax"; + if (strpos($class, "preload") !== false) { + $ajax .= " preload"; + } + if (strpos($class, "nocache") !== false) { + $ajax .= " nocache"; + } + $ajax = " class='$ajax'"; } $size = 24; - if (preg_match("/-([0-9]{1,3})[.](gif|png)$/i",$fond,$match)) + if (preg_match("/-([0-9]{1,3})[.](gif|png)$/i", $fond, $match)) { $size = $match[1]; + } - if ($fonction){ + if ($fonction) { // 2 images pour composer l'icone : le fond (article) en background, // la fonction (new) en image $icone = http_img_pack($fonction, $alt, "width='$size' height='$size'\n" . - http_style_background($fond)); - } - else { + http_style_background($fond)); + } else { $icone = http_img_pack($fond, $alt, "width='$size' height='$size'"); } - if ($type=='lien') + if ($type == 'lien') { return "<span class='icone s$size $class'>" . "<a href='$lien'$title$ajax$javascript>" . $icone . "<b>$texte</b>" . "</a></span>\n"; - - else - return bouton_action("$icone<b>$texte</b>",$lien,"icone s$size $class",$javascript,$alt); + } else { + return bouton_action("$icone<b>$texte</b>", $lien, "icone s$size $class", $javascript, $alt); + } } /** @@ -4663,8 +5027,8 @@ function prepare_icone_base($type, $lien, $texte, $fond, $fonction = "", $class * Javascript ajouté sur le lien * @return string * Code HTML du lien -**/ -function icone_base($lien, $texte, $fond, $fonction = "", $class = "", $javascript = ""){ + **/ +function icone_base($lien, $texte, $fond, $fonction = "", $class = "", $javascript = "") { return prepare_icone_base('lien', $lien, $texte, $fond, $fonction, $class, $javascript); } @@ -4672,7 +5036,7 @@ function icone_base($lien, $texte, $fond, $fonction = "", $class = "", $javascri * Crée un lien précédé d'une icone au dessus du texte * * @uses icone_base() - * @see icone_verticale() Pour un usage dans un code PHP. + * @see icone_verticale() Pour un usage dans un code PHP. * * @filtre * @example @@ -4698,17 +5062,17 @@ function icone_base($lien, $texte, $fond, $fonction = "", $class = "", $javascri * Javascript ajouté sur le lien * @return string * Code HTML du lien -**/ -function filtre_icone_verticale_dist($lien, $texte, $fond, $fonction = "", $class = "", $javascript = ""){ - return icone_base($lien,$texte,$fond,$fonction,"verticale $class",$javascript); + **/ +function filtre_icone_verticale_dist($lien, $texte, $fond, $fonction = "", $class = "", $javascript = "") { + return icone_base($lien, $texte, $fond, $fonction, "verticale $class", $javascript); } /** * Crée un lien précédé d'une icone horizontale * * @uses icone_base() - * @see icone_horizontale() Pour un usage dans un code PHP. - * + * @see icone_horizontale() Pour un usage dans un code PHP. + * * @filtre * @example * En tant que filtre dans un squelettes : @@ -4728,7 +5092,7 @@ function filtre_icone_verticale_dist($lien, $texte, $fond, $fonction = "", $clas * _T('statistiques:icone_evolution_visites', array('visites' => $visites)), * "statistique-24.png"); * ``` - * + * * @param string $lien * URL du lien * @param string $texte @@ -4743,23 +5107,23 @@ function filtre_icone_verticale_dist($lien, $texte, $fond, $fonction = "", $clas * Javascript ajouté sur le lien * @return string * Code HTML du lien -**/ -function filtre_icone_horizontale_dist($lien, $texte, $fond, $fonction = "", $class = "", $javascript = ""){ - return icone_base($lien,$texte,$fond,$fonction,"horizontale $class",$javascript); + **/ +function filtre_icone_horizontale_dist($lien, $texte, $fond, $fonction = "", $class = "", $javascript = "") { + return icone_base($lien, $texte, $fond, $fonction, "horizontale $class", $javascript); } /** * Crée un bouton d'action intégrant une icone horizontale * * @uses prepare_icone_base() - * + * * @filtre * @example * ``` * [(#URL_ACTION_AUTEUR{supprimer_mot, #ID_MOT, #URL_ECRIRE{groupe_mots,id_groupe=#ID_GROUPE}} * |bouton_action_horizontal{<:mots:info_supprimer_mot:>,mot-24.png,del})] * ``` - * + * * @param string $lien * URL de l'action * @param string $texte @@ -4774,8 +5138,8 @@ function filtre_icone_horizontale_dist($lien, $texte, $fond, $fonction = "", $cl * Message de confirmation à ajouter en javascript sur le bouton * @return string * Code HTML du lien -**/ -function filtre_bouton_action_horizontal_dist($lien, $texte, $fond, $fonction = "", $class = "", $confirm = ""){ + **/ +function filtre_bouton_action_horizontal_dist($lien, $texte, $fond, $fonction = "", $class = "", $confirm = "") { return prepare_icone_base('bouton', $lien, $texte, $fond, $fonction, "horizontale $class", $confirm); } @@ -4783,8 +5147,8 @@ function filtre_bouton_action_horizontal_dist($lien, $texte, $fond, $fonction = * Filtre `icone` pour compatibilité mappé sur `icone_base` * * @uses icone_base() - * @see filtre_icone_verticale_dist() - * + * @see filtre_icone_verticale_dist() + * * @filtre * @deprecated Utiliser le filtre `icone_verticale` * @@ -4805,8 +5169,8 @@ function filtre_bouton_action_horizontal_dist($lien, $texte, $fond, $fonction = * @return string * Code HTML du lien */ -function filtre_icone_dist($lien, $texte, $fond, $align = "", $fonction = "", $class = "", $javascript = ""){ - return icone_base($lien,$texte,$fond,$fonction,"verticale $align $class",$javascript); +function filtre_icone_dist($lien, $texte, $fond, $align = "", $fonction = "", $class = "", $javascript = "") { + return icone_base($lien, $texte, $fond, $fonction, "verticale $align $class", $javascript); } @@ -4816,7 +5180,7 @@ function filtre_icone_dist($lien, $texte, $fond, $align = "", $fonction = "", $c * @note * Inverse l'écriture de la fonction PHP de même nom * pour que le filtre soit plus pratique dans les squelettes - * + * * @filtre * @example * ``` @@ -4827,7 +5191,7 @@ function filtre_icone_dist($lien, $texte, $fond, $align = "", $fonction = "", $c * @param string $b Séparateur * @return array Liste des éléments */ -function filtre_explode_dist($a, $b){return explode($b, $a);} +function filtre_explode_dist($a, $b) { return explode($b, $a); } /** * Implose un tableau en chaine en liant avec un séparateur @@ -4835,38 +5199,44 @@ function filtre_explode_dist($a, $b){return explode($b, $a);} * @note * Inverse l'écriture de la fonction PHP de même nom * pour que le filtre soit plus pratique dans les squelettes - * + * * @filtre * @example * ``` * [(#GET{truc}|implode{-})] * ``` * - * @param array $a Tableau + * @param array $a Tableau * @param string $b Séparateur * @return string Texte */ -function filtre_implode_dist($a, $b){return is_array($a)?implode($b, $a):$a;} +function filtre_implode_dist($a, $b) { return is_array($a) ? implode($b, $a) : $a; } /** * Produire les styles privés qui associent item de menu avec icone en background + * * @return string Code CSS */ -function bando_images_background(){ +function bando_images_background() { include_spip('inc/bandeau'); // recuperer tous les boutons et leurs images $boutons = definir_barre_boutons(definir_barre_contexte(), true, false); $res = ""; - foreach($boutons as $page => $detail){ - if ($detail->icone AND strlen(trim($detail->icone))) - $res .="\n.navigation_avec_icones #bando1_$page {background-image:url(".$detail->icone.");}"; - $selecteur = (in_array($page,array('outils_rapides','outils_collaboratifs'))?"":".navigation_avec_icones "); - if (is_array($detail->sousmenu)) - foreach($detail->sousmenu as $souspage=>$sousdetail) - if ($sousdetail->icone AND strlen(trim($sousdetail->icone))) - $res .="\n$selecteur.bando2_$souspage {background-image:url(".$sousdetail->icone.");}"; + foreach ($boutons as $page => $detail) { + if ($detail->icone AND strlen(trim($detail->icone))) { + $res .= "\n.navigation_avec_icones #bando1_$page {background-image:url(" . $detail->icone . ");}"; + } + $selecteur = (in_array($page, array('outils_rapides', 'outils_collaboratifs')) ? "" : ".navigation_avec_icones "); + if (is_array($detail->sousmenu)) { + foreach ($detail->sousmenu as $souspage => $sousdetail) { + if ($sousdetail->icone AND strlen(trim($sousdetail->icone))) { + $res .= "\n$selecteur.bando2_$souspage {background-image:url(" . $sousdetail->icone . ");}"; + } + } + } } + return $res; } @@ -4885,65 +5255,72 @@ function bando_images_background(){ * et avant execution de l'action. Si la callback renvoie false, elle annule le declenchement de l'action * @return string */ -function bouton_action($libelle, $url, $class = "", $confirm = "", $title = "", $callback = ""){ +function bouton_action($libelle, $url, $class = "", $confirm = "", $title = "", $callback = "") { if ($confirm) { $confirm = "confirm(\"" . attribut_html($confirm) . "\")"; - if ($callback) - $callback = "$confirm?($callback):false"; - else - $callback = $confirm; + if ($callback) { + $callback = "$confirm?($callback):false"; + } else { + $callback = $confirm; + } } - $onclick = $callback?" onclick='return ".addcslashes($callback,"'")."'":""; + $onclick = $callback ? " onclick='return " . addcslashes($callback, "'") . "'" : ""; $title = $title ? " title='$title'" : ""; - return "<form class='bouton_action_post $class' method='post' action='$url'><div>".form_hidden($url) - ."<button type='submit' class='submit'$title$onclick>$libelle</button></div></form>"; + + return "<form class='bouton_action_post $class' method='post' action='$url'><div>" . form_hidden($url) + . "<button type='submit' class='submit'$title$onclick>$libelle</button></div></form>"; } /** * Proteger les champs passes dans l'url et utiliser dans {tri ...} * preserver l'espace pour interpreter ensuite num xxx et multi xxx + * * @param string $t * @return string */ -function tri_protege_champ($t){ - return preg_replace(',[^\s\w.+],','',$t); +function tri_protege_champ($t) { + return preg_replace(',[^\s\w.+],', '', $t); } /** * Interpreter les multi xxx et num xxx utilise comme tri * pour la clause order * 'multi xxx' devient simplement 'multi' qui est calcule dans le select + * * @param string $t * @param array $from * @return string */ -function tri_champ_order($t, $from = null){ - if(strncmp($t,'multi ',6)==0){ +function tri_champ_order($t, $from = null) { + if (strncmp($t, 'multi ', 6) == 0) { return "multi"; } $champ = $t; - if (strncmp($t,'num ',4)==0) - $champ = substr($t,4); + if (strncmp($t, 'num ', 4) == 0) { + $champ = substr($t, 4); + } // enlever les autres espaces non evacues par tri_protege_champ - $champ = preg_replace(',\s,','',$champ); + $champ = preg_replace(',\s,', '', $champ); - if (is_array($from)){ - $trouver_table = charger_fonction('trouver_table','base'); - foreach($from as $idt=>$table_sql){ + if (is_array($from)) { + $trouver_table = charger_fonction('trouver_table', 'base'); + foreach ($from as $idt => $table_sql) { if ($desc = $trouver_table($table_sql) - AND isset($desc['field'][$champ])){ + AND isset($desc['field'][$champ]) + ) { $champ = "$idt.$champ"; break; } } } - if (strncmp($t,'num ',4)==0) + if (strncmp($t, 'num ', 4) == 0) { return "0+$champ"; - else + } else { return $champ; + } } /** @@ -4956,16 +5333,18 @@ function tri_champ_order($t, $from = null){ * @param string $t * @return string */ -function tri_champ_select($t){ - if(strncmp($t,'multi ',6)==0){ - $t = substr($t,6); - $t = preg_replace(',\s,','',$t); - $t = sql_multi($t,$GLOBALS['spip_lang']); +function tri_champ_select($t) { + if (strncmp($t, 'multi ', 6) == 0) { + $t = substr($t, 6); + $t = preg_replace(',\s,', '', $t); + $t = sql_multi($t, $GLOBALS['spip_lang']); + return $t; } - if(trim($t)=='hasard'){ + if (trim($t) == 'hasard') { return 'rand() AS hasard'; } + return "''"; } @@ -4987,67 +5366,76 @@ function tri_champ_select($t){ * @param string $etoile * @return string */ -function generer_info_entite($id_objet, $type_objet, $info, $etoile = ""){ - static $trouver_table=null; +function generer_info_entite($id_objet, $type_objet, $info, $etoile = "") { + static $trouver_table = null; static $objets; // On verifie qu'on a tout ce qu'il faut $id_objet = intval($id_objet); - if (!($id_objet and $type_objet and $info)) + if (!($id_objet and $type_objet and $info)) { return ''; + } // si on a deja note que l'objet n'existe pas, ne pas aller plus loin - if (isset($objets[$type_objet]) AND $objets[$type_objet]===false) + if (isset($objets[$type_objet]) AND $objets[$type_objet] === false) { return ''; + } // Si on demande l'url, on retourne direct la fonction - if ($info == 'url') + if ($info == 'url') { return generer_url_entite($id_objet, $type_objet); + } // Sinon on va tout chercher dans la table et on garde en memoire $demande_titre = ($info == 'titre'); // On ne fait la requete que si on a pas deja l'objet ou si on demande le titre mais qu'on ne l'a pas encore if (!isset($objets[$type_objet][$id_objet]) - OR - ($demande_titre AND !isset($objets[$type_objet][$id_objet]['titre'])) - ){ - if (!$trouver_table) - $trouver_table = charger_fonction('trouver_table','base'); + OR + ($demande_titre AND !isset($objets[$type_objet][$id_objet]['titre'])) + ) { + if (!$trouver_table) { + $trouver_table = charger_fonction('trouver_table', 'base'); + } $desc = $trouver_table(table_objet_sql($type_objet)); - if (!$desc) + if (!$desc) { return $objets[$type_objet] = false; + } // Si on demande le titre, on le gere en interne $champ_titre = ""; - if ($demande_titre){ + if ($demande_titre) { // si pas de titre declare mais champ titre, il sera peuple par le select * - $champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre']:''; + $champ_titre = (!empty($desc['titre'])) ? ', ' . $desc['titre'] : ''; } include_spip('base/abstract_sql'); include_spip('base/connect_sql'); $objets[$type_objet][$id_objet] = sql_fetsel( - '*'.$champ_titre, + '*' . $champ_titre, $desc['table_sql'], - id_table_objet($type_objet).' = '.intval($id_objet) + id_table_objet($type_objet) . ' = ' . intval($id_objet) ); } // Si la fonction generer_TRUC_TYPE existe, on l'utilise pour formater $info_generee - if ($generer = charger_fonction("generer_${info}_${type_objet}", '', true)) + if ($generer = charger_fonction("generer_${info}_${type_objet}", '', true)) { $info_generee = $generer($id_objet, $objets[$type_objet][$id_objet]); - // Si la fonction generer_TRUC_entite existe, on l'utilise pour formater $info_generee - else if ($generer = charger_fonction("generer_${info}_entite", '', true)) - $info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet]); - // Sinon on prend directement le champ SQL tel quel - else - $info_generee = (isset($objets[$type_objet][$id_objet][$info])?$objets[$type_objet][$id_objet][$info]:''); + } // Si la fonction generer_TRUC_entite existe, on l'utilise pour formater $info_generee + else { + if ($generer = charger_fonction("generer_${info}_entite", '', true)) { + $info_generee = $generer($id_objet, $type_objet, $objets[$type_objet][$id_objet]); + } // Sinon on prend directement le champ SQL tel quel + else { + $info_generee = (isset($objets[$type_objet][$id_objet][$info]) ? $objets[$type_objet][$id_objet][$info] : ''); + } + } // On va ensuite appliquer les traitements automatiques si besoin - if (!$etoile){ + if (!$etoile) { // FIXME: on fournit un ENV minimum avec id et type et connect='' // mais ce fonctionnement est a ameliorer ! - $info_generee = appliquer_traitement_champ($info_generee, $info, table_objet($type_objet),array('id_objet'=>$id_objet,'objet'=>$type_objet,'')); + $info_generee = appliquer_traitement_champ($info_generee, $info, table_objet($type_objet), + array('id_objet' => $id_objet, 'objet' => $type_objet, '')); } return $info_generee; @@ -5063,34 +5451,35 @@ function generer_info_entite($id_objet, $type_objet, $info, $etoile = ""){ * @param string $connect * @return string */ -function appliquer_traitement_champ($texte,$champ,$table_objet='',$env=array(),$connect=''){ - if (!$champ) +function appliquer_traitement_champ($texte, $champ, $table_objet = '', $env = array(), $connect = '') { + if (!$champ) { return $texte; + } $champ = strtoupper($champ); $traitements = isset($GLOBALS['table_des_traitements'][$champ]) ? $GLOBALS['table_des_traitements'][$champ] : false; - if(!$traitements OR !is_array($traitements)){ + if (!$traitements OR !is_array($traitements)) { return $texte; } $traitement = ''; - if ($table_objet AND (!isset($traitements[0]) OR count($traitements)>1)){ + if ($table_objet AND (!isset($traitements[0]) OR count($traitements) > 1)) { // necessaire pour prendre en charge les vieux appels avec un table_objet_sql en 3e arg $table_objet = table_objet($table_objet); - if (isset($traitements[$table_objet])){ + if (isset($traitements[$table_objet])) { $traitement = $traitements[$table_objet]; } } - if (!$traitement AND isset($traitements[0])){ + if (!$traitement AND isset($traitements[0])) { $traitement = $traitements[0]; } // (sinon prendre le premier de la liste par defaut ?) - if (!$traitement){ + if (!$traitement) { return $texte; } - $traitement = str_replace('%s', "'".texte_script($texte)."'", $traitement); + $traitement = str_replace('%s', "'" . texte_script($texte) . "'", $traitement); // Fournir $connect et $Pile[0] au traitement si besoin $Pile = array(0 => $env); @@ -5102,50 +5491,53 @@ function appliquer_traitement_champ($texte,$champ,$table_objet='',$env=array(),$ /** * Generer un lien (titre clicable vers url) vers un objet + * * @param int $id_objet * @param $objet * @param int $longueur * @param null|string $connect * @return string */ -function generer_lien_entite($id_objet, $objet, $longueur = 80, $connect = NULL){ +function generer_lien_entite($id_objet, $objet, $longueur = 80, $connect = null) { include_spip('inc/liens'); $titre = traiter_raccourci_titre($id_objet, $objet, $connect); // lorsque l'objet n'est plus declare (plugin desactive par exemple) // le raccourcis n'est plus valide $titre = isset($titre['titre']) ? typo($titre['titre']) : ''; // on essaye avec generer_info_entite ? - if (!strlen($titre) AND !$connect){ - $titre = generer_info_entite($id_objet, $objet,'titre'); + if (!strlen($titre) AND !$connect) { + $titre = generer_info_entite($id_objet, $objet, 'titre'); } - if (!strlen($titre)){ + if (!strlen($titre)) { $titre = _T('info_sans_titre'); } - $url = generer_url_entite($id_objet,$objet,'','',$connect); - return "<a href='$url' class='$objet'>".couper($titre,$longueur)."</a>"; + $url = generer_url_entite($id_objet, $objet, '', '', $connect); + + return "<a href='$url' class='$objet'>" . couper($titre, $longueur) . "</a>"; } /** * Englobe (Wrap) un texte avec des balises - * + * * @example `wrap('mot','<b>')` donne `<b>mot</b>'` * * @filtre * @uses extraire_balises() - * + * * @param string $texte * @param string $wrap * @return string */ function wrap($texte, $wrap) { $balises = extraire_balises($wrap); - if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS",$wrap, $regs, PREG_PATTERN_ORDER)) { + if (preg_match_all(",<([a-z]\w*)\b[^>]*>,UimsS", $wrap, $regs, PREG_PATTERN_ORDER)) { $texte = $wrap . $texte; $regs = array_reverse($regs[1]); - $wrap = "</".implode("></",$regs).">"; + $wrap = "</" . implode("></", $regs) . ">"; $texte = $texte . $wrap; } + return $texte; } @@ -5166,34 +5558,38 @@ function wrap($texte, $wrap) { * @return array|mixed|string */ function filtre_print_dist($u, $join = "<br />", $indent = 0) { - if (is_string($u)){ + if (is_string($u)) { $u = typo($u); + return $u; } // caster $u en array si besoin - if (is_object($u)) - $u = (array) $u; + if (is_object($u)) { + $u = (array)$u; + } - if (is_array($u)){ + if (is_array($u)) { $out = ""; // toutes les cles sont numeriques ? // et aucun enfant n'est un tableau // liste simple separee par des virgules - $numeric_keys = array_map('is_numeric',array_keys($u)); - $array_values = array_map('is_array',$u); - $object_values = array_map('is_object',$u); - if (array_sum($numeric_keys)==count($numeric_keys) - AND !array_sum($array_values) - AND !array_sum($object_values)){ + $numeric_keys = array_map('is_numeric', array_keys($u)); + $array_values = array_map('is_array', $u); + $object_values = array_map('is_object', $u); + if (array_sum($numeric_keys) == count($numeric_keys) + AND !array_sum($array_values) + AND !array_sum($object_values) + ) { return join(", ", array_map('filtre_print_dist', $u)); } // sinon on passe a la ligne et on indente - $i_str = str_pad("",$indent," "); - foreach($u as $k => $v){ - $out .= $join . $i_str . "$k: " . filtre_print_dist($v,$join,$indent+2); + $i_str = str_pad("", $indent, " "); + foreach ($u as $k => $v) { + $out .= $join . $i_str . "$k: " . filtre_print_dist($v, $join, $indent+2); } + return $out; } @@ -5210,16 +5606,17 @@ function filtre_print_dist($u, $join = "<br />", $indent = 0) { * @param string $info * @return string */ -function objet_info($objet, $info){ +function objet_info($objet, $info) { $table = table_objet_sql($objet); $infos = lister_tables_objets_sql($table); - return (isset($infos[$info])?$infos[$info]:''); + + return (isset($infos[$info]) ? $infos[$info] : ''); } /** * Filtre pour afficher 'Aucun truc' ou '1 truc' ou 'N trucs' * avec la bonne chaîne de langue en fonction de l'objet utilisé - * + * * @param int $nb * Nombre d'éléments * @param string $objet @@ -5227,11 +5624,12 @@ function objet_info($objet, $info){ * @return mixed|string * Texte traduit du comptage, tel que '3 articles' */ -function objet_afficher_nb($nb, $objet){ - if (!$nb) - return _T(objet_info($objet,'info_aucun_objet')); - else - return _T(objet_info($objet,$nb==1?'info_1_objet':'info_nb_objets'),array('nb'=>$nb)); +function objet_afficher_nb($nb, $objet) { + if (!$nb) { + return _T(objet_info($objet, 'info_aucun_objet')); + } else { + return _T(objet_info($objet, $nb == 1 ? 'info_1_objet' : 'info_nb_objets'), array('nb' => $nb)); + } } /** @@ -5241,103 +5639,113 @@ function objet_afficher_nb($nb, $objet){ * @param int $taille * @return string */ -function objet_icone($objet, $taille = 24){ - $icone = objet_info($objet,'icone_objet')."-".$taille.".png"; +function objet_icone($objet, $taille = 24) { + $icone = objet_info($objet, 'icone_objet') . "-" . $taille . ".png"; $icone = chemin_image($icone); $balise_img = charger_filtre('balise_img'); - return $icone?$balise_img($icone,_T(objet_info($objet,'texte_objet'))):''; + + return $icone ? $balise_img($icone, _T(objet_info($objet, 'texte_objet'))) : ''; } /** * Fonction de secours pour inserer le head_css de facon conditionnelle - * + * * Appelée en filtre sur le squelette qui contient #INSERT_HEAD, * elle vérifie l'absence éventuelle de #INSERT_HEAD_CSS et y suplée si besoin * pour assurer la compat avec les squelettes qui n'utilisent pas. - * + * * @param string $flux Code HTML * @return string Code HTML */ -function insert_head_css_conditionnel($flux){ - if (strpos($flux,'<!-- insert_head_css -->')===false - AND $p=strpos($flux,'<!-- insert_head -->')){ +function insert_head_css_conditionnel($flux) { + if (strpos($flux, '<!-- insert_head_css -->') === false + AND $p = strpos($flux, '<!-- insert_head -->') + ) { // plutot avant le premier js externe (jquery) pour etre non bloquant - if ($p1 = stripos($flux,'<script src=') AND $p1<$p) + if ($p1 = stripos($flux, '<script src=') AND $p1 < $p) { $p = $p1; - $flux = substr_replace($flux,pipeline('insert_head_css','<!-- insert_head_css -->'),$p,0); + } + $flux = substr_replace($flux, pipeline('insert_head_css', '<!-- insert_head_css -->'), $p, 0); } + return $flux; } /** * Produire un fichier statique à partir d'un squelette dynamique - * + * * Permet ensuite à Apache de le servir en statique sans repasser * par spip.php à chaque hit sur le fichier. - * + * * Si le format (css ou js) est passe dans `contexte['format']`, on l'utilise * sinon on regarde si le fond finit par .css ou .js, sinon on utilie "html" * * @uses urls_absolues_css() - * + * * @param string $fond * @param array $contexte * @param array $options * @param string $connect * @return string */ -function produire_fond_statique($fond, $contexte = array(), $options = array(), $connect = ''){ - if (isset($contexte['format'])){ +function produire_fond_statique($fond, $contexte = array(), $options = array(), $connect = '') { + if (isset($contexte['format'])) { $extension = $contexte['format']; unset($contexte['format']); - } - else { + } else { $extension = "html"; - if (preg_match(',[.](css|js|json)$,',$fond,$m)) + if (preg_match(',[.](css|js|json)$,', $fond, $m)) { $extension = $m[1]; + } } // recuperer le contenu produit par le squelette $options['raw'] = true; - $cache = recuperer_fond($fond,$contexte,$options,$connect); - + $cache = recuperer_fond($fond, $contexte, $options, $connect); + // calculer le nom de la css - $dir_var = sous_repertoire (_DIR_VAR, 'cache-'.$extension); - $nom_safe = preg_replace(",\W,",'_',str_replace('.','_',$fond)); - $filename = $dir_var . $extension."dyn-$nom_safe-".substr(md5($fond.serialize($contexte).$connect),0,8) .".$extension"; + $dir_var = sous_repertoire(_DIR_VAR, 'cache-' . $extension); + $nom_safe = preg_replace(",\W,", '_', str_replace('.', '_', $fond)); + $filename = $dir_var . $extension . "dyn-$nom_safe-" . substr(md5($fond . serialize($contexte) . $connect), 0, + 8) . ".$extension"; // mettre a jour le fichier si il n'existe pas // ou trop ancien // le dernier fichier produit est toujours suffixe par .last // et recopie sur le fichier cible uniquement si il change if (!file_exists($filename) - OR !file_exists($filename.".last") - OR (isset($cache['lastmodified']) AND $cache['lastmodified'] AND filemtime($filename.".last")<$cache['lastmodified']) - OR (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')) { + OR !file_exists($filename . ".last") + OR (isset($cache['lastmodified']) AND $cache['lastmodified'] AND filemtime($filename . ".last") < $cache['lastmodified']) + OR (defined('_VAR_MODE') AND _VAR_MODE == 'recalcul') + ) { $contenu = $cache['texte']; // passer les urls en absolu si c'est une css - if ($extension=="css") - $contenu = urls_absolues_css($contenu, test_espace_prive()?generer_url_ecrire('accueil'):generer_url_public($fond)); - + if ($extension == "css") { + $contenu = urls_absolues_css($contenu, + test_espace_prive() ? generer_url_ecrire('accueil') : generer_url_public($fond)); + } + // ne pas insérer de commentaire si c'est du json - if ($extension!="json") { + if ($extension != "json") { $comment = "/* #PRODUIRE{fond=$fond"; - foreach($contexte as $k=>$v) + foreach ($contexte as $k => $v) { $comment .= ",$k=$v"; + } // pas de date dans le commentaire car sinon ca invalide le md5 et force la maj // mais on peut mettre un md5 du contenu, ce qui donne un aperu rapide si la feuille a change ou non - $comment .="}\n md5:".md5($contenu)." */\n"; + $comment .= "}\n md5:" . md5($contenu) . " */\n"; } // et ecrire le fichier - ecrire_fichier($filename.".last",$comment.$contenu); + ecrire_fichier($filename . ".last", $comment . $contenu); // regarder si on recopie if (!file_exists($filename) - OR md5_file($filename)!==md5_file($filename.".last")){ - @copy($filename.".last",$filename); - spip_clearstatcache(true,$filename); // eviter que PHP ne reserve le vieux timestamp + OR md5_file($filename) !== md5_file($filename . ".last") + ) { + @copy($filename . ".last", $filename); + spip_clearstatcache(true, $filename); // eviter que PHP ne reserve le vieux timestamp } } - + return $filename; } @@ -5346,42 +5754,49 @@ function produire_fond_statique($fond, $contexte = array(), $options = array(), * [(#CHEMIN{monfichier}|timestamp)] * * @param string $fichier - * Le chemin du fichier sur lequel on souhaite ajouter le timestamp + * Le chemin du fichier sur lequel on souhaite ajouter le timestamp * @return string - * $fichier auquel on a ajouté le timestamp + * $fichier auquel on a ajouté le timestamp */ -function timestamp($fichier){ +function timestamp($fichier) { if (!$fichier OR !file_exists($fichier) - OR !$m = filemtime($fichier)) { + OR !$m = filemtime($fichier) + ) { return $fichier; } + return "$fichier?$m"; } /** * Supprimer le timestamp d'une url + * * @param string $url * @return string */ -function supprimer_timestamp($url){ - if (strpos($url,"?")===false) return $url; - return preg_replace(",\?[[:digit:]]+$,","",$url); +function supprimer_timestamp($url) { + if (strpos($url, "?") === false) { + return $url; + } + + return preg_replace(",\?[[:digit:]]+$,", "", $url); } /** * Nettoyer le titre d'un email - * + * * Éviter une erreur lorsqu'on utilise `|nettoyer_titre_email` dans un squelette de mail * * @filtre * @uses nettoyer_titre_email() - * + * * @param string $titre * @return string */ -function filtre_nettoyer_titre_email_dist($titre){ +function filtre_nettoyer_titre_email_dist($titre) { include_spip('inc/envoyer_mail'); + return nettoyer_titre_email($titre); } @@ -5391,7 +5806,7 @@ function filtre_nettoyer_titre_email_dist($titre){ * Il permet de placer un objet dans la hiérarchie des rubriques de SPIP * * @uses chercher_rubrique() - * + * * @param string $titre * @param int $id_objet * @param int $id_parent @@ -5403,9 +5818,20 @@ function filtre_nettoyer_titre_email_dist($titre){ * @param bool $retour_sans_cadre * @return string */ -function filtre_chercher_rubrique_dist($titre, $id_objet, $id_parent, $objet, $id_secteur, $restreint, $actionable = false, $retour_sans_cadre = false){ +function filtre_chercher_rubrique_dist( + $titre, + $id_objet, + $id_parent, + $objet, + $id_secteur, + $restreint, + $actionable = false, + $retour_sans_cadre = false +) { include_spip('inc/filtres_ecrire'); - return chercher_rubrique($titre,$id_objet, $id_parent, $objet, $id_secteur, $restreint,$actionable, $retour_sans_cadre); + + return chercher_rubrique($titre, $id_objet, $id_parent, $objet, $id_secteur, $restreint, $actionable, + $retour_sans_cadre); } /** @@ -5414,7 +5840,7 @@ function filtre_chercher_rubrique_dist($titre, $id_objet, $id_parent, $objet, $i * * En l'absence de redirection indiquée, la fonction redirige par défaut * sur une 403 dans l'espace privé et 404 dans l'espace public. - * + * * @example * ``` * [(#AUTORISER{non}|sinon_interdire_acces)] @@ -5433,42 +5859,53 @@ function filtre_chercher_rubrique_dist($titre, $id_objet, $id_parent, $objet, $i * @return string|void * Chaîne vide si l'accès est autorisé */ -function sinon_interdire_acces($ok = false, $url = '', $statut = 0, $message = null){ - if ($ok) return ''; +function sinon_interdire_acces($ok = false, $url = '', $statut = 0, $message = null) { + if ($ok) { + return ''; + } // Vider tous les tampons $level = @ob_get_level(); - while ($level--) + while ($level--) { @ob_end_clean(); - + } + include_spip('inc/headers'); // S'il y a une URL, on redirige (si pas de statut, la fonction mettra 302 par défaut) - if ($url) redirige_par_entete($url, '', $statut); + if ($url) { + redirige_par_entete($url, '', $statut); + } // ecriture simplifiee avec message en 3eme argument (= statut 403) - if (!is_numeric($statut) AND is_null($message)){ + if (!is_numeric($statut) AND is_null($message)) { $message = $statut; $statut = 0; } - if (!$message) $message = ''; + if (!$message) { + $message = ''; + } $statut = intval($statut); - // Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404 - if (test_espace_prive()){ - if (!$statut OR !in_array($statut,array(404,403))) $statut = 403; + // Si on est dans l'espace privé, on génère du 403 Forbidden par defaut ou du 404 + if (test_espace_prive()) { + if (!$statut OR !in_array($statut, array(404, 403))) { + $statut = 403; + } http_status(403); - $echec = charger_fonction('403','exec'); + $echec = charger_fonction('403', 'exec'); $echec($message); - } - else { + } else { // Sinon dans l'espace public on redirige vers une 404 par défaut, car elle toujours présente normalement - if (!$statut) $statut = 404; + if (!$statut) { + $statut = 404; + } // Dans tous les cas on modifie l'entité avec ce qui est demandé http_status($statut); // Si le statut est une erreur et qu'il n'y a pas de redirection on va chercher le squelette du même nom - if ($statut >= 400) - echo recuperer_fond("$statut",array('erreur'=>$message)); + if ($statut >= 400) { + echo recuperer_fond("$statut", array('erreur' => $message)); + } } @@ -5477,13 +5914,16 @@ function sinon_interdire_acces($ok = false, $url = '', $statut = 0, $message = n /** * Assurer le fonctionnement de |compacte meme sans l'extension compresseur + * * @param string $source * @param null|string $format * @return string */ -function filtre_compacte_dist($source, $format = null){ - if (function_exists('compacte')) +function filtre_compacte_dist($source, $format = null) { + if (function_exists('compacte')) { return compacte($source, $format); + } + return $source; } diff --git a/ecrire/inc/filtres_boites.php b/ecrire/inc/filtres_boites.php index a614d8549c..08839de99b 100644 --- a/ecrire/inc/filtres_boites.php +++ b/ecrire/inc/filtres_boites.php @@ -13,17 +13,18 @@ /** * Ce fichier regroupe la gestion des filtres et balises gérant des * boîtes de contenu - * + * * @package SPIP\Core\Compilateur\Filtres -**/ - -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Compile la balise `#BOITE_OUVRIR` ouvrant une boîte de contenu - * + * * Racourci pour ouvrir une boîte (info, simple, pour noisette ...) * * @package SPIP\Core\Compilateur\Balises @@ -43,22 +44,23 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Pile complétée par le code à générer */ function balise_BOITE_OUVRIR_dist($p) { - $_titre = interprete_argument_balise(1,$p); - $_class = interprete_argument_balise(2,$p); - $_head_class = interprete_argument_balise(3,$p); - $_titre = ($_titre?$_titre:"''"); - $_class = ($_class?", $_class":", 'simple'"); - $_head_class = ($_head_class?", $_head_class":""); + $_titre = interprete_argument_balise(1, $p); + $_class = interprete_argument_balise(2, $p); + $_head_class = interprete_argument_balise(3, $p); + $_titre = ($_titre ? $_titre : "''"); + $_class = ($_class ? ", $_class" : ", 'simple'"); + $_head_class = ($_head_class ? ", $_head_class" : ""); $f = chercher_filtre('boite_ouvrir'); $p->code = "$f($_titre$_class$_head_class)"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#BOITE_PIED` cloturant une boîte de contenu - * + * * Racourci pour passer au pied de la boite, avant sa fermeture. On peut * lui transmettre une classe CSS avec `#BOITE_PIED{class}` * @@ -66,26 +68,27 @@ function balise_BOITE_OUVRIR_dist($p) { * @balise * @see balise_BOITE_OUVRIR_dist() Pour ouvrir une boîte * @see balise_BOITE_FERMER_dist() Pour fermer une boîte - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ function balise_BOITE_PIED_dist($p) { - $_class = interprete_argument_balise(1,$p); - $_class = ($_class?"$_class":""); + $_class = interprete_argument_balise(1, $p); + $_class = ($_class ? "$_class" : ""); $f = chercher_filtre('boite_pied'); $p->code = "$f($_class)"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#BOITE_FERMER` clôturant une boîte de contenu - * + * * Racourci pour fermer une boîte ouverte * * @package SPIP\Core\Compilateur\Balises @@ -102,12 +105,13 @@ function balise_BOITE_FERMER_dist($p) { $f = chercher_filtre('boite_fermer'); $p->code = "$f()"; $p->interdire_scripts = false; + return $p; } /** * Ouvrir une boîte - * + * * Peut-être surchargé par `filtre_boite_ouvrir_dist` ou `filtre_boite_ouvrir` * * @filtre @@ -123,23 +127,25 @@ function balise_BOITE_FERMER_dist($p) { * @return string * HTML du début de la boîte */ -function boite_ouvrir($titre, $class = '', $head_class = '', $id = ""){ +function boite_ouvrir($titre, $class = '', $head_class = '', $id = "") { $class = "box $class"; $head_class = "clearfix hd $head_class"; // dans l'espace prive, titrer en h3 si pas de balise <hn> - if (test_espace_prive() AND strlen($titre) AND strpos($titre,'<h')===false) + if (test_espace_prive() AND strlen($titre) AND strpos($titre, '<h') === false) { $titre = "<h3>$titre</h3>"; - return '<div class="'.$class.($id?"\" id=\"$id":"").'">' - .'<b class="top"><b class="tl"></b><b class="tr"></b></b>' - .'<div class="inner">' - .($titre?'<div class="clearfix '.$head_class.'">'.$titre.'<!--/hd--></div>':'') - .'<div class="clearfix bd">'; + } + + return '<div class="' . $class . ($id ? "\" id=\"$id" : "") . '">' + . '<b class="top"><b class="tl"></b><b class="tr"></b></b>' + . '<div class="inner">' + . ($titre ? '<div class="clearfix ' . $head_class . '">' . $titre . '<!--/hd--></div>' : '') + . '<div class="clearfix bd">'; } /** * Passer au pied d'une boîte - * + * * Peut-être surchargé par `filtre_boite_pied_dist` ou `filtre_boite_pied` * * @filtre @@ -149,16 +155,17 @@ function boite_ouvrir($titre, $class = '', $head_class = '', $id = ""){ * @return string * HTML de transition vers le pied de la boîte */ -function boite_pied($class = 'act'){ +function boite_pied($class = 'act') { $class = "ft $class"; - return '</div>' - .'<div class="cleafix '.$class.'">'; + + return '</div>' + . '<div class="cleafix ' . $class . '">'; } /** * Fermer une boîte - * + * * Peut-être surchargé par `filtre_boite_fermer_dist` ou `filtre_boite_fermer` * * @filtre @@ -166,13 +173,11 @@ function boite_pied($class = 'act'){ * @return string * HTML de fin de la boîte */ -function boite_fermer(){ +function boite_fermer() { return '</div></div>' - .'<b class="bottom"><b class="bl"></b><b class="br"></b></b>' - .'</div>'; + . '<b class="bottom"><b class="bl"></b><b class="br"></b></b>' + . '</div>'; } - - ?> diff --git a/ecrire/inc/filtres_ecrire.php b/ecrire/inc/filtres_ecrire.php index 935772a258..35163d8040 100644 --- a/ecrire/inc/filtres_ecrire.php +++ b/ecrire/inc/filtres_ecrire.php @@ -15,7 +15,9 @@ * * @package SPIP\Core\Filtres */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres_boites'); include_spip('inc/boutons'); @@ -24,7 +26,7 @@ include_spip('inc/pipelines_ecrire'); /** * Retourne les paramètres de personnalisation css de l'espace privé - * + * * Ces paramètres sont (ltr et couleurs) ce qui permet une écriture comme : * generer_url_public('style_prive', parametres_css_prive()) * qu'il est alors possible de récuperer dans le squelette style_prive.html avec @@ -36,15 +38,15 @@ include_spip('inc/pipelines_ecrire'); * * @return string */ -function parametres_css_prive(){ +function parametres_css_prive() { $args = array(); $args['v'] = $GLOBALS['spip_version_code']; - $args['p'] = substr(md5($GLOBALS['meta']['plugin']),0,4); - $args['themes'] = implode(',',lister_themes_prives()); + $args['p'] = substr(md5($GLOBALS['meta']['plugin']), 0, 4); + $args['themes'] = implode(',', lister_themes_prives()); $args['ltr'] = $GLOBALS['spip_lang_left']; // un md5 des menus : si un menu change il faut maj la css - $args['md5b'] = (function_exists('md5_boutons_plugins')?md5_boutons_plugins():''); + $args['md5b'] = (function_exists('md5_boutons_plugins') ? md5_boutons_plugins() : ''); $c = (is_array($GLOBALS['visiteur_session']) AND is_array($GLOBALS['visiteur_session']['prefs'])) @@ -52,11 +54,12 @@ function parametres_css_prive(){ : 9; $couleurs = charger_fonction('couleurs', 'inc'); - parse_str($couleurs($c),$c); + parse_str($couleurs($c), $c); $args = array_merge($args, $c); - if (_request('var_mode')=='recalcul' OR (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')) + if (_request('var_mode') == 'recalcul' OR (defined('_VAR_MODE') AND _VAR_MODE == 'recalcul')) { $args['var_mode'] = 'recalcul'; + } return http_build_query($args); } @@ -68,7 +71,7 @@ function parametres_css_prive(){ * Il permet de placer un objet dans la hiérarchie des rubriques de SPIP * * @uses inc_chercher_rubrique_dist() - * + * * @param string $titre * @param int $id_objet * @param int $id_parent @@ -80,58 +83,80 @@ function parametres_css_prive(){ * @param bool $retour_sans_cadre * @return string */ -function chercher_rubrique($titre, $id_objet, $id_parent, $objet, $id_secteur, $restreint, $actionable = false, $retour_sans_cadre = false){ +function chercher_rubrique( + $titre, + $id_objet, + $id_parent, + $objet, + $id_secteur, + $restreint, + $actionable = false, + $retour_sans_cadre = false +) { include_spip('inc/autoriser'); - if (intval($id_objet) && !autoriser('modifier', $objet, $id_objet)) + if (intval($id_objet) && !autoriser('modifier', $objet, $id_objet)) { return ""; - if (!sql_countsel('spip_rubriques')) + } + if (!sql_countsel('spip_rubriques')) { return ""; + } $chercher_rubrique = charger_fonction('chercher_rubrique', 'inc'); - $form = $chercher_rubrique($id_parent, $objet, $restreint, ($objet=='rubrique')?$id_objet:0); + $form = $chercher_rubrique($id_parent, $objet, $restreint, ($objet == 'rubrique') ? $id_objet : 0); - if ($id_parent == 0) $logo = "racine-24.png"; - elseif ($id_secteur == $id_parent) $logo = "secteur-24.png"; - else $logo = "rubrique-24.png"; + if ($id_parent == 0) { + $logo = "racine-24.png"; + } elseif ($id_secteur == $id_parent) { + $logo = "secteur-24.png"; + } else { + $logo = "rubrique-24.png"; + } $confirm = ""; - if ($objet=='rubrique') { + if ($objet == 'rubrique') { // si c'est une rubrique-secteur contenant des breves, demander la // confirmation du deplacement - $contient_breves = sql_countsel('spip_breves', "id_rubrique=".intval($id_objet)); + $contient_breves = sql_countsel('spip_breves', "id_rubrique=" . intval($id_objet)); if ($contient_breves > 0) { - $scb = ($contient_breves>1? 's':''); + $scb = ($contient_breves > 1 ? 's' : ''); $scb = _T('avis_deplacement_rubrique', - array('contient_breves' => $contient_breves, - 'scb' => $scb)); + array( + 'contient_breves' => $contient_breves, + 'scb' => $scb + )); $confirm .= "\n<div class='confirmer_deplacement verdana2'>" - ."<div class='choix'><input type='checkbox' name='confirme_deplace' value='oui' id='confirme-deplace' /><label for='confirme-deplace'>" - . $scb . - "</label></div></div>\n"; - } else + . "<div class='choix'><input type='checkbox' name='confirme_deplace' value='oui' id='confirme-deplace' /><label for='confirme-deplace'>" + . $scb . + "</label></div></div>\n"; + } else { $confirm .= "<input type='hidden' name='confirme_deplace' value='oui' />\n"; + } } $form .= $confirm; - if ($actionable){ - if (strpos($form,'<select')!==false) { + if ($actionable) { + if (strpos($form, '<select') !== false) { $form .= "<div style='text-align: " . $GLOBALS['spip_lang_right'] . ";'>" - . '<input class="fondo" type="submit" value="'._T('bouton_choisir').'"/>' + . '<input class="fondo" type="submit" value="' . _T('bouton_choisir') . '"/>' . "</div>"; } $form = "<input type='hidden' name='editer_$objet' value='oui' />\n" . $form; if ($action = charger_fonction("editer_$objet", "action", true)) { - $form = generer_action_auteur("editer_$objet", $id_objet, self(), $form, " method='post' class='submit_plongeur'"); + $form = generer_action_auteur("editer_$objet", $id_objet, self(), $form, + " method='post' class='submit_plongeur'"); } else { - $form = generer_action_auteur("editer_objet", "$objet/$id_objet", self(), $form, " method='post' class='submit_plongeur'"); + $form = generer_action_auteur("editer_objet", "$objet/$id_objet", self(), $form, + " method='post' class='submit_plongeur'"); } } - if ($retour_sans_cadre) + if ($retour_sans_cadre) { return $form; + } include_spip('inc/presentation'); - return debut_cadre_couleur($logo, true, "", $titre) . $form .fin_cadre_couleur(true); + + return debut_cadre_couleur($logo, true, "", $titre) . $form . fin_cadre_couleur(true); } @@ -146,12 +171,21 @@ function chercher_rubrique($titre, $id_objet, $id_parent, $objet, $id_secteur, $ * @return bool */ function avoir_visiteurs($past = false, $accepter = true) { - if ($GLOBALS['meta']["forums_publics"] == 'abo') return true; - if ($accepter AND $GLOBALS['meta']["accepter_visiteurs"] <> 'non') return true; - if (sql_countsel('spip_articles', "accepter_forum='abo'"))return true; - if (!$past) return false; + if ($GLOBALS['meta']["forums_publics"] == 'abo') { + return true; + } + if ($accepter AND $GLOBALS['meta']["accepter_visiteurs"] <> 'non') { + return true; + } + if (sql_countsel('spip_articles', "accepter_forum='abo'")) { + return true; + } + if (!$past) { + return false; + } + return sql_countsel('spip_auteurs', - "statut NOT IN ('0minirezo','1comite', '5poubelle') + "statut NOT IN ('0minirezo','1comite', '5poubelle') AND (statut<>'nouveau' OR prefs NOT IN ('0minirezo','1comite', '5poubelle'))"); } @@ -163,18 +197,19 @@ function avoir_visiteurs($past = false, $accepter = true) { * en testant un à un les status présents en base * * On mémorise en static pour éviter de refaire plusieurs fois. - * + * * @param string $statut_auteur * @return array */ -function statuts_articles_visibles($statut_auteur){ +function statuts_articles_visibles($statut_auteur) { static $auth = array(); - if (!isset($auth[$statut_auteur])){ + if (!isset($auth[$statut_auteur])) { $auth[$statut_auteur] = array(); - $statuts = array_map('reset',sql_allfetsel('distinct statut','spip_articles')); - foreach($statuts as $s){ - if (autoriser('voir','article',0,array('statut'=>$statut_auteur),array('statut'=>$s))) + $statuts = array_map('reset', sql_allfetsel('distinct statut', 'spip_articles')); + foreach ($statuts as $s) { + if (autoriser('voir', 'article', 0, array('statut' => $statut_auteur), array('statut' => $s))) { $auth[$statut_auteur][] = $s; + } } } @@ -183,7 +218,7 @@ function statuts_articles_visibles($statut_auteur){ /** * Traduire le statut technique de l'auteur en langage compréhensible - * + * * Si $statut=='nouveau' et que le statut en attente est fourni, * le prendre en compte en affichant que l'auteur est en attente * @@ -191,29 +226,34 @@ function statuts_articles_visibles($statut_auteur){ * @param string $attente * @return string */ -function traduire_statut_auteur($statut, $attente = ""){ +function traduire_statut_auteur($statut, $attente = "") { $plus = ""; - if ($statut=='nouveau') { + if ($statut == 'nouveau') { if ($attente) { $statut = $attente; - $plus = " ("._T('info_statut_auteur_a_confirmer').")"; + $plus = " (" . _T('info_statut_auteur_a_confirmer') . ")"; + } else { + return _T('info_statut_auteur_a_confirmer'); } - else return _T('info_statut_auteur_a_confirmer'); } - $recom = array("info_administrateurs" => _T('item_administrateur_2'), - "info_redacteurs" => _T('intem_redacteur'), - "info_visiteurs" => _T('item_visiteur'), - '5poubelle' => _T('texte_statut_poubelle'), // bouh - ); - if (isset($recom[$statut])) - return $recom[$statut].$plus; + $recom = array( + "info_administrateurs" => _T('item_administrateur_2'), + "info_redacteurs" => _T('intem_redacteur'), + "info_visiteurs" => _T('item_visiteur'), + '5poubelle' => _T('texte_statut_poubelle'), // bouh + ); + if (isset($recom[$statut])) { + return $recom[$statut] . $plus; + } // retrouver directement par le statut sinon - if ($t = array_search($statut, $GLOBALS['liste_des_statuts'])){ - if (isset($recom[$t])) - return $recom[$t].$plus; - return _T($t).$plus; + if ($t = array_search($statut, $GLOBALS['liste_des_statuts'])) { + if (isset($recom[$t])) { + return $recom[$t] . $plus; + } + + return _T($t) . $plus; } // si on a pas reussi a le traduire, retournons la chaine telle quelle @@ -228,23 +268,28 @@ function traduire_statut_auteur($statut, $attente = ""){ * @param string $objet * @return string */ -function afficher_qui_edite($id_objet, $objet){ +function afficher_qui_edite($id_objet, $objet) { static $qui = array(); - if (isset($qui[$objet][$id_objet])) + if (isset($qui[$objet][$id_objet])) { return $qui[$objet][$id_objet]; + } - if ($GLOBALS['meta']['articles_modif'] == 'non') + if ($GLOBALS['meta']['articles_modif'] == 'non') { return $qui[$objet][$id_objet] = ''; - + } + include_spip('inc/drapeau_edition'); $modif = mention_qui_edite($id_objet, $objet); - if (!$modif) return $qui[$objet][$id_objet] = ''; + if (!$modif) { + return $qui[$objet][$id_objet] = ''; + } include_spip('base/objets'); $infos = lister_tables_objets_sql(table_objet_sql($objet)); - if (isset($infos['texte_signale_edition'])) + if (isset($infos['texte_signale_edition'])) { return $qui[$objet][$id_objet] = _T($infos['texte_signale_edition'], $modif); - + } + return $qui[$objet][$id_objet] = _T('info_qui_edite', $modif); } @@ -263,40 +308,47 @@ function afficher_qui_edite($id_objet, $objet){ * @return array */ function auteurs_lister_statuts($quoi = 'tous', $en_base = true) { - if (!defined('AUTEURS_MIN_REDAC')) define('AUTEURS_MIN_REDAC', "0minirezo,1comite,5poubelle"); + if (!defined('AUTEURS_MIN_REDAC')) { + define('AUTEURS_MIN_REDAC', "0minirezo,1comite,5poubelle"); + } - switch($quoi){ + switch ($quoi) { case "redacteurs": $statut = AUTEURS_MIN_REDAC; - $statut = explode(',',$statut); + $statut = explode(',', $statut); if ($en_base) { - $check = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$statut))); - $retire = array_diff($statut,$check); - $statut = array_diff($statut,$retire); + $check = array_map('reset', sql_allfetsel('DISTINCT statut', 'spip_auteurs', sql_in('statut', $statut))); + $retire = array_diff($statut, $check); + $statut = array_diff($statut, $retire); } + return array_unique($statut); break; case "visiteurs": $statut = array(); $exclus = AUTEURS_MIN_REDAC; - $exclus = explode(',',$exclus); - if (!$en_base){ + $exclus = explode(',', $exclus); + if (!$en_base) { // prendre aussi les statuts de la table des status qui ne sont pas dans le define - $statut = array_diff(array_values($GLOBALS['liste_des_statuts']),$exclus); + $statut = array_diff(array_values($GLOBALS['liste_des_statuts']), $exclus); } - $s_complement = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$exclus,'NOT'))); - return array_unique(array_merge($statut,$s_complement)); + $s_complement = array_map('reset', + sql_allfetsel('DISTINCT statut', 'spip_auteurs', sql_in('statut', $exclus, 'NOT'))); + + return array_unique(array_merge($statut, $s_complement)); break; default: case "tous": $statut = array_values($GLOBALS['liste_des_statuts']); - $s_complement = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$statut,'NOT'))); - $statut = array_merge($statut,$s_complement); + $s_complement = array_map('reset', + sql_allfetsel('DISTINCT statut', 'spip_auteurs', sql_in('statut', $statut, 'NOT'))); + $statut = array_merge($statut, $s_complement); if ($en_base) { - $check = array_map('reset',sql_allfetsel('DISTINCT statut','spip_auteurs',sql_in('statut',$statut))); - $retire = array_diff($statut,$check); - $statut = array_diff($statut,$retire); + $check = array_map('reset', sql_allfetsel('DISTINCT statut', 'spip_auteurs', sql_in('statut', $statut))); + $retire = array_diff($statut, $check); + $statut = array_diff($statut, $retire); } + return array_unique($statut); break; } @@ -307,21 +359,21 @@ function auteurs_lister_statuts($quoi = 'tous', $en_base = true) { /** * Déterminer la rubrique pour la création d'un objet heuristique - * + * * Rubrique courante si possible, * - sinon rubrique administrée pour les admin restreint * - sinon première rubrique de premier niveau autorisée que l'on trouve * * @param int $id_rubrique Identifiant de rubrique (si connu) - * @param string $objet Objet en cours de création + * @param string $objet Objet en cours de création * @return int Identifiant de la rubrique dans laquelle créer l'objet */ -function trouver_rubrique_creer_objet($id_rubrique, $objet){ +function trouver_rubrique_creer_objet($id_rubrique, $objet) { - if (!$id_rubrique AND defined('_CHOIX_RUBRIQUE_PAR_DEFAUT') AND _CHOIX_RUBRIQUE_PAR_DEFAUT){ + if (!$id_rubrique AND defined('_CHOIX_RUBRIQUE_PAR_DEFAUT') AND _CHOIX_RUBRIQUE_PAR_DEFAUT) { $in = !count($GLOBALS['connect_id_rubrique']) ? '' - : (" AND ".sql_in('id_rubrique', $GLOBALS['connect_id_rubrique'])); + : (" AND " . sql_in('id_rubrique', $GLOBALS['connect_id_rubrique'])); // on tente d'abord l'ecriture a la racine dans le cas des rubriques uniquement if ($objet == 'rubrique') { @@ -329,30 +381,33 @@ function trouver_rubrique_creer_objet($id_rubrique, $objet){ } else { $id_rubrique = sql_getfetsel('id_rubrique', 'spip_rubriques', "id_parent=0$in", '', "id_rubrique DESC", 1); } - - if (!autoriser("creer{$objet}dans", 'rubrique', $id_rubrique)){ + + if (!autoriser("creer{$objet}dans", 'rubrique', $id_rubrique)) { // manque de chance, la rubrique n'est pas autorisee, on cherche un des secteurs autorises $res = sql_select("id_rubrique", "spip_rubriques", "id_parent=0"); - while (!autoriser("creer{$objet}dans", 'rubrique', $id_rubrique) && $row_rub = sql_fetch($res)){ + while (!autoriser("creer{$objet}dans", 'rubrique', $id_rubrique) && $row_rub = sql_fetch($res)) { $id_rubrique = $row_rub['id_rubrique']; } } } - return $id_rubrique; + + return $id_rubrique; } /** * Afficher le lien de redirection d'un article virtuel si il y a lieu * (rien si l'article n'est pas redirige) - * + * * @param string $virtuel * @return string */ -function lien_article_virtuel($virtuel){ +function lien_article_virtuel($virtuel) { include_spip('inc/lien'); - if (!$virtuel = virtuel_redirige($virtuel)) - return ''; - return propre("[->".$virtuel."]"); + if (!$virtuel = virtuel_redirige($virtuel)) { + return ''; + } + + return propre("[->" . $virtuel . "]"); } @@ -364,7 +419,7 @@ function lien_article_virtuel($virtuel){ * @example * - `[(#VAL{a_suivre}|bouton_spip_rss)]` * - `[(#VAL{signatures}|bouton_spip_rss{#ARRAY{id_article,#ID_ARTICLE}})]` - * + * * @filtre * @uses param_low_sec() * @param string $op @@ -379,7 +434,8 @@ function bouton_spip_rss($op, $args = array(), $lang = '', $title = 'RSS') { $clic = http_img_pack('feed.png', 'RSS', '', $title); $args = param_low_sec($op, $args, $lang, 'rss'); $url = generer_url_public('rss', $args); - return "<a style='float: ".$GLOBALS['spip_lang_right'].";' href='$url'>$clic</a>"; + + return "<a style='float: " . $GLOBALS['spip_lang_right'] . ";' href='$url'>$clic</a>"; } @@ -395,73 +451,84 @@ function alertes_auteur($id_auteur) { // si on n'est plus compatible avec php4 : le dire a tous ceux qui passent // dans l'espace prive - if (version_compare(phpversion(), _PHP_MIN) == -1) - $alertes[] = _L('SPIP nécessite PHP @min@, votre version est @version@.', array('min'=> _PHP_MIN, 'version' => phpversion())); + if (version_compare(phpversion(), _PHP_MIN) == -1) { + $alertes[] = _L('SPIP nécessite PHP @min@, votre version est @version@.', + array('min' => _PHP_MIN, 'version' => phpversion())); + } if (isset($GLOBALS['meta']['message_crash_tables']) - AND autoriser('detruire', null, null, $id_auteur)) { + AND autoriser('detruire', null, null, $id_auteur) + ) { include_spip('genie/maintenance'); - if ($msg = message_crash_tables()) + if ($msg = message_crash_tables()) { $alertes[] = $msg; + } } if (isset($GLOBALS['meta']['message_crash_plugins']) - AND $GLOBALS['meta']['message_crash_plugins'] - AND autoriser('configurer', '_plugins', null, $id_auteur) - AND is_array($msg = unserialize($GLOBALS['meta']['message_crash_plugins']))) { - $msg = implode(', ',array_map('joli_repertoire',array_keys($msg))); - $alertes[] = _T('plugins_erreur', array('plugins' => $msg)); + AND $GLOBALS['meta']['message_crash_plugins'] + AND autoriser('configurer', '_plugins', null, $id_auteur) + AND is_array($msg = unserialize($GLOBALS['meta']['message_crash_plugins'])) + ) { + $msg = implode(', ', array_map('joli_repertoire', array_keys($msg))); + $alertes[] = _T('plugins_erreur', array('plugins' => $msg)); } $a = isset($GLOBALS['meta']['message_alertes_auteurs']) ? $GLOBALS['meta']['message_alertes_auteurs'] : ''; if ($a AND is_array($a = unserialize($a)) - AND count($a)){ + AND count($a) + ) { $update = false; - if (isset($a[$GLOBALS['visiteur_session']['statut']])){ - $alertes = array_merge($alertes,$a[$GLOBALS['visiteur_session']['statut']]); + if (isset($a[$GLOBALS['visiteur_session']['statut']])) { + $alertes = array_merge($alertes, $a[$GLOBALS['visiteur_session']['statut']]); unset($a[$GLOBALS['visiteur_session']['statut']]); $update = true; } - if (isset($a[''])){ - $alertes = array_merge($alertes,$a['']); + if (isset($a[''])) { + $alertes = array_merge($alertes, $a['']); unset($a['']); $update = true; } - if ($update) - ecrire_meta("message_alertes_auteurs",serialize($a)); + if ($update) { + ecrire_meta("message_alertes_auteurs", serialize($a)); + } } if (isset($GLOBALS['meta']['plugin_erreur_activation']) - AND autoriser('configurer', '_plugins', null, $id_auteur)) { + AND autoriser('configurer', '_plugins', null, $id_auteur) + ) { include_spip('inc/plugin'); $alertes[] = plugin_donne_erreurs(); } $alertes = pipeline( 'alertes_auteur', - array( + array( 'args' => array( 'id_auteur' => $id_auteur, 'exec' => _request('exec'), - ), + ), 'data' => $alertes - ) - ); + ) + ); - if ($alertes = array_filter($alertes)) - return "<div class='wrap-messages-alertes'><div class='messages-alertes'>". - join(' | ', $alertes) - ."</div></div>"; + if ($alertes = array_filter($alertes)) { + return "<div class='wrap-messages-alertes'><div class='messages-alertes'>" . + join(' | ', $alertes) + . "</div></div>"; + } } /** * Filtre pour afficher les rubriques enfants d'une rubrique + * * @param int $id_rubrique * @return string */ -function filtre_afficher_enfant_rub_dist($id_rubrique){ +function filtre_afficher_enfant_rub_dist($id_rubrique) { include_spip('inc/presenter_enfants'); + return afficher_enfant_rub(intval($id_rubrique)); } @@ -469,32 +536,32 @@ function filtre_afficher_enfant_rub_dist($id_rubrique){ * Afficher un petit "i" pour lien vers autre page * * @param string $lien - * URL du lien desire + * URL du lien desire * @param string $titre - * Titre au survol de l'icone pointant le lien + * Titre au survol de l'icone pointant le lien * @param string $titre_lien - * Si present, ajoutera en plus apres l'icone - * un lien simple, vers la meme URL, - * avec le titre indique - * + * Si present, ajoutera en plus apres l'icone + * un lien simple, vers la meme URL, + * avec le titre indique + * * @return string */ function afficher_plus_info($lien, $titre = "+", $titre_lien = "") { $titre = attribut_html($titre); $icone = "\n<a href='$lien' title='$titre' class='plus_info'>" . - http_img_pack("information-16.png", $titre) ."</a>"; + http_img_pack("information-16.png", $titre) . "</a>"; if (!$titre_lien) { return $icone; } else { - return $icone . "\n<a href='$lien'>$titre_lien</a>"; + return $icone . "\n<a href='$lien'>$titre_lien</a>"; } } /** * Lister les id objet_source associés à l'objet id_objet * via la table de lien objet_lien - * + * * Utilisé pour les listes de #FORMULAIRE_EDITER_LIENS * * @param string $objet_source @@ -503,19 +570,20 @@ function afficher_plus_info($lien, $titre = "+", $titre_lien = "") { * @param string $objet_lien * @return array */ -function lister_objets_lies($objet_source, $objet, $id_objet, $objet_lien){ +function lister_objets_lies($objet_source, $objet, $id_objet, $objet_lien) { include_spip('action/editer_liens'); $l = array(); // quand $objet == $objet_lien == $objet_source on reste sur le cas par defaut de $objet_lien == $objet_source - if ($objet_lien==$objet AND $objet_lien!==$objet_source){ - $res = objet_trouver_liens(array($objet=>$id_objet),array($objet_source=>'*')); - } - else{ - $res = objet_trouver_liens(array($objet_source=>'*'),array($objet=>$id_objet)); + if ($objet_lien == $objet AND $objet_lien !== $objet_source) { + $res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*')); + } else { + $res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet)); } - while ($row = array_shift($res)) + while ($row = array_shift($res)) { $l[] = $row[$objet_source]; + } return $l; } + ?> diff --git a/ecrire/inc/filtres_images_lib_mini.php b/ecrire/inc/filtres_images_lib_mini.php index 6dfd69dd49..57256564c3 100644 --- a/ecrire/inc/filtres_images_lib_mini.php +++ b/ecrire/inc/filtres_images_lib_mini.php @@ -18,7 +18,9 @@ */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres'); // par precaution include_spip('inc/filtres_images_mini'); // par precaution @@ -38,11 +40,17 @@ function _couleur_dec_to_hex($red, $green, $blue) { $red = dechex($red); $green = dechex($green); $blue = dechex($blue); - - if (strlen($red) == 1) $red = "0".$red; - if (strlen($green) == 1) $green = "0".$green; - if (strlen($blue) == 1) $blue = "0".$blue; - + + if (strlen($red) == 1) { + $red = "0" . $red; + } + if (strlen($green) == 1) { + $green = "0" . $green; + } + if (strlen($blue) == 1) { + $blue = "0" . $blue; + } + return "$red$green$blue"; } @@ -56,11 +64,11 @@ function _couleur_dec_to_hex($red, $green, $blue) { */ function _couleur_hex_to_dec($couleur) { $couleur = couleur_html_to_hex($couleur); - $couleur = preg_replace(",^#,","",$couleur); + $couleur = preg_replace(",^#,", "", $couleur); $retour["red"] = hexdec(substr($couleur, 0, 2)); $retour["green"] = hexdec(substr($couleur, 2, 2)); $retour["blue"] = hexdec(substr($couleur, 4, 2)); - + return $retour; } @@ -68,7 +76,7 @@ function _couleur_hex_to_dec($couleur) { /** * Donne un statut au fichier-image intermédiaire servant au traitement d'image * selon qu'il doit être gravé (fichier .src) ou pas. - * + * * Un appel PHP direct aux fonctions de filtre d'image produira ainsi une image * permanente (gravée) ; un appel généré par le compilateur via * `filtrer('image_xx, ...)` effacera automatiquement le fichier-image temporaire. @@ -78,16 +86,18 @@ function _couleur_hex_to_dec($couleur) { * @return bool * true si il faut supprimer le fichier temporaire ; false sinon. */ -function statut_effacer_images_temporaires($stat){ +function statut_effacer_images_temporaires($stat) { static $statut = false; // par defaut on grave toute les images - if ($stat==='get') return $statut; - $statut = $stat?true:false; + if ($stat === 'get') { + return $statut; + } + $statut = $stat ? true : false; } /** * Fonctions de traitement d'image - * + * * Uniquement pour GD2. * * @pipeline_appel image_preparer_filtre @@ -98,7 +108,7 @@ function statut_effacer_images_temporaires($stat){ * @uses taille_image() * @uses _image_ratio() * @uses reconstruire_image_intermediaire() - * + * * @param string $img * Chemin de l'image ou balise html `<img src=... />`. * @param string $effet @@ -126,18 +136,19 @@ function statut_effacer_images_temporaires($stat){ * réussi à être copié sur le serveur ; * - array : tableau décrivant de l'image */ -function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_creation = NULL, $find_in_path = false) { +function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_creation = null, $find_in_path = false) { static $images_recalcul = array(); - if (strlen($img)==0) return false; + if (strlen($img) == 0) { + return false; + } $source = trim(extraire_attribut($img, 'src')); - if (strlen($source) < 1){ + if (strlen($source) < 1) { $source = $img; $img = "<img src='$source' />"; - } - # gerer img src="data:....base64" + } # gerer img src="data:....base64" elseif (preg_match('@^data:image/(jpe?g|png|gif);base64,(.*)$@isS', $source, $regs)) { - $local = sous_repertoire(_DIR_VAR,'image-data').md5($regs[2]).'.'.str_replace('jpeg', 'jpg', $regs[1]); + $local = sous_repertoire(_DIR_VAR, 'image-data') . md5($regs[2]) . '.' . str_replace('jpeg', 'jpg', $regs[1]); if (!file_exists($local)) { ecrire_fichier($local, base64_decode($regs[2])); } @@ -149,18 +160,21 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr } // les protocoles web prennent au moins 3 lettres - if (tester_url_absolue($source)){ + if (tester_url_absolue($source)) { include_spip('inc/distant'); $fichier = _DIR_RACINE . copie_locale($source); - if (!$fichier) return ""; - } - else { + if (!$fichier) { + return ""; + } + } else { // enlever le timestamp eventuel - if (strpos($source,"?")!==false) - $source = preg_replace(',[?][0-9]+$,','',$source); - if (strpos($source,"?")!==false - AND strncmp($source,_DIR_IMG,strlen(_DIR_IMG))==0 - AND file_exists($f=preg_replace(',[?].*$,','',$source))){ + if (strpos($source, "?") !== false) { + $source = preg_replace(',[?][0-9]+$,', '', $source); + } + if (strpos($source, "?") !== false + AND strncmp($source, _DIR_IMG, strlen(_DIR_IMG)) == 0 + AND file_exists($f = preg_replace(',[?].*$,', '', $source)) + ) { $source = $f; } $fichier = $source; @@ -170,64 +184,74 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr if (preg_match(",\.(gif|jpe?g|png)($|[?]),i", $fichier, $regs)) { $terminaison = strtolower($regs[1]); $terminaison_dest = $terminaison; - - if ($terminaison == "gif") $terminaison_dest = "png"; + + if ($terminaison == "gif") { + $terminaison_dest = "png"; + } + } + if ($forcer_format !== false) { + $terminaison_dest = $forcer_format; } - if ($forcer_format!==false) $terminaison_dest = $forcer_format; - if (!$terminaison_dest) return false; + if (!$terminaison_dest) { + return false; + } $term_fonction = $terminaison; - if ($term_fonction == "jpg") $term_fonction = "jpeg"; + if ($term_fonction == "jpg") { + $term_fonction = "jpeg"; + } - $nom_fichier = substr($fichier, 0, strlen($fichier) - (strlen($terminaison) + 1)); + $nom_fichier = substr($fichier, 0, strlen($fichier)-(strlen($terminaison)+1)); $fichier_dest = $nom_fichier; - if (($find_in_path AND $f=find_in_path($fichier) AND $fichier=$f) - OR @file_exists($f = $fichier)){ + if (($find_in_path AND $f = find_in_path($fichier) AND $fichier = $f) + OR @file_exists($f = $fichier) + ) { // on passe la balise img a taille image qui exraira les attributs si possible // au lieu de faire un acces disque sur le fichier - list ($ret["hauteur"],$ret["largeur"]) = taille_image($find_in_path?$f:$img); + list ($ret["hauteur"], $ret["largeur"]) = taille_image($find_in_path ? $f : $img); $date_src = @filemtime($f); - } - elseif (@file_exists($f = "$fichier.src") - AND lire_fichier($f,$valeurs) - AND $valeurs=unserialize($valeurs) + } elseif (@file_exists($f = "$fichier.src") + AND lire_fichier($f, $valeurs) + AND $valeurs = unserialize($valeurs) AND isset($valeurs["hauteur_dest"]) - AND isset($valeurs["largeur_dest"])) { + AND isset($valeurs["largeur_dest"]) + ) { $ret["hauteur"] = $valeurs["hauteur_dest"]; $ret["largeur"] = $valeurs["largeur_dest"]; $date_src = $valeurs["date"]; - } - // pas de fichier source par la - else + } // pas de fichier source par la + else { return false; + } // pas de taille mesurable - if (!($ret["hauteur"] OR $ret["largeur"])) + if (!($ret["hauteur"] OR $ret["largeur"])) { return false; - + } + // cas general : // on a un dossier cache commun et un nom de fichier qui varie avec l'effet // cas particulier de reduire : // un cache par dimension, et le nom de fichier est conserve, suffixe par la dimension aussi $cache = "cache-gd2"; - if (substr($effet,0,7)=='reduire') { - list(,$maxWidth,$maxHeight) = explode('-',$effet); - list ($destWidth,$destHeight) = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight); + if (substr($effet, 0, 7) == 'reduire') { + list(, $maxWidth, $maxHeight) = explode('-', $effet); + list ($destWidth, $destHeight) = _image_ratio($ret['largeur'], $ret['hauteur'], $maxWidth, $maxHeight); $ret['largeur_dest'] = $destWidth; $ret['hauteur_dest'] = $destHeight; $effet = "L{$destWidth}xH$destHeight"; $cache = "cache-vignettes"; $fichier_dest = basename($fichier_dest); - if (($ret['largeur']<=$maxWidth)&&($ret['hauteur']<=$maxHeight)){ + if (($ret['largeur'] <= $maxWidth) && ($ret['hauteur'] <= $maxHeight)) { // on garde la terminaison initiale car image simplement copiee // et on postfixe son nom avec un md5 du path $terminaison_dest = $terminaison; - $fichier_dest .= '-'.substr(md5("$fichier"),0,5); + $fichier_dest .= '-' . substr(md5("$fichier"), 0, 5); + } else { + $fichier_dest .= '-' . substr(md5("$fichier-$effet"), 0, 5); } - else - $fichier_dest .= '-'.substr(md5("$fichier-$effet"),0,5); $cache = sous_repertoire(_DIR_VAR, $cache); $cache = sous_repertoire($cache, $effet); # cherche un cache existant @@ -235,38 +259,41 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr if (@file_exists($cache . $fichier_dest . '.' . $fmt)) { $terminaison_dest = $fmt; }*/ - } - else { + } else { $fichier_dest = md5("$fichier-$effet"); $cache = sous_repertoire(_DIR_VAR, $cache); - $cache = sous_repertoire($cache, substr($fichier_dest,0,2)); - $fichier_dest = substr($fichier_dest,2); + $cache = sous_repertoire($cache, substr($fichier_dest, 0, 2)); + $fichier_dest = substr($fichier_dest, 2); } - - $fichier_dest = $cache . $fichier_dest . "." .$terminaison_dest; - - $GLOBALS["images_calculees"][] = $fichier_dest; + + $fichier_dest = $cache . $fichier_dest . "." . $terminaison_dest; + + $GLOBALS["images_calculees"][] = $fichier_dest; $creer = true; // si recalcul des images demande, recalculer chaque image une fois - if (defined('_VAR_IMAGES') AND _VAR_IMAGES AND !isset($images_recalcul[$fichier_dest])){ + if (defined('_VAR_IMAGES') AND _VAR_IMAGES AND !isset($images_recalcul[$fichier_dest])) { $images_recalcul[$fichier_dest] = true; - } - else { - if (@file_exists($f = $fichier_dest)){ - if (filemtime($f)>=$date_src) + } else { + if (@file_exists($f = $fichier_dest)) { + if (filemtime($f) >= $date_src) { $creer = false; - } - else if (@file_exists($f = "$fichier_dest.src") - AND lire_fichier($f,$valeurs) - AND $valeurs=unserialize($valeurs) - AND $valeurs["date"]>=$date_src) + } + } else { + if (@file_exists($f = "$fichier_dest.src") + AND lire_fichier($f, $valeurs) + AND $valeurs = unserialize($valeurs) + AND $valeurs["date"] >= $date_src + ) { $creer = false; + } + } } if ($creer) { if (!@file_exists($fichier)) { if (!@file_exists("$fichier.src")) { spip_log("Image absente : $fichier"); + return false; } # on reconstruit l'image source absente a partir de la chaine des .src @@ -274,13 +301,15 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr } } - if ($creer) - spip_log("filtre image ".($fonction_creation?reset($fonction_creation):'')."[$effet] sur $fichier","images"._LOG_DEBUG); + if ($creer) { + spip_log("filtre image " . ($fonction_creation ? reset($fonction_creation) : '') . "[$effet] sur $fichier", + "images" . _LOG_DEBUG); + } // TODO: si une image png est nommee .jpg, le reconnaitre avec le bon $f - $ret["fonction_imagecreatefrom"] = "_imagecreatefrom".$term_fonction; + $ret["fonction_imagecreatefrom"] = "_imagecreatefrom" . $term_fonction; $ret["fichier"] = $fichier; - $ret["fonction_image"] = "_image_image".$terminaison_dest; + $ret["fonction_image"] = "_image_image" . $terminaison_dest; $ret["fichier_dest"] = $fichier_dest; $ret["format_source"] = ($terminaison != 'jpeg' ? $terminaison : 'jpg'); $ret["format_dest"] = $terminaison_dest; @@ -290,7 +319,7 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr $ret["alt"] = extraire_attribut($img, 'alt'); $ret["style"] = extraire_attribut($img, 'style'); $ret["tag"] = $img; - if ($fonction_creation){ + if ($fonction_creation) { $ret["reconstruction"] = $fonction_creation; # ecrire ici comment creer le fichier, car il est pas sur qu'on l'ecrira reelement # cas de image_reduire qui finalement ne reduit pas l'image source @@ -298,27 +327,31 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr #ecrire_fichier($ret['fichier_dest'].'.src',serialize($ret),true); } - $ret = pipeline('image_preparer_filtre',array( - 'args'=>array( - 'img'=>$img, - 'effet'=>$effet, - 'forcer_format'=>$forcer_format, - 'fonction_creation'=>$fonction_creation, - 'find_in_path'=>$find_in_path, + $ret = pipeline('image_preparer_filtre', array( + 'args' => array( + 'img' => $img, + 'effet' => $effet, + 'forcer_format' => $forcer_format, + 'fonction_creation' => $fonction_creation, + 'find_in_path' => $find_in_path, ), - 'data'=>$ret) + 'data' => $ret + ) ); // une globale pour le debug en cas de crash memoire $GLOBALS["derniere_image_calculee"] = $ret; - if (!function_exists($ret["fonction_imagecreatefrom"])) return false; + if (!function_exists($ret["fonction_imagecreatefrom"])) { + return false; + } + return $ret; } /** * Crée une image depuis un fichier ou une URL - * + * * Utilise les fonctions spécifiques GD. * * @param string $filename @@ -327,19 +360,20 @@ function _image_valeurs_trans($img, $effet, $forcer_format = false, $fonction_cr * @return ressource * Une ressource de type Image GD. */ -function _imagecreatefromjpeg($filename){ +function _imagecreatefromjpeg($filename) { $img = @imagecreatefromjpeg($filename); if (!$img) { - spip_log("Erreur lecture imagecreatefromjpeg $filename",_LOG_CRITIQUE); + spip_log("Erreur lecture imagecreatefromjpeg $filename", _LOG_CRITIQUE); erreur_squelette("Erreur lecture imagecreatefromjpeg $filename"); - $img = imagecreate(10,10); + $img = imagecreate(10, 10); } + return $img; } /** * Crée une image depuis un fichier ou une URL (au format png) - * + * * Utilise les fonctions spécifiques GD. * * @param string $filename @@ -348,19 +382,20 @@ function _imagecreatefromjpeg($filename){ * @return ressource * Une ressource de type Image GD. */ -function _imagecreatefrompng($filename){ +function _imagecreatefrompng($filename) { $img = @imagecreatefrompng($filename); if (!$img) { - spip_log("Erreur lecture imagecreatefrompng $filename",_LOG_CRITIQUE); + spip_log("Erreur lecture imagecreatefrompng $filename", _LOG_CRITIQUE); erreur_squelette("Erreur lecture imagecreatefrompng $filename"); - $img = imagecreate(10,10); + $img = imagecreate(10, 10); } + return $img; } /** * Crée une image depuis un fichier ou une URL (au format gif) - * + * * Utilise les fonctions spécifiques GD. * * @param string $filename @@ -369,19 +404,20 @@ function _imagecreatefrompng($filename){ * @return ressource * Une ressource de type Image GD. */ -function _imagecreatefromgif($filename){ +function _imagecreatefromgif($filename) { $img = @imagecreatefromgif($filename); if (!$img) { - spip_log("Erreur lecture imagecreatefromgif $filename",_LOG_CRITIQUE); + spip_log("Erreur lecture imagecreatefromgif $filename", _LOG_CRITIQUE); erreur_squelette("Erreur lecture imagecreatefromgif $filename"); - $img = imagecreate(10,10); + $img = imagecreate(10, 10); } + return $img; } /** * Affiche ou sauvegarde une image au format PNG - * + * * Utilise les fonctions spécifiques GD. * * @param ressource $img @@ -394,17 +430,23 @@ function _imagecreatefromgif($filename){ * - true si une image est bien retournée. */ function _image_imagepng($img, $fichier) { - if (!function_exists('imagepng')) return false; - $tmp = $fichier.".tmp"; - $ret = imagepng($img,$tmp); - if(file_exists($tmp)){ + if (!function_exists('imagepng')) { + return false; + } + $tmp = $fichier . ".tmp"; + $ret = imagepng($img, $tmp); + if (file_exists($tmp)) { $taille_test = getimagesize($tmp); - if ($taille_test[0] < 1) return false; - + if ($taille_test[0] < 1) { + return false; + } + spip_unlink($fichier); // le fichier peut deja exister @rename($tmp, $fichier); + return $ret; } + return false; } @@ -418,22 +460,28 @@ function _image_imagepng($img, $fichier) { * @param string $fichier * Le path vers l'image (ex : local/cache-vignettes/L180xH51/image.gif). * @return bool - * + * * - false si l'image créée a une largeur nulle ou n'existe pas ; * - true si une image est bien retournée. */ function _image_imagegif($img, $fichier) { - if (!function_exists('imagegif')) return false; - $tmp = $fichier.".tmp"; - $ret = imagegif($img,$tmp); - if(file_exists($tmp)){ + if (!function_exists('imagegif')) { + return false; + } + $tmp = $fichier . ".tmp"; + $ret = imagegif($img, $tmp); + if (file_exists($tmp)) { $taille_test = getimagesize($tmp); - if ($taille_test[0] < 1) return false; - + if ($taille_test[0] < 1) { + return false; + } + spip_unlink($fichier); // le fichier peut deja exister @rename($tmp, $fichier); + return $ret; } + return false; } @@ -452,29 +500,35 @@ function _image_imagegif($img, $fichier) { * valeur (85) de la constante _IMG_GD_QUALITE (modifiable depuis * mes_options.php). * @return bool - * + * * - false si l'image créée a une largeur nulle ou n'existe pas ; * - true si une image est bien retournée. */ function _image_imagejpg($img, $fichier, $qualite = _IMG_GD_QUALITE) { - if (!function_exists('imagejpeg')) return false; - $tmp = $fichier.".tmp"; - $ret = imagejpeg($img,$tmp, $qualite); + if (!function_exists('imagejpeg')) { + return false; + } + $tmp = $fichier . ".tmp"; + $ret = imagejpeg($img, $tmp, $qualite); - if(file_exists($tmp)){ + if (file_exists($tmp)) { $taille_test = getimagesize($tmp); - if ($taille_test[0] < 1) return false; + if ($taille_test[0] < 1) { + return false; + } spip_unlink($fichier); // le fichier peut deja exister @rename($tmp, $fichier); + return $ret; } + return false; } /** * Crée un fichier-image au format ICO - * + * * Utilise les fonctions de la classe phpthumb_functions. * * @uses phpthumb_functions::GD2ICOstring() @@ -494,12 +548,12 @@ function _image_imageico($img, $fichier) { /** * Finalise le traitement GD - * + * * Crée un fichier_image temporaire .src ou vérifie que le fichier_image * définitif a bien été créé. * * @uses statut_effacer_images_temporaires() - * + * * @param ressource $img * Une ressource de type Image GD. * @param array $valeurs @@ -515,25 +569,27 @@ function _image_imageico($img, $fichier) { * - true si le traitement GD s'est bien finalisé ; * - false sinon. */ -function _image_gd_output($img, $valeurs, $qualite = _IMG_GD_QUALITE){ - $fonction = "_image_image".$valeurs['format_dest']; +function _image_gd_output($img, $valeurs, $qualite = _IMG_GD_QUALITE) { + $fonction = "_image_image" . $valeurs['format_dest']; $ret = false; #un flag pour reperer les images gravees - $lock = + $lock = !statut_effacer_images_temporaires('get') // si la fonction n'a pas ete activee, on grave tout - OR (@file_exists($valeurs['fichier_dest']) AND !@file_exists($valeurs['fichier_dest'].'.src')); + OR (@file_exists($valeurs['fichier_dest']) AND !@file_exists($valeurs['fichier_dest'] . '.src')); if ( - function_exists($fonction) - && ($ret = $fonction($img,$valeurs['fichier_dest'],$qualite)) # on a reussi a creer l'image - && isset($valeurs['reconstruction']) # et on sait comment la resonctruire le cas echeant - && !$lock - ) - if (@file_exists($valeurs['fichier_dest'])){ + function_exists($fonction) + && ($ret = $fonction($img, $valeurs['fichier_dest'], $qualite)) # on a reussi a creer l'image + && isset($valeurs['reconstruction']) # et on sait comment la resonctruire le cas echeant + && !$lock + ) { + if (@file_exists($valeurs['fichier_dest'])) { // dans tous les cas mettre a jour la taille de l'image finale - list ($valeurs["hauteur_dest"],$valeurs["largeur_dest"]) = taille_image($valeurs['fichier_dest']); + list ($valeurs["hauteur_dest"], $valeurs["largeur_dest"]) = taille_image($valeurs['fichier_dest']); $valeurs['date'] = @filemtime($valeurs['fichier_dest']); // pour la retrouver apres disparition - ecrire_fichier($valeurs['fichier_dest'].'.src',serialize($valeurs),true); + ecrire_fichier($valeurs['fichier_dest'] . '.src', serialize($valeurs), true); } + } + return $ret; } @@ -542,23 +598,23 @@ function _image_gd_output($img, $valeurs, $qualite = _IMG_GD_QUALITE){ * construction * * @uses ramasse_miettes() - * + * * @param string $fichier_manquant * Chemin vers le fichier manquant -**/ -function reconstruire_image_intermediaire($fichier_manquant){ + **/ +function reconstruire_image_intermediaire($fichier_manquant) { $reconstruire = array(); $fichier = $fichier_manquant; while ( !@file_exists($fichier) - AND lire_fichier($src = "$fichier.src",$source) - AND $valeurs=unserialize($source) - AND ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...) - ) { - spip_unlink($src); // si jamais on a un timeout pendant la reconstruction, elle se fera naturellement au hit suivant - $reconstruire[] = $valeurs['reconstruction']; - } - while (count($reconstruire)){ + AND lire_fichier($src = "$fichier.src", $source) + AND $valeurs = unserialize($source) + AND ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...) + ) { + spip_unlink($src); // si jamais on a un timeout pendant la reconstruction, elle se fera naturellement au hit suivant + $reconstruire[] = $valeurs['reconstruction']; + } + while (count($reconstruire)) { $r = array_pop($reconstruire); $fonction = $r[0]; $args = $r[1]; @@ -574,27 +630,31 @@ function reconstruire_image_intermediaire($fichier_manquant){ * * Permet de rendre une image définitive et de supprimer les images * intermédiaires à son calcul. - * + * * Supprime le fichier de contrôle de l’image cible (le $fichier.src) * ce qui indique que l'image est définitive. - * + * * Remonte ensuite la chaîne des fichiers de contrôle pour supprimer * les images temporaires (mais laisse les fichiers de contrôle permettant * de les reconstruire). * * @param string $fichier * Chemin du fichier d'image calculé -**/ -function ramasse_miettes($fichier){ - if (!lire_fichier($src = "$fichier.src",$source) - OR !$valeurs=unserialize($source)) return; + **/ +function ramasse_miettes($fichier) { + if (!lire_fichier($src = "$fichier.src", $source) + OR !$valeurs = unserialize($source) + ) { + return; + } spip_unlink($src); # on supprime la reference a sa source pour marquer cette image comme non intermediaire while ( - ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...) - AND (substr($fichier,0,strlen(_DIR_VAR))==_DIR_VAR) # et est dans local - AND (lire_fichier($src = "$fichier.src",$source)) # le fichier a une source connue (c'est donc une image calculee intermediaire) - AND ($valeurs=unserialize($source)) # et valide - ) { + ($fichier = $valeurs['fichier']) # l'origine est connue (on ne verifie pas son existence, qu'importe ...) + AND (substr($fichier, 0, strlen(_DIR_VAR)) == _DIR_VAR) # et est dans local + AND (lire_fichier($src = "$fichier.src", + $source)) # le fichier a une source connue (c'est donc une image calculee intermediaire) + AND ($valeurs = unserialize($source)) # et valide + ) { # on efface le fichier spip_unlink($fichier); # mais laisse le .src qui permet de savoir comment reconstruire l'image si besoin @@ -604,11 +664,11 @@ function ramasse_miettes($fichier){ /** - * Clôture une série de filtres d'images + * Clôture une série de filtres d'images * * Ce filtre est automatiquement appelé à la fin d'une série de filtres * d'images dans un squelette. - * + * * @filtre * @uses reconstruire_image_intermediaire() * Si l'image finale a déjà été supprimée car considérée comme temporaire @@ -617,29 +677,32 @@ function ramasse_miettes($fichier){ * Pour déclarer l'image définitive et nettoyer les images intermédiaires. * * @pipeline_appel post_image_filtrer - * + * * @param string $img * Code HTML de l'image * @return string * Code HTML de l'image -**/ -function image_graver($img){ + **/ +function image_graver($img) { // appeler le filtre post_image_filtrer qui permet de faire // des traitements auto a la fin d'une serie de filtres - $img = pipeline('post_image_filtrer',$img); + $img = pipeline('post_image_filtrer', $img); $fichier_ori = $fichier = extraire_attribut($img, 'src'); - if (($p=strpos($fichier,'?'))!==false) - $fichier=substr($fichier,0,$p); - if (strlen($fichier) < 1) + if (($p = strpos($fichier, '?')) !== false) { + $fichier = substr($fichier, 0, $p); + } + if (strlen($fichier) < 1) { $fichier = $img; + } # si jamais le fichier final n'a pas ete calcule car suppose temporaire - if (!@file_exists($fichier)) + if (!@file_exists($fichier)) { reconstruire_image_intermediaire($fichier); + } ramasse_miettes($fichier); // ajouter le timestamp si besoin - if (strpos($fichier_ori,"?")===false){ + if (strpos($fichier_ori, "?") === false) { // on utilise str_replace pour attraper le onmouseover des logo si besoin $img = str_replace($fichier_ori, timestamp($fichier_ori), $img); } @@ -649,52 +712,55 @@ function image_graver($img){ if (!function_exists("imagepalettetotruecolor")) { -/** - * Transforme une image à palette indexée (256 couleurs max) en "vraies" couleurs RGB - * - * @note Pour compatibilité avec PHP < 5.5 - * - * @link http://php.net/manual/fr/function.imagepalettetotruecolor.php - * - * @param ressource $img - * @return bool - * - true si l'image est déjà en vrai RGB ou peut être transformée - * - false si la transformation ne peut être faite. -**/ -function imagepalettetotruecolor(&$img) { - if (!$img OR !function_exists('imagecreatetruecolor')) { - return false; - } elseif (!imageistruecolor($img)) { - $w = imagesx($img); - $h = imagesy($img); - $img1 = imagecreatetruecolor($w,$h); - //Conserver la transparence si possible - if(function_exists('ImageCopyResampled')) { - if (function_exists("imageAntiAlias")) imageAntiAlias($img1,true); - @imagealphablending($img1, false); - @imagesavealpha($img1,true); - @ImageCopyResampled($img1, $img, 0, 0, 0, 0, $w, $h, $w, $h); - } else { - imagecopy($img1,$img,0,0,0,0,$w,$h); + /** + * Transforme une image à palette indexée (256 couleurs max) en "vraies" couleurs RGB + * + * @note Pour compatibilité avec PHP < 5.5 + * + * @link http://php.net/manual/fr/function.imagepalettetotruecolor.php + * + * @param ressource $img + * @return bool + * - true si l'image est déjà en vrai RGB ou peut être transformée + * - false si la transformation ne peut être faite. + **/ + function imagepalettetotruecolor(&$img) { + if (!$img OR !function_exists('imagecreatetruecolor')) { + return false; + } elseif (!imageistruecolor($img)) { + $w = imagesx($img); + $h = imagesy($img); + $img1 = imagecreatetruecolor($w, $h); + //Conserver la transparence si possible + if (function_exists('ImageCopyResampled')) { + if (function_exists("imageAntiAlias")) { + imageAntiAlias($img1, true); + } + @imagealphablending($img1, false); + @imagesavealpha($img1, true); + @ImageCopyResampled($img1, $img, 0, 0, 0, 0, $w, $h, $w, $h); + } else { + imagecopy($img1, $img, 0, 0, 0, 0, $w, $h); + } + + $img = $img1; } - $img = $img1; + return true; } - return true; - } } /** * Applique des attributs de taille (width, height) à une balise HTML * * Utilisé avec des balises `<img>` tout particulièrement. - * + * * Modifie l'attribut style s'il était renseigné, en enlevant les * informations éventuelles width / height dedans. * * @uses extraire_attribut() * @uses inserer_attribut() - * + * * @param string $tag * Code html de la balise * @param int $width @@ -706,28 +772,33 @@ function imagepalettetotruecolor(&$img) { * False extrait celui présent dans la balise * @return string * Code html modifié de la balise. -**/ -function _image_tag_changer_taille($tag, $width, $height, $style = false){ - if ($style===false) $style = extraire_attribut($tag, 'style'); + **/ +function _image_tag_changer_taille($tag, $width, $height, $style = false) { + if ($style === false) { + $style = extraire_attribut($tag, 'style'); + } // enlever le width et height du style - $style = preg_replace(",(^|;)\s*(width|height)\s*:\s*[^;]+,ims","",$style); - if ($style AND $style{0}==';') $style=substr($style,1); + $style = preg_replace(",(^|;)\s*(width|height)\s*:\s*[^;]+,ims", "", $style); + if ($style AND $style{0} == ';') { + $style = substr($style, 1); + } // mettre des attributs de width et height sur les images, // ca accelere le rendu du navigateur // ca permet aux navigateurs de reserver la bonne taille // quand on a desactive l'affichage des images. - $tag = inserer_attribut($tag,'width',$width); - $tag = inserer_attribut($tag,'height',$height); + $tag = inserer_attribut($tag, 'width', $width); + $tag = inserer_attribut($tag, 'height', $height); // attributs deprecies. Transformer en CSS - if ($espace = extraire_attribut($tag, 'hspace')){ - $style = "margin:${espace}px;".$style; - $tag = inserer_attribut($tag,'hspace',''); + if ($espace = extraire_attribut($tag, 'hspace')) { + $style = "margin:${espace}px;" . $style; + $tag = inserer_attribut($tag, 'hspace', ''); } - $tag = inserer_attribut($tag,'style',$style, true, $style ? false : true); + $tag = inserer_attribut($tag, 'style', $style, true, $style ? false : true); + return $tag; } @@ -739,12 +810,12 @@ function _image_tag_changer_taille($tag, $width, $height, $style = false){ * * @pipeline_appel image_ecrire_tag_preparer * @pipeline_appel image_ecrire_tag_finir - * + * * @uses _image_tag_changer_taille() * @uses extraire_attribut() * @uses inserer_attribut() - * @see _image_valeurs_trans() - * + * @see _image_valeurs_trans() + * * @param array $valeurs * Description de l'image tel que retourné par `_image_valeurs_trans()` * @param array $surcharge @@ -752,58 +823,58 @@ function _image_tag_changer_taille($tag, $width, $height, $style = false){ * tel que 'style', 'width', 'height' * @return string * Retourne le code HTML de l'image -**/ -function _image_ecrire_tag($valeurs, $surcharge = array()){ + **/ +function _image_ecrire_tag($valeurs, $surcharge = array()) { $valeurs = pipeline('image_ecrire_tag_preparer', $valeurs); // fermer les tags img pas bien fermes; - $tag = str_replace(">", "/>", str_replace("/>", ">", $valeurs['tag'])); + $tag = str_replace(">", "/>", str_replace("/>", ">", $valeurs['tag'])); // le style $style = $valeurs['style']; - if (isset($surcharge['style'])){ + if (isset($surcharge['style'])) { $style = $surcharge['style']; unset($surcharge['style']); } // traiter specifiquement la largeur et la hauteur $width = $valeurs['largeur']; - if (isset($surcharge['width'])){ + if (isset($surcharge['width'])) { $width = $surcharge['width']; unset($surcharge['width']); } $height = $valeurs['hauteur']; - if (isset($surcharge['height'])){ + if (isset($surcharge['height'])) { $height = $surcharge['height']; unset($surcharge['height']); } - $tag = _image_tag_changer_taille($tag,$width,$height,$style); + $tag = _image_tag_changer_taille($tag, $width, $height, $style); // traiter specifiquement le src qui peut etre repris dans un onmouseout // on remplace toute les ref a src dans le tag - $src = extraire_attribut($tag,'src'); - if (isset($surcharge['src'])){ + $src = extraire_attribut($tag, 'src'); + if (isset($surcharge['src'])) { $tag = str_replace($src, $surcharge['src'], $tag); // si il y a des & dans src, alors ils peuvent provenir d'un & // pas garanti comme methode, mais mieux que rien - if (strpos($src,'&') !== false) { - $tag = str_replace(str_replace("&","&",$src),$surcharge['src'],$tag); + if (strpos($src, '&') !== false) { + $tag = str_replace(str_replace("&", "&", $src), $surcharge['src'], $tag); } $src = $surcharge['src']; unset($surcharge['src']); } $class = $valeurs['class']; - if (isset($surcharge['class'])){ + if (isset($surcharge['class'])) { $class = $surcharge['class']; unset($surcharge['class']); } if (strlen($class)) { - $tag = inserer_attribut($tag,'class',$class); + $tag = inserer_attribut($tag, 'class', $class); } if (count($surcharge)) { - foreach($surcharge as $attribut => $valeur) { + foreach ($surcharge as $attribut => $valeur) { $tag = inserer_attribut($tag, $attribut, $valeur); } } @@ -824,9 +895,9 @@ function _image_ecrire_tag($valeurs, $surcharge = array()){ /** * Crée si possible une miniature d'une image * - * @see _image_valeurs_trans() + * @see _image_valeurs_trans() * @uses _image_ratio() - * + * * @param array $valeurs * Description de l'image, telle que retournée par `_image_valeurs_trans()` * @param int $maxWidth @@ -839,14 +910,14 @@ function _image_ecrire_tag($valeurs, $surcharge = array()){ * @param bool $force * @return array|null * Description de l'image, sinon null. -**/ + **/ function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process = 'AUTO', $force = false) { // ordre de preference des formats graphiques pour creer les vignettes // le premier format disponible, selon la methode demandee, est utilise $image = $valeurs['fichier']; $format = $valeurs['format_source']; $destdir = dirname($valeurs['fichier_dest']); - $destfile = basename($valeurs['fichier_dest'],".".$valeurs["format_dest"]); + $destfile = basename($valeurs['fichier_dest'], "." . $valeurs["format_dest"]); $format_sortie = $valeurs['format_dest']; @@ -856,38 +927,40 @@ function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process = 'AUTO // liste des formats qu'on sait lire $img = isset($GLOBALS['meta']['formats_graphiques']) - ? (strpos($GLOBALS['meta']['formats_graphiques'], $format)!==false) - : false; + ? (strpos($GLOBALS['meta']['formats_graphiques'], $format) !== false) + : false; // si le doc n'est pas une image, refuser - if (!$force AND !$img) return; + if (!$force AND !$img) { + return; + } $destination = "$destdir/$destfile"; // calculer la taille - if (($srcWidth=$valeurs['largeur']) && ($srcHeight=$valeurs['hauteur'])) { - if (!($destWidth=$valeurs['largeur_dest']) || !($destHeight=$valeurs['hauteur_dest'])) { - list ($destWidth,$destHeight) = _image_ratio($valeurs['largeur'], $valeurs['hauteur'], $maxWidth, $maxHeight); + if (($srcWidth = $valeurs['largeur']) && ($srcHeight = $valeurs['hauteur'])) { + if (!($destWidth = $valeurs['largeur_dest']) || !($destHeight = $valeurs['hauteur_dest'])) { + list ($destWidth, $destHeight) = _image_ratio($valeurs['largeur'], $valeurs['hauteur'], $maxWidth, $maxHeight); } - } - elseif ($process == 'convert' OR $process == 'imagick') { + } elseif ($process == 'convert' OR $process == 'imagick') { $destWidth = $maxWidth; $destHeight = $maxHeight; } else { spip_log("echec $process sur $image"); + return; } // Si l'image est de la taille demandee (ou plus petite), simplement la retourner if ($srcWidth AND $srcWidth <= $maxWidth AND $srcHeight <= $maxHeight) { - $vignette = $destination.'.'.$format; + $vignette = $destination . '.' . $format; @copy($image, $vignette); - } - - // imagemagick en ligne de commande + } // imagemagick en ligne de commande elseif ($process == 'convert') { - if (!defined('_CONVERT_COMMAND')) define('_CONVERT_COMMAND', 'convert'); // Securite : mes_options.php peut preciser le chemin absolu - define ('_RESIZE_COMMAND', _CONVERT_COMMAND.' -quality '._IMG_CONVERT_QUALITE.' -resize %xx%y! %src %dest'); - $vignette = $destination.".".$format_sortie; + if (!defined('_CONVERT_COMMAND')) { + define('_CONVERT_COMMAND', 'convert'); + } // Securite : mes_options.php peut preciser le chemin absolu + define('_RESIZE_COMMAND', _CONVERT_COMMAND . ' -quality ' . _IMG_CONVERT_QUALITE . ' -resize %xx%y! %src %dest'); + $vignette = $destination . "." . $format_sortie; $commande = str_replace( array('%x', '%y', '%src', '%dest'), array( @@ -901,90 +974,107 @@ function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process = 'AUTO exec($commande); if (!@file_exists($vignette)) { spip_log("echec convert sur $vignette"); - return; // echec commande - } - } - // php5 imagemagick + return; // echec commande + } + } // php5 imagemagick elseif ($process == 'imagick') { - $vignette = "$destination.".$format_sortie; + $vignette = "$destination." . $format_sortie; if (!class_exists('Imagick')) { spip_log("Classe Imagick absente !", _LOG_ERREUR); + return; } $imagick = new Imagick(); $imagick->readImage($image); - $imagick->resizeImage($destWidth, $destHeight, Imagick::FILTER_LANCZOS, 1 );//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100); + $imagick->resizeImage($destWidth, $destHeight, Imagick::FILTER_LANCZOS, + 1);//, IMAGICK_FILTER_LANCZOS, _IMG_IMAGICK_QUALITE / 100); $imagick->writeImage($vignette); if (!@file_exists($vignette)) { spip_log("echec imagick sur $vignette"); + return; } - } - - // netpbm + } // netpbm elseif ($process == "netpbm") { - if (!defined('_PNMSCALE_COMMAND')) define('_PNMSCALE_COMMAND', 'pnmscale'); // Securite : mes_options.php peut preciser le chemin absolu - if (_PNMSCALE_COMMAND == '') return; - $vignette = $destination.".".$format_sortie; + if (!defined('_PNMSCALE_COMMAND')) { + define('_PNMSCALE_COMMAND', 'pnmscale'); + } // Securite : mes_options.php peut preciser le chemin absolu + if (_PNMSCALE_COMMAND == '') { + return; + } + $vignette = $destination . "." . $format_sortie; $pnmtojpeg_command = str_replace("pnmscale", "pnmtojpeg", _PNMSCALE_COMMAND); if ($format == "jpg") { - + $jpegtopnm_command = str_replace("pnmscale", "jpegtopnm", _PNMSCALE_COMMAND); - exec("$jpegtopnm_command $image | "._PNMSCALE_COMMAND." -width $destWidth | $pnmtojpeg_command > $vignette"); - if (!($s = @filesize($vignette))) + exec("$jpegtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette"); + if (!($s = @filesize($vignette))) { spip_unlink($vignette); - if (!@file_exists($vignette)) { - spip_log("echec netpbm-jpg sur $vignette"); - return; } - } else if ($format == "gif") { - $giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND); - exec("$giftopnm_command $image | "._PNMSCALE_COMMAND." -width $destWidth | $pnmtojpeg_command > $vignette"); - if (!($s = @filesize($vignette))) - spip_unlink($vignette); if (!@file_exists($vignette)) { - spip_log("echec netpbm-gif sur $vignette"); + spip_log("echec netpbm-jpg sur $vignette"); + return; } - } else if ($format == "png") { - $pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND); - exec("$pngtopnm_command $image | "._PNMSCALE_COMMAND." -width $destWidth | $pnmtojpeg_command > $vignette"); - if (!($s = @filesize($vignette))) - spip_unlink($vignette); - if (!@file_exists($vignette)) { - spip_log("echec netpbm-png sur $vignette"); - return; + } else { + if ($format == "gif") { + $giftopnm_command = str_replace("pnmscale", "giftopnm", _PNMSCALE_COMMAND); + exec("$giftopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette"); + if (!($s = @filesize($vignette))) { + spip_unlink($vignette); + } + if (!@file_exists($vignette)) { + spip_log("echec netpbm-gif sur $vignette"); + + return; + } + } else { + if ($format == "png") { + $pngtopnm_command = str_replace("pnmscale", "pngtopnm", _PNMSCALE_COMMAND); + exec("$pngtopnm_command $image | " . _PNMSCALE_COMMAND . " -width $destWidth | $pnmtojpeg_command > $vignette"); + if (!($s = @filesize($vignette))) { + spip_unlink($vignette); + } + if (!@file_exists($vignette)) { + spip_log("echec netpbm-png sur $vignette"); + + return; + } + } } } - } - - // gd ou gd2 + } // gd ou gd2 elseif ($process == 'gd1' OR $process == 'gd2') { if (!function_exists('gd_info')) { spip_log("Librairie GD absente !", _LOG_ERREUR); + return; } - if (_IMG_GD_MAX_PIXELS && $srcWidth*$srcHeight>_IMG_GD_MAX_PIXELS){ - spip_log("vignette gd1/gd2 impossible : ".$srcWidth*$srcHeight."pixels"); + if (_IMG_GD_MAX_PIXELS && $srcWidth*$srcHeight > _IMG_GD_MAX_PIXELS) { + spip_log("vignette gd1/gd2 impossible : " . $srcWidth*$srcHeight . "pixels"); + return; } $destFormat = $format_sortie; if (!$destFormat) { spip_log("pas de format pour $image"); + return; } $fonction_imagecreatefrom = $valeurs['fonction_imagecreatefrom']; - if (!function_exists($fonction_imagecreatefrom)) + if (!function_exists($fonction_imagecreatefrom)) { return ''; + } $srcImage = @$fonction_imagecreatefrom($image); - if (!$srcImage) { - spip_log("echec gd1/gd2"); - return; - } + if (!$srcImage) { + spip_log("echec gd1/gd2"); + + return; + } // Initialisation de l'image destination $destImage = null; @@ -996,40 +1086,50 @@ function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process = 'AUTO } // Recopie de l'image d'origine avec adaptation de la taille - $ok = false; - if (($process == 'gd2') AND function_exists('ImageCopyResampled')) { - if ($format == "gif") { + $ok = false; + if (($process == 'gd2') AND function_exists('ImageCopyResampled')) { + if ($format == "gif") { // Si un GIF est transparent, // fabriquer un PNG transparent - $transp = imagecolortransparent($srcImage); - if ($transp > 0) $destFormat = "png"; + $transp = imagecolortransparent($srcImage); + if ($transp > 0) { + $destFormat = "png"; + } } - if ($destFormat == "png") { + if ($destFormat == "png") { // Conserver la transparence - if (function_exists("imageAntiAlias")) imageAntiAlias($destImage,true); - @imagealphablending($destImage, false); - @imagesavealpha($destImage,true); + if (function_exists("imageAntiAlias")) { + imageAntiAlias($destImage, true); + } + @imagealphablending($destImage, false); + @imagesavealpha($destImage, true); } $ok = @ImageCopyResampled($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); } - if (!$ok) + if (!$ok) { $ok = ImageCopyResized($destImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight); + } // Sauvegarde de l'image destination $valeurs['fichier_dest'] = $vignette = "$destination.$destFormat"; $valeurs['format_dest'] = $format = $destFormat; - _image_gd_output($destImage,$valeurs); + _image_gd_output($destImage, $valeurs); - if ($srcImage) + if ($srcImage) { ImageDestroy($srcImage); + } ImageDestroy($destImage); } $size = @getimagesize($vignette); // Gaffe: en safe mode, pas d'acces a la vignette, // donc risque de balancer "width='0'", ce qui masque l'image sous MSIE - if ($size[0] < 1) $size[0] = $destWidth; - if ($size[1] < 1) $size[1] = $destHeight; + if ($size[0] < 1) { + $size[0] = $destWidth; + } + if ($size[1] < 1) { + $size[1] = $destHeight; + } $retour['width'] = $largeur = $size[0]; $retour['height'] = $hauteur = $size[1]; @@ -1051,30 +1151,33 @@ function _image_creer_vignette($valeurs, $maxWidth, $maxHeight, $process = 'AUTO * * @example `image_ratio(1000, 1000, 100, 10)` donne `array(10, 10, 100)` * @see ratio_passe_partout() Assez proche. - * - * @param int $srcWidth Largeur de l'image source + * + * @param int $srcWidth Largeur de l'image source * @param int $srcHeight Hauteur de l'image source - * @param int $maxWidth Largeur maximum souhaitée + * @param int $maxWidth Largeur maximum souhaitée * @param int $maxHeight Hauteur maximum souhaitée * @return array Liste [ largeur, hauteur, ratio de réduction ] -**/ + **/ function _image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight) { $ratioWidth = $srcWidth/$maxWidth; $ratioHeight = $srcHeight/$maxHeight; - if ($ratioWidth <=1 AND $ratioHeight <=1) { + if ($ratioWidth <= 1 AND $ratioHeight <= 1) { $destWidth = $srcWidth; $destHeight = $srcHeight; } elseif ($ratioWidth < $ratioHeight) { $destWidth = $srcWidth/$ratioHeight; $destHeight = $maxHeight; - } - else { + } else { $destWidth = $maxWidth; $destHeight = $srcHeight/$ratioWidth; } - return array (ceil($destWidth), ceil($destHeight), - max($ratioWidth, $ratioHeight)); + + return array( + ceil($destWidth), + ceil($destHeight), + max($ratioWidth, $ratioHeight) + ); } /** @@ -1087,35 +1190,38 @@ function _image_ratio($srcWidth, $srcHeight, $maxWidth, $maxHeight) { * @example `ratio_passe_partout(1000, 1000, 100, 10)` donne `array(100, 100, 10)` * @see _image_ratio() Assez proche. * - * @param int $srcWidth Largeur de l'image source + * @param int $srcWidth Largeur de l'image source * @param int $srcHeight Hauteur de l'image source - * @param int $maxWidth Largeur maximum souhaitée + * @param int $maxWidth Largeur maximum souhaitée * @param int $maxHeight Hauteur maximum souhaitée * @return array Liste [ largeur, hauteur, ratio de réduction ] -**/ + **/ function ratio_passe_partout($srcWidth, $srcHeight, $maxWidth, $maxHeight) { $ratioWidth = $srcWidth/$maxWidth; $ratioHeight = $srcHeight/$maxHeight; - if ($ratioWidth <=1 AND $ratioHeight <=1) { + if ($ratioWidth <= 1 AND $ratioHeight <= 1) { $destWidth = $srcWidth; $destHeight = $srcHeight; } elseif ($ratioWidth > $ratioHeight) { $destWidth = $srcWidth/$ratioHeight; $destHeight = $maxHeight; - } - else { + } else { $destWidth = $maxWidth; $destHeight = $srcHeight/$ratioWidth; } - return array (ceil($destWidth), ceil($destHeight), - min($ratioWidth, $ratioHeight)); + + return array( + ceil($destWidth), + ceil($destHeight), + min($ratioWidth, $ratioHeight) + ); } /** * Réduit une image - * + * * @uses extraire_attribut() * @uses inserer_attribut() * @uses _image_valeurs_trans() @@ -1123,7 +1229,7 @@ function ratio_passe_partout($srcWidth, $srcHeight, $maxWidth, $maxHeight) { * @uses _image_tag_changer_taille() * @uses _image_ecrire_tag() * @uses _image_creer_vignette() - * + * * @param array $fonction * Un tableau à 2 éléments : * 1) string : indique le nom du filtre de traitement demandé (par exemple : `image_reduire`) ; @@ -1142,7 +1248,7 @@ function ratio_passe_partout($srcWidth, $srcHeight, $maxWidth, $maxHeight) { * AUTO utilise la librairie sélectionnée dans la configuration. * @return string * Code HTML de la balise img produite -**/ + **/ function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $cherche_image, $process = 'AUTO') { $image = false; if (($process == 'AUTO') AND isset($GLOBALS['meta']['image_process'])) { @@ -1156,15 +1262,18 @@ function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $che $image = _image_valeurs_trans($img, "reduire-{$taille}-{$taille_y}", $format_sortie, $fonction); // on verifie que l'extension choisie est bonne (en principe oui) - $gd_formats = explode(',',$GLOBALS['meta']["gd_formats"]); + $gd_formats = explode(',', $GLOBALS['meta']["gd_formats"]); if (is_array($image) - AND ( !in_array($image['format_dest'],$gd_formats) - OR ($image['format_dest']=='gif' AND !function_exists('ImageGif')) - )) { - if ($image['format_source'] == 'jpg') - $formats_sortie = array('jpg','png','gif'); - else // les gif sont passes en png preferentiellement pour etre homogene aux autres filtres images - $formats_sortie = array('png','jpg','gif'); + AND (!in_array($image['format_dest'], $gd_formats) + OR ($image['format_dest'] == 'gif' AND !function_exists('ImageGif')) + ) + ) { + if ($image['format_source'] == 'jpg') { + $formats_sortie = array('jpg', 'png', 'gif'); + } else // les gif sont passes en png preferentiellement pour etre homogene aux autres filtres images + { + $formats_sortie = array('png', 'jpg', 'gif'); + } // Choisir le format destination // - on sauve de preference en JPEG (meilleure compression) // - pour le GIF : les GD recentes peuvent le lire mais pas l'ecrire @@ -1173,8 +1282,9 @@ function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $che $format_sortie = ""; foreach ($formats_sortie as $fmt) { if (in_array($fmt, $gd_formats)) { - if ($fmt <> "gif" OR function_exists('ImageGif')) + if ($fmt <> "gif" OR function_exists('ImageGif')) { $format_sortie = $fmt; + } break; } } @@ -1190,8 +1300,10 @@ function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $che spip_log("image_reduire_src:pas de version locale de $img"); // on peut resizer en mode html si on dispose des elements if ($srcw = extraire_attribut($img, 'width') - AND $srch = extraire_attribut($img, 'height')) { - list($w,$h) = _image_ratio($srcw, $srch, $taille, $taille_y); + AND $srch = extraire_attribut($img, 'height') + ) { + list($w, $h) = _image_ratio($srcw, $srch, $taille, $taille_y); + return _image_tag_changer_taille($img, $w, $h); } // la on n'a pas d'infos sur l'image source... on refile le truc a css @@ -1201,18 +1313,20 @@ function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $che } // si l'image est plus petite que la cible retourner une copie cachee de l'image - if (($image['largeur']<=$taille)&&($image['hauteur']<=$taille_y)){ - if ($image['creer']){ + if (($image['largeur'] <= $taille) && ($image['hauteur'] <= $taille_y)) { + if ($image['creer']) { @copy($image['fichier'], $image['fichier_dest']); } - return _image_ecrire_tag($image, array('src'=>$image['fichier_dest'])); + + return _image_ecrire_tag($image, array('src' => $image['fichier_dest'])); } - if ($image['creer']==false && !$force) { - return _image_ecrire_tag($image, array('src'=>$image['fichier_dest'], 'width'=>$image['largeur_dest'], 'height'=>$image['hauteur_dest'])); + if ($image['creer'] == false && !$force) { + return _image_ecrire_tag($image, + array('src' => $image['fichier_dest'], 'width' => $image['largeur_dest'], 'height' => $image['hauteur_dest'])); } - if (in_array($image["format_source"], array('jpg','gif','png'))){ + if (in_array($image["format_source"], array('jpg', 'gif', 'png'))) { $destWidth = $image['largeur_dest']; $destHeight = $image['hauteur_dest']; $logo = $image['fichier']; @@ -1229,12 +1343,13 @@ function process_image_reduire($fonction, $img, $taille, $taille_y, $force, $che // de l'image, de facon a tromper le cache du navigateur // quand on fait supprimer/reuploader un logo // (pas de filemtime si SAFE MODE) - $date = test_espace_prive() ? ('?'.$date) : ''; - return _image_ecrire_tag($image, array('src'=>"$logo$date", 'width'=>$destWidth, 'height'=>$destHeight)); - } - else - # SVG par exemple ? BMP, tiff ... les redacteurs osent tout! + $date = test_espace_prive() ? ('?' . $date) : ''; + + return _image_ecrire_tag($image, array('src' => "$logo$date", 'width' => $destWidth, 'height' => $destHeight)); + } else # SVG par exemple ? BMP, tiff ... les redacteurs osent tout! + { return $img; + } } /** @@ -1251,7 +1366,7 @@ class phpthumb_functions { /** * Retourne la couleur d'un pixel dans une image - * + * * @param ressource $img * @param int $x * @param int $y @@ -1261,12 +1376,13 @@ class phpthumb_functions { if (!is_resource($img)) { return false; } + return @ImageColorsForIndex($img, @ImageColorAt($img, $x, $y)); } /** * Retourne un nombre dans une représentation en Little Endian - * + * * @param int $number * @param int $minbytes * @return string @@ -1274,41 +1390,42 @@ class phpthumb_functions { public static function LittleEndian2String($number, $minbytes = 1) { $intstring = ''; while ($number > 0) { - $intstring = $intstring.chr($number & 255); + $intstring = $intstring . chr($number & 255); $number >>= 8; } + return str_pad($intstring, $minbytes, "\x00", STR_PAD_RIGHT); } /** * Transforme une ressource GD en image au format ICO - * + * * @param array $gd_image_array * Tableau de ressources d'images GD * @return string - * Image au format ICO + * Image au format ICO */ public static function GD2ICOstring(&$gd_image_array) { foreach ($gd_image_array as $key => $gd_image) { - $ImageWidths[$key] = ImageSX($gd_image); + $ImageWidths[$key] = ImageSX($gd_image); $ImageHeights[$key] = ImageSY($gd_image); - $bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24; - $totalcolors[$key] = ImageColorsTotal($gd_image); + $bpp[$key] = ImageIsTrueColor($gd_image) ? 32 : 24; + $totalcolors[$key] = ImageColorsTotal($gd_image); $icXOR[$key] = ''; - for ($y = $ImageHeights[$key] - 1; $y >= 0; $y--) { + for ($y = $ImageHeights[$key]-1; $y >= 0; $y--) { for ($x = 0; $x < $ImageWidths[$key]; $x++) { $argb = phpthumb_functions::GetPixelColor($gd_image, $x, $y); - $a = round(255 * ((127 - $argb['alpha']) / 127)); + $a = round(255*((127-$argb['alpha'])/127)); $r = $argb['red']; $g = $argb['green']; $b = $argb['blue']; if ($bpp[$key] == 32) { - $icXOR[$key] .= chr($b).chr($g).chr($r).chr($a); + $icXOR[$key] .= chr($b) . chr($g) . chr($r) . chr($a); } elseif ($bpp[$key] == 24) { - $icXOR[$key] .= chr($b).chr($g).chr($r); + $icXOR[$key] .= chr($b) . chr($g) . chr($r); } if ($a < 128) { @@ -1318,7 +1435,7 @@ class phpthumb_functions { } } // mask bits are 32-bit aligned per scanline - while (strlen($icANDmask[$key][$y]) % 32) { + while (strlen($icANDmask[$key][$y])%32) { $icANDmask[$key][$y] .= '0'; } } @@ -1332,46 +1449,48 @@ class phpthumb_functions { } foreach ($gd_image_array as $key => $gd_image) { - $biSizeImage = $ImageWidths[$key] * $ImageHeights[$key] * ($bpp[$key] / 8); + $biSizeImage = $ImageWidths[$key]*$ImageHeights[$key]*($bpp[$key]/8); // BITMAPINFOHEADER - 40 bytes - $BitmapInfoHeader[$key] = ''; - $BitmapInfoHeader[$key] .= "\x28\x00\x00\x00"; // DWORD biSize; - $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4); // LONG biWidth; + $BitmapInfoHeader[$key] = ''; + $BitmapInfoHeader[$key] .= "\x28\x00\x00\x00"; // DWORD biSize; + $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageWidths[$key], 4); // LONG biWidth; // The biHeight member specifies the combined // height of the XOR and AND masks. - $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageHeights[$key] * 2, 4); // LONG biHeight; - $BitmapInfoHeader[$key] .= "\x01\x00"; // WORD biPlanes; - $BitmapInfoHeader[$key] .= chr($bpp[$key])."\x00"; // wBitCount; - $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD biCompression; - $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4); // DWORD biSizeImage; - $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG biXPelsPerMeter; - $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG biYPelsPerMeter; - $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD biClrUsed; - $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD biClrImportant; + $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($ImageHeights[$key]*2, 4); // LONG biHeight; + $BitmapInfoHeader[$key] .= "\x01\x00"; // WORD biPlanes; + $BitmapInfoHeader[$key] .= chr($bpp[$key]) . "\x00"; // wBitCount; + $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD biCompression; + $BitmapInfoHeader[$key] .= phpthumb_functions::LittleEndian2String($biSizeImage, 4); // DWORD biSizeImage; + $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG biXPelsPerMeter; + $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // LONG biYPelsPerMeter; + $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD biClrUsed; + $BitmapInfoHeader[$key] .= "\x00\x00\x00\x00"; // DWORD biClrImportant; } - $icondata = "\x00\x00"; // idReserved; // Reserved (must be 0) - $icondata .= "\x01\x00"; // idType; // Resource Type (1 for icons) + $icondata = "\x00\x00"; // idReserved; // Reserved (must be 0) + $icondata .= "\x01\x00"; // idType; // Resource Type (1 for icons) $icondata .= phpthumb_functions::LittleEndian2String(count($gd_image_array), 2); // idCount; // How many images? - $dwImageOffset = 6 + (count($gd_image_array) * 16); + $dwImageOffset = 6+(count($gd_image_array)*16); foreach ($gd_image_array as $key => $gd_image) { // ICONDIRENTRY idEntries[1]; // An entry for each image (idCount of 'em) - $icondata .= chr($ImageWidths[$key]); // bWidth; // Width, in pixels, of the image - $icondata .= chr($ImageHeights[$key]); // bHeight; // Height, in pixels, of the image - $icondata .= chr($totalcolors[$key]); // bColorCount; // Number of colors in image (0 if >=8bpp) - $icondata .= "\x00"; // bReserved; // Reserved ( must be 0) + $icondata .= chr($ImageWidths[$key]); // bWidth; // Width, in pixels, of the image + $icondata .= chr($ImageHeights[$key]); // bHeight; // Height, in pixels, of the image + $icondata .= chr($totalcolors[$key]); // bColorCount; // Number of colors in image (0 if >=8bpp) + $icondata .= "\x00"; // bReserved; // Reserved ( must be 0) - $icondata .= "\x01\x00"; // wPlanes; // Color Planes - $icondata .= chr($bpp[$key])."\x00"; // wBitCount; // Bits per pixel + $icondata .= "\x01\x00"; // wPlanes; // Color Planes + $icondata .= chr($bpp[$key]) . "\x00"; // wBitCount; // Bits per pixel - $dwBytesInRes = 40 + strlen($icXOR[$key]) + strlen($icAND[$key]); - $icondata .= phpthumb_functions::LittleEndian2String($dwBytesInRes, 4); // dwBytesInRes; // How many bytes in this resource? + $dwBytesInRes = 40+strlen($icXOR[$key])+strlen($icAND[$key]); + $icondata .= phpthumb_functions::LittleEndian2String($dwBytesInRes, + 4); // dwBytesInRes; // How many bytes in this resource? - $icondata .= phpthumb_functions::LittleEndian2String($dwImageOffset, 4); // dwImageOffset; // Where in the file is this image? + $icondata .= phpthumb_functions::LittleEndian2String($dwImageOffset, + 4); // dwImageOffset; // Where in the file is this image? $dwImageOffset += strlen($BitmapInfoHeader[$key]); $dwImageOffset += strlen($icXOR[$key]); $dwImageOffset += strlen($icAND[$key]); diff --git a/ecrire/inc/filtres_images_mini.php b/ecrire/inc/filtres_images_mini.php index 5e648d1062..46a32a1d20 100644 --- a/ecrire/inc/filtres_images_mini.php +++ b/ecrire/inc/filtres_images_mini.php @@ -16,113 +16,136 @@ * * @package SPIP\Core\Filtres\Images */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres_images_lib_mini'); // par precaution /** * Transforme un code couleur textuel (black, white, green...) et code hexadécimal - * + * * @param string $couleur - * Le code couleur textuel + * Le code couleur textuel * @return string - * Le code hexadécimal de la couleur (sans le #) ou le code couleur textuel si non trouvé + * Le code hexadécimal de la couleur (sans le #) ou le code couleur textuel si non trouvé */ -function couleur_html_to_hex($couleur){ - $couleurs_html=array( - 'aqua'=>'00FFFF','black'=>'000000','blue'=>'0000FF','fuchsia'=>'FF00FF','gray'=>'808080','green'=>'008000','lime'=>'00FF00','maroon'=>'800000', - 'navy'=>'000080','olive'=>'808000','purple'=>'800080','red'=>'FF0000','silver'=>'C0C0C0','teal'=>'008080','white'=>'FFFFFF','yellow'=>'FFFF00'); - if (isset($couleurs_html[$lc=strtolower($couleur)])) +function couleur_html_to_hex($couleur) { + $couleurs_html = array( + 'aqua' => '00FFFF', + 'black' => '000000', + 'blue' => '0000FF', + 'fuchsia' => 'FF00FF', + 'gray' => '808080', + 'green' => '008000', + 'lime' => '00FF00', + 'maroon' => '800000', + 'navy' => '000080', + 'olive' => '808000', + 'purple' => '800080', + 'red' => 'FF0000', + 'silver' => 'C0C0C0', + 'teal' => '008080', + 'white' => 'FFFFFF', + 'yellow' => 'FFFF00' + ); + if (isset($couleurs_html[$lc = strtolower($couleur)])) { return $couleurs_html[$lc]; + } + return $couleur; } /** * Rend une couleur (code hexadécimal) plus foncée - * + * * @uses _couleur_hex_to_dec() Pour transformer le code hexadécimal en décimal - * + * * @param string $couleur - * Code hexadécimal d'une couleur + * Code hexadécimal d'une couleur * @param float $coeff - * Coefficient (de 0 à 1) + * Coefficient (de 0 à 1) * @return string - * Code hexadécimal de la couleur plus foncée + * Code hexadécimal de la couleur plus foncée */ -function couleur_foncer ($couleur, $coeff = 0.5) { +function couleur_foncer($couleur, $coeff = 0.5) { $couleurs = _couleur_hex_to_dec($couleur); - $red = $couleurs["red"] - round(($couleurs["red"])*$coeff); - $green = $couleurs["green"] - round(($couleurs["green"])*$coeff); - $blue = $couleurs["blue"] - round(($couleurs["blue"])*$coeff); + $red = $couleurs["red"]-round(($couleurs["red"])*$coeff); + $green = $couleurs["green"]-round(($couleurs["green"])*$coeff); + $blue = $couleurs["blue"]-round(($couleurs["blue"])*$coeff); $couleur = _couleur_dec_to_hex($red, $green, $blue); - + return $couleur; } /** - * Eclaircit une couleur (code hexadécimal) - * + * Eclaircit une couleur (code hexadécimal) + * * @uses _couleur_hex_to_dec() Pour transformer le code hexadécimal en décimal - * + * * @param string $couleur - * Code hexadécimal d'une couleur + * Code hexadécimal d'une couleur * @param float $coeff - * Coefficient (de 0 à 1) + * Coefficient (de 0 à 1) * @return string - * Code hexadécimal de la couleur éclaircie + * Code hexadécimal de la couleur éclaircie */ -function couleur_eclaircir ($couleur, $coeff = 0.5) { +function couleur_eclaircir($couleur, $coeff = 0.5) { $couleurs = _couleur_hex_to_dec($couleur); - $red = $couleurs["red"] + round((255 - $couleurs["red"])*$coeff); - $green = $couleurs["green"] + round((255 - $couleurs["green"])*$coeff); - $blue = $couleurs["blue"] + round((255 - $couleurs["blue"])*$coeff); + $red = $couleurs["red"]+round((255-$couleurs["red"])*$coeff); + $green = $couleurs["green"]+round((255-$couleurs["green"])*$coeff); + $blue = $couleurs["blue"]+round((255-$couleurs["blue"])*$coeff); $couleur = _couleur_dec_to_hex($red, $green, $blue); - + return $couleur; } /** * Selectionne les images qui vont subir une transformation sur un critere de taille - * + * * Les images exclues sont marquees d'une class filtre_inactif qui bloque les filtres suivants * dans la fonction image_filtrer - * + * * @param string $img - * Un tag html `<img src=... />`. + * Un tag html `<img src=... />`. * @param int $width_min - * Largeur minimale de l'image à traiter (0 par défaut) + * Largeur minimale de l'image à traiter (0 par défaut) * @param int $height_min - * Hauteur minimale de l'image à traiter (0 par défaut) + * Hauteur minimale de l'image à traiter (0 par défaut) * @param int $width_max - * Largeur minimale de l'image à traiter (10000 par défaut) + * Largeur minimale de l'image à traiter (10000 par défaut) * @param int $height_max - * Hauteur minimale de l'image à traiter (10000 par défaut) - * @return - * Le tag html `<img src=... />` avec une class `filtre_inactif` ou pas + * Hauteur minimale de l'image à traiter (10000 par défaut) + * @return + * Le tag html `<img src=... />` avec une class `filtre_inactif` ou pas */ -function image_select($img, $width_min = 0, $height_min = 0, $width_max = 10000, $height_max = 1000){ - if (!$img) return $img; - list ($h,$l) = taille_image($img); +function image_select($img, $width_min = 0, $height_min = 0, $width_max = 10000, $height_max = 1000) { + if (!$img) { + return $img; + } + list ($h, $l) = taille_image($img); $select = true; - if ($l<$width_min OR $l>$width_max OR $h<$height_min OR $h>$height_max) + if ($l < $width_min OR $l > $width_max OR $h < $height_min OR $h > $height_max) { $select = false; + } - $class = extraire_attribut($img,'class'); - $p = strpos($class,'filtre_inactif'); - if (($select==false) AND ($p===FALSE)){ + $class = extraire_attribut($img, 'class'); + $p = strpos($class, 'filtre_inactif'); + if (($select == false) AND ($p === false)) { $class .= " filtre_inactif"; - $img = inserer_attribut($img,'class',$class); + $img = inserer_attribut($img, 'class', $class); } - if (($select==true) AND ($p!==FALSE)){ + if (($select == true) AND ($p !== false)) { // no_image_filtrer : historique, a virer - $class = preg_replace(",\s*(filtre_inactif|no_image_filtrer),","",$class); - $img = inserer_attribut($img,'class',$class); + $class = preg_replace(",\s*(filtre_inactif|no_image_filtrer),", "", $class); + $img = inserer_attribut($img, 'class', $class); } + return $img; } @@ -132,7 +155,7 @@ function image_select($img, $width_min = 0, $height_min = 0, $width_max = 10000, * L'image possède un côté réduit dans les dimensions indiquées et * l'autre côté (hauteur ou largeur) de l'image peut être plus grand * que les dimensions du rectangle. - * + * * Alors que image_reduire produit la plus petite image tenant dans un * rectangle, image_passe_partout produit la plus grande image qui * remplit ce rectangle. @@ -146,7 +169,7 @@ function image_select($img, $width_min = 0, $height_min = 0, $width_max = 10000, * * @filtre * @link http://www.spip.net/4562 - * @see image_reduire() + * @see image_reduire() * @uses taille_image() * @uses ratio_passe_partout() * @uses process_image_reduire() @@ -169,30 +192,45 @@ function image_select($img, $width_min = 0, $height_min = 0, $width_max = 10000, * AUTO utilise la librairie sélectionnée dans la configuration. * @return string * Code HTML de l'image ou du texte. -**/ -function image_passe_partout($img, $taille_x = -1, $taille_y = -1, $force = false, $cherche_image = false, $process = 'AUTO'){ - if (!$img) return ''; - list ($hauteur,$largeur) = taille_image($img); - if ($taille_x == -1) - $taille_x = isset($GLOBALS['meta']['taille_preview'])?$GLOBALS['meta']['taille_preview']:150; - if ($taille_y == -1) + **/ +function image_passe_partout( + $img, + $taille_x = -1, + $taille_y = -1, + $force = false, + $cherche_image = false, + $process = 'AUTO' +) { + if (!$img) { + return ''; + } + list ($hauteur, $largeur) = taille_image($img); + if ($taille_x == -1) { + $taille_x = isset($GLOBALS['meta']['taille_preview']) ? $GLOBALS['meta']['taille_preview'] : 150; + } + if ($taille_y == -1) { $taille_y = $taille_x; + } - if ($taille_x == 0 AND $taille_y > 0) - $taille_x = 1; # {0,300} -> c'est 300 qui compte - elseif ($taille_x > 0 AND $taille_y == 0) - $taille_y = 1; # {300,0} -> c'est 300 qui compte - elseif ($taille_x == 0 AND $taille_y == 0) + if ($taille_x == 0 AND $taille_y > 0) { + $taille_x = 1; + } # {0,300} -> c'est 300 qui compte + elseif ($taille_x > 0 AND $taille_y == 0) { + $taille_y = 1; + } # {300,0} -> c'est 300 qui compte + elseif ($taille_x == 0 AND $taille_y == 0) { return ''; + } - list($destWidth, $destHeight, $ratio) = ratio_passe_partout($largeur,$hauteur,$taille_x,$taille_y); + list($destWidth, $destHeight, $ratio) = ratio_passe_partout($largeur, $hauteur, $taille_x, $taille_y); $fonction = array('image_passe_partout', func_get_args()); + return process_image_reduire($fonction, $img, $destWidth, $destHeight, $force, $cherche_image, $process); } /** * Réduit les images à une taille maximale (inscrite dans un rectangle) - * + * * L'image possède un côté dans les dimensions indiquées et * l'autre côté (hauteur ou largeur) de l'image peut être plus petit * que les dimensions du rectangle. @@ -206,8 +244,8 @@ function image_passe_partout($img, $taille_x = -1, $taille_y = -1, $force = fals * ``` * * @filtre - * @see image_reduire_par() - * @see image_passe_partout() + * @see image_reduire_par() + * @see image_passe_partout() * @uses process_image_reduire() * * @param string $img @@ -228,23 +266,29 @@ function image_passe_partout($img, $taille_x = -1, $taille_y = -1, $force = fals * AUTO utilise la librairie sélectionnée dans la configuration. * @return string * Code HTML de l'image ou du texte. -**/ + **/ function image_reduire($img, $taille = -1, $taille_y = -1, $force = false, $cherche_image = false, $process = 'AUTO') { // Determiner la taille x,y maxi // prendre le reglage de previsu par defaut - if ($taille == -1) - $taille = (isset($GLOBALS['meta']['taille_preview']) AND intval($GLOBALS['meta']['taille_preview']))?intval($GLOBALS['meta']['taille_preview']):150; - if ($taille_y == -1) + if ($taille == -1) { + $taille = (isset($GLOBALS['meta']['taille_preview']) AND intval($GLOBALS['meta']['taille_preview'])) ? intval($GLOBALS['meta']['taille_preview']) : 150; + } + if ($taille_y == -1) { $taille_y = $taille; + } - if ($taille == 0 AND $taille_y > 0) - $taille = 10000; # {0,300} -> c'est 300 qui compte - elseif ($taille > 0 AND $taille_y == 0) - $taille_y = 10000; # {300,0} -> c'est 300 qui compte - elseif ($taille == 0 AND $taille_y == 0) + if ($taille == 0 AND $taille_y > 0) { + $taille = 10000; + } # {0,300} -> c'est 300 qui compte + elseif ($taille > 0 AND $taille_y == 0) { + $taille_y = 10000; + } # {300,0} -> c'est 300 qui compte + elseif ($taille == 0 AND $taille_y == 0) { return ''; + } $fonction = array('image_reduire', func_get_args()); + return process_image_reduire($fonction, $img, $taille, $taille_y, $force, $cherche_image, $process); } @@ -262,15 +306,18 @@ function image_reduire($img, $taille = -1, $taille_y = -1, $force = false, $cher * @param bool $force * @return string * Code HTML de l'image ou du texte. -**/ + **/ function image_reduire_par($img, $val = 1, $force = false) { - list ($hauteur,$largeur) = taille_image($img); + list ($hauteur, $largeur) = taille_image($img); $l = round($largeur/$val); $h = round($hauteur/$val); - if ($l > $h) $h = 0; - else $l = 0; + if ($l > $h) { + $h = 0; + } else { + $l = 0; + } $img = image_reduire($img, $l, $h, $force); diff --git a/ecrire/inc/filtres_mime.php b/ecrire/inc/filtres_mime.php index 3da7e4134d..29f0c38aa4 100644 --- a/ecrire/inc/filtres_mime.php +++ b/ecrire/inc/filtres_mime.php @@ -17,11 +17,13 @@ * en utilisant `|appliquer_filtre{#MIME_TYPE}` sur un contenu * * @see appliquer_filtre() - * + * * @package SPIP\Core\Filtres\Mime -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres'); @@ -31,86 +33,87 @@ include_spip('inc/filtres'); * Filtre d'incrustation d'un document image * * Ne fait rien. - * + * * @filtre * @param string $t Contenu * @return string Rien. -**/ -function filtre_image_dist($t) {return '';} + **/ +function filtre_image_dist($t) { return ''; } /** * Filtre d'incrustation d'un document audio * * Ne fait rien. - * + * * @filtre * @param string $t Contenu * @return string Rien. -**/ -function filtre_audio_dist($t) {return '';} + **/ +function filtre_audio_dist($t) { return ''; } /** * Filtre d'incrustation d'un document video * * Ne fait rien. - * + * * @filtre * @param string $t Contenu * @return string Rien. -**/ -function filtre_video_dist($t) {return '';} + **/ +function filtre_video_dist($t) { return ''; } /** * Filtre d'incrustation d'un document application * * Ne fait rien. - * + * * @filtre * @param string $t Contenu * @return string Rien. -**/ -function filtre_application_dist($t) {return '';} + **/ +function filtre_application_dist($t) { return ''; } /** * Filtre d'incrustation d'un document message * * Ne fait rien. - * + * * @filtre * @param string $t Contenu * @return string Rien. -**/ -function filtre_message_dist($t) {return '';} + **/ +function filtre_message_dist($t) { return ''; } /** * Filtre d'incrustation d'un document multipart * * Ne fait rien. - * + * * @filtre * @param string $t Contenu * @return string Rien. -**/ -function filtre_multipart_dist($t) {return '';} + **/ +function filtre_multipart_dist($t) { return ''; } /** * Filtre d'incrustation d'un document test * * Échappe les chevrons et l'esperluette. - * + * * @filtre * @param string $t Contenu * @return string Contenu échappé. -**/ + **/ function filtre_text_dist($t) { static $t1 = array('&', '<', '>'); static $t2 = array('&', '<', '>'); + return '<pre>' . str_replace($t1, $t2, $t) . '</pre>'; } /** * Filtre d'incrustation d'un document CSV - * + * * Produit un joli tableau à partir du texte CSV * * @filtre @@ -118,7 +121,7 @@ function filtre_text_dist($t) { * Texte CSV * @return string * Tableau (formaté en SPIP) -**/ + **/ function filtre_text_csv_dist($t) { include_spip('inc/csv'); list($entete, $lignes, $caption) = analyse_csv($t); @@ -128,12 +131,13 @@ function filtre_text_csv_dist($t) { $corps = join("\n", $lignes) . "\n"; $corps = $caption . "\n|{{" . - join('}}|{{',$entete) . + join('}}|{{', $entete) . "}}|" . "\n|" . - str_replace("\n", "|\n|",$corps); - $corps = str_replace('"#','"',$corps); + str_replace("\n", "|\n|", $corps); + $corps = str_replace('"#', '"', $corps); include_spip('inc/texte'); + return propre($corps); } @@ -142,34 +146,37 @@ function filtre_text_csv_dist($t) { * * Incrustation de HTML, si on est capable de le sécuriser, * sinon, afficher la source - * + * * @filtre * @param string $t Code html * @return string Code html sécurisé ou texte échappé -**/ -function filtre_text_html_dist($t) -{ - if (!preg_match(',^(.*?)<body[^>]*>(.*)</body>,is', $t, $r)) - return appliquer_filtre($t,'text/plain'); + **/ +function filtre_text_html_dist($t) { + if (!preg_match(',^(.*?)<body[^>]*>(.*)</body>,is', $t, $r)) { + return appliquer_filtre($t, 'text/plain'); + } - list(,$h,$t) = $r; + list(, $h, $t) = $r; $style = ''; // recuperer les styles internes - if (preg_match_all(',<style>(.*?)</style>,is', $h, $r, PREG_PATTERN_ORDER)) - $style = join("\n",$r[1]); + if (preg_match_all(',<style>(.*?)</style>,is', $h, $r, PREG_PATTERN_ORDER)) { + $style = join("\n", $r[1]); + } // ... et externes include_spip('inc/distant'); - if (preg_match_all(',<link[^>]+type=.text/css[^>]*>,is', $h, $r, PREG_PATTERN_ORDER)) - foreach($r[0] as $l) { - preg_match("/href='([^']*)'/", str_replace('"',"'",$l), $m); + if (preg_match_all(',<link[^>]+type=.text/css[^>]*>,is', $h, $r, PREG_PATTERN_ORDER)) { + foreach ($r[0] as $l) { + preg_match("/href='([^']*)'/", str_replace('"', "'", $l), $m); $style .= "\n/* $l */\n" - . str_replace('<','',recuperer_page($m[1])); + . str_replace('<', '', recuperer_page($m[1])); } + } // Pourquoi SafeHtml transforme-t-il en texte les scripts dans Body ? - $t = safehtml(preg_replace(',<script'.'.*?</script>,is','',$t)); - return (!$style ? '' : "\n<style>".$style."</style>") . $t; + $t = safehtml(preg_replace(',<script' . '.*?</script>,is', '', $t)); + + return (!$style ? '' : "\n<style>" . $style . "</style>") . $t; } /** @@ -180,14 +187,14 @@ function filtre_text_html_dist($t) * @filtre * @param string $id * @return string Code HTML des balises `<param>` -**/ -function filtre_audio_x_pn_realaudio($id) -{ - return " + **/ +function filtre_audio_x_pn_realaudio($id) { + return " <param name='controls' value='PositionSlider' /> <param name='controls' value='ImageWindow' /> <param name='controls' value='PlayButton' /> <param name='console' value='Console$id' /> <param name='nojava' value='true' />"; } + ?> diff --git a/ecrire/inc/filtres_mini.php b/ecrire/inc/filtres_mini.php index 693f09bf9b..91cc13e96e 100644 --- a/ecrire/inc/filtres_mini.php +++ b/ecrire/inc/filtres_mini.php @@ -14,34 +14,40 @@ * Filtres d'URL et de liens * * @package SPIP\Core\Filtres\Liens -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Nettoyer une URL contenant des `../` * * Inspiré (de loin) par PEAR:NetURL:resolvePath + * * @example * ``` * resolve_path('/.././/truc/chose/machin/./.././.././hopla/..'); * ``` - * + * * @param string $url URL * @return string URL nettoyée -**/ + **/ function resolve_path($url) { list($url, $query) = array_pad(explode('?', $url, 2), 2, null); - while (preg_match(',/\.?/,', $url, $regs) # supprime // et /./ - OR preg_match(',/[^/]*/\.\./,S', $url, $regs) # supprime /toto/../ - OR preg_match(',^/\.\./,S', $url, $regs)) # supprime les /../ du haut + while (preg_match(',/\.?/,', $url, $regs) # supprime // et /./ + OR preg_match(',/[^/]*/\.\./,S', $url, $regs) # supprime /toto/../ + OR preg_match(',^/\.\./,S', $url, $regs)) # supprime les /../ du haut + { $url = str_replace($regs[0], '/', $url); + } - if ($query) - $url .= '?'.$query; + if ($query) { + $url .= '?' . $query; + } - return '/'.preg_replace(',^/,S', '', $url); + return '/' . preg_replace(',^/,S', '', $url); } @@ -59,18 +65,20 @@ function resolve_path($url) { * @param string $url URL de base * @param string $lien Lien ajouté à l'URL * @return string URL complète. -**/ + **/ function suivre_lien($url, $lien) { - if (preg_match(',^(mailto|javascript|data):,iS', $lien)) + if (preg_match(',^(mailto|javascript|data):,iS', $lien)) { return $lien; + } if (preg_match(';^((?:[a-z]{3,7}:)?//.*?)(/.*)?$;iS', $lien, $r)) { $r = array_pad($r, 3, null); - return $r[1].resolve_path($r[2]); + + return $r[1] . resolve_path($r[2]); } # L'url site spip est un lien absolu aussi - if (isset($GLOBALS['meta']['adresse_site']) and $lien == $GLOBALS['meta']['adresse_site']){ + if (isset($GLOBALS['meta']['adresse_site']) and $lien == $GLOBALS['meta']['adresse_site']) { return $lien; } @@ -80,18 +88,18 @@ function suivre_lien($url, $lien) { $debut = $regs[1]; $dir = !strlen($regs[2]) ? '/' : $regs[2]; $mot = $regs[3]; - $get = isset($regs[4])?$regs[4]:""; - $hash = isset($regs[5])?$regs[5]:""; + $get = isset($regs[4]) ? $regs[4] : ""; + $hash = isset($regs[5]) ? $regs[5] : ""; } - switch (substr($lien,0,1)) { + switch (substr($lien, 0, 1)) { case '/': return $debut . resolve_path($lien); case '#': - return $debut . resolve_path($dir.$mot.$get.$lien); + return $debut . resolve_path($dir . $mot . $get . $lien); case '': - return $debut . resolve_path($dir.$mot.$get.$hash); + return $debut . resolve_path($dir . $mot . $get . $hash); default: - return $debut . resolve_path($dir.$lien); + return $debut . resolve_path($dir . $lien); } } @@ -100,7 +108,7 @@ function suivre_lien($url, $lien) { * Transforme une URL relative en URL absolue * * S'applique sur une balise SPIP d'URL. - * + * * @filtre * @link http://www.spip.net/4127 * @uses suivre_lien() @@ -109,27 +117,31 @@ function suivre_lien($url, $lien) { * [(#URL_ARTICLE|url_absolue)] * [(#CHEMIN{css/theme.css}|url_absolue)] * ``` - * + * * @param string $url URL * @param string $base URL de base de destination (par défaut ce sera l'URL de notre site) * @return string Texte ou URL (en absolus) -**/ + **/ function url_absolue($url, $base = '') { - if (strlen($url = trim($url)) == 0) + if (strlen($url = trim($url)) == 0) { return ''; - if (!$base) + } + if (!$base) { $base = url_de_base() . (_DIR_RACINE ? _DIR_RESTREINT_ABS : ''); + } + return suivre_lien($base, $url); } /** * Supprimer le protocole d'une url absolue * pour le rendre implicite (URL commencant par "//") + * * @param string $url_absolue * @return string */ -function protocole_implicite($url_absolue){ - return preg_replace(";^[a-z]{3,7}://;i","//",$url_absolue); +function protocole_implicite($url_absolue) { + return preg_replace(";^[a-z]{3,7}://;i", "//", $url_absolue); } /** @@ -140,23 +152,23 @@ function protocole_implicite($url_absolue){ * @filtre * @uses url_absolue() * @link http://www.spip.net/4126 - * + * * @param string $texte Texte * @param string $base URL de base de destination (par défaut ce sera l'URL de notre site) * @return string Texte avec des URLs absolues -**/ + **/ function liens_absolus($texte, $base = '') { - if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', - $texte, $liens, PREG_SET_ORDER)) { + if (preg_match_all(',(<(a|link|image|img|script)\s[^<>]*(href|src)=[^<>]*>),imsS', + $texte, $liens, PREG_SET_ORDER)) { foreach ($liens as $lien) { - foreach(array('href', 'src') as $attr) { + foreach (array('href', 'src') as $attr) { $href = extraire_attribut($lien[0], $attr); - if (strlen($href)>0) { - if (!preg_match(';^((?:[a-z]{3,7}:)?//);iS', $href)){ + if (strlen($href) > 0) { + if (!preg_match(';^((?:[a-z]{3,7}:)?//);iS', $href)) { $abs = url_absolue($href, $base); - if (rtrim($href,'/')!==rtrim($abs,'/') and !preg_match('/^#/', $href)){ + if (rtrim($href, '/') !== rtrim($abs, '/') and !preg_match('/^#/', $href)) { $texte_lien = inserer_attribut($lien[0], $attr, $abs); - $texte = str_replace($lien[0],$texte_lien,$texte); + $texte = str_replace($lien[0], $texte_lien, $texte); } } } @@ -174,28 +186,29 @@ function liens_absolus($texte, $base = '') { * @filtre * @link http://www.spip.net/4128 * @global mode_abs_url Pour connaître le mode (url ou texte) - * + * * @param string $texte Texte ou URL * @param string $base URL de base de destination (par défaut ce sera l'URL de notre site) * @return string Texte ou URL (en absolus) -**/ + **/ function abs_url($texte, $base = '') { - if ($GLOBALS['mode_abs_url'] == 'url') + if ($GLOBALS['mode_abs_url'] == 'url') { return url_absolue($texte, $base); - else + } else { return liens_absolus($texte, $base); + } } /** -* htmlspecialchars wrapper (PHP >= 5.4 compat issue) -* -* @param string $string -* @param int $flags -* @param string $encoding -* @param bool $double_encode -* @return string -*/ -function spip_htmlspecialchars($string, $flags = null, $encoding = 'ISO-8859-1', $double_encode = true){ + * htmlspecialchars wrapper (PHP >= 5.4 compat issue) + * + * @param string $string + * @param int $flags + * @param string $encoding + * @param bool $double_encode + * @return string + */ +function spip_htmlspecialchars($string, $flags = null, $encoding = 'ISO-8859-1', $double_encode = true) { if (is_null($flags)) { $flags = ENT_COMPAT; if (defined('ENT_HTML401')) { @@ -203,19 +216,19 @@ function spip_htmlspecialchars($string, $flags = null, $encoding = 'ISO-8859-1', } } - return htmlspecialchars($string,$flags,$encoding,$double_encode); + return htmlspecialchars($string, $flags, $encoding, $double_encode); } /** -* htmlentities wrapper (PHP >= 5.4 compat issue) -* -* @param string $string -* @param int $flags -* @param string $encoding -* @param bool $double_encode -* @return string -*/ -function spip_htmlentities($string, $flags = null, $encoding = 'ISO-8859-1', $double_encode = true){ + * htmlentities wrapper (PHP >= 5.4 compat issue) + * + * @param string $string + * @param int $flags + * @param string $encoding + * @param bool $double_encode + * @return string + */ +function spip_htmlentities($string, $flags = null, $encoding = 'ISO-8859-1', $double_encode = true) { if (is_null($flags)) { $flags = ENT_COMPAT; if (defined('ENT_HTML401')) { @@ -223,6 +236,7 @@ function spip_htmlentities($string, $flags = null, $encoding = 'ISO-8859-1', $do } } - return htmlentities($string,$flags,$encoding,$double_encode); + return htmlentities($string, $flags, $encoding, $double_encode); } + ?> diff --git a/ecrire/inc/filtres_selecteur_generique.php b/ecrire/inc/filtres_selecteur_generique.php index 3a3301049c..67c25442ef 100644 --- a/ecrire/inc/filtres_selecteur_generique.php +++ b/ecrire/inc/filtres_selecteur_generique.php @@ -4,18 +4,20 @@ * Filtres pour les sélecteurs d'objets * * @package SPIP\Core\Filtres\Selecteurs -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Fournit la liste des objets ayant un sélecteur - * + * * Concrètement, va chercher tous les `formulaires/selecteur/hierarchie-{trucs}.html` * Ensuite on ajoute les parents obligatoires éventuels * * @uses find_all_in_path() - * + * * @param array $whitelist * Liste blanche décrivant les objets à lister * @param array $blacklist @@ -25,19 +27,19 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * - selectionner : tableau des objets que l'on pourra sélectionner (avec un +) * - afficher : tableau des objets à afficher (mais pas forcément sélectionnables) */ -function selecteur_lister_objets($whitelist = array(), $blacklist = array()){ +function selecteur_lister_objets($whitelist = array(), $blacklist = array()) { static $liste_selecteurs, $liste_parents; - if (!$liste_selecteurs){ + if (!$liste_selecteurs) { $liste_selecteurs = find_all_in_path('formulaires/selecteur/', 'hierarchie-[\w]+[.]html$'); } $objets_selectionner = array(); - foreach ($liste_selecteurs as $fichier=>$chemin){ + foreach ($liste_selecteurs as $fichier => $chemin) { $objets_selectionner[] = preg_replace('/^hierarchie-([\w]+)[.]html$/', '$1', $fichier); } - + // S'il y a une whitelist on ne garde que ce qui est dedans - if (!empty($whitelist)){ + if (!empty($whitelist)) { $whitelist = array_map('table_objet', $whitelist); $objets_selectionner = array_intersect($objets_selectionner, $whitelist); } @@ -52,20 +54,20 @@ function selecteur_lister_objets($whitelist = array(), $blacklist = array()){ // Il faut alors chercher d'éventuels parents obligatoires en plus : // lister-trucs-bidules.html => on doit afficher des "trucs" pour trouver des "bidules" - if (!$liste_parents){ + if (!$liste_parents) { $liste_parents = find_all_in_path('formulaires/selecteur/', 'lister-[\w]+-[\w]+[.]html$'); } - foreach ($liste_parents as $fichier=>$chemin){ + foreach ($liste_parents as $fichier => $chemin) { preg_match('/^lister-([\w]+)-([\w]+)[.]html$/', $fichier, $captures); $parent = $captures[1]; $type = $captures[2]; // Si le type fait partie de ce qu'on doit afficher alors on ajoute aussi le parent à l'affichage - if (in_array($type, $objets_afficher)){ + if (in_array($type, $objets_afficher)) { $objets_afficher[] = $parent; } } - $objets = array( + $objets = array( 'selectionner' => array_unique($objets_selectionner), 'afficher' => array_unique($objets_afficher), ); @@ -79,24 +81,24 @@ function selecteur_lister_objets($whitelist = array(), $blacklist = array()){ * * Peut retourner un tableau de couples (objet => id_objet) ou la liste * des identifiants d'un objet précis si `$type` est fourni. - * + * * @example * `picker_selected(array('article|1', 'article|2', 'rubrique|5'))` * retourne `array('article' => 1, 'article' => 2, 'rubrique' => 5)` * @example * `picker_selected(array('article|1', 'article|2', 'rubrique|5'), 'article')` * retourne `array(1, 2)` - * + * * @filtre - * + * * @param array|string $selected * Liste des entrées : tableau ou chaine séparée par des virgules * @param string $type * Type de valeur à recuperer tel que `rubrique`, `article` * @return array * liste des couples (objets => id_objet) ou liste des identifiants d'un type d'objet. -**/ -function picker_selected($selected, $type = ''){ + **/ +function picker_selected($selected, $type = '') { $select = array(); $type = preg_replace(',\W,', '', $type); @@ -105,17 +107,16 @@ function picker_selected($selected, $type = ''){ } if (is_array($selected)) { - foreach($selected as $value){ + foreach ($selected as $value) { // Si c'est le bon format déjà - if (preg_match('/^([\w]+)[|]([0-9]+)$/', $value, $captures)){ + if (preg_match('/^([\w]+)[|]([0-9]+)$/', $value, $captures)) { $objet = $captures[1]; $id_objet = intval($captures[2]); // Si on cherche un type et que c'est le bon, on renvoit un tableau que d'identifiants - if (is_string($type) AND $type == $objet AND ($id_objet OR in_array($objet, array('racine', 'rubrique')))){ + if (is_string($type) AND $type == $objet AND ($id_objet OR in_array($objet, array('racine', 'rubrique')))) { $select[] = $id_objet; - } - elseif(!$type AND ($id_objet OR in_array($objet, array('racine', 'rubrique')))){ + } elseif (!$type AND ($id_objet OR in_array($objet, array('racine', 'rubrique')))) { $select[] = array('objet' => $objet, 'id_objet' => $id_objet); } } @@ -129,7 +130,7 @@ function picker_selected($selected, $type = ''){ * Récupère des informations sur un objet pour pouvoir l'ajouter aux éléments sélectionnés * * @uses typer_raccourci() - * + * * @param string $ref * Référence de l'objet à chercher, de la forme "type|id", par exemple "rubrique|123". * @param mixed $rubriques_ou_objets @@ -138,35 +139,38 @@ function picker_selected($selected, $type = ''){ * @param bool $articles * Booléen indiquant si les articles sont sélectionnables */ -function picker_identifie_id_rapide($ref, $rubriques_ou_objets = false, $articles = false){ +function picker_identifie_id_rapide($ref, $rubriques_ou_objets = false, $articles = false) { include_spip('inc/json'); include_spip('inc/lien'); // On construit un tableau des objets sélectionnables suivant les paramètres $objets = array(); - if ($rubriques_ou_objets and is_array($rubriques_ou_objets)){ + if ($rubriques_ou_objets and is_array($rubriques_ou_objets)) { $objets = $rubriques_ou_objets; - } - else { - if ($rubriques_ou_objets){ $objets[] = 'rubriques'; } - if ($articles){ $objets[] = 'articles'; } + } else { + if ($rubriques_ou_objets) { + $objets[] = 'rubriques'; + } + if ($articles) { + $objets[] = 'articles'; + } } // Si la référence ne correspond à rien, c'est fini - if (!($match = typer_raccourci($ref))){ + if (!($match = typer_raccourci($ref))) { return json_export(false); } // Sinon on récupère les infos utiles - @list($type,,$id,,,,) = $match; + @list($type, , $id, , , ,) = $match; // On regarde si le type trouvé fait partie des objets sélectionnables - if (!in_array(table_objet($type), $objets)){ + if (!in_array(table_objet($type), $objets)) { return json_export(false); } // Maintenant que tout est bon, on cherche les informations sur cet objet include_spip('inc/filtres'); - if (!$titre = generer_info_entite($id, $type, 'titre')){ + if (!$titre = generer_info_entite($id, $type, 'titre')) { return json_export(false); } @@ -178,12 +182,12 @@ function picker_identifie_id_rapide($ref, $rubriques_ou_objets = false, $article /** * Déterminer si une rubrique a des enfants à afficher ou non - * + * * On test d'abord si la rubrique a des sous rubriques, et sinon on regarde * les autres types sélectionnables, puis on regarde si la rubrique contient * certains de ces objets * - * @note + * @note * Pour optimiser, la fonction calcule sa valeur sur toute la fratrie d'un coup, * puisqu'elle est appellée N fois pour toutes les rubriques d'un même niveau * @@ -195,15 +199,15 @@ function picker_identifie_id_rapide($ref, $rubriques_ou_objets = false, $article * @return string * Comme le filtre `oui` : espace (` `) si rubrique à afficher, chaîne vide sinon. */ -function test_enfants_rubrique($id_rubrique, $types = array()){ +function test_enfants_rubrique($id_rubrique, $types = array()) { static $has_child = array(); if (!isset($has_child[$id_rubrique])) { $types = (is_array($types) ? array_filter($types) : array()); // recuperer tous les freres et soeurs de la rubrique visee - $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique='.intval($id_rubrique)); - $fratrie = sql_allfetsel('id_rubrique', 'spip_rubriques', 'id_parent='.intval($id_parent)); + $id_parent = sql_getfetsel('id_parent', 'spip_rubriques', 'id_rubrique=' . intval($id_rubrique)); + $fratrie = sql_allfetsel('id_rubrique', 'spip_rubriques', 'id_parent=' . intval($id_parent)); $fratrie = array_map('reset', $fratrie); $has = sql_allfetsel("DISTINCT id_parent", "spip_rubriques", sql_in('id_parent', $fratrie)); $has = array_map('reset', $has); @@ -212,16 +216,16 @@ function test_enfants_rubrique($id_rubrique, $types = array()){ while (count($fratrie) AND is_array($types) AND count($types)) { $type = array_shift($types); $h = sql_allfetsel("DISTINCT id_rubrique", table_objet_sql($type), sql_in('id_rubrique', $fratrie)); - $h = array_map('reset',$h); - $has = array_merge($has,$h); - $fratrie = array_diff($fratrie,$h); + $h = array_map('reset', $h); + $has = array_merge($has, $h); + $fratrie = array_diff($fratrie, $h); } if (count($has)) { - $has_child = $has_child + array_combine($has, array_pad(array(), count($has), true)); + $has_child = $has_child+array_combine($has, array_pad(array(), count($has), true)); } if (count($fratrie)) { - $has_child = $has_child + array_combine($fratrie, array_pad(array(), count($fratrie), false)); + $has_child = $has_child+array_combine($fratrie, array_pad(array(), count($fratrie), false)); } } diff --git a/ecrire/inc/flock.php b/ecrire/inc/flock.php index f18e2682d1..902c828f51 100644 --- a/ecrire/inc/flock.php +++ b/ecrire/inc/flock.php @@ -14,9 +14,11 @@ * Gestion de recherche et d'écriture de répertoire ou fichiers * * @package SPIP\Core\Flock -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -35,7 +37,7 @@ if (!defined('_TEST_FILE_EXISTS')) { #define('_SPIP_LOCK_MODE',1); // utiliser le flock php #define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip -if (_SPIP_LOCK_MODE==2) { +if (_SPIP_LOCK_MODE == 2) { include_spip('inc/nfslock'); } @@ -45,10 +47,10 @@ $GLOBALS['liste_verrous'] = array(); * Ouvre un fichier et le vérrouille * * @link http://php.net/manual/fr/function.flock.php pour le type de verrou. - * @see _SPIP_LOCK_MODE - * @see spip_fclose_unlock() + * @see _SPIP_LOCK_MODE + * @see spip_fclose_unlock() * @uses spip_nfslock() si _SPIP_LOCK_MODE = 2. - * + * * @param string $fichier * Chemin du fichier * @param string $mode @@ -57,22 +59,25 @@ $GLOBALS['liste_verrous'] = array(); * Type de verrou (avec _SPIP_LOCK_MODE = 1) * @return Resource * Ressource sur le fichier ouvert, sinon false. -**/ + **/ function spip_fopen_lock($fichier, $mode, $verrou) { - if (_SPIP_LOCK_MODE==1) { + if (_SPIP_LOCK_MODE == 1) { if ($fl = @fopen($fichier, $mode)) { // verrou @flock($fl, $verrou); } + return $fl; - } - elseif(_SPIP_LOCK_MODE==2) { - if (($verrou = spip_nfslock($fichier)) && ($fl = @fopen($fichier, $mode))){ + } elseif (_SPIP_LOCK_MODE == 2) { + if (($verrou = spip_nfslock($fichier)) && ($fl = @fopen($fichier, $mode))) { $GLOBALS['liste_verrous'][$fl] = array($fichier, $verrou); + return $fl; + } else { + return false; } - else return false; } + return @fopen($fichier, $mode); } @@ -81,20 +86,20 @@ function spip_fopen_lock($fichier, $mode, $verrou) { * * @see _SPIP_LOCK_MODE * @see spip_fopen_lock() - * + * * @param string $handle * Chemin du fichier * @return bool * true si succès, false sinon. -**/ -function spip_fclose_unlock($handle){ - if (_SPIP_LOCK_MODE==1){ + **/ +function spip_fclose_unlock($handle) { + if (_SPIP_LOCK_MODE == 1) { @flock($handle, LOCK_UN); - } - elseif(_SPIP_LOCK_MODE==2) { - spip_nfsunlock(reset($GLOBALS['liste_verrous'][$handle]),end($GLOBALS['liste_verrous'][$handle])); + } elseif (_SPIP_LOCK_MODE == 2) { + spip_nfsunlock(reset($GLOBALS['liste_verrous'][$handle]), end($GLOBALS['liste_verrous'][$handle])); unset($GLOBALS['liste_verrous'][$handle]); } + return @fclose($handle); } @@ -102,12 +107,12 @@ function spip_fclose_unlock($handle){ /** * Retourne le contenu d'un fichier, même si celui ci est compréssé * avec une extension en `.gz` - * + * * @param string $fichier * Chemin du fichier * @return string * Contenu du fichier -**/ + **/ function spip_file_get_contents($fichier) { if (substr($fichier, -3) != '.gz') { if (function_exists('file_get_contents')) { @@ -125,7 +130,7 @@ function spip_file_get_contents($fichier) { $contenu = @gzfile($fichier); } - return is_array($contenu)?join('', $contenu):(string)$contenu; + return is_array($contenu) ? join('', $contenu) : (string)$contenu; } @@ -137,7 +142,7 @@ function spip_file_get_contents($fichier) { * @uses spip_fopen_lock() * @uses spip_file_get_contents() * @uses spip_fclose_unlock() - * + * * @param string $fichier * Chemin du fichier * @param string $contenu @@ -148,13 +153,14 @@ function spip_file_get_contents($fichier) { * - 'phpcheck' => 'oui' : vérifie qu'on a bien du php * @return bool * true si l'opération a réussie, false sinon. -**/ -function lire_fichier ($fichier, &$contenu, $options = array()) { + **/ +function lire_fichier($fichier, &$contenu, $options = array()) { $contenu = ''; // inutile car si le fichier n'existe pas, le lock va renvoyer false juste apres // economisons donc les acces disque, sauf chez free qui rale pour un rien - if (_TEST_FILE_EXISTS AND !@file_exists($fichier)) + if (_TEST_FILE_EXISTS AND !@file_exists($fichier)) { return false; + } #spip_timer('lire_fichier'); @@ -169,6 +175,7 @@ function lire_fichier ($fichier, &$contenu, $options = array()) { // et eviter un acces disque if (!$contenu AND !@file_exists($fichier)) { spip_fclose_unlock($fl); + return false; } @@ -177,15 +184,18 @@ function lire_fichier ($fichier, &$contenu, $options = array()) { // Verifications $ok = true; - if (isset($options['phpcheck']) and $options['phpcheck'] == 'oui') + if (isset($options['phpcheck']) and $options['phpcheck'] == 'oui') { $ok &= (preg_match(",[?]>\n?$,", $contenu)); + } #spip_log("$fread $fichier ".spip_timer('lire_fichier')); - if (!$ok) + if (!$ok) { spip_log("echec lecture $fichier"); + } return $ok; } + return false; } @@ -195,11 +205,11 @@ function lire_fichier ($fichier, &$contenu, $options = array()) { * * Cette écriture s’exécute de façon sécurisée en posant un verrou sur * le fichier avant sa modification. Les fichiers .gz sont compressés. - * + * * @uses raler_fichier() Si le fichier n'a pu peut être écrit - * @see lire_fichier() - * @see supprimer_fichier() - * + * @see lire_fichier() + * @see supprimer_fichier() + * * @param string $fichier * Chemin du fichier * @param string $contenu @@ -211,29 +221,31 @@ function lire_fichier ($fichier, &$contenu, $options = array()) { * Écriture avec troncation ? * @return bool * - true si l’écriture s’est déroulée sans problème. -**/ -function ecrire_fichier ($fichier, $contenu, $ignorer_echec = false, $truncate = true) { + **/ +function ecrire_fichier($fichier, $contenu, $ignorer_echec = false, $truncate = true) { #spip_timer('ecrire_fichier'); // verrouiller le fichier destination - if ($fp = spip_fopen_lock($fichier, 'a',LOCK_EX)) { - // ecrire les donnees, compressees le cas echeant - // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage - // de le recreer si le locker qui nous precede l'avait supprime...) - if (substr($fichier, -3) == '.gz') + if ($fp = spip_fopen_lock($fichier, 'a', LOCK_EX)) { + // ecrire les donnees, compressees le cas echeant + // (on ouvre un nouveau pointeur sur le fichier, ce qui a l'avantage + // de le recreer si le locker qui nous precede l'avait supprime...) + if (substr($fichier, -3) == '.gz') { $contenu = gzencode($contenu); + } // si c'est une ecriture avec troncation , on fait plutot une ecriture complete a cote suivie unlink+rename // pour etre sur d'avoir une operation atomique // y compris en NFS : http://www.ietf.org/rfc/rfc1094.txt // sauf sous wintruc ou ca ne marche pas $ok = false; - if ($truncate AND _OS_SERVEUR != 'windows'){ - if (!function_exists('creer_uniqid')) + if ($truncate AND _OS_SERVEUR != 'windows') { + if (!function_exists('creer_uniqid')) { include_spip('inc/acces'); + } $id = creer_uniqid(); // on ouvre un pointeur sur un fichier temporaire en ecriture +raz - if ($fp2 = spip_fopen_lock("$fichier.$id", 'w',LOCK_EX)) { + if ($fp2 = spip_fopen_lock("$fichier.$id", 'w', LOCK_EX)) { $s = @fputs($fp2, $contenu, $a = strlen($contenu)); $ok = ($s == $a); spip_fclose_unlock($fp2); @@ -244,23 +256,26 @@ function ecrire_fichier ($fichier, $contenu, $ignorer_echec = false, $truncate = // le rename aussitot, atomique quand on est pas sous windows // au pire on arrive en second en cas de concourance, et le rename echoue // --> on a la version de l'autre process qui doit etre identique - @rename("$fichier.$id",$fichier); + @rename("$fichier.$id", $fichier); // precaution en cas d'echec du rename - if (!_TEST_FILE_EXISTS OR @file_exists("$fichier.$id")) + if (!_TEST_FILE_EXISTS OR @file_exists("$fichier.$id")) { @unlink("$fichier.$id"); - if ($ok) + } + if ($ok) { $ok = file_exists($fichier); - } - else - // echec mais penser a fermer .. + } + } else // echec mais penser a fermer .. + { spip_fclose_unlock($fp); + } } // sinon ou si methode precedente a echoueee // on se rabat sur la methode ancienne - if (!$ok){ + if (!$ok) { // ici on est en ajout ou sous windows, cas desespere - if ($truncate) - @ftruncate($fp,0); + if ($truncate) { + @ftruncate($fp, 0); + } $s = @fputs($fp, $contenu, $a = strlen($contenu)); $ok = ($s == $a); @@ -270,20 +285,23 @@ function ecrire_fichier ($fichier, $contenu, $ignorer_echec = false, $truncate = // liberer le verrou et fermer le fichier @chmod($fichier, _SPIP_CHMOD & 0666); if ($ok) { - if (strpos($fichier,".php")!==false){ + if (strpos($fichier, ".php") !== false) { spip_clear_opcode_cache(realpath($fichier)); } + return $ok; } } - if (!$ignorer_echec){ + if (!$ignorer_echec) { include_spip('inc/autoriser'); - if (autoriser('chargerftp')) + if (autoriser('chargerftp')) { raler_fichier($fichier); + } spip_unlink($fichier); } - spip_log("Ecriture fichier $fichier impossible",_LOG_INFO_IMPORTANTE); + spip_log("Ecriture fichier $fichier impossible", _LOG_INFO_IMPORTANTE); + return false; } @@ -292,7 +310,7 @@ function ecrire_fichier ($fichier, $contenu, $ignorer_echec = false, $truncate = * de fichier htaccess * * @uses ecrire_fichier() - * + * * @param string $fichier * Chemin du fichier * @param string $contenu @@ -303,10 +321,12 @@ function ecrire_fichier ($fichier, $contenu, $ignorer_echec = false, $truncate = * @param bool $truncate * Écriture avec troncation ? */ -function ecrire_fichier_securise ($fichier, $contenu, $ecrire_quand_meme = false, $truncate = true) { - if (substr($fichier,-4) !== '.php') - spip_log('Erreur de programmation: '.$fichier.' doit finir par .php'); - $contenu = "<"."?php die ('Acces interdit'); ?".">\n" . $contenu; +function ecrire_fichier_securise($fichier, $contenu, $ecrire_quand_meme = false, $truncate = true) { + if (substr($fichier, -4) !== '.php') { + spip_log('Erreur de programmation: ' . $fichier . ' doit finir par .php'); + } + $contenu = "<" . "?php die ('Acces interdit'); ?" . ">\n" . $contenu; + return ecrire_fichier($fichier, $contenu, $ecrire_quand_meme, $truncate); } @@ -314,7 +334,7 @@ function ecrire_fichier_securise ($fichier, $contenu, $ecrire_quand_meme = false * Lire un fichier encapsulé en PHP * * @uses lire_fichier() - * + * * @param string $fichier * Chemin du fichier * @param string $contenu @@ -326,10 +346,11 @@ function ecrire_fichier_securise ($fichier, $contenu, $ecrire_quand_meme = false * @return bool * true si l'opération a réussie, false sinon. */ -function lire_fichier_securise ($fichier, &$contenu, $options = array()) { - if ($res = lire_fichier($fichier,$contenu,$options)){ - $contenu = substr($contenu,strlen("<"."?php die ('Acces interdit'); ?".">\n")); +function lire_fichier_securise($fichier, &$contenu, $options = array()) { + if ($res = lire_fichier($fichier, $contenu, $options)) { + $contenu = substr($contenu, strlen("<" . "?php die ('Acces interdit'); ?" . ">\n")); } + return $res; } @@ -340,12 +361,11 @@ function lire_fichier_securise ($fichier, &$contenu, $options = array()) { * Arrête le script PHP par un exit; * * @uses minipres() Pour afficher le message - * + * * @param string $fichier * Chemin du fichier -**/ -function raler_fichier($fichier) -{ + **/ +function raler_fichier($fichier) { include_spip('inc/minipres'); $dir = dirname($fichier); http_status(401); @@ -357,7 +377,7 @@ function raler_fichier($fichier) . _T('texte_inc_meta_2') . "</a> " . _T('texte_inc_meta_3', - array('repertoire' => joli_repertoire($dir))) + array('repertoire' => joli_repertoire($dir))) . "</h4>\n"); exit; } @@ -373,10 +393,14 @@ function raler_fichier($fichier) * @return bool * - true si récent, false sinon */ -function jeune_fichier($fichier, $n) -{ - if (!file_exists($fichier)) return false; - if (!$c = @filemtime($fichier)) return false; +function jeune_fichier($fichier, $n) { + if (!file_exists($fichier)) { + return false; + } + if (!$c = @filemtime($fichier)) { + return false; + } + return (time()-$n <= $c); } @@ -393,18 +417,20 @@ function jeune_fichier($fichier, $n) * - void sinon */ function supprimer_fichier($fichier, $lock = true) { - if (!@file_exists($fichier)) + if (!@file_exists($fichier)) { return true; + } if ($lock) { // verrouiller le fichier destination - if (!$fp = spip_fopen_lock($fichier, 'a', LOCK_EX)) + if (!$fp = spip_fopen_lock($fichier, 'a', LOCK_EX)) { return false; - + } + // liberer le verrou spip_fclose_unlock($fp); } - + // supprimer return @unlink($fichier); } @@ -416,9 +442,9 @@ function supprimer_fichier($fichier, $lock = true) { * Chemin du fichier */ function spip_unlink($f) { - if (!is_dir($f)) - supprimer_fichier($f,false); - else { + if (!is_dir($f)) { + supprimer_fichier($f, false); + } else { @unlink("$f/.ok"); @rmdir($f); } @@ -426,17 +452,17 @@ function spip_unlink($f) { /** * clearstatcache adapte a la version PHP + * * @param bool $clear_realpath_cache * @param null $filename */ -function spip_clearstatcache($clear_realpath_cache = false, $filename = null){ +function spip_clearstatcache($clear_realpath_cache = false, $filename = null) { if (!defined('PHP_VERSION_ID') || PHP_VERSION_ID < 50300) { - // Below PHP 5.3, clearstatcache does not accept any function parameters. - return clearstatcache(); - } - else { - return clearstatcache($clear_realpath_cache, $filename); - } + // Below PHP 5.3, clearstatcache does not accept any function parameters. + return clearstatcache(); + } else { + return clearstatcache($clear_realpath_cache, $filename); + } } @@ -451,19 +477,19 @@ function spip_clearstatcache($clear_realpath_cache = false, $filename = null){ * The absolute path of the PHP file to invalidate. */ function spip_clear_opcode_cache($filepath) { - spip_clearstatcache(TRUE, $filepath); - - // Zend OPcache - if (function_exists('opcache_invalidate')) { - opcache_invalidate($filepath, TRUE); - } - // APC. - if (function_exists('apc_delete_file')) { - // apc_delete_file() throws a PHP warning in case the specified file was - // not compiled yet. - // @see http://php.net/apc-delete-file - @apc_delete_file($filepath); - } + spip_clearstatcache(true, $filepath); + + // Zend OPcache + if (function_exists('opcache_invalidate')) { + opcache_invalidate($filepath, true); + } + // APC. + if (function_exists('apc_delete_file')) { + // apc_delete_file() throws a PHP warning in case the specified file was + // not compiled yet. + // @see http://php.net/apc-delete-file + @apc_delete_file($filepath); + } } /** @@ -477,11 +503,12 @@ function spip_clear_opcode_cache($filepath) { * Ne fait rien en dehors de ce cas * */ -function spip_attend_invalidation_opcode_cache(){ +function spip_attend_invalidation_opcode_cache() { if (function_exists('opcache_get_configuration') - AND @ini_get('opcache.enable') - AND @ini_get('opcache.validate_timestamps') - AND $duree = @ini_get('opcache.revalidate_freq') ) { + AND @ini_get('opcache.enable') + AND @ini_get('opcache.validate_timestamps') + AND $duree = @ini_get('opcache.revalidate_freq') + ) { sleep($duree+1); } } @@ -496,17 +523,25 @@ function spip_attend_invalidation_opcode_cache(){ * @return bool Suppression reussie. */ function supprimer_repertoire($dir) { - if (!file_exists($dir)) return true; - if (!is_dir($dir) || is_link($dir)) return @unlink($dir); - + if (!file_exists($dir)) { + return true; + } + if (!is_dir($dir) || is_link($dir)) { + return @unlink($dir); + } + foreach (scandir($dir) as $item) { - if ($item == '.' || $item == '..') continue; + if ($item == '.' || $item == '..') { + continue; + } if (!supprimer_repertoire($dir . "/" . $item)) { @chmod($dir . "/" . $item, 0777); - if (!supprimer_repertoire($dir . "/" . $item)) return false; + if (!supprimer_repertoire($dir . "/" . $item)) { + return false; + } }; } - + return @rmdir($dir); } @@ -522,7 +557,7 @@ function supprimer_repertoire($dir) { * sous_repertoire(_DIR_CACHE, 'demo'); * sous_repertoire(_DIR_CACHE . '/demo'); * ``` - * + * * @param string $base * - Chemin du répertoire parent (avec $subdir) * - sinon chemin du répertoire à créer @@ -534,8 +569,8 @@ function supprimer_repertoire($dir) { * @param bool $tantpis * true pour ne pas raler en cas de non création du répertoire * @return string - * Chemin du répertoire créé. -**/ + * Chemin du répertoire créé. + **/ function sous_repertoire($base, $subdir = '', $nobase = false, $tantpis = false) { static $dirs = array(); @@ -546,7 +581,9 @@ function sous_repertoire($base, $subdir = '', $nobase = false, $tantpis = false) if (!strlen($subdir)) { $n = strrpos($base, "/"); - if ($n === false) return $nobase ? '' : ($base .'/'); + if ($n === false) { + return $nobase ? '' : ($base . '/'); + } $subdir = substr($base, $n+1); $base = substr($base, 0, $n+1); } else { @@ -555,50 +592,59 @@ function sous_repertoire($base, $subdir = '', $nobase = false, $tantpis = false) } $baseaff = $nobase ? '' : $base; - if (isset($dirs[$base.$subdir])) - return $baseaff.$dirs[$base.$subdir]; + if (isset($dirs[$base . $subdir])) { + return $baseaff . $dirs[$base . $subdir]; + } - if (_CREER_DIR_PLAT AND @file_exists("$base${subdir}.plat")) - return $baseaff.($dirs[$base.$subdir] = "${subdir}_"); + if (_CREER_DIR_PLAT AND @file_exists("$base${subdir}.plat")) { + return $baseaff . ($dirs[$base . $subdir] = "${subdir}_"); + } - $path = $base.$subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf' + $path = $base . $subdir; # $path = 'IMG/distant/pdf' ou 'IMG/distant_pdf' - if (file_exists("$path/.ok")) - return $baseaff.($dirs[$base.$subdir] = "$subdir/"); + if (file_exists("$path/.ok")) { + return $baseaff . ($dirs[$base . $subdir] = "$subdir/"); + } @mkdir($path, _SPIP_CHMOD); @chmod($path, _SPIP_CHMOD); $ok = false; if ($test = @fopen("$path/dir_test.php", "w")) { - @fputs($test, '<'.'?php $ok = true; ?'.'>'); + @fputs($test, '<' . '?php $ok = true; ?' . '>'); @fclose($test); @include("$path/dir_test.php"); spip_unlink("$path/dir_test.php"); } if ($ok) { - @touch ("$path/.ok"); + @touch("$path/.ok"); spip_log("creation $base$subdir/"); - return $baseaff.($dirs[$base.$subdir] = "$subdir/"); + + return $baseaff . ($dirs[$base . $subdir] = "$subdir/"); } // en cas d'echec c'est peut etre tout simplement que le disque est plein : // l'inode du fichier dir_test existe, mais impossible d'y mettre du contenu // => sauf besoin express (define dans mes_options), ne pas creer le .plat if (_CREER_DIR_PLAT - AND $f = @fopen("$base${subdir}.plat", "w")) + AND $f = @fopen("$base${subdir}.plat", "w") + ) { fclose($f); - else { + } else { spip_log("echec creation $base${subdir}"); - if ($tantpis) return ''; - if (!_DIR_RESTREINT) - $base = preg_replace(',^' . _DIR_RACINE .',', '',$base); + if ($tantpis) { + return ''; + } + if (!_DIR_RESTREINT) { + $base = preg_replace(',^' . _DIR_RACINE . ',', '', $base); + } $base .= $subdir; - raler_fichier($base . ($test?'/.ok':'/dir_test.php')); + raler_fichier($base . ($test ? '/.ok' : '/dir_test.php')); } spip_log("faux sous-repertoire $base${subdir}"); - return $baseaff.($dirs[$base.$subdir] = "${subdir}_"); + + return $baseaff . ($dirs[$base . $subdir] = "${subdir}_"); } @@ -613,12 +659,12 @@ function sous_repertoire($base, $subdir = '', $nobase = false, $tantpis = false) * $x = preg_files('ecrire/data/', '[.]lock$'); * // $x array() * ``` - * + * * @note * Attention, afin de conserver la compatibilite avec les repertoires '.plat' * si `$dir = 'rep/sous_rep_'` au lieu de `rep/sous_rep/` on scanne `rep/` et on * applique un pattern `^rep/sous_rep_` - * + * * @param string $dir * Répertoire à parcourir * @param int|string $pattern @@ -629,40 +675,46 @@ function sous_repertoire($base, $subdir = '', $nobase = false, $tantpis = false) * false pour ne pas descendre dans les sous répertoires * @return array * Chemins des fichiers trouvés. -**/ + **/ function preg_files($dir, $pattern = -1 /* AUTO */, $maxfiles = 10000, $recurs = array()) { $nbfiles = 0; - if ($pattern == -1) + if ($pattern == -1) { $pattern = "^$dir"; + } $fichiers = array(); // revenir au repertoire racine si on a recu dossier/truc // pour regarder dossier/truc/ ne pas oublier le / final $dir = preg_replace(',/[^/]*$,', '', $dir); - if ($dir == '') $dir = '.'; + if ($dir == '') { + $dir = '.'; + } if (@is_dir($dir) AND is_readable($dir) AND $d = @opendir($dir)) { - while (($f = readdir($d)) !== false && ($nbfiles<$maxfiles)) { + while (($f = readdir($d)) !== false && ($nbfiles < $maxfiles)) { if ($f[0] != '.' # ignorer . .. .svn etc - AND $f != 'CVS' - AND $f != 'remove.txt' - AND is_readable($f = "$dir/$f")) { + AND $f != 'CVS' + AND $f != 'remove.txt' + AND is_readable($f = "$dir/$f") + ) { if (is_file($f)) { - if (preg_match(";$pattern;iS", $f)) - { + if (preg_match(";$pattern;iS", $f)) { $fichiers[] = $f; $nbfiles++; } - } - else if (is_dir($f) AND is_array($recurs)){ - $rp = @realpath($f); - if (!is_string($rp) OR !strlen($rp)) $rp=$f; # realpath n'est peut etre pas autorise - if (!isset($recurs[$rp])) { - $recurs[$rp] = true; - $beginning = $fichiers; - $end = preg_files("$f/", $pattern, - $maxfiles-$nbfiles, $recurs); - $fichiers = array_merge((array)$beginning, (array)$end); - $nbfiles = count($fichiers); + } else { + if (is_dir($f) AND is_array($recurs)) { + $rp = @realpath($f); + if (!is_string($rp) OR !strlen($rp)) { + $rp = $f; + } # realpath n'est peut etre pas autorise + if (!isset($recurs[$rp])) { + $recurs[$rp] = true; + $beginning = $fichiers; + $end = preg_files("$f/", $pattern, + $maxfiles-$nbfiles, $recurs); + $fichiers = array_merge((array)$beginning, (array)$end); + $nbfiles = count($fichiers); + } } } } @@ -670,6 +722,7 @@ function preg_files($dir, $pattern = -1 /* AUTO */, $maxfiles = 10000, $recurs = closedir($d); } sort($fichiers); + return $fichiers; } diff --git a/ecrire/inc/genie.php b/ecrire/inc/genie.php index 6d8458e256..acfab8e31b 100644 --- a/ecrire/inc/genie.php +++ b/ecrire/inc/genie.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Gestion des tâches de fond @@ -43,11 +45,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * * On peut également directement en déclarer avec la balise `genie` d'un paquet.xml * de plugin, tel que `<genie nom="nom_de_la_tache" periode="86400" />` - * + * * @package SPIP\Core\Genie -**/ - - + **/ /** @@ -57,27 +57,27 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * * Cette fonction exécute la tache la plus urgente, c'est à dire * celle dont la date de dernière exécution + la périodicité est minimale. - * + * * La date de la prochaîne exécution de chaque tâche est indiquée dans la * table SQL `spip_jobs` * * La fonction exécutant la tâche est (généralement) un homonyme de préfixe "genie_". * Le fichier homonyme du repertoire "genie/" est automatiquement lu * et il est supposé définir cette fonction. - * + * * @uses queue_add_job() Lorsqu'une tâche est à forcer * @uses queue_schedule() - * @see taches_generales() Liste des tâches déclarées - * + * @see taches_generales() Liste des tâches déclarées + * * @param array $taches * Tâches dont on force maintenant l'exécution le plus tôt possible. * Sinon, prendra la tâche la plus prioritaire. - * @return -**/ + * @return + **/ function inc_genie_dist($taches = array()) { include_spip('inc/queue'); - if (_request('exec')=='job_queue') { + if (_request('exec') == 'job_queue') { return false; } @@ -85,13 +85,14 @@ function inc_genie_dist($taches = array()) { // l'ancienne facon de lancer une tache cron immediatement // etait de la passer en parametre a ing_genie_dist // on reroute en ajoutant simplement le job a la queue, ASAP - foreach($taches as $function=>$period) { - $force_jobs[] = queue_add_job($function, _T('tache_cron_asap', array('function'=>$function)), array(time()-abs($period)), "genie/"); + foreach ($taches as $function => $period) { + $force_jobs[] = queue_add_job($function, _T('tache_cron_asap', array('function' => $function)), + array(time()-abs($period)), "genie/"); } // et on passe la main a la gestion de la queue ! // en forcant eventuellement les jobs ajoute a l'instant - return queue_schedule(count($force_jobs)?$force_jobs:null); + return queue_schedule(count($force_jobs) ? $force_jobs : null); } // @@ -122,17 +123,19 @@ function taches_generales($taches_generales = array()) { // nouveautes if (isset($GLOBALS['meta']['adresse_neuf']) AND $GLOBALS['meta']['adresse_neuf'] - AND $GLOBALS['meta']['jours_neuf'] - AND ($GLOBALS['meta']['quoi_de_neuf'] == 'oui')) - $taches_generales['mail']= 3600 * 24 * $GLOBALS['meta']['jours_neuf']; + AND $GLOBALS['meta']['jours_neuf'] + AND ($GLOBALS['meta']['quoi_de_neuf'] == 'oui') + ) { + $taches_generales['mail'] = 3600*24*$GLOBALS['meta']['jours_neuf']; + } // maintenance (ajax, verifications diverses) - $taches_generales['maintenance'] = 3600 * 2; + $taches_generales['maintenance'] = 3600*2; // verifier si une mise a jour de spip est disponible (2 fois par semaine suffit largement) $taches_generales['mise_a_jour'] = 3*24*3600; - return pipeline('taches_generales_cron',$taches_generales); + return pipeline('taches_generales_cron', $taches_generales); } // Pas de fichier a part pour une fonction aussi petite: @@ -146,36 +149,41 @@ function genie_invalideur_dist($t) { $encore = appliquer_quota_cache(); // si le cache est trop gonfle, redemander la main pour poursuivre - if ($encore) - return (0 - $t); + if ($encore) { + return (0-$t); + } + return 1; } /** * Une tâche périodique pour surveiller les tâches crons et les relancer si besoin - * + * * Quand ce cron s'execute, il n'est plus dans la queue, donc il se replanifie * lui même, avec last=time() * avec une dose d'aleatoire pour ne pas planifier toutes les taches au meme moment * * @uses taches_generales() * @uses queue_genie_replan_job() - * + * * @return int */ -function genie_queue_watch_dist(){ +function genie_queue_watch_dist() { static $deja_la = false; - if ($deja_la) return; // re-entrance si l'insertion des jobs echoue (pas de table spip_jobs a l'upgrade par exemple) + if ($deja_la) { + return; + } // re-entrance si l'insertion des jobs echoue (pas de table spip_jobs a l'upgrade par exemple) $deja_la = true; $taches = taches_generales(); $programmees = sql_allfetsel('fonction', 'spip_jobs', sql_in('fonction', array_keys($taches))); - $programmees = array_map('reset',$programmees); + $programmees = array_map('reset', $programmees); foreach ($taches as $tache => $periode) { if (!in_array($tache, $programmees)) { - queue_genie_replan_job($tache, $periode, time() - round(rand(1, $periode)), 0); + queue_genie_replan_job($tache, $periode, time()-round(rand(1, $periode)), 0); } } $deja_la = false; + return 1; } @@ -196,23 +204,28 @@ function genie_queue_watch_dist(){ * priorite * @return void */ -function queue_genie_replan_job($function, $period, $last = 0, $time = null, $priority = 0){ +function queue_genie_replan_job($function, $period, $last = 0, $time = null, $priority = 0) { static $done = array(); - if (isset($done[$function])) return; + if (isset($done[$function])) { + return; + } $done[$function] = true; - if (is_null($time)){ - $time=time(); - if ($last) - $time = max($last+$period,$time); + if (is_null($time)) { + $time = time(); + if ($last) { + $time = max($last+$period, $time); + } } - if (!$last) + if (!$last) { $last = $time-$period; + } spip_log("replan_job $function $period $last $time $priority", 'queue'); include_spip('inc/queue'); // on replanifie un job cron // uniquement si il n'y en a pas deja un avec le meme nom // independament de l'argument - queue_add_job($function, _T('tache_cron_secondes', array('function'=>$function, 'nb'=>$period)), array($last), "genie/", 'function_only', $time, $priority); + queue_add_job($function, _T('tache_cron_secondes', array('function' => $function, 'nb' => $period)), array($last), + "genie/", 'function_only', $time, $priority); } diff --git a/ecrire/inc/headers.php b/ecrire/inc/headers.php index f2a119477e..25a1dfd865 100644 --- a/ecrire/inc/headers.php +++ b/ecrire/inc/headers.php @@ -14,9 +14,11 @@ * Gestion des headers et redirections * * @package SPIP\Core\Headers -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -28,66 +30,75 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * ``` * $redirect = parametre_url(urldecode(_request('redirect')),'id_article=' . $id_article); * include_spip('inc/headers'); - * redirige_par_entete($redirect); + * redirige_par_entete($redirect); * ``` - * + * * @param string $url URL de redirection * @param string $equiv ? * @param int $status Code de redirection (301 ou 302) -**/ + **/ function redirige_par_entete($url, $equiv = '', $status = 302) { - if (!in_array($status,array(301,302))) + if (!in_array($status, array(301, 302))) { $status = 302; + } $url = trim(strtr($url, "\n\r", " ")); # si l'url de redirection est relative, on la passe en absolue - if (!preg_match(",^(\w+:)?//,",$url)){ + if (!preg_match(",^(\w+:)?//,", $url)) { include_spip("inc/filtres_mini"); $url = url_absolue($url); } - if ($x = _request('transformer_xml')) + if ($x = _request('transformer_xml')) { $url = parametre_url($url, 'transformer_xml', $x, '&'); + } - if (defined('_AJAX') AND _AJAX) + if (defined('_AJAX') AND _AJAX) { $url = parametre_url($url, 'var_ajax_redir', 1, '&'); - + } + // ne pas laisser passer n'importe quoi dans l'url - $url = str_replace(array('<','"'),array('<','"'),$url); + $url = str_replace(array('<', '"'), array('<', '"'), $url); // interdire les url inline avec des pseudo-protocoles : if ( - (preg_match(",data:,i",$url) AND preg_match("/base64\s*,/i",$url)) - OR preg_match(",(javascript|mailto):,i",$url) - ) - $url ="./"; + (preg_match(",data:,i", $url) AND preg_match("/base64\s*,/i", $url)) + OR preg_match(",(javascript|mailto):,i", $url) + ) { + $url = "./"; + } // Il n'y a que sous Apache que setcookie puis redirection fonctionne - include_spip('inc/cookie'); - if ((!$equiv AND !spip_cookie_envoye()) OR ((strncmp("Apache", $_SERVER['SERVER_SOFTWARE'],6)==0) OR defined('_SERVER_APACHE'))) { + include_spip('inc/cookie'); + if ((!$equiv AND !spip_cookie_envoye()) OR ((strncmp("Apache", $_SERVER['SERVER_SOFTWARE'], + 6) == 0) OR defined('_SERVER_APACHE')) + ) { @header("Location: " . $url); - $equiv=""; + $equiv = ""; } else { @header("Refresh: 0; url=" . $url); - if (isset($GLOBALS['meta']['charset'])) @header("Content-Type: text/html; charset=".$GLOBALS['meta']['charset']); + if (isset($GLOBALS['meta']['charset'])) { + @header("Content-Type: text/html; charset=" . $GLOBALS['meta']['charset']); + } $equiv = "<meta http-equiv='Refresh' content='0; url=$url'>"; } include_spip('inc/lang'); - if ($status!=302) + if ($status != 302) { http_status($status); - echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">',"\n", - html_lang_attributes(),' + } + echo '<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">', "\n", + html_lang_attributes(), ' <head>', - $equiv,' -<title>HTTP '.$status.'</title> -'.((isset($GLOBALS['meta']['charset']))?'<meta http-equiv="Content-Type" content="text/html;charset='.$GLOBALS['meta']['charset'].'">':'').' + $equiv, ' +<title>HTTP ' . $status . '</title> +' . ((isset($GLOBALS['meta']['charset'])) ? '<meta http-equiv="Content-Type" content="text/html;charset=' . $GLOBALS['meta']['charset'] . '">' : '') . ' </head> <body> -<h1>HTTP '.$status.'</h1> +<h1>HTTP ' . $status . '</h1> <a href="', - quote_amp($url), - '">', - _T('navigateur_pas_redirige'), - '</a></body></html>'; + quote_amp($url), + '">', + _T('navigateur_pas_redirige'), + '</a></body></html>'; spip_log("redirige $status: $url"); @@ -97,44 +108,47 @@ function redirige_par_entete($url, $equiv = '', $status = 302) { // http://code.spip.net/@redirige_formulaire function redirige_formulaire($url, $equiv = '', $format = 'message') { if (!_AJAX - AND !headers_sent() - AND !_request('var_ajax')) { - redirige_par_entete(str_replace('&','&',$url), $equiv); - } - // si c'est une ancre, fixer simplement le window.location.hash - elseif($format=='ajaxform' AND preg_match(',^#[0-9a-z\-_]+$,i',$url)) { + AND !headers_sent() + AND !_request('var_ajax') + ) { + redirige_par_entete(str_replace('&', '&', $url), $equiv); + } // si c'est une ancre, fixer simplement le window.location.hash + elseif ($format == 'ajaxform' AND preg_match(',^#[0-9a-z\-_]+$,i', $url)) { return array( - // on renvoie un lien masque qui sera traite par ajaxCallback.js - "<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>", - // et rien dans le message ok - ''); - } - else { + // on renvoie un lien masque qui sera traite par ajaxCallback.js + "<a href='$url' name='ajax_ancre' style='display:none;'>anchor</a>", + // et rien dans le message ok + '' + ); + } else { // ne pas laisser passer n'importe quoi dans l'url - $url = str_replace(array('<','"'),array('<','"'),$url); + $url = str_replace(array('<', '"'), array('<', '"'), $url); $url = strtr($url, "\n\r", " "); # en theorie on devrait faire ca tout le temps, mais quand la chaine # commence par ? c'est imperatif, sinon l'url finale n'est pas la bonne - if ($url[0]=='?') - $url = url_de_base().$url; - $url = str_replace('&','&',$url); + if ($url[0] == '?') { + $url = url_de_base() . $url; + } + $url = str_replace('&', '&', $url); spip_log("redirige formulaire ajax: $url"); include_spip('inc/filtres'); - if ($format=='ajaxform') + if ($format == 'ajaxform') { return array( - // on renvoie un lien masque qui sera traite par ajaxCallback.js - '<a href="'.quote_amp($url).'" name="ajax_redirect" style="display:none;">'._T('navigateur_pas_redirige').'</a>', - // et un message au cas ou - '<br /><a href="'.quote_amp($url).'">'._T('navigateur_pas_redirige').'</a>' + // on renvoie un lien masque qui sera traite par ajaxCallback.js + '<a href="' . quote_amp($url) . '" name="ajax_redirect" style="display:none;">' . _T('navigateur_pas_redirige') . '</a>', + // et un message au cas ou + '<br /><a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>' ); - else // format message texte, tout en js inline + } else // format message texte, tout en js inline + { return - // ie poste les formulaires dans une iframe, il faut donc rediriger son parent - "<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>" - . http_img_pack('searching.gif','') - . '<br />' - . '<a href="'.quote_amp($url).'">'._T('navigateur_pas_redirige').'</a>'; + // ie poste les formulaires dans une iframe, il faut donc rediriger son parent + "<script type='text/javascript'>if (parent.window){parent.window.document.location.replace(\"$url\");} else {document.location.replace(\"$url\");}</script>" + . http_img_pack('searching.gif', '') + . '<br />' + . '<a href="' . quote_amp($url) . '">' . _T('navigateur_pas_redirige') . '</a>'; + } } } @@ -147,14 +161,14 @@ function redirige_formulaire($url, $equiv = '', $format = 'message') { * include_spip('inc/headers'); * redirige_url_ecrire('rubriques','id_rubrique=' . $id_rubrique); * ``` - * + * * @param string $script * Nom de la page privée (exec) * @param string $args * Arguments à transmettre. Exemple `etape=1&autre=oui` * @param string $equiv * @return void -**/ + **/ function redirige_url_ecrire($script = '', $args = '', $equiv = '') { return redirige_par_entete(generer_url_ecrire($script, $args, true), $equiv); } @@ -163,12 +177,12 @@ function redirige_url_ecrire($script = '', $args = '', $equiv = '') { * Renvoie au client le header HTTP avec le message correspondant au code indiqué. * * Ainsi `http_status(301)` enverra le message `301 Moved Permanently`. - * + * * @link http://php.net/manual/fr/function.header.php Fonction header() de PHP utilisée ici - * + * * @param int $status * Code d'erreur -**/ + **/ function http_status($status) { static $status_string = array( @@ -183,20 +197,26 @@ function http_status($status) { 503 => '503 Service Unavailable' ); - if ($GLOBALS['REDIRECT_STATUS'] && $GLOBALS['REDIRECT_STATUS'] == $status) return; + if ($GLOBALS['REDIRECT_STATUS'] && $GLOBALS['REDIRECT_STATUS'] == $status) { + return; + } $php_cgi = ($GLOBALS['flag_sapi_name'] AND preg_match(",cgi,i", @php_sapi_name())); - if ($php_cgi) - header("Status: ".$status_string[$status]); - else - header("HTTP/1.0 ".$status_string[$status]); + if ($php_cgi) { + header("Status: " . $status_string[$status]); + } else { + header("HTTP/1.0 " . $status_string[$status]); + } } // Retourne ce qui va bien pour que le navigateur ne mette pas la page en cache // http://code.spip.net/@http_no_cache function http_no_cache() { - if (headers_sent()) - { spip_log("http_no_cache arrive trop tard"); return;} + if (headers_sent()) { + spip_log("http_no_cache arrive trop tard"); + + return; + } $charset = empty($GLOBALS['meta']['charset']) ? 'utf-8' : $GLOBALS['meta']['charset']; // selon http://developer.apple.com/internet/safari/faq.html#anchor5 @@ -207,7 +227,7 @@ function http_no_cache() { header("Content-Type: text/html; charset=$charset"); header("Expires: 0"); - header("Last-Modified: " .gmdate("D, d M Y H:i:s"). " GMT"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT"); header("Cache-Control: no-cache, must-revalidate"); header("Pragma: no-cache"); } diff --git a/ecrire/inc/icone_renommer.php b/ecrire/inc/icone_renommer.php index faa974bcbb..53d7756993 100644 --- a/ecrire/inc/icone_renommer.php +++ b/ecrire/inc/icone_renommer.php @@ -10,32 +10,34 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/boutons'); include_spip('base/objets'); -function inc_icone_renommer_dist($fond, $fonction){ +function inc_icone_renommer_dist($fond, $fonction) { $size = 24; - if (preg_match("/(?:-([0-9]{1,3}))?([.](gif|png))?$/i",$fond,$match) - AND ((isset($match[0]) AND $match[0]) OR (isset($match[1]) AND $match[1]))) { + if (preg_match("/(?:-([0-9]{1,3}))?([.](gif|png))?$/i", $fond, $match) + AND ((isset($match[0]) AND $match[0]) OR (isset($match[1]) AND $match[1])) + ) { if (isset($match[1]) AND $match[1]) { $size = $match[1]; } - $type = substr($fond,0,-strlen($match[0])); + $type = substr($fond, 0, -strlen($match[0])); if (!isset($match[2]) OR !$match[2]) { $fond .= ".png"; } - } - else { + } else { $type = $fond; $fond .= ".png"; } $rtl = false; - if (preg_match(',[-_]rtl$,i',$type,$match)){ + if (preg_match(',[-_]rtl$,i', $type, $match)) { $rtl = true; - $type = substr($type,0,-strlen($match[0])); + $type = substr($type, 0, -strlen($match[0])); } // objet_type garde invariant tout ce qui ne commence par par id_, spip_ @@ -44,41 +46,44 @@ function inc_icone_renommer_dist($fond, $fonction){ $dir = "images/"; $f = "$type-$size.png"; - if ($icone = find_in_theme($dir.$f)){ + if ($icone = find_in_theme($dir . $f)) { $dir = dirname($icone); $fond = $icone; if ($rtl AND $fr = "$type-rtl-$size.png" - AND file_exists($dir.'/'.$fr)) + AND file_exists($dir . '/' . $fr) + ) { $type = "$type-rtl"; + } $action = $fonction; - if ($action=="supprimer.gif"){ + if ($action == "supprimer.gif") { $action = "del"; - } - elseif ($action=="creer.gif"){ + } elseif ($action == "creer.gif") { $action = "new"; - } - elseif ($action=="edit.gif"){ + } elseif ($action == "edit.gif") { $action = "edit"; } - if (!in_array($action,array('del','new','edit'))) + if (!in_array($action, array('del', 'new', 'edit'))) { $action = ""; - if ($action){ + } + if ($action) { if ($fa = "$type-$action-$size.png" - AND file_exists($dir.'/'.$fa)){ - $fond = $dir .'/'. $fa; + AND file_exists($dir . '/' . $fa) + ) { + $fond = $dir . '/' . $fa; $fonction = ""; - } - else { + } else { $fonction = "$action-$size.png"; } } + // c'est bon ! - return array($fond,$fonction); + return array($fond, $fonction); } - return array($fond,$fonction); + return array($fond, $fonction); } + ?> diff --git a/ecrire/inc/iconifier.php b/ecrire/inc/iconifier.php index 7a2ab5f4aa..81c6b913d5 100644 --- a/ecrire/inc/iconifier.php +++ b/ecrire/inc/iconifier.php @@ -16,28 +16,31 @@ * @package SPIP\Core\Logos */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/actions'); /** * Retourne le formulaire de gestion de logo sur les objets. - * + * * @param string $objet * @param integer $id * @param string $script * @param bool $visible * @param bool $flag_modif - * + * * @return string|array * - Contenu du squelette calculé * - ou tableau d'information sur le squelette. */ -function inc_iconifier_dist($objet, $id, $script, $visible = false, $flag_modif = true) { +function inc_iconifier_dist($objet, $id, $script, $visible = false, $flag_modif = true) { // compat avec anciens appels $objet = objet_type($objet); - - return recuperer_fond('prive/objets/editer/logo',array('objet'=>$objet,'id_objet'=>$id,'editable'=>$flag_modif)); + + return recuperer_fond('prive/objets/editer/logo', + array('objet' => $objet, 'id_objet' => $id, 'editable' => $flag_modif)); } ?> diff --git a/ecrire/inc/importer_csv.php b/ecrire/inc/importer_csv.php index a2d453df6d..7fc556726b 100644 --- a/ecrire/inc/importer_csv.php +++ b/ecrire/inc/importer_csv.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); @@ -18,6 +20,7 @@ include_spip('inc/charsets'); * Based on an example by ramdac at ramdac dot org * Returns a multi-dimensional array from a CSV file optionally using the * first row as a header to create the underlying data as associative arrays. + * * @param string $file Filepath including filename * @param bool $head Use first row as header. * @param string $delim Specify a delimiter other than a comma. @@ -31,13 +34,15 @@ include_spip('inc/charsets'); * @param string $texte * @return array */ -function importer_csv_importcharset($texte){ +function importer_csv_importcharset($texte) { // le plus frequent, en particulier avec les trucs de ms@@@ $charset_source = 'iso-8859-1'; // mais open-office sait faire mieux, donc mefiance ! - if (is_utf8($texte)) + if (is_utf8($texte)) { $charset_source = 'utf-8'; - return importer_charset($texte,$charset_source); + } + + return importer_charset($texte, $charset_source); } /** @@ -47,7 +52,7 @@ function importer_csv_importcharset($texte){ * @param string $key * @return string */ -function importer_csv_nettoie_key($key){ +function importer_csv_nettoie_key($key) { return translitteration($key); } @@ -66,41 +71,46 @@ function importer_csv_nettoie_key($key){ function inc_importer_csv_dist($file, $head = false, $delim = ", ", $enclos = '"', $len = 10000) { $return = false; if (@file_exists($file) - AND $handle = fopen($file, "r")){ + AND $handle = fopen($file, "r") + ) { if ($head) { $header = fgetcsv($handle, $len, $delim, $enclos); - if ($header){ - $header = array_map('importer_csv_importcharset',$header); - $header = array_map('importer_csv_nettoie_key',$header); + if ($header) { + $header = array_map('importer_csv_importcharset', $header); + $header = array_map('importer_csv_nettoie_key', $header); $header_type = array(); foreach ($header as $heading) { - if (!isset($header_type[$heading])) + if (!isset($header_type[$heading])) { $header_type[$heading] = "scalar"; - else + } else { $header_type[$heading] = "array"; + } } } } - while (($data = fgetcsv($handle, $len, $delim, $enclos)) !== FALSE) { - $data = array_map('importer_csv_importcharset',$data); + while (($data = fgetcsv($handle, $len, $delim, $enclos)) !== false) { + $data = array_map('importer_csv_importcharset', $data); if ($head AND isset($header)) { $row = array(); - foreach ($header as $key=>$heading) { - if ($header_type[$heading]=="array"){ - if (!isset($row[$heading])) + foreach ($header as $key => $heading) { + if ($header_type[$heading] == "array") { + if (!isset($row[$heading])) { $row[$heading] = array(); - if (isset($data[$key]) AND strlen($data[$key])) - $row[$heading][]= $data[$key]; + } + if (isset($data[$key]) AND strlen($data[$key])) { + $row[$heading][] = $data[$key]; + } + } else { + $row[$heading] = (isset($data[$key])) ? $data[$key] : ''; } - else - $row[$heading]=(isset($data[$key])) ? $data[$key] : ''; } - $return[]=$row; + $return[] = $row; } else { - $return[]=$data; + $return[] = $data; } } } + return $return; } diff --git a/ecrire/inc/informer.php b/ecrire/inc/informer.php index b717b7c092..074f130ce6 100644 --- a/ecrire/inc/informer.php +++ b/ecrire/inc/informer.php @@ -10,13 +10,14 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} # Les information d'une rubrique selectionnee dans le mini navigateur // http://code.spip.net/@inc_informer_dist -function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') -{ +function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') { include_spip('inc/texte'); $titre = $descriptif = ''; if ($type == "rubrique") { @@ -30,15 +31,17 @@ function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') } $res = ''; - if ($type == "rubrique" AND $GLOBALS['spip_display'] != 1 AND isset($GLOBALS['meta']['image_process'])) - if ($GLOBALS['meta']['image_process'] != "non") { - $chercher_logo = charger_fonction('chercher_logo', 'inc'); - if ($res = $chercher_logo($id, 'id_rubrique', 'on')) { - list($fid, $dir, $nom, $format) = $res; - include_spip('inc/filtres_images_mini'); - $res = image_reduire("<img src='$fid' alt='' />", 100, 48); - if ($res) - $res = "<div style='float: ".$GLOBALS['spip_lang_right']."; margin-".$GLOBALS['spip_lang_right'].": -5px; margin-top: -5px;'>$res</div>"; + if ($type == "rubrique" AND $GLOBALS['spip_display'] != 1 AND isset($GLOBALS['meta']['image_process'])) { + if ($GLOBALS['meta']['image_process'] != "non") { + $chercher_logo = charger_fonction('chercher_logo', 'inc'); + if ($res = $chercher_logo($id, 'id_rubrique', 'on')) { + list($fid, $dir, $nom, $format) = $res; + include_spip('inc/filtres_images_mini'); + $res = image_reduire("<img src='$fid' alt='' />", 100, 48); + if ($res) { + $res = "<div style='float: " . $GLOBALS['spip_lang_right'] . "; margin-" . $GLOBALS['spip_lang_right'] . ": -5px; margin-top: -5px;'>$res</div>"; + } + } } } @@ -47,25 +50,27 @@ function inc_informer_dist($id, $col, $exclus, $rac, $type, $do = 'aff') # ce lien provoque la selection (directe) de la rubrique cliquee # et l'affichage de son titre dans le bandeau $titre = strtr(str_replace("'", "’", - str_replace('"', """, textebrut($titre))), - "\n\r", " "); + str_replace('"', """, textebrut($titre))), + "\n\r", " "); $js_func = $do . '_selection_titre'; + return "<div style='display: none;'>" - . "<input type='text' id='".$rac."_sel' value='$id' />" - . "<input type='text' id='".$rac."_sel2' value=\"" + . "<input type='text' id='" . $rac . "_sel' value='$id' />" + . "<input type='text' id='" . $rac . "_sel2' value=\"" . entites_html($titre) . "\" />" . "</div>" . "<div class='informer' style='padding: 5px; border-top: 0px;'>" . (!$res ? '' : $res) - . "<p><b>".safehtml($titre)."</b></p>" - . (!$descriptif ? '' : "<div>".safehtml($descriptif)."</div>") - . "<div style='text-align: ".$GLOBALS['spip_lang_right'].";'>" + . "<p><b>" . safehtml($titre) . "</b></p>" + . (!$descriptif ? '' : "<div>" . safehtml($descriptif) . "</div>") + . "<div style='text-align: " . $GLOBALS['spip_lang_right'] . ";'>" . "<input type='submit' class='fondo' value='" . _T('bouton_choisir') . "'\nonclick=\"$js_func('$titre',$id,'selection_rubrique','id_parent'); return false;\" />" - . "</div>" - . "</div>"; + . "</div>" + . "</div>"; } + ?> diff --git a/ecrire/inc/install.php b/ecrire/inc/install.php index be4b667543..539aac2b9c 100644 --- a/ecrire/inc/install.php +++ b/ecrire/inc/install.php @@ -14,9 +14,11 @@ * Gestion de l'installation de SPIP * * @package SPIP\Core\Installation -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -30,22 +32,21 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * ``` * install_fichier_connexion(_FILE_CONNECT_TMP, $contenu); * ``` - * + * * @todo * Renommer cette fonction qui peut servir à d'autres utilisations ? - * + * * @param string $nom * Chemin du fichier à créer * @param string $texte * Code source du fichier (sans l'ouverture/fermeture PHP) * @return void -**/ -function install_fichier_connexion($nom, $texte) -{ - $texte = "<"."?php\n" - . "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n" - . $texte - . "?".">"; + **/ +function install_fichier_connexion($nom, $texte) { + $texte = "<" . "?php\n" + . "if (!defined(\"_ECRIRE_INC_VERSION\")) return;\n" + . $texte + . "?" . ">"; ecrire_fichier($nom, $texte); } @@ -61,31 +62,31 @@ function install_fichier_connexion($nom, $texte) * @internal * Attention etape_ldap4 suppose qu'il n'y aura qu'un seul appel de fonction * dans le fichier produit. - * - * @param string $adr Adresse de la base de données {@example 'localhost'} - * @param string $port Numéro de port - * @param string $login Login de connexion - * @param string $pass Mot de passe de connexion - * @param string $base Nom de la base de données - * @param string $type Moteur SQL {@example 'sqlite3', 'mysql'} - * @param string $pref Préfixe des tables {@example 'spip'} - * @param string $ldap Type d'authentification (cas si 'ldap') - * @param string $charset Charset de la connexion SQL + * + * @param string $adr Adresse de la base de données {@example 'localhost'} + * @param string $port Numéro de port + * @param string $login Login de connexion + * @param string $pass Mot de passe de connexion + * @param string $base Nom de la base de données + * @param string $type Moteur SQL {@example 'sqlite3', 'mysql'} + * @param string $pref Préfixe des tables {@example 'spip'} + * @param string $ldap Type d'authentification (cas si 'ldap') + * @param string $charset Charset de la connexion SQL * @return string * Texte du fichier de connexion - * -**/ -function install_connexion($adr, $port, $login, $pass, $base, $type, $pref, $ldap = '', $charset = '') -{ - $adr = addcslashes($adr,"'\\"); - $port = addcslashes($port,"'\\"); - $login = addcslashes($login,"'\\"); - $pass = addcslashes($pass,"'\\"); - $base = addcslashes($base,"'\\"); - $type = addcslashes($type,"'\\"); - $pref = addcslashes($pref,"'\\"); - $ldap = addcslashes($ldap,"'\\"); - $charset = addcslashes($charset,"'\\"); + * + **/ +function install_connexion($adr, $port, $login, $pass, $base, $type, $pref, $ldap = '', $charset = '') { + $adr = addcslashes($adr, "'\\"); + $port = addcslashes($port, "'\\"); + $login = addcslashes($login, "'\\"); + $pass = addcslashes($pass, "'\\"); + $base = addcslashes($base, "'\\"); + $type = addcslashes($type, "'\\"); + $pref = addcslashes($pref, "'\\"); + $ldap = addcslashes($ldap, "'\\"); + $charset = addcslashes($charset, "'\\"); + return "\$GLOBALS['spip_connect_version'] = 0.8;\n" . "spip_connect_db(" . "'$adr','$port','$login','$pass','$base'" @@ -95,33 +96,35 @@ function install_connexion($adr, $port, $login, $pass, $base, $type, $pref, $lda /** * Analyse un fichier de connexion à une base de données - * + * * Le fichier contient normalement le résultat de la fonction install_connexion(). * L'analyse tient également compte des syntaxes des versions précédentes. - * + * * @param string $file * Chemin du fichier de connexion à analyser * @return array * Tableau des informations sur la connexion -**/ -function analyse_fichier_connection($file) -{ + **/ +function analyse_fichier_connection($file) { $s = @join('', file($file)); if (preg_match("#mysql_connect\([\"'](.*)[\"'],[\"'](.*)[\"'],[\"'](.*)[\"']\)#", $s, $regs)) { array_shift($regs); + return $regs; } else { $ar = '\s*\'([^\']*)\''; $r = '\s*,' . $ar; $r = "#spip_connect_db[(]$ar$r$r$r$r(?:$r(?:$r(?:$r(?:$r)?)?)?)?#"; if (preg_match($r, $s, $regs)) { - $regs[2] = $regs[1] . (!$regs[2] ? '' : ":".$regs[2].";"); + $regs[2] = $regs[1] . (!$regs[2] ? '' : ":" . $regs[2] . ";"); array_shift($regs); array_shift($regs); + return $regs; } } spip_log("$file n'est pas un fichier de connexion"); + return array(); } @@ -129,31 +132,31 @@ function analyse_fichier_connection($file) * Liste les connecteurs aux bases SQL disponibles * * Dans le code SPIP ces connecteurs sont souvent appelés $connect ou $serveur - * + * * @example * $bases = bases_referencees(_FILE_CONNECT_TMP); - * + * * @param string $exclu * Exclure un connecteur particulier (nom du fichier) * @return array * Liste des noms de connecteurs -**/ -function bases_referencees($exclu = '') -{ + **/ +function bases_referencees($exclu = '') { $tables = array(); - foreach(preg_files(_DIR_CONNECT, '.php$') as $f) { - if ($f != $exclu AND analyse_fichier_connection($f)) - $tables[]= basename($f, '.php'); + foreach (preg_files(_DIR_CONNECT, '.php$') as $f) { + if ($f != $exclu AND analyse_fichier_connection($f)) { + $tables[] = basename($f, '.php'); + } } + return $tables; } -function install_mode_appel($server_db, $tout = true) -{ +function install_mode_appel($server_db, $tout = true) { return ($server_db != 'mysql') ? '' - : (($tout ? test_rappel_nom_base_mysql($server_db) : '') - . test_sql_mode_mysql($server_db) ); + : (($tout ? test_rappel_nom_base_mysql($server_db) : '') + . test_sql_mode_mysql($server_db)); } // @@ -168,41 +171,48 @@ function tester_compatibilite_hebergement() { $php = array($regs[1], $regs[2], $regs[3]); $m = '5.1.0'; $min = explode('.', $m); - if ($php[0]<$min[0] - OR ($php[0]==$min[0] AND $php[1]<$min[1]) - OR ($php[0]==$min[0] AND $php[1]==$min[1] AND $php[2]<$min[2])) - $err[] = _T('install_php_version', array('version' => $p, 'minimum' => $m)); + if ($php[0] < $min[0] + OR ($php[0] == $min[0] AND $php[1] < $min[1]) + OR ($php[0] == $min[0] AND $php[1] == $min[1] AND $php[2] < $min[2]) + ) { + $err[] = _T('install_php_version', array('version' => $p, 'minimum' => $m)); + } } // Si on n'a pas la bonne version de PHP, c'est la fin - if ($err) - die("<div class='error'>" - . "<h3>"._T('avis_attention').'</h3><p>'._T('install_echec_annonce')."</p><ul class='spip'>" - . "<li><strong>{$err[0]}</strong></li>\n</ul></div>"); + if ($err) { + die("<div class='error'>" + . "<h3>" . _T('avis_attention') . '</h3><p>' . _T('install_echec_annonce') . "</p><ul class='spip'>" + . "<li><strong>{$err[0]}</strong></li>\n</ul></div>"); + } // Il faut une base de donnees tout de meme ... $serveurs = install_select_serveur(); - if (!$serveurs) + if (!$serveurs) { $err[] = _T('install_extension_php_obligatoire') - . " <a href='http://www.php.net/mysql'>MYSQL</a>" - . "| <a href='http://www.php.net/pgsql'>PostgreSQL</a>" - . "| <a href='http://www.php.net/sqlite'>SQLite</a>"; + . " <a href='http://www.php.net/mysql'>MYSQL</a>" + . "| <a href='http://www.php.net/pgsql'>PostgreSQL</a>" + . "| <a href='http://www.php.net/sqlite'>SQLite</a>"; + } // et il faut preg - if (!function_exists('preg_match_all')) + if (!function_exists('preg_match_all')) { $err[] = _T('install_extension_php_obligatoire') - . " <a href='http://se.php.net/pcre'>PCRE</a>"; + . " <a href='http://se.php.net/pcre'>PCRE</a>"; + } // et surtout pas ce mbstring.overload - if ($a = @ini_get('mbstring.func_overload')) + if ($a = @ini_get('mbstring.func_overload')) { $err[] = _T('install_extension_mbstring') - . "mbstring.func_overload=$a - <a href='http://www.php.net/mb_string'>mb_string</a>.<br /><small>"; + . "mbstring.func_overload=$a - <a href='http://www.php.net/mb_string'>mb_string</a>.<br /><small>"; + } if ($err) { - echo "<div class='error'>" - ."<h3>"._T('avis_attention').'</h3><p>'._T('install_echec_annonce')."</p><ul class='spip'>"; - foreach($err as $e) - echo "<li><strong>$e</strong></li>\n"; + echo "<div class='error'>" + . "<h3>" . _T('avis_attention') . '</h3><p>' . _T('install_echec_annonce') . "</p><ul class='spip'>"; + foreach ($err as $e) { + echo "<li><strong>$e</strong></li>\n"; + } # a priori ici on pourrait die(), mais il faut laisser la possibilite # de forcer malgre tout (pour tester, ou si bug de detection) @@ -221,26 +231,30 @@ function login_hebergeur() { if ($GLOBALS['HTTP_X_HOST'] == 'membres.lycos.fr') { preg_match(',^/([^/]*),', $GLOBALS['REQUEST_URI'], $regs); $login_hebergeur = $regs[1]; + } // Altern + else { + if (preg_match(',altern\.com$,', $GLOBALS['SERVER_NAME'])) { + preg_match(',([^.]*\.[^.]*)$,', $GLOBALS['HTTP_HOST'], $regs); + $login_hebergeur = preg_replace('[^\w\d]', '_', $regs[1]); + } // Free + else { + if (preg_match(',(.*)\.free\.fr$,', $GLOBALS['SERVER_NAME'], $regs)) { + $base_hebergeur = 'sql.free.fr'; + $login_hebergeur = $regs[1]; + } else { + $login_hebergeur = ''; + } + } } - // Altern - else if (preg_match(',altern\.com$,', $GLOBALS['SERVER_NAME'])) { - preg_match(',([^.]*\.[^.]*)$,', $GLOBALS['HTTP_HOST'], $regs); - $login_hebergeur = preg_replace('[^\w\d]', '_', $regs[1]); - } - // Free - else if (preg_match(',(.*)\.free\.fr$,', $GLOBALS['SERVER_NAME'], $regs)) { - $base_hebergeur = 'sql.free.fr'; - $login_hebergeur = $regs[1]; - } else $login_hebergeur = ''; return array($base_hebergeur, $login_hebergeur); } // http://code.spip.net/@info_etape -function info_etape($titre, $complement = ''){ - return "<h2>".$titre."</h2>\n" . - ($complement ? "".$complement."\n":''); +function info_etape($titre, $complement = '') { + return "<h2>" . $titre . "</h2>\n" . + ($complement ? "" . $complement . "\n" : ''); } /** @@ -248,22 +262,26 @@ function info_etape($titre, $complement = ''){ * * @param string $code Texte du bouton * @return string Code HTML du bouton -**/ + **/ function bouton_suivant($code = '') { - if($code=='') $code = _T('bouton_suivant'); + if ($code == '') { + $code = _T('bouton_suivant'); + } static $suivant = 0; - $id = 'suivant'.(($suivant>0)?strval($suivant):''); - $suivant +=1; - return "\n<p class='boutons suivant'><input id='".$id."' type='submit'\nvalue=\"" . - $code . - " >>\" /></p>\n"; + $id = 'suivant' . (($suivant > 0) ? strval($suivant) : ''); + $suivant += 1; + + return "\n<p class='boutons suivant'><input id='" . $id . "' type='submit'\nvalue=\"" . + $code . + " >>\" /></p>\n"; } // http://code.spip.net/@info_progression_etape -function info_progression_etape($en_cours, $phase, $dir, $erreur = false){ +function info_progression_etape($en_cours, $phase, $dir, $erreur = false) { //$en_cours = _request('etape')?_request('etape'):""; - $liste = find_all_in_path($dir,$phase.'(([0-9])+|fin)[.]php$'); - $debut = 1; $etat = "ok"; + $liste = find_all_in_path($dir, $phase . '(([0-9])+|fin)[.]php$'); + $debut = 1; + $etat = "ok"; $last = count($liste); // $texte_etat = array('ok'=>'OK','encours'=>_T('en_cours'),'todo'=>_T('todo')); @@ -282,106 +300,119 @@ function info_progression_etape($en_cours, $phase, $dir, $erreur = false){ $aff_etapes = "<ul id='infos_etapes' class='infos_$phase$en_cours'>"; - foreach($liste as $etape=>$fichier){ + foreach ($liste as $etape => $fichier) { if ($debut < $last) { - if ($debut == $en_cours && $erreur) $class = "on erreur"; - else if ($debut == $en_cours) $class = "on"; - else if ($debut > $en_cours) $class = "prochains"; - else $class = "valides"; + if ($debut == $en_cours && $erreur) { + $class = "on erreur"; + } else { + if ($debut == $en_cours) { + $class = "on"; + } else { + if ($debut > $en_cours) { + $class = "prochains"; + } else { + $class = "valides"; + } + } + } $aff_etapes .= "<li class='$class'><div class='fond'>"; - $aff_etapes .= ($debut == $en_cours)?"<strong>":''; - $aff_etapes .= "<em>"._T('etape')." </em><span class='numero_etape'>$debut</span><em> : </em>"; + $aff_etapes .= ($debut == $en_cours) ? "<strong>" : ''; + $aff_etapes .= "<em>" . _T('etape') . " </em><span class='numero_etape'>$debut</span><em> : </em>"; $aff_etapes .= $intitule_etat["$phase"][$debut]; - $aff_etapes .= ($debut == $en_cours)?"</strong>":''; + $aff_etapes .= ($debut == $en_cours) ? "</strong>" : ''; $aff_etapes .= "</div></li>"; } $debut++; } $aff_etapes .= "</ul>"; $aff_etapes .= "<br class='nettoyeur' />\n"; + return $aff_etapes; } // http://code.spip.net/@fieldset -function fieldset($legend, $champs = array(), $apres = '', $avant = '') { +function fieldset($legend, $champs = array(), $apres = '', $avant = '') { return "<fieldset>\n" . - $avant . - ($legend ? "<legend>".$legend."</legend>\n" : '') . - fieldset_champs($champs) . - $apres . - "</fieldset>\n"; + $avant . + ($legend ? "<legend>" . $legend . "</legend>\n" : '') . + fieldset_champs($champs) . + $apres . + "</fieldset>\n"; } -function fieldset_champs($champs = array()) - { +function fieldset_champs($champs = array()) { $fieldset = ''; foreach ($champs as $nom => $contenu) { $type = isset($contenu['hidden']) ? 'hidden' : (preg_match(',^pass,', $nom) ? 'password' : 'text'); $class = isset($contenu['hidden']) ? '' : "class='formo' size='40' "; - if(isset($contenu['alternatives'])) { - $fieldset .= $contenu['label'] ."\n"; - foreach($contenu['alternatives'] as $valeur => $label) { - $fieldset .= "<input type='radio' name='".$nom . - "' id='$nom-$valeur' value='$valeur'" - .(($valeur==$contenu['valeur'])?"\nchecked='checked'":'') - ."/>\n"; - $fieldset .= "<label for='$nom-$valeur'>".$label."</label>\n"; + if (isset($contenu['alternatives'])) { + $fieldset .= $contenu['label'] . "\n"; + foreach ($contenu['alternatives'] as $valeur => $label) { + $fieldset .= "<input type='radio' name='" . $nom . + "' id='$nom-$valeur' value='$valeur'" + . (($valeur == $contenu['valeur']) ? "\nchecked='checked'" : '') + . "/>\n"; + $fieldset .= "<label for='$nom-$valeur'>" . $label . "</label>\n"; } $fieldset .= "<br />\n"; - } - else { - $fieldset .= "<label for='".$nom."'>".$contenu['label']."</label>\n"; - $fieldset .= "<input ".$class."type='".$type."' id='" . $nom . "' name='".$nom."'\nvalue='".$contenu['valeur']."'" - .(preg_match(',^(pass|login),', $nom)?" autocomplete='off'":'') - . ((isset($contenu['required']) AND $contenu['required'])?" required='required'":"") - . " />\n"; + } else { + $fieldset .= "<label for='" . $nom . "'>" . $contenu['label'] . "</label>\n"; + $fieldset .= "<input " . $class . "type='" . $type . "' id='" . $nom . "' name='" . $nom . "'\nvalue='" . $contenu['valeur'] . "'" + . (preg_match(',^(pass|login),', $nom) ? " autocomplete='off'" : '') + . ((isset($contenu['required']) AND $contenu['required']) ? " required='required'" : "") + . " />\n"; } } + return $fieldset; } -function install_select_serveur() -{ +function install_select_serveur() { $options = array(); $dir = _DIR_RESTREINT . 'req/'; $d = @opendir($dir); - if (!$d) return array(); - while (($f = readdir($d))!==false) { + if (!$d) { + return array(); + } + while (($f = readdir($d)) !== false) { if ((preg_match('/^(.*)[.]php$/', $f, $s)) - AND is_readable($f = $dir . $f)) { + AND is_readable($f = $dir . $f) + ) { require_once($f); $s = $s[1]; $v = 'spip_versions_' . $s; if (function_exists($v) AND $v()) { $titre = _T("install_select_type_$s"); // proposer mysql par defaut si dispo - $checked = ($s=='mysql'?" checked='checked'":""); - $options[$s] = "<li><input type='radio' id='$s' value='$s' name='server_db'$checked>" - ."<label for='$s'>" . ($titre ? $titre : $s)."</label></li>"; - } else spip_log("$s: portage indisponible"); + $checked = ($s == 'mysql' ? " checked='checked'" : ""); + $options[$s] = "<li><input type='radio' id='$s' value='$s' name='server_db'$checked>" + . "<label for='$s'>" . ($titre ? $titre : $s) . "</label></li>"; + } else { + spip_log("$s: portage indisponible"); + } } } sort($options); + return $options; } // http://code.spip.net/@install_connexion_form -function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape, $jquery = true) -{ +function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape, $jquery = true) { $server_db = (is_string($predef[0])) ? $predef[0] : ''; return generer_form_ecrire('install', ( - "\n<input type='hidden' name='etape' value='$etape' />" - . $hidden - . (_request('echec')? - ("<p><b>"._T('avis_connexion_echec_1'). - "</b></p><p>"._T('avis_connexion_echec_2')."</p><p style='font-size: small;'>"._T('avis_connexion_echec_3')."</p>") - :"") - - . ($jquery?http_script('', 'jquery.js'):'') - . http_script(' + "\n<input type='hidden' name='etape' value='$etape' />" + . $hidden + . (_request('echec') ? + ("<p><b>" . _T('avis_connexion_echec_1') . + "</b></p><p>" . _T('avis_connexion_echec_2') . "</p><p style='font-size: small;'>" . _T('avis_connexion_echec_3') . "</p>") + : "") + + . ($jquery ? http_script('', 'jquery.js') : '') + . http_script(' $(document).ready(function() { $("input[type=hidden][name=server_db]").each(function(){ if ($(this).attr("value").match("sqlite*")){ @@ -404,67 +435,67 @@ function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape, $j }); });') - . ($server_db - ? '<input type="hidden" name="server_db" value="'.$server_db.'" />' + . ($server_db + ? '<input type="hidden" name="server_db" value="' . $server_db . '" />' . (($predef[0]) - ?('<h3>'._T('install_serveur_hebergeur').'</h3>') - :'') - : ('<fieldset><legend>' - ._T('install_select_type_db') - . "</legend>" - .'<p class="explication">' - . _T('install_types_db_connus') - // Passer l'avertissement SQLIte en commentaire, on pourra facilement le supprimer par la suite sans changer les traductions. - // . "<br /><small>(". _T('install_types_db_connus_avertissement') .')</small>' - .'</p>' - . "\n<div class='p'>\n<ul>\n" - . join("\n", install_select_serveur()) - . "\n</ul>\n</div></fieldset>") - ) - . '<div id="install_adresse_base_hebergeur">' - . '<p>'. _T('texte_connexion_mysql').'</p>' - . ($predef[1] - ? '<h3>'._T('install_adresse_base_hebergeur').'</h3>' - : fieldset(_T('entree_base_donnee_1'), - array( - 'adresse_db' => array( - 'label' => $db[1], - 'valeur' => $db[0] - ), + ? ('<h3>' . _T('install_serveur_hebergeur') . '</h3>') + : '') + : ('<fieldset><legend>' + . _T('install_select_type_db') + . "</legend>" + . '<p class="explication">' + . _T('install_types_db_connus') + // Passer l'avertissement SQLIte en commentaire, on pourra facilement le supprimer par la suite sans changer les traductions. + // . "<br /><small>(". _T('install_types_db_connus_avertissement') .')</small>' + . '</p>' + . "\n<div class='p'>\n<ul>\n" + . join("\n", install_select_serveur()) + . "\n</ul>\n</div></fieldset>") ) - ) - ) - . '</div>' - - . '<div id="install_login_base_hebergeur">' - . ($predef[2] - ? '<h3>'._T('install_login_base_hebergeur').'</h3>' - : fieldset(_T('entree_login_connexion_1'), - array( - 'login_db' => array( - 'label' => $login[1], - 'valeur' => $login[0] - ), + . '<div id="install_adresse_base_hebergeur">' + . '<p>' . _T('texte_connexion_mysql') . '</p>' + . ($predef[1] + ? '<h3>' . _T('install_adresse_base_hebergeur') . '</h3>' + : fieldset(_T('entree_base_donnee_1'), + array( + 'adresse_db' => array( + 'label' => $db[1], + 'valeur' => $db[0] + ), + ) + ) ) - ) - ) - . '</div>' - - . '<div id="install_pass_base_hebergeur">' - . ($predef[3] - ? '<h3>'._T('install_pass_base_hebergeur').'</h3>' - : fieldset(_T('entree_mot_passe_1'), - array( - 'pass_db' => array( - 'label' => $pass[1], - 'valeur' => $pass[0] - ), + . '</div>' + + . '<div id="install_login_base_hebergeur">' + . ($predef[2] + ? '<h3>' . _T('install_login_base_hebergeur') . '</h3>' + : fieldset(_T('entree_login_connexion_1'), + array( + 'login_db' => array( + 'label' => $login[1], + 'valeur' => $login[0] + ), + ) + ) ) - ) - ) - . '</div>' + . '</div>' + + . '<div id="install_pass_base_hebergeur">' + . ($predef[3] + ? '<h3>' . _T('install_pass_base_hebergeur') . '</h3>' + : fieldset(_T('entree_mot_passe_1'), + array( + 'pass_db' => array( + 'label' => $pass[1], + 'valeur' => $pass[0] + ), + ) + ) + ) + . '</div>' - . bouton_suivant())); + . bouton_suivant())); } @@ -472,71 +503,78 @@ function install_connexion_form($db, $login, $pass, $predef, $hidden, $etape, $j // sauf s'ils sont predefinis. // http://code.spip.net/@predef_ou_cache -function predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) -{ +function predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) { return ((defined('_INSTALL_HOST_DB')) ? '' - : "\n<input type='hidden' name='adresse_db' value=\"".spip_htmlspecialchars($adresse_db)."\" />" + : "\n<input type='hidden' name='adresse_db' value=\"" . spip_htmlspecialchars($adresse_db) . "\" />" ) . ((defined('_INSTALL_USER_DB')) ? '' - : "\n<input type='hidden' name='login_db' value=\"".spip_htmlspecialchars($login_db)."\" />" + : "\n<input type='hidden' name='login_db' value=\"" . spip_htmlspecialchars($login_db) . "\" />" ) . ((defined('_INSTALL_PASS_DB')) ? '' - : "\n<input type='hidden' name='pass_db' value=\"".spip_htmlspecialchars($pass_db)."\" />" + : "\n<input type='hidden' name='pass_db' value=\"" . spip_htmlspecialchars($pass_db) . "\" />" ) . ((defined('_INSTALL_SERVER_DB')) ? '' - : "\n<input type='hidden' name='server_db' value=\"".spip_htmlspecialchars($server_db)."\" />" - ); + : "\n<input type='hidden' name='server_db' value=\"" . spip_htmlspecialchars($server_db) . "\" />" + ); } // presentation des bases existantes // http://code.spip.net/@install_etape_liste_bases -function install_etape_liste_bases($server_db, $login_db, $disabled = array()) -{ +function install_etape_liste_bases($server_db, $login_db, $disabled = array()) { $bases = $checked = array(); $noms = sql_listdbs($server_db); - if (!$noms) return ''; + if (!$noms) { + return ''; + } - foreach ($noms as $nom){ + foreach ($noms as $nom) { $id = spip_htmlspecialchars($nom); $dis = in_array($nom, $disabled) ? " disabled='disabled'" : ''; $base = " name=\"choix_db\" value=\"" - . $nom - . '"' - . $dis - . " type='radio' id='$id'"; + . $nom + . '"' + . $dis + . " type='radio' id='$id'"; $label = "<label for='$id'>" - . ($dis ? "<i>$nom</i>" : $nom) - . "</label>"; + . ($dis ? "<i>$nom</i>" : $nom) + . "</label>"; if (!$checked AND !$dis AND - (($nom == $login_db) OR - ($GLOBALS['table_prefix'] == $nom))) { + (($nom == $login_db) OR + ($GLOBALS['table_prefix'] == $nom)) + ) { $checked = "<input$base checked='checked' />\n$label"; } else { - $bases[]= "<input$base />\n$label"; + $bases[] = "<input$base />\n$label"; } } - if (!$bases && !$checked) return false; + if (!$bases && !$checked) { + return false; + } - if ($checked) {array_unshift($bases, $checked); $checked = true;} + if ($checked) { + array_unshift($bases, $checked); + $checked = true; + } return array($checked, $bases); } -function install_propager($hidden) -{ +function install_propager($hidden) { $res = ''; - foreach($hidden as $k) { + foreach ($hidden as $k) { $v = spip_htmlentities(_request($k)); $res .= "<input type='hidden' name='$k' value='$v' />"; } + return $res; } + ?> diff --git a/ecrire/inc/invalideur.php b/ecrire/inc/invalideur.php index cc1e55da01..17b3cd2c0e 100644 --- a/ecrire/inc/invalideur.php +++ b/ecrire/inc/invalideur.php @@ -14,48 +14,58 @@ * Gestion du cache et des invalidations de cache * * @package SPIP\Core\Cache -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/serial'); /** Estime la taille moyenne d'un fichier cache, pour ne pas les regarder (10ko) */ -if (!defined('_TAILLE_MOYENNE_FICHIER_CACHE')) define('_TAILLE_MOYENNE_FICHIER_CACHE', 1024 * 10); +if (!defined('_TAILLE_MOYENNE_FICHIER_CACHE')) { + define('_TAILLE_MOYENNE_FICHIER_CACHE', 1024*10); +} /** * Si un fichier n'a pas été servi (fileatime) depuis plus d'une heure, on se sent * en droit de l'éliminer */ -if (!defined('_AGE_CACHE_ATIME')) define('_AGE_CACHE_ATIME', 3600); +if (!defined('_AGE_CACHE_ATIME')) { + define('_AGE_CACHE_ATIME', 3600); +} /** * Calcul le nombre de fichiers à la racine d'un répertoire ainsi qu'une * approximation de la taille du répertoire * * On ne calcule que la racine pour pour aller vite. - * + * * @param string $dir Chemin du répertoire * @param string $nb_estim_taille Nombre de fichiers maximum pour estimer la taille * @return bool|array * * - false si le répertoire ne peut pas être ouvert * - array(nombre de fichiers, approximation de la taille en octet) sinon -**/ + **/ function nombre_de_fichiers_repertoire($dir, $nb_estim_taille = 20) { $taille = 0; // mesurer la taille de N fichiers au hasard dans le repertoire $nb = $nb_estim_taille; - if (!$h = @opendir($dir)) return false; + if (!$h = @opendir($dir)) { + return false; + } $total = 0; - while (($fichier = @readdir($h)) !== false) - if ($fichier[0]!='.' AND !is_dir("$dir/$fichier")){ + while (($fichier = @readdir($h)) !== false) { + if ($fichier[0] != '.' AND !is_dir("$dir/$fichier")) { $total++; - if ($nb AND rand(1,10)==1){ + if ($nb AND rand(1, 10) == 1) { $taille += filesize("$dir/$fichier"); $nb--; } } + } closedir($h); - return array($total,$taille?$taille/($nb_estim_taille-$nb):_TAILLE_MOYENNE_FICHIER_CACHE); + + return array($total, $taille ? $taille/($nb_estim_taille-$nb) : _TAILLE_MOYENNE_FICHIER_CACHE); } @@ -66,18 +76,19 @@ function nombre_de_fichiers_repertoire($dir, $nb_estim_taille = 20) { * on y va donc à l'estime ! * * @return int Taille approximative en octets -**/ + **/ function taille_du_cache() { $total = 0; $taille = 0; - for ($i=0;$i<16;$i++) { + for ($i = 0; $i < 16; $i++) { $l = dechex($i); $dir = sous_repertoire(_DIR_CACHE, $l); - list($n,$s) = nombre_de_fichiers_repertoire($dir); + list($n, $s) = nombre_de_fichiers_repertoire($dir); $total += $n; $taille += $s; } - return $total * $taille / 16; + + return $total*$taille/16; } @@ -97,46 +108,48 @@ function taille_du_cache() { * être mise à `false` (aucun changement sur `derniere_modif`) ou * sur une liste de type d'objets (changements uniquement lorsqu'une * modification d'un des objets se présente). - * + * * @param string $cond * Condition d'invalidation * @param bool $modif * Inutilisé -**/ + **/ function suivre_invalideur($cond, $modif = true) { - if (!$modif) + if (!$modif) { return; + } // determiner l'objet modifie : forum, article, etc - if (preg_match(',["\']([a-z_]+)[/"\'],', $cond, $r)) + if (preg_match(',["\']([a-z_]+)[/"\'],', $cond, $r)) { $objet = objet_type($r[1]); + } // stocker la date_modif_$objet (ne sert a rien pour le moment) - if (isset($objet)) - ecrire_meta('derniere_modif_'.$objet, time()); + if (isset($objet)) { + ecrire_meta('derniere_modif_' . $objet, time()); + } // si $derniere_modif_invalide est un array('article', 'rubrique') // n'affecter la meta que si un de ces objets est modifie if (is_array($GLOBALS['derniere_modif_invalide'])) { - if (in_array($objet, $GLOBALS['derniere_modif_invalide'])) + if (in_array($objet, $GLOBALS['derniere_modif_invalide'])) { ecrire_meta('derniere_modif', time()); - } - // sinon, cas standard, toujours affecter la meta - else + } + } // sinon, cas standard, toujours affecter la meta + else { ecrire_meta('derniere_modif', time()); + } } - - /** * Purge un répertoire de ses fichiers * * Utilisée entre autres pour vider le cache depuis l'espace privé * * @uses supprimer_fichier() - * + * * @param string $dir * Chemin du répertoire à purger * @param array $options @@ -149,36 +162,44 @@ function suivre_invalideur($cond, $modif = true) { * - limit : nombre maximum de suppressions * @return int * Nombre de fichiers supprimés -**/ + **/ function purger_repertoire($dir, $options = array()) { $handle = @opendir($dir); - if (!$handle) return; + if (!$handle) { + return; + } $total = 0; while (($fichier = @readdir($handle)) !== false) { // Eviter ".", "..", ".htaccess", ".svn" etc. - if ($fichier[0] == '.') continue; + if ($fichier[0] == '.') { + continue; + } $chemin = "$dir/$fichier"; if (is_file($chemin)) { - if ( (!isset($options['atime']) OR (@fileatime($chemin) < $options['atime'])) + if ((!isset($options['atime']) OR (@fileatime($chemin) < $options['atime'])) AND (!isset($options['mtime']) OR (@filemtime($chemin) < $options['mtime'])) - ) { + ) { supprimer_fichier($chemin); - $total ++; + $total++; + } + } else { + if (is_dir($chemin)) { + $opts = $options; + if (isset($otpions['limit'])) { + $otps['limit'] = $otpions['limit']-$total; + } + $total += purger_repertoire($chemin, $opts); + if (isset($options['subdir']) && $options['subdir']) { + spip_unlink($chemin); + } } - } - else if (is_dir($chemin)){ - $opts = $options; - if (isset($otpions['limit'])) - $otps['limit'] = $otpions['limit'] - $total; - $total += purger_repertoire($chemin, $opts); - if (isset($options['subdir']) && $options['subdir']) - spip_unlink($chemin); } - if (isset($options['limit']) AND $total>=$options['limit']) + if (isset($options['limit']) AND $total >= $options['limit']) { break; + } } closedir($handle); @@ -202,38 +223,41 @@ function appliquer_quota_cache() { $l = dechex($tour_quota_cache); $dir = sous_repertoire(_DIR_CACHE, $l); - list($nombre,$taille) = nombre_de_fichiers_repertoire($dir); - $total_cache = $taille * $nombre; + list($nombre, $taille) = nombre_de_fichiers_repertoire($dir); + $total_cache = $taille*$nombre; spip_log("Taille du CACHE estimee ($l): " - .(intval(16*$total_cache/(1024*1024/10))/10)." Mo","invalideur"); + . (intval(16*$total_cache/(1024*1024/10))/10) . " Mo", "invalideur"); // Nombre max de fichiers a supprimer if ($GLOBALS['quota_cache'] > 0 - AND $taille > 0) { - $trop = $total_cache - ($GLOBALS['quota_cache']/16)*1024*1024; - $trop = 3 * intval($trop / $taille); + AND $taille > 0 + ) { + $trop = $total_cache-($GLOBALS['quota_cache']/16)*1024*1024; + $trop = 3*intval($trop/$taille); if ($trop > 0) { $n = purger_repertoire($dir, array( - 'atime' => time() - _AGE_CACHE_ATIME, + 'atime' => time()-_AGE_CACHE_ATIME, 'limit' => $trop, 'subdir' => true // supprimer les vieux sous repertoire de session (avant [15851]) ) ); - spip_log("$dir : $n/$trop caches supprimes [taille moyenne $taille]","invalideur"); - $total_cache = intval(max(0,(16*$total_cache) - $n*$taille)/(1024*1024)*10)/10; - spip_log("cache restant estime : $total_cache Mo, ratio ".$total_cache/$GLOBALS['quota_cache'],"invalideur"); + spip_log("$dir : $n/$trop caches supprimes [taille moyenne $taille]", "invalideur"); + $total_cache = intval(max(0, (16*$total_cache)-$n*$taille)/(1024*1024)*10)/10; + spip_log("cache restant estime : $total_cache Mo, ratio " . $total_cache/$GLOBALS['quota_cache'], "invalideur"); // redemander la main pour eviter que le cache ne gonfle trop // mais pas si on ne peut pas purger car les fichiers sont trops recents if ( - $total_cache/$GLOBALS['quota_cache']>1.5 - AND $n*50>$trop) { + $total_cache/$GLOBALS['quota_cache'] > 1.5 + AND $n*50 > $trop + ) { $encore = true; - spip_log("Il faut encore purger","invalideur"); + spip_log("Il faut encore purger", "invalideur"); } } } + return $encore; } @@ -247,12 +271,13 @@ function appliquer_quota_cache() { function retire_cache($cache) { if (preg_match( - "|^([0-9a-f]/)?([0-9]+/)?[0-9a-f]+\.cache(\.gz)?$|i", - $cache)) { + "|^([0-9a-f]/)?([0-9]+/)?[0-9a-f]+\.cache(\.gz)?$|i", + $cache)) { // supprimer le fichier (de facon propre) supprimer_fichier(_DIR_CACHE . $cache); - } else + } else { spip_log("Nom de fichier cache incorrect : $cache"); + } } ####################################################################### @@ -267,8 +292,9 @@ function retire_cache($cache) { // la meta est toujours false ; mais evitons un bug si elle est appellee // http://code.spip.net/@retire_caches function retire_caches($chemin = '') { - if (isset($GLOBALS['meta']['invalider_caches'])) - effacer_meta('invalider_caches'); # concurrence + if (isset($GLOBALS['meta']['invalider_caches'])) { + effacer_meta('invalider_caches'); + } # concurrence } @@ -291,7 +317,7 @@ function supprime_invalideurs() { } // Calcul des pages : noter dans la base les liens d'invalidation // http://code.spip.net/@maj_invalideurs -function maj_invalideurs ($fichier, &$page) { } +function maj_invalideurs($fichier, &$page) { } // les invalideurs sont de la forme "objet/id_objet" // http://code.spip.net/@insere_invalideur diff --git a/ecrire/inc/journal.php b/ecrire/inc/journal.php index e59f153061..9ccf87ce08 100644 --- a/ecrire/inc/journal.php +++ b/ecrire/inc/journal.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /* @@ -22,10 +24,12 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param array $opt */ function inc_journal_dist($phrase, $opt = array()) { - if (!strlen($phrase)) + if (!strlen($phrase)) { return; - if ($opt) - $phrase .= " :: ".str_replace("\n", ' ', join(', ',$opt)); + } + if ($opt) { + $phrase .= " :: " . str_replace("\n", ' ', join(', ', $opt)); + } spip_log($phrase, 'journal'); } diff --git a/ecrire/inc/json.php b/ecrire/inc/json.php index 1085dd675c..e84f949bdb 100644 --- a/ecrire/inc/json.php +++ b/ecrire/inc/json.php @@ -10,12 +10,15 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Les fonctions de toggg pour faire du JSON /** * Transform a variable into its javascript equivalent (recursive) + * * @access private * @param mixed the variable * @return string js script | boolean false if error @@ -28,12 +31,12 @@ function var2js($var) { case is_null($var) : return 'null'; case is_string($var) : - return '"' .addcslashes($var, "\"\\\n\r/") . '"'; + return '"' . addcslashes($var, "\"\\\n\r/") . '"'; case is_bool($var) : return $var ? 'true' : 'false'; case is_scalar($var) : return (string)$var; - case is_object( $var) : + case is_object($var) : $var = get_object_vars($var); $asso = true; case is_array($var) : @@ -49,20 +52,23 @@ function var2js($var) { $ret .= $sep . '"' . $key . '":' . var2js($elt); $sep = ','; } - return $ret ."}"; + + return $ret . "}"; } else { $ret = '['; foreach ($var as $elt) { $ret .= $sep . var2js($elt); $sep = ','; } - return $ret ."]"; + + return $ret . "]"; } } + return false; } -if(!function_exists('json_encode')) { +if (!function_exists('json_encode')) { function json_encode($v) { return var2js($v); } } @@ -72,12 +78,12 @@ function json_export($var) { // flag indiquant qu'on est en iframe et qu'il faut proteger nos // donnees dans un <textarea> ; attention $_FILES a ete vide par array_pop - if (defined('FILE_UPLOAD')) - return "<textarea>".spip_htmlspecialchars($var)."</textarea>"; - else + if (defined('FILE_UPLOAD')) { + return "<textarea>" . spip_htmlspecialchars($var) . "</textarea>"; + } else { return $var; + } } - ?> diff --git a/ecrire/inc/lang.php b/ecrire/inc/lang.php index 5c400390fa..a31e2fdf96 100644 --- a/ecrire/inc/lang.php +++ b/ecrire/inc/lang.php @@ -11,12 +11,13 @@ \***************************************************************************/ /** - * Gestion des langues et choix de langue + * Gestion des langues et choix de langue * * @package SPIP\Core\Langue -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; - + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -27,35 +28,38 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * * Cette fonction définit les globales : * spip_lang, spip_lang_rtl, spip_lang_right, spip_lang_left - * + * * @param string $lang * La langue à utiliser * @return string|bool * string : La langue qui a été utilisée si trouvée * false : aucune langue ne correspondait à la demande -**/ + **/ function changer_langue($lang) { $liste_langues = ',' . @$GLOBALS['meta']['langues_proposees'] - . ',' . @$GLOBALS['meta']['langues_multilingue'] . ','; + . ',' . @$GLOBALS['meta']['langues_multilingue'] . ','; // Si la langue demandee n'existe pas, on essaie d'autres variantes // Exemple : 'pt-br' => 'pt_br' => 'pt' $lang = str_replace('-', '_', trim($lang)); - if (!$lang) + if (!$lang) { return false; + } - if (strpos($liste_langues,",$lang,")!==false - OR ($lang = preg_replace(',_.*,', '', $lang) - AND strpos($liste_langues,",$lang,")!==false)) { + if (strpos($liste_langues, ",$lang,") !== false + OR ($lang = preg_replace(',_.*,', '', $lang) + AND strpos($liste_langues, ",$lang,") !== false) + ) { - $GLOBALS['spip_lang_rtl'] = lang_dir($lang, '', '_rtl'); + $GLOBALS['spip_lang_rtl'] = lang_dir($lang, '', '_rtl'); $GLOBALS['spip_lang_right'] = $GLOBALS['spip_lang_rtl'] ? 'left' : 'right'; - $GLOBALS['spip_lang_left'] = $GLOBALS['spip_lang_rtl'] ? 'right' : 'left'; + $GLOBALS['spip_lang_left'] = $GLOBALS['spip_lang_rtl'] ? 'right' : 'left'; return $GLOBALS['spip_lang'] = $lang; - } else + } else { return false; + } } // @@ -67,27 +71,31 @@ function changer_langue($lang) { // ou permettre de choisir une langue "plus proche", // par exemple le francais pour l'espagnol, l'anglais pour l'allemand, etc. -function choisir_traduction ($trads, $lang = '') { +function choisir_traduction($trads, $lang = '') { $k = approcher_langue($trads, $lang); + return $k ? $trads[$k] : array_shift($trads); } // retourne son 2e argument si c'est un index du premier // ou un index approchant sinon et si possible, // la langue X etant consideree comme une approche de X_Y -function approcher_langue ($trads, $lang = '') { +function approcher_langue($trads, $lang = '') { - if (!$lang) $lang = $GLOBALS['spip_lang']; + if (!$lang) { + $lang = $GLOBALS['spip_lang']; + } if (isset($trads[$lang])) { return $lang; - } - // cas des langues xx_yy + } // cas des langues xx_yy else { $r = explode('_', $lang); - if (isset($trads[$r[0]])) + if (isset($trads[$r[0]])) { return $r[0]; + } } + return ''; } @@ -101,10 +109,11 @@ function approcher_langue ($trads, $lang = '') { * Code de langue * @return string * Nom de la langue, sinon son code. -**/ + **/ function traduire_nom_langue($lang) { include_spip('inc/lang_liste'); include_spip('inc/charsets'); + return html2unicode(isset($GLOBALS['codes_langues'][$lang]) ? $GLOBALS['codes_langues'][$lang] : $lang); } @@ -138,22 +147,25 @@ function lang_typo($lang = '') { : $GLOBALS['spip_lang']; } if ($lang == 'eo' - OR $lang == 'fr' - OR strncmp($lang, 'fr_', 3)==0 - OR $lang == 'cpf') + OR $lang == 'fr' + OR strncmp($lang, 'fr_', 3) == 0 + OR $lang == 'cpf' + ) { return 'fr'; - else + } else { return 'en'; + } } // gestion de la globale $lang_objet pour que les textes soient affiches // avec les memes typo et direction dans l'espace prive que dans le public // http://code.spip.net/@changer_typo function changer_typo($lang = '') { - if ($lang) + if ($lang) { $GLOBALS['lang_objet'] = $lang; - else + } else { unset($GLOBALS['lang_objet']); + } } // @@ -168,13 +180,16 @@ function menu_langues($nom_select, $default = '') { $langues = liste_options_langues($nom_select); $ret = ""; - if (!count($langues)) + if (!count($langues)) { return ''; + } - if (!$default) $default = $GLOBALS['spip_lang']; + if (!$default) { + $default = $GLOBALS['spip_lang']; + } foreach ($langues as $l) { $selected = ($l == $default) ? ' selected=\'selected\'' : ''; - $ret .= "<option value='$l'$selected>[".$l."] ".traduire_nom_langue($l)."</option>\n"; + $ret .= "<option value='$l'$selected>[" . $l . "] " . traduire_nom_langue($l) . "</option>\n"; } if (!test_espace_prive()) { @@ -186,29 +201,30 @@ function menu_langues($nom_select, $default = '') { } $change = ' onchange="this.parentNode.parentNode.submit()"'; - return generer_action_auteur('converser',$base, $cible, + + return generer_action_auteur('converser', $base, $cible, (select_langues($nom_select, $change, $ret) - . "<noscript><div style='display:inline'><input type='submit' class='fondo' value='". _T('bouton_changer')."' /></div></noscript>"), - " method='post'"); + . "<noscript><div style='display:inline'><input type='submit' class='fondo' value='" . _T('bouton_changer') . "' /></div></noscript>"), + " method='post'"); } // http://code.spip.net/@select_langues -function select_langues($nom_select, $change, $options, $label = "") -{ +function select_langues($nom_select, $change, $options, $label = "") { static $cpt = 0; $id = "menu_langues" . $cpt++; + return - "<label for='$id'>".($label?$label:_T('info_langues'))."</label> ". + "<label for='$id'>" . ($label ? $label : _T('info_langues')) . "</label> " . "<select name='$nom_select' id='$id' " - . ((!test_espace_prive()) ? - ("class='forml menu_langues'") : - (($nom_select == 'var_lang_ecrire') ? - ("class='lang_ecrire'") : - "class='fondl'")) - . $change - . ">\n" - . $options - . "</select>"; + . ((!test_espace_prive()) ? + ("class='forml menu_langues'") : + (($nom_select == 'var_lang_ecrire') ? + ("class='lang_ecrire'") : + "class='fondl'")) + . $change + . ">\n" + . $options + . "</select>"; } /** @@ -216,11 +232,11 @@ function select_langues($nom_select, $change, $options, $label = "") * * Retourne un tableau de langue utilisables, triées par code de langue, * mais pas le même tableau en fonction du paramètre $nom_select. - * + * * @param string $nom_select * Attribut name du select * Selon son nom, retourne une liste différente : - * + * * - var_lang ou changer_lang : * liste des langues sélectionnées dans la config multilinguisme * - var_lang_ecrire : @@ -230,17 +246,17 @@ function select_langues($nom_select, $change, $options, $label = "") */ function liste_options_langues($nom_select) { - switch($nom_select) { + switch ($nom_select) { # #MENU_LANG case 'var_lang': - # menu de changement de la langue d'un article - # les langues selectionnees dans la configuration "multilinguisme" + # menu de changement de la langue d'un article + # les langues selectionnees dans la configuration "multilinguisme" case 'changer_lang': $langues = explode(',', $GLOBALS['meta']['langues_multilingue']); break; - # menu de l'interface (privee, installation et panneau de login) - # les langues presentes sous forme de fichiers de langue - # on force la relecture du repertoire des langues pour etre synchrone. + # menu de l'interface (privee, installation et panneau de login) + # les langues presentes sous forme de fichiers de langue + # on force la relecture du repertoire des langues pour etre synchrone. case 'var_lang_ecrire': default: $GLOBALS['meta']['langues_proposees'] = ''; @@ -252,42 +268,49 @@ function liste_options_langues($nom_select) { # + langues_multilingues ; mais, ne sert pas # $langues = explode(',', $GLOBALS['all_langs']); } - if (count($langues) <= 1) return array(); + if (count($langues) <= 1) { + return array(); + } sort($langues); + return $langues; } - /** * Redirige sur la bonne langue lorsque l'option forcer_lang est active - * + * * Cette fonction est appelee depuis ecrire/public.php si on a installé * la variable de personnalisation $forcer_lang ; elle renvoie le brouteur * si necessaire vers l'URL xxxx?lang=ll * * @return void -**/ + **/ function verifier_lang_url() { // quelle langue est demandee ? - $lang_demandee = (test_espace_prive()?$GLOBALS['spip_lang']:$GLOBALS['meta']['langue_site']); - if (isset($_COOKIE['spip_lang_ecrire'])) + $lang_demandee = (test_espace_prive() ? $GLOBALS['spip_lang'] : $GLOBALS['meta']['langue_site']); + if (isset($_COOKIE['spip_lang_ecrire'])) { $lang_demandee = $_COOKIE['spip_lang_ecrire']; - if (!test_espace_prive() AND isset($_COOKIE['spip_lang'])) + } + if (!test_espace_prive() AND isset($_COOKIE['spip_lang'])) { $lang_demandee = $_COOKIE['spip_lang']; - if (isset($_GET['lang'])) + } + if (isset($_GET['lang'])) { $lang_demandee = $_GET['lang']; + } // Renvoyer si besoin (et si la langue demandee existe) if ($GLOBALS['spip_lang'] != $lang_demandee - AND changer_langue($lang_demandee) - AND $lang_demandee != @$_GET['lang']) { - $destination = parametre_url(self(),'lang', $lang_demandee, '&'); + AND changer_langue($lang_demandee) + AND $lang_demandee != @$_GET['lang'] + ) { + $destination = parametre_url(self(), 'lang', $lang_demandee, '&'); // ici on a besoin des var_truc foreach ($_GET as $var => $val) { - if (!strncmp('var_', $var, 4)) + if (!strncmp('var_', $var, 4)) { $destination = parametre_url($destination, $var, $val, '&'); + } } include_spip('inc/headers'); redirige_par_entete($destination); @@ -310,52 +333,58 @@ function verifier_lang_url() { * * @return string * La langue sélectionnée -**/ + **/ function utiliser_langue_site() { // s'il existe une langue du site (en gros tout le temps en théorie) if (isset($GLOBALS['meta']['langue_site']) - // et si spip_langue est pas encore définie (ce que va faire changer_langue()) - // ou qu'elle n'est pas identique à la langue du site - AND (!isset($GLOBALS['spip_lang']) - OR $GLOBALS['spip_lang']!=$GLOBALS['meta']['langue_site'])) - { + // et si spip_langue est pas encore définie (ce que va faire changer_langue()) + // ou qu'elle n'est pas identique à la langue du site + AND (!isset($GLOBALS['spip_lang']) + OR $GLOBALS['spip_lang'] != $GLOBALS['meta']['langue_site']) + ) { return changer_langue($GLOBALS['meta']['langue_site']);//@:install } // en theorie là , la globale est définie, sinon c'est un problème. if (!isset($GLOBALS['spip_lang'])) { spip_log("La globale spip_lang est indéfinie dans utiliser_langue_site() !", _LOG_ERREUR); } + return $GLOBALS['spip_lang']; } /** - * Initialise la langue pour un visiteur du site + * Initialise la langue pour un visiteur du site * * La langue est choisie dans cet ordre : * - Dans le cookie 'spip_lang' ou 'spip_lang_ecrire' s'il existe (selon l'espace public ou privé). * - Sinon dans la session du visiteur. * - Sinon dans une des langues définie en préférence du navigateur * - Sinon la langue du site - * + * * @return string * La langue utilisée -**/ + **/ function utiliser_langue_visiteur() { - $l = (!test_espace_prive() ? 'spip_lang' : 'spip_lang_ecrire'); - if (isset($_COOKIE[$l])) - if (changer_langue($l = $_COOKIE[$l])) + $l = (!test_espace_prive() ? 'spip_lang' : 'spip_lang_ecrire'); + if (isset($_COOKIE[$l])) { + if (changer_langue($l = $_COOKIE[$l])) { return $l; + } + } - if (isset($GLOBALS['visiteur_session']['lang'])) - if (changer_langue($l = $GLOBALS['visiteur_session']['lang'])) + if (isset($GLOBALS['visiteur_session']['lang'])) { + if (changer_langue($l = $GLOBALS['visiteur_session']['lang'])) { return $l; + } + } if (isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) { - foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $s) { + foreach (explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']) as $s) { if (preg_match('#^([a-z]{2,3})(-[a-z]{2,3})?(;q=[0-9.]+)?$#i', trim($s), $r)) { - if (changer_langue($l=strtolower($r[1]))) + if (changer_langue($l = strtolower($r[1]))) { return $l; + } } } } @@ -373,10 +402,10 @@ function utiliser_langue_visiteur() { * * Lorsque ces métas n'existent pas encore (c'est à dire à l'installation), * elles sont calculées en obtenant la liste des langues - * dans les fichiers de lang - * + * dans les fichiers de lang + * * @return void -**/ + **/ function init_langues() { // liste des langues dans les meta, sauf a l'install @@ -385,16 +414,17 @@ function init_langues() { $tout = array(); if (!$all_langs) { // trouver tous les modules lang/spip_xx.php - $modules = find_all_in_path("lang/","/spip_([a-z_]+)\.php[3]?$"); - foreach($modules as $name=>$path){ - if (preg_match(',^spip_([a-z_]+)\.php[3]?$,', $name, $regs)) + $modules = find_all_in_path("lang/", "/spip_([a-z_]+)\.php[3]?$"); + foreach ($modules as $name => $path) { + if (preg_match(',^spip_([a-z_]+)\.php[3]?$,', $name, $regs)) { $tout[] = $regs[1]; + } } sort($tout); $tout = join(',', $tout); // Si les langues n'ont pas change, ne rien faire if ($tout != $all_langs) { - $GLOBALS['meta']['langues_proposees'] = $tout; + $GLOBALS['meta']['langues_proposees'] = $tout; include_spip('inc/meta'); ecrire_meta('langues_proposees', $tout); } @@ -402,8 +432,8 @@ function init_langues() { if (!isset($GLOBALS['meta']['langue_site'])) { // Initialisation : le francais si dispo, sinon la premiere langue trouvee $GLOBALS['meta']['langue_site'] = $tout = - (!$all_langs OR (strpos(','._LANGUE_PAR_DEFAUT.',',",$all_langs,")!==false)) - ? _LANGUE_PAR_DEFAUT : substr($all_langs,0,strpos($all_langs,',')); + (!$all_langs OR (strpos(',' . _LANGUE_PAR_DEFAUT . ',', ",$all_langs,") !== false)) + ? _LANGUE_PAR_DEFAUT : substr($all_langs, 0, strpos($all_langs, ',')); ecrire_meta('langue_site', $tout); } } @@ -417,12 +447,12 @@ function init_langues() { * * @return string * Code html de la balise <html> -**/ -function html_lang_attributes() -{ + **/ +function html_lang_attributes() { $lang = $GLOBALS['spip_lang']; $dir = ($GLOBALS['spip_lang_rtl'] ? 'rtl' : 'ltr'); - return "<html class='$dir $lang no-js' xmlns='http://www.w3.org/1999/xhtml' lang='$lang' dir='$dir'>\n" ; + + return "<html class='$dir $lang no-js' xmlns='http://www.w3.org/1999/xhtml' lang='$lang' dir='$dir'>\n"; } // initialise les globales (liste des langue, langue du site, spip_lang...) diff --git a/ecrire/inc/lang_liste.php b/ecrire/inc/lang_liste.php index 65dc3d77c6..4046432135 100644 --- a/ecrire/inc/lang_liste.php +++ b/ecrire/inc/lang_liste.php @@ -11,7 +11,6 @@ \***************************************************************************/ - /* Ce fichier contient les codes de langue de base de SPIP. La plupart sont des codes ISO 639-1, dont vous pouvez lire @@ -19,7 +18,9 @@ http://www.loc.gov/standards/iso639-2/langcodes.html */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} $GLOBALS['codes_langues'] = array( 'aa' => "Afar", @@ -50,7 +51,7 @@ $GLOBALS['codes_langues'] = array( 'cpf_dom' => "Kreyòl", 'cpf_hat' => "Kreyòl (Peyi Dayiti)", 'cs' => "čeština", - 'cy' => "Cymraeg", # welsh, gallois + 'cy' => "Cymraeg", # welsh, gallois 'da' => "dansk", 'de' => "Deutsch", 'dz' => "Bhutani", @@ -175,8 +176,8 @@ $GLOBALS['codes_langues'] = array( 'sh_latn' => 'srpskohrvastski', 'sh_cyrl' => 'Српскохрватски', 'si' => "Sinhalese", - 'sk' => "slovenčina", // (Slovakia) - 'sl' => "slovenščina", // (Slovenia) + 'sk' => "slovenčina", // (Slovakia) + 'sl' => "slovenščina", // (Slovenia) 'sm' => "Samoan", 'sn' => "Shona", 'so' => "Somali", diff --git a/ecrire/inc/layer.php b/ecrire/inc/layer.php index c2919bf57b..6a2af2b10a 100644 --- a/ecrire/inc/layer.php +++ b/ecrire/inc/layer.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Affiche un cadre complet muni d’un bouton pour le déplier. @@ -22,12 +24,13 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param string $ids id que prendra la partie pliée ou dépliée * @param string $style_cadre classe CSS que prendra le cadre * @return string Code HTML du cadre dépliable -**/ -function cadre_depliable($icone, $titre, $deplie, $contenu, $ids = '', $style_cadre = 'r'){ - $bouton = bouton_block_depliable($titre,$deplie,$ids); - return - debut_cadre($style_cadre,$icone,'',$bouton, '', '', false) - . debut_block_depliable($deplie,$ids) + **/ +function cadre_depliable($icone, $titre, $deplie, $contenu, $ids = '', $style_cadre = 'r') { + $bouton = bouton_block_depliable($titre, $deplie, $ids); + + return + debut_cadre($style_cadre, $icone, '', $bouton, '', '', false) + . debut_block_depliable($deplie, $ids) . "<div class='cadre_padding'>\n" . $contenu . "</div>\n" @@ -36,57 +39,61 @@ function cadre_depliable($icone, $titre, $deplie, $contenu, $ids = '', $style_ca } // http://code.spip.net/@block_parfois_visible -function block_parfois_visible($nom, $invite, $masque, $style = '', $visible = false){ +function block_parfois_visible($nom, $invite, $masque, $style = '', $visible = false) { return "\n" - . bouton_block_depliable($invite,$visible,$nom) - . debut_block_depliable($visible,$nom) + . bouton_block_depliable($invite, $visible, $nom) + . debut_block_depliable($visible, $nom) . $masque . fin_block(); } // http://code.spip.net/@debut_block_depliable -function debut_block_depliable($deplie, $id = ""){ - $class=' blocdeplie'; +function debut_block_depliable($deplie, $id = "") { + $class = ' blocdeplie'; // si on n'accepte pas js, ne pas fermer - if (!$deplie) - $class=" blocreplie"; - return "<div ".($id?"id='$id' ":"")."class='bloc_depliable$class'>"; + if (!$deplie) { + $class = " blocreplie"; + } + + return "<div " . ($id ? "id='$id' " : "") . "class='bloc_depliable$class'>"; } + // http://code.spip.net/@fin_block function fin_block() { return "<div class='nettoyeur'></div>\n</div>"; } + // $texte : texte du bouton // $deplie : true (deplie) ou false (plie) ou -1 (inactif) ou 'incertain' pour que le bouton s'auto init au chargement de la page // $ids : id des div lies au bouton (facultatif, par defaut c'est le div.bloc_depliable qui suit) // http://code.spip.net/@bouton_block_depliable -function bouton_block_depliable($texte, $deplie, $ids = ""){ - $bouton_id = 'b'.substr(md5($texte.microtime()),0,8); +function bouton_block_depliable($texte, $deplie, $ids = "") { + $bouton_id = 'b' . substr(md5($texte . microtime()), 0, 8); - $class = ($deplie===true)?" deplie":(($deplie==-1)?" impliable":" replie"); - if (strlen($ids)){ - $cible = explode(',',$ids); - $cible = '#'.implode(",#",$cible); - } - else{ + $class = ($deplie === true) ? " deplie" : (($deplie == -1) ? " impliable" : " replie"); + if (strlen($ids)) { + $cible = explode(',', $ids); + $cible = '#' . implode(",#", $cible); + } else { $cible = "#$bouton_id + div.bloc_depliable"; } - $b = (strpos($texte,"<h")===false?'h3':'div'); + $b = (strpos($texte, "<h") === false ? 'h3' : 'div'); + return "<$b " - .($bouton_id?"id='$bouton_id' ":"") - ."class='titrem$class'" - . (($deplie===-1) - ?"" - :" onmouseover=\"jQuery(this).depliant('$cible');\"" - ) - .">" - // une ancre pour rendre accessible au clavier le depliage du sous bloc - . "<a href='#' onclick=\"return jQuery(this).depliant_clicancre('$cible');\" class='titremancre'></a>" - . "$texte</$b>" - . http_script( ($deplie==='incertain') - ? "jQuery(document).ready(function(){if (jQuery('$cible').is(':visible')) $('#$bouton_id').addClass('deplie').removeClass('replie');});" - : ''); + . ($bouton_id ? "id='$bouton_id' " : "") + . "class='titrem$class'" + . (($deplie === -1) + ? "" + : " onmouseover=\"jQuery(this).depliant('$cible');\"" + ) + . ">" + // une ancre pour rendre accessible au clavier le depliage du sous bloc + . "<a href='#' onclick=\"return jQuery(this).depliant_clicancre('$cible');\" class='titremancre'></a>" + . "$texte</$b>" + . http_script(($deplie === 'incertain') + ? "jQuery(document).ready(function(){if (jQuery('$cible').is(':visible')) $('#$bouton_id').addClass('deplie').removeClass('replie');});" + : ''); } // @@ -102,42 +109,55 @@ function verif_butineur() { $GLOBALS['browser_layer'] = ' '; // compat avec vieux scripts qui testent la valeur $GLOBALS['browser_barre'] = ''; - if (!preg_match(",opera,i", $GLOBALS['browser_description'])&&preg_match(",opera,i", $GLOBALS['browser_name'])) { + if (!preg_match(",opera,i", $GLOBALS['browser_description']) && preg_match(",opera,i", $GLOBALS['browser_name'])) { $GLOBALS['browser_name'] = "Opera"; $GLOBALS['browser_version'] = $match[2]; $GLOBALS['browser_barre'] = ($GLOBALS['browser_version'] >= 8.5); - } - else if (preg_match(",opera,i", $GLOBALS['browser_description'])) { - preg_match(",Opera ([^\ ]*),i", $GLOBALS['browser_description'], $match); - $GLOBALS['browser_name'] = "Opera"; - $GLOBALS['browser_version'] = $match[1]; - $GLOBALS['browser_barre'] = ($GLOBALS['browser_version'] >= 8.5); - } - else if (preg_match(",msie,i", $GLOBALS['browser_description'])) { - preg_match(",MSIE ([^;]*),i", $GLOBALS['browser_description'], $match); - $GLOBALS['browser_name'] = "MSIE"; - $GLOBALS['browser_version'] = $match[1]; - $GLOBALS['browser_barre'] = ($GLOBALS['browser_version'] >= 5.5); - } - else if (preg_match(",KHTML,i", $GLOBALS['browser_description']) && - preg_match(",Safari/([^;]*),", $GLOBALS['browser_description'], $match)) { - $GLOBALS['browser_name'] = "Safari"; - $GLOBALS['browser_version'] = $match[1]; - $GLOBALS['browser_barre'] = ($GLOBALS['browser_version'] >= 5.0); - } - else if (preg_match(",mozilla,i", $GLOBALS['browser_name']) AND $GLOBALS['browser_version'] >= 5) { - // Numero de version pour Mozilla "authentique" - if (preg_match(",rv:([0-9]+\.[0-9]+),", $GLOBALS['browser_description'], $match)) - $GLOBALS['browser_rev'] = doubleval($match[1]); - // Autres Gecko => equivalents 1.4 par defaut (Galeon, etc.) - else if (strpos($GLOBALS['browser_description'], "Gecko") and !strpos($GLOBALS['browser_description'], "KHTML")) - $GLOBALS['browser_rev'] = 1.4; - // Machins quelconques => equivalents 1.0 par defaut (Konqueror, etc.) - else $GLOBALS['browser_rev'] = 1.0; - $GLOBALS['browser_barre'] = $GLOBALS['browser_rev'] >= 1.3; + } else { + if (preg_match(",opera,i", $GLOBALS['browser_description'])) { + preg_match(",Opera ([^\ ]*),i", $GLOBALS['browser_description'], $match); + $GLOBALS['browser_name'] = "Opera"; + $GLOBALS['browser_version'] = $match[1]; + $GLOBALS['browser_barre'] = ($GLOBALS['browser_version'] >= 8.5); + } else { + if (preg_match(",msie,i", $GLOBALS['browser_description'])) { + preg_match(",MSIE ([^;]*),i", $GLOBALS['browser_description'], $match); + $GLOBALS['browser_name'] = "MSIE"; + $GLOBALS['browser_version'] = $match[1]; + $GLOBALS['browser_barre'] = ($GLOBALS['browser_version'] >= 5.5); + } else { + if (preg_match(",KHTML,i", $GLOBALS['browser_description']) && + preg_match(",Safari/([^;]*),", $GLOBALS['browser_description'], $match) + ) { + $GLOBALS['browser_name'] = "Safari"; + $GLOBALS['browser_version'] = $match[1]; + $GLOBALS['browser_barre'] = ($GLOBALS['browser_version'] >= 5.0); + } else { + if (preg_match(",mozilla,i", $GLOBALS['browser_name']) AND $GLOBALS['browser_version'] >= 5) { + // Numero de version pour Mozilla "authentique" + if (preg_match(",rv:([0-9]+\.[0-9]+),", $GLOBALS['browser_description'], $match)) { + $GLOBALS['browser_rev'] = doubleval($match[1]); + } // Autres Gecko => equivalents 1.4 par defaut (Galeon, etc.) + else { + if (strpos($GLOBALS['browser_description'], "Gecko") and !strpos($GLOBALS['browser_description'], + "KHTML") + ) { + $GLOBALS['browser_rev'] = 1.4; + } // Machins quelconques => equivalents 1.0 par defaut (Konqueror, etc.) + else { + $GLOBALS['browser_rev'] = 1.0; + } + } + $GLOBALS['browser_barre'] = $GLOBALS['browser_rev'] >= 1.3; + } + } + } + } } - if (!$GLOBALS['browser_name']) $GLOBALS['browser_name'] = "Mozilla"; + if (!$GLOBALS['browser_name']) { + $GLOBALS['browser_name'] = "Mozilla"; + } } verif_butineur(); diff --git a/ecrire/inc/lien.php b/ecrire/inc/lien.php index 50879252d2..110911445c 100644 --- a/ecrire/inc/lien.php +++ b/ecrire/inc/lien.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); @@ -20,7 +22,16 @@ include_spip('base/abstract_sql'); // et en plus on veut pouvoir les passer en pipeline // -function inc_lien_dist($lien, $texte = '', $class = '', $title = '', $hlang = '', $rel = '', $connect = '', $env = array()){ +function inc_lien_dist( + $lien, + $texte = '', + $class = '', + $title = '', + $hlang = '', + $rel = '', + $connect = '', + $env = array() +) { return $lien; } @@ -31,29 +42,31 @@ function inc_lien_dist($lien, $texte = '', $class = '', $title = '', $hlang = '' define('_RACCOURCI_LIEN', "/\[([^][]*?([[]\w*[]][^][]*)*)->(>?)([^]]*)\]/msS"); // http://code.spip.net/@expanser_liens -function expanser_liens($t, $connect = '', $env = array()){ +function expanser_liens($t, $connect = '', $env = array()) { $t = pipeline('pre_liens', $t); // on passe a traiter_modeles la liste des liens reperes pour lui permettre // de remettre le texte d'origine dans les parametres du modele $t = traiter_modeles($t, false, false, $connect); + return $t; } // Meme analyse mais pour eliminer les liens // et ne laisser que leur titre, a expliciter si ce n'est fait // http://code.spip.net/@nettoyer_raccourcis_typo -function nettoyer_raccourcis_typo($texte, $connect = ''){ +function nettoyer_raccourcis_typo($texte, $connect = '') { return $texte; } // Repere dans la partie texte d'un raccourci [texte->...] // la langue et la bulle eventuelles // http://code.spip.net/@traiter_raccourci_lien_atts -function traiter_raccourci_lien_atts($texte){ - $bulle=''; - $hlang=''; +function traiter_raccourci_lien_atts($texte) { + $bulle = ''; + $hlang = ''; + return array(trim($texte), $bulle, $hlang); } @@ -71,7 +84,7 @@ define('_RACCOURCI_CHAPO', '/^(\W*)(\W*)(\w*\d+([?#].*)?)$/'); * @param bool $url * @return string */ -function virtuel_redirige($virtuel, $url = false){ +function virtuel_redirige($virtuel, $url = false) { return $virtuel; } @@ -85,17 +98,19 @@ function virtuel_redirige($virtuel, $url = false){ // 'url': seulement U (i.e. generer_url_RACCOURCI) // http://code.spip.net/@calculer_url -function calculer_url($ref, $texte = '', $pour = 'url', $connect = '', $echappe_typo = true){ +function calculer_url($ref, $texte = '', $pour = 'url', $connect = '', $echappe_typo = true) { $r = traiter_lien_implicite($ref, $texte, $pour, $connect, $echappe_typo); + return $r ? $r : traiter_lien_explicite($ref, $texte, $pour, $connect, $echappe_typo); } define('_EXTRAIRE_LIEN', ',^\s*(?:' . _PROTOCOLES_STD . '):?/?/?\s*$,iS'); // http://code.spip.net/@traiter_lien_explicite -function traiter_lien_explicite ($ref, $texte = '', $pour = 'url', $connect = '', $echappe_typo = true){ - if (preg_match(_EXTRAIRE_LIEN, $ref)) - return ($pour != 'tout') ? '' : array('','','',''); +function traiter_lien_explicite($ref, $texte = '', $pour = 'url', $connect = '', $echappe_typo = true) { + if (preg_match(_EXTRAIRE_LIEN, $ref)) { + return ($pour != 'tout') ? '' : array('', '', '', ''); + } $lien = entites_html(trim($ref)); @@ -105,64 +120,91 @@ function traiter_lien_explicite ($ref, $texte = '', $pour = 'url', $connect = '' // evite l'affichage de trops longues urls. $lien_court = charger_fonction('lien_court', 'inc'); $texte = $lien_court($texte); - if ($echappe_typo){ - $texte = "<html>".quote_amp($texte)."</html>"; + if ($echappe_typo) { + $texte = "<html>" . quote_amp($texte) . "</html>"; } } // petites corrections d'URL - if (preg_match('/^www\.[^@]+$/S',$lien)) - $lien = "http://".$lien; - else if (strpos($lien, "@") && email_valide($lien)) { - if (!$texte) $texte = $lien; - $lien = "mailto:".$lien; + if (preg_match('/^www\.[^@]+$/S', $lien)) { + $lien = "http://" . $lien; + } else { + if (strpos($lien, "@") && email_valide($lien)) { + if (!$texte) { + $texte = $lien; + } + $lien = "mailto:" . $lien; + } } - - if ($pour == 'url') return $lien; - if ($pour == 'titre') return $texte; + if ($pour == 'url') { + return $lien; + } + + if ($pour == 'titre') { + return $texte; + } return array('url' => $lien, 'titre' => $texte); } -function liens_implicite_glose_dist($texte, $id, $type, $args, $ancre, $connect = ''){ - if (function_exists($f = 'glossaire_' . $ancre)) +function liens_implicite_glose_dist($texte, $id, $type, $args, $ancre, $connect = '') { + if (function_exists($f = 'glossaire_' . $ancre)) { $url = $f($texte, $id); - else + } else { $url = glossaire_std($texte); + } + return $url; } // http://code.spip.net/@traiter_lien_implicite -function traiter_lien_implicite($ref, $texte = '', $pour = 'url', $connect = ''){ - if (!($match = typer_raccourci($ref))) return false; - @list($type,,$id,,$args,,$ancre) = $match; +function traiter_lien_implicite($ref, $texte = '', $pour = 'url', $connect = '') { + if (!($match = typer_raccourci($ref))) { + return false; + } + @list($type, , $id, , $args, , $ancre) = $match; // attention dans le cas des sites le lien doit pointer non pas sur // la page locale du site, mais directement sur le site lui-meme - if ($f = charger_fonction("implicite_$type","liens",true)) - $url = $f($texte,$id,$type,$args,$ancre,$connect); - if (!$url) - $url = generer_url_entite($id,$type,$args,$ancre,$connect ? $connect : NULL); - if (!$url) return false; + if ($f = charger_fonction("implicite_$type", "liens", true)) { + $url = $f($texte, $id, $type, $args, $ancre, $connect); + } + if (!$url) { + $url = generer_url_entite($id, $type, $args, $ancre, $connect ? $connect : null); + } + if (!$url) { + return false; + } if (is_array($url)) { - @list($type,$id) = $url; - $url = generer_url_entite($id,$type,$args,$ancre,$connect ? $connect : NULL); + @list($type, $id) = $url; + $url = generer_url_entite($id, $type, $args, $ancre, $connect ? $connect : null); + } + if ($pour === 'url') { + return $url; } - if ($pour === 'url') return $url; $r = traiter_raccourci_titre($id, $type, $connect); - if ($r) $r['class'] = ($type == 'site')?'spip_out':'spip_in'; - if ($texte = trim($texte)) $r['titre'] = $texte; - if (!@$r['titre']) $r['titre'] = _T($type) . " $id"; - if ($pour=='titre') return $r['titre']; + if ($r) { + $r['class'] = ($type == 'site') ? 'spip_out' : 'spip_in'; + } + if ($texte = trim($texte)) { + $r['titre'] = $texte; + } + if (!@$r['titre']) { + $r['titre'] = _T($type) . " $id"; + } + if ($pour == 'titre') { + return $r['titre']; + } $r['url'] = $url; // dans le cas d'un lien vers un doc, ajouter le type='mime/type' if ($type == 'document' - AND $mime = sql_getfetsel('mime_type', 'spip_types_documents', - "extension IN (".sql_get_select("extension","spip_documents","id_document=".sql_quote($id)).")", - '','','','',$connect) - ) + AND $mime = sql_getfetsel('mime_type', 'spip_types_documents', + "extension IN (" . sql_get_select("extension", "spip_documents", "id_document=" . sql_quote($id)) . ")", + '', '', '', '', $connect) + ) { $r['mime'] = $mime; + } return $r; } @@ -172,19 +214,41 @@ function traiter_lien_implicite($ref, $texte = '', $pour = 'url', $connect = '') define('_RACCOURCI_URL', '/^\s*(\w*?)\s*(\d+)(\?(.*?))?(#([^\s]*))?\s*$/S'); // http://code.spip.net/@typer_raccourci -function typer_raccourci($lien){ - if (!preg_match(_RACCOURCI_URL, $lien, $match)) return array(); +function typer_raccourci($lien) { + if (!preg_match(_RACCOURCI_URL, $lien, $match)) { + return array(); + } $f = $match[1]; // valeur par defaut et alias historiques - if (!$f) $f = 'article'; - else if ($f == 'art') $f = 'article'; - else if ($f == 'br') $f = 'breve'; - else if ($f == 'rub') $f = 'rubrique'; - else if ($f == 'aut') $f = 'auteur'; - else if ($f == 'doc' OR $f == 'im' OR $f == 'img' OR $f == 'image' OR $f == 'emb') - $f = 'document'; - else if (preg_match('/^br..?ve$/S', $f)) $f = 'breve'; # accents :( + if (!$f) { + $f = 'article'; + } else { + if ($f == 'art') { + $f = 'article'; + } else { + if ($f == 'br') { + $f = 'breve'; + } else { + if ($f == 'rub') { + $f = 'rubrique'; + } else { + if ($f == 'aut') { + $f = 'auteur'; + } else { + if ($f == 'doc' OR $f == 'im' OR $f == 'img' OR $f == 'image' OR $f == 'emb') { + $f = 'document'; + } else { + if (preg_match('/^br..?ve$/S', $f)) { + $f = 'breve'; + } + } + } + } + } + } + } # accents :( $match[0] = $f; + return $match; } @@ -195,22 +259,29 @@ function typer_raccourci($lien){ * @param string $type Type d'objet * @param string|null $connect Connecteur SQL utilisé * @return array { - * @var string $titre Titre si présent, sinon '' - * @var string $lang Langue si présente, sinon '' + * @var string $titre Titre si présent, sinon '' + * @var string $lang Langue si présente, sinon '' * } -**/ -function traiter_raccourci_titre($id, $type, $connect = NULL){ + **/ +function traiter_raccourci_titre($id, $type, $connect = null) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table(table_objet($type)); - if (!($desc AND $s = $desc['titre'])) return array(); + if (!($desc AND $s = $desc['titre'])) { + return array(); + } $_id = $desc['key']['PRIMARY KEY']; - $r = sql_fetsel($s, $desc['table'], "$_id=$id", '','','','',$connect); - if (!$r) return array(); + $r = sql_fetsel($s, $desc['table'], "$_id=$id", '', '', '', '', $connect); + if (!$r) { + return array(); + } $r['titre'] = supprimer_numero($r['titre']); if (!$r['titre'] and !empty($r['surnom'])) { $r['titre'] = $r['surnom']; } - if (!isset($r['lang'])) $r['lang'] = ''; + if (!isset($r['lang'])) { + $r['lang'] = ''; + } + return $r; } @@ -222,47 +293,50 @@ function traiter_raccourci_titre($id, $type, $connect = NULL){ // mais on renvoie les params (pour l'indexation par le moteur de recherche) // http://code.spip.net/@traiter_modeles -define('_RACCOURCI_MODELE', - '(<([a-z_-]{3,})' # <modele - .'\s*([0-9]*)\s*' # id - .'([|](?:<[^<>]*>|[^>])*?)?' # |arguments (y compris des tags <...>) - .'\s*/?'.'>)' # fin du modele > - .'\s*(<\/a>)?' # eventuel </a> - ); +define('_RACCOURCI_MODELE', + '(<([a-z_-]{3,})' # <modele + . '\s*([0-9]*)\s*' # id + . '([|](?:<[^<>]*>|[^>])*?)?' # |arguments (y compris des tags <...>) + . '\s*/?' . '>)' # fin du modele > + . '\s*(<\/a>)?' # eventuel </a> +); -define('_RACCOURCI_MODELE_DEBUT', '@^' . _RACCOURCI_MODELE .'@isS'); +define('_RACCOURCI_MODELE_DEBUT', '@^' . _RACCOURCI_MODELE . '@isS'); // http://code.spip.net/@traiter_modeles -function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', $liens = null, $env = array()){ +function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', $liens = null, $env = array()) { // preserver la compatibilite : true = recherche des documents - if ($doublons===true) - $doublons = array('documents'=>array('doc','emb','img')); + if ($doublons === true) { + $doublons = array('documents' => array('doc', 'emb', 'img')); + } // detecter les modeles (rapide) - if (strpos($texte,"<")!==false AND - preg_match_all('/<[a-z_-]{3,}\s*[0-9|]+/iS', $texte, $matches, PREG_SET_ORDER)) { + if (strpos($texte, "<") !== false AND + preg_match_all('/<[a-z_-]{3,}\s*[0-9|]+/iS', $texte, $matches, PREG_SET_ORDER) + ) { include_spip('public/assembler'); - $wrap_embed_html = charger_fonction("wrap_embed_html","inc",true); + $wrap_embed_html = charger_fonction("wrap_embed_html", "inc", true); foreach ($matches as $match) { // Recuperer l'appel complet (y compris un eventuel lien) - $a = strpos($texte,$match[0]); + $a = strpos($texte, $match[0]); preg_match(_RACCOURCI_MODELE_DEBUT, - substr($texte, $a), $regs); - $regs[]=""; // s'assurer qu'il y a toujours un 5e arg, eventuellement vide - list(,$mod, $type, $id, $params, $fin) = $regs; + substr($texte, $a), $regs); + $regs[] = ""; // s'assurer qu'il y a toujours un 5e arg, eventuellement vide + list(, $mod, $type, $id, $params, $fin) = $regs; if ($fin AND - preg_match('/<a\s[^<>]*>\s*$/i', - substr($texte, 0, $a), $r)) { + preg_match('/<a\s[^<>]*>\s*$/i', + substr($texte, 0, $a), $r) + ) { $lien = array( - 'href' => extraire_attribut($r[0],'href'), - 'class' => extraire_attribut($r[0],'class'), - 'mime' => extraire_attribut($r[0],'type'), - 'title' => extraire_attribut($r[0],'title'), - 'hreflang' => extraire_attribut($r[0],'hreflang') + 'href' => extraire_attribut($r[0], 'href'), + 'class' => extraire_attribut($r[0], 'class'), + 'mime' => extraire_attribut($r[0], 'type'), + 'title' => extraire_attribut($r[0], 'title'), + 'hreflang' => extraire_attribut($r[0], 'hreflang') ); $n = strlen($r[0]); $a -= $n; - $cherche = $n + strlen($regs[0]); + $cherche = $n+strlen($regs[0]); } else { $lien = false; $cherche = strlen($mod); @@ -270,42 +344,45 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', // calculer le modele # hack indexation - if ($doublons) - $texte .= preg_replace(',[|][^|=]*,s',' ',$params); - # version normale + if ($doublons) { + $texte .= preg_replace(',[|][^|=]*,s', ' ', $params); + } # version normale else { // si un tableau de liens a ete passe, reinjecter le contenu d'origine // dans les parametres, plutot que les liens echappes - if (!is_null($liens)) + if (!is_null($liens)) { $params = str_replace($liens[0], $liens[1], $params); + } $modele = inclure_modele($type, $id, $params, $lien, $connect, $env); // en cas d'echec, // si l'objet demande a une url, // creer un petit encadre vers elle if ($modele === false) { - if (!$lien) + if (!$lien) { $lien = traiter_lien_implicite("$type$id", '', 'tout', $connect); - if ($lien) + } + if ($lien) { $modele = '<a href="' - .$lien['url'] - .'" class="spip_modele' + . $lien['url'] + . '" class="spip_modele' . '">' - .sinon($lien['titre'], _T('ecrire:info_sans_titre')) - ."</a>"; - else { + . sinon($lien['titre'], _T('ecrire:info_sans_titre')) + . "</a>"; + } else { $modele = ""; if (test_espace_prive()) { - $modele = entites_html(substr($texte,$a,$cherche)); - if (!is_null($liens)) - $modele = "<pre>".str_replace($liens[0], $liens[1], $modele)."</pre>"; + $modele = entites_html(substr($texte, $a, $cherche)); + if (!is_null($liens)) { + $modele = "<pre>" . str_replace($liens[0], $liens[1], $modele) . "</pre>"; + } } } } // le remplacer dans le texte if ($modele !== false) { $modele = protege_js_modeles($modele); - if ($wrap_embed_html){ - $modele = $wrap_embed_html($mod,$modele); + if ($wrap_embed_html) { + $modele = $wrap_embed_html($mod, $modele); } $rempl = code_echappement($modele, $echap); $texte = substr($texte, 0, $a) @@ -315,10 +392,12 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', } // hack pour tout l'espace prive - if (((!_DIR_RESTREINT) OR ($doublons)) AND ($id)){ - foreach($doublons?$doublons:array('documents'=>array('doc','emb','img')) as $quoi=>$modeles) - if (in_array($type,$modeles)) + if (((!_DIR_RESTREINT) OR ($doublons)) AND ($id)) { + foreach ($doublons ? $doublons : array('documents' => array('doc', 'emb', 'img')) as $quoi => $modeles) { + if (in_array($type, $modeles)) { $GLOBALS["doublons_{$quoi}_inclus"][] = $id; + } + } } } } @@ -330,18 +409,18 @@ function traiter_modeles($texte, $doublons = false, $echap = '', $connect = '', // Raccourcis ancre [#ancre<-] // // http://code.spip.net/@traiter_raccourci_ancre -function traiter_raccourci_ancre($letexte){ +function traiter_raccourci_ancre($letexte) { return $letexte; } // http://code.spip.net/@traiter_raccourci_glossaire -function traiter_raccourci_glossaire($texte){ +function traiter_raccourci_glossaire($texte) { return $texte; } // http://code.spip.net/@glossaire_std -function glossaire_std($terme){ - return $terme; +function glossaire_std($terme) { + return $terme; } ?> diff --git a/ecrire/inc/lien_court.php b/ecrire/inc/lien_court.php index 0c0525df61..0bd2d63380 100644 --- a/ecrire/inc/lien_court.php +++ b/ecrire/inc/lien_court.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /* * Cette fonction prend une URL et la raccourcit si elle est trop longue @@ -23,8 +25,8 @@ function inc_lien_court($url) { $long_url = defined('_MAX_LONG_URL') ? _MAX_LONG_URL : 40; $coupe_url = defined('_MAX_COUPE_URL') ? _MAX_COUPE_URL : 35; - if (strlen($url)>$long_url) { - $url = substr($url,0,$coupe_url).'...'; + if (strlen($url) > $long_url) { + $url = substr($url, 0, $coupe_url) . '...'; } return $url; diff --git a/ecrire/inc/lister_objets.php b/ecrire/inc/lister_objets.php index 05dbc320a5..6a0efc3599 100644 --- a/ecrire/inc/lister_objets.php +++ b/ecrire/inc/lister_objets.php @@ -14,20 +14,21 @@ * Gestion de listes d'objets * * @package SPIP\Core\Listes -**/ - -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Affichage des liste d'objets - * + * * Surcharge pour aiguiller vers la mise en squelettes des listes * * @deprecated Créer ou utiliser un squelette dans `prive/objets/liste/` * pour la table en question et l'appeler avec une inclusion. - * + * * @param string $vue * Nom de l'objet * @param array $contexte @@ -37,28 +38,31 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return string * Code HTML de la liste */ -function inc_lister_objets_dist($vue, $contexte = array(), $force = false){ +function inc_lister_objets_dist($vue, $contexte = array(), $force = false) { $res = ""; // debug - if (!is_array($contexte)) + if (!is_array($contexte)) { return _L('$contexte doit etre un tableau dans inc/lister_objets'); + } $fond = "prive/objets/liste/$vue"; - if (!find_in_path($fond."."._EXTENSION_SQUELETTES)) { + if (!find_in_path($fond . "." . _EXTENSION_SQUELETTES)) { // traiter les cas particuliers include_spip('base/connect_sql'); $vue = table_objet($vue); $fond = "prive/objets/liste/$vue"; - if (!find_in_path($fond."."._EXTENSION_SQUELETTES)) + if (!find_in_path($fond . "." . _EXTENSION_SQUELETTES)) { return _L("vue $vue introuvable pour lister les objets"); + } } - - - $contexte['sinon']=($force ? $contexte['titre']:''); - $res = recuperer_fond($fond,$contexte,array('ajax'=>true)); - if (_request('var_liste')) + + $contexte['sinon'] = ($force ? $contexte['titre'] : ''); + + $res = recuperer_fond($fond, $contexte, array('ajax' => true)); + if (_request('var_liste')) { echo var_export($contexte, true); - + } + return $res; } diff --git a/ecrire/inc/log.php b/ecrire/inc/log.php index eae4904c8a..3154fba0df 100644 --- a/ecrire/inc/log.php +++ b/ecrire/inc/log.php @@ -10,85 +10,101 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -function inc_log_dist($message, $logname = NULL, $logdir = NULL, $logsuf = NULL) { +function inc_log_dist($message, $logname = null, $logdir = null, $logsuf = null) { static $test_repertoire = array(); static $compteur = array(); static $debugverb = ""; // pour ne pas le recalculer au reappel - if (is_null($logname) OR !is_string($logname)) + if (is_null($logname) OR !is_string($logname)) { $logname = defined('_FILE_LOG') ? _FILE_LOG : 'spip'; - if (!isset($compteur[$logname])) $compteur[$logname] = 0; + } + if (!isset($compteur[$logname])) { + $compteur[$logname] = 0; + } if ($logname != 'maj' - AND defined('_MAX_LOG') - AND ( - $compteur[$logname]++ > _MAX_LOG - OR !$GLOBALS['nombre_de_logs'] - OR !$GLOBALS['taille_des_logs'] - )) + AND defined('_MAX_LOG') + AND ( + $compteur[$logname]++ > _MAX_LOG + OR !$GLOBALS['nombre_de_logs'] + OR !$GLOBALS['taille_des_logs'] + ) + ) { return; + } - $logfile = ($logdir===NULL ? _DIR_LOG : $logdir) - . ($logname) - . ($logsuf===NULL ? _FILE_LOG_SUFFIX : $logsuf); + $logfile = ($logdir === null ? _DIR_LOG : $logdir) + . ($logname) + . ($logsuf === null ? _FILE_LOG_SUFFIX : $logsuf); if (!isset($test_repertoire[$d = dirname($logfile)])) { $test_repertoire[$d] = false; // eviter une recursivite en cas d'erreur de sous_repertoire - $test_repertoire[$d] = (@is_dir($d)?true:(function_exists('sous_repertoire')?sous_repertoire($d, '', false, true):false)); + $test_repertoire[$d] = (@is_dir($d) ? true : (function_exists('sous_repertoire') ? sous_repertoire($d, '', false, + true) : false)); } // si spip_log() dans mes_options, ou repertoire log/ non present, poser dans tmp/ - if (!defined('_DIR_LOG') OR !$test_repertoire[$d]) - $logfile = _DIR_RACINE._NOM_TEMPORAIRES_INACCESSIBLES.$logname.'.log'; + if (!defined('_DIR_LOG') OR !$test_repertoire[$d]) { + $logfile = _DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES . $logname . '.log'; + } $rotate = 0; - $pid = '(pid '.@getmypid().')'; + $pid = '(pid ' . @getmypid() . ')'; // accepter spip_log( Array ) - if (!is_string($message)) $message = var_export($message, true); + if (!is_string($message)) { + $message = var_export($message, true); + } - if (!$debugverb AND defined('_LOG_FILELINE') AND _LOG_FILELINE){ + if (!$debugverb AND defined('_LOG_FILELINE') AND _LOG_FILELINE) { $debug = debug_backtrace(); $l = $debug[1]['line']; $fi = $debug[1]['file']; - if (strncmp($fi,_ROOT_RACINE,strlen(_ROOT_RACINE))==0) - $fi = substr($fi,strlen(_ROOT_RACINE)); + if (strncmp($fi, _ROOT_RACINE, strlen(_ROOT_RACINE)) == 0) { + $fi = substr($fi, strlen(_ROOT_RACINE)); + } $fu = isset($debug[2]['function']) ? $debug[2]['function'] : ''; - $debugverb = "$fi:L$l:$fu"."():"; + $debugverb = "$fi:L$l:$fu" . "():"; } - $m = date("Y-m-d H:i:s").' '. (isset($GLOBALS['ip']) ? $GLOBALS['ip'] : '') .' '.$pid.' ' - //distinguer les logs prives et publics dans les grep + $m = date("Y-m-d H:i:s") . ' ' . (isset($GLOBALS['ip']) ? $GLOBALS['ip'] : '') . ' ' . $pid . ' ' + //distinguer les logs prives et publics dans les grep . $debugverb - . (test_espace_prive()?':Pri:':':Pub:') - .preg_replace("/\n*$/", "\n", $message); + . (test_espace_prive() ? ':Pri:' : ':Pub:') + . preg_replace("/\n*$/", "\n", $message); if (@is_readable($logfile) - AND (!$s = @filesize($logfile) OR $s > $GLOBALS['taille_des_logs'] * 1024)) { + AND (!$s = @filesize($logfile) OR $s > $GLOBALS['taille_des_logs']*1024) + ) { $rotate = $GLOBALS['nombre_de_logs']; $m .= "[-- rotate --]\n"; } $f = @fopen($logfile, "ab"); if ($f) { - fputs($f, (defined('_LOG_BRUT') AND _LOG_BRUT) ? $m : str_replace('<','<',$m)); + fputs($f, (defined('_LOG_BRUT') AND _LOG_BRUT) ? $m : str_replace('<', '<', $m)); fclose($f); } if ($rotate-- > 0 - AND function_exists('spip_unlink')) { + AND function_exists('spip_unlink') + ) { spip_unlink($logfile . '.' . $rotate); while ($rotate--) { - @rename($logfile . ($rotate ? '.' . $rotate : ''), $logfile . '.' . ($rotate + 1)); + @rename($logfile . ($rotate ? '.' . $rotate : ''), $logfile . '.' . ($rotate+1)); } } // Dupliquer les erreurs specifiques dans le log general if ($logname !== _FILE_LOG - AND defined('_FILE_LOG')) - inc_log_dist($logname=='maj' ? 'cf maj.log' : $message); + AND defined('_FILE_LOG') + ) { + inc_log_dist($logname == 'maj' ? 'cf maj.log' : $message); + } $debugverb = ""; } diff --git a/ecrire/inc/mail.php b/ecrire/inc/mail.php index 73dd01e920..ce16330db3 100644 --- a/ecrire/inc/mail.php +++ b/ecrire/inc/mail.php @@ -17,19 +17,23 @@ * @package SPIP\Core\Mail */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} if (!function_exists('envoyer_mail')) { define('_FUNCTION_ENVOYER_MAIL', charger_fonction('envoyer_mail', 'inc')); /** * Envoie un mail. + * * @uses inc_envoyer_mail_dist() * @deprecated Utiliser inc_envoyer_mail_dist() via charger_fonction() - **/ + **/ function envoyer_mail() { $args = func_get_args(); - if (_FUNCTION_ENVOYER_MAIL) + if (_FUNCTION_ENVOYER_MAIL) { return call_user_func_array(_FUNCTION_ENVOYER_MAIL, $args); + } } } diff --git a/ecrire/inc/math.php b/ecrire/inc/math.php index 329e3a25c9..6ce3638c87 100644 --- a/ecrire/inc/math.php +++ b/ecrire/inc/math.php @@ -12,7 +12,9 @@ // -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // // Gestion du raccourci <math>...</math> en client-serveur @@ -36,17 +38,18 @@ function produire_image_math($tex) { } // Regarder dans le repertoire local des images TeX et blocs MathML - if (!@is_dir($dir_tex = _DIR_VAR.'cache-TeX/')) - @mkdir ($dir_tex, _SPIP_CHMOD); - $fichier = $dir_tex .md5(trim($tex)).$ext; - + if (!@is_dir($dir_tex = _DIR_VAR . 'cache-TeX/')) { + @mkdir($dir_tex, _SPIP_CHMOD); + } + $fichier = $dir_tex . md5(trim($tex)) . $ext; + if (!@file_exists($fichier)) { // Aller chercher l'image sur le serveur if ($server) { - spip_log($url = $server.'?'.rawurlencode($tex)); + spip_log($url = $server . '?' . rawurlencode($tex)); include_spip('inc/distant'); - recuperer_page($url,$fichier); + recuperer_page($url, $fichier); } } @@ -57,19 +60,19 @@ function produire_image_math($tex) { // MathML if ($GLOBALS['traiter_math'] == 'mathml') { - return join(file("$fichier"),""); - } - - // TeX + return join(file("$fichier"), ""); + } // TeX else { - list(,,,$size) = @getimagesize($fichier); - $alt = "alt=\"$tex\" title=\"$tex\""; + list(, , , $size) = @getimagesize($fichier); + $alt = "alt=\"$tex\" title=\"$tex\""; + return "<img src=\"$fichier\" style=\"vertical-align:middle;\" $size $alt />"; } - } - else // pas de fichier + } else // pas de fichier + { return "<tt><span class='spip_code' dir='ltr'>$tex</span></tt>"; + } } @@ -80,8 +83,9 @@ function traiter_math($letexte, $source = '') { $texte_a_voir = $letexte; while (($debut = strpos($texte_a_voir, "<math>")) !== false) { - if (!$fin = strpos($texte_a_voir,"</math>")) + if (!$fin = strpos($texte_a_voir, "</math>")) { $fin = strlen($texte_a_voir); + } $texte_debut = substr($texte_a_voir, 0, $debut); $texte_milieu = substr($texte_a_voir, @@ -90,24 +94,24 @@ function traiter_math($letexte, $source = '') { $fin+strlen("</math>"), strlen($texte_a_voir)); // Les doubles $$x^2$$ en mode 'div' - while((preg_match(",[$][$]([^$]+)[$][$],",$texte_milieu, $regs))) { - $echap = "\n<p class=\"spip\" style=\"text-align: center;\">".produire_image_math($regs[1])."</p>\n"; + while ((preg_match(",[$][$]([^$]+)[$][$],", $texte_milieu, $regs))) { + $echap = "\n<p class=\"spip\" style=\"text-align: center;\">" . produire_image_math($regs[1]) . "</p>\n"; $pos = strpos($texte_milieu, $regs[0]); - $texte_milieu = substr($texte_milieu,0,$pos) + $texte_milieu = substr($texte_milieu, 0, $pos) . code_echappement($echap, $source) - . substr($texte_milieu,$pos+strlen($regs[0])); + . substr($texte_milieu, $pos+strlen($regs[0])); } // Les simples $x^2$ en mode 'span' - while((preg_match(",[$]([^$]+)[$],",$texte_milieu, $regs))) { + while ((preg_match(",[$]([^$]+)[$],", $texte_milieu, $regs))) { $echap = produire_image_math($regs[1]); $pos = strpos($texte_milieu, $regs[0]); - $texte_milieu = substr($texte_milieu,0,$pos) + $texte_milieu = substr($texte_milieu, 0, $pos) . code_echappement($echap, $source) - . substr($texte_milieu,$pos+strlen($regs[0])); + . substr($texte_milieu, $pos+strlen($regs[0])); } - $texte_a_voir = $texte_debut.$texte_milieu.$texte_fin; + $texte_a_voir = $texte_debut . $texte_milieu . $texte_fin; } return $texte_a_voir; diff --git a/ecrire/inc/meta.php b/ecrire/inc/meta.php index 1accbc2f72..3c59f99831 100644 --- a/ecrire/inc/meta.php +++ b/ecrire/inc/meta.php @@ -14,50 +14,61 @@ * Gestion des meta de configuration * * @package SPIP\Core\Configuration -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Les parametres generaux du site sont dans une table SQL; // Recopie dans le tableau PHP global meta, car on en a souvent besoin // duree maximale du cache. Le double pour l'antidater -define('_META_CACHE_TIME', 1<<24); +define('_META_CACHE_TIME', 1 << 24); // http://code.spip.net/@inc_meta_dist -function inc_meta_dist($table = 'meta') -{ +function inc_meta_dist($table = 'meta') { // Lire les meta, en cache si present, valide et lisible // en cas d'install ne pas faire confiance au meta_cache eventuel $cache = cache_meta($table); - if ((_request('exec')!=='install' OR !test_espace_prive()) - AND $new = jeune_fichier($cache, _META_CACHE_TIME) - AND lire_fichier_securise($cache, $meta) - AND $meta = @unserialize($meta)) + if ((_request('exec') !== 'install' OR !test_espace_prive()) + AND $new = jeune_fichier($cache, _META_CACHE_TIME) + AND lire_fichier_securise($cache, $meta) + AND $meta = @unserialize($meta) + ) { $GLOBALS[$table] = $meta; + } - if (isset($GLOBALS[$table]['touch']) - AND ($GLOBALS[$table]['touch']<time()-_META_CACHE_TIME)) + if (isset($GLOBALS[$table]['touch']) + AND ($GLOBALS[$table]['touch'] < time()-_META_CACHE_TIME) + ) { $GLOBALS[$table] = array(); + } // sinon lire en base - if (!$GLOBALS[$table]) $new = !lire_metas($table); + if (!$GLOBALS[$table]) { + $new = !lire_metas($table); + } // renouveller l'alea general si trop vieux ou sur demande explicite if ((test_espace_prive() || isset($_GET['renouvelle_alea'])) - AND $GLOBALS[$table] - AND (time() > _RENOUVELLE_ALEA + (isset($GLOBALS['meta']['alea_ephemere_date']) ? $GLOBALS['meta']['alea_ephemere_date'] : 0))) - { + AND $GLOBALS[$table] + AND (time() > _RENOUVELLE_ALEA+(isset($GLOBALS['meta']['alea_ephemere_date']) ? $GLOBALS['meta']['alea_ephemere_date'] : 0)) + ) { // si on n'a pas l'acces en ecriture sur le cache, // ne pas renouveller l'alea sinon le cache devient faux if (supprimer_fichier($cache)) { include_spip('inc/acces'); renouvelle_alea(); - $new = false; - } else spip_log("impossible d'ecrire dans " . $cache); + $new = false; + } else { + spip_log("impossible d'ecrire dans " . $cache); + } } // et refaire le cache si on a du lire en base - if (!$new) touch_meta(false, $table); + if (!$new) { + touch_meta(false, $table); + } } // fonctions aussi appelees a l'install ==> spip_query en premiere requete @@ -69,31 +80,34 @@ function lire_metas($table = 'meta') { if ($result = spip_query("SELECT nom,valeur FROM spip_$table")) { include_spip('base/abstract_sql'); $GLOBALS[$table] = array(); - while ($row = sql_fetch($result)) + while ($row = sql_fetch($result)) { $GLOBALS[$table][$row['nom']] = $row['valeur']; - sql_free($result); + } + sql_free($result); if (!isset($GLOBALS[$table]['charset']) - OR !$GLOBALS[$table]['charset'] - OR $GLOBALS[$table]['charset']=='_DEFAULT_CHARSET' // hum, correction d'un bug ayant abime quelques install + OR !$GLOBALS[$table]['charset'] + OR $GLOBALS[$table]['charset'] == '_DEFAULT_CHARSET' // hum, correction d'un bug ayant abime quelques install ) { - ecrire_meta('charset', _DEFAULT_CHARSET, NULL, $table); + ecrire_meta('charset', _DEFAULT_CHARSET, null, $table); } // noter cette table de configuration dans les meta de SPIP - if ($table!=='meta') { + if ($table !== 'meta') { $liste = array(); if (isset($GLOBALS['meta']['tables_config'])) { $liste = unserialize($GLOBALS['meta']['tables_config']); } - if (!$liste) + if (!$liste) { $liste = array(); + } if (!in_array($table, $liste)) { $liste[] = $table; ecrire_meta('tables_config', serialize($liste)); } } } + return isset($GLOBALS[$table]) ? $GLOBALS[$table] : null; } @@ -106,8 +120,8 @@ function lire_metas($table = 'meta') { * Date de modification du fichier à appliquer si indiqué (timestamp) * @param string $table * Table SQL d'enregistrement des meta. -**/ -function touch_meta($antidate= false, $table = 'meta'){ + **/ +function touch_meta($antidate = false, $table = 'meta') { $file = cache_meta($table); if (!$antidate OR !@touch($file, $antidate)) { $r = $GLOBALS[$table]; @@ -117,7 +131,9 @@ function touch_meta($antidate= false, $table = 'meta'){ // mais le sortir deu cache meta implique une requete sql des qu'on a un form dynamique // meme si son squelette est en cache //unset($r['secret_du_site']); - if ($antidate) $r['touch']= $antidate; + if ($antidate) { + $r['touch'] = $antidate; + } ecrire_fichier_securise($file, serialize($r)); } } @@ -128,23 +144,28 @@ function touch_meta($antidate= false, $table = 'meta'){ * @see ecrire_config() * @see effacer_config() * @see lire_config() - * + * * @param string $nom * Nom de la meta * @param string $table * Table SQL d'enregistrement de la meta. -**/ + **/ function effacer_meta($nom, $table = 'meta') { // section critique sur le cache: // l'invalider avant et apres la MAJ de la BD // c'est un peu moins bien qu'un vrai verrou mais ca suffira // et utiliser une statique pour eviter des acces disques a repetition static $touch = array(); - $antidate = time() - (_META_CACHE_TIME<<4); - if (!isset($touch[$table])) {touch_meta($antidate, $table);} - sql_delete('spip_' . $table, "nom='$nom'",'','continue'); + $antidate = time()-(_META_CACHE_TIME << 4); + if (!isset($touch[$table])) { + touch_meta($antidate, $table); + } + sql_delete('spip_' . $table, "nom='$nom'", '', 'continue'); unset($GLOBALS[$table][$nom]); - if (!isset($touch[$table])) {touch_meta($antidate, $table); $touch[$table] = false;} + if (!isset($touch[$table])) { + touch_meta($antidate, $table); + $touch[$table] = false; + } } /** @@ -153,7 +174,7 @@ function effacer_meta($nom, $table = 'meta') { * @see ecrire_config() * @see effacer_config() * @see lire_config() - * + * * @param string $nom * Nom de la meta * @param string $valeur @@ -162,42 +183,55 @@ function effacer_meta($nom, $table = 'meta') { * Cette meta s'importe-elle avec une restauration de sauvegarde ? * @param string $table * Table SQL d'enregistrement de la meta. -**/ -function ecrire_meta($nom, $valeur, $importable = NULL, $table = 'meta') { + **/ +function ecrire_meta($nom, $valeur, $importable = null, $table = 'meta') { static $touch = array(); - if (!$nom) return; + if (!$nom) { + return; + } include_spip('base/abstract_sql'); - $res = sql_select("*",'spip_' . $table,"nom=" . sql_quote($nom),'','','','','','continue'); + $res = sql_select("*", 'spip_' . $table, "nom=" . sql_quote($nom), '', '', '', '', '', 'continue'); // table pas encore installee, travailler en php seulement if (!$res) { $GLOBALS[$table][$nom] = $valeur; + return; } $row = sql_fetch($res); - sql_free($res); + sql_free($res); // ne pas invalider le cache si affectation a l'identique // (tant pis si impt aurait du changer) if ($row AND $valeur == $row['valeur'] AND isset($GLOBALS[$table][$nom]) - AND $GLOBALS[$table][$nom] == $valeur) return; + AND $GLOBALS[$table][$nom] == $valeur + ) { + return; + } $GLOBALS[$table][$nom] = $valeur; // cf effacer pour comprendre le double touch - $antidate = time() - (_META_CACHE_TIME<<1); - if (!isset($touch[$table])) {touch_meta($antidate, $table);} - $r = array('nom' => sql_quote($nom,'','text'), 'valeur' => sql_quote($valeur,'','text')); + $antidate = time()-(_META_CACHE_TIME << 1); + if (!isset($touch[$table])) { + touch_meta($antidate, $table); + } + $r = array('nom' => sql_quote($nom, '', 'text'), 'valeur' => sql_quote($valeur, '', 'text')); // Gaffe aux tables sans impt (vieilles versions de SPIP notamment) // ici on utilise pas sql_updateq et sql_insertq pour ne pas provoquer trop tot // de lecture des descriptions des tables - if ($importable AND isset($row['impt'])) $r['impt'] = sql_quote($importable,'','text'); + if ($importable AND isset($row['impt'])) { + $r['impt'] = sql_quote($importable, '', 'text'); + } if ($row) { - sql_update('spip_' . $table, $r,"nom=" . sql_quote($nom)); + sql_update('spip_' . $table, $r, "nom=" . sql_quote($nom)); } else { - sql_insert('spip_' . $table, "(".join(',',array_keys($r)).")","(".join(',',array_values($r)).")"); + sql_insert('spip_' . $table, "(" . join(',', array_keys($r)) . ")", "(" . join(',', array_values($r)) . ")"); + } + if (!isset($touch[$table])) { + touch_meta($antidate, $table); + $touch[$table] = false; } - if (!isset($touch[$table])) {touch_meta($antidate, $table); $touch[$table] = false;} } /** @@ -207,17 +241,18 @@ function ecrire_meta($nom, $valeur, $importable = NULL, $table = 'meta') { * Table SQL d'enregistrement des meta. * @return string * Nom du fichier cache -**/ + **/ function cache_meta($table = 'meta') { - return ($table=='meta') ? _FILE_META : (_DIR_CACHE . $table . '.php'); + return ($table == 'meta') ? _FILE_META : (_DIR_CACHE . $table . '.php'); } /** * Installer une table de configuration supplementaire + * * @param string $table */ function installer_table_meta($table) { - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); if (!$trouver_table("spip_$table")) { include_spip('base/auxiliaires'); include_spip('base/create'); @@ -229,21 +264,24 @@ function installer_table_meta($table) { /** * Supprimer une table de configuration supplémentaire - * + * * Si $force=true, on ne verifie pas qu'elle est bien vide - * + * * @param string $table * @param bool $force */ function supprimer_table_meta($table, $force = false) { - if ($table=='meta') return; // interdit ! + if ($table == 'meta') { + return; + } // interdit ! if ($force OR !sql_countsel("spip_$table")) { unset($GLOBALS[$table]); sql_drop_table("spip_$table"); // vider le cache des tables - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $trouver_table(''); } } + ?> diff --git a/ecrire/inc/minipres.php b/ecrire/inc/minipres.php index cd75f1228a..e854950bbc 100644 --- a/ecrire/inc/minipres.php +++ b/ecrire/inc/minipres.php @@ -13,9 +13,11 @@ /** * Présentation des pages d'installation et d'erreurs * - * @package SPIP\Core\Minipres -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + * @package SPIP\Core\Minipres + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/headers'); include_spip('inc/texte'); //inclue inc/lang et inc/filtres @@ -25,14 +27,14 @@ include_spip('inc/texte'); //inclue inc/lang et inc/filtres * Retourne le début d'une page HTML minimale (de type installation ou erreur) * * Le contenu de CSS minimales (reset.css, clear.css, minipres.css) est inséré - * dans une balise script inline (compactée si possible) - * + * dans une balise script inline (compactée si possible) + * * @uses utiliser_langue_visiteur() * @uses http_no_cache() * @uses html_lang_attributes() * @uses compacte() si le plugin compresseur est présent * @uses url_absolue_css() - * + * * @param string $titre * Titre. `AUTO`, indique que l'on est dans le processus d'installation de SPIP * @param string $onLoad @@ -48,8 +50,8 @@ function install_debut_html($titre = 'AUTO', $onLoad = '', $all_inline = false) http_no_cache(); - if ($titre=='AUTO') { - $titre=_T('info_installation_systeme_publication'); + if ($titre == 'AUTO') { + $titre = _T('info_installation_systeme_publication'); } # le charset est en utf-8, pour recuperer le nom comme il faut @@ -59,44 +61,46 @@ function install_debut_html($titre = 'AUTO', $onLoad = '', $all_inline = false) } $css = ""; - $files = array('reset.css','clear.css','minipres.css'); - if ($all_inline){ + $files = array('reset.css', 'clear.css', 'minipres.css'); + if ($all_inline) { // inliner les CSS (optimisation de la page minipres qui passe en un seul hit a la demande) - foreach ($files as $name){ + foreach ($files as $name) { $file = direction_css(find_in_theme($name)); if (function_exists("compacte")) { $file = compacte($file); } else { $file = url_absolue_css($file); // precaution } - lire_fichier($file,$c); + lire_fichier($file, $c); $css .= $c; } - $css = "<style type='text/css'>".$css."</style>"; - } - else{ - foreach ($files as $name){ + $css = "<style type='text/css'>" . $css . "</style>"; + } else { + foreach ($files as $name) { $file = direction_css(find_in_theme($name)); $css .= "<link rel='stylesheet' href='$file' type='text/css' />\n"; } } // au cas ou minipres() est appele avant spip_initialisation_suite() - if (!defined('_DOCTYPE_ECRIRE')) define('_DOCTYPE_ECRIRE', ''); - return _DOCTYPE_ECRIRE. - html_lang_attributes(). - "<head>\n". - "<title>". - textebrut($titre). - "</title>\n". - "<meta name='viewport' content='width=device-width' />\n". - $css . -"</head> -<body".$onLoad." class='minipres'> + if (!defined('_DOCTYPE_ECRIRE')) { + define('_DOCTYPE_ECRIRE', ''); + } + + return _DOCTYPE_ECRIRE . + html_lang_attributes() . + "<head>\n" . + "<title>" . + textebrut($titre) . + "</title>\n" . + "<meta name='viewport' content='width=device-width' />\n" . + $css . + "</head> +<body" . $onLoad . " class='minipres'> <div id='minipres'> - <h1>". - $titre . - "</h1> + <h1>" . + $titre . + "</h1> <div>\n"; } @@ -113,7 +117,7 @@ function install_fin_html() { /** * Retourne une page HTML contenant, dans une présentation minimale, * le contenu transmis dans `$titre` et `$corps`. - * + * * Appelée pour afficher un message d’erreur (l’utilisateur n’a pas * accès à cette page par exemple). * @@ -130,7 +134,7 @@ function install_fin_html() { * ``` * @uses install_debut_html() * @uses install_fin_html() - * + * * @param string $titre * Titre de la page * @param string $corps @@ -142,57 +146,69 @@ function install_fin_html() { * @return string * HTML de la page */ -function minipres($titre = '', $corps = "", $options = array()){ +function minipres($titre = '', $corps = "", $options = array()) { // compat signature old // minipres($titre='', $corps="", $onload='', $all_inline = false) $args = func_get_args(); - if (isset($args[2]) AND is_string($args[2])){$options = array('onload' => $args[2]);} - if (isset($args[3])) {$options['all_inline'] = $args[3];} + if (isset($args[2]) AND is_string($args[2])) { + $options = array('onload' => $args[2]); + } + if (isset($args[3])) { + $options['all_inline'] = $args[3]; + } $options = array_merge(array( 'onload' => '', 'all_inline' => false, - ),$options); + ), $options); - if (!defined('_AJAX')) define('_AJAX', false); // par securite + if (!defined('_AJAX')) { + define('_AJAX', false); + } // par securite if (!$titre) { - if (!isset($options['status'])) + if (!isset($options['status'])) { $options['status'] = 403; + } if (!$titre = _request('action') - AND !$titre = _request('exec') - AND !$titre = _request('page')) + AND !$titre = _request('exec') + AND !$titre = _request('page') + ) { $titre = '?'; + } $titre = spip_htmlspecialchars($titre); $titre = ($titre == 'install') - ? _T('avis_espace_interdit') - : $titre . ' : '. _T('info_acces_interdit'); + ? _T('avis_espace_interdit') + : $titre . ' : ' . _T('info_acces_interdit'); $statut = isset($GLOBALS['visiteur_session']['statut']) ? $GLOBALS['visiteur_session']['statut'] : ''; - $nom = isset($GLOBALS['visiteur_session']['nom']) ? $GLOBALS['visiteur_session']['nom'] : ''; + $nom = isset($GLOBALS['visiteur_session']['nom']) ? $GLOBALS['visiteur_session']['nom'] : ''; - $corps = generer_form_ecrire('accueil', '','', - $statut ? _T('public:accueil_site') : _T('public:lien_connecter') + $corps = generer_form_ecrire('accueil', '', '', + $statut ? _T('public:accueil_site') : _T('public:lien_connecter') ); spip_log($nom . " $titre " . $_SERVER['REQUEST_URI']); } - if (!_AJAX){ - if (isset($options['status'])) + if (!_AJAX) { + if (isset($options['status'])) { http_status($options['status']); + } + return install_debut_html($titre, $options['onload'], $options['all_inline']) . $corps . install_fin_html(); - } - else { + } else { include_spip('inc/headers'); include_spip('inc/actions'); - $url = self('&',true); - foreach ($_POST as $v => $c) + $url = self('&', true); + foreach ($_POST as $v => $c) { $url = parametre_url($url, $v, $c, '&'); - ajax_retour("<div>".$titre . redirige_formulaire($url)."</div>",false); + } + ajax_retour("<div>" . $titre . redirige_formulaire($url) . "</div>", false); } } + ?> diff --git a/ecrire/inc/modifier.php b/ecrire/inc/modifier.php index 14f306d5e0..db00895d6f 100644 --- a/ecrire/inc/modifier.php +++ b/ecrire/inc/modifier.php @@ -14,13 +14,15 @@ * Fonctions d'aides pour les fonctions d'objets de modification de contenus * * @package SPIP\Core\Objets\Modifications -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Collecte des champs postés - * + * * Fonction générique pour la collecte des posts * dans action/editer_xxx * @@ -34,36 +36,36 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param bool $tous * true : Recupère tous les champs de white_list meme ceux n'ayant pas ete postés * @return array - * Tableau des champs et valeurs collectées + * Tableau des champs et valeurs collectées */ -function collecter_requests($white_list, $black_list = array(), $set = null, $tous = false){ +function collecter_requests($white_list, $black_list = array(), $set = null, $tous = false) { $c = $set; - if (!$c){ + if (!$c) { $c = array(); - foreach($white_list as $champ) { + foreach ($white_list as $champ) { // on ne collecte que les champs reellement envoyes par defaut. // le cas d'un envoi de valeur NULL peut du coup poser probleme. $val = _request($champ); - if ($tous OR $val !== NULL) { + if ($tous OR $val !== null) { $c[$champ] = $val; } } // on ajoute toujours la lang en saisie possible // meme si pas prevu au depart pour l'objet concerne - if ($l = _request('changer_lang')){ + if ($l = _request('changer_lang')) { $c['lang'] = $l; } } - foreach($black_list as $champ) { + foreach ($black_list as $champ) { unset($c[$champ]); } - + return $c; } /** * Modifie le contenu d'un objet - * + * * Fonction generique pour l'API de modification de contenu, qui se * charge entre autres choses d'appeler les pipelines pre_edition * et post_edition @@ -96,20 +98,22 @@ function collecter_requests($white_list, $black_list = array(), $set = null, $to function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur = '') { if (!$id_objet = intval($id_objet)) { spip_log('Erreur $id_objet non defini', 'warn'); + return _T('erreur_technique_enregistrement_impossible'); } include_spip('inc/filtres'); - $table_objet = table_objet($objet,$serveur); - $spip_table_objet = table_objet_sql($objet,$serveur); - $id_table_objet = id_table_objet($objet,$serveur); + $table_objet = table_objet($objet, $serveur); + $spip_table_objet = table_objet_sql($objet, $serveur); + $id_table_objet = id_table_objet($objet, $serveur); $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($spip_table_objet, $serveur); // Appels incomplets (sans $c) if (!is_array($c)) { - spip_log('erreur appel objet_modifier_champs('.$objet.'), manque $c'); + spip_log('erreur appel objet_modifier_champs(' . $objet . '), manque $c'); + return _T('erreur_technique_enregistrement_impossible'); } @@ -137,9 +141,11 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur // TODO: ici aussi on peut valider les contenus // en fonction du type $champs = array(); - foreach($desc['field'] as $champ => $ignore) - if (isset($c[$champ])) + foreach ($desc['field'] as $champ => $ignore) { + if (isset($c[$champ])) { $champs[$champ] = $c[$champ]; + } + } // Nettoyer les valeurs $champs = array_map('corriger_caracteres', $champs); @@ -151,7 +157,7 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur 'table' => $spip_table_objet, // compatibilite 'table_objet' => $table_objet, 'spip_table_objet' => $spip_table_objet, - 'type' =>$objet, + 'type' => $objet, 'id_objet' => $id_objet, 'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] c'est quoi ? 'serveur' => $serveur, @@ -161,13 +167,15 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur ) ); - if (!$champs) return false; + if (!$champs) { + return false; + } // marquer le fait que l'objet est travaille par toto a telle date if ($GLOBALS['meta']['articles_modif'] != 'non') { include_spip('inc/drapeau_edition'); - signale_edition ($id_objet, $GLOBALS['visiteur_session'], $objet); + signale_edition($id_objet, $GLOBALS['visiteur_session'], $objet); } // Verifier si les mises a jour sont pertinentes, datees, en conflit etc @@ -179,20 +187,21 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur // cas hypothetique : normalement inc/editer verifie en amont le conflit edition // et gere l'interface // ici on ne renvoie donc qu'un messsage d'erreur, au cas ou on y arrive quand meme - if ($conflits) + if ($conflits) { return _T('titre_conflit_edition'); + } if ($champs) { // cas particulier de la langue : passer par instituer_langue_objet - if (isset($champs['lang'])){ - if ($changer_lang=$champs['lang']){ + if (isset($champs['lang'])) { + if ($changer_lang = $champs['lang']) { $id_rubrique = 0; - if ($desc['field']['id_rubrique']){ - $parent = ($objet=='rubrique')?'id_parent':'id_rubrique'; - $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=".intval($id_objet)); + if ($desc['field']['id_rubrique']) { + $parent = ($objet == 'rubrique') ? 'id_parent' : 'id_rubrique'; + $id_rubrique = sql_getfetsel($parent, $spip_table_objet, "$id_table_objet=" . intval($id_objet)); } - $instituer_langue_objet = charger_fonction('instituer_langue_objet','action'); - $champs['lang'] = $instituer_langue_objet($objet,$id_objet, $id_rubrique, $changer_lang); + $instituer_langue_objet = charger_fonction('instituer_langue_objet', 'action'); + $champs['lang'] = $instituer_langue_objet($objet, $id_objet, $id_rubrique, $changer_lang); } // on laisse 'lang' dans $champs, // ca permet de passer dans le pipeline post_edition et de journaliser @@ -204,21 +213,24 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur // faut-il ajouter date_modif ? if (isset($options['date_modif']) AND $options['date_modif'] - AND !isset($champs[$options['date_modif']])) + AND !isset($champs[$options['date_modif']]) + ) { $champs[$options['date_modif']] = date('Y-m-d H:i:s'); + } // allez on commit la modif - sql_updateq($spip_table_objet, $champs, "$id_table_objet=".intval($id_objet), $serveur); + sql_updateq($spip_table_objet, $champs, "$id_table_objet=" . intval($id_objet), $serveur); // on verifie si elle est bien passee - $moof = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=".intval($id_objet), array(), array(), '', array(), $serveur); + $moof = sql_fetsel(array_keys($champs), $spip_table_objet, "$id_table_objet=" . intval($id_objet), array(), array(), + '', array(), $serveur); // si difference entre les champs, reperer les champs mal enregistres if ($moof != $champs) { $liste = array(); - foreach($moof as $k=>$v) { + foreach ($moof as $k => $v) { if ($v !== $champs[$k] - // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes - AND (!is_numeric($v) OR intval($v)!=intval($champs[$k])) + // ne pas alerter si le champ est numerique est que les valeurs sont equivalentes + AND (!is_numeric($v) OR intval($v) != intval($champs[$k])) ) { $liste[] = $k; $conflits[$k]['post'] = $champs[$k]; @@ -236,19 +248,23 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur } // si un champ n'a pas ete correctement enregistre, loger et retourner une erreur // c'est un cas exceptionnel - if (count($liste)){ - spip_log("Erreur enregistrement en base $objet/$id_objet champs :".var_export($conflits,true),'modifier.'._LOG_CRITIQUE); - return _T('erreur_technique_enregistrement_champs',array('champs'=>"<i>'".implode("'</i>,<i>'",$liste)."'</i>")); + if (count($liste)) { + spip_log("Erreur enregistrement en base $objet/$id_objet champs :" . var_export($conflits, true), + 'modifier.' . _LOG_CRITIQUE); + + return _T('erreur_technique_enregistrement_champs', + array('champs' => "<i>'" . implode("'</i>,<i>'", $liste) . "'</i>")); } } // Invalider les caches if (isset($options['invalideur']) and $options['invalideur']) { include_spip('inc/invalideur'); - if (is_array($options['invalideur'])) - array_map('suivre_invalideur',$options['invalideur']); - else + if (is_array($options['invalideur'])) { + array_map('suivre_invalideur', $options['invalideur']); + } else { suivre_invalideur($options['invalideur']); + } } // Notifications, gestion des revisions... @@ -259,7 +275,7 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur 'table' => $spip_table_objet, 'table_objet' => $table_objet, 'spip_table_objet' => $spip_table_objet, - 'type' =>$objet, + 'type' => $objet, 'id_objet' => $id_objet, 'champs' => isset($options['champs']) ? $options['champs'] : array(), // [doc] kesako ? 'serveur' => $serveur, @@ -274,7 +290,8 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur // message a affiner :-) include_spip('inc/filtres_mini'); $qui = isset($GLOBALS['visiteur_session']['nom']) AND $GLOBALS['visiteur_session']['nom'] ? $GLOBALS['visiteur_session']['nom'] : $GLOBALS['ip']; - journal(_L($qui.' a édité l’'.$objet.' '.$id_objet.' ('.join('+',array_diff(array_keys($champs), array('date_modif'))).')'), array( + journal(_L($qui . ' a édité l’' . $objet . ' ' . $id_objet . ' (' . join('+', + array_diff(array_keys($champs), array('date_modif'))) . ')'), array( 'faire' => 'modifier', 'quoi' => $objet, 'id' => $id_objet @@ -285,7 +302,7 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur /** * Modifie un contenu - * + * * Dépreciée : * Fonction générique pour l'API de modification de contenu * @@ -306,18 +323,19 @@ function objet_modifier_champs($objet, $id_objet, $options, $c = null, $serveur */ function modifier_contenu($type, $id, $options, $c = null, $serveur = '') { $res = objet_modifier_champs($type, $id, $options, $c, $serveur); - return ($res===''?true:false); + + return ($res === '' ? true : false); } /** * Crée une modification d'un objet - * + * * Wrapper pour remplacer tous les obsoletes revision_xxx * * @deprecated * Utiliser objet_modifier(); * @uses objet_modifier() - * + * * @param string $objet * Nom de l'objet * @param int $id_objet @@ -326,10 +344,11 @@ function modifier_contenu($type, $id, $options, $c = null, $serveur = '') { * Couples des champs/valeurs modifiées * @return mixed|string */ -function revision_objet($objet, $id_objet, $c = null){ +function revision_objet($objet, $id_objet, $c = null) { $objet = objet_type($objet); // securite include_spip('action/editer_objet'); - return objet_modifier($objet,$id_objet,$c); + + return objet_modifier($objet, $id_objet, $c); } diff --git a/ecrire/inc/nfslock.php b/ecrire/inc/nfslock.php index f31da94e34..93e33c163c 100644 --- a/ecrire/inc/nfslock.php +++ b/ecrire/inc/nfslock.php @@ -4,17 +4,19 @@ * Gestion des verrous NFS * * @package SPIP\Core\NFS -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/acces'); -define('_DEFAULT_LOCKTIME',60); -define('_NAME_LOCK','spip_nfs_lock'); +define('_DEFAULT_LOCKTIME', 60); +define('_NAME_LOCK', 'spip_nfs_lock'); /** * Crée un verrou pour NFS - * + * * (Excerpts from Chuck's notes: * this becomes complex, due to our dear friend, the NFS mounted mail spool. * the netbsd code didn't do this properly, as far as I could tell. @@ -51,9 +53,9 @@ define('_NAME_LOCK','spip_nfs_lock'); * * args: path = path to directory of lock file (/net/u/1/a/alexis/.mailspool) * namelock = file name of lock file (alexis.lock) - * max_age = age of lockfile, in seconds, after which the lock is stale. - * stale locks are always broken. Defaults to DEFAULT_LOCKTIME - * if zero. Panix mail locks go stale at 300 seconds, the default. + * max_age = age of lockfile, in seconds, after which the lock is stale. + * stale locks are always broken. Defaults to DEFAULT_LOCKTIME + * if zero. Panix mail locks go stale at 300 seconds, the default. * notify = 1 if we should tell stdout that we're sleeping on a lock * * Returns the time that the lock was created on the other system. This is @@ -100,25 +102,28 @@ define('_NAME_LOCK','spip_nfs_lock'); */ function spip_nfslock($fichier, $max_age = 0) { $tries = 0; - - if (!$max_age) $max_age = _DEFAULT_LOCKTIME; - $lock_file = _DIR_TMP . _NAME_LOCK . "-" . substr(md5($fichier),0,8); - + if (!$max_age) { + $max_age = _DEFAULT_LOCKTIME; + } + $lock_file = _DIR_TMP . _NAME_LOCK . "-" . substr(md5($fichier), 0, 8); + + /* * 1. create a tmp file with a psuedo random file name. we also make * tpath which is a buffer to store the full pathname of the tmp file. */ $id = creer_uniqid(); - $tpath = _DIR_TMP."slock.$id"; + $tpath = _DIR_TMP . "slock.$id"; $tmpfd = @fopen($tpath, 'w'); // hum, le 'x' necessite php4,3,2 ... - if (!$tmpfd) { /* open failed */ + if (!$tmpfd) { /* open failed */ @fclose($tmpfd); spip_unlink($tpath); + return false; //NFSL_SYSF } - + /* * 2. make fullpath, a buffer for the full pathname of the lock file. * then start looping trying to lock it @@ -133,11 +138,13 @@ function spip_nfslock($fichier, $max_age = 0) { if (link($tpath, $lock_file) == 1) { spip_unlink($tpath); /* got it! */ @fclose($tmpfd); - if (($our_tmp = lstat($lock_file))==false) { /* stat failed... shouldn't happen */ + if (($our_tmp = lstat($lock_file)) == false) { /* stat failed... shouldn't happen */ spip_unlink($lock_file); + return false; // (NFSL_SYSF); } - return($our_tmp['ctime']); + + return ($our_tmp['ctime']); } /* @@ -148,11 +155,12 @@ function spip_nfslock($fichier, $max_age = 0) { */ $old_stat = lstat($lock_file); - if (@fputs($tmpfd, "zz", 2)!=2 || !$our_tmp=fstat($tmpfd)) - break; /* something bogus is going on */ + if (@fputs($tmpfd, "zz", 2) != 2 || !$our_tmp = fstat($tmpfd)) { + break; + } /* something bogus is going on */ - if ($old_stat!=false && (($old_stat['ctime'] + $max_age) < $our_tmp['ctime'])) { + if ($old_stat != false && (($old_stat['ctime']+$max_age) < $our_tmp['ctime'])) { spip_unlink($lock_file); /* break the stale lock */ $tries++; /* It is CRITICAL that we sleep after breaking @@ -160,7 +168,7 @@ function spip_nfslock($fichier, $max_age = 0) { * another process and unlink it's newly- * created file. */ - sleep(1+rand(0,4)); + sleep(1+rand(0, 4)); continue; } @@ -168,9 +176,9 @@ function spip_nfslock($fichier, $max_age = 0) { * 5. try again */ - $tries++; - sleep(1+rand(0,4)); - } + $tries++; + sleep(1+rand(0, 4)); + } /* * 6. give up, failure. @@ -178,12 +186,13 @@ function spip_nfslock($fichier, $max_age = 0) { spip_unlink($tpath); @fclose($tmpfd); + return false; //(NFSL_LOCKED); } /** * Unlock an nfslock()ed file - * + * * This can get tricky because the lock may have expired (perhaps even * during a process that should be "atomic"). We have to make sure we don't * unlock some other process' lock, and return a panic code if we think our @@ -193,9 +202,9 @@ function spip_nfslock($fichier, $max_age = 0) { * args: path = path to directory of lock file (/net/u/1/a/alexis/.mailspool) * namelock = file name of lock file (alexis.lock) * max_age = age of lockfile, in seconds, after which the lock is stale. - * stale locks are always broken. Defaults to DEFAULT_LOCKTIME - * if zero. Panix mail locks go stale at 300 seconds, the default. - * birth = time the lock was created (as returned by nfslock()). + * stale locks are always broken. Defaults to DEFAULT_LOCKTIME + * if zero. Panix mail locks go stale at 300 seconds, the default. + * birth = time the lock was created (as returned by nfslock()). * * Returns NFSL_OK if successful, NFSL_LOST if the lock has been lost * legitimately (because more than max_age has passed since the lock was @@ -223,32 +232,36 @@ function spip_nfslock($fichier, $max_age = 0) { */ function spip_nfsunlock($fichier, $birth, $max_age = 0, $test = false) { $id = creer_uniqid(); - if (!$max_age) $max_age = _DEFAULT_LOCKTIME; + if (!$max_age) { + $max_age = _DEFAULT_LOCKTIME; + } /* * 1. Build a temp file and stat that to get an idea of what the server * thinks the current time is (our_tmp.st_ctime).. */ - $tpath = _DIR_TMP."stime.$id"; - $tmpfd = @fopen($tpath,'w'); - if ((!$tmpfd) - OR (@fputs($tmpfd, "zz", 2) != 2) - OR !($our_tmp = fstat($tmpfd))) { + $tpath = _DIR_TMP . "stime.$id"; + $tmpfd = @fopen($tpath, 'w'); + if ((!$tmpfd) + OR (@fputs($tmpfd, "zz", 2) != 2) + OR !($our_tmp = fstat($tmpfd)) + ) { /* The open failed, or we can't write the file, or we can't stat it */ @fclose($tmpfd); spip_unlink($tpath); + return false; //(NFSL_SYSF); } - @fclose($tmpfd); /* We don't need this once we have our_tmp.st_ctime. */ + @fclose($tmpfd); /* We don't need this once we have our_tmp.st_ctime. */ spip_unlink($tpath); /* * 2. make fullpath, a buffer for the full pathname of the lock file */ - $lock_file = _DIR_TMP . _NAME_LOCK . "-" . substr(md5($fichier),0,8); + $lock_file = _DIR_TMP . _NAME_LOCK . "-" . substr(md5($fichier), 0, 8); /* * 3. If the ctime hasn't been modified, unlink the file and return. If the @@ -257,16 +270,21 @@ function spip_nfsunlock($fichier, $birth, $max_age = 0, $test = false) { * tries to relock the file. */ - if ( ($old_stat=@lstat($lock_file)) /* stat succeeds so file is there */ - && ($old_stat['ctime'] == $birth)) { /* hasn't been modified since birth */ - if (!$test) - spip_unlink($lock_file); /* so the lock is ours to remove */ - if ($our_tmp['ctime'] >= $birth + $max_age){ /* the lock has expired */ - if (!$test) return false; //(NFSL_LOST); - sleep(1+(random(0,4))); /* so sleep a bit */ - } + if (($old_stat = @lstat($lock_file)) /* stat succeeds so file is there */ + && ($old_stat['ctime'] == $birth) + ) { /* hasn't been modified since birth */ + if (!$test) { + spip_unlink($lock_file); + } /* so the lock is ours to remove */ + if ($our_tmp['ctime'] >= $birth+$max_age) { /* the lock has expired */ + if (!$test) { + return false; + } //(NFSL_LOST); + sleep(1+(random(0, 4))); /* so sleep a bit */ + } + return true;//(NFSL_OK); /* success */ - } + } /* * 4. Either ctime has been modified, or the entire lock file is missing. @@ -275,8 +293,9 @@ function spip_nfsunlock($fichier, $birth, $max_age = 0, $test = false) { * someone else has grabbed the file, so return NFSL_LOST. */ - if ($our_tmp['ctime'] < $birth + $max_age) /* lock was stolen */ - return false; //(NFSL_STOLEN); + if ($our_tmp['ctime'] < $birth+$max_age) /* lock was stolen */ { + return false; + } //(NFSL_STOLEN); return false; //(NFSL_LOST); /* The lock must have expired first. */ } @@ -292,6 +311,7 @@ function spip_nfsunlock($fichier, $birth, $max_age = 0, $test = false) { * * The source for this routine is almost identical to nfsunlock(), but it's * coded separately to make things as clear as possible. + * * @author Alexis Rosen <alexis@panix.com> * @see spip_nfsunlock() about lost and stolen locks. * diff --git a/ecrire/inc/notifications.php b/ecrire/inc/notifications.php index 319c1098ba..d6f9ea6ea3 100644 --- a/ecrire/inc/notifications.php +++ b/ecrire/inc/notifications.php @@ -14,8 +14,10 @@ * Gestion des notifications * * @package SPIP\Core\Notifications -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -33,12 +35,12 @@ function inc_notifications_dist($quoi, $id = 0, $options = array()) { // charger les fichiers qui veulent ajouter des definitions // ou faire des trucs aussi dans le pipeline, ca fait deux api pour le prix d'une ... - pipeline('notifications',array('args'=>array('quoi'=>$quoi,'id'=>$id,'options'=>$options))); + pipeline('notifications', array('args' => array('quoi' => $quoi, 'id' => $id, 'options' => $options))); - if ($notification = charger_fonction($quoi,'notifications',true)) { + if ($notification = charger_fonction($quoi, 'notifications', true)) { spip_log("$notification($quoi,$id" - .($options?",".serialize($options):"") - .")",'notifications'); + . ($options ? "," . serialize($options) : "") + . ")", 'notifications'); $notification($quoi, $id, $options); } } @@ -53,20 +55,20 @@ function inc_notifications_dist($quoi, $id = 0, $options = array()) { * @param array $emails * @param array $exclure */ -function notifications_nettoyer_emails(&$emails, $exclure = array()){ +function notifications_nettoyer_emails(&$emails, $exclure = array()) { // filtrer et unifier - $emails = array_unique(array_filter(array_map('email_valide',array_map('trim', $emails)))); - if ($exclure AND count($exclure)){ + $emails = array_unique(array_filter(array_map('email_valide', array_map('trim', $emails)))); + if ($exclure AND count($exclure)) { // nettoyer les exclusions d'abord notifications_nettoyer_emails($exclure); // faire un diff - $emails = array_diff($emails,$exclure); + $emails = array_diff($emails, $exclure); } } /** * Envoyer un email de notification - * + * * Le sujet peut être vide, dans ce cas il reprendra la première ligne non vide du texte * * @param array|string $emails @@ -75,32 +77,36 @@ function notifications_nettoyer_emails(&$emails, $exclure = array()){ * @param string $from * @param string $headers */ -function notifications_envoyer_mails($emails, $texte, $sujet = "", $from = "", $headers = ""){ +function notifications_envoyer_mails($emails, $texte, $sujet = "", $from = "", $headers = "") { // rien a faire si pas de texte ! - if (!strlen($texte)) + if (!strlen($texte)) { return; + } // si on ne specifie qu'un email, le mettre dans un tableau - if (!is_array($emails)) - $emails = explode(',',$emails); + if (!is_array($emails)) { + $emails = explode(',', $emails); + } notifications_nettoyer_emails($emails); // tester si le mail est deja en html - if (strpos($texte,"<")!==false // eviter les tests suivants si possible + if (strpos($texte, "<") !== false // eviter les tests suivants si possible AND $ttrim = trim($texte) - AND substr($ttrim,0,1)=="<" - AND substr($ttrim,-1,1)==">" - AND stripos($ttrim,"</html>")!==false){ + AND substr($ttrim, 0, 1) == "<" + AND substr($ttrim, -1, 1) == ">" + AND stripos($ttrim, "</html>") !== false + ) { - if(!strlen($sujet)){ + if (!strlen($sujet)) { // dans ce cas on ruse un peu : extraire le sujet du title - if (preg_match(",<title>(.*)</title>,Uims",$texte,$m)) + if (preg_match(",<title>(.*)</title>,Uims", $texte, $m)) { $sujet = $m[1]; - else { + } else { // fallback, on prend le body si on le trouve - if (preg_match(",<body[^>]*>(.*)</body>,Uims",$texte,$m)) + if (preg_match(",<body[^>]*>(.*)</body>,Uims", $texte, $m)) { $ttrim = $m[1]; + } // et on extrait la premiere ligne de vrai texte... // nettoyer le html et les retours chariots @@ -108,45 +114,47 @@ function notifications_envoyer_mails($emails, $texte, $sujet = "", $from = "", $ $ttrim = str_replace("\r\n", "\r", $ttrim); $ttrim = str_replace("\r", "\n", $ttrim); // decouper - $ttrim = explode("\n",trim($ttrim)); + $ttrim = explode("\n", trim($ttrim)); // extraire la premiere ligne de texte brut $sujet = array_shift($ttrim); } } // si besoin on ajoute le content-type dans les headers - if (stripos($headers,"Content-Type")===false) + if (stripos($headers, "Content-Type") === false) { $headers .= "Content-Type: text/html\n"; + } } // si le sujet est vide, extraire la premiere ligne du corps // du mail qui est donc du texte - if (!strlen($sujet)){ + if (!strlen($sujet)) { // nettoyer un peu les retours chariots $texte = str_replace("\r\n", "\r", $texte); $texte = str_replace("\r", "\n", $texte); // decouper - $texte = explode("\n",trim($texte)); + $texte = explode("\n", trim($texte)); // extraire la premiere ligne $sujet = array_shift($texte); - $texte = trim(implode("\n",$texte)); + $texte = trim(implode("\n", $texte)); } - $envoyer_mail = charger_fonction('envoyer_mail','inc'); - foreach($emails as $email){ + $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); + foreach ($emails as $email) { // passer dans un pipeline qui permet un ajout eventuel // (url de suivi des notifications par exemple) - $envoi = pipeline('notifications_envoyer_mails',array('email'=>$email,'sujet'=>$sujet,'texte'=>$texte)); + $envoi = pipeline('notifications_envoyer_mails', array('email' => $email, 'sujet' => $sujet, 'texte' => $texte)); $email = $envoi['email']; - job_queue_add('envoyer_mail', ">$email : ".$envoi['sujet'], array($email, $envoi['sujet'], $envoi['texte'], $from, $headers), 'inc/'); + job_queue_add('envoyer_mail', ">$email : " . $envoi['sujet'], + array($email, $envoi['sujet'], $envoi['texte'], $from, $headers), 'inc/'); } } /** * Notifier un événement sur un objet - * + * * Récupère le fond désigné dans $modele, * prend la première ligne comme sujet * et l'interprète pour envoyer l'email @@ -157,14 +165,15 @@ function notifications_envoyer_mails($emails, $texte, $sujet = "", $from = "", $ * @return string */ function email_notification_objet($id_objet, $type_objet, $modele) { - $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email + $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); // pour nettoyer_titre_email $id_type = id_table_objet($type_objet); - return recuperer_fond($modele,array($id_type=>$id_objet,"id"=>$id_objet)); + + return recuperer_fond($modele, array($id_type => $id_objet, "id" => $id_objet)); } /** * Notifier un événement sur un article - * + * * Récupère le fond désigné dans $modele, * prend la première ligne comme sujet * et l'interprète pour envoyer l'email @@ -174,9 +183,9 @@ function email_notification_objet($id_objet, $type_objet, $modele) { * @return string */ function email_notification_article($id_article, $modele) { - $envoyer_mail = charger_fonction('envoyer_mail','inc'); // pour nettoyer_titre_email + $envoyer_mail = charger_fonction('envoyer_mail', 'inc'); // pour nettoyer_titre_email - return recuperer_fond($modele,array('id_article'=>$id_article)); + return recuperer_fond($modele, array('id_article' => $id_article)); } /** @@ -184,7 +193,7 @@ function email_notification_article($id_article, $modele) { * * @deprecated Ne plus utiliser * @param int $id_article -**/ + **/ function notifier_publication_article($id_article) { if ($GLOBALS['meta']["suivi_edito"] == "oui") { $adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; @@ -198,7 +207,7 @@ function notifier_publication_article($id_article) { * * @deprecated Ne plus utiliser * @param int $id_article -**/ + **/ function notifier_proposition_article($id_article) { if ($GLOBALS['meta']["suivi_edito"] == "oui") { $adresse_suivi = $GLOBALS['meta']["adresse_suivi"]; diff --git a/ecrire/inc/pclzip.php b/ecrire/inc/pclzip.php index cf66d4bf18..5b99951f5e 100644 --- a/ecrire/inc/pclzip.php +++ b/ecrire/inc/pclzip.php @@ -23,5681 +23,5642 @@ // - // personnalisations spip - if (!defined('PCLZIP_TEMPORARY_DIR')) { - define('PCLZIP_TEMPORARY_DIR', _DIR_TMP); - } - if (!function_exists('gzopen') && function_exists('gzopen64')) { - function gzopen($filename, $mode, $use_include_path = 0) { - return gzopen64($filename, $mode, $use_include_path); - } - } - // fin personnalisations spip - - // ----- Constants - if (!defined('PCLZIP_READ_BLOCK_SIZE')) { - define( 'PCLZIP_READ_BLOCK_SIZE', 2048 ); - } - - // ----- File list separator - // In version 1.x of PclZip, the separator for file list is a space - // (which is not a very smart choice, specifically for windows paths !). - // A better separator should be a comma (,). This constant gives you the - // abilty to change that. - // However notice that changing this value, may have impact on existing - // scripts, using space separated filenames. - // Recommanded values for compatibility with older versions : - //define( 'PCLZIP_SEPARATOR', ' ' ); - // Recommanded values for smart separation of filenames. - if (!defined('PCLZIP_SEPARATOR')) { - define( 'PCLZIP_SEPARATOR', ',' ); - } - - // ----- Error configuration - // 0 : PclZip Class integrated error handling - // 1 : PclError external library error handling. By enabling this - // you must ensure that you have included PclError library. - // [2,...] : reserved for futur use - if (!defined('PCLZIP_ERROR_EXTERNAL')) { - define( 'PCLZIP_ERROR_EXTERNAL', 0 ); - } - - // ----- Optional static temporary directory - // By default temporary files are generated in the script current - // path. - // If defined : - // - MUST BE terminated by a '/'. - // - MUST be a valid, already created directory - // Samples : - // define( 'PCLZIP_TEMPORARY_DIR', '/temp/' ); - // define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' ); - if (!defined('PCLZIP_TEMPORARY_DIR')) { - define( 'PCLZIP_TEMPORARY_DIR', '' ); - } - - // ----- Optional threshold ratio for use of temporary files - // Pclzip sense the size of the file to add/extract and decide to - // use or not temporary file. The algorythm is looking for - // memory_limit of PHP and apply a ratio. - // threshold = memory_limit * ratio. - // Recommended values are under 0.5. Default 0.47. - // Samples : - // define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.5 ); - if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) { - define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.47 ); - } +// personnalisations spip +if (!defined('PCLZIP_TEMPORARY_DIR')) { + define('PCLZIP_TEMPORARY_DIR', _DIR_TMP); +} +if (!function_exists('gzopen') && function_exists('gzopen64')) { + function gzopen($filename, $mode, $use_include_path = 0) { + return gzopen64($filename, $mode, $use_include_path); + } +} +// fin personnalisations spip + +// ----- Constants +if (!defined('PCLZIP_READ_BLOCK_SIZE')) { + define('PCLZIP_READ_BLOCK_SIZE', 2048); +} + +// ----- File list separator +// In version 1.x of PclZip, the separator for file list is a space +// (which is not a very smart choice, specifically for windows paths !). +// A better separator should be a comma (,). This constant gives you the +// abilty to change that. +// However notice that changing this value, may have impact on existing +// scripts, using space separated filenames. +// Recommanded values for compatibility with older versions : +//define( 'PCLZIP_SEPARATOR', ' ' ); +// Recommanded values for smart separation of filenames. +if (!defined('PCLZIP_SEPARATOR')) { + define('PCLZIP_SEPARATOR', ','); +} + +// ----- Error configuration +// 0 : PclZip Class integrated error handling +// 1 : PclError external library error handling. By enabling this +// you must ensure that you have included PclError library. +// [2,...] : reserved for futur use +if (!defined('PCLZIP_ERROR_EXTERNAL')) { + define('PCLZIP_ERROR_EXTERNAL', 0); +} + +// ----- Optional static temporary directory +// By default temporary files are generated in the script current +// path. +// If defined : +// - MUST BE terminated by a '/'. +// - MUST be a valid, already created directory +// Samples : +// define( 'PCLZIP_TEMPORARY_DIR', '/temp/' ); +// define( 'PCLZIP_TEMPORARY_DIR', 'C:/Temp/' ); +if (!defined('PCLZIP_TEMPORARY_DIR')) { + define('PCLZIP_TEMPORARY_DIR', ''); +} + +// ----- Optional threshold ratio for use of temporary files +// Pclzip sense the size of the file to add/extract and decide to +// use or not temporary file. The algorythm is looking for +// memory_limit of PHP and apply a ratio. +// threshold = memory_limit * ratio. +// Recommended values are under 0.5. Default 0.47. +// Samples : +// define( 'PCLZIP_TEMPORARY_FILE_RATIO', 0.5 ); +if (!defined('PCLZIP_TEMPORARY_FILE_RATIO')) { + define('PCLZIP_TEMPORARY_FILE_RATIO', 0.47); +} // -------------------------------------------------------------------------------- // ***** UNDER THIS LINE NOTHING NEEDS TO BE MODIFIED ***** // -------------------------------------------------------------------------------- - // ----- Global variables - $g_pclzip_version = "2.8.2"; - - // ----- Error codes - // -1 : Unable to open file in binary write mode - // -2 : Unable to open file in binary read mode - // -3 : Invalid parameters - // -4 : File does not exist - // -5 : Filename is too long (max. 255) - // -6 : Not a valid zip file - // -7 : Invalid extracted file size - // -8 : Unable to create directory - // -9 : Invalid archive extension - // -10 : Invalid archive format - // -11 : Unable to delete file (unlink) - // -12 : Unable to rename file (rename) - // -13 : Invalid header checksum - // -14 : Invalid archive size - define( 'PCLZIP_ERR_USER_ABORTED', 2 ); - define( 'PCLZIP_ERR_NO_ERROR', 0 ); - define( 'PCLZIP_ERR_WRITE_OPEN_FAIL', -1 ); - define( 'PCLZIP_ERR_READ_OPEN_FAIL', -2 ); - define( 'PCLZIP_ERR_INVALID_PARAMETER', -3 ); - define( 'PCLZIP_ERR_MISSING_FILE', -4 ); - define( 'PCLZIP_ERR_FILENAME_TOO_LONG', -5 ); - define( 'PCLZIP_ERR_INVALID_ZIP', -6 ); - define( 'PCLZIP_ERR_BAD_EXTRACTED_FILE', -7 ); - define( 'PCLZIP_ERR_DIR_CREATE_FAIL', -8 ); - define( 'PCLZIP_ERR_BAD_EXTENSION', -9 ); - define( 'PCLZIP_ERR_BAD_FORMAT', -10 ); - define( 'PCLZIP_ERR_DELETE_FILE_FAIL', -11 ); - define( 'PCLZIP_ERR_RENAME_FILE_FAIL', -12 ); - define( 'PCLZIP_ERR_BAD_CHECKSUM', -13 ); - define( 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14 ); - define( 'PCLZIP_ERR_MISSING_OPTION_VALUE', -15 ); - define( 'PCLZIP_ERR_INVALID_OPTION_VALUE', -16 ); - define( 'PCLZIP_ERR_ALREADY_A_DIRECTORY', -17 ); - define( 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18 ); - define( 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19 ); - define( 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20 ); - define( 'PCLZIP_ERR_DIRECTORY_RESTRICTION', -21 ); - - // ----- Options values - define( 'PCLZIP_OPT_PATH', 77001 ); - define( 'PCLZIP_OPT_ADD_PATH', 77002 ); - define( 'PCLZIP_OPT_REMOVE_PATH', 77003 ); - define( 'PCLZIP_OPT_REMOVE_ALL_PATH', 77004 ); - define( 'PCLZIP_OPT_SET_CHMOD', 77005 ); - define( 'PCLZIP_OPT_EXTRACT_AS_STRING', 77006 ); - define( 'PCLZIP_OPT_NO_COMPRESSION', 77007 ); - define( 'PCLZIP_OPT_BY_NAME', 77008 ); - define( 'PCLZIP_OPT_BY_INDEX', 77009 ); - define( 'PCLZIP_OPT_BY_EREG', 77010 ); - define( 'PCLZIP_OPT_BY_PREG', 77011 ); - define( 'PCLZIP_OPT_COMMENT', 77012 ); - define( 'PCLZIP_OPT_ADD_COMMENT', 77013 ); - define( 'PCLZIP_OPT_PREPEND_COMMENT', 77014 ); - define( 'PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015 ); - define( 'PCLZIP_OPT_REPLACE_NEWER', 77016 ); - define( 'PCLZIP_OPT_STOP_ON_ERROR', 77017 ); - // Having big trouble with crypt. Need to multiply 2 long int - // which is not correctly supported by PHP ... - //define( 'PCLZIP_OPT_CRYPT', 77018 ); - define( 'PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019 ); - define( 'PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020 ); - define( 'PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020 ); // alias - define( 'PCLZIP_OPT_TEMP_FILE_ON', 77021 ); - define( 'PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021 ); // alias - define( 'PCLZIP_OPT_TEMP_FILE_OFF', 77022 ); - define( 'PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022 ); // alias - - // ----- File description attributes - define( 'PCLZIP_ATT_FILE_NAME', 79001 ); - define( 'PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002 ); - define( 'PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003 ); - define( 'PCLZIP_ATT_FILE_MTIME', 79004 ); - define( 'PCLZIP_ATT_FILE_CONTENT', 79005 ); - define( 'PCLZIP_ATT_FILE_COMMENT', 79006 ); - - // ----- Call backs values - define( 'PCLZIP_CB_PRE_EXTRACT', 78001 ); - define( 'PCLZIP_CB_POST_EXTRACT', 78002 ); - define( 'PCLZIP_CB_PRE_ADD', 78003 ); - define( 'PCLZIP_CB_POST_ADD', 78004 ); - /* For futur use +// ----- Global variables +$g_pclzip_version = "2.8.2"; + +// ----- Error codes +// -1 : Unable to open file in binary write mode +// -2 : Unable to open file in binary read mode +// -3 : Invalid parameters +// -4 : File does not exist +// -5 : Filename is too long (max. 255) +// -6 : Not a valid zip file +// -7 : Invalid extracted file size +// -8 : Unable to create directory +// -9 : Invalid archive extension +// -10 : Invalid archive format +// -11 : Unable to delete file (unlink) +// -12 : Unable to rename file (rename) +// -13 : Invalid header checksum +// -14 : Invalid archive size +define('PCLZIP_ERR_USER_ABORTED', 2); +define('PCLZIP_ERR_NO_ERROR', 0); +define('PCLZIP_ERR_WRITE_OPEN_FAIL', -1); +define('PCLZIP_ERR_READ_OPEN_FAIL', -2); +define('PCLZIP_ERR_INVALID_PARAMETER', -3); +define('PCLZIP_ERR_MISSING_FILE', -4); +define('PCLZIP_ERR_FILENAME_TOO_LONG', -5); +define('PCLZIP_ERR_INVALID_ZIP', -6); +define('PCLZIP_ERR_BAD_EXTRACTED_FILE', -7); +define('PCLZIP_ERR_DIR_CREATE_FAIL', -8); +define('PCLZIP_ERR_BAD_EXTENSION', -9); +define('PCLZIP_ERR_BAD_FORMAT', -10); +define('PCLZIP_ERR_DELETE_FILE_FAIL', -11); +define('PCLZIP_ERR_RENAME_FILE_FAIL', -12); +define('PCLZIP_ERR_BAD_CHECKSUM', -13); +define('PCLZIP_ERR_INVALID_ARCHIVE_ZIP', -14); +define('PCLZIP_ERR_MISSING_OPTION_VALUE', -15); +define('PCLZIP_ERR_INVALID_OPTION_VALUE', -16); +define('PCLZIP_ERR_ALREADY_A_DIRECTORY', -17); +define('PCLZIP_ERR_UNSUPPORTED_COMPRESSION', -18); +define('PCLZIP_ERR_UNSUPPORTED_ENCRYPTION', -19); +define('PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE', -20); +define('PCLZIP_ERR_DIRECTORY_RESTRICTION', -21); + +// ----- Options values +define('PCLZIP_OPT_PATH', 77001); +define('PCLZIP_OPT_ADD_PATH', 77002); +define('PCLZIP_OPT_REMOVE_PATH', 77003); +define('PCLZIP_OPT_REMOVE_ALL_PATH', 77004); +define('PCLZIP_OPT_SET_CHMOD', 77005); +define('PCLZIP_OPT_EXTRACT_AS_STRING', 77006); +define('PCLZIP_OPT_NO_COMPRESSION', 77007); +define('PCLZIP_OPT_BY_NAME', 77008); +define('PCLZIP_OPT_BY_INDEX', 77009); +define('PCLZIP_OPT_BY_EREG', 77010); +define('PCLZIP_OPT_BY_PREG', 77011); +define('PCLZIP_OPT_COMMENT', 77012); +define('PCLZIP_OPT_ADD_COMMENT', 77013); +define('PCLZIP_OPT_PREPEND_COMMENT', 77014); +define('PCLZIP_OPT_EXTRACT_IN_OUTPUT', 77015); +define('PCLZIP_OPT_REPLACE_NEWER', 77016); +define('PCLZIP_OPT_STOP_ON_ERROR', 77017); +// Having big trouble with crypt. Need to multiply 2 long int +// which is not correctly supported by PHP ... +//define( 'PCLZIP_OPT_CRYPT', 77018 ); +define('PCLZIP_OPT_EXTRACT_DIR_RESTRICTION', 77019); +define('PCLZIP_OPT_TEMP_FILE_THRESHOLD', 77020); +define('PCLZIP_OPT_ADD_TEMP_FILE_THRESHOLD', 77020); // alias +define('PCLZIP_OPT_TEMP_FILE_ON', 77021); +define('PCLZIP_OPT_ADD_TEMP_FILE_ON', 77021); // alias +define('PCLZIP_OPT_TEMP_FILE_OFF', 77022); +define('PCLZIP_OPT_ADD_TEMP_FILE_OFF', 77022); // alias + +// ----- File description attributes +define('PCLZIP_ATT_FILE_NAME', 79001); +define('PCLZIP_ATT_FILE_NEW_SHORT_NAME', 79002); +define('PCLZIP_ATT_FILE_NEW_FULL_NAME', 79003); +define('PCLZIP_ATT_FILE_MTIME', 79004); +define('PCLZIP_ATT_FILE_CONTENT', 79005); +define('PCLZIP_ATT_FILE_COMMENT', 79006); + +// ----- Call backs values +define('PCLZIP_CB_PRE_EXTRACT', 78001); +define('PCLZIP_CB_POST_EXTRACT', 78002); +define('PCLZIP_CB_PRE_ADD', 78003); +define('PCLZIP_CB_POST_ADD', 78004); +/* For futur use define( 'PCLZIP_CB_PRE_LIST', 78005 ); define( 'PCLZIP_CB_POST_LIST', 78006 ); define( 'PCLZIP_CB_PRE_DELETE', 78007 ); define( 'PCLZIP_CB_POST_DELETE', 78008 ); */ - // -------------------------------------------------------------------------------- - // Class : PclZip - // Description : - // PclZip is the class that represent a Zip archive. - // The public methods allow the manipulation of the archive. - // Attributes : - // Attributes must not be accessed directly. - // Methods : - // PclZip() : Object creator - // create() : Creates the Zip archive - // listContent() : List the content of the Zip archive - // extract() : Extract the content of the archive - // properties() : List the properties of the archive - // -------------------------------------------------------------------------------- - class PclZip - { - // ----- Filename of the zip file - var $zipname = ''; - - // ----- File descriptor of the zip file - var $zip_fd = 0; - - // ----- Internal error handling - var $error_code = 1; - var $error_string = ''; - - // ----- Current status of the magic_quotes_runtime - // This value store the php configuration for magic_quotes - // The class can then disable the magic_quotes and reset it after - var $magic_quotes_status; - - // -------------------------------------------------------------------------------- - // Function : PclZip() - // Description : - // Creates a PclZip object and set the name of the associated Zip archive - // filename. - // Note that no real action is taken, if the archive does not exist it is not - // created. Use create() for that. - // -------------------------------------------------------------------------------- - function PclZip($p_zipname) - { - - // ----- Tests the zlib - if (!function_exists('gzopen')) - { - die('Abort '.basename(__FILE__).' : Missing zlib extensions'); - } - - // ----- Set the attributes - $this->zipname = $p_zipname; - $this->zip_fd = 0; - $this->magic_quotes_status = -1; - - // ----- Return - return; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // create($p_filelist, $p_add_dir="", $p_remove_dir="") - // create($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two different synopsis. The first one is historical. - // This method creates a Zip Archive. The Zip file is created in the - // filesystem. The files and directories indicated in $p_filelist - // are added in the archive. See the parameters description for the - // supported format of $p_filelist. - // When a directory is in the list, the directory and its content is added - // in the archive. - // In this synopsis, the function takes an optional variable list of - // options. See bellow the supported options. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function create($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove from the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } +// -------------------------------------------------------------------------------- +// Class : PclZip +// Description : +// PclZip is the class that represent a Zip archive. +// The public methods allow the manipulation of the archive. +// Attributes : +// Attributes must not be accessed directly. +// Methods : +// PclZip() : Object creator +// create() : Creates the Zip archive +// listContent() : List the content of the Zip archive +// extract() : Extract the content of the archive +// properties() : List the properties of the archive +// -------------------------------------------------------------------------------- +class PclZip { + // ----- Filename of the zip file + var $zipname = ''; + + // ----- File descriptor of the zip file + var $zip_fd = 0; + + // ----- Internal error handling + var $error_code = 1; + var $error_string = ''; + + // ----- Current status of the magic_quotes_runtime + // This value store the php configuration for magic_quotes + // The class can then disable the magic_quotes and reset it after + var $magic_quotes_status; + + // -------------------------------------------------------------------------------- + // Function : PclZip() + // Description : + // Creates a PclZip object and set the name of the associated Zip archive + // filename. + // Note that no real action is taken, if the archive does not exist it is not + // created. Use create() for that. + // -------------------------------------------------------------------------------- + function PclZip($p_zipname) { + + // ----- Tests the zlib + if (!function_exists('gzopen')) { + die('Abort ' . basename(__FILE__) . ' : Missing zlib extensions'); + } + + // ----- Set the attributes + $this->zipname = $p_zipname; + $this->zip_fd = 0; + $this->magic_quotes_status = -1; + + // ----- Return + return; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // create($p_filelist, $p_add_dir="", $p_remove_dir="") + // create($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two different synopsis. The first one is historical. + // This method creates a Zip Archive. The Zip file is created in the + // filesystem. The files and directories indicated in $p_filelist + // are added in the archive. See the parameters description for the + // supported format of $p_filelist. + // When a directory is in the list, the directory and its content is added + // in the archive. + // In this synopsis, the function takes an optional variable list of + // options. See bellow the supported options. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function create($p_filelist) { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove from the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array( + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } else { + if ($v_size > 2) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid number / type of arguments"); + + return 0; + } + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); + + return 0; + } + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + if ($v_string != '') { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } else { + } + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array( + PCLZIP_ATT_FILE_NAME => 'mandatory' + , + PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + , + PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + , + PCLZIP_ATT_FILE_MTIME => 'optional' + , + PCLZIP_ATT_FILE_CONTENT => 'optional' + , + PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // add($p_filelist, $p_add_dir="", $p_remove_dir="") + // add($p_filelist, $p_option, $p_option_value, ...) + // Description : + // This method supports two synopsis. The first one is historical. + // This methods add the list of files in an existing archive. + // If a file with the same name already exists, it is added at the end of the + // archive, the first one is still present. + // If the archive does not exist, it is created. + // Parameters : + // $p_filelist : An array containing file or directory names, or + // a string containing one filename or one directory name, or + // a string containing a list of filenames and/or directory + // names separated by spaces. + // $p_add_dir : A path to add before the real path of the archived file, + // in order to have it memorized in the archive. + // $p_remove_dir : A path to remove from the real path of the file to archive, + // in order to have a shorter path memorized in the archive. + // When $p_add_dir and $p_remove_dir are set, $p_remove_dir + // is removed first, before $p_add_dir is added. + // Options : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_COMMENT : + // PCLZIP_OPT_ADD_COMMENT : + // PCLZIP_OPT_PREPEND_COMMENT : + // PCLZIP_CB_PRE_ADD : + // PCLZIP_CB_POST_ADD : + // Return Values : + // 0 on failure, + // The list of the added files, with a status of the add action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function add($p_filelist) { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Set default values + $v_options = array(); + $v_options[PCLZIP_OPT_NO_COMPRESSION] = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array( + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_ADD => 'optional', + PCLZIP_CB_POST_ADD => 'optional', + PCLZIP_OPT_NO_COMPRESSION => 'optional', + PCLZIP_OPT_COMMENT => 'optional', + PCLZIP_OPT_ADD_COMMENT => 'optional', + PCLZIP_OPT_PREPEND_COMMENT => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + //, PCLZIP_OPT_CRYPT => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; + } else { + if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Init + $v_string_list = array(); + $v_att_list = array(); + $v_filedescr_list = array(); + $p_result_list = array(); + + // ----- Look if the $p_filelist is really an array + if (is_array($p_filelist)) { + + // ----- Look if the first element is also an array + // This will mean that this is a file description entry + if (isset($p_filelist[0]) && is_array($p_filelist[0])) { + $v_att_list = $p_filelist; + } // ----- The list is a list of string names + else { + $v_string_list = $p_filelist; + } + } // ----- Look if the $p_filelist is a string + else { + if (is_string($p_filelist)) { + // ----- Create a list from the string + $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); + } // ----- Invalid variable type for $p_filelist + else { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid variable type '" . gettype($p_filelist) . "' for p_filelist"); + + return 0; + } + } + + // ----- Reformat the string list + if (sizeof($v_string_list) != 0) { + foreach ($v_string_list as $v_string) { + $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; + } + } + + // ----- For each file in the list check the attributes + $v_supported_attributes + = array( + PCLZIP_ATT_FILE_NAME => 'mandatory' + , + PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' + , + PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' + , + PCLZIP_ATT_FILE_MTIME => 'optional' + , + PCLZIP_ATT_FILE_CONTENT => 'optional' + , + PCLZIP_ATT_FILE_COMMENT => 'optional' + ); + foreach ($v_att_list as $v_entry) { + $v_result = $this->privFileDescrParseAtt($v_entry, + $v_filedescr_list[], + $v_options, + $v_supported_attributes); + if ($v_result != 1) { + return 0; + } + } + + // ----- Expand the filelist (expand directories) + $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Call the create fct + $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); + if ($v_result != 1) { + return 0; + } + + // ----- Return + return $p_result_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : listContent() + // Description : + // This public method, gives the list of the files and directories, with their + // properties. + // The properties of each entries in the list are (used also in other functions) : + // filename : Name of the file. For a create or add action it is the filename + // given by the user. For an extract function it is the filename + // of the extracted file. + // stored_filename : Name of the file / directory stored in the archive. + // size : Size of the stored file. + // compressed_size : Size of the file's data compressed in the archive + // (without the headers overhead) + // mtime : Last known modification date of the file (UNIX timestamp) + // comment : Comment associated with the file + // folder : true | false + // index : index of the file in the archive + // status : status of the action (depending of the action) : + // Values are : + // ok : OK ! + // filtered : the file / dir is not extracted (filtered by user) + // already_a_directory : the file can not be extracted because a + // directory with the same name already exists + // write_protected : the file can not be extracted because a file + // with the same name already exists and is + // write protected + // newer_exist : the file was not extracted because a newer file exists + // path_creation_fail : the file is not extracted because the folder + // does not exist and can not be created + // write_error : the file was not extracted because there was a + // error while writing the file + // read_error : the file was not extracted because there was a error + // while reading the file + // invalid_header : the file was not extracted because of an archive + // format error (bad file header) + // Note that each time a method can continue operating when there + // is an action error on a file, the error is only logged in the file status. + // Return Values : + // 0 on an unrecoverable failure, + // The list of the files in the archive. + // -------------------------------------------------------------------------------- + function listContent() { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return (0); + } + + // ----- Call the extracting fct + $p_list = array(); + if (($v_result = $this->privList($p_list)) != 1) { + unset($p_list); + + return (0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // extract($p_path="./", $p_remove_path="") + // extract([$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method extract all the files / directories from the archive to the + // folder indicated in $p_path. + // If you want to ignore the 'root' part of path of the memorized files + // you can indicate this in the optional $p_remove_path parameter. + // By default, if a newer file with the same name already exists, the + // file is not extracted. + // + // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions + // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append + // at the end of the path value of PCLZIP_OPT_PATH. + // Parameters : + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 or a negative value on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function extract() { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return (0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array( + PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + , + PCLZIP_OPT_STOP_ON_ERROR => 'optional' + , + PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } else { + if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + } + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Trace + + // ----- Call the extracting fct + $p_list = array(); + $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, + $v_remove_all_path, $v_options); + if ($v_result < 1) { + unset($p_list); + + return (0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : + // extractByIndex($p_index, $p_path="./", $p_remove_path="") + // extractByIndex($p_index, [$p_option, $p_option_value, ...]) + // Description : + // This method supports two synopsis. The first one is historical. + // This method is doing a partial extract of the archive. + // The extracted files or folders are identified by their index in the + // archive (from 0 to n). + // Note that if the index identify a folder, only the folder entry is + // extracted, not all the files included in the archive. + // Parameters : + // $p_index : A single index (integer) or a string of indexes of files to + // extract. The form of the string is "0,4-6,8-12" with only numbers + // and '-' for range or ',' to separate ranges. No spaces or ';' + // are allowed. + // $p_path : Path where the files and directories are to be extracted + // $p_remove_path : First part ('root' part) of the memorized path + // (if any similar) to remove while extracting. + // Options : + // PCLZIP_OPT_PATH : + // PCLZIP_OPT_ADD_PATH : + // PCLZIP_OPT_REMOVE_PATH : + // PCLZIP_OPT_REMOVE_ALL_PATH : + // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and + // not as files. + // The resulting content is in a new field 'content' in the file + // structure. + // This option must be used alone (any other options are ignored). + // PCLZIP_CB_PRE_EXTRACT : + // PCLZIP_CB_POST_EXTRACT : + // Return Values : + // 0 on failure, + // The list of the extracted files, with a status of the action. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + //function extractByIndex($p_index, options...) + function extractByIndex($p_index) { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return (0); + } + + // ----- Set default values + $v_options = array(); +// $v_path = "./"; + $v_path = ''; + $v_remove_path = ""; + $v_remove_all_path = false; + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Default values for option + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; + + // ----- Look for arguments + if ($v_size > 1) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Remove form the options list the first argument + array_shift($v_arg_list); + $v_size--; + + // ----- Look for first arg + if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array( + PCLZIP_OPT_PATH => 'optional', + PCLZIP_OPT_REMOVE_PATH => 'optional', + PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', + PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', + PCLZIP_OPT_ADD_PATH => 'optional', + PCLZIP_CB_PRE_EXTRACT => 'optional', + PCLZIP_CB_POST_EXTRACT => 'optional', + PCLZIP_OPT_SET_CHMOD => 'optional', + PCLZIP_OPT_REPLACE_NEWER => 'optional' + , + PCLZIP_OPT_STOP_ON_ERROR => 'optional' + , + PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', + PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', + PCLZIP_OPT_TEMP_FILE_ON => 'optional', + PCLZIP_OPT_TEMP_FILE_OFF => 'optional' + )); + if ($v_result != 1) { + return 0; + } + + // ----- Set the arguments + if (isset($v_options[PCLZIP_OPT_PATH])) { + $v_path = $v_options[PCLZIP_OPT_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { + $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; + } + if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } + if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { + // ----- Check for '/' in last path char + if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { + $v_path .= '/'; + } + $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; + } + if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { + $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = false; + } else { + } + } + + // ----- Look for 2 args + // Here we need to support the first historic synopsis of the + // method. + else { + + // ----- Get the first argument + $v_path = $v_arg_list[0]; + + // ----- Look for the optional second argument + if ($v_size == 2) { + $v_remove_path = $v_arg_list[1]; + } else { + if ($v_size > 2) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); + + // ----- Return + return 0; + } + } + } + } + + // ----- Trace + + // ----- Trick + // Here I want to reuse extractByRule(), so I need to parse the $p_index + // with privParseOptions() + $v_arg_trick = array(PCLZIP_OPT_BY_INDEX, $p_index); + $v_options_trick = array(); + $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, + array(PCLZIP_OPT_BY_INDEX => 'optional')); + if ($v_result != 1) { + return 0; + } + $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; + + // ----- Look for default option values + $this->privOptionDefaultThreshold($v_options); + + // ----- Call the extracting fct + if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { + return (0); + } + + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : + // delete([$p_option, $p_option_value, ...]) + // Description : + // This method removes files from the archive. + // If no parameters are given, then all the archive is emptied. + // Parameters : + // None or optional arguments. + // Options : + // PCLZIP_OPT_BY_INDEX : + // PCLZIP_OPT_BY_NAME : + // PCLZIP_OPT_BY_EREG : + // PCLZIP_OPT_BY_PREG : + // Return Values : + // 0 on failure, + // The list of the files which are still present in the archive. + // (see PclZip::listContent() for list entry format) + // -------------------------------------------------------------------------------- + function delete() { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return (0); + } + + // ----- Set default values + $v_options = array(); + + // ----- Look for variable options arguments + $v_size = func_num_args(); + + // ----- Look for arguments + if ($v_size > 0) { + // ----- Get the arguments + $v_arg_list = func_get_args(); + + // ----- Parse the options + $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, + array( + PCLZIP_OPT_BY_NAME => 'optional', + PCLZIP_OPT_BY_EREG => 'optional', + PCLZIP_OPT_BY_PREG => 'optional', + PCLZIP_OPT_BY_INDEX => 'optional' + )); + if ($v_result != 1) { + return 0; + } + } + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Call the delete fct + $v_list = array(); + if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { + $this->privSwapBackMagicQuotes(); + unset($v_list); + + return (0); + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_list; + } + // -------------------------------------------------------------------------------- - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Invalid number / type of arguments"); - return 0; - } - } - } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } + // -------------------------------------------------------------------------------- + // Function : deleteByIndex() + // Description : + // ***** Deprecated ***** + // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. + // -------------------------------------------------------------------------------- + function deleteByIndex($p_index) { - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } + $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - if ($v_string != '') { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - else { - } - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } + // ----- Return + return $p_list; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : properties() + // Description : + // This method gives the properties of the archive. + // The properties are : + // nb : Number of files in the archive + // comment : Comment associated with the archive file + // status : not_exist, ok + // Parameters : + // None + // Return Values : + // 0 on failure, + // An array with the archive properties. + // -------------------------------------------------------------------------------- + function properties() { + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + $this->privSwapBackMagicQuotes(); + + return (0); + } + + // ----- Default properties + $v_prop = array(); + $v_prop['comment'] = ''; + $v_prop['nb'] = 0; + $v_prop['status'] = 'not_exist'; + + // ----- Look if file exists + if (@is_file($this->zipname)) { + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open archive \'' . $this->zipname . '\' in binary read mode'); + + // ----- Return + return 0; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privSwapBackMagicQuotes(); + + return 0; + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Set the user attributes + $v_prop['comment'] = $v_central_dir['comment']; + $v_prop['nb'] = $v_central_dir['entries']; + $v_prop['status'] = 'ok'; + } + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_prop; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : duplicate() + // Description : + // This method creates an archive by copying the content of an other one. If + // the archive already exist, it is replaced by the new one without any warning. + // Parameters : + // $p_archive : The filename of a valid archive, or + // a valid PclZip object. + // Return Values : + // 1 on success. + // 0 or a negative value on error (error code). + // -------------------------------------------------------------------------------- + function duplicate($p_archive) { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the $p_archive is a PclZip object + if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) { + + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive->zipname); + } // ----- Look if the $p_archive is a string (so a filename) + else { + if (is_string($p_archive)) { + + // ----- Check that $p_archive is a valid zip file + // TBC : Should also check the archive format + if (!is_file($p_archive)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '" . $p_archive . "'"); + $v_result = PCLZIP_ERR_MISSING_FILE; + } else { + // ----- Duplicate the archive + $v_result = $this->privDuplicate($p_archive); + } + } // ----- Invalid variable + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : merge() + // Description : + // This method merge the $p_archive_to_add archive at the end of the current + // one ($this). + // If the archive ($this) does not exist, the merge becomes a duplicate. + // If the $p_archive_to_add archive does not exist, the merge is a success. + // Parameters : + // $p_archive_to_add : It can be directly the filename of a valid zip archive, + // or a PclZip object archive. + // Return Values : + // 1 on success, + // 0 or negative values on error (see below). + // -------------------------------------------------------------------------------- + function merge($p_archive_to_add) { + $v_result = 1; + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Check archive + if (!$this->privCheckFormat()) { + return (0); + } + + // ----- Look if the $p_archive_to_add is a PclZip object + if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) { + + // ----- Merge the archive + $v_result = $this->privMerge($p_archive_to_add); + } // ----- Look if the $p_archive_to_add is a string (so a filename) + else { + if (is_string($p_archive_to_add)) { + + // ----- Create a temporary archive + $v_object_archive = new PclZip($p_archive_to_add); + + // ----- Merge the archive + $v_result = $this->privMerge($v_object_archive); + } // ----- Invalid variable + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); + $v_result = PCLZIP_ERR_INVALID_PARAMETER; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + + // -------------------------------------------------------------------------------- + // Function : errorCode() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorCode() { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return (PclErrorCode()); + } else { + return ($this->error_code); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorName() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorName($p_with_code = false) { + $v_name = array( + PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', + PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', + PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', + PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', + PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', + PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', + PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', + PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', + PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', + PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', + PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', + PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', + PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', + PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', + PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', + PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', + PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', + PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', + PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' + , + PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' + , + PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' + ); + + if (isset($v_name[$this->error_code])) { + $v_value = $v_name[$this->error_code]; + } else { + $v_value = 'NoName'; + } + + if ($p_with_code) { + return ($v_value . ' (' . $this->error_code . ')'); + } else { + return ($v_value); + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : errorInfo() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function errorInfo($p_full = false) { + if (PCLZIP_ERROR_EXTERNAL == 1) { + return (PclErrorString()); + } else { + if ($p_full) { + return ($this->errorName(true) . " : " . $this->error_string); + } else { + return ($this->error_string . " [code " . $this->error_code . "]"); + } + } + } + // -------------------------------------------------------------------------------- - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } - // ----- Call the create fct - $v_result = $this->privCreate($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } +// -------------------------------------------------------------------------------- +// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** +// ***** ***** +// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** +// -------------------------------------------------------------------------------- - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // add($p_filelist, $p_add_dir="", $p_remove_dir="") - // add($p_filelist, $p_option, $p_option_value, ...) - // Description : - // This method supports two synopsis. The first one is historical. - // This methods add the list of files in an existing archive. - // If a file with the same name already exists, it is added at the end of the - // archive, the first one is still present. - // If the archive does not exist, it is created. - // Parameters : - // $p_filelist : An array containing file or directory names, or - // a string containing one filename or one directory name, or - // a string containing a list of filenames and/or directory - // names separated by spaces. - // $p_add_dir : A path to add before the real path of the archived file, - // in order to have it memorized in the archive. - // $p_remove_dir : A path to remove from the real path of the file to archive, - // in order to have a shorter path memorized in the archive. - // When $p_add_dir and $p_remove_dir are set, $p_remove_dir - // is removed first, before $p_add_dir is added. - // Options : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_COMMENT : - // PCLZIP_OPT_ADD_COMMENT : - // PCLZIP_OPT_PREPEND_COMMENT : - // PCLZIP_CB_PRE_ADD : - // PCLZIP_CB_POST_ADD : - // Return Values : - // 0 on failure, - // The list of the added files, with a status of the add action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function add($p_filelist) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Set default values - $v_options = array(); - $v_options[PCLZIP_OPT_NO_COMPRESSION] = FALSE; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_ADD => 'optional', - PCLZIP_CB_POST_ADD => 'optional', - PCLZIP_OPT_NO_COMPRESSION => 'optional', - PCLZIP_OPT_COMMENT => 'optional', - PCLZIP_OPT_ADD_COMMENT => 'optional', - PCLZIP_OPT_PREPEND_COMMENT => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - //, PCLZIP_OPT_CRYPT => 'optional' - )); - if ($v_result != 1) { - return 0; - } - } - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_options[PCLZIP_OPT_ADD_PATH] = $v_add_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_options[PCLZIP_OPT_REMOVE_PATH] = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } - } + // -------------------------------------------------------------------------------- + // Function : privCheckFormat() + // Description : + // This method check that the archive exists and is a valid zip archive. + // Several level of check exists. (futur) + // Parameters : + // $p_level : Level of check. Default 0. + // 0 : Check the first bytes (magic codes) (default value)) + // 1 : 0 + Check the central directory (futur) + // 2 : 1 + Check each file header (futur) + // Return Values : + // true on success, + // false on error, the error code is set. + // -------------------------------------------------------------------------------- + function privCheckFormat($p_level = 0) { + $v_result = true; + + // ----- Reset the file system cache + clearstatcache(); + + // ----- Reset the error handler + $this->privErrorReset(); + + // ----- Look if the file exits + if (!is_file($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '" . $this->zipname . "'"); + + return (false); + } + + // ----- Check that the file is readeable + if (!is_readable($this->zipname)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '" . $this->zipname . "'"); + + return (false); + } + + // ----- Check the magic code + // TBC + + // ----- Check the central header + // TBC + + // ----- Check each file header + // TBC + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privParseOptions() + // Description : + // This internal methods reads the variable list of arguments ($p_options_list, + // $p_size) and generate an array with the options and values ($v_result_list). + // $v_requested_options contains the options that can be present and those that + // must be present. + // $v_requested_options is an array, with the option value as key, and 'optional', + // or 'mandatory' as value. + // Parameters : + // See above. + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false) { + $v_result = 1; + + // ----- Read the options + $i = 0; + while ($i < $p_size) { + + // ----- Check if the option is supported + if (!isset($v_requested_options[$p_options_list[$i]])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Invalid optional parameter '" . $p_options_list[$i] . "' for this method"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for next option + switch ($p_options_list[$i]) { + // ----- Look for options that request a path value + case PCLZIP_OPT_PATH : + case PCLZIP_OPT_REMOVE_PATH : + case PCLZIP_OPT_ADD_PATH : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false); + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_THRESHOLD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + return PclZip::errorCode(); + } + + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + + return PclZip::errorCode(); + } + + // ----- Check the value + $v_value = $p_options_list[$i+1]; + if ((!is_integer($v_value)) || ($v_value < 0)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Integer expected for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + return PclZip::errorCode(); + } + + // ----- Get the value (and convert it in bytes) + $v_result_list[$p_options_list[$i]] = $v_value*1048576; + $i++; + break; + + case PCLZIP_OPT_TEMP_FILE_ON : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); + + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_TEMP_FILE_OFF : + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); + + return PclZip::errorCode(); + } + // ----- Check for incompatible options + if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Option '" . PclZipUtilOptionText($p_options_list[$i]) . "' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); + + return PclZip::errorCode(); + } + + $v_result_list[$p_options_list[$i]] = true; + break; + + case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1]) + && ($p_options_list[$i+1] != '') + ) { + $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], false); + $i++; + } else { + } + break; + + // ----- Look for options that request an array of string for value + case PCLZIP_OPT_BY_NAME : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; + } else { + if (is_array($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + } + $i++; + break; + + // ----- Look for options that request an EREG or PREG expression + case PCLZIP_OPT_BY_EREG : + // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG + // to PCLZIP_OPT_BY_PREG + $p_options_list[$i] = PCLZIP_OPT_BY_PREG; + case PCLZIP_OPT_BY_PREG : + //case PCLZIP_OPT_CRYPT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that takes a string + case PCLZIP_OPT_COMMENT : + case PCLZIP_OPT_ADD_COMMENT : + case PCLZIP_OPT_PREPEND_COMMENT : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" + . PclZipUtilOptionText($p_options_list[$i]) + . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + if (is_string($p_options_list[$i+1])) { + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Wrong parameter value for option '" + . PclZipUtilOptionText($p_options_list[$i]) + . "'"); + + // ----- Return + return PclZip::errorCode(); + } + $i++; + break; + + // ----- Look for options that request an array of index + case PCLZIP_OPT_BY_INDEX : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_work_list = array(); + if (is_string($p_options_list[$i+1])) { + + // ----- Remove spaces + $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + + // ----- Parse items + $v_work_list = explode(",", $p_options_list[$i+1]); + } else { + if (is_integer($p_options_list[$i+1])) { + $v_work_list[0] = $p_options_list[$i+1] . '-' . $p_options_list[$i+1]; + } else { + if (is_array($p_options_list[$i+1])) { + $v_work_list = $p_options_list[$i+1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Value must be integer, string or array for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + + // ----- Reduce the index list + // each index item in the list must be a couple with a start and + // an end value : [0,3], [5-5], [8-10], ... + // ----- Check the format of each item + $v_sort_flag = false; + $v_sort_value = 0; + for ($j = 0; $j < sizeof($v_work_list); $j++) { + // ----- Explode the item + $v_item_list = explode("-", $v_work_list[$j]); + $v_size_item_list = sizeof($v_item_list); + + // ----- TBC : Here we might check that each item is a + // real integer ... + + // ----- Look for single value + if ($v_size_item_list == 1) { + // ----- Set the option value + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0]; + } elseif ($v_size_item_list == 2) { + // ----- Set the option value + $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; + $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1]; + } else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Too many values in index range for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + + // ----- Look for list sort + if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) { + $v_sort_flag = true; + + // ----- TBC : An automatic sort should be writen ... + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Invalid order of index range for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start']; + } + + // ----- Sort the items + if ($v_sort_flag) { + // TBC : To Be Completed + } + + // ----- Next option + $i++; + break; + + // ----- Look for options that request no value + case PCLZIP_OPT_REMOVE_ALL_PATH : + case PCLZIP_OPT_EXTRACT_AS_STRING : + case PCLZIP_OPT_NO_COMPRESSION : + case PCLZIP_OPT_EXTRACT_IN_OUTPUT : + case PCLZIP_OPT_REPLACE_NEWER : + case PCLZIP_OPT_STOP_ON_ERROR : + $v_result_list[$p_options_list[$i]] = true; + break; + + // ----- Look for options that request an octal value + case PCLZIP_OPT_SET_CHMOD : + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; + $i++; + break; + + // ----- Look for options that request a call-back + case PCLZIP_CB_PRE_EXTRACT : + case PCLZIP_CB_POST_EXTRACT : + case PCLZIP_CB_PRE_ADD : + case PCLZIP_CB_POST_ADD : + /* for futur use + case PCLZIP_CB_PRE_DELETE : + case PCLZIP_CB_POST_DELETE : + case PCLZIP_CB_PRE_LIST : + case PCLZIP_CB_POST_LIST : + */ + // ----- Check the number of parameters + if (($i+1) >= $p_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, + "Missing parameter value for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Get the value + $v_function_name = $p_options_list[$i+1]; + + // ----- Check that the value is a valid existing function + if (!function_exists($v_function_name)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, + "Function '" . $v_function_name . "()' is not an existing function for option '" . PclZipUtilOptionText($p_options_list[$i]) . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Set the attribute + $v_result_list[$p_options_list[$i]] = $v_function_name; + $i++; + break; + + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" + . $p_options_list[$i] . "'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Next options + $i++; + } + + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($v_result_list[$key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Missing mandatory parameter " . PclZipUtilOptionText($key) . "(" . $key . ")"); + + // ----- Return + return PclZip::errorCode(); + } + } + } + } + + // ----- Look for default values + if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { + + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOptionDefaultThreshold() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privOptionDefaultThreshold(&$p_options) { + $v_result = 1; + + if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF]) + ) { + return $v_result; + } + + // ----- Get 'memory_limit' configuration value + $v_memory_limit = ini_get('memory_limit'); + $v_memory_limit = trim($v_memory_limit); + $last = strtolower(substr($v_memory_limit, -1)); + + if ($last == 'g') //$v_memory_limit = $v_memory_limit*1024*1024*1024; + { + $v_memory_limit = $v_memory_limit*1073741824; + } + if ($last == 'm') //$v_memory_limit = $v_memory_limit*1024*1024; + { + $v_memory_limit = $v_memory_limit*1048576; + } + if ($last == 'k') { + $v_memory_limit = $v_memory_limit*1024; + } + + $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); + + + // ----- Sanity check : No threshold if value lower than 1M + if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { + unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Init - $v_string_list = array(); - $v_att_list = array(); - $v_filedescr_list = array(); - $p_result_list = array(); - - // ----- Look if the $p_filelist is really an array - if (is_array($p_filelist)) { - - // ----- Look if the first element is also an array - // This will mean that this is a file description entry - if (isset($p_filelist[0]) && is_array($p_filelist[0])) { - $v_att_list = $p_filelist; - } - - // ----- The list is a list of string names - else { - $v_string_list = $p_filelist; - } - } + // -------------------------------------------------------------------------------- + // Function : privFileDescrParseAtt() + // Description : + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options = false) { + $v_result = 1; - // ----- Look if the $p_filelist is a string - else if (is_string($p_filelist)) { - // ----- Create a list from the string - $v_string_list = explode(PCLZIP_SEPARATOR, $p_filelist); - } + // ----- For each file in the list check the attributes + foreach ($p_file_list as $v_key => $v_value) { - // ----- Invalid variable type for $p_filelist - else { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type '".gettype($p_filelist)."' for p_filelist"); - return 0; - } - - // ----- Reformat the string list - if (sizeof($v_string_list) != 0) { - foreach ($v_string_list as $v_string) { - $v_att_list[][PCLZIP_ATT_FILE_NAME] = $v_string; - } - } - - // ----- For each file in the list check the attributes - $v_supported_attributes - = array ( PCLZIP_ATT_FILE_NAME => 'mandatory' - ,PCLZIP_ATT_FILE_NEW_SHORT_NAME => 'optional' - ,PCLZIP_ATT_FILE_NEW_FULL_NAME => 'optional' - ,PCLZIP_ATT_FILE_MTIME => 'optional' - ,PCLZIP_ATT_FILE_CONTENT => 'optional' - ,PCLZIP_ATT_FILE_COMMENT => 'optional' - ); - foreach ($v_att_list as $v_entry) { - $v_result = $this->privFileDescrParseAtt($v_entry, - $v_filedescr_list[], - $v_options, - $v_supported_attributes); - if ($v_result != 1) { - return 0; - } - } + // ----- Check if the option is supported + if (!isset($v_requested_options[$v_key])) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '" . $v_key . "' for this file"); - // ----- Expand the filelist (expand directories) - $v_result = $this->privFileDescrExpand($v_filedescr_list, $v_options); - if ($v_result != 1) { - return 0; - } + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for attribute + switch ($v_key) { + case PCLZIP_ATT_FILE_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + + $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['filename'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid empty filename for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + + break; + + case PCLZIP_ATT_FILE_NEW_SHORT_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + + $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_short_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid empty short filename for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + break; + + case PCLZIP_ATT_FILE_NEW_FULL_NAME : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + + $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); + + if ($p_filedescr['new_full_name'] == '') { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid empty full filename for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + break; + + // ----- Look for options that takes a string + case PCLZIP_ATT_FILE_COMMENT : + if (!is_string($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid type " . gettype($v_value) . ". String expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + + $p_filedescr['comment'] = $v_value; + break; + + case PCLZIP_ATT_FILE_MTIME : + if (!is_integer($v_value)) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, + "Invalid type " . gettype($v_value) . ". Integer expected for attribute '" . PclZipUtilOptionText($v_key) . "'"); + + return PclZip::errorCode(); + } + + $p_filedescr['mtime'] = $v_value; + break; + + case PCLZIP_ATT_FILE_CONTENT : + $p_filedescr['content'] = $v_value; + break; - // ----- Call the create fct - $v_result = $this->privAdd($v_filedescr_list, $p_result_list, $v_options); - if ($v_result != 1) { - return 0; - } + default : + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Unknown parameter '" . $v_key . "'"); - // ----- Return - return $p_result_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : listContent() - // Description : - // This public method, gives the list of the files and directories, with their - // properties. - // The properties of each entries in the list are (used also in other functions) : - // filename : Name of the file. For a create or add action it is the filename - // given by the user. For an extract function it is the filename - // of the extracted file. - // stored_filename : Name of the file / directory stored in the archive. - // size : Size of the stored file. - // compressed_size : Size of the file's data compressed in the archive - // (without the headers overhead) - // mtime : Last known modification date of the file (UNIX timestamp) - // comment : Comment associated with the file - // folder : true | false - // index : index of the file in the archive - // status : status of the action (depending of the action) : - // Values are : - // ok : OK ! - // filtered : the file / dir is not extracted (filtered by user) - // already_a_directory : the file can not be extracted because a - // directory with the same name already exists - // write_protected : the file can not be extracted because a file - // with the same name already exists and is - // write protected - // newer_exist : the file was not extracted because a newer file exists - // path_creation_fail : the file is not extracted because the folder - // does not exist and can not be created - // write_error : the file was not extracted because there was a - // error while writing the file - // read_error : the file was not extracted because there was a error - // while reading the file - // invalid_header : the file was not extracted because of an archive - // format error (bad file header) - // Note that each time a method can continue operating when there - // is an action error on a file, the error is only logged in the file status. - // Return Values : - // 0 on an unrecoverable failure, - // The list of the files in the archive. - // -------------------------------------------------------------------------------- - function listContent() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } + // ----- Return + return PclZip::errorCode(); + } - // ----- Call the extracting fct - $p_list = array(); - if (($v_result = $this->privList($p_list)) != 1) - { - unset($p_list); - return(0); - } + // ----- Look for mandatory options + if ($v_requested_options !== false) { + for ($key = reset($v_requested_options); $key = key($v_requested_options); $key = next($v_requested_options)) { + // ----- Look for mandatory option + if ($v_requested_options[$key] == 'mandatory') { + // ----- Look if present + if (!isset($p_file_list[$key])) { + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, + "Missing mandatory parameter " . PclZipUtilOptionText($key) . "(" . $key . ")"); - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // extract($p_path="./", $p_remove_path="") - // extract([$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method extract all the files / directories from the archive to the - // folder indicated in $p_path. - // If you want to ignore the 'root' part of path of the memorized files - // you can indicate this in the optional $p_remove_path parameter. - // By default, if a newer file with the same name already exists, the - // file is not extracted. - // - // If both PCLZIP_OPT_PATH and PCLZIP_OPT_ADD_PATH aoptions - // are used, the path indicated in PCLZIP_OPT_ADD_PATH is append - // at the end of the path value of PCLZIP_OPT_PATH. - // Parameters : - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 or a negative value on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function extract() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } + return PclZip::errorCode(); + } + } + } + } - // ----- Set default values - $v_options = array(); -// $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_EXTRACT_IN_OUTPUT => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; - } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - } + // end foreach + } - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } - } + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privFileDescrExpand() + // Description : + // This method look for each item of the list to see if its a file, a folder + // or a string to be added as file. For any other type of files (link, other) + // just ignore the item. + // Then prepare the information that will be stored for that file. + // When its a folder, expand the folder with all the files that are in that + // folder (recursively). + // Parameters : + // Return Values : + // 1 on success. + // 0 on failure. + // -------------------------------------------------------------------------------- + function privFileDescrExpand(&$p_filedescr_list, &$p_options) { + $v_result = 1; + + // ----- Create a result list + $v_result_list = array(); + + // ----- Look each entry + for ($i = 0; $i < sizeof($p_filedescr_list); $i++) { + + // ----- Get filedescr + $v_descr = $p_filedescr_list[$i]; + + // ----- Reduce the filename + $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false); + $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']); + + // ----- Look for real file or folder + if (file_exists($v_descr['filename'])) { + if (@is_file($v_descr['filename'])) { + $v_descr['type'] = 'file'; + } else { + if (@is_dir($v_descr['filename'])) { + $v_descr['type'] = 'folder'; + } else { + if (@is_link($v_descr['filename'])) { + // skip + continue; + } else { + // skip + continue; + } + } + } + } // ----- Look for string added as file + else { + if (isset($v_descr['content'])) { + $v_descr['type'] = 'virtual_file'; + } // ----- Missing file + else { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '" . $v_descr['filename'] . "' does not exist"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Calculate the stored filename + $this->privCalculateStoredFilename($v_descr, $p_options); + + // ----- Add the descriptor in result list + $v_result_list[sizeof($v_result_list)] = $v_descr; + + // ----- Look for folder + if ($v_descr['type'] == 'folder') { + // ----- List of items in folder + $v_dirlist_descr = array(); + $v_dirlist_nb = 0; + if ($v_folder_handler = @opendir($v_descr['filename'])) { + while (($v_item_handler = @readdir($v_folder_handler)) !== false) { + + // ----- Skip '.' and '..' + if (($v_item_handler == '.') || ($v_item_handler == '..')) { + continue; + } + + // ----- Compose the full filename + $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'] . '/' . $v_item_handler; + + // ----- Look for different stored filename + // Because the name of the folder was changed, the name of the + // files/sub-folders also change + if (($v_descr['stored_filename'] != $v_descr['filename']) + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) + ) { + if ($v_descr['stored_filename'] != '') { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'] . '/' . $v_item_handler; + } else { + $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; + } + } + + $v_dirlist_nb++; + } + + @closedir($v_folder_handler); + } else { + // TBC : unable to open folder in read mode + } + + // ----- Expand each element of the list + if ($v_dirlist_nb != 0) { + // ----- Expand + if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { + return $v_result; + } + + // ----- Concat the resulting list + $v_result_list = array_merge($v_result_list, $v_dirlist_descr); + } else { + } + + // ----- Free local array + unset($v_dirlist_descr); + } + } + + // ----- Get the result list + $p_filedescr_list = $v_result_list; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCreate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCreate($p_filedescr_list, &$p_result_list, &$p_options) { + $v_result = 1; + $v_list_detail = array(); + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the file in write mode + if (($v_result = $this->privOpenFd('wb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Add the list of files + $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); + + // ----- Close + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAdd() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAdd($p_filedescr_list, &$p_result_list, &$p_options) { + $v_result = 1; + $v_list_detail = array(); + + // ----- Look if the archive exists or is empty + if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) { + + // ----- Do a create + $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); + + // ----- Return + return $v_result; + } + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Create the Central Dir files header + for ($i = 0, $v_count = 0; $i < sizeof($v_header_list); $i++) { + // ----- Create the file header + if ($v_header_list[$i]['status'] == 'ok') { + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + fclose($v_zip_temp_fd); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = $v_central_dir['comment']; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { + $v_comment = $v_comment . $p_options[PCLZIP_OPT_ADD_COMMENT]; + } + if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT] . $v_comment; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, + $v_comment)) != 1 + ) { + // ----- Reset the file list + unset($v_header_list); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privOpenFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privOpenFd($p_mode) { + $v_result = 1; + + // ----- Look if already open + if ($this->zip_fd != 0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \'' . $this->zipname . '\' already open'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open archive \'' . $this->zipname . '\' in ' . $p_mode . ' mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCloseFd() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privCloseFd() { + $v_result = 1; + + if ($this->zip_fd != 0) { + @fclose($this->zip_fd); + } + $this->zip_fd = 0; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddList() + // Description : + // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is + // different from the real path of the file. This is usefull if you want to have PclTar + // running in any directory, and memorize relative path from an other directory. + // Parameters : + // $p_list : An array containing the file or directory names to add in the tar + // $p_result_list : list of added files with their properties (specially the status field) + // $p_add_dir : Path to add in the filename path archived + // $p_remove_dir : Path to remove in the filename path archived + // Return Values : + // -------------------------------------------------------------------------------- +// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) + function privAddList($p_filedescr_list, &$p_result_list, &$p_options) { + $v_result = 1; + + // ----- Add the files + $v_header_list = array(); + if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) { + // ----- Return + return $v_result; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($this->zip_fd); + + // ----- Create the Central Dir files header + for ($i = 0, $v_count = 0; $i < sizeof($v_header_list); $i++) { + // ----- Create the file header + if ($v_header_list[$i]['status'] == 'ok') { + if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + // ----- Return + return $v_result; + } + $v_count++; + } + + // ----- Transform the header to a 'usable' info + $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($this->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) { + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileList() + // Description : + // Parameters : + // $p_filedescr_list : An array containing the file description + // or directory names to add in the zip + // $p_result_list : list of added files with their properties (specially the status field) + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) { + $v_result = 1; + $v_header = array(); + + // ----- Recuperate the current number of elt in list + $v_nb = sizeof($p_result_list); + + // ----- Loop on the files + for ($j = 0; ($j < sizeof($p_filedescr_list)) && ($v_result == 1); $j++) { + // ----- Format the filename + $p_filedescr_list[$j]['filename'] + = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false); + + + // ----- Skip empty file names + // TBC : Can this be possible ? not checked in DescrParseAtt ? + if ($p_filedescr_list[$j]['filename'] == "") { + continue; + } + + // ----- Check the filename + if (($p_filedescr_list[$j]['type'] != 'virtual_file') + && (!file_exists($p_filedescr_list[$j]['filename'])) + ) { + PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, + "File '" . $p_filedescr_list[$j]['filename'] . "' does not exist"); + + return PclZip::errorCode(); + } + + // ----- Look if it is a file or a dir with no all path remove option + // or a dir with all its path removed +// if ( (is_file($p_filedescr_list[$j]['filename'])) +// || ( is_dir($p_filedescr_list[$j]['filename']) + if (($p_filedescr_list[$j]['type'] == 'file') + || ($p_filedescr_list[$j]['type'] == 'virtual_file') + || (($p_filedescr_list[$j]['type'] == 'folder') + && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]) + || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) + ) { + + // ----- Add the file + $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, + $p_options); + if ($v_result != 1) { + return $v_result; + } + + // ----- Store the file infos + $p_result_list[$v_nb++] = $v_header; + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFile($p_filedescr, &$p_header, &$p_options) { + $v_result = 1; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + // TBC : Already done in the fileAtt check ... ? + if ($p_filename == "") { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for a stored different filename + /* TBC : Removed + if (isset($p_filedescr['stored_filename'])) { + $v_stored_filename = $p_filedescr['stored_filename']; } - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); - - // ----- Trace - - // ----- Call the extracting fct - $p_list = array(); - $v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, - $v_remove_all_path, $v_options); - if ($v_result < 1) { - unset($p_list); - return(0); + else { + $v_stored_filename = $p_filedescr['stored_filename']; } + */ - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - - // -------------------------------------------------------------------------------- - // Function : - // extractByIndex($p_index, $p_path="./", $p_remove_path="") - // extractByIndex($p_index, [$p_option, $p_option_value, ...]) - // Description : - // This method supports two synopsis. The first one is historical. - // This method is doing a partial extract of the archive. - // The extracted files or folders are identified by their index in the - // archive (from 0 to n). - // Note that if the index identify a folder, only the folder entry is - // extracted, not all the files included in the archive. - // Parameters : - // $p_index : A single index (integer) or a string of indexes of files to - // extract. The form of the string is "0,4-6,8-12" with only numbers - // and '-' for range or ',' to separate ranges. No spaces or ';' - // are allowed. - // $p_path : Path where the files and directories are to be extracted - // $p_remove_path : First part ('root' part) of the memorized path - // (if any similar) to remove while extracting. - // Options : - // PCLZIP_OPT_PATH : - // PCLZIP_OPT_ADD_PATH : - // PCLZIP_OPT_REMOVE_PATH : - // PCLZIP_OPT_REMOVE_ALL_PATH : - // PCLZIP_OPT_EXTRACT_AS_STRING : The files are extracted as strings and - // not as files. - // The resulting content is in a new field 'content' in the file - // structure. - // This option must be used alone (any other options are ignored). - // PCLZIP_CB_PRE_EXTRACT : - // PCLZIP_CB_POST_EXTRACT : - // Return Values : - // 0 on failure, - // The list of the extracted files, with a status of the action. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - //function extractByIndex($p_index, options...) - function extractByIndex($p_index) - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } + // ----- Set the file properties + clearstatcache(); + $p_header['version'] = 20; + $p_header['version_extracted'] = 10; + $p_header['flag'] = 0; + $p_header['compression'] = 0; + $p_header['crc'] = 0; + $p_header['compressed_size'] = 0; + $p_header['filename_len'] = strlen($p_filename); + $p_header['extra_len'] = 0; + $p_header['disk'] = 0; + $p_header['internal'] = 0; + $p_header['offset'] = 0; + $p_header['filename'] = $p_filename; +// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; + $p_header['stored_filename'] = $p_filedescr['stored_filename']; + $p_header['extra'] = ''; + $p_header['status'] = 'ok'; + $p_header['index'] = -1; + + // ----- Look for regular file + if ($p_filedescr['type'] == 'file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = filesize($p_filename); + } // ----- Look for regular folder + else { + if ($p_filedescr['type'] == 'folder') { + $p_header['external'] = 0x00000010; + $p_header['mtime'] = filemtime($p_filename); + $p_header['size'] = filesize($p_filename); + } // ----- Look for virtual file + else { + if ($p_filedescr['type'] == 'virtual_file') { + $p_header['external'] = 0x00000000; + $p_header['size'] = strlen($p_filedescr['content']); + } + } + } + + + // ----- Look for filetime + if (isset($p_filedescr['mtime'])) { + $p_header['mtime'] = $p_filedescr['mtime']; + } else { + if ($p_filedescr['type'] == 'virtual_file') { + $p_header['mtime'] = time(); + } else { + $p_header['mtime'] = filemtime($p_filename); + } + } + + // ------ Look for file comment + if (isset($p_filedescr['comment'])) { + $p_header['comment_len'] = strlen($p_filedescr['comment']); + $p_header['comment'] = $p_filedescr['comment']; + } else { + $p_header['comment_len'] = 0; + $p_header['comment'] = ''; + } + + // ----- Look for pre-add callback + if (isset($p_options[PCLZIP_CB_PRE_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_header['status'] = "skipped"; + $v_result = 1; + } + + // ----- Update the informations + // Only some fields can be modified + if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { + $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); + } + } + + // ----- Look for empty stored filename + if ($p_header['stored_filename'] == "") { + $p_header['status'] = "filtered"; + } + + // ----- Check the path length + if (strlen($p_header['stored_filename']) > 0xFF) { + $p_header['status'] = 'filename_too_long'; + } + + // ----- Look if no error, or file not skipped + if ($p_header['status'] == 'ok') { + + // ----- Look for a file + if ($p_filedescr['type'] == 'file') { + // ----- Look for using temporary file to zip + if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size']))) + ) { + $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } // ----- Use "in memory" zip algo + else { + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + + return PclZip::errorCode(); + } + + // ----- Read the file content + $v_content = @fread($v_file, $p_header['size']); + + // ----- Close the file + @fclose($v_file); + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + + } + + } // ----- Look for a virtual file (a file from string) + else { + if ($p_filedescr['type'] == 'virtual_file') { + + $v_content = $p_filedescr['content']; + + // ----- Calculate the CRC + $p_header['crc'] = @crc32($v_content); + + // ----- Look for no compression + if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { + // ----- Set header parameters + $p_header['compressed_size'] = $p_header['size']; + $p_header['compression'] = 0; + } // ----- Look for normal compression + else { + // ----- Compress the content + $v_content = @gzdeflate($v_content); + + // ----- Set header parameters + $p_header['compressed_size'] = strlen($v_content); + $p_header['compression'] = 8; + } + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + @fclose($v_file); + + return $v_result; + } + + // ----- Write the compressed (or not) content + @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); + } // ----- Look for a directory + else { + if ($p_filedescr['type'] == 'folder') { + // ----- Look for directory last '/' + if (@substr($p_header['stored_filename'], -1) != '/') { + $p_header['stored_filename'] .= '/'; + } + + // ----- Set the file properties + $p_header['size'] = 0; + //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked + $p_header['external'] = 0x00000010; // Value for a folder : to be checked + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + } + } + } + } + + // ----- Look for post-add callback + if (isset($p_options[PCLZIP_CB_POST_ADD])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_header, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); + if ($v_result == 0) { + // ----- Ignored + $v_result = 1; + } + + // ----- Update the informations + // Nothing can be modified + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privAddFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) { + $v_result = PCLZIP_ERR_NO_ERROR; + + // ----- Working variable + $p_filename = $p_filedescr['filename']; + + + // ----- Open the source file + if (($v_file = @fopen($p_filename, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); + + return PclZip::errorCode(); + } + + // ----- Creates a compressed temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.gz'; + if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary write mode'); + + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = filesize($p_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @gzputs($v_file_compressed, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file); + @gzclose($v_file_compressed); + + // ----- Check the minimum file size + if (filesize($v_gzip_temp_name) < 18) { + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'gzip temporary file \'' . $v_gzip_temp_name . '\' has invalid filesize - should be minimum 18 bytes'); + + return PclZip::errorCode(); + } + + // ----- Extract the compressed attributes + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode'); + + return PclZip::errorCode(); + } + + // ----- Read the gzip file header + $v_binary_data = @fread($v_file_compressed, 10); + $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); + + // ----- Check some parameters + $v_data_header['os'] = bin2hex($v_data_header['os']); + + // ----- Read the gzip file footer + @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); + $v_binary_data = @fread($v_file_compressed, 8); + $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); + + // ----- Set the attributes + $p_header['compression'] = ord($v_data_header['cm']); + //$p_header['mtime'] = $v_data_header['mtime']; + $p_header['crc'] = $v_data_footer['crc']; + $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Call the header generation + if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { + return $v_result; + } + + // ----- Add the compressed data + if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode'); + + return PclZip::errorCode(); + } + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + fseek($v_file_compressed, 10); + $v_size = $p_header['compressed_size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($v_file_compressed, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close the file + @fclose($v_file_compressed); + + // ----- Unlink the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCalculateStoredFilename() + // Description : + // Based on file descriptor properties and global options, this method + // calculate the filename that will be stored in the archive. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privCalculateStoredFilename(&$p_filedescr, &$p_options) { + $v_result = 1; + + // ----- Working variables + $p_filename = $p_filedescr['filename']; + if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { + $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; + } else { + $p_add_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { + $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; + } else { + $p_remove_dir = ''; + } + if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { + $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; + } else { + $p_remove_all_dir = 0; + } + + + // ----- Look for full name change + if (isset($p_filedescr['new_full_name'])) { + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); + } // ----- Look for path and/or short name change + else { + + // ----- Look for short name change + // Its when we cahnge just the filename but not the path + if (isset($p_filedescr['new_short_name'])) { + $v_path_info = pathinfo($p_filename); + $v_dir = ''; + if ($v_path_info['dirname'] != '') { + $v_dir = $v_path_info['dirname'] . '/'; + } + $v_stored_filename = $v_dir . $p_filedescr['new_short_name']; + } else { + // ----- Calculate the stored filename + $v_stored_filename = $p_filename; + } + + // ----- Look for all path to remove + if ($p_remove_all_dir) { + $v_stored_filename = basename($p_filename); + } // ----- Look for partial path remove + else { + if ($p_remove_dir != "") { + if (substr($p_remove_dir, -1) != '/') { + $p_remove_dir .= "/"; + } + + if ((substr($p_filename, 0, 2) == "./") + || (substr($p_remove_dir, 0, 2) == "./") + ) { + + if ((substr($p_filename, 0, 2) == "./") + && (substr($p_remove_dir, 0, 2) != "./") + ) { + $p_remove_dir = "./" . $p_remove_dir; + } + if ((substr($p_filename, 0, 2) != "./") + && (substr($p_remove_dir, 0, 2) == "./") + ) { + $p_remove_dir = substr($p_remove_dir, 2); + } + } + + $v_compare = PclZipUtilPathInclusion($p_remove_dir, + $v_stored_filename); + if ($v_compare > 0) { + if ($v_compare == 2) { + $v_stored_filename = ""; + } else { + $v_stored_filename = substr($v_stored_filename, + strlen($p_remove_dir)); + } + } + } + } + + // ----- Remove drive letter if any + $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); + + // ----- Look for path to add + if ($p_add_dir != "") { + if (substr($p_add_dir, -1) == "/") { + $v_stored_filename = $p_add_dir . $v_stored_filename; + } else { + $v_stored_filename = $p_add_dir . "/" . $v_stored_filename; + } + } + } + + // ----- Filename (reduce the path of stored name) + $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); + $p_filedescr['stored_filename'] = $v_stored_filename; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteFileHeader(&$p_header) { + $v_result = 1; + + // ----- Store the offset position of the file + $p_header['offset'] = ftell($this->zip_fd); + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours'] << 11)+($v_date['minutes'] << 5)+$v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980) << 9)+($v_date['mon'] << 5)+$v_date['mday']; + + // ----- Packed data + $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, + $p_header['version_extracted'], $p_header['flag'], + $p_header['compression'], $v_mtime, $v_mdate, + $p_header['crc'], $p_header['compressed_size'], + $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len']); + + // ----- Write the first 148 bytes of the header in the archive + fputs($this->zip_fd, $v_binary_data, 30); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralFileHeader(&$p_header) { + $v_result = 1; + + // TBC + //for(reset($p_header); $key = key($p_header); next($p_header)) { + //} + + // ----- Transform UNIX mtime to DOS format mdate/mtime + $v_date = getdate($p_header['mtime']); + $v_mtime = ($v_date['hours'] << 11)+($v_date['minutes'] << 5)+$v_date['seconds']/2; + $v_mdate = (($v_date['year']-1980) << 9)+($v_date['mon'] << 5)+$v_date['mday']; + + + // ----- Packed data + $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, + $p_header['version'], $p_header['version_extracted'], + $p_header['flag'], $p_header['compression'], + $v_mtime, $v_mdate, $p_header['crc'], + $p_header['compressed_size'], $p_header['size'], + strlen($p_header['stored_filename']), + $p_header['extra_len'], $p_header['comment_len'], + $p_header['disk'], $p_header['internal'], + $p_header['external'], $p_header['offset']); + + // ----- Write the 42 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 46); + + // ----- Write the variable fields + if (strlen($p_header['stored_filename']) != 0) { + fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); + } + if ($p_header['extra_len'] != 0) { + fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); + } + if ($p_header['comment_len'] != 0) { + fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privWriteCentralHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) { + $v_result = 1; + + // ----- Packed data + $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, + $p_nb_entries, $p_size, + $p_offset, strlen($p_comment)); + + // ----- Write the 22 bytes of the header in the zip file + fputs($this->zip_fd, $v_binary_data, 22); + + // ----- Write the variable fields + if (strlen($p_comment) != 0) { + fputs($this->zip_fd, $p_comment, strlen($p_comment)); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privList() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privList(&$p_list) { + $v_result = 1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Open the zip file + if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) { + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open archive \'' . $this->zipname . '\' in binary read mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Go to beginning of Central Dir + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_central_dir['offset'])) { + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + for ($i = 0; $i < $v_central_dir['entries']; $i++) { + // ----- Read the file header + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + $v_header['index'] = $i; + + // ----- Get the only interesting attributes + $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); + unset($v_header); + } + + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Magic quotes trick + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privConvertHeader2FileInfo() + // Description : + // This function takes the file informations from the central directory + // entries and extract the interesting parameters that will be given back. + // The resulting file infos are set in the array $p_info + // $p_info['filename'] : Filename with full path. Given by user (add), + // extracted in the filesystem (extract). + // $p_info['stored_filename'] : Stored filename in the archive. + // $p_info['size'] = Size of the file. + // $p_info['compressed_size'] = Compressed size of the file. + // $p_info['mtime'] = Last modification date of the file. + // $p_info['comment'] = Comment associated with the file. + // $p_info['folder'] = true/false : indicates if the entry is a folder or not. + // $p_info['status'] = status of the action on the file. + // $p_info['crc'] = CRC of the file content. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privConvertHeader2FileInfo($p_header, &$p_info) { + $v_result = 1; + + // ----- Get the interesting attributes + $v_temp_path = PclZipUtilPathReduction($p_header['filename']); + $p_info['filename'] = $v_temp_path; + $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); + $p_info['stored_filename'] = $v_temp_path; + $p_info['size'] = $p_header['size']; + $p_info['compressed_size'] = $p_header['compressed_size']; + $p_info['mtime'] = $p_header['mtime']; + $p_info['comment'] = $p_header['comment']; + $p_info['folder'] = (($p_header['external'] & 0x00000010) == 0x00000010); + $p_info['index'] = $p_header['index']; + $p_info['status'] = $p_header['status']; + $p_info['crc'] = $p_header['crc']; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractByRule() + // Description : + // Extract a file or directory depending of rules (by index, by name, ...) + // Parameters : + // $p_file_list : An array where will be placed the properties of each + // extracted file + // $p_path : Path to add while writing the extracted files + // $p_remove_path : Path to remove (from the file memorized path) while writing the + // extracted files. If the path does not match the file path, + // the file is extracted with its memorized path. + // $p_remove_path does not apply to 'list' mode. + // $p_path and $p_remove_path are commulative. + // Return Values : + // 1 on success,0 or less on error (see error code list) + // -------------------------------------------------------------------------------- + function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { + $v_result = 1; + + // ----- Magic quotes trick + $this->privDisableMagicQuotes(); + + // ----- Check the path + if (($p_path == "") + || ((substr($p_path, 0, 1) != "/") + && (substr($p_path, 0, 3) != "../") + && (substr($p_path, 1, 2) != ":/")) + ) { + $p_path = "./" . $p_path; + } + + // ----- Reduce the path last (and duplicated) '/' + if (($p_path != "./") && ($p_path != "/")) { + // ----- Look for the path end '/' + while (substr($p_path, -1) == "/") { + $p_path = substr($p_path, 0, strlen($p_path)-1); + } + } + + // ----- Look for path to remove format (should end by /) + if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) { + $p_remove_path .= '/'; + } + $p_remove_path_size = strlen($p_remove_path); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) { + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + + // ----- Read each entry + $j_start = 0; + for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) { + + // ----- Read next Central dir entry + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Store the index + $v_header['index'] = $i; + + // ----- Store the file position + $v_pos_entry = ftell($this->zip_fd); + + // ----- Look for the specific extract rules + $v_extract = false; + + // ----- Look for extract by name rule + if ((isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0) + ) { + + // ----- Look if the filename is in the list + for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) { + + // ----- Look for a directory + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { + + // ----- Look if the directory is in the filename path + if ((strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header['stored_filename'], 0, + strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j]) + ) { + $v_extract = true; + } + } // ----- Look for a filename + elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_extract = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - // ----- Set default values - $v_options = array(); -// $v_path = "./"; - $v_path = ''; - $v_remove_path = ""; - $v_remove_all_path = false; - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Default values for option - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - - // ----- Look for arguments - if ($v_size > 1) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Remove form the options list the first argument - array_shift($v_arg_list); - $v_size--; - - // ----- Look for first arg - if ((is_integer($v_arg_list[0])) && ($v_arg_list[0] > 77000)) { - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_PATH => 'optional', - PCLZIP_OPT_REMOVE_PATH => 'optional', - PCLZIP_OPT_REMOVE_ALL_PATH => 'optional', - PCLZIP_OPT_EXTRACT_AS_STRING => 'optional', - PCLZIP_OPT_ADD_PATH => 'optional', - PCLZIP_CB_PRE_EXTRACT => 'optional', - PCLZIP_CB_POST_EXTRACT => 'optional', - PCLZIP_OPT_SET_CHMOD => 'optional', - PCLZIP_OPT_REPLACE_NEWER => 'optional' - ,PCLZIP_OPT_STOP_ON_ERROR => 'optional' - ,PCLZIP_OPT_EXTRACT_DIR_RESTRICTION => 'optional', - PCLZIP_OPT_TEMP_FILE_THRESHOLD => 'optional', - PCLZIP_OPT_TEMP_FILE_ON => 'optional', - PCLZIP_OPT_TEMP_FILE_OFF => 'optional' - )); - if ($v_result != 1) { - return 0; - } - - // ----- Set the arguments - if (isset($v_options[PCLZIP_OPT_PATH])) { - $v_path = $v_options[PCLZIP_OPT_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_PATH])) { - $v_remove_path = $v_options[PCLZIP_OPT_REMOVE_PATH]; - } - if (isset($v_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $v_remove_all_path = $v_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - if (isset($v_options[PCLZIP_OPT_ADD_PATH])) { - // ----- Check for '/' in last path char - if ((strlen($v_path) > 0) && (substr($v_path, -1) != '/')) { - $v_path .= '/'; + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { + $v_extract = true; } - $v_path .= $v_options[PCLZIP_OPT_ADD_PATH]; - } - if (!isset($v_options[PCLZIP_OPT_EXTRACT_AS_STRING])) { - $v_options[PCLZIP_OPT_EXTRACT_AS_STRING] = FALSE; - } - else { - } - } - - // ----- Look for 2 args - // Here we need to support the first historic synopsis of the - // method. - else { - - // ----- Get the first argument - $v_path = $v_arg_list[0]; - - // ----- Look for the optional second argument - if ($v_size == 2) { - $v_remove_path = $v_arg_list[1]; - } - else if ($v_size > 2) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid number / type of arguments"); - - // ----- Return - return 0; - } } - } - - // ----- Trace - - // ----- Trick - // Here I want to reuse extractByRule(), so I need to parse the $p_index - // with privParseOptions() - $v_arg_trick = array (PCLZIP_OPT_BY_INDEX, $p_index); - $v_options_trick = array(); - $v_result = $this->privParseOptions($v_arg_trick, sizeof($v_arg_trick), $v_options_trick, - array (PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - $v_options[PCLZIP_OPT_BY_INDEX] = $v_options_trick[PCLZIP_OPT_BY_INDEX]; - - // ----- Look for default option values - $this->privOptionDefaultThreshold($v_options); + */ - // ----- Call the extracting fct - if (($v_result = $this->privExtractByRule($p_list, $v_path, $v_remove_path, $v_remove_all_path, $v_options)) < 1) { - return(0); - } + // ----- Look for extract by preg rule + else { + if ((isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "") + ) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { + $v_extract = true; + } + } // ----- Look for extract by index rule + else { + if ((isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0) + ) { + + // ----- Look if the index is in the list + for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) { + + if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_extract = true; + } + if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) { + break; + } + } + } // ----- Look for no rule, which means extract all the archive + else { + $v_extract = true; + } + } + } + + // ----- Check compression method + if (($v_extract) + && (($v_header['compression'] != 8) + && ($v_header['compression'] != 0)) + ) { + $v_header['status'] = 'unsupported_compression'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true) + ) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, + "Filename '" . $v_header['stored_filename'] . "' is " + . "compressed by an unsupported compression " + . "method (" . $v_header['compression'] . ") "); + + return PclZip::errorCode(); + } + } + + // ----- Check encrypted files + if (($v_extract) && (($v_header['flag'] & 1) == 1)) { + $v_header['status'] = 'unsupported_encryption'; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true) + ) { + + $this->privSwapBackMagicQuotes(); + + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + "Unsupported encryption for " + . " filename '" . $v_header['stored_filename'] + . "'"); + + return PclZip::errorCode(); + } + } + + // ----- Look for real extraction + if (($v_extract) && ($v_header['status'] != 'ok')) { + $v_result = $this->privConvertHeader2FileInfo($v_header, + $p_file_list[$v_nb_extracted++]); + if ($v_result != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + $v_extract = false; + } + + // ----- Look for real extraction + if ($v_extract) { + + // ----- Go to the file position + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + + $this->privSwapBackMagicQuotes(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Look for extraction as string + if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { + + $v_string = ''; + + // ----- Extracting the file + $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Set the file content + $p_file_list[$v_nb_extracted]['content'] = $v_string; + + // ----- Next extracted file + $v_nb_extracted++; + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } // ----- Look for extraction in standard output + elseif ((isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) + && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT]) + ) { + // ----- Extracting the file in standard output + $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } // ----- Look for normal extraction + else { + // ----- Extracting the file + $v_result1 = $this->privExtractFile($v_header, + $p_path, $p_remove_path, + $p_remove_all_path, + $p_options); + if ($v_result1 < 1) { + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result1; + } + + // ----- Get the only interesting attributes + if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + return $v_result; + } + + // ----- Look for user callback abort + if ($v_result1 == 2) { + break; + } + } + } + } + + // ----- Close the zip file + $this->privCloseFd(); + $this->privSwapBackMagicQuotes(); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFile() + // Description : + // Parameters : + // Return Values : + // + // 1 : ... ? + // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback + // -------------------------------------------------------------------------------- + function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) { + $v_result = 1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for all path to remove + if ($p_remove_all_path == true) { + // ----- Look for folder entry that not need to be extracted + if (($p_entry['external'] & 0x00000010) == 0x00000010) { + + $p_entry['status'] = "filtered"; + + return $v_result; + } + + // ----- Get the basename of the path + $p_entry['filename'] = basename($p_entry['filename']); + } // ----- Look for path to remove + else { + if ($p_remove_path != "") { + if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) { + + // ----- Change the file status + $p_entry['status'] = "filtered"; + + // ----- Return + return $v_result; + } + + $p_remove_path_size = strlen($p_remove_path); + if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) { + + // ----- Remove the path + $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); + + } + } + } + + // ----- Add the path + if ($p_path != '') { + $p_entry['filename'] = $p_path . "/" . $p_entry['filename']; + } + + // ----- Check a base_dir_restriction + if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { + $v_inclusion + = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], + $p_entry['filename']); + if ($v_inclusion == 0) { + + PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, + "Filename '" . $p_entry['filename'] . "' is " + . "outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); + + return PclZip::errorCode(); + } + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Look for specific actions while the file exist + if (file_exists($p_entry['filename'])) { + + // ----- Look if file is a directory + if (is_dir($p_entry['filename'])) { + + // ----- Change the file status + $p_entry['status'] = "already_a_directory"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true) + ) { + + PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, + "Filename '" . $p_entry['filename'] . "' is " + . "already used by an existing directory"); + + return PclZip::errorCode(); + } + } // ----- Look if file is write protected + else { + if (!is_writeable($p_entry['filename'])) { + + // ----- Change the file status + $p_entry['status'] = "write_protected"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true) + ) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Filename '" . $p_entry['filename'] . "' exists " + . "and is write protected"); + + return PclZip::errorCode(); + } + } // ----- Look if the extracted file is older + else { + if (filemtime($p_entry['filename']) > $p_entry['mtime']) { + // ----- Change the file status + if ((isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) + && ($p_options[PCLZIP_OPT_REPLACE_NEWER] === true) + ) { + } else { + $p_entry['status'] = "newer_exist"; + + // ----- Look for PCLZIP_OPT_STOP_ON_ERROR + // For historical reason first PclZip implementation does not stop + // when this kind of error occurs. + if ((isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) + && ($p_options[PCLZIP_OPT_STOP_ON_ERROR] === true) + ) { + + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + "Newer version of '" . $p_entry['filename'] . "' exists " + . "and option PCLZIP_OPT_REPLACE_NEWER is not selected"); + + return PclZip::errorCode(); + } + } + } else { + } + } + } + } // ----- Check the directory availability and create it if necessary + else { + if ((($p_entry['external'] & 0x00000010) == 0x00000010) || (substr($p_entry['filename'], -1) == '/')) { + $v_dir_to_check = $p_entry['filename']; + } else { + if (!strstr($p_entry['filename'], "/")) { + $v_dir_to_check = ""; + } else { + $v_dir_to_check = dirname($p_entry['filename']); + } + } + + if (($v_result = $this->privDirCheck($v_dir_to_check, + (($p_entry['external'] & 0x00000010) == 0x00000010))) != 1 + ) { + + // ----- Change the file status + $p_entry['status'] = "path_creation_fail"; + + // ----- Return + //return $v_result; + $v_result = 1; + } + } + } + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compression'] == 0) { + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + + // ----- Change the file status + $p_entry['status'] = "write_error"; + + // ----- Return + return $v_result; + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + /* Try to speed up the code + $v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_binary_data, $v_read_size); + */ + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : - // delete([$p_option, $p_option_value, ...]) - // Description : - // This method removes files from the archive. - // If no parameters are given, then all the archive is emptied. - // Parameters : - // None or optional arguments. - // Options : - // PCLZIP_OPT_BY_INDEX : - // PCLZIP_OPT_BY_NAME : - // PCLZIP_OPT_BY_EREG : - // PCLZIP_OPT_BY_PREG : - // Return Values : - // 0 on failure, - // The list of the files which are still present in the archive. - // (see PclZip::listContent() for list entry format) - // -------------------------------------------------------------------------------- - function delete() - { - $v_result=1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } + // ----- Closing the destination file + fclose($v_dest_file); - // ----- Set default values - $v_options = array(); - - // ----- Look for variable options arguments - $v_size = func_num_args(); - - // ----- Look for arguments - if ($v_size > 0) { - // ----- Get the arguments - $v_arg_list = func_get_args(); - - // ----- Parse the options - $v_result = $this->privParseOptions($v_arg_list, $v_size, $v_options, - array (PCLZIP_OPT_BY_NAME => 'optional', - PCLZIP_OPT_BY_EREG => 'optional', - PCLZIP_OPT_BY_PREG => 'optional', - PCLZIP_OPT_BY_INDEX => 'optional' )); - if ($v_result != 1) { - return 0; - } - } + // ----- Change the file mtime + touch($p_entry['filename'], $p_entry['mtime']); - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - // ----- Call the delete fct - $v_list = array(); - if (($v_result = $this->privDeleteByRule($v_list, $v_options)) != 1) { - $this->privSwapBackMagicQuotes(); - unset($v_list); - return(0); - } + } else { + // ----- TBC + // Need to be finished + if (($p_entry['flag'] & 1) == 1) { + PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, + 'File \'' . $p_entry['filename'] . '\' is encrypted. Encrypted files are not supported.'); - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : deleteByIndex() - // Description : - // ***** Deprecated ***** - // delete(PCLZIP_OPT_BY_INDEX, $p_index) should be prefered. - // -------------------------------------------------------------------------------- - function deleteByIndex($p_index) - { - - $p_list = $this->delete(PCLZIP_OPT_BY_INDEX, $p_index); - - // ----- Return - return $p_list; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : properties() - // Description : - // This method gives the properties of the archive. - // The properties are : - // nb : Number of files in the archive - // comment : Comment associated with the archive file - // status : not_exist, ok - // Parameters : - // None - // Return Values : - // 0 on failure, - // An array with the archive properties. - // -------------------------------------------------------------------------------- - function properties() - { - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - $this->privSwapBackMagicQuotes(); - return(0); - } + return PclZip::errorCode(); + } - // ----- Default properties - $v_prop = array(); - $v_prop['comment'] = ''; - $v_prop['nb'] = 0; - $v_prop['status'] = 'not_exist'; - - // ----- Look if file exists - if (@is_file($this->zipname)) - { - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return 0; - } - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return 0; - } + // ----- Look for using temporary file to unzip + if ((!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) + && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) + || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) + && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size']))) + ) { + $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); + if ($v_result < PCLZIP_ERR_NO_ERROR) { + return $v_result; + } + } // ----- Look for extract in memory + else { - // ----- Close the zip file - $this->privCloseFd(); - // ----- Set the user attributes - $v_prop['comment'] = $v_central_dir['comment']; - $v_prop['nb'] = $v_central_dir['entries']; - $v_prop['status'] = 'ok'; - } + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_prop; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : duplicate() - // Description : - // This method creates an archive by copying the content of an other one. If - // the archive already exist, it is replaced by the new one without any warning. - // Parameters : - // $p_archive : The filename of a valid archive, or - // a valid PclZip object. - // Return Values : - // 1 on success. - // 0 or a negative value on error (error code). - // -------------------------------------------------------------------------------- - function duplicate($p_archive) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the $p_archive is a PclZip object - if ((is_object($p_archive)) && (get_class($p_archive) == 'pclzip')) - { - - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive->zipname); - } + // ----- Decompress the file + $v_file_content = @gzinflate($v_buffer); + unset($v_buffer); + if ($v_file_content === false) { - // ----- Look if the $p_archive is a string (so a filename) - else if (is_string($p_archive)) - { + // ----- Change the file status + // TBC + $p_entry['status'] = "error"; - // ----- Check that $p_archive is a valid zip file - // TBC : Should also check the archive format - if (!is_file($p_archive)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "No file with filename '".$p_archive."'"); - $v_result = PCLZIP_ERR_MISSING_FILE; - } - else { - // ----- Duplicate the archive - $v_result = $this->privDuplicate($p_archive); - } - } + return $v_result; + } - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : merge() - // Description : - // This method merge the $p_archive_to_add archive at the end of the current - // one ($this). - // If the archive ($this) does not exist, the merge becomes a duplicate. - // If the $p_archive_to_add archive does not exist, the merge is a success. - // Parameters : - // $p_archive_to_add : It can be directly the filename of a valid zip archive, - // or a PclZip object archive. - // Return Values : - // 1 on success, - // 0 or negative values on error (see below). - // -------------------------------------------------------------------------------- - function merge($p_archive_to_add) - { - $v_result = 1; - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Check archive - if (!$this->privCheckFormat()) { - return(0); - } + // ----- Change the file status + $p_entry['status'] = "write_error"; - // ----- Look if the $p_archive_to_add is a PclZip object - if ((is_object($p_archive_to_add)) && (get_class($p_archive_to_add) == 'pclzip')) - { + return $v_result; + } - // ----- Merge the archive - $v_result = $this->privMerge($p_archive_to_add); - } + // ----- Write the uncompressed data + @fwrite($v_dest_file, $v_file_content, $p_entry['size']); + unset($v_file_content); - // ----- Look if the $p_archive_to_add is a string (so a filename) - else if (is_string($p_archive_to_add)) - { + // ----- Closing the destination file + @fclose($v_dest_file); - // ----- Create a temporary archive - $v_object_archive = new PclZip($p_archive_to_add); + } - // ----- Merge the archive - $v_result = $this->privMerge($v_object_archive); - } + // ----- Change the file mtime + @touch($p_entry['filename'], $p_entry['mtime']); + } - // ----- Invalid variable - else - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid variable type p_archive_to_add"); - $v_result = PCLZIP_ERR_INVALID_PARAMETER; - } + // ----- Look for chmod option + if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- + // ----- Change the mode of the file + @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); + } + } + } + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - // -------------------------------------------------------------------------------- - // Function : errorCode() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorCode() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorCode()); - } - else { - return($this->error_code); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorName() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorName($p_with_code = false) - { - $v_name = array ( PCLZIP_ERR_NO_ERROR => 'PCLZIP_ERR_NO_ERROR', - PCLZIP_ERR_WRITE_OPEN_FAIL => 'PCLZIP_ERR_WRITE_OPEN_FAIL', - PCLZIP_ERR_READ_OPEN_FAIL => 'PCLZIP_ERR_READ_OPEN_FAIL', - PCLZIP_ERR_INVALID_PARAMETER => 'PCLZIP_ERR_INVALID_PARAMETER', - PCLZIP_ERR_MISSING_FILE => 'PCLZIP_ERR_MISSING_FILE', - PCLZIP_ERR_FILENAME_TOO_LONG => 'PCLZIP_ERR_FILENAME_TOO_LONG', - PCLZIP_ERR_INVALID_ZIP => 'PCLZIP_ERR_INVALID_ZIP', - PCLZIP_ERR_BAD_EXTRACTED_FILE => 'PCLZIP_ERR_BAD_EXTRACTED_FILE', - PCLZIP_ERR_DIR_CREATE_FAIL => 'PCLZIP_ERR_DIR_CREATE_FAIL', - PCLZIP_ERR_BAD_EXTENSION => 'PCLZIP_ERR_BAD_EXTENSION', - PCLZIP_ERR_BAD_FORMAT => 'PCLZIP_ERR_BAD_FORMAT', - PCLZIP_ERR_DELETE_FILE_FAIL => 'PCLZIP_ERR_DELETE_FILE_FAIL', - PCLZIP_ERR_RENAME_FILE_FAIL => 'PCLZIP_ERR_RENAME_FILE_FAIL', - PCLZIP_ERR_BAD_CHECKSUM => 'PCLZIP_ERR_BAD_CHECKSUM', - PCLZIP_ERR_INVALID_ARCHIVE_ZIP => 'PCLZIP_ERR_INVALID_ARCHIVE_ZIP', - PCLZIP_ERR_MISSING_OPTION_VALUE => 'PCLZIP_ERR_MISSING_OPTION_VALUE', - PCLZIP_ERR_INVALID_OPTION_VALUE => 'PCLZIP_ERR_INVALID_OPTION_VALUE', - PCLZIP_ERR_UNSUPPORTED_COMPRESSION => 'PCLZIP_ERR_UNSUPPORTED_COMPRESSION', - PCLZIP_ERR_UNSUPPORTED_ENCRYPTION => 'PCLZIP_ERR_UNSUPPORTED_ENCRYPTION' - ,PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE => 'PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE' - ,PCLZIP_ERR_DIRECTORY_RESTRICTION => 'PCLZIP_ERR_DIRECTORY_RESTRICTION' - ); - - if (isset($v_name[$this->error_code])) { - $v_value = $v_name[$this->error_code]; - } - else { - $v_value = 'NoName'; - } + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - if ($p_with_code) { - return($v_value.' ('.$this->error_code.')'); - } - else { - return($v_value); - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : errorInfo() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function errorInfo($p_full = false) - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - return(PclErrorString()); - } - else { - if ($p_full) { - return($this->errorName(true)." : ".$this->error_string); - } - else { - return($this->error_string." [code ".$this->error_code."]"); - } - } - } - // -------------------------------------------------------------------------------- + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } -// -------------------------------------------------------------------------------- -// ***** UNDER THIS LINE ARE DEFINED PRIVATE INTERNAL FUNCTIONS ***** -// ***** ***** -// ***** THESES FUNCTIONS MUST NOT BE USED DIRECTLY ***** -// -------------------------------------------------------------------------------- + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileUsingTempFile() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileUsingTempFile(&$p_entry, &$p_options) { + $v_result = 1; + + // ----- Creates a temporary file + $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.gz'; + if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { + fclose($v_file); + PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, + 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary write mode'); + + return PclZip::errorCode(); + } + + + // ----- Write gz file format header + $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); + @fwrite($v_dest_file, $v_binary_data, 10); + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['compressed_size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Write gz file format footer + $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); + @fwrite($v_dest_file, $v_binary_data, 8); + + // ----- Close the temporary file + @fclose($v_dest_file); + + // ----- Opening destination file + if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { + $p_entry['status'] = "write_error"; + + return $v_result; + } + + // ----- Open the temporary gz file + if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { + @fclose($v_dest_file); + $p_entry['status'] = "read_error"; + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open temporary file \'' . $v_gzip_temp_name . '\' in binary read mode'); + + return PclZip::errorCode(); + } + + + // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks + $v_size = $p_entry['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($v_src_file, $v_read_size); + //$v_binary_data = pack('a'.$v_read_size, $v_buffer); + @fwrite($v_dest_file, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + @fclose($v_dest_file); + @gzclose($v_src_file); + + // ----- Delete the temporary file + @unlink($v_gzip_temp_name); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileInOutput() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileInOutput(&$p_entry, &$p_options) { + $v_result = 1; + + // ----- Read the file header + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + // ----- Trace + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) { + // ----- Look for not compressed file + if ($p_entry['compressed_size'] == $p_entry['size']) { + + // ----- Read the file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Send the file to the output + echo $v_buffer; + unset($v_buffer); + } else { + + // ----- Read the compressed file in a buffer (one shot) + $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + $v_file_content = gzinflate($v_buffer); + unset($v_buffer); + + // ----- Send the file to the output + echo $v_file_content; + unset($v_file_content); + } + } + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privExtractFileAsString() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) { + $v_result = 1; + + // ----- Read the file header + $v_header = array(); + if (($v_result = $this->privReadFileHeader($v_header)) != 1) { + // ----- Return + return $v_result; + } + + + // ----- Check that the file header is coherent with $p_entry info + if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { + // TBC + } + + // ----- Look for pre-extract callback + if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); + if ($v_result == 0) { + // ----- Change the file status + $p_entry['status'] = "skipped"; + $v_result = 1; + } + + // ----- Look for abort result + if ($v_result == 2) { + // ----- This status is internal and will be changed in 'skipped' + $p_entry['status'] = "aborted"; + $v_result = PCLZIP_ERR_USER_ABORTED; + } + + // ----- Update the informations + // Only some fields can be modified + $p_entry['filename'] = $v_local_header['filename']; + } + + + // ----- Look if extraction should be done + if ($p_entry['status'] == 'ok') { + + // ----- Do the extraction (if not a folder) + if (!(($p_entry['external'] & 0x00000010) == 0x00000010)) { + // ----- Look for not compressed file + // if ($p_entry['compressed_size'] == $p_entry['size']) + if ($p_entry['compression'] == 0) { + + // ----- Reading the file + $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); + } else { + + // ----- Reading the file + $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); + + // ----- Decompress the file + if (($p_string = @gzinflate($v_data)) === false) { + // TBC + } + } + + // ----- Trace + } else { + // TBC : error : can not extract a folder in a string + } + + } + + // ----- Change abort status + if ($p_entry['status'] == "aborted") { + $p_entry['status'] = "skipped"; + } // ----- Look for post-extract callback + elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { + + // ----- Generate a local information + $v_local_header = array(); + $this->privConvertHeader2FileInfo($p_entry, $v_local_header); + + // ----- Swap the content to header + $v_local_header['content'] = $p_string; + $p_string = ''; + + // ----- Call the callback + // Here I do not use call_user_func() because I need to send a reference to the + // header. +// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); + $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - // -------------------------------------------------------------------------------- - // Function : privCheckFormat() - // Description : - // This method check that the archive exists and is a valid zip archive. - // Several level of check exists. (futur) - // Parameters : - // $p_level : Level of check. Default 0. - // 0 : Check the first bytes (magic codes) (default value)) - // 1 : 0 + Check the central directory (futur) - // 2 : 1 + Check each file header (futur) - // Return Values : - // true on success, - // false on error, the error code is set. - // -------------------------------------------------------------------------------- - function privCheckFormat($p_level = 0) - { - $v_result = true; - - // ----- Reset the file system cache - clearstatcache(); - - // ----- Reset the error handler - $this->privErrorReset(); - - // ----- Look if the file exits - if (!is_file($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "Missing archive file '".$this->zipname."'"); - return(false); - } + // ----- Swap back the content to header + $p_string = $v_local_header['content']; + unset($v_local_header['content']); - // ----- Check that the file is readeable - if (!is_readable($this->zipname)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to read archive '".$this->zipname."'"); - return(false); - } + // ----- Look for abort result + if ($v_result == 2) { + $v_result = PCLZIP_ERR_USER_ABORTED; + } + } - // ----- Check the magic code - // TBC - - // ----- Check the central header - // TBC - - // ----- Check each file header - // TBC - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privParseOptions() - // Description : - // This internal methods reads the variable list of arguments ($p_options_list, - // $p_size) and generate an array with the options and values ($v_result_list). - // $v_requested_options contains the options that can be present and those that - // must be present. - // $v_requested_options is an array, with the option value as key, and 'optional', - // or 'mandatory' as value. - // Parameters : - // See above. - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privParseOptions(&$p_options_list, $p_size, &$v_result_list, $v_requested_options = false) - { - $v_result=1; - - // ----- Read the options - $i=0; - while ($i<$p_size) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$p_options_list[$i]])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid optional parameter '".$p_options_list[$i]."' for this method"); - - // ----- Return - return PclZip::errorCode(); - } + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadFileHeader(&$p_header) { + $v_result = 1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x04034b50) { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 26); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 26) { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : " . strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', + $v_binary_data); + + // ----- Get filename + $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); + + // ----- Get extra_fields + if ($v_data['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); + } else { + $p_header['extra'] = ''; + } + + // ----- Extract properties + $p_header['version_extracted'] = $v_data['version']; + $p_header['compression'] = $v_data['compression']; + $p_header['size'] = $v_data['size']; + $p_header['compressed_size'] = $v_data['compressed_size']; + $p_header['crc'] = $v_data['crc']; + $p_header['flag'] = $v_data['flag']; + $p_header['filename_len'] = $v_data['filename_len']; + + // ----- Recuperate date in UNIX format + $p_header['mdate'] = $v_data['mdate']; + $p_header['mtime'] = $v_data['mtime']; + if ($p_header['mdate'] && $p_header['mtime']) { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9)+1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } else { + $p_header['mtime'] = time(); + } + + // TBC + //for(reset($v_data); $key = key($v_data); next($v_data)) { + //} + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set the status field + $p_header['status'] = "ok"; + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadCentralFileHeader() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadCentralFileHeader(&$p_header) { + $v_result = 1; + + // ----- Read the 4 bytes signature + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] != 0x02014b50) { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the first 42 bytes of the header + $v_binary_data = fread($this->zip_fd, 42); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 42) { + $p_header['filename'] = ""; + $p_header['status'] = "invalid_header"; + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : " . strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', + $v_binary_data); + + // ----- Get filename + if ($p_header['filename_len'] != 0) { + $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); + } else { + $p_header['filename'] = ''; + } + + // ----- Get extra + if ($p_header['extra_len'] != 0) { + $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); + } else { + $p_header['extra'] = ''; + } + + // ----- Get comment + if ($p_header['comment_len'] != 0) { + $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); + } else { + $p_header['comment'] = ''; + } + + // ----- Extract properties + + // ----- Recuperate date in UNIX format + //if ($p_header['mdate'] && $p_header['mtime']) + // TBC : bug : this was ignoring time with 0/0/0 + if (1) { + // ----- Extract time + $v_hour = ($p_header['mtime'] & 0xF800) >> 11; + $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; + $v_seconde = ($p_header['mtime'] & 0x001F)*2; + + // ----- Extract date + $v_year = (($p_header['mdate'] & 0xFE00) >> 9)+1980; + $v_month = ($p_header['mdate'] & 0x01E0) >> 5; + $v_day = $p_header['mdate'] & 0x001F; + + // ----- Get UNIX date format + $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); + + } else { + $p_header['mtime'] = time(); + } + + // ----- Set the stored filename + $p_header['stored_filename'] = $p_header['filename']; + + // ----- Set default status to ok + $p_header['status'] = 'ok'; + + // ----- Look if it is a directory + if (substr($p_header['filename'], -1) == '/') { + //$p_header['external'] = 0x41FF0010; + $p_header['external'] = 0x00000010; + } + + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privCheckFileHeaders() + // Description : + // Parameters : + // Return Values : + // 1 on success, + // 0 on error; + // -------------------------------------------------------------------------------- + function privCheckFileHeaders(&$p_local_header, &$p_central_header) { + $v_result = 1; + + // ----- Check the static values + // TBC + if ($p_local_header['filename'] != $p_central_header['filename']) { + } + if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { + } + if ($p_local_header['flag'] != $p_central_header['flag']) { + } + if ($p_local_header['compression'] != $p_central_header['compression']) { + } + if ($p_local_header['mtime'] != $p_central_header['mtime']) { + } + if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { + } + + // ----- Look for flag bit 3 + if (($p_local_header['flag'] & 8) == 8) { + $p_local_header['size'] = $p_central_header['size']; + $p_local_header['compressed_size'] = $p_central_header['compressed_size']; + $p_local_header['crc'] = $p_central_header['crc']; + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privReadEndCentralDir() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privReadEndCentralDir(&$p_central_dir) { + $v_result = 1; + + // ----- Go to the end of the zip file + $v_size = filesize($this->zipname); + @fseek($this->zip_fd, $v_size); + if (@ftell($this->zip_fd) != $v_size) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \'' . $this->zipname . '\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- First try : look if this is an archive with no commentaries (most of the time) + // in this case the end of central dir is at 22 bytes of the file end + $v_found = 0; + if ($v_size > 26) { + @fseek($this->zip_fd, $v_size-22); + if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'Unable to seek back to the middle of the archive \'' . $this->zipname . '\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read for bytes + $v_binary_data = @fread($this->zip_fd, 4); + $v_data = @unpack('Vid', $v_binary_data); + + // ----- Check signature + if ($v_data['id'] == 0x06054b50) { + $v_found = 1; + } + + $v_pos = ftell($this->zip_fd); + } + + // ----- Go back to the maximum possible size of the Central Dir End Record + if (!$v_found) { + $v_maximum_size = 65557; // 0xFFFF + 22; + if ($v_maximum_size > $v_size) { + $v_maximum_size = $v_size; + } + @fseek($this->zip_fd, $v_size-$v_maximum_size); + if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'Unable to seek back to the middle of the archive \'' . $this->zipname . '\''); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read byte per byte in order to find the signature + $v_pos = ftell($this->zip_fd); + $v_bytes = 0x00000000; + while ($v_pos < $v_size) { + // ----- Read a byte + $v_byte = @fread($this->zip_fd, 1); + + // ----- Add the byte + //$v_bytes = ($v_bytes << 8) | Ord($v_byte); + // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number + // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. + $v_bytes = (($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); + + // ----- Compare the bytes + if ($v_bytes == 0x504b0506) { + $v_pos++; + break; + } + + $v_pos++; + } + + // ----- Look if not found end of central dir + if ($v_pos == $v_size) { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Read the first 18 bytes of the header + $v_binary_data = fread($this->zip_fd, 18); + + // ----- Look for invalid block size + if (strlen($v_binary_data) != 18) { + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : " . strlen($v_binary_data)); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Extract the values + $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); + + // ----- Check the global size + if (($v_pos+$v_data['comment_size']+18) != $v_size) { + + // ----- Removed in release 2.2 see readme file + // The check of the file size is a little too strict. + // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. + // While decrypted, zip has training 0 bytes + if (0) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, + 'The central dir is not at the end of the archive.' + . ' Some trailing bytes exists after the archive.'); + + // ----- Return + return PclZip::errorCode(); + } + } + + // ----- Get comment + if ($v_data['comment_size'] != 0) { + $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); + } else { + $p_central_dir['comment'] = ''; + } + + $p_central_dir['entries'] = $v_data['entries']; + $p_central_dir['disk_entries'] = $v_data['disk_entries']; + $p_central_dir['offset'] = $v_data['offset']; + $p_central_dir['size'] = $v_data['size']; + $p_central_dir['disk'] = $v_data['disk']; + $p_central_dir['disk_start'] = $v_data['disk_start']; + + // TBC + //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { + //} + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDeleteByRule() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDeleteByRule(&$p_result_list, &$p_options) { + $v_result = 1; + $v_list_detail = array(); + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Scan all the files + // ----- Start at beginning of Central Dir + $v_pos_entry = $v_central_dir['offset']; + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_pos_entry)) { + // ----- Close the zip file + $this->privCloseFd(); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read each entry + $v_header_list = array(); + $j_start = 0; + for ($i = 0, $v_nb_extracted = 0; $i < $v_central_dir['entries']; $i++) { + + // ----- Read the file header + $v_header_list[$v_nb_extracted] = array(); + if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + + return $v_result; + } + + + // ----- Store the index + $v_header_list[$v_nb_extracted]['index'] = $i; + + // ----- Look for the specific extract rules + $v_found = false; + + // ----- Look for extract by name rule + if ((isset($p_options[PCLZIP_OPT_BY_NAME])) + && ($p_options[PCLZIP_OPT_BY_NAME] != 0) + ) { + + // ----- Look if the filename is in the list + for ($j = 0; ($j < sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) { + + // ----- Look for a directory + if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { + + // ----- Look if the directory is in the filename path + if ((strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) + && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, + strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j]) + ) { + $v_found = true; + } elseif ((($v_header_list[$v_nb_extracted]['external'] & 0x00000010) == 0x00000010) /* Indicates a folder */ + && ($v_header_list[$v_nb_extracted]['stored_filename'] . '/' == $p_options[PCLZIP_OPT_BY_NAME][$j]) + ) { + $v_found = true; + } + } // ----- Look for a filename + elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { + $v_found = true; + } + } + } + + // ----- Look for extract by ereg rule + // ereg() is deprecated with PHP 5.3 + /* + else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) + && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - // ----- Look for next option - switch ($p_options_list[$i]) { - // ----- Look for options that request a path value - case PCLZIP_OPT_PATH : - case PCLZIP_OPT_REMOVE_PATH : - case PCLZIP_OPT_ADD_PATH : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); + if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; } + } + */ - // ----- Get the value - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - break; - - case PCLZIP_OPT_TEMP_FILE_THRESHOLD : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } - - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - // ----- Check the value - $v_value = $p_options_list[$i+1]; - if ((!is_integer($v_value)) || ($v_value<0)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Integer expected for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - return PclZip::errorCode(); - } + // ----- Look for extract by preg rule + else { + if ((isset($p_options[PCLZIP_OPT_BY_PREG])) + && ($p_options[PCLZIP_OPT_BY_PREG] != "") + ) { + + if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { + $v_found = true; + } + } // ----- Look for extract by index rule + else { + if ((isset($p_options[PCLZIP_OPT_BY_INDEX])) + && ($p_options[PCLZIP_OPT_BY_INDEX] != 0) + ) { + + // ----- Look if the index is in the list + for ($j = $j_start; ($j < sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) { + + if (($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i <= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { + $v_found = true; + } + if ($i >= $p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { + $j_start = $j+1; + } + + if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start'] > $i) { + break; + } + } + } else { + $v_found = true; + } + } + } + + // ----- Look for deletion + if ($v_found) { + unset($v_header_list[$v_nb_extracted]); + } else { + $v_nb_extracted++; + } + } + + // ----- Look if something need to be deleted + if ($v_nb_extracted > 0) { + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp'; + + // ----- Creates a temporary zip archive + $v_temp_zip = new PclZip($v_zip_temp_name); + + // ----- Open the temporary zip file in write mode + if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Look which file need to be kept + for ($i = 0; $i < sizeof($v_header_list); $i++) { + + // ----- Calculate the position of the header + @rewind($this->zip_fd); + if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Read the file header + $v_local_header = array(); + if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Check that local file header is same as central file header + if ($this->privCheckFileHeaders($v_local_header, + $v_header_list[$i]) != 1 + ) { + // TBC + } + unset($v_local_header); + + // ----- Write the file header + if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Read/write the data block + if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, + $v_header_list[$i]['compressed_size'])) != 1 + ) { + // ----- Close the zip file + $this->privCloseFd(); + $v_temp_zip->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_temp_zip->zip_fd); + + // ----- Re-Create the Central Dir files header + for ($i = 0; $i < sizeof($v_header_list); $i++) { + // ----- Create the file header + if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) { + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Transform the header to a 'usable' info + $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); + } + + + // ----- Zip file comment + $v_comment = ''; + if (isset($p_options[PCLZIP_OPT_COMMENT])) { + $v_comment = $p_options[PCLZIP_OPT_COMMENT]; + } + + // ----- Calculate the size of the central header + $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; + + // ----- Create the central dir footer + if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, + $v_comment)) != 1 + ) { + // ----- Reset the file list + unset($v_header_list); + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + @unlink($v_zip_temp_name); + + // ----- Return + return $v_result; + } + + // ----- Close + $v_temp_zip->privCloseFd(); + $this->privCloseFd(); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Destroy the temporary archive + unset($v_temp_zip); + } // ----- Remove every files : reset the file + else { + if ($v_central_dir['entries'] != 0) { + $this->privCloseFd(); + + if (($v_result = $this->privOpenFd('wb')) != 1) { + return $v_result; + } + + if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { + return $v_result; + } + + $this->privCloseFd(); + } + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDirCheck() + // Description : + // Check if a directory exists, if not it creates it and all the parents directory + // which may be useful. + // Parameters : + // $p_dir : Directory path to check. + // Return Values : + // 1 : OK + // -1 : Unable to create directory + // -------------------------------------------------------------------------------- + function privDirCheck($p_dir, $p_is_dir = false) { + $v_result = 1; + + + // ----- Remove the final '/' + if (($p_is_dir) && (substr($p_dir, -1) == '/')) { + $p_dir = substr($p_dir, 0, strlen($p_dir)-1); + } + + // ----- Check the directory availability + if ((is_dir($p_dir)) || ($p_dir == "")) { + return 1; + } + + // ----- Extract parent directory + $p_parent_dir = dirname($p_dir); + + // ----- Just a check + if ($p_parent_dir != $p_dir) { + // ----- Look for parent directory + if ($p_parent_dir != "") { + if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) { + return $v_result; + } + } + } + + // ----- Create the directory + if (!@mkdir($p_dir, 0777)) { + // ----- Error log + PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privMerge() + // Description : + // If $p_archive_to_add does not exist, the function exit with a success result. + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privMerge(&$p_archive_to_add) { + $v_result = 1; + + // ----- Look if the archive_to_add exists + if (!is_file($p_archive_to_add->zipname)) { + + // ----- Nothing to merge, so merge is a success + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Look if the archive exists + if (!is_file($this->zipname)) { + + // ----- Do a duplicate + $v_result = $this->privDuplicate($p_archive_to_add->zipname); + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('rb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir = array(); + if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) { + $this->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($this->zip_fd); + + // ----- Open the archive_to_add file + if (($v_result = $p_archive_to_add->privOpenFd('rb')) != 1) { + $this->privCloseFd(); + + // ----- Return + return $v_result; + } + + // ----- Read the central directory informations + $v_central_dir_to_add = array(); + if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + return $v_result; + } + + // ----- Go to beginning of File + @rewind($p_archive_to_add->zip_fd); + + // ----- Creates a temporay file + $v_zip_temp_name = PCLZIP_TEMPORARY_DIR . uniqid('pclzip-') . '.tmp'; + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open temporary file \'' . $v_zip_temp_name . '\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = $v_central_dir['offset']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the files from the archive_to_add into the temporary file + $v_size = $v_central_dir_to_add['offset']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Store the offset of the central dir + $v_offset = @ftell($v_zip_temp_fd); + + // ----- Copy the block of file headers from the old archive + $v_size = $v_central_dir['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($this->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Copy the block of file headers from the archive_to_add + $v_size = $v_central_dir_to_add['size']; + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); + @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Merge the file comments + $v_comment = $v_central_dir['comment'] . ' ' . $v_central_dir_to_add['comment']; + + // ----- Calculate the size of the (new) central header + $v_size = @ftell($v_zip_temp_fd)-$v_offset; + + // ----- Swap the file descriptor + // Here is a trick : I swap the temporary fd with the zip fd, in order to use + // the following methods on the temporary fil and not the real archive fd + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Create the central dir footer + if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, + $v_offset, $v_comment)) != 1 + ) { + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + @fclose($v_zip_temp_fd); + $this->zip_fd = null; + + // ----- Reset the file list + unset($v_header_list); + + // ----- Return + return $v_result; + } + + // ----- Swap back the file descriptor + $v_swap = $this->zip_fd; + $this->zip_fd = $v_zip_temp_fd; + $v_zip_temp_fd = $v_swap; + + // ----- Close + $this->privCloseFd(); + $p_archive_to_add->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Delete the zip file + // TBC : I should test the result ... + @unlink($this->zipname); + + // ----- Rename the temporary file + // TBC : I should test the result ... + //@rename($v_zip_temp_name, $this->zipname); + PclZipUtilRename($v_zip_temp_name, $this->zipname); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDuplicate() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDuplicate($p_archive_filename) { + $v_result = 1; + + // ----- Look if the $p_archive_filename exists + if (!is_file($p_archive_filename)) { + + // ----- Nothing to duplicate, so duplicate is a success. + $v_result = 1; + + // ----- Return + return $v_result; + } + + // ----- Open the zip file + if (($v_result = $this->privOpenFd('wb')) != 1) { + // ----- Return + return $v_result; + } + + // ----- Open the temporary file in write mode + if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) { + $this->privCloseFd(); + + PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, + 'Unable to open archive file \'' . $p_archive_filename . '\' in binary write mode'); + + // ----- Return + return PclZip::errorCode(); + } + + // ----- Copy the files from the archive to the temporary file + // TBC : Here I should better append the file and go back to erase the central dir + $v_size = filesize($p_archive_filename); + while ($v_size != 0) { + $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = fread($v_zip_temp_fd, $v_read_size); + @fwrite($this->zip_fd, $v_buffer, $v_read_size); + $v_size -= $v_read_size; + } + + // ----- Close + $this->privCloseFd(); + + // ----- Close the temporary file + @fclose($v_zip_temp_fd); + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorLog() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorLog($p_error_code = 0, $p_error_string = '') { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclError($p_error_code, $p_error_string); + } else { + $this->error_code = $p_error_code; + $this->error_string = $p_error_string; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privErrorReset() + // Description : + // Parameters : + // -------------------------------------------------------------------------------- + function privErrorReset() { + if (PCLZIP_ERROR_EXTERNAL == 1) { + PclErrorReset(); + } else { + $this->error_code = 0; + $this->error_string = ''; + } + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privDisableMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privDisableMagicQuotes() { + $v_result = 1; + + // ----- Look if function exists + if ((!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime")) + ) { + return $v_result; + } + + // ----- Look if already done + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Get and memorize the magic_quote value + $this->magic_quotes_status = @get_magic_quotes_runtime(); + + // ----- Disable magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime(0); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- + + // -------------------------------------------------------------------------------- + // Function : privSwapBackMagicQuotes() + // Description : + // Parameters : + // Return Values : + // -------------------------------------------------------------------------------- + function privSwapBackMagicQuotes() { + $v_result = 1; + + // ----- Look if function exists + if ((!function_exists("get_magic_quotes_runtime")) + || (!function_exists("set_magic_quotes_runtime")) + ) { + return $v_result; + } + + // ----- Look if something to do + if ($this->magic_quotes_status != -1) { + return $v_result; + } + + // ----- Swap back magic_quotes + if ($this->magic_quotes_status == 1) { + @set_magic_quotes_runtime($this->magic_quotes_status); + } + + // ----- Return + return $v_result; + } + // -------------------------------------------------------------------------------- - // ----- Get the value (and convert it in bytes) - $v_result_list[$p_options_list[$i]] = $v_value*1048576; - $i++; - break; +} - case PCLZIP_OPT_TEMP_FILE_ON : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_OFF])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_OFF'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_TEMP_FILE_OFF : - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_ON])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_ON'"); - return PclZip::errorCode(); - } - // ----- Check for incompatible options - if (isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Option '".PclZipUtilOptionText($p_options_list[$i])."' can not be used with option 'PCLZIP_OPT_TEMP_FILE_THRESHOLD'"); - return PclZip::errorCode(); - } - - $v_result_list[$p_options_list[$i]] = true; - break; - - case PCLZIP_OPT_EXTRACT_DIR_RESTRICTION : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } +// End of class +// -------------------------------------------------------------------------------- - // ----- Get the value - if ( is_string($p_options_list[$i+1]) - && ($p_options_list[$i+1] != '')) { - $v_result_list[$p_options_list[$i]] = PclZipUtilTranslateWinPath($p_options_list[$i+1], FALSE); - $i++; - } - else { - } - break; +// -------------------------------------------------------------------------------- +// Function : PclZipUtilPathReduction() +// Description : +// Parameters : +// Return Values : +// -------------------------------------------------------------------------------- +function PclZipUtilPathReduction($p_dir) { + $v_result = ""; + + // ----- Look for not empty path + if ($p_dir != "") { + // ----- Explode path by directory names + $v_list = explode("/", $p_dir); + + // ----- Study directories from last to first + $v_skip = 0; + for ($i = sizeof($v_list)-1; $i >= 0; $i--) { + // ----- Look for current path + if ($v_list[$i] == ".") { + // ----- Ignore this directory + // Should be the first $i=0, but no check is done + } else { + if ($v_list[$i] == "..") { + $v_skip++; + } else { + if ($v_list[$i] == "") { + // ----- First '/' i.e. root slash + if ($i == 0) { + $v_result = "/" . $v_result; + if ($v_skip > 0) { + // ----- It is an invalid path, so the path is not modified + // TBC + $v_result = $p_dir; + $v_skip = 0; + } + } // ----- Last '/' i.e. indicates a directory + else { + if ($i == (sizeof($v_list)-1)) { + $v_result = $v_list[$i]; + } // ----- Double '/' inside the path + else { + // ----- Ignore only the double '//' in path, + // but not the first and last '/' + } + } + } else { + // ----- Look for item to skip + if ($v_skip > 0) { + $v_skip--; + } else { + $v_result = $v_list[$i] . ($i != (sizeof($v_list)-1) ? "/" . $v_result : ""); + } + } + } + } + } + + // ----- Look for skip + if ($v_skip > 0) { + while ($v_skip > 0) { + $v_result = '../' . $v_result; + $v_skip--; + } + } + } - // ----- Look for options that request an array of string for value - case PCLZIP_OPT_BY_NAME : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Return + return $v_result; +} - // ----- Return - return PclZip::errorCode(); - } +// -------------------------------------------------------------------------------- - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]][0] = $p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); +// -------------------------------------------------------------------------------- +// Function : PclZipUtilPathInclusion() +// Description : +// This function indicates if the path $p_path is under the $p_dir tree. Or, +// said in an other way, if the file or sub-dir $p_path is inside the dir +// $p_dir. +// The function indicates also if the path is exactly the same as the dir. +// This function supports path with duplicated '/' like '//', but does not +// support '.' or '..' statements. +// Parameters : +// Return Values : +// 0 if $p_path is not inside directory $p_dir +// 1 if $p_path is inside directory $p_dir +// 2 if $p_path is exactly the same as $p_dir +// -------------------------------------------------------------------------------- +function PclZipUtilPathInclusion($p_dir, $p_path) { + $v_result = 1; + + // ----- Look for path beginning by ./ + if (($p_dir == '.') + || ((strlen($p_dir) >= 2) && (substr($p_dir, 0, 2) == './')) + ) { + $p_dir = PclZipUtilTranslateWinPath(getcwd(), false) . '/' . substr($p_dir, 1); + } + if (($p_path == '.') + || ((strlen($p_path) >= 2) && (substr($p_path, 0, 2) == './')) + ) { + $p_path = PclZipUtilTranslateWinPath(getcwd(), false) . '/' . substr($p_path, 1); + } - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an EREG or PREG expression - case PCLZIP_OPT_BY_EREG : - // ereg() is deprecated starting with PHP 5.3. Move PCLZIP_OPT_BY_EREG - // to PCLZIP_OPT_BY_PREG - $p_options_list[$i] = PCLZIP_OPT_BY_PREG; - case PCLZIP_OPT_BY_PREG : - //case PCLZIP_OPT_CRYPT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } + // ----- Explode dir and path by directory separator + $v_list_dir = explode("/", $p_dir); + $v_list_dir_size = sizeof($v_list_dir); + $v_list_path = explode("/", $p_path); + $v_list_path_size = sizeof($v_list_path); + + // ----- Study directories paths + $i = 0; + $j = 0; + while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { + + // ----- Look for empty dir (path reduction) + if ($v_list_dir[$i] == '') { + $i++; + continue; + } + if ($v_list_path[$j] == '') { + $j++; + continue; + } + + // ----- Compare the items + if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ($v_list_path[$j] != '')) { + $v_result = 0; + } + + // ----- Next items + $i++; + $j++; + } - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Wrong parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + // ----- Look if everything seems to be the same + if ($v_result) { + // ----- Skip all the empty items + while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) { + $j++; + } + while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) { + $i++; + } + + if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { + // ----- There are exactly the same + $v_result = 2; + } else { + if ($i < $v_list_dir_size) { + // ----- The path is shorter than the dir + $v_result = 0; + } + } + } - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that takes a string - case PCLZIP_OPT_COMMENT : - case PCLZIP_OPT_ADD_COMMENT : - case PCLZIP_OPT_PREPEND_COMMENT : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, - "Missing parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } + // ----- Return + return $v_result; +} - // ----- Get the value - if (is_string($p_options_list[$i+1])) { - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, - "Wrong parameter value for option '" - .PclZipUtilOptionText($p_options_list[$i]) - ."'"); - - // ----- Return - return PclZip::errorCode(); - } - $i++; - break; - - // ----- Look for options that request an array of index - case PCLZIP_OPT_BY_INDEX : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } +// -------------------------------------------------------------------------------- - // ----- Get the value - $v_work_list = array(); - if (is_string($p_options_list[$i+1])) { +// -------------------------------------------------------------------------------- +// Function : PclZipUtilCopyBlock() +// Description : +// Parameters : +// $p_mode : read/write compression mode +// 0 : src & dest normal +// 1 : src gzip, dest normal +// 2 : src normal, dest gzip +// 3 : src & dest gzip +// Return Values : +// -------------------------------------------------------------------------------- +function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode = 0) { + $v_result = 1; + + if ($p_mode == 0) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } else { + if ($p_mode == 1) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @fwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } else { + if ($p_mode == 2) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @fread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } else { + if ($p_mode == 3) { + while ($p_size != 0) { + $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); + $v_buffer = @gzread($p_src, $v_read_size); + @gzwrite($p_dest, $v_buffer, $v_read_size); + $p_size -= $v_read_size; + } + } + } + } + } - // ----- Remove spaces - $p_options_list[$i+1] = strtr($p_options_list[$i+1], ' ', ''); + // ----- Return + return $v_result; +} - // ----- Parse items - $v_work_list = explode(",", $p_options_list[$i+1]); - } - else if (is_integer($p_options_list[$i+1])) { - $v_work_list[0] = $p_options_list[$i+1].'-'.$p_options_list[$i+1]; - } - else if (is_array($p_options_list[$i+1])) { - $v_work_list = $p_options_list[$i+1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Value must be integer, string or array for option '".PclZipUtilOptionText($p_options_list[$i])."'"); +// -------------------------------------------------------------------------------- - // ----- Return - return PclZip::errorCode(); - } - - // ----- Reduce the index list - // each index item in the list must be a couple with a start and - // an end value : [0,3], [5-5], [8-10], ... - // ----- Check the format of each item - $v_sort_flag=false; - $v_sort_value=0; - for ($j=0; $j<sizeof($v_work_list); $j++) { - // ----- Explode the item - $v_item_list = explode("-", $v_work_list[$j]); - $v_size_item_list = sizeof($v_item_list); - - // ----- TBC : Here we might check that each item is a - // real integer ... - - // ----- Look for single value - if ($v_size_item_list == 1) { - // ----- Set the option value - $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; - $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[0]; - } - elseif ($v_size_item_list == 2) { - // ----- Set the option value - $v_result_list[$p_options_list[$i]][$j]['start'] = $v_item_list[0]; - $v_result_list[$p_options_list[$i]][$j]['end'] = $v_item_list[1]; - } - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Too many values in index range for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - - - // ----- Look for list sort - if ($v_result_list[$p_options_list[$i]][$j]['start'] < $v_sort_value) { - $v_sort_flag=true; - - // ----- TBC : An automatic sort should be writen ... - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Invalid order of index range for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } - $v_sort_value = $v_result_list[$p_options_list[$i]][$j]['start']; - } - - // ----- Sort the items - if ($v_sort_flag) { - // TBC : To Be Completed - } +// -------------------------------------------------------------------------------- +// Function : PclZipUtilRename() +// Description : +// This function tries to do a simple rename() function. If it fails, it +// tries to copy the $p_src file in a new $p_dest file and then unlink the +// first one. +// Parameters : +// $p_src : Old filename +// $p_dest : New filename +// Return Values : +// 1 on success, 0 on failure. +// -------------------------------------------------------------------------------- +function PclZipUtilRename($p_src, $p_dest) { + $v_result = 1; + + // ----- Try to rename the files + if (!@rename($p_src, $p_dest)) { + + // ----- Try to copy & unlink the src + if (!@copy($p_src, $p_dest)) { + $v_result = 0; + } else { + if (!@unlink($p_src)) { + $v_result = 0; + } + } + } - // ----- Next option - $i++; - break; - - // ----- Look for options that request no value - case PCLZIP_OPT_REMOVE_ALL_PATH : - case PCLZIP_OPT_EXTRACT_AS_STRING : - case PCLZIP_OPT_NO_COMPRESSION : - case PCLZIP_OPT_EXTRACT_IN_OUTPUT : - case PCLZIP_OPT_REPLACE_NEWER : - case PCLZIP_OPT_STOP_ON_ERROR : - $v_result_list[$p_options_list[$i]] = true; - break; - - // ----- Look for options that request an octal value - case PCLZIP_OPT_SET_CHMOD : - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); - - // ----- Return - return PclZip::errorCode(); - } + // ----- Return + return $v_result; +} - // ----- Get the value - $v_result_list[$p_options_list[$i]] = $p_options_list[$i+1]; - $i++; - break; - - // ----- Look for options that request a call-back - case PCLZIP_CB_PRE_EXTRACT : - case PCLZIP_CB_POST_EXTRACT : - case PCLZIP_CB_PRE_ADD : - case PCLZIP_CB_POST_ADD : - /* for futur use - case PCLZIP_CB_PRE_DELETE : - case PCLZIP_CB_POST_DELETE : - case PCLZIP_CB_PRE_LIST : - case PCLZIP_CB_POST_LIST : - */ - // ----- Check the number of parameters - if (($i+1) >= $p_size) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_OPTION_VALUE, "Missing parameter value for option '".PclZipUtilOptionText($p_options_list[$i])."'"); +// -------------------------------------------------------------------------------- - // ----- Return - return PclZip::errorCode(); - } +// -------------------------------------------------------------------------------- +// Function : PclZipUtilOptionText() +// Description : +// Translate option value in text. Mainly for debug purpose. +// Parameters : +// $p_option : the option value. +// Return Values : +// The option text value. +// -------------------------------------------------------------------------------- +function PclZipUtilOptionText($p_option) { + + $v_list = get_defined_constants(); + for (reset($v_list); $v_key = key($v_list); next($v_list)) { + $v_prefix = substr($v_key, 0, 10); + if ((($v_prefix == 'PCLZIP_OPT') + || ($v_prefix == 'PCLZIP_CB_') + || ($v_prefix == 'PCLZIP_ATT')) + && ($v_list[$v_key] == $p_option) + ) { + return $v_key; + } + } - // ----- Get the value - $v_function_name = $p_options_list[$i+1]; + $v_result = 'Unknown'; - // ----- Check that the value is a valid existing function - if (!function_exists($v_function_name)) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_OPTION_VALUE, "Function '".$v_function_name."()' is not an existing function for option '".PclZipUtilOptionText($p_options_list[$i])."'"); + return $v_result; +} - // ----- Return - return PclZip::errorCode(); - } +// -------------------------------------------------------------------------------- - // ----- Set the attribute - $v_result_list[$p_options_list[$i]] = $v_function_name; - $i++; - break; +// -------------------------------------------------------------------------------- +// Function : PclZipUtilTranslateWinPath() +// Description : +// Translate windows path by replacing '\' by '/' and optionally removing +// drive letter. +// Parameters : +// $p_path : path to translate. +// $p_remove_disk_letter : true | false +// Return Values : +// The path translated. +// -------------------------------------------------------------------------------- +function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter = true) { + if (_OS_SERVEUR == 'windows' OR stristr(@php_uname(), 'windows')) { + // ----- Look for potential disk letter + if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { + $p_path = substr($p_path, $v_position+1); + } + // ----- Change potential windows directory separator + if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0, 1) == '\\')) { + $p_path = strtr($p_path, '\\', '/'); + } + } - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '" - .$p_options_list[$i]."'"); + return $p_path; +} - // ----- Return - return PclZip::errorCode(); - } - - // ----- Next options - $i++; - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($v_result_list[$key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - - // ----- Return - return PclZip::errorCode(); - } - } - } - } - - // ----- Look for default values - if (!isset($v_result_list[PCLZIP_OPT_TEMP_FILE_THRESHOLD])) { - - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOptionDefaultThreshold() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privOptionDefaultThreshold(&$p_options) - { - $v_result=1; - - if (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - || isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) { - return $v_result; - } - - // ----- Get 'memory_limit' configuration value - $v_memory_limit = ini_get('memory_limit'); - $v_memory_limit = trim($v_memory_limit); - $last = strtolower(substr($v_memory_limit, -1)); - - if($last == 'g') - //$v_memory_limit = $v_memory_limit*1024*1024*1024; - $v_memory_limit = $v_memory_limit*1073741824; - if($last == 'm') - //$v_memory_limit = $v_memory_limit*1024*1024; - $v_memory_limit = $v_memory_limit*1048576; - if($last == 'k') - $v_memory_limit = $v_memory_limit*1024; - - $p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] = floor($v_memory_limit*PCLZIP_TEMPORARY_FILE_RATIO); - - - // ----- Sanity check : No threshold if value lower than 1M - if ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] < 1048576) { - unset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrParseAtt() - // Description : - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrParseAtt(&$p_file_list, &$p_filedescr, $v_options, $v_requested_options = false) - { - $v_result=1; - - // ----- For each file in the list check the attributes - foreach ($p_file_list as $v_key => $v_value) { - - // ----- Check if the option is supported - if (!isset($v_requested_options[$v_key])) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file attribute '".$v_key."' for this file"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for attribute - switch ($v_key) { - case PCLZIP_ATT_FILE_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['filename'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['filename'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - break; - - case PCLZIP_ATT_FILE_NEW_SHORT_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_short_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_short_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty short filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - case PCLZIP_ATT_FILE_NEW_FULL_NAME : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['new_full_name'] = PclZipUtilPathReduction($v_value); - - if ($p_filedescr['new_full_name'] == '') { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid empty full filename for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - break; - - // ----- Look for options that takes a string - case PCLZIP_ATT_FILE_COMMENT : - if (!is_string($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". String expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['comment'] = $v_value; - break; - - case PCLZIP_ATT_FILE_MTIME : - if (!is_integer($v_value)) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ATTRIBUTE_VALUE, "Invalid type ".gettype($v_value).". Integer expected for attribute '".PclZipUtilOptionText($v_key)."'"); - return PclZip::errorCode(); - } - - $p_filedescr['mtime'] = $v_value; - break; - - case PCLZIP_ATT_FILE_CONTENT : - $p_filedescr['content'] = $v_value; - break; - - default : - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, - "Unknown parameter '".$v_key."'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for mandatory options - if ($v_requested_options !== false) { - for ($key=reset($v_requested_options); $key=key($v_requested_options); $key=next($v_requested_options)) { - // ----- Look for mandatory option - if ($v_requested_options[$key] == 'mandatory') { - // ----- Look if present - if (!isset($p_file_list[$key])) { - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Missing mandatory parameter ".PclZipUtilOptionText($key)."(".$key.")"); - return PclZip::errorCode(); - } - } - } - } - - // end foreach - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privFileDescrExpand() - // Description : - // This method look for each item of the list to see if its a file, a folder - // or a string to be added as file. For any other type of files (link, other) - // just ignore the item. - // Then prepare the information that will be stored for that file. - // When its a folder, expand the folder with all the files that are in that - // folder (recursively). - // Parameters : - // Return Values : - // 1 on success. - // 0 on failure. - // -------------------------------------------------------------------------------- - function privFileDescrExpand(&$p_filedescr_list, &$p_options) - { - $v_result=1; - - // ----- Create a result list - $v_result_list = array(); - - // ----- Look each entry - for ($i=0; $i<sizeof($p_filedescr_list); $i++) { - - // ----- Get filedescr - $v_descr = $p_filedescr_list[$i]; - - // ----- Reduce the filename - $v_descr['filename'] = PclZipUtilTranslateWinPath($v_descr['filename'], false); - $v_descr['filename'] = PclZipUtilPathReduction($v_descr['filename']); - - // ----- Look for real file or folder - if (file_exists($v_descr['filename'])) { - if (@is_file($v_descr['filename'])) { - $v_descr['type'] = 'file'; - } - else if (@is_dir($v_descr['filename'])) { - $v_descr['type'] = 'folder'; - } - else if (@is_link($v_descr['filename'])) { - // skip - continue; - } - else { - // skip - continue; - } - } - - // ----- Look for string added as file - else if (isset($v_descr['content'])) { - $v_descr['type'] = 'virtual_file'; - } - - // ----- Missing file - else { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$v_descr['filename']."' does not exist"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Calculate the stored filename - $this->privCalculateStoredFilename($v_descr, $p_options); - - // ----- Add the descriptor in result list - $v_result_list[sizeof($v_result_list)] = $v_descr; - - // ----- Look for folder - if ($v_descr['type'] == 'folder') { - // ----- List of items in folder - $v_dirlist_descr = array(); - $v_dirlist_nb = 0; - if ($v_folder_handler = @opendir($v_descr['filename'])) { - while (($v_item_handler = @readdir($v_folder_handler)) !== false) { - - // ----- Skip '.' and '..' - if (($v_item_handler == '.') || ($v_item_handler == '..')) { - continue; - } - - // ----- Compose the full filename - $v_dirlist_descr[$v_dirlist_nb]['filename'] = $v_descr['filename'].'/'.$v_item_handler; - - // ----- Look for different stored filename - // Because the name of the folder was changed, the name of the - // files/sub-folders also change - if (($v_descr['stored_filename'] != $v_descr['filename']) - && (!isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]))) { - if ($v_descr['stored_filename'] != '') { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_descr['stored_filename'].'/'.$v_item_handler; - } - else { - $v_dirlist_descr[$v_dirlist_nb]['new_full_name'] = $v_item_handler; - } - } - - $v_dirlist_nb++; - } - - @closedir($v_folder_handler); - } - else { - // TBC : unable to open folder in read mode - } - - // ----- Expand each element of the list - if ($v_dirlist_nb != 0) { - // ----- Expand - if (($v_result = $this->privFileDescrExpand($v_dirlist_descr, $p_options)) != 1) { - return $v_result; - } - - // ----- Concat the resulting list - $v_result_list = array_merge($v_result_list, $v_dirlist_descr); - } - else { - } - - // ----- Free local array - unset($v_dirlist_descr); - } - } - - // ----- Get the result list - $p_filedescr_list = $v_result_list; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCreate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCreate($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the file in write mode - if (($v_result = $this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Add the list of files - $v_result = $this->privAddList($p_filedescr_list, $p_result_list, $p_options); - - // ----- Close - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAdd() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAdd($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Look if the archive exists or is empty - if ((!is_file($this->zipname)) || (filesize($this->zipname) == 0)) - { - - // ----- Do a create - $v_result = $this->privCreate($p_filedescr_list, $p_result_list, $p_options); - - // ----- Return - return $v_result; - } - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Create the Central Dir files header - for ($i=0, $v_count=0; $i<sizeof($v_header_list); $i++) - { - // ----- Create the file header - if ($v_header_list[$i]['status'] == 'ok') { - if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { - fclose($v_zip_temp_fd); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = $v_central_dir['comment']; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_ADD_COMMENT])) { - $v_comment = $v_comment.$p_options[PCLZIP_OPT_ADD_COMMENT]; - } - if (isset($p_options[PCLZIP_OPT_PREPEND_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_PREPEND_COMMENT].$v_comment; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count+$v_central_dir['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privOpenFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privOpenFd($p_mode) - { - $v_result=1; - - // ----- Look if already open - if ($this->zip_fd != 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Zip file \''.$this->zipname.'\' already open'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, $p_mode)) == 0) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in '.$p_mode.' mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCloseFd() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privCloseFd() - { - $v_result=1; - - if ($this->zip_fd != 0) - @fclose($this->zip_fd); - $this->zip_fd = 0; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddList() - // Description : - // $p_add_dir and $p_remove_dir will give the ability to memorize a path which is - // different from the real path of the file. This is usefull if you want to have PclTar - // running in any directory, and memorize relative path from an other directory. - // Parameters : - // $p_list : An array containing the file or directory names to add in the tar - // $p_result_list : list of added files with their properties (specially the status field) - // $p_add_dir : Path to add in the filename path archived - // $p_remove_dir : Path to remove in the filename path archived - // Return Values : - // -------------------------------------------------------------------------------- -// function privAddList($p_list, &$p_result_list, $p_add_dir, $p_remove_dir, $p_remove_all_dir, &$p_options) - function privAddList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - - // ----- Add the files - $v_header_list = array(); - if (($v_result = $this->privAddFileList($p_filedescr_list, $v_header_list, $p_options)) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($this->zip_fd); - - // ----- Create the Central Dir files header - for ($i=0,$v_count=0; $i<sizeof($v_header_list); $i++) - { - // ----- Create the file header - if ($v_header_list[$i]['status'] == 'ok') { - if (($v_result = $this->privWriteCentralFileHeader($v_header_list[$i])) != 1) { - // ----- Return - return $v_result; - } - $v_count++; - } - - // ----- Transform the header to a 'usable' info - $this->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($this->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_count, $v_size, $v_offset, $v_comment)) != 1) - { - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileList() - // Description : - // Parameters : - // $p_filedescr_list : An array containing the file description - // or directory names to add in the zip - // $p_result_list : list of added files with their properties (specially the status field) - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileList($p_filedescr_list, &$p_result_list, &$p_options) - { - $v_result=1; - $v_header = array(); - - // ----- Recuperate the current number of elt in list - $v_nb = sizeof($p_result_list); - - // ----- Loop on the files - for ($j=0; ($j<sizeof($p_filedescr_list)) && ($v_result==1); $j++) { - // ----- Format the filename - $p_filedescr_list[$j]['filename'] - = PclZipUtilTranslateWinPath($p_filedescr_list[$j]['filename'], false); - - - // ----- Skip empty file names - // TBC : Can this be possible ? not checked in DescrParseAtt ? - if ($p_filedescr_list[$j]['filename'] == "") { - continue; - } - - // ----- Check the filename - if ( ($p_filedescr_list[$j]['type'] != 'virtual_file') - && (!file_exists($p_filedescr_list[$j]['filename']))) { - PclZip::privErrorLog(PCLZIP_ERR_MISSING_FILE, "File '".$p_filedescr_list[$j]['filename']."' does not exist"); - return PclZip::errorCode(); - } - - // ----- Look if it is a file or a dir with no all path remove option - // or a dir with all its path removed -// if ( (is_file($p_filedescr_list[$j]['filename'])) -// || ( is_dir($p_filedescr_list[$j]['filename']) - if ( ($p_filedescr_list[$j]['type'] == 'file') - || ($p_filedescr_list[$j]['type'] == 'virtual_file') - || ( ($p_filedescr_list[$j]['type'] == 'folder') - && ( !isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH]) - || !$p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) - ) { - - // ----- Add the file - $v_result = $this->privAddFile($p_filedescr_list[$j], $v_header, - $p_options); - if ($v_result != 1) { - return $v_result; - } - - // ----- Store the file infos - $p_result_list[$v_nb++] = $v_header; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=1; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - // TBC : Already done in the fileAtt check ... ? - if ($p_filename == "") { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_PARAMETER, "Invalid file list parameter (invalid or empty list)"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for a stored different filename - /* TBC : Removed - if (isset($p_filedescr['stored_filename'])) { - $v_stored_filename = $p_filedescr['stored_filename']; - } - else { - $v_stored_filename = $p_filedescr['stored_filename']; - } - */ - - // ----- Set the file properties - clearstatcache(); - $p_header['version'] = 20; - $p_header['version_extracted'] = 10; - $p_header['flag'] = 0; - $p_header['compression'] = 0; - $p_header['crc'] = 0; - $p_header['compressed_size'] = 0; - $p_header['filename_len'] = strlen($p_filename); - $p_header['extra_len'] = 0; - $p_header['disk'] = 0; - $p_header['internal'] = 0; - $p_header['offset'] = 0; - $p_header['filename'] = $p_filename; -// TBC : Removed $p_header['stored_filename'] = $v_stored_filename; - $p_header['stored_filename'] = $p_filedescr['stored_filename']; - $p_header['extra'] = ''; - $p_header['status'] = 'ok'; - $p_header['index'] = -1; - - // ----- Look for regular file - if ($p_filedescr['type']=='file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for regular folder - else if ($p_filedescr['type']=='folder') { - $p_header['external'] = 0x00000010; - $p_header['mtime'] = filemtime($p_filename); - $p_header['size'] = filesize($p_filename); - } - - // ----- Look for virtual file - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['external'] = 0x00000000; - $p_header['size'] = strlen($p_filedescr['content']); - } - - - // ----- Look for filetime - if (isset($p_filedescr['mtime'])) { - $p_header['mtime'] = $p_filedescr['mtime']; - } - else if ($p_filedescr['type'] == 'virtual_file') { - $p_header['mtime'] = time(); - } - else { - $p_header['mtime'] = filemtime($p_filename); - } - - // ------ Look for file comment - if (isset($p_filedescr['comment'])) { - $p_header['comment_len'] = strlen($p_filedescr['comment']); - $p_header['comment'] = $p_filedescr['comment']; - } - else { - $p_header['comment_len'] = 0; - $p_header['comment'] = ''; - } - - // ----- Look for pre-add callback - if (isset($p_options[PCLZIP_CB_PRE_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_ADD].'(PCLZIP_CB_PRE_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_ADD](PCLZIP_CB_PRE_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_header['status'] = "skipped"; - $v_result = 1; - } - - // ----- Update the informations - // Only some fields can be modified - if ($p_header['stored_filename'] != $v_local_header['stored_filename']) { - $p_header['stored_filename'] = PclZipUtilPathReduction($v_local_header['stored_filename']); - } - } - - // ----- Look for empty stored filename - if ($p_header['stored_filename'] == "") { - $p_header['status'] = "filtered"; - } - - // ----- Check the path length - if (strlen($p_header['stored_filename']) > 0xFF) { - $p_header['status'] = 'filename_too_long'; - } - - // ----- Look if no error, or file not skipped - if ($p_header['status'] == 'ok') { - - // ----- Look for a file - if ($p_filedescr['type'] == 'file') { - // ----- Look for using temporary file to zip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_header['size'])) ) ) { - $v_result = $this->privAddFileUsingTempFile($p_filedescr, $p_header, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Use "in memory" zip algo - else { - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Read the file content - $v_content = @fread($v_file, $p_header['size']); - - // ----- Close the file - @fclose($v_file); - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - - } - - } - - // ----- Look for a virtual file (a file from string) - else if ($p_filedescr['type'] == 'virtual_file') { - - $v_content = $p_filedescr['content']; - - // ----- Calculate the CRC - $p_header['crc'] = @crc32($v_content); - - // ----- Look for no compression - if ($p_options[PCLZIP_OPT_NO_COMPRESSION]) { - // ----- Set header parameters - $p_header['compressed_size'] = $p_header['size']; - $p_header['compression'] = 0; - } - - // ----- Look for normal compression - else { - // ----- Compress the content - $v_content = @gzdeflate($v_content); - - // ----- Set header parameters - $p_header['compressed_size'] = strlen($v_content); - $p_header['compression'] = 8; - } - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - @fclose($v_file); - return $v_result; - } - - // ----- Write the compressed (or not) content - @fwrite($this->zip_fd, $v_content, $p_header['compressed_size']); - } - - // ----- Look for a directory - else if ($p_filedescr['type'] == 'folder') { - // ----- Look for directory last '/' - if (@substr($p_header['stored_filename'], -1) != '/') { - $p_header['stored_filename'] .= '/'; - } - - // ----- Set the file properties - $p_header['size'] = 0; - //$p_header['external'] = 0x41FF0010; // Value for a folder : to be checked - $p_header['external'] = 0x00000010; // Value for a folder : to be checked - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) - { - return $v_result; - } - } - } - - // ----- Look for post-add callback - if (isset($p_options[PCLZIP_CB_POST_ADD])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_header, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_ADD].'(PCLZIP_CB_POST_ADD, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_ADD](PCLZIP_CB_POST_ADD, $v_local_header); - if ($v_result == 0) { - // ----- Ignored - $v_result = 1; - } - - // ----- Update the informations - // Nothing can be modified - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privAddFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privAddFileUsingTempFile($p_filedescr, &$p_header, &$p_options) - { - $v_result=PCLZIP_ERR_NO_ERROR; - - // ----- Working variable - $p_filename = $p_filedescr['filename']; - - - // ----- Open the source file - if (($v_file = @fopen($p_filename, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, "Unable to open file '$p_filename' in binary read mode"); - return PclZip::errorCode(); - } - - // ----- Creates a compressed temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_file_compressed = @gzopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = filesize($p_filename); - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @gzputs($v_file_compressed, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file); - @gzclose($v_file_compressed); - - // ----- Check the minimum file size - if (filesize($v_gzip_temp_name) < 18) { - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'gzip temporary file \''.$v_gzip_temp_name.'\' has invalid filesize - should be minimum 18 bytes'); - return PclZip::errorCode(); - } - - // ----- Extract the compressed attributes - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the gzip file header - $v_binary_data = @fread($v_file_compressed, 10); - $v_data_header = unpack('a1id1/a1id2/a1cm/a1flag/Vmtime/a1xfl/a1os', $v_binary_data); - - // ----- Check some parameters - $v_data_header['os'] = bin2hex($v_data_header['os']); - - // ----- Read the gzip file footer - @fseek($v_file_compressed, filesize($v_gzip_temp_name)-8); - $v_binary_data = @fread($v_file_compressed, 8); - $v_data_footer = unpack('Vcrc/Vcompressed_size', $v_binary_data); - - // ----- Set the attributes - $p_header['compression'] = ord($v_data_header['cm']); - //$p_header['mtime'] = $v_data_header['mtime']; - $p_header['crc'] = $v_data_footer['crc']; - $p_header['compressed_size'] = filesize($v_gzip_temp_name)-18; - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Call the header generation - if (($v_result = $this->privWriteFileHeader($p_header)) != 1) { - return $v_result; - } - - // ----- Add the compressed data - if (($v_file_compressed = @fopen($v_gzip_temp_name, "rb")) == 0) - { - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - fseek($v_file_compressed, 10); - $v_size = $p_header['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($v_file_compressed, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close the file - @fclose($v_file_compressed); - - // ----- Unlink the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCalculateStoredFilename() - // Description : - // Based on file descriptor properties and global options, this method - // calculate the filename that will be stored in the archive. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privCalculateStoredFilename(&$p_filedescr, &$p_options) - { - $v_result=1; - - // ----- Working variables - $p_filename = $p_filedescr['filename']; - if (isset($p_options[PCLZIP_OPT_ADD_PATH])) { - $p_add_dir = $p_options[PCLZIP_OPT_ADD_PATH]; - } - else { - $p_add_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_PATH])) { - $p_remove_dir = $p_options[PCLZIP_OPT_REMOVE_PATH]; - } - else { - $p_remove_dir = ''; - } - if (isset($p_options[PCLZIP_OPT_REMOVE_ALL_PATH])) { - $p_remove_all_dir = $p_options[PCLZIP_OPT_REMOVE_ALL_PATH]; - } - else { - $p_remove_all_dir = 0; - } - - - // ----- Look for full name change - if (isset($p_filedescr['new_full_name'])) { - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($p_filedescr['new_full_name']); - } - - // ----- Look for path and/or short name change - else { - - // ----- Look for short name change - // Its when we cahnge just the filename but not the path - if (isset($p_filedescr['new_short_name'])) { - $v_path_info = pathinfo($p_filename); - $v_dir = ''; - if ($v_path_info['dirname'] != '') { - $v_dir = $v_path_info['dirname'].'/'; - } - $v_stored_filename = $v_dir.$p_filedescr['new_short_name']; - } - else { - // ----- Calculate the stored filename - $v_stored_filename = $p_filename; - } - - // ----- Look for all path to remove - if ($p_remove_all_dir) { - $v_stored_filename = basename($p_filename); - } - // ----- Look for partial path remove - else if ($p_remove_dir != "") { - if (substr($p_remove_dir, -1) != '/') - $p_remove_dir .= "/"; - - if ( (substr($p_filename, 0, 2) == "./") - || (substr($p_remove_dir, 0, 2) == "./")) { - - if ( (substr($p_filename, 0, 2) == "./") - && (substr($p_remove_dir, 0, 2) != "./")) { - $p_remove_dir = "./".$p_remove_dir; - } - if ( (substr($p_filename, 0, 2) != "./") - && (substr($p_remove_dir, 0, 2) == "./")) { - $p_remove_dir = substr($p_remove_dir, 2); - } - } - - $v_compare = PclZipUtilPathInclusion($p_remove_dir, - $v_stored_filename); - if ($v_compare > 0) { - if ($v_compare == 2) { - $v_stored_filename = ""; - } - else { - $v_stored_filename = substr($v_stored_filename, - strlen($p_remove_dir)); - } - } - } - - // ----- Remove drive letter if any - $v_stored_filename = PclZipUtilTranslateWinPath($v_stored_filename); - - // ----- Look for path to add - if ($p_add_dir != "") { - if (substr($p_add_dir, -1) == "/") - $v_stored_filename = $p_add_dir.$v_stored_filename; - else - $v_stored_filename = $p_add_dir."/".$v_stored_filename; - } - } - - // ----- Filename (reduce the path of stored name) - $v_stored_filename = PclZipUtilPathReduction($v_stored_filename); - $p_filedescr['stored_filename'] = $v_stored_filename; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteFileHeader(&$p_header) - { - $v_result=1; - - // ----- Store the offset position of the file - $p_header['offset'] = ftell($this->zip_fd); - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - // ----- Packed data - $v_binary_data = pack("VvvvvvVVVvv", 0x04034b50, - $p_header['version_extracted'], $p_header['flag'], - $p_header['compression'], $v_mtime, $v_mdate, - $p_header['crc'], $p_header['compressed_size'], - $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len']); - - // ----- Write the first 148 bytes of the header in the archive - fputs($this->zip_fd, $v_binary_data, 30); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralFileHeader(&$p_header) - { - $v_result=1; - - // TBC - //for(reset($p_header); $key = key($p_header); next($p_header)) { - //} - - // ----- Transform UNIX mtime to DOS format mdate/mtime - $v_date = getdate($p_header['mtime']); - $v_mtime = ($v_date['hours']<<11) + ($v_date['minutes']<<5) + $v_date['seconds']/2; - $v_mdate = (($v_date['year']-1980)<<9) + ($v_date['mon']<<5) + $v_date['mday']; - - - // ----- Packed data - $v_binary_data = pack("VvvvvvvVVVvvvvvVV", 0x02014b50, - $p_header['version'], $p_header['version_extracted'], - $p_header['flag'], $p_header['compression'], - $v_mtime, $v_mdate, $p_header['crc'], - $p_header['compressed_size'], $p_header['size'], - strlen($p_header['stored_filename']), - $p_header['extra_len'], $p_header['comment_len'], - $p_header['disk'], $p_header['internal'], - $p_header['external'], $p_header['offset']); - - // ----- Write the 42 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 46); - - // ----- Write the variable fields - if (strlen($p_header['stored_filename']) != 0) - { - fputs($this->zip_fd, $p_header['stored_filename'], strlen($p_header['stored_filename'])); - } - if ($p_header['extra_len'] != 0) - { - fputs($this->zip_fd, $p_header['extra'], $p_header['extra_len']); - } - if ($p_header['comment_len'] != 0) - { - fputs($this->zip_fd, $p_header['comment'], $p_header['comment_len']); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privWriteCentralHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privWriteCentralHeader($p_nb_entries, $p_size, $p_offset, $p_comment) - { - $v_result=1; - - // ----- Packed data - $v_binary_data = pack("VvvvvVVv", 0x06054b50, 0, 0, $p_nb_entries, - $p_nb_entries, $p_size, - $p_offset, strlen($p_comment)); - - // ----- Write the 22 bytes of the header in the zip file - fputs($this->zip_fd, $v_binary_data, 22); - - // ----- Write the variable fields - if (strlen($p_comment) != 0) - { - fputs($this->zip_fd, $p_comment, strlen($p_comment)); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privList() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privList(&$p_list) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Open the zip file - if (($this->zip_fd = @fopen($this->zipname, 'rb')) == 0) - { - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive \''.$this->zipname.'\' in binary read mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Go to beginning of Central Dir - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_central_dir['offset'])) - { - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - for ($i=0; $i<$v_central_dir['entries']; $i++) - { - // ----- Read the file header - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - $v_header['index'] = $i; - - // ----- Get the only interesting attributes - $this->privConvertHeader2FileInfo($v_header, $p_list[$i]); - unset($v_header); - } - - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Magic quotes trick - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privConvertHeader2FileInfo() - // Description : - // This function takes the file informations from the central directory - // entries and extract the interesting parameters that will be given back. - // The resulting file infos are set in the array $p_info - // $p_info['filename'] : Filename with full path. Given by user (add), - // extracted in the filesystem (extract). - // $p_info['stored_filename'] : Stored filename in the archive. - // $p_info['size'] = Size of the file. - // $p_info['compressed_size'] = Compressed size of the file. - // $p_info['mtime'] = Last modification date of the file. - // $p_info['comment'] = Comment associated with the file. - // $p_info['folder'] = true/false : indicates if the entry is a folder or not. - // $p_info['status'] = status of the action on the file. - // $p_info['crc'] = CRC of the file content. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privConvertHeader2FileInfo($p_header, &$p_info) - { - $v_result=1; - - // ----- Get the interesting attributes - $v_temp_path = PclZipUtilPathReduction($p_header['filename']); - $p_info['filename'] = $v_temp_path; - $v_temp_path = PclZipUtilPathReduction($p_header['stored_filename']); - $p_info['stored_filename'] = $v_temp_path; - $p_info['size'] = $p_header['size']; - $p_info['compressed_size'] = $p_header['compressed_size']; - $p_info['mtime'] = $p_header['mtime']; - $p_info['comment'] = $p_header['comment']; - $p_info['folder'] = (($p_header['external']&0x00000010)==0x00000010); - $p_info['index'] = $p_header['index']; - $p_info['status'] = $p_header['status']; - $p_info['crc'] = $p_header['crc']; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractByRule() - // Description : - // Extract a file or directory depending of rules (by index, by name, ...) - // Parameters : - // $p_file_list : An array where will be placed the properties of each - // extracted file - // $p_path : Path to add while writing the extracted files - // $p_remove_path : Path to remove (from the file memorized path) while writing the - // extracted files. If the path does not match the file path, - // the file is extracted with its memorized path. - // $p_remove_path does not apply to 'list' mode. - // $p_path and $p_remove_path are commulative. - // Return Values : - // 1 on success,0 or less on error (see error code list) - // -------------------------------------------------------------------------------- - function privExtractByRule(&$p_file_list, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Magic quotes trick - $this->privDisableMagicQuotes(); - - // ----- Check the path - if ( ($p_path == "") - || ( (substr($p_path, 0, 1) != "/") - && (substr($p_path, 0, 3) != "../") - && (substr($p_path,1,2)!=":/"))) - $p_path = "./".$p_path; - - // ----- Reduce the path last (and duplicated) '/' - if (($p_path != "./") && ($p_path != "/")) - { - // ----- Look for the path end '/' - while (substr($p_path, -1) == "/") - { - $p_path = substr($p_path, 0, strlen($p_path)-1); - } - } - - // ----- Look for path to remove format (should end by /) - if (($p_remove_path != "") && (substr($p_remove_path, -1) != '/')) - { - $p_remove_path .= '/'; - } - $p_remove_path_size = strlen($p_remove_path); - - // ----- Open the zip file - if (($v_result = $this->privOpenFd('rb')) != 1) - { - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - - // ----- Read each entry - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read next Central dir entry - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header)) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Store the index - $v_header['index'] = $i; - - // ----- Store the file position - $v_pos_entry = ftell($this->zip_fd); - - // ----- Look for the specific extract rules - $v_extract = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_extract); $j++) { - - // ----- Look for a directory - if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { - - // ----- Look if the directory is in the filename path - if ( (strlen($v_header['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_extract = true; - } - } - // ----- Look for a filename - elseif ($v_header['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_extract = true; - } - } - } - - // ----- Look for extract by ereg rule - // ereg() is deprecated with PHP 5.3 - /* - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header['stored_filename'])) { - $v_extract = true; - } - } - */ - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header['stored_filename'])) { - $v_extract = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_extract); $j++) { - - if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_extract = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - - // ----- Look for no rule, which means extract all the archive - else { - $v_extract = true; - } - - // ----- Check compression method - if ( ($v_extract) - && ( ($v_header['compression'] != 8) - && ($v_header['compression'] != 0))) { - $v_header['status'] = 'unsupported_compression'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_COMPRESSION, - "Filename '".$v_header['stored_filename']."' is " - ."compressed by an unsupported compression " - ."method (".$v_header['compression'].") "); - - return PclZip::errorCode(); - } - } - - // ----- Check encrypted files - if (($v_extract) && (($v_header['flag'] & 1) == 1)) { - $v_header['status'] = 'unsupported_encryption'; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - $this->privSwapBackMagicQuotes(); - - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, - "Unsupported encryption for " - ." filename '".$v_header['stored_filename'] - ."'"); - - return PclZip::errorCode(); - } - } - - // ----- Look for real extraction - if (($v_extract) && ($v_header['status'] != 'ok')) { - $v_result = $this->privConvertHeader2FileInfo($v_header, - $p_file_list[$v_nb_extracted++]); - if ($v_result != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - $v_extract = false; - } - - // ----- Look for real extraction - if ($v_extract) - { - - // ----- Go to the file position - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_header['offset'])) - { - // ----- Close the zip file - $this->privCloseFd(); - - $this->privSwapBackMagicQuotes(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Look for extraction as string - if ($p_options[PCLZIP_OPT_EXTRACT_AS_STRING]) { - - $v_string = ''; - - // ----- Extracting the file - $v_result1 = $this->privExtractFileAsString($v_header, $v_string, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Set the file content - $p_file_list[$v_nb_extracted]['content'] = $v_string; - - // ----- Next extracted file - $v_nb_extracted++; - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for extraction in standard output - elseif ( (isset($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) - && ($p_options[PCLZIP_OPT_EXTRACT_IN_OUTPUT])) { - // ----- Extracting the file in standard output - $v_result1 = $this->privExtractFileInOutput($v_header, $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - // ----- Look for normal extraction - else { - // ----- Extracting the file - $v_result1 = $this->privExtractFile($v_header, - $p_path, $p_remove_path, - $p_remove_all_path, - $p_options); - if ($v_result1 < 1) { - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - return $v_result1; - } - - // ----- Get the only interesting attributes - if (($v_result = $this->privConvertHeader2FileInfo($v_header, $p_file_list[$v_nb_extracted++])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - return $v_result; - } - - // ----- Look for user callback abort - if ($v_result1 == 2) { - break; - } - } - } - } - - // ----- Close the zip file - $this->privCloseFd(); - $this->privSwapBackMagicQuotes(); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFile() - // Description : - // Parameters : - // Return Values : - // - // 1 : ... ? - // PCLZIP_ERR_USER_ABORTED(2) : User ask for extraction stop in callback - // -------------------------------------------------------------------------------- - function privExtractFile(&$p_entry, $p_path, $p_remove_path, $p_remove_all_path, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for all path to remove - if ($p_remove_all_path == true) { - // ----- Look for folder entry that not need to be extracted - if (($p_entry['external']&0x00000010)==0x00000010) { - - $p_entry['status'] = "filtered"; - - return $v_result; - } - - // ----- Get the basename of the path - $p_entry['filename'] = basename($p_entry['filename']); - } - - // ----- Look for path to remove - else if ($p_remove_path != "") - { - if (PclZipUtilPathInclusion($p_remove_path, $p_entry['filename']) == 2) - { - - // ----- Change the file status - $p_entry['status'] = "filtered"; - - // ----- Return - return $v_result; - } - - $p_remove_path_size = strlen($p_remove_path); - if (substr($p_entry['filename'], 0, $p_remove_path_size) == $p_remove_path) - { - - // ----- Remove the path - $p_entry['filename'] = substr($p_entry['filename'], $p_remove_path_size); - - } - } - - // ----- Add the path - if ($p_path != '') { - $p_entry['filename'] = $p_path."/".$p_entry['filename']; - } - - // ----- Check a base_dir_restriction - if (isset($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION])) { - $v_inclusion - = PclZipUtilPathInclusion($p_options[PCLZIP_OPT_EXTRACT_DIR_RESTRICTION], - $p_entry['filename']); - if ($v_inclusion == 0) { - - PclZip::privErrorLog(PCLZIP_ERR_DIRECTORY_RESTRICTION, - "Filename '".$p_entry['filename']."' is " - ."outside PCLZIP_OPT_EXTRACT_DIR_RESTRICTION"); - - return PclZip::errorCode(); - } - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Look for specific actions while the file exist - if (file_exists($p_entry['filename'])) - { - - // ----- Look if file is a directory - if (is_dir($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "already_a_directory"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_ALREADY_A_DIRECTORY, - "Filename '".$p_entry['filename']."' is " - ."already used by an existing directory"); - - return PclZip::errorCode(); - } - } - // ----- Look if file is write protected - else if (!is_writeable($p_entry['filename'])) - { - - // ----- Change the file status - $p_entry['status'] = "write_protected"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Filename '".$p_entry['filename']."' exists " - ."and is write protected"); - - return PclZip::errorCode(); - } - } - - // ----- Look if the extracted file is older - else if (filemtime($p_entry['filename']) > $p_entry['mtime']) - { - // ----- Change the file status - if ( (isset($p_options[PCLZIP_OPT_REPLACE_NEWER])) - && ($p_options[PCLZIP_OPT_REPLACE_NEWER]===true)) { - } - else { - $p_entry['status'] = "newer_exist"; - - // ----- Look for PCLZIP_OPT_STOP_ON_ERROR - // For historical reason first PclZip implementation does not stop - // when this kind of error occurs. - if ( (isset($p_options[PCLZIP_OPT_STOP_ON_ERROR])) - && ($p_options[PCLZIP_OPT_STOP_ON_ERROR]===true)) { - - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, - "Newer version of '".$p_entry['filename']."' exists " - ."and option PCLZIP_OPT_REPLACE_NEWER is not selected"); - - return PclZip::errorCode(); - } - } - } - else { - } - } - - // ----- Check the directory availability and create it if necessary - else { - if ((($p_entry['external']&0x00000010)==0x00000010) || (substr($p_entry['filename'], -1) == '/')) - $v_dir_to_check = $p_entry['filename']; - else if (!strstr($p_entry['filename'], "/")) - $v_dir_to_check = ""; - else - $v_dir_to_check = dirname($p_entry['filename']); - - if (($v_result = $this->privDirCheck($v_dir_to_check, (($p_entry['external']&0x00000010)==0x00000010))) != 1) { - - // ----- Change the file status - $p_entry['status'] = "path_creation_fail"; - - // ----- Return - //return $v_result; - $v_result = 1; - } - } - } - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) - { - // ----- Look for not compressed file - if ($p_entry['compression'] == 0) { - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) - { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - // ----- Return - return $v_result; - } - - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - /* Try to speed up the code - $v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_binary_data, $v_read_size); - */ - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Closing the destination file - fclose($v_dest_file); - - // ----- Change the file mtime - touch($p_entry['filename'], $p_entry['mtime']); - - - } - else { - // ----- TBC - // Need to be finished - if (($p_entry['flag'] & 1) == 1) { - PclZip::privErrorLog(PCLZIP_ERR_UNSUPPORTED_ENCRYPTION, 'File \''.$p_entry['filename'].'\' is encrypted. Encrypted files are not supported.'); - return PclZip::errorCode(); - } - - - // ----- Look for using temporary file to unzip - if ( (!isset($p_options[PCLZIP_OPT_TEMP_FILE_OFF])) - && (isset($p_options[PCLZIP_OPT_TEMP_FILE_ON]) - || (isset($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD]) - && ($p_options[PCLZIP_OPT_TEMP_FILE_THRESHOLD] <= $p_entry['size'])) ) ) { - $v_result = $this->privExtractFileUsingTempFile($p_entry, $p_options); - if ($v_result < PCLZIP_ERR_NO_ERROR) { - return $v_result; - } - } - - // ----- Look for extract in memory - else { - - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = @gzinflate($v_buffer); - unset($v_buffer); - if ($v_file_content === FALSE) { - - // ----- Change the file status - // TBC - $p_entry['status'] = "error"; - - return $v_result; - } - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - - // ----- Change the file status - $p_entry['status'] = "write_error"; - - return $v_result; - } - - // ----- Write the uncompressed data - @fwrite($v_dest_file, $v_file_content, $p_entry['size']); - unset($v_file_content); - - // ----- Closing the destination file - @fclose($v_dest_file); - - } - - // ----- Change the file mtime - @touch($p_entry['filename'], $p_entry['mtime']); - } - - // ----- Look for chmod option - if (isset($p_options[PCLZIP_OPT_SET_CHMOD])) { - - // ----- Change the mode of the file - @chmod($p_entry['filename'], $p_options[PCLZIP_OPT_SET_CHMOD]); - } - - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileUsingTempFile() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileUsingTempFile(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Creates a temporary file - $v_gzip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.gz'; - if (($v_dest_file = @fopen($v_gzip_temp_name, "wb")) == 0) { - fclose($v_file); - PclZip::privErrorLog(PCLZIP_ERR_WRITE_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary write mode'); - return PclZip::errorCode(); - } - - - // ----- Write gz file format header - $v_binary_data = pack('va1a1Va1a1', 0x8b1f, Chr($p_entry['compression']), Chr(0x00), time(), Chr(0x00), Chr(3)); - @fwrite($v_dest_file, $v_binary_data, 10); - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['compressed_size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Write gz file format footer - $v_binary_data = pack('VV', $p_entry['crc'], $p_entry['size']); - @fwrite($v_dest_file, $v_binary_data, 8); - - // ----- Close the temporary file - @fclose($v_dest_file); - - // ----- Opening destination file - if (($v_dest_file = @fopen($p_entry['filename'], 'wb')) == 0) { - $p_entry['status'] = "write_error"; - return $v_result; - } - - // ----- Open the temporary gz file - if (($v_src_file = @gzopen($v_gzip_temp_name, 'rb')) == 0) { - @fclose($v_dest_file); - $p_entry['status'] = "read_error"; - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_gzip_temp_name.'\' in binary read mode'); - return PclZip::errorCode(); - } - - - // ----- Read the file by PCLZIP_READ_BLOCK_SIZE octets blocks - $v_size = $p_entry['size']; - while ($v_size != 0) { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($v_src_file, $v_read_size); - //$v_binary_data = pack('a'.$v_read_size, $v_buffer); - @fwrite($v_dest_file, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - @fclose($v_dest_file); - @gzclose($v_src_file); - - // ----- Delete the temporary file - @unlink($v_gzip_temp_name); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileInOutput() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileInOutput(&$p_entry, &$p_options) - { - $v_result=1; - - // ----- Read the file header - if (($v_result = $this->privReadFileHeader($v_header)) != 1) { - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - // ----- Trace - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - if ($p_entry['compressed_size'] == $p_entry['size']) { - - // ----- Read the file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Send the file to the output - echo $v_buffer; - unset($v_buffer); - } - else { - - // ----- Read the compressed file in a buffer (one shot) - $v_buffer = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - $v_file_content = gzinflate($v_buffer); - unset($v_buffer); - - // ----- Send the file to the output - echo $v_file_content; - unset($v_file_content); - } - } - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privExtractFileAsString() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privExtractFileAsString(&$p_entry, &$p_string, &$p_options) - { - $v_result=1; - - // ----- Read the file header - $v_header = array(); - if (($v_result = $this->privReadFileHeader($v_header)) != 1) - { - // ----- Return - return $v_result; - } - - - // ----- Check that the file header is coherent with $p_entry info - if ($this->privCheckFileHeaders($v_header, $p_entry) != 1) { - // TBC - } - - // ----- Look for pre-extract callback - if (isset($p_options[PCLZIP_CB_PRE_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_PRE_EXTRACT].'(PCLZIP_CB_PRE_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_PRE_EXTRACT](PCLZIP_CB_PRE_EXTRACT, $v_local_header); - if ($v_result == 0) { - // ----- Change the file status - $p_entry['status'] = "skipped"; - $v_result = 1; - } - - // ----- Look for abort result - if ($v_result == 2) { - // ----- This status is internal and will be changed in 'skipped' - $p_entry['status'] = "aborted"; - $v_result = PCLZIP_ERR_USER_ABORTED; - } - - // ----- Update the informations - // Only some fields can be modified - $p_entry['filename'] = $v_local_header['filename']; - } - - - // ----- Look if extraction should be done - if ($p_entry['status'] == 'ok') { - - // ----- Do the extraction (if not a folder) - if (!(($p_entry['external']&0x00000010)==0x00000010)) { - // ----- Look for not compressed file - // if ($p_entry['compressed_size'] == $p_entry['size']) - if ($p_entry['compression'] == 0) { - - // ----- Reading the file - $p_string = @fread($this->zip_fd, $p_entry['compressed_size']); - } - else { - - // ----- Reading the file - $v_data = @fread($this->zip_fd, $p_entry['compressed_size']); - - // ----- Decompress the file - if (($p_string = @gzinflate($v_data)) === FALSE) { - // TBC - } - } - - // ----- Trace - } - else { - // TBC : error : can not extract a folder in a string - } - - } - - // ----- Change abort status - if ($p_entry['status'] == "aborted") { - $p_entry['status'] = "skipped"; - } - - // ----- Look for post-extract callback - elseif (isset($p_options[PCLZIP_CB_POST_EXTRACT])) { - - // ----- Generate a local information - $v_local_header = array(); - $this->privConvertHeader2FileInfo($p_entry, $v_local_header); - - // ----- Swap the content to header - $v_local_header['content'] = $p_string; - $p_string = ''; - - // ----- Call the callback - // Here I do not use call_user_func() because I need to send a reference to the - // header. -// eval('$v_result = '.$p_options[PCLZIP_CB_POST_EXTRACT].'(PCLZIP_CB_POST_EXTRACT, $v_local_header);'); - $v_result = $p_options[PCLZIP_CB_POST_EXTRACT](PCLZIP_CB_POST_EXTRACT, $v_local_header); - - // ----- Swap back the content to header - $p_string = $v_local_header['content']; - unset($v_local_header['content']); - - // ----- Look for abort result - if ($v_result == 2) { - $v_result = PCLZIP_ERR_USER_ABORTED; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x04034b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 26); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 26) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vversion/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len', $v_binary_data); - - // ----- Get filename - $p_header['filename'] = fread($this->zip_fd, $v_data['filename_len']); - - // ----- Get extra_fields - if ($v_data['extra_len'] != 0) { - $p_header['extra'] = fread($this->zip_fd, $v_data['extra_len']); - } - else { - $p_header['extra'] = ''; - } - - // ----- Extract properties - $p_header['version_extracted'] = $v_data['version']; - $p_header['compression'] = $v_data['compression']; - $p_header['size'] = $v_data['size']; - $p_header['compressed_size'] = $v_data['compressed_size']; - $p_header['crc'] = $v_data['crc']; - $p_header['flag'] = $v_data['flag']; - $p_header['filename_len'] = $v_data['filename_len']; - - // ----- Recuperate date in UNIX format - $p_header['mdate'] = $v_data['mdate']; - $p_header['mtime'] = $v_data['mtime']; - if ($p_header['mdate'] && $p_header['mtime']) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // TBC - //for(reset($v_data); $key = key($v_data); next($v_data)) { - //} - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set the status field - $p_header['status'] = "ok"; - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadCentralFileHeader() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadCentralFileHeader(&$p_header) - { - $v_result=1; - - // ----- Read the 4 bytes signature - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] != 0x02014b50) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Invalid archive structure'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the first 42 bytes of the header - $v_binary_data = fread($this->zip_fd, 42); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 42) - { - $p_header['filename'] = ""; - $p_header['status'] = "invalid_header"; - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid block size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $p_header = unpack('vversion/vversion_extracted/vflag/vcompression/vmtime/vmdate/Vcrc/Vcompressed_size/Vsize/vfilename_len/vextra_len/vcomment_len/vdisk/vinternal/Vexternal/Voffset', $v_binary_data); - - // ----- Get filename - if ($p_header['filename_len'] != 0) - $p_header['filename'] = fread($this->zip_fd, $p_header['filename_len']); - else - $p_header['filename'] = ''; - - // ----- Get extra - if ($p_header['extra_len'] != 0) - $p_header['extra'] = fread($this->zip_fd, $p_header['extra_len']); - else - $p_header['extra'] = ''; - - // ----- Get comment - if ($p_header['comment_len'] != 0) - $p_header['comment'] = fread($this->zip_fd, $p_header['comment_len']); - else - $p_header['comment'] = ''; - - // ----- Extract properties - - // ----- Recuperate date in UNIX format - //if ($p_header['mdate'] && $p_header['mtime']) - // TBC : bug : this was ignoring time with 0/0/0 - if (1) - { - // ----- Extract time - $v_hour = ($p_header['mtime'] & 0xF800) >> 11; - $v_minute = ($p_header['mtime'] & 0x07E0) >> 5; - $v_seconde = ($p_header['mtime'] & 0x001F)*2; - - // ----- Extract date - $v_year = (($p_header['mdate'] & 0xFE00) >> 9) + 1980; - $v_month = ($p_header['mdate'] & 0x01E0) >> 5; - $v_day = $p_header['mdate'] & 0x001F; - - // ----- Get UNIX date format - $p_header['mtime'] = @mktime($v_hour, $v_minute, $v_seconde, $v_month, $v_day, $v_year); - - } - else - { - $p_header['mtime'] = time(); - } - - // ----- Set the stored filename - $p_header['stored_filename'] = $p_header['filename']; - - // ----- Set default status to ok - $p_header['status'] = 'ok'; - - // ----- Look if it is a directory - if (substr($p_header['filename'], -1) == '/') { - //$p_header['external'] = 0x41FF0010; - $p_header['external'] = 0x00000010; - } - - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privCheckFileHeaders() - // Description : - // Parameters : - // Return Values : - // 1 on success, - // 0 on error; - // -------------------------------------------------------------------------------- - function privCheckFileHeaders(&$p_local_header, &$p_central_header) - { - $v_result=1; - - // ----- Check the static values - // TBC - if ($p_local_header['filename'] != $p_central_header['filename']) { - } - if ($p_local_header['version_extracted'] != $p_central_header['version_extracted']) { - } - if ($p_local_header['flag'] != $p_central_header['flag']) { - } - if ($p_local_header['compression'] != $p_central_header['compression']) { - } - if ($p_local_header['mtime'] != $p_central_header['mtime']) { - } - if ($p_local_header['filename_len'] != $p_central_header['filename_len']) { - } - - // ----- Look for flag bit 3 - if (($p_local_header['flag'] & 8) == 8) { - $p_local_header['size'] = $p_central_header['size']; - $p_local_header['compressed_size'] = $p_central_header['compressed_size']; - $p_local_header['crc'] = $p_central_header['crc']; - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privReadEndCentralDir() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privReadEndCentralDir(&$p_central_dir) - { - $v_result=1; - - // ----- Go to the end of the zip file - $v_size = filesize($this->zipname); - @fseek($this->zip_fd, $v_size); - if (@ftell($this->zip_fd) != $v_size) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to go to the end of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- First try : look if this is an archive with no commentaries (most of the time) - // in this case the end of central dir is at 22 bytes of the file end - $v_found = 0; - if ($v_size > 26) { - @fseek($this->zip_fd, $v_size-22); - if (($v_pos = @ftell($this->zip_fd)) != ($v_size-22)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read for bytes - $v_binary_data = @fread($this->zip_fd, 4); - $v_data = @unpack('Vid', $v_binary_data); - - // ----- Check signature - if ($v_data['id'] == 0x06054b50) { - $v_found = 1; - } - - $v_pos = ftell($this->zip_fd); - } - - // ----- Go back to the maximum possible size of the Central Dir End Record - if (!$v_found) { - $v_maximum_size = 65557; // 0xFFFF + 22; - if ($v_maximum_size > $v_size) - $v_maximum_size = $v_size; - @fseek($this->zip_fd, $v_size-$v_maximum_size); - if (@ftell($this->zip_fd) != ($v_size-$v_maximum_size)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, 'Unable to seek back to the middle of the archive \''.$this->zipname.'\''); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read byte per byte in order to find the signature - $v_pos = ftell($this->zip_fd); - $v_bytes = 0x00000000; - while ($v_pos < $v_size) - { - // ----- Read a byte - $v_byte = @fread($this->zip_fd, 1); - - // ----- Add the byte - //$v_bytes = ($v_bytes << 8) | Ord($v_byte); - // Note we mask the old value down such that once shifted we can never end up with more than a 32bit number - // Otherwise on systems where we have 64bit integers the check below for the magic number will fail. - $v_bytes = ( ($v_bytes & 0xFFFFFF) << 8) | Ord($v_byte); - - // ----- Compare the bytes - if ($v_bytes == 0x504b0506) - { - $v_pos++; - break; - } - - $v_pos++; - } - - // ----- Look if not found end of central dir - if ($v_pos == $v_size) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Unable to find End of Central Dir Record signature"); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Read the first 18 bytes of the header - $v_binary_data = fread($this->zip_fd, 18); - - // ----- Look for invalid block size - if (strlen($v_binary_data) != 18) - { - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, "Invalid End of Central Dir Record size : ".strlen($v_binary_data)); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Extract the values - $v_data = unpack('vdisk/vdisk_start/vdisk_entries/ventries/Vsize/Voffset/vcomment_size', $v_binary_data); - - // ----- Check the global size - if (($v_pos + $v_data['comment_size'] + 18) != $v_size) { - - // ----- Removed in release 2.2 see readme file - // The check of the file size is a little too strict. - // Some bugs where found when a zip is encrypted/decrypted with 'crypt'. - // While decrypted, zip has training 0 bytes - if (0) { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_BAD_FORMAT, - 'The central dir is not at the end of the archive.' - .' Some trailing bytes exists after the archive.'); - - // ----- Return - return PclZip::errorCode(); - } - } - - // ----- Get comment - if ($v_data['comment_size'] != 0) { - $p_central_dir['comment'] = fread($this->zip_fd, $v_data['comment_size']); - } - else - $p_central_dir['comment'] = ''; - - $p_central_dir['entries'] = $v_data['entries']; - $p_central_dir['disk_entries'] = $v_data['disk_entries']; - $p_central_dir['offset'] = $v_data['offset']; - $p_central_dir['size'] = $v_data['size']; - $p_central_dir['disk'] = $v_data['disk']; - $p_central_dir['disk_start'] = $v_data['disk_start']; - - // TBC - //for(reset($p_central_dir); $key = key($p_central_dir); next($p_central_dir)) { - //} - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDeleteByRule() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDeleteByRule(&$p_result_list, &$p_options) - { - $v_result=1; - $v_list_detail = array(); - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Scan all the files - // ----- Start at beginning of Central Dir - $v_pos_entry = $v_central_dir['offset']; - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_pos_entry)) - { - // ----- Close the zip file - $this->privCloseFd(); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read each entry - $v_header_list = array(); - $j_start = 0; - for ($i=0, $v_nb_extracted=0; $i<$v_central_dir['entries']; $i++) - { - - // ----- Read the file header - $v_header_list[$v_nb_extracted] = array(); - if (($v_result = $this->privReadCentralFileHeader($v_header_list[$v_nb_extracted])) != 1) - { - // ----- Close the zip file - $this->privCloseFd(); - - return $v_result; - } - - - // ----- Store the index - $v_header_list[$v_nb_extracted]['index'] = $i; - - // ----- Look for the specific extract rules - $v_found = false; - - // ----- Look for extract by name rule - if ( (isset($p_options[PCLZIP_OPT_BY_NAME])) - && ($p_options[PCLZIP_OPT_BY_NAME] != 0)) { - - // ----- Look if the filename is in the list - for ($j=0; ($j<sizeof($p_options[PCLZIP_OPT_BY_NAME])) && (!$v_found); $j++) { - - // ----- Look for a directory - if (substr($p_options[PCLZIP_OPT_BY_NAME][$j], -1) == "/") { - - // ----- Look if the directory is in the filename path - if ( (strlen($v_header_list[$v_nb_extracted]['stored_filename']) > strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) - && (substr($v_header_list[$v_nb_extracted]['stored_filename'], 0, strlen($p_options[PCLZIP_OPT_BY_NAME][$j])) == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - elseif ( (($v_header_list[$v_nb_extracted]['external']&0x00000010)==0x00000010) /* Indicates a folder */ - && ($v_header_list[$v_nb_extracted]['stored_filename'].'/' == $p_options[PCLZIP_OPT_BY_NAME][$j])) { - $v_found = true; - } - } - // ----- Look for a filename - elseif ($v_header_list[$v_nb_extracted]['stored_filename'] == $p_options[PCLZIP_OPT_BY_NAME][$j]) { - $v_found = true; - } - } - } - - // ----- Look for extract by ereg rule - // ereg() is deprecated with PHP 5.3 - /* - else if ( (isset($p_options[PCLZIP_OPT_BY_EREG])) - && ($p_options[PCLZIP_OPT_BY_EREG] != "")) { - - if (ereg($p_options[PCLZIP_OPT_BY_EREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - $v_found = true; - } - } - */ - - // ----- Look for extract by preg rule - else if ( (isset($p_options[PCLZIP_OPT_BY_PREG])) - && ($p_options[PCLZIP_OPT_BY_PREG] != "")) { - - if (preg_match($p_options[PCLZIP_OPT_BY_PREG], $v_header_list[$v_nb_extracted]['stored_filename'])) { - $v_found = true; - } - } - - // ----- Look for extract by index rule - else if ( (isset($p_options[PCLZIP_OPT_BY_INDEX])) - && ($p_options[PCLZIP_OPT_BY_INDEX] != 0)) { - - // ----- Look if the index is in the list - for ($j=$j_start; ($j<sizeof($p_options[PCLZIP_OPT_BY_INDEX])) && (!$v_found); $j++) { - - if (($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['start']) && ($i<=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end'])) { - $v_found = true; - } - if ($i>=$p_options[PCLZIP_OPT_BY_INDEX][$j]['end']) { - $j_start = $j+1; - } - - if ($p_options[PCLZIP_OPT_BY_INDEX][$j]['start']>$i) { - break; - } - } - } - else { - $v_found = true; - } - - // ----- Look for deletion - if ($v_found) - { - unset($v_header_list[$v_nb_extracted]); - } - else - { - $v_nb_extracted++; - } - } - - // ----- Look if something need to be deleted - if ($v_nb_extracted > 0) { - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Creates a temporary zip archive - $v_temp_zip = new PclZip($v_zip_temp_name); - - // ----- Open the temporary zip file in write mode - if (($v_result = $v_temp_zip->privOpenFd('wb')) != 1) { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Look which file need to be kept - for ($i=0; $i<sizeof($v_header_list); $i++) { - - // ----- Calculate the position of the header - @rewind($this->zip_fd); - if (@fseek($this->zip_fd, $v_header_list[$i]['offset'])) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_INVALID_ARCHIVE_ZIP, 'Invalid archive size'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Read the file header - $v_local_header = array(); - if (($v_result = $this->privReadFileHeader($v_local_header)) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Check that local file header is same as central file header - if ($this->privCheckFileHeaders($v_local_header, - $v_header_list[$i]) != 1) { - // TBC - } - unset($v_local_header); - - // ----- Write the file header - if (($v_result = $v_temp_zip->privWriteFileHeader($v_header_list[$i])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Read/write the data block - if (($v_result = PclZipUtilCopyBlock($this->zip_fd, $v_temp_zip->zip_fd, $v_header_list[$i]['compressed_size'])) != 1) { - // ----- Close the zip file - $this->privCloseFd(); - $v_temp_zip->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_temp_zip->zip_fd); - - // ----- Re-Create the Central Dir files header - for ($i=0; $i<sizeof($v_header_list); $i++) { - // ----- Create the file header - if (($v_result = $v_temp_zip->privWriteCentralFileHeader($v_header_list[$i])) != 1) { - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Transform the header to a 'usable' info - $v_temp_zip->privConvertHeader2FileInfo($v_header_list[$i], $p_result_list[$i]); - } - - - // ----- Zip file comment - $v_comment = ''; - if (isset($p_options[PCLZIP_OPT_COMMENT])) { - $v_comment = $p_options[PCLZIP_OPT_COMMENT]; - } - - // ----- Calculate the size of the central header - $v_size = @ftell($v_temp_zip->zip_fd)-$v_offset; - - // ----- Create the central dir footer - if (($v_result = $v_temp_zip->privWriteCentralHeader(sizeof($v_header_list), $v_size, $v_offset, $v_comment)) != 1) { - // ----- Reset the file list - unset($v_header_list); - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - @unlink($v_zip_temp_name); - - // ----- Return - return $v_result; - } - - // ----- Close - $v_temp_zip->privCloseFd(); - $this->privCloseFd(); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Destroy the temporary archive - unset($v_temp_zip); - } - - // ----- Remove every files : reset the file - else if ($v_central_dir['entries'] != 0) { - $this->privCloseFd(); - - if (($v_result = $this->privOpenFd('wb')) != 1) { - return $v_result; - } - - if (($v_result = $this->privWriteCentralHeader(0, 0, 0, '')) != 1) { - return $v_result; - } - - $this->privCloseFd(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDirCheck() - // Description : - // Check if a directory exists, if not it creates it and all the parents directory - // which may be useful. - // Parameters : - // $p_dir : Directory path to check. - // Return Values : - // 1 : OK - // -1 : Unable to create directory - // -------------------------------------------------------------------------------- - function privDirCheck($p_dir, $p_is_dir = false) - { - $v_result = 1; - - - // ----- Remove the final '/' - if (($p_is_dir) && (substr($p_dir, -1)=='/')) - { - $p_dir = substr($p_dir, 0, strlen($p_dir)-1); - } - - // ----- Check the directory availability - if ((is_dir($p_dir)) || ($p_dir == "")) - { - return 1; - } - - // ----- Extract parent directory - $p_parent_dir = dirname($p_dir); - - // ----- Just a check - if ($p_parent_dir != $p_dir) - { - // ----- Look for parent directory - if ($p_parent_dir != "") - { - if (($v_result = $this->privDirCheck($p_parent_dir)) != 1) - { - return $v_result; - } - } - } - - // ----- Create the directory - if (!@mkdir($p_dir, 0777)) - { - // ----- Error log - PclZip::privErrorLog(PCLZIP_ERR_DIR_CREATE_FAIL, "Unable to create directory '$p_dir'"); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privMerge() - // Description : - // If $p_archive_to_add does not exist, the function exit with a success result. - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privMerge(&$p_archive_to_add) - { - $v_result=1; - - // ----- Look if the archive_to_add exists - if (!is_file($p_archive_to_add->zipname)) - { - - // ----- Nothing to merge, so merge is a success - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Look if the archive exists - if (!is_file($this->zipname)) - { - - // ----- Do a duplicate - $v_result = $this->privDuplicate($p_archive_to_add->zipname); - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('rb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir = array(); - if (($v_result = $this->privReadEndCentralDir($v_central_dir)) != 1) - { - $this->privCloseFd(); - return $v_result; - } - - // ----- Go to beginning of File - @rewind($this->zip_fd); - - // ----- Open the archive_to_add file - if (($v_result=$p_archive_to_add->privOpenFd('rb')) != 1) - { - $this->privCloseFd(); - - // ----- Return - return $v_result; - } - - // ----- Read the central directory informations - $v_central_dir_to_add = array(); - if (($v_result = $p_archive_to_add->privReadEndCentralDir($v_central_dir_to_add)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - return $v_result; - } - - // ----- Go to beginning of File - @rewind($p_archive_to_add->zip_fd); - - // ----- Creates a temporay file - $v_zip_temp_name = PCLZIP_TEMPORARY_DIR.uniqid('pclzip-').'.tmp'; - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($v_zip_temp_name, 'wb')) == 0) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open temporary file \''.$v_zip_temp_name.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = $v_central_dir['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the files from the archive_to_add into the temporary file - $v_size = $v_central_dir_to_add['offset']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Store the offset of the central dir - $v_offset = @ftell($v_zip_temp_fd); - - // ----- Copy the block of file headers from the old archive - $v_size = $v_central_dir['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($this->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Copy the block of file headers from the archive_to_add - $v_size = $v_central_dir_to_add['size']; - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_archive_to_add->zip_fd, $v_read_size); - @fwrite($v_zip_temp_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Merge the file comments - $v_comment = $v_central_dir['comment'].' '.$v_central_dir_to_add['comment']; - - // ----- Calculate the size of the (new) central header - $v_size = @ftell($v_zip_temp_fd)-$v_offset; - - // ----- Swap the file descriptor - // Here is a trick : I swap the temporary fd with the zip fd, in order to use - // the following methods on the temporary fil and not the real archive fd - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Create the central dir footer - if (($v_result = $this->privWriteCentralHeader($v_central_dir['entries']+$v_central_dir_to_add['entries'], $v_size, $v_offset, $v_comment)) != 1) - { - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - @fclose($v_zip_temp_fd); - $this->zip_fd = null; - - // ----- Reset the file list - unset($v_header_list); - - // ----- Return - return $v_result; - } - - // ----- Swap back the file descriptor - $v_swap = $this->zip_fd; - $this->zip_fd = $v_zip_temp_fd; - $v_zip_temp_fd = $v_swap; - - // ----- Close - $this->privCloseFd(); - $p_archive_to_add->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Delete the zip file - // TBC : I should test the result ... - @unlink($this->zipname); - - // ----- Rename the temporary file - // TBC : I should test the result ... - //@rename($v_zip_temp_name, $this->zipname); - PclZipUtilRename($v_zip_temp_name, $this->zipname); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDuplicate() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDuplicate($p_archive_filename) - { - $v_result=1; - - // ----- Look if the $p_archive_filename exists - if (!is_file($p_archive_filename)) - { - - // ----- Nothing to duplicate, so duplicate is a success. - $v_result = 1; - - // ----- Return - return $v_result; - } - - // ----- Open the zip file - if (($v_result=$this->privOpenFd('wb')) != 1) - { - // ----- Return - return $v_result; - } - - // ----- Open the temporary file in write mode - if (($v_zip_temp_fd = @fopen($p_archive_filename, 'rb')) == 0) - { - $this->privCloseFd(); - - PclZip::privErrorLog(PCLZIP_ERR_READ_OPEN_FAIL, 'Unable to open archive file \''.$p_archive_filename.'\' in binary write mode'); - - // ----- Return - return PclZip::errorCode(); - } - - // ----- Copy the files from the archive to the temporary file - // TBC : Here I should better append the file and go back to erase the central dir - $v_size = filesize($p_archive_filename); - while ($v_size != 0) - { - $v_read_size = ($v_size < PCLZIP_READ_BLOCK_SIZE ? $v_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = fread($v_zip_temp_fd, $v_read_size); - @fwrite($this->zip_fd, $v_buffer, $v_read_size); - $v_size -= $v_read_size; - } - - // ----- Close - $this->privCloseFd(); - - // ----- Close the temporary file - @fclose($v_zip_temp_fd); - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorLog() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorLog($p_error_code = 0, $p_error_string = '') - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclError($p_error_code, $p_error_string); - } - else { - $this->error_code = $p_error_code; - $this->error_string = $p_error_string; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privErrorReset() - // Description : - // Parameters : - // -------------------------------------------------------------------------------- - function privErrorReset() - { - if (PCLZIP_ERROR_EXTERNAL == 1) { - PclErrorReset(); - } - else { - $this->error_code = 0; - $this->error_string = ''; - } - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privDisableMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privDisableMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if already done - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Get and memorize the magic_quote value - $this->magic_quotes_status = @get_magic_quotes_runtime(); - - // ----- Disable magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime(0); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : privSwapBackMagicQuotes() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function privSwapBackMagicQuotes() - { - $v_result=1; - - // ----- Look if function exists - if ( (!function_exists("get_magic_quotes_runtime")) - || (!function_exists("set_magic_quotes_runtime"))) { - return $v_result; - } - - // ----- Look if something to do - if ($this->magic_quotes_status != -1) { - return $v_result; - } - - // ----- Swap back magic_quotes - if ($this->magic_quotes_status == 1) { - @set_magic_quotes_runtime($this->magic_quotes_status); - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - } - // End of class - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilPathReduction() - // Description : - // Parameters : - // Return Values : - // -------------------------------------------------------------------------------- - function PclZipUtilPathReduction($p_dir) - { - $v_result = ""; - - // ----- Look for not empty path - if ($p_dir != "") { - // ----- Explode path by directory names - $v_list = explode("/", $p_dir); - - // ----- Study directories from last to first - $v_skip = 0; - for ($i=sizeof($v_list)-1; $i>=0; $i--) { - // ----- Look for current path - if ($v_list[$i] == ".") { - // ----- Ignore this directory - // Should be the first $i=0, but no check is done - } - else if ($v_list[$i] == "..") { - $v_skip++; - } - else if ($v_list[$i] == "") { - // ----- First '/' i.e. root slash - if ($i == 0) { - $v_result = "/".$v_result; - if ($v_skip > 0) { - // ----- It is an invalid path, so the path is not modified - // TBC - $v_result = $p_dir; - $v_skip = 0; - } - } - // ----- Last '/' i.e. indicates a directory - else if ($i == (sizeof($v_list)-1)) { - $v_result = $v_list[$i]; - } - // ----- Double '/' inside the path - else { - // ----- Ignore only the double '//' in path, - // but not the first and last '/' - } - } - else { - // ----- Look for item to skip - if ($v_skip > 0) { - $v_skip--; - } - else { - $v_result = $v_list[$i].($i!=(sizeof($v_list)-1)?"/".$v_result:""); - } - } - } - - // ----- Look for skip - if ($v_skip > 0) { - while ($v_skip > 0) { - $v_result = '../'.$v_result; - $v_skip--; - } - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilPathInclusion() - // Description : - // This function indicates if the path $p_path is under the $p_dir tree. Or, - // said in an other way, if the file or sub-dir $p_path is inside the dir - // $p_dir. - // The function indicates also if the path is exactly the same as the dir. - // This function supports path with duplicated '/' like '//', but does not - // support '.' or '..' statements. - // Parameters : - // Return Values : - // 0 if $p_path is not inside directory $p_dir - // 1 if $p_path is inside directory $p_dir - // 2 if $p_path is exactly the same as $p_dir - // -------------------------------------------------------------------------------- - function PclZipUtilPathInclusion($p_dir, $p_path) - { - $v_result = 1; - - // ----- Look for path beginning by ./ - if ( ($p_dir == '.') - || ((strlen($p_dir) >=2) && (substr($p_dir, 0, 2) == './'))) { - $p_dir = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_dir, 1); - } - if ( ($p_path == '.') - || ((strlen($p_path) >=2) && (substr($p_path, 0, 2) == './'))) { - $p_path = PclZipUtilTranslateWinPath(getcwd(), FALSE).'/'.substr($p_path, 1); - } - - // ----- Explode dir and path by directory separator - $v_list_dir = explode("/", $p_dir); - $v_list_dir_size = sizeof($v_list_dir); - $v_list_path = explode("/", $p_path); - $v_list_path_size = sizeof($v_list_path); - - // ----- Study directories paths - $i = 0; - $j = 0; - while (($i < $v_list_dir_size) && ($j < $v_list_path_size) && ($v_result)) { - - // ----- Look for empty dir (path reduction) - if ($v_list_dir[$i] == '') { - $i++; - continue; - } - if ($v_list_path[$j] == '') { - $j++; - continue; - } - - // ----- Compare the items - if (($v_list_dir[$i] != $v_list_path[$j]) && ($v_list_dir[$i] != '') && ( $v_list_path[$j] != '')) { - $v_result = 0; - } - - // ----- Next items - $i++; - $j++; - } - - // ----- Look if everything seems to be the same - if ($v_result) { - // ----- Skip all the empty items - while (($j < $v_list_path_size) && ($v_list_path[$j] == '')) $j++; - while (($i < $v_list_dir_size) && ($v_list_dir[$i] == '')) $i++; - - if (($i >= $v_list_dir_size) && ($j >= $v_list_path_size)) { - // ----- There are exactly the same - $v_result = 2; - } - else if ($i < $v_list_dir_size) { - // ----- The path is shorter than the dir - $v_result = 0; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilCopyBlock() - // Description : - // Parameters : - // $p_mode : read/write compression mode - // 0 : src & dest normal - // 1 : src gzip, dest normal - // 2 : src normal, dest gzip - // 3 : src & dest gzip - // Return Values : - // -------------------------------------------------------------------------------- - function PclZipUtilCopyBlock($p_src, $p_dest, $p_size, $p_mode = 0) - { - $v_result = 1; - - if ($p_mode==0) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==1) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @fwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==2) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @fread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - else if ($p_mode==3) - { - while ($p_size != 0) - { - $v_read_size = ($p_size < PCLZIP_READ_BLOCK_SIZE ? $p_size : PCLZIP_READ_BLOCK_SIZE); - $v_buffer = @gzread($p_src, $v_read_size); - @gzwrite($p_dest, $v_buffer, $v_read_size); - $p_size -= $v_read_size; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilRename() - // Description : - // This function tries to do a simple rename() function. If it fails, it - // tries to copy the $p_src file in a new $p_dest file and then unlink the - // first one. - // Parameters : - // $p_src : Old filename - // $p_dest : New filename - // Return Values : - // 1 on success, 0 on failure. - // -------------------------------------------------------------------------------- - function PclZipUtilRename($p_src, $p_dest) - { - $v_result = 1; - - // ----- Try to rename the files - if (!@rename($p_src, $p_dest)) { - - // ----- Try to copy & unlink the src - if (!@copy($p_src, $p_dest)) { - $v_result = 0; - } - else if (!@unlink($p_src)) { - $v_result = 0; - } - } - - // ----- Return - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilOptionText() - // Description : - // Translate option value in text. Mainly for debug purpose. - // Parameters : - // $p_option : the option value. - // Return Values : - // The option text value. - // -------------------------------------------------------------------------------- - function PclZipUtilOptionText($p_option) - { - - $v_list = get_defined_constants(); - for (reset($v_list); $v_key = key($v_list); next($v_list)) { - $v_prefix = substr($v_key, 0, 10); - if (( ($v_prefix == 'PCLZIP_OPT') - || ($v_prefix == 'PCLZIP_CB_') - || ($v_prefix == 'PCLZIP_ATT')) - && ($v_list[$v_key] == $p_option)) { - return $v_key; - } - } - - $v_result = 'Unknown'; - - return $v_result; - } - // -------------------------------------------------------------------------------- - - // -------------------------------------------------------------------------------- - // Function : PclZipUtilTranslateWinPath() - // Description : - // Translate windows path by replacing '\' by '/' and optionally removing - // drive letter. - // Parameters : - // $p_path : path to translate. - // $p_remove_disk_letter : true | false - // Return Values : - // The path translated. - // -------------------------------------------------------------------------------- - function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter = true) - { - if (_OS_SERVEUR=='windows' OR stristr(@php_uname(), 'windows')) { - // ----- Look for potential disk letter - if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { - $p_path = substr($p_path, $v_position+1); - } - // ----- Change potential windows directory separator - if ((strpos($p_path, '\\') > 0) || (substr($p_path, 0,1) == '\\')) { - $p_path = strtr($p_path, '\\', '/'); - } - } - return $p_path; - } - // -------------------------------------------------------------------------------- +// -------------------------------------------------------------------------------- ?> diff --git a/ecrire/inc/pipelines.php b/ecrire/inc/pipelines.php index 16512f0af2..c7d4785868 100644 --- a/ecrire/inc/pipelines.php +++ b/ecrire/inc/pipelines.php @@ -14,11 +14,13 @@ * Fonctions déclarées dans des pipelines (espace public) * * @package SPIP\Core\Pipelines -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; -if (test_espace_prive()) + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} +if (test_espace_prive()) { include_spip('inc/pipelines_ecrire'); - +} /** @@ -29,7 +31,7 @@ if (test_espace_prive()) * des js chargée peut être complété par le pipeline 'jquery_plugins' * * Cette fonction est appelée par le pipeline insert_head - * + * * @internal * Ne pas vérifier ici qu'on ne doublonne pas `#INSERT_HEAD` * car cela empêche un double appel (multi calcul en cache cool, @@ -38,28 +40,30 @@ if (test_espace_prive()) * @see f_jQuery_prive() * @pipeline insert_head * @pipeline_appel jquery_plugins - * - * @param string $texte Contenu qui sera inséré dans le head HTML + * + * @param string $texte Contenu qui sera inséré dans le head HTML * @return string Contenu qui sera inséré dans le head HTML -**/ -function f_jQuery ($texte) { + **/ +function f_jQuery($texte) { $x = ''; $jquery_plugins = pipeline('jquery_plugins', array( - 'javascript/jquery.js', - 'javascript/jquery.form.js', - 'javascript/jquery.autosave.js', - 'javascript/jquery.placeholder-label.js', - 'javascript/ajaxCallback.js', - 'javascript/jquery.cookie.js' + 'javascript/jquery.js', + 'javascript/jquery.form.js', + 'javascript/jquery.autosave.js', + 'javascript/jquery.placeholder-label.js', + 'javascript/ajaxCallback.js', + 'javascript/jquery.cookie.js' )); - foreach (array_unique($jquery_plugins) as $script) - if ($script = find_in_path($script)){ + foreach (array_unique($jquery_plugins) as $script) { + if ($script = find_in_path($script)) { $script = timestamp($script); $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n"; } + } + + $texte = $x . $texte; - $texte = $x.$texte; return $texte; } @@ -74,19 +78,24 @@ function f_jQuery ($texte) { * Cette fonction est appelée par le pipeline affichage_final * * @pipeline affichage_final - * - * @param string $texte Contenu de la page envoyée au navigateur + * + * @param string $texte Contenu de la page envoyée au navigateur * @return string Contenu de la page envoyée au navigateur -**/ -function f_surligne ($texte) { - if (!$GLOBALS['html']) return $texte; + **/ +function f_surligne($texte) { + if (!$GLOBALS['html']) { + return $texte; + } $rech = _request('var_recherche'); if (!$rech - AND (!defined('_SURLIGNE_RECHERCHE_REFERERS') - OR !_SURLIGNE_RECHERCHE_REFERERS - OR !isset($_SERVER['HTTP_REFERER']))) + AND (!defined('_SURLIGNE_RECHERCHE_REFERERS') + OR !_SURLIGNE_RECHERCHE_REFERERS + OR !isset($_SERVER['HTTP_REFERER'])) + ) { return $texte; + } include_spip('inc/surligne'); + return surligner_mots($texte, $rech); } @@ -97,13 +106,13 @@ function f_surligne ($texte) { * définie à true. * * Cette fonction est appelée par le pipeline affichage_final - * + * * @pipeline affichage_final - * - * @param string $texte Contenu de la page envoyée au navigateur + * + * @param string $texte Contenu de la page envoyée au navigateur * @return string Contenu de la page envoyée au navigateur **/ -function f_tidy ($texte) { +function f_tidy($texte) { /** * Indentation à faire ? * @@ -112,16 +121,20 @@ function f_tidy ($texte) { */ if ($GLOBALS['xhtml'] # tidy demande - AND $GLOBALS['html'] # verifie que la page avait l'entete text/html - AND strlen($texte) - AND !headers_sent()) { + AND $GLOBALS['html'] # verifie que la page avait l'entete text/html + AND strlen($texte) + AND !headers_sent() + ) { # Compatibilite ascendante - if (!is_string($GLOBALS['xhtml'])) $GLOBALS['xhtml'] ='tidy'; + if (!is_string($GLOBALS['xhtml'])) { + $GLOBALS['xhtml'] = 'tidy'; + } if (!$f = charger_fonction($GLOBALS['xhtml'], 'inc', true)) { spip_log("tidy absent, l'indenteur SPIP le remplace"); $f = charger_fonction('sax', 'xml'); } + return $f($texte); } @@ -139,20 +152,22 @@ function f_tidy ($texte) { * si cela n'a pas été fait. * * @pipeline_appel insert_head - * - * @param string $texte Contenu de la page envoyée au navigateur + * + * @param string $texte Contenu de la page envoyée au navigateur * @return string Contenu de la page envoyée au navigateur -**/ + **/ function f_insert_head($texte) { - if (!$GLOBALS['html']) return $texte; + if (!$GLOBALS['html']) { + return $texte; + } include_spip('public/admin'); // pour strripos ($pos = stripos($texte, '</head>')) - || ($pos = stripos($texte, '<body>')) - || ($pos = 0); + || ($pos = stripos($texte, '<body>')) + || ($pos = 0); - if (false === strpos(substr($texte, 0,$pos), '<!-- insert_head -->')) { - $insert = "\n".pipeline('insert_head','<!-- f_insert_head -->')."\n"; + if (false === strpos(substr($texte, 0, $pos), '<!-- insert_head -->')) { + $insert = "\n" . pipeline('insert_head', '<!-- f_insert_head -->') . "\n"; $texte = substr_replace($texte, $insert, $pos, 0); } @@ -162,25 +177,26 @@ function f_insert_head($texte) { /** * Insérer au besoin les boutons admins - * + * * Cette fonction est appelée par le pipeline affichage_final * * @pipeline affichage_final * @uses affiche_boutons_admin() - * - * @param string $texte Contenu de la page envoyée au navigateur + * + * @param string $texte Contenu de la page envoyée au navigateur * @return string Contenu de la page envoyée au navigateur -**/ + **/ function f_admin($texte) { if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW AND $GLOBALS['html']) { include_spip('inc/filtres'); // pour http_img_pack $x = "<div class='spip-previsu' " - . http_style_background('preview-32.png') - . ">" - . _T('previsualisation') - . "</div>"; - if (!$pos = stripos($texte, '</body>')) + . http_style_background('preview-32.png') + . ">" + . _T('previsualisation') + . "</div>"; + if (!$pos = stripos($texte, '</body>')) { $pos = strlen($texte); + } $texte = substr_replace($texte, $x, $pos, 0); } @@ -188,9 +204,10 @@ function f_admin($texte) { include_spip('public/admin'); $texte = affiche_boutons_admin($texte); } - if (_request('var_mode')=='noajax'){ - $texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims',"\\1\\2",$texte); + if (_request('var_mode') == 'noajax') { + $texte = preg_replace(',(class=[\'"][^\'"]*)ajax([^\'"]*[\'"]),Uims', "\\1\\2", $texte); } + return $texte; } @@ -199,37 +216,40 @@ function f_admin($texte) { * * Appelle f_afficher_blocs_ecrire() sur les inclusions dans l'espace privé. * Ne change rien dans l'espace public. - * - * Cette fonction est appelée par le pipeline recuperer_fond + * + * Cette fonction est appelée par le pipeline recuperer_fond * * @uses f_afficher_blocs_ecrire() * @pipeline recuperer_fond - * - * @param array $flux Description et contenu de l'inclusion + * + * @param array $flux Description et contenu de l'inclusion * @return array $flux Description et contenu de l'inclusion -**/ + **/ function f_recuperer_fond($flux) { - if (!test_espace_prive()) return $flux; + if (!test_espace_prive()) { + return $flux; + } + return f_afficher_blocs_ecrire($flux); } /** * Gérer le lancement du cron si des tâches sont en attente - * + * * @pipeline affichage_final * @uses queue_sleep_time_to_next_job() * @uses queue_affichage_cron() - * - * @param string $texte Contenu de la page envoyée au navigateur + * + * @param string $texte Contenu de la page envoyée au navigateur * @return string Contenu de la page envoyée au navigateur */ -function f_queue(&$texte){ +function f_queue(&$texte) { // eviter une inclusion si rien a faire - if (_request('action')=='cron' - OR queue_sleep_time_to_next_job()>0 - OR defined('_DEBUG_BLOCK_QUEUE')) - { + if (_request('action') == 'cron' + OR queue_sleep_time_to_next_job() > 0 + OR defined('_DEBUG_BLOCK_QUEUE') + ) { return $texte; } @@ -243,8 +263,8 @@ function f_queue(&$texte){ } // inserer avant le </body> fermant si on peut, a la fin de la page sinon - if (($p=strpos($texte,'</body>'))!==FALSE) { - $texte = substr($texte,0,$p).$code.substr($texte,$p); + if (($p = strpos($texte, '</body>')) !== false) { + $texte = substr($texte, 0, $p) . $code . substr($texte, $p); } else { $texte .= $code; } diff --git a/ecrire/inc/pipelines_ecrire.php b/ecrire/inc/pipelines_ecrire.php index a93186847e..e5f83d28a3 100644 --- a/ecrire/inc/pipelines_ecrire.php +++ b/ecrire/inc/pipelines_ecrire.php @@ -14,8 +14,10 @@ * Fonctions déclarées dans des pipelines (espace privé) * * @package SPIP\Core\Pipelines -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -29,11 +31,11 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * * @see f_jQuery() * @link http://code.spip.net/@f_jQuery - * - * @param string $texte Contenu qui sera inséré dans le head HTML + * + * @param string $texte Contenu qui sera inséré dans le head HTML * @return string Contenu complété des scripts javascripts, dont jQuery -**/ -function f_jQuery_prive ($texte) { + **/ +function f_jQuery_prive($texte) { $x = ''; $jquery_plugins = pipeline('jquery_plugins', array( @@ -45,47 +47,53 @@ function f_jQuery_prive ($texte) { 'prive/javascript/jquery.cookie.js', 'prive/javascript/spip_barre.js', )); - foreach (array_unique($jquery_plugins) as $script) - if ($script = find_in_path($script)){ + foreach (array_unique($jquery_plugins) as $script) { + if ($script = find_in_path($script)) { $script = timestamp($script); $x .= "\n<script src=\"$script\" type=\"text/javascript\"></script>\n"; } - // inserer avant le premier script externe ou a la fin - if (preg_match(",<script[^><]*src=,",$texte,$match) - AND $p = strpos($texte,$match[0])){ - $texte = substr_replace($texte,$x,$p,0); } - else + // inserer avant le premier script externe ou a la fin + if (preg_match(",<script[^><]*src=,", $texte, $match) + AND $p = strpos($texte, $match[0]) + ) { + $texte = substr_replace($texte, $x, $p, 0); + } else { $texte .= $x; + } + return $texte; } /** * Ajout automatique du title dans les pages du privé en squelette - * + * * Appellé dans le pipeline affichage_final_prive * * @param string $texte * @return string */ -function affichage_final_prive_title_auto($texte){ - if (strpos($texte,'<title>')===false - AND - (preg_match(",<h1[^>]*>(.+)</h1>,Uims", $texte, $match) - OR preg_match(",<h[23][^>]*>(.+)</h[23]>,Uims", $texte, $match)) +function affichage_final_prive_title_auto($texte) { + if (strpos($texte, '<title>') === false + AND + (preg_match(",<h1[^>]*>(.+)</h1>,Uims", $texte, $match) + OR preg_match(",<h[23][^>]*>(.+)</h[23]>,Uims", $texte, $match)) AND $match = textebrut(trim($match[1])) - AND ($p = strpos($texte,'<head>'))!==FALSE) { - if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']["nom_site"]))) - $nom_site_spip= _T('info_mon_site_spip'); + AND ($p = strpos($texte, '<head>')) !== false + ) { + if (!$nom_site_spip = textebrut(typo($GLOBALS['meta']["nom_site"]))) { + $nom_site_spip = _T('info_mon_site_spip'); + } $titre = "<title>[" . $nom_site_spip - . "] ". $match - ."</title>"; + . "] " . $match + . "</title>"; - $texte = substr_replace($texte, $titre, $p+6,0); + $texte = substr_replace($texte, $titre, $p+6, 0); } + return $texte; } @@ -96,80 +104,93 @@ function f_boite_infos($flux) { $args = $flux['args']; $type = $args['type']; unset($args['row']); - if (!trouver_fond($type,"prive/objets/infos/")) + if (!trouver_fond($type, "prive/objets/infos/")) { $type = 'objet'; - $flux['data'] .= recuperer_fond("prive/objets/infos/$type",$args); + } + $flux['data'] .= recuperer_fond("prive/objets/infos/$type", $args); + return $flux; } /** * Utilisation du pipeline recuperer_fond dans le prive - * + * * Branchement automatise de affiche_gauche, affiche_droite, affiche_milieu * pour assurer la compat avec les versions precedentes des exec en php * Branche de affiche_objet - * + * * Les pipelines ne recevront plus exactement le meme contenu en entree, * mais la compat multi vertions pourra etre assuree * par une insertion au bon endroit quand le contenu de depart n'est pas vide - * + * * @param array $flux Données du pipeline * @return array Données du pipeline */ function f_afficher_blocs_ecrire($flux) { - static $o=array(); - if (is_string($fond=$flux['args']['fond'])) { + static $o = array(); + if (is_string($fond = $flux['args']['fond'])) { $exec = isset($flux['args']['contexte']['exec']) ? $flux['args']['contexte']['exec'] : _request('exec'); - if (!isset($o[$exec])){ + if (!isset($o[$exec])) { $o[$exec] = trouver_objet_exec($exec); } // cas particulier - if ($exec=="infos_perso"){ + if ($exec == "infos_perso") { $flux['args']['contexte']['id_auteur'] = $GLOBALS['visiteur_session']['id_auteur']; } - $typepage = (isset($flux['args']['contexte']['type-page'])?$flux['args']['contexte']['type-page']:$exec); - if ($fond == "prive/squelettes/navigation/$typepage"){ - $flux['data']['texte'] = pipeline('affiche_gauche',array('args'=>$flux['args']['contexte'],'data'=>$flux['data']['texte'])); - } - elseif ($fond=="prive/squelettes/extra/$typepage") { + $typepage = (isset($flux['args']['contexte']['type-page']) ? $flux['args']['contexte']['type-page'] : $exec); + if ($fond == "prive/squelettes/navigation/$typepage") { + $flux['data']['texte'] = pipeline('affiche_gauche', + array('args' => $flux['args']['contexte'], 'data' => $flux['data']['texte'])); + } elseif ($fond == "prive/squelettes/extra/$typepage") { include_spip('inc/presentation_mini'); - $flux['data']['texte'] = pipeline('affiche_droite',array('args'=>$flux['args']['contexte'],'data'=>$flux['data']['texte'])).liste_objets_bloques($exec,$flux['args']['contexte']); - } - elseif ($fond=="prive/squelettes/hierarchie/$typepage" AND $o[$exec]) { + $flux['data']['texte'] = pipeline('affiche_droite', + array('args' => $flux['args']['contexte'], 'data' => $flux['data']['texte'])) . liste_objets_bloques($exec, + $flux['args']['contexte']); + } elseif ($fond == "prive/squelettes/hierarchie/$typepage" AND $o[$exec]) { // id non defini sur les formulaire de nouveaux objets $id = isset($flux['args']['contexte'][$o[$exec]['id_table_objet']]) ? intval($flux['args']['contexte'][$o[$exec]['id_table_objet']]) : 0; - $flux['data']['texte'] = pipeline('affiche_hierarchie',array('args'=>array('objet'=>$o[$exec]['type'],'id_objet'=>$id),'data'=>$flux['data']['texte'])); - } - elseif ($fond=="prive/squelettes/contenu/$typepage"){ - if (!strpos($flux['data']['texte'],"<!--affiche_milieu-->")) - $flux['data']['texte'] = preg_replace(',<div id=["\']wysiwyg,',"<!--affiche_milieu-->\\0",$flux['data']['texte']); + $flux['data']['texte'] = pipeline('affiche_hierarchie', + array('args' => array('objet' => $o[$exec]['type'], 'id_objet' => $id), 'data' => $flux['data']['texte'])); + } elseif ($fond == "prive/squelettes/contenu/$typepage") { + if (!strpos($flux['data']['texte'], "<!--affiche_milieu-->")) { + $flux['data']['texte'] = preg_replace(',<div id=["\']wysiwyg,', "<!--affiche_milieu-->\\0", + $flux['data']['texte']); + } if ($o[$exec] AND $objet = $o[$exec]['type'] - AND $o[$exec]['edition'] == false - AND isset($flux['args']['contexte'][$o[$exec]['id_table_objet']]) - AND $id = intval($flux['args']['contexte'][$o[$exec]['id_table_objet']])){ + AND $o[$exec]['edition'] == false + AND isset($flux['args']['contexte'][$o[$exec]['id_table_objet']]) + AND $id = intval($flux['args']['contexte'][$o[$exec]['id_table_objet']]) + ) { // inserer le formulaire de traduction - $flux['data']['texte'] = str_replace("<!--affiche_milieu-->",recuperer_fond('prive/objets/editer/traductions',array('objet'=>$objet,'id_objet'=>$id))."<!--affiche_milieu-->",$flux['data']['texte']); - $flux['data']['texte'] = pipeline('afficher_fiche_objet',array( - 'args'=>array( - 'contexte'=>$flux['args']['contexte'], - 'type'=>$objet, - 'id'=>$id), - 'data'=>$flux['data']['texte'])); + $flux['data']['texte'] = str_replace("<!--affiche_milieu-->", recuperer_fond('prive/objets/editer/traductions', + array('objet' => $objet, 'id_objet' => $id)) . "<!--affiche_milieu-->", $flux['data']['texte']); + $flux['data']['texte'] = pipeline('afficher_fiche_objet', array( + 'args' => array( + 'contexte' => $flux['args']['contexte'], + 'type' => $objet, + 'id' => $id + ), + 'data' => $flux['data']['texte'] + )); } - $flux['data']['texte'] = pipeline('affiche_milieu',array('args'=>$flux['args']['contexte'],'data'=>$flux['data']['texte'])); - } - elseif ($fond=="prive/squelettes/inclure/pied"){ - $flux['data']['texte'] = pipeline('affiche_pied',array('args'=>$flux['args']['contexte'],'data'=>$flux['data']['texte'])); - } - elseif (strncmp($fond,"prive/objets/contenu/",21)==0 - AND $objet=basename($fond) - AND $objet==substr($fond,21) - AND isset($o[$objet]) - AND $o[$objet]) { - $id = intval($flux['args']['contexte'][$o[$exec]['id_table_objet']]); - $flux['data']['texte'] = pipeline('afficher_contenu_objet',array('args'=>array('type'=>$objet,'id_objet'=>$id,'contexte'=>$flux['args']['contexte']),'data'=>$flux['data']['texte'])); + $flux['data']['texte'] = pipeline('affiche_milieu', + array('args' => $flux['args']['contexte'], 'data' => $flux['data']['texte'])); + } elseif ($fond == "prive/squelettes/inclure/pied") { + $flux['data']['texte'] = pipeline('affiche_pied', + array('args' => $flux['args']['contexte'], 'data' => $flux['data']['texte'])); + } elseif (strncmp($fond, "prive/objets/contenu/", 21) == 0 + AND $objet = basename($fond) + AND $objet == substr($fond, 21) + AND isset($o[$objet]) + AND $o[$objet] + ) { + $id = intval($flux['args']['contexte'][$o[$exec]['id_table_objet']]); + $flux['data']['texte'] = pipeline('afficher_contenu_objet', array( + 'args' => array('type' => $objet, 'id_objet' => $id, 'contexte' => $flux['args']['contexte']), + 'data' => $flux['data']['texte'] + )); } } @@ -183,24 +204,26 @@ function f_afficher_blocs_ecrire($flux) { * @param string $flux * @return string */ -function f_queue_affiche_milieu($flux){ +function f_queue_affiche_milieu($flux) { $args = $flux['args']; $res = ""; - foreach($args as $key=>$arg){ - if (preg_match(",^id_,",$key) AND is_numeric($arg) AND $arg=intval($arg)){ + foreach ($args as $key => $arg) { + if (preg_match(",^id_,", $key) AND is_numeric($arg) AND $arg = intval($arg)) { $objet = preg_replace(',^id_,', '', $key); - $res .= recuperer_fond('modeles/object_jobs_list',array('id_objet'=>$arg,'objet'=>$objet),array('ajax'=>true)); + $res .= recuperer_fond('modeles/object_jobs_list', array('id_objet' => $arg, 'objet' => $objet), + array('ajax' => true)); } } - if ($res) + if ($res) { $flux['data'] = $res . $flux['data']; + } return $flux; } /** * Trouver l'objet qui correspond à l'exec de l'espace privé passé en argument - * + * * renvoie false si pas d'objet en cours, ou un tableau associatif * contenant les informations table_objet_sql,table,type,id_table_objet,edition * @@ -208,26 +231,42 @@ function f_queue_affiche_milieu($flux){ * nom de la page testee * @return array|bool */ -function trouver_objet_exec($exec){ - static $objet_exec=array(); - if (!$exec) return false; +function trouver_objet_exec($exec) { + static $objet_exec = array(); + if (!$exec) { + return false; + } // cas particulier - if ($exec=="infos_perso"){ + if ($exec == "infos_perso") { $exec = "auteur"; - set_request('id_auteur',$GLOBALS['visiteur_session']['id_auteur']); + set_request('id_auteur', $GLOBALS['visiteur_session']['id_auteur']); } - if (!isset($objet_exec[$exec])){ - $objet_exec[$exec]=false; + if (!isset($objet_exec[$exec])) { + $objet_exec[$exec] = false; $infos = lister_tables_objets_sql(); - foreach($infos as $t=>$info){ - if ($exec==$info['url_edit'] AND $info['editable']){ - return $objet_exec[$exec] = array('edition'=>$exec==$info['url_voir']?'':true,'table_objet_sql'=>$t,'table'=>$info['table_objet'],'type'=>$info['type'],'id_table_objet'=>id_table_objet($info['type'])); + foreach ($infos as $t => $info) { + if ($exec == $info['url_edit'] AND $info['editable']) { + return $objet_exec[$exec] = array( + 'edition' => $exec == $info['url_voir'] ? '' : true, + 'table_objet_sql' => $t, + 'table' => $info['table_objet'], + 'type' => $info['type'], + 'id_table_objet' => id_table_objet($info['type']) + ); } - if ($exec==$info['url_voir']){ - return $objet_exec[$exec] = array('edition'=>false,'table_objet_sql'=>$t,'table'=>$info['table_objet'],'type'=>$info['type'],'id_table_objet'=>id_table_objet($info['type'])); + if ($exec == $info['url_voir']) { + return $objet_exec[$exec] = array( + 'edition' => false, + 'table_objet_sql' => $t, + 'table' => $info['table_objet'], + 'type' => $info['type'], + 'id_table_objet' => id_table_objet($info['type']) + ); } } } + return $objet_exec[$exec]; } + ?> diff --git a/ecrire/inc/plonger.php b/ecrire/inc/plonger.php index b79dfb9390..a441fc55da 100644 --- a/ecrire/inc/plonger.php +++ b/ecrire/inc/plonger.php @@ -10,15 +10,19 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/texte'); // http://code.spip.net/@inc_plonger_dist function inc_plonger_dist($id_rubrique, $idom = "", $list = array(), $col = 1, $exclu = 0, $do = 'aff') { - if ($list) $id_rubrique = $list[$col-1]; - + if ($list) { + $id_rubrique = $list[$col-1]; + } + $ret = ''; # recherche les filles et petites-filles de la rubrique donnee @@ -29,29 +33,30 @@ function inc_plonger_dist($id_rubrique, $idom = "", $list = array(), $col = 1, $ $rub = array(); $res = sql_select("rub1.id_rubrique, rub1.titre, rub1.id_parent, rub1.lang, rub1.langue_choisie, rub2.id_rubrique AS id_enfant", - "spip_rubriques AS rub1 LEFT JOIN spip_rubriques AS rub2 ON (rub1.id_rubrique = rub2.id_parent)", - "rub1.id_parent = ".sql_quote($id_rubrique)." - AND rub1.id_rubrique!=".sql_quote($exclu)." - AND (rub2.id_rubrique IS NULL OR rub2.id_rubrique!=".sql_quote($exclu).")", "", "0+rub1.titre,rub1.titre"); + "spip_rubriques AS rub1 LEFT JOIN spip_rubriques AS rub2 ON (rub1.id_rubrique = rub2.id_parent)", + "rub1.id_parent = " . sql_quote($id_rubrique) . " + AND rub1.id_rubrique!=" . sql_quote($exclu) . " + AND (rub2.id_rubrique IS NULL OR rub2.id_rubrique!=" . sql_quote($exclu) . ")", "", "0+rub1.titre,rub1.titre"); while ($row = sql_fetch($res)) { - if (autoriser('voir','rubrique',$row['id_rubrique'])){ + if (autoriser('voir', 'rubrique', $row['id_rubrique'])) { $rub[$row['id_rubrique']]['enfants'] = $row['id_enfant']; if ($row['id_parent'] == $id_rubrique) { $t = trim(typo(supprimer_numero($row['titre']))); - if ($row['langue_choisie'] != 'oui') + if ($row['langue_choisie'] != 'oui') { $t .= ' <small title="' - .traduire_nom_langue($row['lang']) - .'">[' . $row['lang'] . ']</small>'; - $ordre[$row['id_rubrique']] = $t; + . traduire_nom_langue($row['lang']) + . '">[' . $row['lang'] . ']</small>'; + } + $ordre[$row['id_rubrique']] = $t; } } } $next = isset($list[$col]) ? $list[$col] : 0; if ($ordre) { - $rec = generer_url_ecrire('plonger',"rac=$idom&exclus=$exclu&do=$do&col=".($col+1)); + $rec = generer_url_ecrire('plonger', "rac=$idom&exclus=$exclu&do=$do&col=" . ($col+1)); $info = generer_url_ecrire('informer', "type=rubrique&rac=$idom&do=$do&id="); - $args = "'$idom',this,$col,'".$GLOBALS['spip_lang_left']."','$info',event"; + $args = "'$idom',this,$col,'" . $GLOBALS['spip_lang_left'] . "','$info',event"; while (list($id, $titrebrut) = each($ordre)) { $titre = supprimer_numero($titrebrut); @@ -67,45 +72,46 @@ function inc_plonger_dist($id_rubrique, $idom = "", $list = array(), $col = 1, $ $js_func = $do . '_selection_titre'; $click = "\nonclick=\"changerhighlight(this.parentNode.parentNode.parentNode);\nreturn " - . (!is_array($list) ? ' false' - : "aff_selection_provisoire($id,$args)") + . (!is_array($list) ? ' false' + : "aff_selection_provisoire($id,$args)") # ce lien provoque la selection (directe) de la rubrique cliquee # et l'affichage de son titre dans le bandeau - . "\"\nondblclick=\"" - . "$js_func(this." - . "firstChild.nodeValue," - . $id - . ",'selection_rubrique','id_parent');" - . "\nreturn aff_selection_provisoire($id,$args);" - . "\""; + . "\"\nondblclick=\"" + . "$js_func(this." + . "firstChild.nodeValue," + . $id + . ",'selection_rubrique','id_parent');" + . "\nreturn aff_selection_provisoire($id,$args);" + . "\""; $ret .= "<div class='" - . (($id == $next) ? "item on" : "item") - . "'><div class='" - . $classe1 - . "'><div$classe2><a" - . $url - . $click - . ">" - . $titre - . "</a></div></div></div>"; + . (($id == $next) ? "item on" : "item") + . "'><div class='" + . $classe1 + . "'><div$classe2><a" + . $url + . $click + . ">" + . $titre + . "</a></div></div></div>"; } } - $idom2 = $idom . "_col_".($col+1); + $idom2 = $idom . "_col_" . ($col+1); $left = ($col*150); - return http_img_pack("searching.gif", "*", "style='visibility: hidden; position: absolute; ".$GLOBALS['spip_lang_left'].": " - . ($left-30) - . "px; top: 2px; z-index: 2;' id='img_$idom2'") - . "<div style='width: 150px; height: 100%; overflow: auto; position: absolute; top: 0px; ".$GLOBALS['spip_lang_left'].": " - .($left-150) - ."px;'>" + return http_img_pack("searching.gif", "*", + "style='visibility: hidden; position: absolute; " . $GLOBALS['spip_lang_left'] . ": " + . ($left-30) + . "px; top: 2px; z-index: 2;' id='img_$idom2'") + . "<div style='width: 150px; height: 100%; overflow: auto; position: absolute; top: 0px; " . $GLOBALS['spip_lang_left'] . ": " + . ($left-150) + . "px;'>" . $ret . "\n</div>\n<div id='$idom2'>" . ($next - ? inc_plonger_dist($id_rubrique, $idom, $list, $col+1, $exclu) - : "") + ? inc_plonger_dist($id_rubrique, $idom, $list, $col+1, $exclu) + : "") . "\n</div>"; } diff --git a/ecrire/inc/plugin.php b/ecrire/inc/plugin.php index 6fd3a9bc77..55c8ed6556 100644 --- a/ecrire/inc/plugin.php +++ b/ecrire/inc/plugin.php @@ -14,12 +14,14 @@ * Gestion de l'activation des plugins * * @package SPIP\Core\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** l'adresse du repertoire de telechargement et de decompactage des plugins */ -define('_DIR_PLUGINS_AUTO', _DIR_PLUGINS.'auto/'); +define('_DIR_PLUGINS_AUTO', _DIR_PLUGINS . 'auto/'); #include_spip('inc/texte'); // ????? Appelle public/parametrer trop tot avant la reconstruction du chemin des plugins. include_spip('plugins/installer'); @@ -29,23 +31,26 @@ include_spip('plugins/installer'); // _DIR_PLUGINS_SUPPL pour aller en chercher ailleurs // (chemin relatif a la racine du site) // http://code.spip.net/@liste_plugin_files -function liste_plugin_files($dir_plugins = null){ - static $plugin_files=array(); - if (is_null($dir_plugins)) +function liste_plugin_files($dir_plugins = null) { + static $plugin_files = array(); + if (is_null($dir_plugins)) { $dir_plugins = _DIR_PLUGINS; + } if (!isset($plugin_files[$dir_plugins]) - OR count($plugin_files[$dir_plugins]) == 0){ + OR count($plugin_files[$dir_plugins]) == 0 + ) { $plugin_files[$dir_plugins] = array(); foreach (fast_find_plugin_dirs($dir_plugins) as $plugin) { - $plugin_files[$dir_plugins][] = substr($plugin,strlen($dir_plugins)); + $plugin_files[$dir_plugins][] = substr($plugin, strlen($dir_plugins)); } sort($plugin_files[$dir_plugins]); // et on lit le XML de tous les plugins pour le mettre en cache // et en profiter pour nettoyer ceux qui n'existent plus du cache - $get_infos = charger_fonction('get_infos','plugins'); - $get_infos($plugin_files[$dir_plugins],false,$dir_plugins,true); + $get_infos = charger_fonction('get_infos', 'plugins'); + $get_infos($plugin_files[$dir_plugins], false, $dir_plugins, true); } + return $plugin_files[$dir_plugins]; } @@ -54,51 +59,63 @@ function fast_find_plugin_dirs($dir, $max_prof = 100) { // revenir au repertoire racine si on a recu dossier/truc // pour regarder dossier/truc/ ne pas oublier le / final $dir = preg_replace(',/[^/]*$,', '', $dir); - if ($dir == '') $dir = '.'; + if ($dir == '') { + $dir = '.'; + } - if (!is_dir($dir)) + if (!is_dir($dir)) { return $fichiers; - if (is_plugin_dir($dir,'')) { + } + if (is_plugin_dir($dir, '')) { $fichiers[] = $dir; + return $fichiers; } - if ($max_prof<=0) + if ($max_prof <= 0) { return $fichiers; + } $subdirs = array(); if (@is_dir($dir) AND is_readable($dir) AND $d = @opendir($dir)) { while (($f = readdir($d)) !== false) { if ($f[0] != '.' # ignorer . .. .svn etc - AND $f != 'CVS' - AND is_dir($f = "$dir/$f")) + AND $f != 'CVS' + AND is_dir($f = "$dir/$f") + ) { $subdirs[] = $f; + } } closedir($d); } - foreach($subdirs as $d){ - $fichiers = array_merge($fichiers,fast_find_plugin_dirs("$d/",$max_prof-1)); + foreach ($subdirs as $d) { + $fichiers = array_merge($fichiers, fast_find_plugin_dirs("$d/", $max_prof-1)); } + return $fichiers; } -function is_plugin_dir($dir, $dir_plugins = null){ - if (is_array($dir)){ - foreach($dir as $k=>$d){ - if (!is_plugin_dir($d,$dir_plugins)) +function is_plugin_dir($dir, $dir_plugins = null) { + if (is_array($dir)) { + foreach ($dir as $k => $d) { + if (!is_plugin_dir($d, $dir_plugins)) { unset($dir[$k]); + } } + return $dir; } - if (is_null($dir_plugins)) + if (is_null($dir_plugins)) { $dir_plugins = _DIR_PLUGINS; - $search = array("$dir_plugins$dir/plugin.xml","$dir_plugins$dir/paquet.xml"); + } + $search = array("$dir_plugins$dir/plugin.xml", "$dir_plugins$dir/paquet.xml"); - foreach($search as $s){ - if (file_exists($s)){ + foreach ($search as $s) { + if (file_exists($s)) { return $dir; } } + return ''; } @@ -112,20 +129,24 @@ define('_EXTRAIRE_INTERVALLE', ',^[\[\(\]]([0-9.a-zRC\s\-]*)[;]([0-9.a-zRC\s\-\* * voir commentaire infra sur l'utilisation de la constante _DEV_PLUGINS * * @param string $intervalle - * Un intervalle entre 2 versions. ex: [2.0.0-dev;2.1.*] + * Un intervalle entre 2 versions. ex: [2.0.0-dev;2.1.*] * @param string $version - * Un numéro de version. ex: 3.1.99] + * Un numéro de version. ex: 3.1.99] * @param string $avec_quoi - * Ce avec quoi est testée la compatibilité. par défaut ('') - * avec un plugin (cas des 'necessite'), parfois ('spip') - * avec SPIP. + * Ce avec quoi est testée la compatibilité. par défaut ('') + * avec un plugin (cas des 'necessite'), parfois ('spip') + * avec SPIP. * @return bool - * True si dans l'intervalle, false sinon. -**/ + * True si dans l'intervalle, false sinon. + **/ function plugin_version_compatible($intervalle, $version, $avec_quoi = '') { - if (!strlen($intervalle)) return true; - if (!preg_match(_EXTRAIRE_INTERVALLE,$intervalle,$regs)) return false; + if (!strlen($intervalle)) { + return true; + } + if (!preg_match(_EXTRAIRE_INTERVALLE, $intervalle, $regs)) { + return false; + } // Extraction des bornes et traitement de * pour la borne sup : // -- on autorise uniquement les ecritures 3.0.*, 3.* $minimum = $regs[1]; @@ -137,20 +158,29 @@ function plugin_version_compatible($intervalle, $version, $avec_quoi = '') { // avec la version de SPIP (ne nuit donc pas aux tests de necessite // entre plugins) if (defined('_DEV_PLUGINS') && $avec_quoi == 'spip') { - $maximum = _DEV_PLUGINS.']'; + $maximum = _DEV_PLUGINS . ']'; } - $minimum_inc = $intervalle{0}=="["; - $maximum_inc = substr($intervalle,-1)=="]"; + $minimum_inc = $intervalle{0} == "["; + $maximum_inc = substr($intervalle, -1) == "]"; - if (strlen($minimum)){ - if ($minimum_inc AND spip_version_compare($version,$minimum,'<')) return false; - if (!$minimum_inc AND spip_version_compare($version,$minimum,'<=')) return false; + if (strlen($minimum)) { + if ($minimum_inc AND spip_version_compare($version, $minimum, '<')) { + return false; + } + if (!$minimum_inc AND spip_version_compare($version, $minimum, '<=')) { + return false; + } } - if (strlen($maximum)){ - if ($maximum_inc AND spip_version_compare($version,$maximum,'>')) return false; - if (!$maximum_inc AND spip_version_compare($version,$maximum,'>=')) return false; + if (strlen($maximum)) { + if ($maximum_inc AND spip_version_compare($version, $maximum, '>')) { + return false; + } + if (!$maximum_inc AND spip_version_compare($version, $maximum, '>=')) { + return false; + } } + return true; } @@ -164,7 +194,7 @@ function plugin_version_compatible($intervalle, $version, $avec_quoi = '') { * @param bool $force * @return array */ -function liste_plugin_valides($liste_plug, $force = false){ +function liste_plugin_valides($liste_plug, $force = false) { $liste_ext = liste_plugin_files(_DIR_PLUGINS_DIST); $get_infos = charger_fonction('get_infos', 'plugins'); $infos = array( @@ -178,29 +208,33 @@ function liste_plugin_valides($liste_plug, $force = false){ $infos['_DIR_RESTREINT'][''] = $get_infos('./', $force, _DIR_RESTREINT); $infos['_DIR_RESTREINT']['SPIP']['version'] = $GLOBALS['spip_version_branche']; $infos['_DIR_RESTREINT']['SPIP']['chemin'] = array(); - $liste_non_classee = array('SPIP' => array( - 'nom' => 'SPIP', - 'etat' => 'stable', - 'version' => $GLOBALS['spip_version_branche'], - 'dir_type' => '_DIR_RESTREINT', - 'dir' => '', - ) + $liste_non_classee = array( + 'SPIP' => array( + 'nom' => 'SPIP', + 'etat' => 'stable', + 'version' => $GLOBALS['spip_version_branche'], + 'dir_type' => '_DIR_RESTREINT', + 'dir' => '', + ) ); - foreach ($liste_ext as $plug){ - if (isset($infos['_DIR_PLUGINS_DIST'][$plug])) + foreach ($liste_ext as $plug) { + if (isset($infos['_DIR_PLUGINS_DIST'][$plug])) { plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_DIST'); + } } - foreach ($liste_plug as $plug){ - if (isset($infos['_DIR_PLUGINS'][$plug])) + foreach ($liste_plug as $plug) { + if (isset($infos['_DIR_PLUGINS'][$plug])) { plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS'); + } } - if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL){ + if (defined('_DIR_PLUGINS_SUPPL') and _DIR_PLUGINS_SUPPL) { $infos['_DIR_PLUGINS_SUPPL'] = $get_infos($liste_plug, false, _DIR_PLUGINS_SUPPL); - foreach ($liste_plug as $plug){ - if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug])) + foreach ($liste_plug as $plug) { + if (isset($infos['_DIR_PLUGINS_SUPPL'][$plug])) { plugin_valide_resume($liste_non_classee, $plug, $infos, '_DIR_PLUGINS_SUPPL'); + } } } @@ -219,16 +253,18 @@ function liste_plugin_valides($liste_plug, $force = false){ * @param array $infos * @param string $dir_type */ -function plugin_valide_resume(&$liste, $plug, $infos, $dir_type){ +function plugin_valide_resume(&$liste, $plug, $infos, $dir_type) { $i = $infos[$dir_type][$plug]; - if (isset($i['erreur']) AND $i['erreur']) + if (isset($i['erreur']) AND $i['erreur']) { return; - if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) + } + if (!plugin_version_compatible($i['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) { return; + } $p = strtoupper($i['prefix']); if (!isset($liste[$p]) OR spip_version_compare($i['version'], $liste[$p]['version'], '>') - ){ + ) { $liste[$p] = array( 'nom' => $i['nom'], 'etat' => $i['etat'], @@ -249,15 +285,17 @@ function plugin_valide_resume(&$liste, $plug, $infos, $dir_type){ * @param array $liste * @param array $infos */ -function plugin_fixer_procure(&$liste, &$infos){ - foreach($liste as $p=>$resume){ +function plugin_fixer_procure(&$liste, &$infos) { + foreach ($liste as $p => $resume) { $i = $infos[$resume['dir_type']][$resume['dir']]; - if (isset($i['procure']) AND $i['procure']){ - foreach($i['procure'] as $procure){ + if (isset($i['procure']) AND $i['procure']) { + foreach ($i['procure'] as $procure) { $p = strtoupper($procure['nom']); $dir = $resume['dir']; - if ($dir) $dir .= "/"; - $dir .= "procure:".$procure['nom']; + if ($dir) { + $dir .= "/"; + } + $dir .= "procure:" . $procure['nom']; $procure['etat'] = '?'; $procure['dir_type'] = $resume['dir_type']; @@ -267,7 +305,7 @@ function plugin_fixer_procure(&$liste, &$infos){ // on ajoute cette version a la liste if (!isset($liste[$p]) OR spip_version_compare($procure['version'], $liste[$p]['version'], '>') - ){ + ) { $liste[$p] = $procure; // on fournit une information minimale pour ne pas perturber la compilation @@ -299,16 +337,19 @@ function plugin_fixer_procure(&$liste, &$infos){ * @param string $dir_plugins * @return array */ -function liste_chemin_plugin($liste, $dir_plugins = _DIR_PLUGINS){ - foreach ($liste as $prefix=>$infos) { +function liste_chemin_plugin($liste, $dir_plugins = _DIR_PLUGINS) { + foreach ($liste as $prefix => $infos) { if (!$dir_plugins OR ( defined($infos['dir_type']) - AND constant($infos['dir_type'])==$dir_plugins)) + AND constant($infos['dir_type']) == $dir_plugins) + ) { $liste[$prefix] = $infos['dir']; - else + } else { unset($liste[$prefix]); + } } + return $liste; } @@ -320,8 +361,9 @@ function liste_chemin_plugin($liste, $dir_plugins = _DIR_PLUGINS){ * Chemin du répertoire de plugins * @return array */ -function liste_chemin_plugin_actifs($dir_plugins = _DIR_PLUGINS){ +function liste_chemin_plugin_actifs($dir_plugins = _DIR_PLUGINS) { include_spip('plugins/installer'); + return liste_chemin_plugin(liste_plugin_actifs(), $dir_plugins); } @@ -333,88 +375,97 @@ function liste_chemin_plugin_actifs($dir_plugins = _DIR_PLUGINS){ // avec un doute sur un "utilise" qu'on peut ignorer. // Mais ne pas inserer silencieusement et risquer un bug sournois latent -function plugin_trier($infos, $liste_non_classee) -{ +function plugin_trier($infos, $liste_non_classee) { $toute_la_liste = $liste_non_classee; $liste = $ordre = array(); $count = 0; - while ($c=count($liste_non_classee) AND $c!=$count){ // tant qu'il reste des plugins a classer, et qu'on ne stagne pas - #echo "tour::";var_dump($liste_non_classee); + while ($c = count($liste_non_classee) AND $c != $count) { // tant qu'il reste des plugins a classer, et qu'on ne stagne pas + #echo "tour::";var_dump($liste_non_classee); $count = $c; - foreach($liste_non_classee as $p=>$resume) { + foreach ($liste_non_classee as $p => $resume) { $plug = $resume['dir']; $dir_type = $resume['dir_type']; $info1 = $infos[$dir_type][$plug]; // si des plugins sont necessaires, // on ne peut inserer qu'apres eux - foreach($info1['necessite'] as $need){ - $nom = strtoupper($need['nom']); - $compat = isset($need['compatibilite']) ? $need['compatibilite'] : ''; - if (!isset($liste[$nom]) OR !plugin_version_compatible($compat,$liste[$nom]['version'])) { - $info1 = false; - break; - } + foreach ($info1['necessite'] as $need) { + $nom = strtoupper($need['nom']); + $compat = isset($need['compatibilite']) ? $need['compatibilite'] : ''; + if (!isset($liste[$nom]) OR !plugin_version_compatible($compat, $liste[$nom]['version'])) { + $info1 = false; + break; + } + } + if (!$info1) { + continue; } - if (!$info1) continue; // idem si des plugins sont utiles, // sauf si ils sont de toute facon absents de la liste - foreach($info1['utilise'] as $need){ - $nom = strtoupper($need['nom']); - $compat = isset($need['compatibilite']) ? $need['compatibilite'] : ''; - if (isset($toute_la_liste[$nom])) { - if (!isset($liste[$nom]) OR - !plugin_version_compatible($compat, $liste[$nom]['version'])) { - $info1 = false; - break; - } - } + foreach ($info1['utilise'] as $need) { + $nom = strtoupper($need['nom']); + $compat = isset($need['compatibilite']) ? $need['compatibilite'] : ''; + if (isset($toute_la_liste[$nom])) { + if (!isset($liste[$nom]) OR + !plugin_version_compatible($compat, $liste[$nom]['version']) + ) { + $info1 = false; + break; + } + } } if ($info1) { - $ordre[$p] = $info1; - $liste[$p] = $liste_non_classee[$p]; - unset($liste_non_classee[$p]); + $ordre[$p] = $info1; + $liste[$p] = $liste_non_classee[$p]; + unset($liste_non_classee[$p]); } } } + return array($liste, $ordre, $liste_non_classee); } // Collecte les erreurs dans la meta -function plugins_erreurs($liste_non_classee, $liste, $infos, $msg = array()) -{ +function plugins_erreurs($liste_non_classee, $liste, $infos, $msg = array()) { static $erreurs = array(); - foreach($liste_non_classee as $p=>$resume){ + foreach ($liste_non_classee as $p => $resume) { $dir_type = $resume['dir_type']; $plug = $resume['dir']; $k = $infos[$dir_type][$plug]; $plug = constant($dir_type) . $plug; if (!isset($msg[$p])) { - if (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) - $msg[$p] = plugin_necessite($k['utilise'], $liste, 'utilise'); + if (!$msg[$p] = plugin_necessite($k['necessite'], $liste, 'necessite')) { + $msg[$p] = plugin_necessite($k['utilise'], $liste, 'utilise'); + } } else { - foreach($msg[$p] as $c => $l) - $msg[$p][$c] = plugin_controler_lib($l['nom'], $l['lien']); + foreach ($msg[$p] as $c => $l) { + $msg[$p][$c] = plugin_controler_lib($l['nom'], $l['lien']); + } } $erreurs[$plug] = $msg[$p]; } - ecrire_meta('plugin_erreur_activation', serialize($erreurs)); + ecrire_meta('plugin_erreur_activation', serialize($erreurs)); } function plugin_donne_erreurs($raw = false, $raz = true) { - if (!isset($GLOBALS['meta']['plugin_erreur_activation'])) return $raw?array():''; + if (!isset($GLOBALS['meta']['plugin_erreur_activation'])) { + return $raw ? array() : ''; + } $list = @unserialize($GLOBALS['meta']['plugin_erreur_activation']); // Compat ancienne version - if (!$list) - $list = $raw?array():$GLOBALS['meta']['plugin_erreur_activation']; - elseif(!$raw) { - foreach($list as $plug => $msg) - $list[$plug] = "<li>" . _T('plugin_impossible_activer', array('plugin' => $plug)) - . "<ul><li>" . implode("</li><li>", $msg) . "</li></ul></li>"; - $list ="<ul>" . join("\n", $list) . "</ul>"; - } - if ($raz) + if (!$list) { + $list = $raw ? array() : $GLOBALS['meta']['plugin_erreur_activation']; + } elseif (!$raw) { + foreach ($list as $plug => $msg) { + $list[$plug] = "<li>" . _T('plugin_impossible_activer', array('plugin' => $plug)) + . "<ul><li>" . implode("</li><li>", $msg) . "</li></ul></li>"; + } + $list = "<ul>" . join("\n", $list) . "</ul>"; + } + if ($raz) { effacer_meta('plugin_erreur_activation'); + } + return $list; } @@ -424,21 +475,24 @@ function plugin_donne_erreurs($raw = false, $raz = true) { * dans la liste de plugins donnee * * @param array $n - * Tableau de dependances dont on souhaite verifier leur presence + * Tableau de dependances dont on souhaite verifier leur presence * @param array $liste - * Tableau des plugins presents + * Tableau des plugins presents * @return array - * Tableau des messages d'erreurs recus. Il sera vide si tout va bien. + * Tableau des messages d'erreurs recus. Il sera vide si tout va bien. * -**/ + **/ function plugin_necessite($n, $liste, $balise = 'necessite') { $msg = array(); - foreach($n as $need){ + foreach ($n as $need) { $id = strtoupper($need['nom']); - if ($r = plugin_controler_necessite($liste, $id, isset($need['compatibilite']) ? $need['compatibilite'] : '', $balise)) { + if ($r = plugin_controler_necessite($liste, $id, isset($need['compatibilite']) ? $need['compatibilite'] : '', + $balise) + ) { $msg[] = $r; } } + return $msg; } @@ -446,59 +500,63 @@ function plugin_necessite($n, $liste, $balise = 'necessite') { * Verifie qu'une dependance (plugin) est bien presente. * * @param $liste - * Liste de description des plugins + * Liste de description des plugins * @param $nom - * Le plugin donc on cherche la presence + * Le plugin donc on cherche la presence * @param $intervalle - * L'éventuelle intervalle de compatibilité de la dependance. ex: [1.1.0;] + * L'éventuelle intervalle de compatibilité de la dependance. ex: [1.1.0;] * @param $balise - * Permet de définir si on teste un utilise ou un necessite + * Permet de définir si on teste un utilise ou un necessite * @return string. - * Vide si ok, - * Message d'erreur lorsque la dependance est absente. -**/ -function plugin_controler_necessite($liste, $nom, $intervalle, $balise) -{ - if (isset($liste[$nom]) AND plugin_version_compatible($intervalle,$liste[$nom]['version'])) { - return ''; - } - return - plugin_message_incompatibilite($intervalle, (isset($liste[$nom]) ? $liste[$nom]['version'] : ""), $nom, $balise); + * Vide si ok, + * Message d'erreur lorsque la dependance est absente. + **/ +function plugin_controler_necessite($liste, $nom, $intervalle, $balise) { + if (isset($liste[$nom]) AND plugin_version_compatible($intervalle, $liste[$nom]['version'])) { + return ''; + } + + return + plugin_message_incompatibilite($intervalle, (isset($liste[$nom]) ? $liste[$nom]['version'] : ""), $nom, $balise); } function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) { - if (preg_match(_EXTRAIRE_INTERVALLE,$intervalle,$regs)) { - $minimum = $regs[1]; - $maximum = $regs[2]; + if (preg_match(_EXTRAIRE_INTERVALLE, $intervalle, $regs)) { + $minimum = $regs[1]; + $maximum = $regs[2]; - $minimum_inclus = $intervalle{0}=="["; - $maximum_inclus = substr($intervalle,-1)=="]"; + $minimum_inclus = $intervalle{0} == "["; + $maximum_inclus = substr($intervalle, -1) == "]"; if (strlen($minimum)) { - if ($minimum_inclus AND spip_version_compare($version,$minimum,'<')) { + if ($minimum_inclus AND spip_version_compare($version, $minimum, '<')) { return _T("plugin_${balise}_plugin", array( 'plugin' => $nom, - 'version' => ' ≥ ' . $minimum)); + 'version' => ' ≥ ' . $minimum + )); } - if (!$minimum_inclus AND spip_version_compare($version,$minimum,'<=')) { + if (!$minimum_inclus AND spip_version_compare($version, $minimum, '<=')) { return _T("plugin_${balise}_plugin", array( 'plugin' => $nom, - 'version' => ' > ' . $minimum)); + 'version' => ' > ' . $minimum + )); } } if (strlen($maximum)) { - if ($maximum_inclus AND spip_version_compare($version,$maximum,'>')) { + if ($maximum_inclus AND spip_version_compare($version, $maximum, '>')) { return _T("plugin_${balise}_plugin", array( 'plugin' => $nom, - 'version' => ' ≤ ' . $maximum)); + 'version' => ' ≤ ' . $maximum + )); } - if (!$maximum_inclus AND spip_version_compare($version,$maximum,'>=')) { + if (!$maximum_inclus AND spip_version_compare($version, $maximum, '>=')) { return _T("plugin_${balise}_plugin", array( 'plugin' => $nom, - 'version' => ' < ' . $maximum)); + 'version' => ' < ' . $maximum + )); } } } @@ -507,14 +565,13 @@ function plugin_message_incompatibilite($intervalle, $version, $nom, $balise) { } -function plugin_controler_lib($lib, $url) -{ +function plugin_controler_lib($lib, $url) { /* Feature sortie du core, voir STP * if ($url) { include_spip('inc/charger_plugin'); $url = '<br />' . bouton_telechargement_plugin($url, 'lib'); }*/ - return _T('plugin_necessite_lib', array('lib'=>$lib)) . " <a href='$url'>$url</a>"; + return _T('plugin_necessite_lib', array('lib' => $lib)) . " <a href='$url'>$url</a>"; } @@ -527,8 +584,8 @@ function plugin_controler_lib($lib, $url) * @param bool $pipe_recherche ? * @return bool * true si il y a eu des modifications sur la liste des plugins actifs, false sinon -**/ -function actualise_plugins_actifs($pipe_recherche = false){ + **/ +function actualise_plugins_actifs($pipe_recherche = false) { return ecrire_plugin_actifs('', $pipe_recherche, 'force'); } @@ -553,7 +610,7 @@ function actualise_plugins_actifs($pipe_recherche = false){ * - force : ? * @return bool * true si il y a eu des modifications sur la liste des plugins actifs, false sinon -**/ + **/ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'raz') { // creer le repertoire cache/ si necessaire ! (installation notamment) @@ -564,30 +621,34 @@ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'ra return false; } - if ($operation!='raz') { + if ($operation != 'raz') { $plugin_valides = liste_chemin_plugin_actifs(); $plugin_valides = is_plugin_dir($plugin_valides); - if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL){ + if (defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) { $plugin_valides_supp = liste_chemin_plugin_actifs(_DIR_PLUGINS_SUPPL); - $plugin_valides_supp = is_plugin_dir($plugin_valides_supp,_DIR_PLUGINS_SUPPL); - $plugin_valides = array_merge($plugin_valides,$plugin_valides_supp); + $plugin_valides_supp = is_plugin_dir($plugin_valides_supp, _DIR_PLUGINS_SUPPL); + $plugin_valides = array_merge($plugin_valides, $plugin_valides_supp); } // si des plugins sont en attentes (coches mais impossible a activer) // on les reinjecte ici if (isset($GLOBALS['meta']['plugin_attente']) - AND $a = unserialize($GLOBALS['meta']['plugin_attente'])) - $plugin_valides = $plugin_valides + liste_chemin_plugin($a); + AND $a = unserialize($GLOBALS['meta']['plugin_attente']) + ) { + $plugin_valides = $plugin_valides+liste_chemin_plugin($a); + } - if ($operation=='ajoute') - $plugin = array_merge($plugin_valides,$plugin); - elseif ($operation=='enleve') - $plugin = array_diff($plugin_valides,$plugin); - else $plugin = $plugin_valides; + if ($operation == 'ajoute') { + $plugin = array_merge($plugin_valides, $plugin); + } elseif ($operation == 'enleve') { + $plugin = array_diff($plugin_valides, $plugin); + } else { + $plugin = $plugin_valides; + } } $actifs_avant = isset($GLOBALS['meta']['plugin']) ? $GLOBALS['meta']['plugin'] : ''; // si une fonction de gestion de dependances existe, l'appeler ici - if ($ajouter_dependances = charger_fonction("ajouter_dependances","plugins",true)){ + if ($ajouter_dependances = charger_fonction("ajouter_dependances", "plugins", true)) { $plugin = $ajouter_dependances($plugin); } @@ -596,17 +657,19 @@ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'ra // pour ne pas rater l'ajout ou la suppression d'un fichier fonctions/options/administrations // pourra etre evite quand on ne supportera plus les plugin.xml // en deplacant la detection de ces fichiers dans la compilation ci dessous - list($infos,$liste) = liste_plugin_valides($plugin,true); + list($infos, $liste) = liste_plugin_valides($plugin, true); // trouver l'ordre d'activation - list($plugin_valides,$ordre,$reste) = plugin_trier($infos, $liste); - if ($reste) plugins_erreurs($reste, $liste, $infos); + list($plugin_valides, $ordre, $reste) = plugin_trier($infos, $liste); + if ($reste) { + plugins_erreurs($reste, $liste, $infos); + } // Ignorer les plugins necessitant une lib absente // et preparer la meta d'entete Http $err = $msg = $header = array(); - foreach($plugin_valides as $p => $resume) { - $header[]= $p.($resume['version']?"(".$resume['version'].")":""); - if ($resume['dir']){ - foreach($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) { + foreach ($plugin_valides as $p => $resume) { + $header[] = $p . ($resume['version'] ? "(" . $resume['version'] . ")" : ""); + if ($resume['dir']) { + foreach ($infos[$resume['dir_type']][$resume['dir']]['lib'] as $l) { if (!find_in_path($l['nom'], 'lib/')) { $err[$p] = $resume; $msg[$p][] = $l; @@ -615,19 +678,24 @@ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'ra } } } - if ($err) plugins_erreurs($err, '', $infos, $msg); + if ($err) { + plugins_erreurs($err, '', $infos, $msg); + } - if (isset($GLOBALS['meta']['message_crash_plugins'])) + if (isset($GLOBALS['meta']['message_crash_plugins'])) { effacer_meta('message_crash_plugins'); - ecrire_meta('plugin',serialize($plugin_valides)); - $liste = array_diff_key($liste,$plugin_valides); - ecrire_meta('plugin_attente',serialize($liste)); - $header = strtolower(implode(",",$header)); - ecrire_meta('plugin_header',substr($header,0,900)); - if (!isset($GLOBALS['spip_header_silencieux']) OR !$GLOBALS['spip_header_silencieux']) - ecrire_fichier(_DIR_VAR."config.txt", (defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY:"Composed-By: SPIP") . ' '. $GLOBALS['spip_version_affichee'] . " @ www.spip.net + " . $header); - else - @unlink(_DIR_VAR."config.txt"); + } + ecrire_meta('plugin', serialize($plugin_valides)); + $liste = array_diff_key($liste, $plugin_valides); + ecrire_meta('plugin_attente', serialize($liste)); + $header = strtolower(implode(",", $header)); + ecrire_meta('plugin_header', substr($header, 0, 900)); + if (!isset($GLOBALS['spip_header_silencieux']) OR !$GLOBALS['spip_header_silencieux']) { + ecrire_fichier(_DIR_VAR . "config.txt", + (defined('_HEADER_COMPOSED_BY') ? _HEADER_COMPOSED_BY : "Composed-By: SPIP") . ' ' . $GLOBALS['spip_version_affichee'] . " @ www.spip.net + " . $header); + } else { + @unlink(_DIR_VAR . "config.txt"); + } // generer charger_plugins_chemin.php plugins_precompile_chemin($plugin_valides, $ordre); // generer les fichiers @@ -652,89 +720,100 @@ function ecrire_plugin_actifs($plugin, $pipe_recherche = false, $operation = 'ra return ($GLOBALS['meta']['plugin'] != $actifs_avant); } -function plugins_precompile_chemin($plugin_valides, $ordre) -{ +function plugins_precompile_chemin($plugin_valides, $ordre) { $chemins = array(); $contenu = ""; - foreach($ordre as $p => $info){ + foreach ($ordre as $p => $info) { // $ordre peur contenir des plugins en attente et non valides pour ce hit - if (isset($plugin_valides[$p])){ + if (isset($plugin_valides[$p])) { $dir_type = $plugin_valides[$p]['dir_type']; $plug = $plugin_valides[$p]['dir']; // definir le plugin, donc le path avant l'include du fichier options // permet de faire des include_spip pour attraper un inc_ du plugin - $dir = $dir_type.".'" . $plug ."/'"; + $dir = $dir_type . ".'" . $plug . "/'"; - $prefix = strtoupper(preg_replace(',\W,','_',$info['prefix'])); - if ($prefix!=="SPIP"){ + $prefix = strtoupper(preg_replace(',\W,', '_', $info['prefix'])); + if ($prefix !== "SPIP") { $contenu .= "define('_DIR_PLUGIN_$prefix',$dir);\n"; - foreach($info['chemin'] as $chemin){ - if (!isset($chemin['version']) OR plugin_version_compatible($chemin['version'],$GLOBALS['spip_version_branche'],'spip')){ + foreach ($info['chemin'] as $chemin) { + if (!isset($chemin['version']) OR plugin_version_compatible($chemin['version'], + $GLOBALS['spip_version_branche'], 'spip') + ) { $dir = $chemin['path']; - if (strlen($dir) AND $dir{0}=="/") $dir = substr($dir,1); - if (strlen($dir) AND $dir=="./") $dir = ''; - if (strlen($dir)) $dir = rtrim($dir,'/').'/'; - if (!isset($chemin['type']) OR $chemin['type']=='public') - $chemins['public'][]="_DIR_PLUGIN_$prefix".(strlen($dir)?".'$dir'":""); - if (!isset($chemin['type']) OR $chemin['type']=='prive') - $chemins['prive'][]="_DIR_PLUGIN_$prefix".(strlen($dir)?".'$dir'":""); + if (strlen($dir) AND $dir{0} == "/") { + $dir = substr($dir, 1); + } + if (strlen($dir) AND $dir == "./") { + $dir = ''; + } + if (strlen($dir)) { + $dir = rtrim($dir, '/') . '/'; + } + if (!isset($chemin['type']) OR $chemin['type'] == 'public') { + $chemins['public'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : ""); + } + if (!isset($chemin['type']) OR $chemin['type'] == 'prive') { + $chemins['prive'][] = "_DIR_PLUGIN_$prefix" . (strlen($dir) ? ".'$dir'" : ""); + } } } } } } - if (count($chemins)){ - $contenu .= "if (_DIR_RESTREINT) _chemin(implode(':',array(".implode(',',array_reverse($chemins['public'])).")));\n" - . "else _chemin(implode(':',array(".implode(',',array_reverse($chemins['prive'])).")));\n"; + if (count($chemins)) { + $contenu .= "if (_DIR_RESTREINT) _chemin(implode(':',array(" . implode(',', + array_reverse($chemins['public'])) . ")));\n" + . "else _chemin(implode(':',array(" . implode(',', array_reverse($chemins['prive'])) . ")));\n"; } ecrire_fichier_php(_CACHE_PLUGINS_PATH, $contenu); } -function plugins_precompile_xxxtions($plugin_valides, $ordre) -{ - $contenu = array('options' => '', 'fonctions' =>''); +function plugins_precompile_xxxtions($plugin_valides, $ordre) { + $contenu = array('options' => '', 'fonctions' => ''); $boutons = array(); $onglets = array(); $sign = ""; - foreach($ordre as $p => $info){ + foreach ($ordre as $p => $info) { // $ordre peur contenir des plugins en attente et non valides pour ce hit - if (isset($plugin_valides[$p])){ + if (isset($plugin_valides[$p])) { $dir_type = $plugin_valides[$p]['dir_type']; $plug = $plugin_valides[$p]['dir']; $dir = constant($dir_type); - $root_dir_type = str_replace('_DIR_','_ROOT_',$dir_type); - if ($info['menu']) - $boutons = array_merge($boutons,$info['menu']); - if ($info['onglet']) - $onglets = array_merge($onglets,$info['onglet']); - foreach($contenu as $charge => $v){ + $root_dir_type = str_replace('_DIR_', '_ROOT_', $dir_type); + if ($info['menu']) { + $boutons = array_merge($boutons, $info['menu']); + } + if ($info['onglet']) { + $onglets = array_merge($onglets, $info['onglet']); + } + foreach ($contenu as $charge => $v) { // si pas declare/detecte a la lecture du paquet.xml, // detecer a nouveau ici puisque son ajout ne provoque pas une modif du paquet.xml // donc ni sa relecture, ni sa detection if (!isset($info[$charge]) AND $dir // exclure le cas du plugin "SPIP" - AND strpos($dir,":")===false // exclure le cas des procure: + AND strpos($dir, ":") === false // exclure le cas des procure: AND file_exists("$dir$plug/paquet.xml") // uniquement pour les paquet.xml - ){ - if (is_readable("$dir$plug/".($file=$info['prefix']."_".$charge.".php"))){ + ) { + if (is_readable("$dir$plug/" . ($file = $info['prefix'] . "_" . $charge . ".php"))) { $info[$charge] = array($file); } } - if (isset($info[$charge])){ + if (isset($info[$charge])) { $files = $info[$charge]; - foreach($files as $k=>$file){ + foreach ($files as $k => $file) { // on genere un if file_exists devant chaque include // pour pouvoir garder le meme niveau d'erreur general $file = trim($file); if (!is_readable("$dir$plug/$file") // uniquement pour les paquet.xml - AND file_exists("$dir$plug/paquet.xml")){ + AND file_exists("$dir$plug/paquet.xml") + ) { unset($info[$charge][$k]); - } - else { + } else { $_file = $root_dir_type . ".'$plug/$file'"; $contenu[$charge] .= "include_once_check($_file);\n"; } @@ -745,9 +824,9 @@ function plugins_precompile_xxxtions($plugin_valides, $ordre) } } - $contenu['options'] = "define('_PLUGINS_HASH','".md5($sign)."');\n" . $contenu['options']; + $contenu['options'] = "define('_PLUGINS_HASH','" . md5($sign) . "');\n" . $contenu['options']; $contenu['fonctions'] .= plugin_ongletbouton("boutons_plugins", $boutons) - . plugin_ongletbouton("onglets_plugins", $onglets); + . plugin_ongletbouton("onglets_plugins", $onglets); ecrire_fichier_php(_CACHE_PLUGINS_OPT, $contenu['options']); ecrire_fichier_php(_CACHE_PLUGINS_FCT, $contenu['fonctions']); @@ -768,9 +847,10 @@ function plugins_precompile_xxxtions($plugin_valides, $ordre) * @param array $val Liste des entrées de ce menu * @return string Code php */ -function plugin_ongletbouton($nom, $val) -{ - if (!$val) $val = array(); +function plugin_ongletbouton($nom, $val) { + if (!$val) { + $val = array(); + } $val = serialize($val); $md5 = md5($val); @@ -779,102 +859,127 @@ function plugin_ongletbouton($nom, $val) define("_UPDATED_$nom", $val); define("_UPDATED_md5_$nom", $md5); } - $val = "unserialize('".str_replace("'","\'",$val)."')"; + $val = "unserialize('" . str_replace("'", "\'", $val) . "')"; + return "if (!function_exists('$nom')) {\n" - ."function $nom(){return defined('_UPDATED_$nom')?unserialize(_UPDATED_$nom):$val;}\n" - ."function md5_$nom(){return defined('_UPDATED_md5_$nom')?_UPDATED_md5_$nom:'".$md5."';}\n" - ."}\n"; + . "function $nom(){return defined('_UPDATED_$nom')?unserialize(_UPDATED_$nom):$val;}\n" + . "function md5_$nom(){return defined('_UPDATED_md5_$nom')?_UPDATED_md5_$nom:'" . $md5 . "';}\n" + . "}\n"; } // creer le fichier CACHE_PLUGIN_VERIF a partir de // $GLOBALS['spip_pipeline'] // $GLOBALS['spip_matrice'] -function pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche) -{ - static $liste_pipe_manquants=array(); - if (($pipe_recherche)&&(!in_array($pipe_recherche,$liste_pipe_manquants))) - $liste_pipe_manquants[]=$pipe_recherche; +function pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche) { + static $liste_pipe_manquants = array(); + if (($pipe_recherche) && (!in_array($pipe_recherche, $liste_pipe_manquants))) { + $liste_pipe_manquants[] = $pipe_recherche; + } $prepend_code = array(); - foreach($ordre as $p => $info){ + foreach ($ordre as $p => $info) { // $ordre peur contenir des plugins en attente et non valides pour ce hit - if (isset($plugin_valides[$p])){ + if (isset($plugin_valides[$p])) { $dir_type = $plugin_valides[$p]['dir_type']; - $root_dir_type = str_replace('_DIR_','_ROOT_',$dir_type); + $root_dir_type = str_replace('_DIR_', '_ROOT_', $dir_type); $plug = $plugin_valides[$p]['dir']; - $prefix = (($info['prefix']=="spip")?"":$info['prefix']."_"); - if (isset($info['pipeline']) AND is_array($info['pipeline'])){ - foreach($info['pipeline'] as $pipe){ + $prefix = (($info['prefix'] == "spip") ? "" : $info['prefix'] . "_"); + if (isset($info['pipeline']) AND is_array($info['pipeline'])) { + foreach ($info['pipeline'] as $pipe) { $nom = $pipe['nom']; - if (isset($pipe['action'])) - $action = $pipe['action']; - else - $action = $nom; + if (isset($pipe['action'])) { + $action = $pipe['action']; + } else { + $action = $nom; + } $nomlower = strtolower($nom); - if ($nomlower!=$nom - AND isset($GLOBALS['spip_pipeline'][$nom]) - AND !isset($GLOBALS['spip_pipeline'][$nomlower])){ + if ($nomlower != $nom + AND isset($GLOBALS['spip_pipeline'][$nom]) + AND !isset($GLOBALS['spip_pipeline'][$nomlower]) + ) { $GLOBALS['spip_pipeline'][$nomlower] = $GLOBALS['spip_pipeline'][$nom]; unset($GLOBALS['spip_pipeline'][$nom]); } $nom = $nomlower; // une action vide est une declaration qui ne doit pas etre compilee ! if (!isset($GLOBALS['spip_pipeline'][$nom])) // creer le pipeline eventuel - $GLOBALS['spip_pipeline'][$nom]=""; - if ($action){ - if (strpos($GLOBALS['spip_pipeline'][$nom],"|$prefix$action")===FALSE) - $GLOBALS['spip_pipeline'][$nom] = preg_replace(",(\|\||$),","|$prefix$action\\1",$GLOBALS['spip_pipeline'][$nom],1); - if (isset($pipe['inclure'])){ + { + $GLOBALS['spip_pipeline'][$nom] = ""; + } + if ($action) { + if (strpos($GLOBALS['spip_pipeline'][$nom], "|$prefix$action") === false) { + $GLOBALS['spip_pipeline'][$nom] = preg_replace(",(\|\||$),", "|$prefix$action\\1", + $GLOBALS['spip_pipeline'][$nom], 1); + } + if (isset($pipe['inclure'])) { $GLOBALS['spip_matrice']["$prefix$action"] = - "$root_dir_type:$plug/".$pipe['inclure']; + "$root_dir_type:$plug/" . $pipe['inclure']; } } } - if (isset($info['genie']) AND count($info['genie'])){ - if (!isset($prepend_code['taches_generales_cron'])){ + if (isset($info['genie']) AND count($info['genie'])) { + if (!isset($prepend_code['taches_generales_cron'])) { $prepend_code['taches_generales_cron'] = ""; } - foreach($info['genie'] as $genie){ + foreach ($info['genie'] as $genie) { $nom = $prefix . $genie['nom']; - $periode = max(60,intval($genie['periode'])); - if (charger_fonction($nom,"genie",true)){ + $periode = max(60, intval($genie['periode'])); + if (charger_fonction($nom, "genie", true)) { $prepend_code['taches_generales_cron'] .= "\$val['$nom'] = $periode;\n"; - } - else { - spip_log("Fonction genie_$nom introuvable",_LOG_ERREUR); + } else { + spip_log("Fonction genie_$nom introuvable", _LOG_ERREUR); } } } - if (isset($info['style']) AND count($info['style'])){ - if (!isset($prepend_code['insert_head_css'])){$prepend_code['insert_head_css'] = "";} - if (!isset($prepend_code['header_prive_css'])){$prepend_code['header_prive_css'] = "";} - foreach ($info['style'] as $style){ - if (isset($style['path']) AND $style['path']) - $code = "if (\$f=timestamp(direction_css(find_in_path('".addslashes($style['path'])."')))) "; - else - $code = "if (\$f='".addslashes($style['url'])."') "; + if (isset($info['style']) AND count($info['style'])) { + if (!isset($prepend_code['insert_head_css'])) { + $prepend_code['insert_head_css'] = ""; + } + if (!isset($prepend_code['header_prive_css'])) { + $prepend_code['header_prive_css'] = ""; + } + foreach ($info['style'] as $style) { + if (isset($style['path']) AND $style['path']) { + $code = "if (\$f=timestamp(direction_css(find_in_path('" . addslashes($style['path']) . "')))) "; + } else { + $code = "if (\$f='" . addslashes($style['url']) . "') "; + } $code .= "\$val .= '<link rel=\"stylesheet\" href=\"'.\$f.'\" type=\"text/css\""; - if (isset($style['media']) AND strlen($style['media'])) - $code .= " media=\"".addslashes($style['media'])."\""; - $code .="/>';\n"; - if ($style['type']!='prive') $prepend_code['insert_head_css'] .= $code; - if ($style['type']!='public') $prepend_code['header_prive_css'] .= $code; + if (isset($style['media']) AND strlen($style['media'])) { + $code .= " media=\"" . addslashes($style['media']) . "\""; + } + $code .= "/>';\n"; + if ($style['type'] != 'prive') { + $prepend_code['insert_head_css'] .= $code; + } + if ($style['type'] != 'public') { + $prepend_code['header_prive_css'] .= $code; + } } } - if (!isset($prepend_code['insert_head'])){$prepend_code['insert_head'] = "";} - if (!isset($prepend_code['header_prive'])){$prepend_code['header_prive'] = "";} - if (isset($info['script']) AND count($info['script'])){ - foreach ($info['script'] as $script){ - if (isset($script['path']) AND $script['path']) - $code = "if (\$f=timestamp(find_in_path('".addslashes($script['path'])."'))) "; - else - $code = "if (\$f='".addslashes($script['url'])."') "; + if (!isset($prepend_code['insert_head'])) { + $prepend_code['insert_head'] = ""; + } + if (!isset($prepend_code['header_prive'])) { + $prepend_code['header_prive'] = ""; + } + if (isset($info['script']) AND count($info['script'])) { + foreach ($info['script'] as $script) { + if (isset($script['path']) AND $script['path']) { + $code = "if (\$f=timestamp(find_in_path('" . addslashes($script['path']) . "'))) "; + } else { + $code = "if (\$f='" . addslashes($script['url']) . "') "; + } $code .= "\$val .= '<script src=\"'.\$f.'\" type=\"text/javascript\"></script>';\n"; - if ($script['type']!='prive') $prepend_code['insert_head'] .= $code; - if ($script['type']!='public') $prepend_code['header_prive'] .= $code; + if ($script['type'] != 'prive') { + $prepend_code['insert_head'] .= $code; + } + if ($script['type'] != 'public') { + $prepend_code['header_prive'] .= $code; + } } } } @@ -882,19 +987,20 @@ function pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche) } $prepend_code['insert_head'] = - "include_once_check(_DIR_RESTREINT . 'inc/pipelines.php');\n" + "include_once_check(_DIR_RESTREINT . 'inc/pipelines.php');\n" . "\$val = minipipe('f_jQuery', \$val);\n" . $prepend_code['insert_head']; $prepend_code['header_prive'] = - "include_once_check(_DIR_RESTREINT . 'inc/pipelines_ecrire.php');\n" + "include_once_check(_DIR_RESTREINT . 'inc/pipelines_ecrire.php');\n" . "\$val = minipipe('f_jQuery_prive', \$val);\n" . $prepend_code['header_prive']; // on charge les fichiers d'options qui peuvent completer // la globale spip_pipeline egalement - if (@is_readable(_CACHE_PLUGINS_PATH)) - include_once(_CACHE_PLUGINS_PATH); // securite : a priori n'a pu etre fait plus tot + if (@is_readable(_CACHE_PLUGINS_PATH)) { + include_once(_CACHE_PLUGINS_PATH); + } // securite : a priori n'a pu etre fait plus tot if (@is_readable(_CACHE_PLUGINS_OPT)) { include_once(_CACHE_PLUGINS_OPT); } else { @@ -902,50 +1008,54 @@ function pipeline_matrice_precompile($plugin_valides, $ordre, $pipe_recherche) } // on ajoute les pipe qui ont ete recenses manquants - foreach($liste_pipe_manquants as $add_pipe) - if (!isset($GLOBALS['spip_pipeline'][$add_pipe])) - $GLOBALS['spip_pipeline'][$add_pipe]= ''; + foreach ($liste_pipe_manquants as $add_pipe) { + if (!isset($GLOBALS['spip_pipeline'][$add_pipe])) { + $GLOBALS['spip_pipeline'][$add_pipe] = ''; + } + } return $prepend_code; } // precompilation des pipelines // http://code.spip.net/@pipeline_precompile -function pipeline_precompile($prepend_code = array()){ +function pipeline_precompile($prepend_code = array()) { $content = ""; - foreach($GLOBALS['spip_pipeline'] as $action=>$pipeline){ + foreach ($GLOBALS['spip_pipeline'] as $action => $pipeline) { $s_inc = ""; $s_call = ""; - $pipe = array_filter(explode('|',$pipeline)); + $pipe = array_filter(explode('|', $pipeline)); // Eclater le pipeline en filtres et appliquer chaque filtre foreach ($pipe as $fonc) { $fonc = trim($fonc); - $s_call .= '$val = minipipe(\''.$fonc.'\', $val);'."\n"; - if (isset($GLOBALS['spip_matrice'][$fonc])){ + $s_call .= '$val = minipipe(\'' . $fonc . '\', $val);' . "\n"; + if (isset($GLOBALS['spip_matrice'][$fonc])) { $file = $GLOBALS['spip_matrice'][$fonc]; $file = "'$file'"; // si un _DIR_XXX: est dans la chaine, on extrait la constante - if (preg_match(",(_(DIR|ROOT)_[A-Z_]+):,Ums",$file,$regs)){ + if (preg_match(",(_(DIR|ROOT)_[A-Z_]+):,Ums", $file, $regs)) { $dir = $regs[1]; - $root_dir = str_replace('_DIR_','_ROOT_',$dir); - if (defined($root_dir)) + $root_dir = str_replace('_DIR_', '_ROOT_', $dir); + if (defined($root_dir)) { $dir = $root_dir; - $file = str_replace($regs[0],"'.".$dir.".'",$file); - $file = str_replace("''.","",$file); + } + $file = str_replace($regs[0], "'." . $dir . ".'", $file); + $file = str_replace("''.", "", $file); $file = str_replace(constant($dir), '', $file); } $s_inc .= "include_once_check($file);\n"; } } - if (strlen($s_inc)) + if (strlen($s_inc)) { $s_inc = "static \$inc=null;\nif (!\$inc){\n$s_inc\$inc=true;\n}\n"; + } $content .= "// Pipeline $action \n" - . "function execute_pipeline_$action(&\$val){\n" - . $s_inc - . ((isset($prepend_code[$action]) AND strlen($prepend_code[$action]))?trim($prepend_code[$action])."\n":'') - . $s_call - . "return \$val;\n}\n"; + . "function execute_pipeline_$action(&\$val){\n" + . $s_inc + . ((isset($prepend_code[$action]) AND strlen($prepend_code[$action])) ? trim($prepend_code[$action]) . "\n" : '') + . $s_call + . "return \$val;\n}\n"; } ecrire_fichier_php(_CACHE_PIPELINES, $content); clear_path_cache(); @@ -953,10 +1063,13 @@ function pipeline_precompile($prepend_code = array()){ // http://code.spip.net/@plugin_est_installe -function plugin_est_installe($plug_path){ - $plugin_installes = isset($GLOBALS['meta']['plugin_installes'])?unserialize($GLOBALS['meta']['plugin_installes']):array(); - if (!$plugin_installes) return false; - return in_array($plug_path,$plugin_installes); +function plugin_est_installe($plug_path) { + $plugin_installes = isset($GLOBALS['meta']['plugin_installes']) ? unserialize($GLOBALS['meta']['plugin_installes']) : array(); + if (!$plugin_installes) { + return false; + } + + return in_array($plug_path, $plugin_installes); } @@ -967,38 +1080,38 @@ function plugin_est_installe($plug_path){ * de la table meta. Cette meta ne contient que les noms des plugins qui ont une version_base. * * @uses plugins_installer_dist() -**/ -function plugin_installes_meta() -{ + **/ +function plugin_installes_meta() { $installer_plugins = charger_fonction('installer', 'plugins'); $meta_plug_installes = array(); - foreach (unserialize($GLOBALS['meta']['plugin']) as $prefix=>$resume) { - if ($plug = $resume['dir']){ + foreach (unserialize($GLOBALS['meta']['plugin']) as $prefix => $resume) { + if ($plug = $resume['dir']) { $infos = $installer_plugins($plug, 'install', $resume['dir_type']); - if ($infos){ - if (!is_array($infos) OR $infos['install_test'][0]) + if ($infos) { + if (!is_array($infos) OR $infos['install_test'][0]) { $meta_plug_installes[] = $plug; - if (is_array($infos)){ + } + if (is_array($infos)) { list($ok, $trace) = $infos['install_test']; include_spip('inc/filtres_boites'); - echo "<div class='install-plugins svp_retour'>" - .boite_ouvrir(_T('plugin_titre_installation', array('plugin' => typo($infos['nom']))), ($ok ? 'success' : 'error')) - .$trace - ."<div class='result'>" - .($ok ? ((isset($infos['upgrade']) && $infos['upgrade']) ? _T("plugin_info_upgrade_ok") : _T("plugin_info_install_ok")) : _T("avis_operation_echec")) - ."</div>" - .boite_fermer() - ."</div>"; + echo "<div class='install-plugins svp_retour'>" + . boite_ouvrir(_T('plugin_titre_installation', array('plugin' => typo($infos['nom']))), + ($ok ? 'success' : 'error')) + . $trace + . "<div class='result'>" + . ($ok ? ((isset($infos['upgrade']) && $infos['upgrade']) ? _T("plugin_info_upgrade_ok") : _T("plugin_info_install_ok")) : _T("avis_operation_echec")) + . "</div>" + . boite_fermer() + . "</div>"; } } } } - ecrire_meta('plugin_installes',serialize($meta_plug_installes),'non'); + ecrire_meta('plugin_installes', serialize($meta_plug_installes), 'non'); } -function ecrire_fichier_php($nom, $contenu, $comment = '') -{ +function ecrire_fichier_php($nom, $contenu, $comment = '') { ecrire_fichier($nom, - '<'.'?php' . "\n" . $comment ."\nif (defined('_ECRIRE_INC_VERSION')) {\n". $contenu . "}\n?".'>'); + '<' . '?php' . "\n" . $comment . "\nif (defined('_ECRIRE_INC_VERSION')) {\n" . $contenu . "}\n?" . '>'); } diff --git a/ecrire/inc/precharger_article.php b/ecrire/inc/precharger_article.php index 60f6b76ca3..556d449145 100644 --- a/ecrire/inc/precharger_article.php +++ b/ecrire/inc/precharger_article.php @@ -14,9 +14,11 @@ * Préchargement les formulaires d'édition d'article, notament pour les traductions * * @package SPIP\Core\Objets -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/precharger_objet'); @@ -25,7 +27,7 @@ include_spip('inc/precharger_objet'); * Retourne les valeurs à charger pour un formulaire d'édition d'un article * * Lors d'une création, certains champs peuvent être préremplis - * (c'est le cas des traductions) + * (c'est le cas des traductions) * * @param string|int $id_article * Identifiant de l'article, ou "new" pour une création @@ -35,7 +37,7 @@ include_spip('inc/precharger_objet'); * Identifiant éventuel de la traduction de référence * @return array * Couples clés / valeurs des champs du formulaire à charger. -**/ + **/ function inc_precharger_article_dist($id_article, $id_rubrique = 0, $lier_trad = 0) { return precharger_objet('article', $id_article, $id_rubrique, $lier_trad, 'titre'); } @@ -43,11 +45,11 @@ function inc_precharger_article_dist($id_article, $id_rubrique = 0, $lier_trad = /** * Récupère les valeurs d'une traduction de référence pour la création - * d'un article (préremplissage du formulaire). + * d'un article (préremplissage du formulaire). * * @note * Fonction facultative si pas de changement dans les traitements - * + * * @param string|int $id_article * Identifiant de l'article, ou "new" pour une création * @param int $id_rubrique @@ -56,11 +58,10 @@ function inc_precharger_article_dist($id_article, $id_rubrique = 0, $lier_trad = * Identifiant éventuel de la traduction de référence * @return array * Couples clés / valeurs des champs du formulaire à charger -**/ + **/ function inc_precharger_traduction_article_dist($id_article, $id_rubrique = 0, $lier_trad = 0) { return precharger_traduction_objet('article', $id_article, $id_rubrique, $lier_trad, 'titre'); } - ?> diff --git a/ecrire/inc/precharger_objet.php b/ecrire/inc/precharger_objet.php index 569b31f586..a261633df6 100644 --- a/ecrire/inc/precharger_objet.php +++ b/ecrire/inc/precharger_objet.php @@ -14,19 +14,20 @@ * Préchargement les formulaires d'édition d'objets, notament pour les traductions * * @package SPIP\Core\Objets -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/autoriser'); // necessaire si appel de l'espace public - /** * Retourne les valeurs à charger pour un formulaire d'édition d'un objet * * Lors d'une création, certains champs peuvent être préremplis - * (c'est le cas des traductions) + * (c'est le cas des traductions) * * @param string $type * Type d'objet (article, breve...) @@ -41,15 +42,16 @@ include_spip('inc/autoriser'); // necessaire si appel de l'espace public * On devrait pouvoir le savoir dans la déclaration de l'objet * @return array * Couples clés / valeurs des champs du formulaire à charger. -**/ + **/ function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $champ_titre = 'titre') { $table = table_objet_sql($type); $_id_objet = id_table_objet($table); // si l'objet existe deja, on retourne simplement ses valeurs - if (is_numeric($id_objet)) + if (is_numeric($id_objet)) { return sql_fetsel("*", $table, "$_id_objet=$id_objet"); + } // ici, on demande une creation. // on prerempli certains elements : les champs si traduction, @@ -57,15 +59,16 @@ function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $c $desc = lister_tables_objets_sql($table); # il faudrait calculer $champ_titre ici $is_rubrique = isset($desc['field']['id_rubrique']); - $is_secteur = isset($desc['field']['id_secteur']); + $is_secteur = isset($desc['field']['id_secteur']); // si demande de traduction // on recupere les valeurs de la traduction - if ($lier_trad){ - if ($select = charger_fonction("precharger_traduction_" . $type,'inc',true)) + if ($lier_trad) { + if ($select = charger_fonction("precharger_traduction_" . $type, 'inc', true)) { $row = $select($id_objet, $id_rubrique, $lier_trad); - else + } else { $row = precharger_traduction_objet($type, $id_objet, $id_rubrique, $lier_trad, $champ_titre); + } } else { $row[$champ_titre] = ''; if ($is_rubrique) { @@ -80,22 +83,22 @@ function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $c // admin restreint ==> sa premiere rubrique // autre ==> la derniere rubrique cree if (!$row['id_rubrique']) { - if ($GLOBALS['connect_id_rubrique']) + if ($GLOBALS['connect_id_rubrique']) { $row['id_rubrique'] = $id_rubrique = current($GLOBALS['connect_id_rubrique']); - else { + } else { $row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "", "", "id_rubrique DESC", 1); $row['id_rubrique'] = $id_rubrique = $row_rub['id_rubrique']; } - if (!autoriser('creerarticledans','rubrique',$row['id_rubrique'] )){ + if (!autoriser('creerarticledans', 'rubrique', $row['id_rubrique'])) { // manque de chance, la rubrique n'est pas autorisee, on cherche un des secteurs autorises $res = sql_select("id_rubrique", "spip_rubriques", "id_parent=0"); - while (!autoriser('creerarticledans','rubrique',$row['id_rubrique'] ) && $row_rub = sql_fetch($res)){ + while (!autoriser('creerarticledans', 'rubrique', $row['id_rubrique']) && $row_rub = sql_fetch($res)) { $row['id_rubrique'] = $row_rub['id_rubrique']; } } } } - + // recuperer le secteur, pour affecter les bons champs extras if ($id_rubrique and $is_secteur) { if (!$row['id_secteur']) { @@ -110,7 +113,7 @@ function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $c /** * Récupère les valeurs d'une traduction de référence pour la création - * d'un objet (préremplissage du formulaire). + * d'un objet (préremplissage du formulaire). * * @param string $type * Type d'objet (article, breve...) @@ -124,7 +127,7 @@ function precharger_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $c * Nom de la colonne SQL de l'objet donnant le titre * @return array * Couples clés / valeurs des champs du formulaire à charger -**/ + **/ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_trad = 0, $champ_titre = 'titre') { $table = table_objet_sql($type); $_id_objet = id_table_objet($table); @@ -132,7 +135,7 @@ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_t // Recuperer les donnees de l'objet original $row = sql_fetsel("*", $table, "$_id_objet=$lier_trad"); if ($row) { - $row[$champ_titre] = filtrer_entites(_T('info_nouvelle_traduction')).' '.$row[$champ_titre]; + $row[$champ_titre] = filtrer_entites(_T('info_nouvelle_traduction')) . ' ' . $row[$champ_titre]; } else { $row = array(); } @@ -140,28 +143,29 @@ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_t // on met l'objet dans une rubrique si l'objet le peut $desc = lister_tables_objets_sql($table); $is_rubrique = isset($desc['field']['id_rubrique']); - + if ($is_rubrique) { if ($id_rubrique) { $row['id_rubrique'] = $id_rubrique; + return $row; } $id_rubrique = $row['id_rubrique']; - + // Regler la langue, si possible, sur celle du redacteur // Cela implique souvent de choisir une rubrique ou un secteur if (in_array($GLOBALS['spip_lang'], - explode(',', $GLOBALS['meta']['langues_multilingue']))) { + explode(',', $GLOBALS['meta']['langues_multilingue']))) { // Si le menu de langues est autorise sur l'objet, // on peut changer la langue quelle que soit la rubrique // donc on reste dans la meme rubrique - if (in_array($table, explode(',',$GLOBALS['meta']['multi_objets']))) { + if (in_array($table, explode(',', $GLOBALS['meta']['multi_objets']))) { $row['id_rubrique'] = $row['id_rubrique']; # explicite :-) - // Sinon, chercher la rubrique la plus adaptee pour - // accueillir l'objet dans la langue du traducteur + // Sinon, chercher la rubrique la plus adaptee pour + // accueillir l'objet dans la langue du traducteur } elseif ($is_rubrique and $GLOBALS['meta']['multi_rubriques'] == 'oui') { if ($GLOBALS['meta']['multi_secteurs'] == 'oui') { $id_parent = 0; @@ -170,16 +174,18 @@ function precharger_traduction_objet($type, $id_objet, $id_rubrique = 0, $lier_t $row_rub = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=$id_rubrique"); $id_parent = $row_rub['id_parent']; } - - $row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "lang='".$GLOBALS['spip_lang']."' AND id_parent=$id_parent"); - if ($row_rub) - $row['id_rubrique'] = $row_rub['id_rubrique']; + + $row_rub = sql_fetsel("id_rubrique", "spip_rubriques", + "lang='" . $GLOBALS['spip_lang'] . "' AND id_parent=$id_parent"); + if ($row_rub) { + $row['id_rubrique'] = $row_rub['id_rubrique']; + } } } } + return $row; } - ?> diff --git a/ecrire/inc/prepare_recherche.php b/ecrire/inc/prepare_recherche.php index a7cdd07a58..ff62a66e74 100644 --- a/ecrire/inc/prepare_recherche.php +++ b/ecrire/inc/prepare_recherche.php @@ -14,17 +14,21 @@ * Gestion des préparatifs de recherches * * @package SPIP\Core\Recherche -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/rechercher'); -if (!defined('_DELAI_CACHE_resultats')) define('_DELAI_CACHE_resultats', 600); +if (!defined('_DELAI_CACHE_resultats')) { + define('_DELAI_CACHE_resultats', 600); +} /** * Préparer les listes `id_article IN (...)` pour les parties WHERE * et calcul des `points` pour la partie SELECT des requêtes du moteur de recherche - * + * * Le paramètre $serveur est utilisé pour savoir sur quelle base on cherche * mais l'index des résultats est toujours stocké sur le serveur principal * car on ne sait pas si la base distante dispose d'une table spip_resultats @@ -44,31 +48,46 @@ if (!defined('_DELAI_CACHE_resultats')) define('_DELAI_CACHE_resultats', 600); * cle primaire de la table de recherche * @return array */ -function inc_prepare_recherche_dist($recherche, $table = 'articles', $cond = false, $serveur = '', $modificateurs = array(), $primary = '') { +function inc_prepare_recherche_dist( + $recherche, + $table = 'articles', + $cond = false, + $serveur = '', + $modificateurs = array(), + $primary = '' +) { static $cache = array(); - $delai_fraicheur = min(_DELAI_CACHE_resultats,time()-(isset($GLOBALS['meta']['derniere_modif']) ? $GLOBALS['meta']['derniere_modif'] : 0 )); + $delai_fraicheur = min(_DELAI_CACHE_resultats, + time()-(isset($GLOBALS['meta']['derniere_modif']) ? $GLOBALS['meta']['derniere_modif'] : 0)); // si recherche n'est pas dans le contexte, on va prendre en globals // ca permet de faire des inclure simple. - if (!isset($recherche) AND isset($GLOBALS['recherche'])) + if (!isset($recherche) AND isset($GLOBALS['recherche'])) { $recherche = $GLOBALS['recherche']; + } // traiter le cas {recherche?} - if ($cond AND !strlen($recherche)) - return array("0 as points" /* as points */, /* where */ ''); - - + if ($cond AND !strlen($recherche)) { + return array( + "0 as points" /* as points */, /* where */ + '' + ); + } + + $rechercher = false; - if (!isset($cache[$serveur][$table][$recherche])){ - $hash_serv = ($serveur?substr(md5($serveur),0,16):''); - $hash = substr(md5($recherche . $table),0,16); - $where = "(resultats.recherche='$hash' AND resultats.table_objet=".sql_quote($table)." AND resultats.serveur='$hash_serv')"; - $row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(resultats.maj) AS fraicheur','spip_resultats AS resultats',$where,'','fraicheur DESC','0,1'); + if (!isset($cache[$serveur][$table][$recherche])) { + $hash_serv = ($serveur ? substr(md5($serveur), 0, 16) : ''); + $hash = substr(md5($recherche . $table), 0, 16); + $where = "(resultats.recherche='$hash' AND resultats.table_objet=" . sql_quote($table) . " AND resultats.serveur='$hash_serv')"; + $row = sql_fetsel('UNIX_TIMESTAMP(NOW())-UNIX_TIMESTAMP(resultats.maj) AS fraicheur', 'spip_resultats AS resultats', + $where, '', 'fraicheur DESC', '0,1'); if (!$row - OR ($row['fraicheur']>$delai_fraicheur) - OR (defined('_VAR_MODE') AND _VAR_MODE=='recalcul')){ - $rechercher = true; + OR ($row['fraicheur'] > $delai_fraicheur) + OR (defined('_VAR_MODE') AND _VAR_MODE == 'recalcul') + ) { + $rechercher = true; } } @@ -82,27 +101,34 @@ function inc_prepare_recherche_dist($recherche, $table = 'articles', $cond = fal 'score' => true, 'toutvoir' => true, 'jointures' => true - ), + ), $serveur); // pas de résultat, pas de point $points = isset($points[$x]) ? $points[$x] : array(); // permettre aux plugins de modifier le resultat - $points = pipeline('prepare_recherche',array( - 'args'=>array('type'=>$x,'recherche'=>$recherche,'serveur'=>$serveur,'modificateurs'=>$modificateurs), - 'data'=>$points + $points = pipeline('prepare_recherche', array( + 'args' => array( + 'type' => $x, + 'recherche' => $recherche, + 'serveur' => $serveur, + 'modificateurs' => $modificateurs + ), + 'data' => $points )); // supprimer les anciens resultats de cette recherche // et les resultats trop vieux avec une marge // pas de AS resultats dans un delete (mysql) - $whered = str_replace(array("resultats.recherche","resultats.table_objet","resultats.serveur"),array("recherche","table_objet","serveur"),$where); - sql_delete('spip_resultats', 'NOT(' .sql_date_proche('maj', (0-($delai_fraicheur+100)), " SECOND") . ") OR ($whered)"); + $whered = str_replace(array("resultats.recherche", "resultats.table_objet", "resultats.serveur"), + array("recherche", "table_objet", "serveur"), $where); + sql_delete('spip_resultats', + 'NOT(' . sql_date_proche('maj', (0-($delai_fraicheur+100)), " SECOND") . ") OR ($whered)"); // inserer les resultats dans la table de cache des resultats - if (count($points)){ + if (count($points)) { $tab_couples = array(); - foreach ($points as $id => $p){ + foreach ($points as $id => $p) { $tab_couples[] = array( 'recherche' => $hash, 'id' => $id, @@ -111,16 +137,17 @@ function inc_prepare_recherche_dist($recherche, $table = 'articles', $cond = fal 'serveur' => $hash_serv, ); } - sql_insertq_multi('spip_resultats',$tab_couples,array()); + sql_insertq_multi('spip_resultats', $tab_couples, array()); } } - if (!isset($cache[$serveur][$table][$recherche])){ - if (!$serveur) - $cache[$serveur][$table][$recherche] = array("resultats.points AS points",$where); - else { - if (sql_countsel('spip_resultats as resultats',$where)) - $rows = sql_allfetsel('resultats.id,resultats.points','spip_resultats as resultats',$where); + if (!isset($cache[$serveur][$table][$recherche])) { + if (!$serveur) { + $cache[$serveur][$table][$recherche] = array("resultats.points AS points", $where); + } else { + if (sql_countsel('spip_resultats as resultats', $where)) { + $rows = sql_allfetsel('resultats.id,resultats.points', 'spip_resultats as resultats', $where); + } $cache[$serveur][$table][$recherche] = generer_select_where_explicites($table, $primary, $rows, $serveur); } } @@ -140,23 +167,24 @@ function inc_prepare_recherche_dist($recherche, $table = 'articles', $cond = fal * @param string $serveur * @return array */ -function generer_select_where_explicites($table, $primary, $rows, $serveur){ +function generer_select_where_explicites($table, $primary, $rows, $serveur) { # calculer le {id_article IN()} et le {... as points} - if (!count($rows)){ + if (!count($rows)) { return array("''", "0=1"); - } - else { + } else { $listes_ids = array(); $select = '0'; - foreach ($rows as $r) + foreach ($rows as $r) { $listes_ids[$r['points']][] = $r['id']; + } - foreach ($listes_ids as $p => $ids) - $select .= "+$p*(". - sql_in("$table.$primary", $ids,'',$serveur) - .") "; + foreach ($listes_ids as $p => $ids) { + $select .= "+$p*(" . + sql_in("$table.$primary", $ids, '', $serveur) + . ") "; + } - return array("$select AS points ",sql_in("$table.$primary",array_map('reset',$rows),'',$serveur)); + return array("$select AS points ", sql_in("$table.$primary", array_map('reset', $rows), '', $serveur)); } } diff --git a/ecrire/inc/preselectionner_parent_nouvel_objet.php b/ecrire/inc/preselectionner_parent_nouvel_objet.php index 5e3f40b8c1..f5fe10cb7b 100644 --- a/ecrire/inc/preselectionner_parent_nouvel_objet.php +++ b/ecrire/inc/preselectionner_parent_nouvel_objet.php @@ -11,9 +11,12 @@ \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; -if (!defined('_AUTO_SELECTION_RUBRIQUE')) - define('_AUTO_SELECTION_RUBRIQUE',false); +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} +if (!defined('_AUTO_SELECTION_RUBRIQUE')) { + define('_AUTO_SELECTION_RUBRIQUE', false); +} /** @@ -25,33 +28,36 @@ if (!defined('_AUTO_SELECTION_RUBRIQUE')) * @param array $row * @return string */ -function inc_preselectionner_parent_nouvel_objet_dist($objet, $row){ - if (!_AUTO_SELECTION_RUBRIQUE) +function inc_preselectionner_parent_nouvel_objet_dist($objet, $row) { + if (!_AUTO_SELECTION_RUBRIQUE) { return ''; + } - if (!isset($row['id_rubrique'])) + if (!isset($row['id_rubrique'])) { return ''; + } $id_rubrique = ''; - if ($GLOBALS['connect_id_rubrique']){ + if ($GLOBALS['connect_id_rubrique']) { // si admin restreint : sa rubrique $id_rubrique = $GLOBALS['connect_id_rubrique'][0]; - } - else { + } else { // sinon la derniere rubrique cree $row_rub = sql_fetsel("id_rubrique", "spip_rubriques", "", "", "id_rubrique DESC", "0,1"); $id_rubrique = $row_rub['id_rubrique']; } // si le choix ne convient pas, on cherche dans un secteur - if (!autoriser('creer'.$objet.'dans','rubrique',$id_rubrique)){ + if (!autoriser('creer' . $objet . 'dans', 'rubrique', $id_rubrique)) { $id_rubrique = ''; // manque de chance, la rubrique n'est pas autorisee, on cherche un des secteurs autorises $res = sql_select("id_rubrique", "spip_rubriques", "id_parent=0"); - while (!$id_rubrique AND $row_rub = sql_fetch($res)){ - if (autoriser('creer'.$objet.'dans','rubrique',$row_rub['id_rubrique'])) + while (!$id_rubrique AND $row_rub = sql_fetch($res)) { + if (autoriser('creer' . $objet . 'dans', 'rubrique', $row_rub['id_rubrique'])) { $id_rubrique = $row_rub['id_rubrique']; + } } } + return $id_rubrique; } \ No newline at end of file diff --git a/ecrire/inc/presentation.php b/ecrire/inc/presentation.php index 1ab8e44c20..ca8e294ec3 100644 --- a/ecrire/inc/presentation.php +++ b/ecrire/inc/presentation.php @@ -11,11 +11,13 @@ \***************************************************************************/ /** - * Fonctions pour l'affichage privé des pages exec PHP + * Fonctions pour l'affichage privé des pages exec PHP * * @package SPIP\Core\Presentation -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/presentation_mini'); include_spip('inc/layer'); @@ -29,54 +31,135 @@ include_spip('inc/filtres_boites'); // http://code.spip.net/@debut_cadre function debut_cadre($style, $icone = "", $fonction = "", $titre = "", $id = "", $class = "", $padding = true) { - $style_mapping=array('r'=>'simple','e'=>'raccourcis','couleur'=>'basic highlight','couleur-foncee'=>'basic highlight','trait-couleur'=>'important','alerte'=>'notice','info'=>'info','sous_rub'=>'simple sous-rub'); - $style_titre_mapping=array('couleur'=>'topper','trait-couleur'=>'section'); - $c = isset($style_mapping[$style])?$style_mapping[$style]:'simple'; - $class = $c . ($class?" $class":""); - if (!$padding) - $class .= ($class?" ":"")."no-padding"; + $style_mapping = array( + 'r' => 'simple', + 'e' => 'raccourcis', + 'couleur' => 'basic highlight', + 'couleur-foncee' => 'basic highlight', + 'trait-couleur' => 'important', + 'alerte' => 'notice', + 'info' => 'info', + 'sous_rub' => 'simple sous-rub' + ); + $style_titre_mapping = array('couleur' => 'topper', 'trait-couleur' => 'section'); + $c = isset($style_mapping[$style]) ? $style_mapping[$style] : 'simple'; + $class = $c . ($class ? " $class" : ""); + if (!$padding) { + $class .= ($class ? " " : "") . "no-padding"; + } //($id?"id='$id' ":"") if (strlen($icone) > 1) { - if ($icone_renommer = charger_fonction('icone_renommer','inc',true)) - list($fond,$fonction) = $icone_renommer($icone,$fonction); + if ($icone_renommer = charger_fonction('icone_renommer', 'inc', true)) { + list($fond, $fonction) = $icone_renommer($icone, $fonction); + } $size = 24; - if (preg_match("/-([0-9]{1,3})[.](gif|png)$/i",$fond,$match)) + if (preg_match("/-([0-9]{1,3})[.](gif|png)$/i", $fond, $match)) { $size = $match[1]; - if ($fonction){ + } + if ($fonction) { // 2 images pour composer l'icone : le fond (article) en background, // la fonction (new) en image $icone = http_img_pack($fonction, "", "class='cadre-icone' width='$size' height='$size'\n" . - http_style_background($fond, "no-repeat center center")); - } - else { + http_style_background($fond, "no-repeat center center")); + } else { $icone = http_img_pack($fond, "", "class='cadre-icone' width='$size' height='$size'"); } $titre = $icone . $titre; } - return boite_ouvrir($titre, $class,isset($style_titre_mapping[$style])?$style_titre_mapping[$style]:'',$id); + + return boite_ouvrir($titre, $class, isset($style_titre_mapping[$style]) ? $style_titre_mapping[$style] : '', $id); } // http://code.spip.net/@fin_cadre -function fin_cadre() {return boite_fermer();} - - -function debut_cadre_relief($icone = '', $dummy = '', $fonction = '', $titre = '', $id = "", $class = ""){return debut_cadre('r', $icone, $fonction, $titre, $id, $class);} -function fin_cadre_relief(){return fin_cadre('r');} -function debut_cadre_enfonce($icone = '', $dummy = '', $fonction = '', $titre = '', $id = "", $class = ""){return debut_cadre('e', $icone, $fonction, $titre, $id, $class);} -function fin_cadre_enfonce(){return fin_cadre('e');} -function debut_cadre_sous_rub($icone = '', $dummy = '', $fonction = '', $titre = '', $id = "", $class = ""){return debut_cadre('sous_rub', $icone, $fonction, $titre, $id, $class);} -function fin_cadre_sous_rub(){return fin_cadre('sous_rub');} -function debut_cadre_couleur($icone = '', $dummy = '', $fonction = '', $titre = '', $id = "", $class = ""){return debut_cadre('couleur', $icone, $fonction, $titre, $id, $class);} -function fin_cadre_couleur(){return fin_cadre('couleur');} -function debut_cadre_couleur_foncee($icone = '', $dummy = '', $fonction = '', $titre = '', $id = "", $class = ""){return debut_cadre('couleur-foncee', $icone, $fonction, $titre, $id, $class);} -function fin_cadre_couleur_foncee(){return fin_cadre('couleur-foncee');} -function debut_cadre_trait_couleur($icone = '', $dummy = '', $fonction = '', $titre = '', $id = "", $class = ""){return debut_cadre('trait-couleur', $icone, $fonction, $titre, $id, $class);} -function fin_cadre_trait_couleur(){return fin_cadre('trait-couleur');} -function debut_boite_alerte() {return debut_cadre('alerte', '', '', '', '', '');} -function fin_boite_alerte() {return fin_cadre('alerte');} -function debut_boite_info() {return debut_cadre('info', '', '', '', '', '');} -function fin_boite_info() {return fin_cadre('info');} +function fin_cadre() { return boite_fermer(); } + + +function debut_cadre_relief( + $icone = '', + $dummy = '', + $fonction = '', + $titre = '', + $id = "", + $class = "" +) { + return debut_cadre('r', $icone, $fonction, $titre, $id, $class); +} + +function fin_cadre_relief() { return fin_cadre('r'); } + +function debut_cadre_enfonce( + $icone = '', + $dummy = '', + $fonction = '', + $titre = '', + $id = "", + $class = "" +) { + return debut_cadre('e', $icone, $fonction, $titre, $id, $class); +} + +function fin_cadre_enfonce() { return fin_cadre('e'); } + +function debut_cadre_sous_rub( + $icone = '', + $dummy = '', + $fonction = '', + $titre = '', + $id = "", + $class = "" +) { + return debut_cadre('sous_rub', $icone, $fonction, $titre, $id, $class); +} + +function fin_cadre_sous_rub() { return fin_cadre('sous_rub'); } + +function debut_cadre_couleur( + $icone = '', + $dummy = '', + $fonction = '', + $titre = '', + $id = "", + $class = "" +) { + return debut_cadre('couleur', $icone, $fonction, $titre, $id, $class); +} + +function fin_cadre_couleur() { return fin_cadre('couleur'); } + +function debut_cadre_couleur_foncee( + $icone = '', + $dummy = '', + $fonction = '', + $titre = '', + $id = "", + $class = "" +) { + return debut_cadre('couleur-foncee', $icone, $fonction, $titre, $id, $class); +} + +function fin_cadre_couleur_foncee() { return fin_cadre('couleur-foncee'); } + +function debut_cadre_trait_couleur( + $icone = '', + $dummy = '', + $fonction = '', + $titre = '', + $id = "", + $class = "" +) { + return debut_cadre('trait-couleur', $icone, $fonction, $titre, $id, $class); +} + +function fin_cadre_trait_couleur() { return fin_cadre('trait-couleur'); } + +function debut_boite_alerte() { return debut_cadre('alerte', '', '', '', '', ''); } + +function fin_boite_alerte() { return fin_cadre('alerte'); } + +function debut_boite_info() { return debut_cadre('info', '', '', '', '', ''); } + +function fin_boite_info() { return fin_cadre('info'); } /** * Affiche le titre d’une page de l’interface privée. Utilisée par la plupart des fichiers `exec/xx.php`. @@ -84,21 +167,28 @@ function fin_boite_info() {return fin_cadre('info');} * @param string $titre Le titre en question * @param string $ze_logo Une image de logo * @return string Code PHP. -**/ -function gros_titre($titre, $ze_logo = ''){return "<h1 class = 'grostitre'>" . $ze_logo.' ' . typo($titre)."</h1>\n";} + **/ +function gros_titre( + $titre, + $ze_logo = '' +) { + return "<h1 class = 'grostitre'>" . $ze_logo . ' ' . typo($titre) . "</h1>\n"; +} // La boite des raccourcis // Se place a droite si l'ecran est en mode panoramique. // http://code.spip.net/@bloc_des_raccourcis function bloc_des_raccourcis($bloc) { return creer_colonne_droite() - . boite_ouvrir(_T('titre_cadre_raccourcis'),'raccourcis') . $bloc . boite_fermer(); + . boite_ouvrir(_T('titre_cadre_raccourcis'), 'raccourcis') . $bloc . boite_fermer(); } // Compatibilite // http://code.spip.net/@afficher_plus -function afficher_plus($lien) {include_spip('inc/filtres_ecrire');afficher_plus_info($lien);} - +function afficher_plus($lien) { + include_spip('inc/filtres_ecrire'); + afficher_plus_info($lien); +} // @@ -108,22 +198,24 @@ function afficher_plus($lien) {include_spip('inc/filtres_ecrire');afficher_plus_ // Fonctions onglets // http://code.spip.net/@debut_onglet // @param string $sous_classe prend la valeur second pour definir les onglet de deuxieme niveau -function debut_onglet($classe = "barre_onglet"){return "<div class = '$classe clearfix'><ul>\n";} +function debut_onglet($classe = "barre_onglet") { return "<div class = '$classe clearfix'><ul>\n"; } + // http://code.spip.net/@fin_onglet -function fin_onglet(){return "</ul></div>\n";} +function fin_onglet() { return "</ul></div>\n"; } + // http://code.spip.net/@onglet -function onglet($texte, $lien, $onglet_ref, $onglet, $icone = ""){ +function onglet($texte, $lien, $onglet_ref, $onglet, $icone = "") { return "<li>" - . ($icone?http_img_pack($icone, '', " class='cadre-icone'"):'') - . lien_ou_expose($lien,$texte,$onglet == $onglet_ref) - . "</li>"; + . ($icone ? http_img_pack($icone, '', " class='cadre-icone'") : '') + . lien_ou_expose($lien, $texte, $onglet == $onglet_ref) + . "</li>"; } /** * Crée un lien précédé d'une icone au dessus du texte * * @uses icone_base() - * @see filtre_icone_verticale_dist() Pour l'usage en tant que filtre + * @see filtre_icone_verticale_dist() Pour l'usage en tant que filtre * * @example * ``` @@ -131,7 +223,7 @@ function onglet($texte, $lien, $onglet_ref, $onglet, $icone = ""){ * generer_url_ecrire('site_edit', "id_rubrique=$id_rubrique"), * "site-24.png", "new", 'right') * ``` - * + * * @param string $texte * Texte du lien * @param string $lien @@ -146,23 +238,23 @@ function onglet($texte, $lien, $onglet_ref, $onglet, $icone = ""){ * Javascript ajouté sur le lien * @return string * Code HTML du lien -**/ -function icone_verticale($texte, $lien, $fond, $fonction = "", $align = "", $javascript = ""){ + **/ +function icone_verticale($texte, $lien, $fond, $fonction = "", $align = "", $javascript = "") { // cas d'ajax_action_auteur: faut defaire le boulot // (il faudrait fusionner avec le cas $javascript) - if (preg_match(",^<a\shref='([^']*)'([^>]*)>(.*)</a>$,i",$lien,$r)) { - list($x,$lien,$atts,$texte)= $r; + if (preg_match(",^<a\shref='([^']*)'([^>]*)>(.*)</a>$,i", $lien, $r)) { + list($x, $lien, $atts, $texte) = $r; $javascript .= $atts; } - return icone_base($lien, $texte, $fond, $fonction,"verticale $align",$javascript); + return icone_base($lien, $texte, $fond, $fonction, "verticale $align", $javascript); } /** * Crée un lien précédé d'une icone horizontale * * @uses icone_base() - * @see filtre_icone_horizontale_dist() Pour l'usage en tant que filtre + * @see filtre_icone_horizontale_dist() Pour l'usage en tant que filtre * * @param string $texte * Texte du lien @@ -178,17 +270,18 @@ function icone_verticale($texte, $lien, $fond, $fonction = "", $align = "", $jav * Javascript ajouté sur le lien * @return string * Code HTML du lien -**/ + **/ function icone_horizontale($texte, $lien, $fond, $fonction = "", $dummy = "", $javascript = "") { $retour = ''; // cas d'ajax_action_auteur: faut defaire le boulot // (il faudrait fusionner avec le cas $javascript) - if (preg_match(",^<a\shref='([^']*)'([^>]*)>(.*)</a>$,i",$lien,$r)) { - list($x,$lien,$atts,$texte)= $r; + if (preg_match(",^<a\shref='([^']*)'([^>]*)>(.*)</a>$,i", $lien, $r)) { + list($x, $lien, $atts, $texte) = $r; $javascript .= $atts; } - $retour = icone_base($lien, $texte, $fond, $fonction,"horizontale",$javascript); + $retour = icone_base($lien, $texte, $fond, $fonction, "horizontale", $javascript); + return $retour; } diff --git a/ecrire/inc/presentation_mini.php b/ecrire/inc/presentation_mini.php index 23791d8ceb..fcf10e5e40 100644 --- a/ecrire/inc/presentation_mini.php +++ b/ecrire/inc/presentation_mini.php @@ -14,42 +14,46 @@ * Fonctions d'affichage pour l'espace privé (hors squelettes) * * @package SPIP\Core\Affichage -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Affiche un code html (echo) et log l'affichage car cet echo est anormal ! - * + * * Signale une fonction qui devrait retourner un contenu mais effectue * un echo à la place pour compatibilité ascendante * * @deprecated * Utiliser des squelettes pour l'affichage ! - * + * * @param string $f * Nom de la fonction * @param string $ret * Code HTML à afficher * @return void -**/ + **/ function echo_log($f, $ret) { - spip_log("Page " . self() . " function $f: echo ".substr($ret, 0, 50)."...", 'echo'); + spip_log("Page " . self() . " function $f: echo " . substr($ret, 0, 50) . "...", 'echo'); echo - (_SIGNALER_ECHOS?"#Echo par $f#" :"") + (_SIGNALER_ECHOS ? "#Echo par $f#" : "") . $ret; } /** * Retourne le code HTML d'un début de cadre pour le centre de page (haut de page) + * * @return string Code HTML */ -function debut_grand_cadre(){ return "\n<div class = 'table_page'>\n";} +function debut_grand_cadre() { return "\n<div class = 'table_page'>\n"; } /** * Retourne le code HTML d'une fin de cadre pour le centre de page (haut de page) + * * @return string Code HTML */ -function fin_grand_cadre(){ return "\n</div>";} +function fin_grand_cadre() { return "\n</div>"; } // Debut de la colonne de gauche // div navigation fermee par creer_colonne_droite qui ouvre @@ -59,36 +63,45 @@ function fin_grand_cadre(){ return "\n</div>";} /** * Retourne le code HTML du début de la colonne gauche + * * @return string Code HTML */ -function debut_gauche() { return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n";} +function debut_gauche() { + return "<div id = 'conteneur' class = ''>\n<div id = 'navigation' class = 'lat' role = 'contentinfo'>\n"; +} /** * Retourne le code HTML de la fin de la colonne + * * @return string Code HTML */ -function fin_gauche(){return "</div></div><br class = 'nettoyeur' />";} +function fin_gauche() { return "</div></div><br class = 'nettoyeur' />"; } /** * Retourne le code HTML du changement de colonne (passer de la gauche à la droite) + * * @return string Code HTML */ -function creer_colonne_droite(){ +function creer_colonne_droite() { static $deja_colonne_droite; - if ($GLOBALS['spip_ecran']!='large' OR $deja_colonne_droite) return ''; + if ($GLOBALS['spip_ecran'] != 'large' OR $deja_colonne_droite) { + return ''; + } $deja_colonne_droite = true; + return "\n</div><div id='extra' class='lat' role='complementary'>"; } /** * Retourne le code HTML de la colonne droite et du centre de page + * * @return string Code HTML */ function debut_droite() { return liste_objets_bloques(_request('exec')) - . creer_colonne_droite() - . "</div>" - . "\n<div id='contenu'>"; + . creer_colonne_droite() + . "</div>" + . "\n<div id='contenu'>"; } /** @@ -99,7 +112,7 @@ function debut_droite() { * * @uses signale_edition() * @uses liste_drapeau_edition() - * + * * @param string $exec * Nom de la page exec en cours * @param array $contexte @@ -108,42 +121,45 @@ function debut_droite() { * Session de l'auteur. Sera prise sur l'auteur connecté si non indiquée. * @return string * Code HTML -**/ -function liste_objets_bloques($exec, $contexte = array(), $auteur = null){ + **/ +function liste_objets_bloques($exec, $contexte = array(), $auteur = null) { $res = ''; if ($GLOBALS['meta']["articles_modif"] != "non") { include_spip('inc/drapeau_edition'); - if (is_null($auteur)) + if (is_null($auteur)) { $auteur = $GLOBALS['visiteur_session']; - if ($en_cours=trouver_objet_exec($exec) + } + if ($en_cours = trouver_objet_exec($exec) AND $en_cours['edition'] AND $type = $en_cours['type'] AND ((isset($contexte[$en_cours['id_table_objet']]) and $id = $contexte[$en_cours['id_table_objet']]) - OR $id = _request($en_cours['id_table_objet']))) { + OR $id = _request($en_cours['id_table_objet'])) + ) { // marquer le fait que l'objet est ouvert en edition par toto // a telle date ; une alerte sera donnee aux autres redacteurs - signale_edition ($id, $auteur, $type); + signale_edition($id, $auteur, $type); } $objets_ouverts = liste_drapeau_edition($auteur['id_auteur']); if (count($objets_ouverts)) { - $res .= recuperer_fond('prive/objets/liste/objets-en-edition',array(),array('ajax'=>true)); + $res .= recuperer_fond('prive/objets/liste/objets-en-edition', array(), array('ajax' => true)); } } + return $res; } /** * Retourne le code HTML de fin de page de l'interface privée. - * + * * Elle génère au passage un appel pour déclencher les tâches cron * * @see f_queue() Pour l'appel au cron - * + * * @return string Code HTML -**/ -function fin_page(){ + **/ +function fin_page() { include_spip('inc/pipelines'); // avec &var_profile=1 on a le tableau de mesures SQL $debug = ((_request('exec') !== 'valider_xml') @@ -151,11 +167,12 @@ function fin_page(){ OR (isset($GLOBALS['tableau_des_temps']) AND $GLOBALS['tableau_des_temps']) AND isset($_COOKIE['spip_admin']))); $t = '</div><div id="pied"><div class="largeur">' - . recuperer_fond('prive/squelettes/inclure/pied') - . "</div>" - . "</div></div>" // cf. div#page et div.largeur ouvertes dans conmmencer_page() - . ($debug?erreur_squelette():'') - . "</body></html>\n"; + . recuperer_fond('prive/squelettes/inclure/pied') + . "</div>" + . "</div></div>" // cf. div#page et div.largeur ouvertes dans conmmencer_page() + . ($debug ? erreur_squelette() : '') + . "</body></html>\n"; + return f_queue($t); } @@ -169,41 +186,45 @@ function fin_page(){ * @see verifier_session() * * @return string Code HTML -**/ -function html_tests_js(){ + **/ +function html_tests_js() { if (_SPIP_AJAX AND !defined('_TESTER_NOSCRIPT')) { - // pour le pied de page (deja defini si on est validation XML) + // pour le pied de page (deja defini si on est validation XML) define('_TESTER_NOSCRIPT', "<noscript>\n<div style='display:none;'><img src='" - . generer_url_ecrire('test_ajax', 'js=-1') - . "' width='1' height='1' alt='' /></div></noscript>\n"); + . generer_url_ecrire('test_ajax', 'js=-1') + . "' width='1' height='1' alt='' /></div></noscript>\n"); } + return (defined('_SESSION_REJOUER') ? _SESSION_REJOUER : '') - . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : ''); + . (defined('_TESTER_NOSCRIPT') ? _TESTER_NOSCRIPT : ''); } /** * Retourne la liste des mises à jour de SPIP possibles * * @return string Texte présentant la liste des mises à jour existantes -**/ -function info_maj_spip(){ + **/ +function info_maj_spip() { $maj = isset($GLOBALS['meta']['info_maj_spip']) ? $GLOBALS['meta']['info_maj_spip'] : null; - if (!$maj) + if (!$maj) { return ""; + } - $maj = explode('|',$maj); + $maj = explode('|', $maj); // c'est une ancienne notif, on a fait la maj depuis ! - if ($GLOBALS['spip_version_branche']!==reset($maj)) + if ($GLOBALS['spip_version_branche'] !== reset($maj)) { return ""; + } - if (!autoriser('webmestre')) + if (!autoriser('webmestre')) { return ""; + } array_shift($maj); - $maj = implode('|',$maj); + $maj = implode('|', $maj); return "$maj<br />"; } @@ -213,7 +234,7 @@ function info_maj_spip(){ * pour le pied de page de l'espace privé * * @return string Code HTML -**/ + **/ function info_copyright() { $version = $GLOBALS['spip_version_affichee']; @@ -222,22 +243,25 @@ function info_copyright() { // Mention, le cas echeant, de la revision SVN courante // if ($svn_revision = version_svn_courante(_DIR_RACINE)) { - $version .= ' ' . (($svn_revision < 0) ? 'SVN ':'') - . "[<a href='http://core.spip.net/projects/spip/repository/revisions/" - . abs($svn_revision) . "' onclick=\"window.open(this.href); return false;\">" - . abs($svn_revision) . "</a>]"; + $version .= ' ' . (($svn_revision < 0) ? 'SVN ' : '') + . "[<a href='http://core.spip.net/projects/spip/repository/revisions/" + . abs($svn_revision) . "' onclick=\"window.open(this.href); return false;\">" + . abs($svn_revision) . "</a>]"; } // et la version de l'ecran de securite $secu = defined('_ECRAN_SECURITE') - ? "<br />"._T('ecran_securite',array('version'=>_ECRAN_SECURITE)) + ? "<br />" . _T('ecran_securite', array('version' => _ECRAN_SECURITE)) : ''; return _T('info_copyright', - array('spip' => "<b>SPIP $version</b> ", - 'lien_gpl' => - "<a href='". generer_url_ecrire("aide", "aide=licence&var_lang=".$GLOBALS['spip_lang']) . "' class=\"aide popin\">" . _T('info_copyright_gpl')."</a>")) - . $secu; + array( + 'spip' => "<b>SPIP $version</b> ", + 'lien_gpl' => + "<a href='" . generer_url_ecrire("aide", + "aide=licence&var_lang=" . $GLOBALS['spip_lang']) . "' class=\"aide popin\">" . _T('info_copyright_gpl') . "</a>" + )) + . $secu; } @@ -247,22 +271,25 @@ function info_copyright() { * Préférez l'usage en squelettes via la balise `#FORMULAIRE_RECHERCHE_ECRIRE`. * * @see formulaires_recherche_ecrire_charger_dist() - * - * @param string $page Nom de la page exec - * @param string $complement Code HTML supplémentaire + * + * @param string $page Nom de la page exec + * @param string $complement Code HTML supplémentaire * @return string Code HTML -**/ -function formulaire_recherche($page, $complement = ""){ + **/ +function formulaire_recherche($page, $complement = "") { $recherche = _request('recherche'); $recherche_aff = entites_html($recherche); if (!strlen($recherche)) { $recherche_aff = _T('info_rechercher'); $onfocus = " onfocus=\"this.value='';\""; - } else $onfocus = ''; + } else { + $onfocus = ''; + } + + $form = '<input type="text" size="10" value="' . $recherche_aff . '" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />'; + $form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='" . _T('info_rechercher') . "' />"; - $form = '<input type="text" size="10" value="'.$recherche_aff.'" name="recherche" class="recherche" accesskey="r"' . $onfocus . ' />'; - $form .= "<input type='image' src='" . chemin_image('rechercher-20.png') . "' name='submit' class='submit' alt='"._T('info_rechercher')."' />"; - return "<div class='spip_recherche'>".generer_form_ecrire($page, $form . $complement, " method='get'")."</div>"; + return "<div class='spip_recherche'>" . generer_form_ecrire($page, $form . $complement, " method='get'") . "</div>"; } ?> diff --git a/ecrire/inc/presenter_enfants.php b/ecrire/inc/presenter_enfants.php index 80042b66e1..95bf8e8483 100644 --- a/ecrire/inc/presenter_enfants.php +++ b/ecrire/inc/presenter_enfants.php @@ -11,24 +11,26 @@ \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/autoriser'); include_spip('inc/presentation'); /** * Crée l'affichage des listes de rubriques dans le privé - * + * * @param int $collection * L'identifiant numérique de la rubrique à lister * @param int $debut - * Le numéro de la pagination si paginé (> 500) + * Le numéro de la pagination si paginé (> 500) * @param int $limite - * Le pas de pagination si paginé (> 500) + * Le pas de pagination si paginé (> 500) * @return array $res - * Un tableau des sous rubriques + * Un tableau des sous rubriques */ -function enfant_rub($collection, $debut = 0, $limite = 500){ +function enfant_rub($collection, $debut = 0, $limite = 500) { $voir_logo = (isset($GLOBALS['meta']['image_process']) AND $GLOBALS['meta']['image_process'] != "non"); $logo = ""; @@ -38,50 +40,53 @@ function enfant_rub($collection, $debut = 0, $limite = 500){ } $res = array(); - - $result = sql_select("id_rubrique, id_parent, titre, descriptif, lang ", "spip_rubriques", "id_parent=$collection",'', '0+titre,titre',"$debut,$limite"); - while($row=sql_fetch($result)){ - $id_rubrique=$row['id_rubrique']; - $id_parent=$row['id_parent']; - $titre=generer_info_entite($id_rubrique,'rubrique','titre'); // pour etre sur de passer par tous les traitements - if ('' !== ($rang = recuperer_numero($row['titre']))) + + $result = sql_select("id_rubrique, id_parent, titre, descriptif, lang ", "spip_rubriques", "id_parent=$collection", + '', '0+titre,titre', "$debut,$limite"); + while ($row = sql_fetch($result)) { + $id_rubrique = $row['id_rubrique']; + $id_parent = $row['id_parent']; + $titre = generer_info_entite($id_rubrique, 'rubrique', 'titre'); // pour etre sur de passer par tous les traitements + if ('' !== ($rang = recuperer_numero($row['titre']))) { $rang = "$rang. "; + } - if (autoriser('voir','rubrique',$id_rubrique)){ + if (autoriser('voir', 'rubrique', $id_rubrique)) { $les_sous_enfants = sous_enfant_rub($id_rubrique); changer_typo($row['lang']); $lang_dir = lang_dir($row['lang']); - $descriptif=propre($row['descriptif']); + $descriptif = propre($row['descriptif']); if ($voir_logo) { if ($logo = $chercher_logo($id_rubrique, 'id_rubrique', 'on')) { list($fid, $dir, $nom, $format) = $logo; $logo = image_reduire("<img src='$fid' alt='' />", 48, 36); - if ($logo) - $logo = inserer_attribut($logo,'class','logo'); + if ($logo) { + $logo = inserer_attribut($logo, 'class', 'logo'); + } } } $lib_bouton = (!acces_restreint_rubrique($id_rubrique) ? "" : - http_img_pack('auteur-0minirezo-16.png', '', " width='16' height='16'", _T('image_administrer_rubrique'))) . - " <a dir='$lang_dir'". - ($row['lang']!==$GLOBALS['spip_lang']?" hreflang='".$row['lang']."'":''). + http_img_pack('auteur-0minirezo-16.png', '', " width='16' height='16'", _T('image_administrer_rubrique'))) . + " <a dir='$lang_dir'" . + ($row['lang'] !== $GLOBALS['spip_lang'] ? " hreflang='" . $row['lang'] . "'" : '') . " href='" . - generer_url_entite($id_rubrique,'rubrique') . - "'>". + generer_url_entite($id_rubrique, 'rubrique') . + "'>" . $rang . $titre . - "</a>"; + "</a>"; $titre = (is_string($logo) ? $logo : '') . - bouton_block_depliable($lib_bouton,$les_sous_enfants ?false:-1,"enfants$id_rubrique"); + bouton_block_depliable($lib_bouton, $les_sous_enfants ? false : -1, "enfants$id_rubrique"); $res[] = - debut_cadre_sous_rub(($id_parent ? "rubrique-24.png" : "secteur-24.png"), true, "", $titre) . - (!$descriptif ? '' : "\n<div class='descriptif'>$descriptif</div>") . - $les_sous_enfants . - fin_cadre_sous_rub(true); + debut_cadre_sous_rub(($id_parent ? "rubrique-24.png" : "secteur-24.png"), true, "", $titre) . + (!$descriptif ? '' : "\n<div class='descriptif'>$descriptif</div>") . + $les_sous_enfants . + fin_cadre_sous_rub(true); } } @@ -92,103 +97,113 @@ function enfant_rub($collection, $debut = 0, $limite = 500){ /** * Affiche les enfants d'une sous rubrique dans un bloc dépliable * (Utilisé dans les pages du privé) - * + * * @param int $collection2 - * L'identifiant numérique de la rubrique parente + * L'identifiant numérique de la rubrique parente * @return string - * Le contenu du bloc dépliable + * Le contenu du bloc dépliable */ -function sous_enfant_rub($collection2){ - $nb = sql_countsel('spip_rubriques',"id_parent=$collection2"); - +function sous_enfant_rub($collection2) { + $nb = sql_countsel('spip_rubriques', "id_parent=$collection2"); + $retour = ''; $pagination = ''; $debut = 0; $limite = 500; - + /** * On ne va afficher que 500 résultats max * Si > 500 on affiche une pagination */ - if($nb > $limite){ - $debut = _request('debut_rubrique'.$collection2) ? _request('debut_rubrique'.$collection2) : $debut; + if ($nb > $limite) { + $debut = _request('debut_rubrique' . $collection2) ? _request('debut_rubrique' . $collection2) : $debut; $pagination = chercher_filtre('pagination'); - $pagination = '<p class="pagination">'.$pagination($nb, '_rubrique'.$collection2, $debut, $limite, true, 'prive').'</p>'; - $limite = $debut + $limite; + $pagination = '<p class="pagination">' . $pagination($nb, '_rubrique' . $collection2, $debut, $limite, true, + 'prive') . '</p>'; + $limite = $debut+$limite; } - - $result = sql_select("id_rubrique, id_parent, titre, lang", "spip_rubriques", "id_parent=$collection2",'', '0+titre,titre',"$debut,$limite"); - - while($row=sql_fetch($result)){ - $id_rubrique2=$row['id_rubrique']; - $id_parent2=$row['id_parent']; - $titre2=generer_info_entite($id_rubrique2,'rubrique','titre'); // pour etre sur de passer par tous les traitements - if ('' !== ($rang2 = recuperer_numero($row['titre']))) + + $result = sql_select("id_rubrique, id_parent, titre, lang", "spip_rubriques", "id_parent=$collection2", '', + '0+titre,titre', "$debut,$limite"); + + while ($row = sql_fetch($result)) { + $id_rubrique2 = $row['id_rubrique']; + $id_parent2 = $row['id_parent']; + $titre2 = generer_info_entite($id_rubrique2, 'rubrique', + 'titre'); // pour etre sur de passer par tous les traitements + if ('' !== ($rang2 = recuperer_numero($row['titre']))) { $rang2 = "$rang2. "; + } changer_typo($row['lang']); $lang_dir = lang_dir($row['lang']); - if (autoriser('voir','rubrique',$id_rubrique2)) - $retour.="\n<li class='item' dir='$lang_dir'><a href='" . generer_url_entite($id_rubrique2,'rubrique') . "'>".$rang2.$titre2."</a></li>\n"; + if (autoriser('voir', 'rubrique', $id_rubrique2)) { + $retour .= "\n<li class='item' dir='$lang_dir'><a href='" . generer_url_entite($id_rubrique2, + 'rubrique') . "'>" . $rang2 . $titre2 . "</a></li>\n"; + } } - - $retour = $pagination.$retour.$pagination; - - if (!$retour) return ''; - - return debut_block_depliable($debut > 0 ? true : false,"enfants$collection2") - ."\n<ul class='liste-items sous-sous-rub'>\n" + + $retour = $pagination . $retour . $pagination; + + if (!$retour) { + return ''; + } + + return debut_block_depliable($debut > 0 ? true : false, "enfants$collection2") + . "\n<ul class='liste-items sous-sous-rub'>\n" . $retour - . "</ul>\n".fin_block()."\n\n"; + . "</ul>\n" . fin_block() . "\n\n"; } /** * Affiche la liste des rubriques enfants d'une rubrique * (Utilisé dans les pages du privé notamment ?exec=rubriques) - * + * * Si plus de 500 rubriques enfants, on pagine par 500 les résultats - * + * * @param int $id_rubrique - * L'identifiant numérique de la rubrique parente (0 par défaut, la racine) + * L'identifiant numérique de la rubrique parente (0 par défaut, la racine) * @return string $res - * Le contenu textuel affiché, la liste des sous rubriques + * Le contenu textuel affiché, la liste des sous rubriques */ function afficher_enfant_rub($id_rubrique = 0) { $pagination = ''; $debut = 0; $limite = 500; - $nb = sql_countsel('spip_rubriques',"id_parent=$id_rubrique"); - - if($nb > $limite){ - $debut = _request('debut_rubrique'.$collection2) ? _request('debut_rubrique'.$collection2) : $debut; + $nb = sql_countsel('spip_rubriques', "id_parent=$id_rubrique"); + + if ($nb > $limite) { + $debut = _request('debut_rubrique' . $collection2) ? _request('debut_rubrique' . $collection2) : $debut; $pagination = chercher_filtre('pagination'); - $pagination = '<br class="nettoyeur"><p class="pagination">'.$pagination($nb, '_rubrique'.$collection2, $debut, $limite, true, 'prive').'</p>'; + $pagination = '<br class="nettoyeur"><p class="pagination">' . $pagination($nb, '_rubrique' . $collection2, $debut, + $limite, true, 'prive') . '</p>'; } - $les_enfants = enfant_rub($id_rubrique,$debut,$limite); - - if (!$n = count($les_enfants)) return ""; + $les_enfants = enfant_rub($id_rubrique, $debut, $limite); - if ($n==1) { - $les_enfants=reset($les_enfants); - $les_enfants2=""; + if (!$n = count($les_enfants)) { + return ""; } - else{ + + if ($n == 1) { + $les_enfants = reset($les_enfants); + $les_enfants2 = ""; + } else { $n = ceil($n/2); - $les_enfants2 = implode('',array_slice($les_enfants,$n)); - $les_enfants = implode('',array_slice($les_enfants,0,$n)); + $les_enfants2 = implode('', array_slice($les_enfants, $n)); + $les_enfants = implode('', array_slice($les_enfants, 0, $n)); } - + $res = - $pagination - . "<div class='gauche'>" - . $les_enfants - . "</div>" - . "<div class='droite'>" - . $les_enfants2 - . "</div>" - . $pagination; + $pagination + . "<div class='gauche'>" + . $les_enfants + . "</div>" + . "<div class='droite'>" + . $les_enfants2 + . "</div>" + . $pagination; return $res; } diff --git a/ecrire/inc/puce_statut.php b/ecrire/inc/puce_statut.php index 0e3d325a4f..f3d38aa06c 100644 --- a/ecrire/inc/puce_statut.php +++ b/ecrire/inc/puce_statut.php @@ -15,17 +15,20 @@ * ainsi que des puces de changement rapide de statut. * * @package SPIP\Core\PuceStatut -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} if (!defined('_ACTIVER_PUCE_RAPIDE')) { /** - * Activer le changement rapide de statut sur les listes d'objets ? + * Activer le changement rapide de statut sur les listes d'objets ? * * Peut ralentir un site sur des listes très longues. + * * @var bool - **/ + **/ define('_ACTIVER_PUCE_RAPIDE', true); } @@ -34,7 +37,7 @@ if (!defined('_ACTIVER_PUCE_RAPIDE')) { * * Utilise une fonction spécifique pour un type d'objet si elle existe, tel que * puce_statut_$type_dist(), sinon tente avec puce_statut_changement_rapide(). - * + * * @see puce_statut_changement_rapide() * * @param int $id_objet @@ -53,12 +56,19 @@ if (!defined('_ACTIVER_PUCE_RAPIDE')) { * @return string * Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent) */ -function inc_puce_statut_dist($id_objet, $statut, $id_parent, $type, $ajax = false, $menu_rapide = _ACTIVER_PUCE_RAPIDE) { +function inc_puce_statut_dist( + $id_objet, + $statut, + $id_parent, + $type, + $ajax = false, + $menu_rapide = _ACTIVER_PUCE_RAPIDE +) { static $f_puce_statut = array(); $type = objet_type($type); // cas prioritaire : fonction perso, qui permet aussi de gerer les cas historiques if (!isset($f_puce_statut[$type]) OR is_null($f_puce_statut[$type])) { - $f_puce_statut[$type] = charger_fonction($type,'puce_statut',true); + $f_puce_statut[$type] = charger_fonction($type, 'puce_statut', true); } if ($f_puce_statut[$type]) { return $f_puce_statut[$type]($id_objet, $statut, $id_parent, $type, $ajax, $menu_rapide); @@ -66,13 +76,11 @@ function inc_puce_statut_dist($id_objet, $statut, $id_parent, $type, $ajax = fal // si statut_image trouve quelque chose (et '' est quelque chose) // composer une puce, avec si possible changement rapide - elseif(!is_null($puce=puce_statut_changement_rapide($id_objet,$statut,$id_parent,$type,$ajax,$menu_rapide))){ + elseif (!is_null($puce = puce_statut_changement_rapide($id_objet, $statut, $id_parent, $type, $ajax, $menu_rapide))) { return $puce; - } - - // sinon fausse puce avec le type de l'image + } // sinon fausse puce avec le type de l'image else { - return http_img_pack("$type-16.png",''); + return http_img_pack("$type-16.png", ''); } } @@ -90,7 +98,7 @@ function inc_puce_statut_dist($id_objet, $statut, $id_parent, $type, $ajax = fal * ... * ) * ``` - * + * * Mettre une chaine vide pour ne pas avoir d'image pour un statut particulier. * * Si rien n'est declaré et que le statut est dans un des cas connus habituels @@ -101,21 +109,21 @@ function inc_puce_statut_dist($id_objet, $statut, $id_parent, $type, $ajax = fal * @return string|null * null si pas capable de déterminer l'image */ -function statut_image($objet, $statut){ +function statut_image($objet, $statut) { $src = null; $table = table_objet_sql($objet); $desc = lister_tables_objets_sql($table); - if (isset($desc['statut_images'])){ + if (isset($desc['statut_images'])) { // si une declaration statut_images // mais rien pour le statut demande, ne rien afficher $src = ''; - if (isset($desc['statut_images'][$statut])) + if (isset($desc['statut_images'][$statut])) { $src = $desc['statut_images'][$statut]; - // sinon image par defaut ? - elseif (isset($desc['statut_images'][0])) + } // sinon image par defaut ? + elseif (isset($desc['statut_images'][0])) { $src = $desc['statut_images'][0]; - } - else { + } + } else { switch ($statut) { case 'prepa': $src = 'puce-preparer-8.png'; @@ -135,6 +143,7 @@ function statut_image($objet, $statut){ break; } } + return $src; } @@ -152,7 +161,7 @@ function statut_image($objet, $statut){ * ... * ) * ``` - * + * * Mettre une chaine vide pour ne pas avoir de titre pour un statut particulier. * * Si rien n'est declaré et que le statut est dans un des cas connus habituels @@ -162,20 +171,20 @@ function statut_image($objet, $statut){ * @param string $statut * @return string */ -function statut_titre($objet, $statut){ +function statut_titre($objet, $statut) { $titre = ''; $table = table_objet_sql($objet); $desc = lister_tables_objets_sql($table); - if (isset($desc['statut_titres'])){ + if (isset($desc['statut_titres'])) { // si une declaration statut_titres // mais rien pour le statut demande, ne rien afficher - if (isset($desc['statut_titres'][$statut])) + if (isset($desc['statut_titres'][$statut])) { $titre = $desc['statut_titres'][$statut]; - // sinon image par defaut ? - elseif (isset($desc['statut_titres'][0])) + } // sinon image par defaut ? + elseif (isset($desc['statut_titres'][0])) { $titre = $desc['statut_titres'][0]; - } - else { + } + } else { switch ($statut) { case 'prepa': $titre = 'texte_statut_en_cours_redaction'; @@ -195,7 +204,8 @@ function statut_titre($objet, $statut){ break; } } - return $titre?_T($titre):''; + + return $titre ? _T($titre) : ''; } @@ -214,17 +224,17 @@ function statut_titre($objet, $statut){ * @param string $statut * @return string */ -function statut_texte_instituer($objet, $statut){ +function statut_texte_instituer($objet, $statut) { $texte = ''; $table = table_objet_sql($objet); $desc = lister_tables_objets_sql($table); - if (isset($desc['statut_textes_instituer'])){ + if (isset($desc['statut_textes_instituer'])) { // si une declaration statut_titres // mais rien pour le statut demande, ne rien afficher - if (isset($desc['statut_textes_instituer'][$statut])) + if (isset($desc['statut_textes_instituer'][$statut])) { $texte = $desc['statut_textes_instituer'][$statut]; - } - else { + } + } else { switch ($statut) { case 'prepa': $texte = 'texte_statut_en_cours_redaction'; @@ -244,7 +254,8 @@ function statut_texte_instituer($objet, $statut){ break; } } - return $texte?_T($texte):''; + + return $texte ? _T($texte) : ''; } @@ -264,11 +275,15 @@ function statut_texte_instituer($objet, $statut){ * @return string */ function puce_statut_auteur_dist($id, $statut, $id_parent, $type, $ajax = '', $menu_rapide = _ACTIVER_PUCE_RAPIDE) { - $img = statut_image('auteur',$statut); - if (!$img) return ''; - $alt = statut_titre('auteur',$statut); + $img = statut_image('auteur', $statut); + if (!$img) { + return ''; + } + $alt = statut_titre('auteur', $statut); + + $fond = ''; + $titre = ''; - $fond = ''; $titre = ''; /* if ($type != 'auteur') { $img2 = chemin_image('del-16.png'); @@ -278,11 +293,11 @@ function puce_statut_auteur_dist($id, $statut, $id_parent, $type, $ajax = '', $m else { } */ + return http_img_pack($img, $alt, $fond, $alt); } - function puce_statut_rubrique_dist($id, $statut, $id_rubrique, $type, $ajax = '', $menu_rapide = _ACTIVER_PUCE_RAPIDE) { return http_img_pack('rubrique-16.png', ''); } @@ -306,78 +321,94 @@ function puce_statut_rubrique_dist($id, $statut, $id_rubrique, $type, $ajax = '' * Indique si l'on peut changer le statut, ou si on l'affiche simplement * @return string * Code HTML de l'image de puce de statut à insérer (et du menu de changement si présent) -**/ -function puce_statut_changement_rapide($id, $statut, $id_rubrique, $type = 'article', $ajax = false, $menu_rapide = _ACTIVER_PUCE_RAPIDE) { + **/ +function puce_statut_changement_rapide( + $id, + $statut, + $id_rubrique, + $type = 'article', + $ajax = false, + $menu_rapide = _ACTIVER_PUCE_RAPIDE +) { $src = statut_image($type, $statut); - if (!$src) + if (!$src) { return $src; + } if (!$id - OR !_SPIP_AJAX - OR !$menu_rapide) { - $ajax_node =''; - } - else + OR !_SPIP_AJAX + OR !$menu_rapide + ) { + $ajax_node = ''; + } else { $ajax_node = " class='imgstatut$type$id'"; + } $t = statut_titre($type, $statut); - $inser_puce = http_img_pack($src,$t,$ajax_node,$t); + $inser_puce = http_img_pack($src, $t, $ajax_node, $t); - if (!$ajax_node) + if (!$ajax_node) { return $inser_puce; + } $table = table_objet_sql($type); $desc = lister_tables_objets_sql($table); - if (!isset($desc['statut_textes_instituer'])) + if (!isset($desc['statut_textes_instituer'])) { return $inser_puce; + } if (!function_exists('autoriser')) { include_spip('inc/autoriser'); } // cas ou l'on a un parent connu (devrait disparaitre au profit du second cas plus generique) - if ($id_rubrique){ - if (!autoriser('publierdans', 'rubrique', $id_rubrique)) + if ($id_rubrique) { + if (!autoriser('publierdans', 'rubrique', $id_rubrique)) { return $inser_puce; - } - // si pas d'id_rubrique fourni, tester directement instituer type avec le statut publie + } + } // si pas d'id_rubrique fourni, tester directement instituer type avec le statut publie else { - if (!autoriser('instituer', $type, $id, null, array('statut'=>'publie'))) + if (!autoriser('instituer', $type, $id, null, array('statut' => 'publie'))) { return $inser_puce; + } } $coord = array_flip(array_keys($desc['statut_textes_instituer'])); - if (!isset($coord[$statut])) + if (!isset($coord[$statut])) { return $inser_puce; + } - $unit = 8/*widh de img*/+4/*padding*/; + $unit = 8/*widh de img*/+4/*padding*/ + ; $margin = 4; /* marge a gauche + droite */ - $zero = 1 /*border*/ + $margin/2 + 2 /*padding*/; - $clip = $zero+ ($unit*$coord[$statut]); + $zero = 1 /*border*/+$margin/2+2 /*padding*/ + ; + $clip = $zero+($unit*$coord[$statut]); - if ($ajax){ + if ($ajax) { $width = $unit*count($desc['statut_textes_instituer'])+$margin; $out = "<span class='puce_objet_fixe $type'>" - . $inser_puce - . "</span>" - . "<span class='puce_objet_popup $type statutdecal$type$id' style='width:{$width}px;margin-left:-{$clip}px;'>"; - $i=0; - foreach($desc['statut_textes_instituer'] as $s=>$t){ - $out .= afficher_script_statut($id, $type, -$zero-$i++*$unit, statut_image($type,$s), $s, _T($t)); + . $inser_puce + . "</span>" + . "<span class='puce_objet_popup $type statutdecal$type$id' style='width:{$width}px;margin-left:-{$clip}px;'>"; + $i = 0; + foreach ($desc['statut_textes_instituer'] as $s => $t) { + $out .= afficher_script_statut($id, $type, -$zero-$i++*$unit, statut_image($type, $s), $s, _T($t)); } $out .= "</span>"; + return $out; - } - else { + } else { $nom = "puce_statut_"; - $action = generer_url_ecrire('puce_statut',"",true); + $action = generer_url_ecrire('puce_statut', "", true); $action = "if (!this.puce_loaded) { this.puce_loaded = true; prepare_selec_statut(this, '$nom', '$type', '$id', '$action'); }"; $over = " onmouseover=\"$action\""; $lang_dir = lang_dir(lang_typo()); - return "<span class='puce_objet $type' id='$nom$type$id' dir='$lang_dir'$over>" + + return "<span class='puce_objet $type' id='$nom$type$id' dir='$lang_dir'$over>" . $inser_puce . '</span>'; } @@ -385,19 +416,23 @@ function puce_statut_changement_rapide($id, $statut, $id_rubrique, $type = 'arti function afficher_script_statut($id, $type, $n, $img, $statut, $titre, $act = '') { - $h = generer_action_auteur("instituer_objet","$type-$id-$statut"); + $h = generer_action_auteur("instituer_objet", "$type-$id-$statut"); $h = "selec_statut('$id', '$type', $n, jQuery('img',this).attr('src'), '$h');return false;"; $t = supprimer_tags($titre); - return "<a href=\"#\" onclick=\"$h\" title=\"$t\"$act>".http_img_pack($img,$t)."</a>"; + + return "<a href=\"#\" onclick=\"$h\" title=\"$t\"$act>" . http_img_pack($img, $t) . "</a>"; } // compat // La couleur du statut function puce_statut($statut, $atts = '') { - $src = statut_image('article',$statut); - if (!$src) return ''; - return http_img_pack($src, statut_titre('article',$statut), $atts); + $src = statut_image('article', $statut); + if (!$src) { + return ''; + } + + return http_img_pack($src, statut_titre('article', $statut), $atts); } ?> diff --git a/ecrire/inc/queue.php b/ecrire/inc/queue.php index 92a436dff3..6759c57ef7 100644 --- a/ecrire/inc/queue.php +++ b/ecrire/inc/queue.php @@ -14,18 +14,20 @@ * Gestion des queues de travaux * * @package SPIP\Core\Queue -**/ -if (!defined("_ECRIRE_INC_VERSION")) return; + **/ +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} -define('_JQ_SCHEDULED',1); -define('_JQ_PENDING',0); +define('_JQ_SCHEDULED', 1); +define('_JQ_PENDING', 0); #define('_JQ_MAX_JOBS_EXECUTE',200); // pour personaliser le nombre de jobs traitables a chaque hit #define('_JQ_MAX_JOBS_TIME_TO_EXECUTE',15); // pour personaliser le temps d'excution dispo a chaque hit #define('_JQ_NB_JOBS_OVERFLOW',10000); // nombre de jobs a partir duquel on force le traitement en fin de hit pour purger /** * Ajouter une tâche à la file - * + * * Les tâches sont ensuites exécutées par date programmée croissant/priorité décroissante * * @param $function @@ -39,65 +41,77 @@ define('_JQ_PENDING',0); * @param $no_duplicate * If TRUE, do not add the job to the queue if one with the same function and * arguments already exists. - * If 'function_only' test of existence is only on function name (for cron job) + * If 'function_only' test of existence is only on function name (for cron job) * @param $time - * time for starting the job. If 0, job will start as soon as possible + * time for starting the job. If 0, job will start as soon as possible * @param $priority - * -10 (low priority) to +10 (high priority), 0 is the default + * -10 (low priority) to +10 (high priority), 0 is the default * @return int - * id of job + * id of job */ -function queue_add_job($function, $description, $arguments = array(), $file = '', $no_duplicate = false, $time = 0, $priority = 0){ +function queue_add_job( + $function, + $description, + $arguments = array(), + $file = '', + $no_duplicate = false, + $time = 0, + $priority = 0 +) { include_spip('base/abstract_sql'); // cas pourri de ecrire/action/editer_site avec l'option reload=oui - if (defined('_GENIE_SYNDIC_NOW')) + if (defined('_GENIE_SYNDIC_NOW')) { $arguments['id_syndic'] = _GENIE_SYNDIC_NOW; + } // serialiser les arguments $arguments = serialize($arguments); $md5args = md5($arguments); // si pas de date programee, des que possible - $duplicate_where = 'status='.intval(_JQ_SCHEDULED).' AND '; - if (!$time){ + $duplicate_where = 'status=' . intval(_JQ_SCHEDULED) . ' AND '; + if (!$time) { $time = time(); $duplicate_where = ""; // ne pas dupliquer si deja le meme job en cours d'execution } - $date = date('Y-m-d H:i:s',$time); + $date = date('Y-m-d H:i:s', $time); $set_job = array( - 'fonction'=>$function, - 'descriptif'=>$description, - 'args'=>$arguments, - 'md5args'=>$md5args, - 'inclure'=>$file, - 'priorite'=>max(-10,min(10,intval($priority))), - 'date'=>$date, - 'status'=>_JQ_SCHEDULED, + 'fonction' => $function, + 'descriptif' => $description, + 'args' => $arguments, + 'md5args' => $md5args, + 'inclure' => $file, + 'priorite' => max(-10, min(10, intval($priority))), + 'date' => $date, + 'status' => _JQ_SCHEDULED, ); // si option ne pas dupliquer, regarder si la fonction existe deja // avec les memes args et file if ( - $no_duplicate + $no_duplicate AND - $id_job = sql_getfetsel('id_job','spip_jobs', - $duplicate_where = - $duplicate_where . 'fonction='.sql_quote($function) - .(($no_duplicate==='function_only')?'': - ' AND md5args='.sql_quote($md5args).' AND inclure='.sql_quote($file))) - ) + $id_job = sql_getfetsel('id_job', 'spip_jobs', + $duplicate_where = + $duplicate_where . 'fonction=' . sql_quote($function) + . (($no_duplicate === 'function_only') ? '' : + ' AND md5args=' . sql_quote($md5args) . ' AND inclure=' . sql_quote($file))) + ) { return $id_job; + } - $id_job = sql_insertq('spip_jobs',$set_job); + $id_job = sql_insertq('spip_jobs', $set_job); // en cas de concurrence, deux process peuvent arriver jusqu'ici en parallele // avec le meme job unique a inserer. Dans ce cas, celui qui a eu l'id le plus grand // doit s'effacer if ( - $no_duplicate + $no_duplicate AND - $id_prev = sql_getfetsel('id_job','spip_jobs',"id_job<".intval($id_job)." AND $duplicate_where")){ - sql_delete('spip_jobs','id_job='.intval($id_job)); + $id_prev = sql_getfetsel('id_job', 'spip_jobs', "id_job<" . intval($id_job) . " AND $duplicate_where") + ) { + sql_delete('spip_jobs', 'id_job=' . intval($id_job)); + return $id_prev; } @@ -108,20 +122,21 @@ function queue_add_job($function, $description, $arguments = array(), $file = '' // ie cas d'un char non acceptables sur certains type de champs // qui coupe la valeur if (defined('_JQ_INSERT_CHECK_ARGS') AND $id_job) { - $args = sql_getfetsel('args', 'spip_jobs', 'id_job='.intval($id_job)); - if ($args!==$arguments) { - spip_log('arguments job errones / longueur '.strlen($args)." vs ".strlen($arguments).' / valeur : '.var_export($arguments,true),'queue'); + $args = sql_getfetsel('args', 'spip_jobs', 'id_job=' . intval($id_job)); + if ($args !== $arguments) { + spip_log('arguments job errones / longueur ' . strlen($args) . " vs " . strlen($arguments) . ' / valeur : ' . var_export($arguments, + true), 'queue'); } } - if ($id_job){ + if ($id_job) { queue_update_next_job_time($time); } // si la mise en file d'attente du job echoue, // il ne faut pas perdre l'execution de la fonction // on la lance immediatement, c'est un fallback // sauf en cas d'upgrade necessaire (table spip_jobs inexistante) - elseif($GLOBALS['meta']['version_installee']==$GLOBALS['spip_version_base']) { + elseif ($GLOBALS['meta']['version_installee'] == $GLOBALS['spip_version_base']) { $set_job['id_job'] = 0; queue_start_job($set_job); } @@ -131,39 +146,41 @@ function queue_add_job($function, $description, $arguments = array(), $file = '' /** * Purger la file de tâche et reprogrammer les tâches périodiques - * + * * @return void */ -function queue_purger(){ +function queue_purger() { include_spip('base/abstract_sql'); sql_delete('spip_jobs'); - sql_delete("spip_jobs_liens","id_job NOT IN (".sql_get_select("id_job","spip_jobs").")"); + sql_delete("spip_jobs_liens", "id_job NOT IN (" . sql_get_select("id_job", "spip_jobs") . ")"); include_spip('inc/genie'); genie_queue_watch_dist(); } /** * Retirer une tache de la file d'attente - * + * * @param int $id_job * id de la tache a retirer * @return bool */ -function queue_remove_job($id_job){ +function queue_remove_job($id_job) { include_spip('base/abstract_sql'); - if ($row = sql_fetsel('fonction,inclure,date','spip_jobs','id_job='.intval($id_job)) - AND $res = sql_delete('spip_jobs','id_job='.intval($id_job))){ + if ($row = sql_fetsel('fonction,inclure,date', 'spip_jobs', 'id_job=' . intval($id_job)) + AND $res = sql_delete('spip_jobs', 'id_job=' . intval($id_job)) + ) { queue_unlink_job($id_job); // est-ce une tache cron qu'il faut relancer ? - if ($periode = queue_is_cron_job($row['fonction'],$row['inclure'])){ + if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { // relancer avec les nouveaux arguments de temps include_spip('inc/genie'); // relancer avec la periode prevue - queue_genie_replan_job($row['fonction'],$periode,strtotime($row['date'])); + queue_genie_replan_job($row['fonction'], $periode, strtotime($row['date'])); } queue_update_next_job_time(); } + return $res; } @@ -171,23 +188,23 @@ function queue_remove_job($id_job){ * Associer une tache avec un objet * * @param int $id_job - * id de la tache a lier + * id de la tache a lier * @param array $objets * peut être un simple tableau array('objet'=>'article','id_objet'=>23) * ou un tableau composé de tableaux simples pour lieur plusieurs objets en une fois */ -function queue_link_job($id_job, $objets){ +function queue_link_job($id_job, $objets) { include_spip('base/abstract_sql'); - if (is_array($objets) AND count($objets)){ - if (is_array(reset($objets))){ - foreach($objets as $k=>$o){ + if (is_array($objets) AND count($objets)) { + if (is_array(reset($objets))) { + foreach ($objets as $k => $o) { $objets[$k]['id_job'] = $id_job; } - sql_insertq_multi('spip_jobs_liens',$objets); + sql_insertq_multi('spip_jobs_liens', $objets); + } else { + sql_insertq('spip_jobs_liens', array_merge(array('id_job' => $id_job), $objets)); } - else - sql_insertq('spip_jobs_liens',array_merge(array('id_job'=>$id_job),$objets)); } } @@ -195,72 +212,98 @@ function queue_link_job($id_job, $objets){ * Dissocier une tache d'un objet * * @param int $id_job - * id de la tache à dissocier + * id de la tache à dissocier * @return int/bool - * resultat du sql_delete + * resultat du sql_delete */ -function queue_unlink_job($id_job){ - return sql_delete("spip_jobs_liens","id_job=".intval($id_job)); +function queue_unlink_job($id_job) { + return sql_delete("spip_jobs_liens", "id_job=" . intval($id_job)); } /** * Lancer une tache decrite par sa ligne SQL - * + * * @param array $row - * describe the job, with field of table spip_jobs + * describe the job, with field of table spip_jobs * @return mixed - * return the result of job + * return the result of job */ -function queue_start_job($row){ +function queue_start_job($row) { // deserialiser les arguments $args = unserialize($row['args']); - if ($args===false){ - spip_log('arguments job errones '.var_export($row,true),'queue'); + if ($args === false) { + spip_log('arguments job errones ' . var_export($row, true), 'queue'); $args = array(); } $fonction = $row['fonction']; - if (strlen($inclure = trim($row['inclure']))){ - if (substr($inclure,-1)=='/'){ // c'est un chemin pour charger_fonction - $f = charger_fonction($fonction,rtrim($inclure,'/'),false); - if ($f) + if (strlen($inclure = trim($row['inclure']))) { + if (substr($inclure, -1) == '/') { // c'est un chemin pour charger_fonction + $f = charger_fonction($fonction, rtrim($inclure, '/'), false); + if ($f) { $fonction = $f; - } - else + } + } else { include_spip($inclure); + } } - if (!function_exists($fonction)){ - spip_log("fonction $fonction ($inclure) inexistante ".var_export($row,true),'queue'); + if (!function_exists($fonction)) { + spip_log("fonction $fonction ($inclure) inexistante " . var_export($row, true), 'queue'); + return false; } - spip_log("queue [".$row['id_job']."]: $fonction() start", 'queue'); + spip_log("queue [" . $row['id_job'] . "]: $fonction() start", 'queue'); switch (count($args)) { - case 0: $res = $fonction(); break; - case 1: $res = $fonction($args[0]); break; - case 2: $res = $fonction($args[0],$args[1]); break; - case 3: $res = $fonction($args[0],$args[1], $args[2]); break; - case 4: $res = $fonction($args[0],$args[1], $args[2], $args[3]); break; - case 5: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4]); break; - case 6: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5]); break; - case 7: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); break; - case 8: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]); break; - case 9: $res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8]); break; - case 10:$res = $fonction($args[0],$args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], $args[9]); break; + case 0: + $res = $fonction(); + break; + case 1: + $res = $fonction($args[0]); + break; + case 2: + $res = $fonction($args[0], $args[1]); + break; + case 3: + $res = $fonction($args[0], $args[1], $args[2]); + break; + case 4: + $res = $fonction($args[0], $args[1], $args[2], $args[3]); + break; + case 5: + $res = $fonction($args[0], $args[1], $args[2], $args[3], $args[4]); + break; + case 6: + $res = $fonction($args[0], $args[1], $args[2], $args[3], $args[4], $args[5]); + break; + case 7: + $res = $fonction($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6]); + break; + case 8: + $res = $fonction($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7]); + break; + case 9: + $res = $fonction($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8]); + break; + case 10: + $res = $fonction($args[0], $args[1], $args[2], $args[3], $args[4], $args[5], $args[6], $args[7], $args[8], + $args[9]); + break; default: # plus lent mais completement generique $res = call_user_func_array($fonction, $args); } - spip_log("queue [".$row['id_job']."]: $fonction() end", 'queue'); + spip_log("queue [" . $row['id_job'] . "]: $fonction() end", 'queue'); + return $res; } /** * Exécute les prochaînes tâches cron et replanifie les suivantes - * + * * Prend une par une les tâches en attente et les lance, dans la limite * d'un temps disponible total et d'un nombre maxi de tâches * @@ -273,7 +316,7 @@ function queue_start_job($row){ * @uses queue_start_job() * @uses queue_close_job() * @uses queue_update_next_job_time() - * + * * @param array $force_jobs * list of id_job to execute when provided * @return null|bool @@ -281,36 +324,43 @@ function queue_start_job($row){ * - false : pas de connexion SQL * - true : une planification a été faite. */ -function queue_schedule($force_jobs = null){ +function queue_schedule($force_jobs = null) { $time = time(); if (defined('_DEBUG_BLOCK_QUEUE')) { - spip_log("_DEBUG_BLOCK_QUEUE : schedule stop",'jq'._LOG_DEBUG); + spip_log("_DEBUG_BLOCK_QUEUE : schedule stop", 'jq' . _LOG_DEBUG); + return; } // rien a faire si le prochain job est encore dans le futur - if (queue_sleep_time_to_next_job()>0 AND (!$force_jobs OR !count($force_jobs))){ - spip_log("queue_sleep_time_to_next_job",'jq'._LOG_DEBUG); + if (queue_sleep_time_to_next_job() > 0 AND (!$force_jobs OR !count($force_jobs))) { + spip_log("queue_sleep_time_to_next_job", 'jq' . _LOG_DEBUG); + return; } include_spip('base/abstract_sql'); // on ne peut rien faire si pas de connexion SQL - if (!spip_connect()) return false; + if (!spip_connect()) { + return false; + } - if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')){ + if (!defined('_JQ_MAX_JOBS_TIME_TO_EXECUTE')) { $max_time = ini_get('max_execution_time')/2; // valeur conservatrice si on a pas reussi a lire le max_execution_time - if (!$max_time) $max_time=5; - define('_JQ_MAX_JOBS_TIME_TO_EXECUTE',min($max_time,15)); // une valeur maxi en temps. + if (!$max_time) { + $max_time = 5; + } + define('_JQ_MAX_JOBS_TIME_TO_EXECUTE', min($max_time, 15)); // une valeur maxi en temps. } - $end_time = $time + _JQ_MAX_JOBS_TIME_TO_EXECUTE; + $end_time = $time+_JQ_MAX_JOBS_TIME_TO_EXECUTE; - spip_log("JQ schedule $time / $end_time",'jq'._LOG_DEBUG); + spip_log("JQ schedule $time / $end_time", 'jq' . _LOG_DEBUG); - if (!defined('_JQ_MAX_JOBS_EXECUTE')) - define('_JQ_MAX_JOBS_EXECUTE',200); - $nbj=0; + if (!defined('_JQ_MAX_JOBS_EXECUTE')) { + define('_JQ_MAX_JOBS_EXECUTE', 200); + } + $nbj = 0; // attraper les jobs // dont la date est passee (echus en attente), // par ordre : @@ -318,24 +368,24 @@ function queue_schedule($force_jobs = null){ // - de date // lorsqu'un job cron n'a pas fini, sa priorite est descendue // pour qu'il ne bloque pas les autres jobs en attente - if (is_array($force_jobs) AND count($force_jobs)) - $cond = "status=".intval(_JQ_SCHEDULED)." AND ".sql_in("id_job", $force_jobs); - else { - $now = date('Y-m-d H:i:s',$time); - $cond = "status=".intval(_JQ_SCHEDULED)." AND date<=".sql_quote($now); + if (is_array($force_jobs) AND count($force_jobs)) { + $cond = "status=" . intval(_JQ_SCHEDULED) . " AND " . sql_in("id_job", $force_jobs); + } else { + $now = date('Y-m-d H:i:s', $time); + $cond = "status=" . intval(_JQ_SCHEDULED) . " AND date<=" . sql_quote($now); } register_shutdown_function('queue_error_handler'); // recuperer les erreurs auant que possible - $res = sql_allfetsel('*','spip_jobs',$cond,'','priorite DESC,date','0,'.(_JQ_MAX_JOBS_EXECUTE+1)); + $res = sql_allfetsel('*', 'spip_jobs', $cond, '', 'priorite DESC,date', '0,' . (_JQ_MAX_JOBS_EXECUTE+1)); do { - if ($row = array_shift($res)){ + if ($row = array_shift($res)) { $nbj++; // il faut un verrou, a base de sql_delete - if (sql_delete('spip_jobs',"id_job=".intval($row['id_job'])." AND status=".intval(_JQ_SCHEDULED))){ + if (sql_delete('spip_jobs', "id_job=" . intval($row['id_job']) . " AND status=" . intval(_JQ_SCHEDULED))) { #spip_log("JQ schedule job ".$nbj." OK",'jq'); // on reinsert dans la base aussitot avec un status=_JQ_PENDING $row['status'] = _JQ_PENDING; - $row['date'] = date('Y-m-d H:i:s',$time); + $row['date'] = date('Y-m-d H:i:s', $time); sql_insertq('spip_jobs', $row); // on a la main sur le job : @@ -346,50 +396,51 @@ function queue_schedule($force_jobs = null){ queue_close_job($row, $time, $result); } } - spip_log("JQ schedule job end time ".$time,'jq'._LOG_DEBUG); - } while ($nbj<_JQ_MAX_JOBS_EXECUTE AND $row AND $time<$end_time); - spip_log("JQ schedule end time ".time(),'jq'._LOG_DEBUG); + spip_log("JQ schedule job end time " . $time, 'jq' . _LOG_DEBUG); + } while ($nbj < _JQ_MAX_JOBS_EXECUTE AND $row AND $time < $end_time); + spip_log("JQ schedule end time " . time(), 'jq' . _LOG_DEBUG); - if ($row = array_shift($res)){ + if ($row = array_shift($res)) { queue_update_next_job_time(0); // on sait qu'il y a encore des jobs a lancer ASAP - spip_log("JQ encore !",'jq'._LOG_DEBUG); - } - else + spip_log("JQ encore !", 'jq' . _LOG_DEBUG); + } else { queue_update_next_job_time(); + } return true; } /** * Terminer un job au status _JQ_PENDING - * + * * - le reprogrammer si c'est un cron * - supprimer ses liens * - le detruire en dernier * * @uses queue_is_cron_job() * @uses queue_genie_replan_job() - * + * * @param array $row * @param int $time * @param int $result */ -function queue_close_job(&$row, $time, $result = 0){ +function queue_close_job(&$row, $time, $result = 0) { // est-ce une tache cron qu'il faut relancer ? - if ($periode = queue_is_cron_job($row['fonction'],$row['inclure'])){ + if ($periode = queue_is_cron_job($row['fonction'], $row['inclure'])) { // relancer avec les nouveaux arguments de temps include_spip('inc/genie'); - if ($result<0) - // relancer tout de suite, mais en baissant la priorite - queue_genie_replan_job($row['fonction'],$periode,0-$result,null,$row['priorite']-1); - else - // relancer avec la periode prevue - queue_genie_replan_job($row['fonction'],$periode,$time); + if ($result < 0) // relancer tout de suite, mais en baissant la priorite + { + queue_genie_replan_job($row['fonction'], $periode, 0-$result, null, $row['priorite']-1); + } else // relancer avec la periode prevue + { + queue_genie_replan_job($row['fonction'], $periode, $time); + } } // purger ses liens eventuels avec des objets - sql_delete("spip_jobs_liens","id_job=".intval($row['id_job'])); + sql_delete("spip_jobs_liens", "id_job=" . intval($row['id_job'])); // supprimer le job fini - sql_delete('spip_jobs','id_job='.intval($row['id_job'])); + sql_delete('spip_jobs', 'id_job=' . intval($row['id_job'])); } /** @@ -398,7 +449,7 @@ function queue_close_job(&$row, $time, $result = 0){ * * @uses queue_update_next_job_time() */ -function queue_error_handler(){ +function queue_error_handler() { // se remettre dans le bon dossier, car Apache le change parfois (toujours?) chdir(_ROOT_CWD); @@ -410,7 +461,7 @@ function queue_error_handler(){ * Tester si une tâche était une tâche périodique à reprogrammer * * @uses taches_generales() - * + * * @param string $function * Nom de la fonction de tâche * @param string $inclure @@ -418,9 +469,9 @@ function queue_error_handler(){ * @return bool|int * Périodicité de la tâche en secondes, si tâche périodique, sinon false. */ -function queue_is_cron_job($function, $inclure){ +function queue_is_cron_job($function, $inclure) { static $taches = null; - if (strncmp($inclure, 'genie/', 6) == 0){ + if (strncmp($inclure, 'genie/', 6) == 0) { if (is_null($taches)) { include_spip('inc/genie'); $taches = taches_generales(); @@ -429,6 +480,7 @@ function queue_is_cron_job($function, $inclure){ return $taches[$function]; } } + return false; } @@ -440,15 +492,17 @@ function queue_is_cron_job($function, $inclure){ * ou cas $next_time=0 car l'on sait qu'il faut revenir ASAP) * * @param int $next_time - * temps de la tache ajoutee ou 0 pour ASAP + * temps de la tache ajoutee ou 0 pour ASAP */ -function queue_update_next_job_time($next_time = null){ +function queue_update_next_job_time($next_time = null) { static $nb_jobs_scheduled = null; static $deja_la = false; // prendre le min des $next_time que l'on voit passer ici, en cas de reentrance static $next = null; // queue_close_job peut etre reentrant ici - if ($deja_la) return; + if ($deja_la) { + return; + } $deja_la = true; include_spip('base/abstract_sql'); @@ -456,31 +510,37 @@ function queue_update_next_job_time($next_time = null){ // traiter les jobs morts au combat (_JQ_PENDING depuis plus de 180s) // pour cause de timeout ou autre erreur fatale - $res = sql_allfetsel("*","spip_jobs","status=".intval(_JQ_PENDING)." AND date<".sql_quote(date('Y-m-d H:i:s',$time-180))); + $res = sql_allfetsel("*", "spip_jobs", + "status=" . intval(_JQ_PENDING) . " AND date<" . sql_quote(date('Y-m-d H:i:s', $time-180))); if (is_array($res)) { - foreach ($res as $row) - queue_close_job($row,$time); + foreach ($res as $row) { + queue_close_job($row, $time); + } } // chercher la date du prochain job si pas connu - if (is_null($next) OR is_null(queue_sleep_time_to_next_job())){ - $date = sql_getfetsel('date','spip_jobs',"status=".intval(_JQ_SCHEDULED),'','date','0,1'); + if (is_null($next) OR is_null(queue_sleep_time_to_next_job())) { + $date = sql_getfetsel('date', 'spip_jobs', "status=" . intval(_JQ_SCHEDULED), '', 'date', '0,1'); $next = strtotime($date); } - if (!is_null($next_time)){ - if (is_null($next) OR $next>$next_time) + if (!is_null($next_time)) { + if (is_null($next) OR $next > $next_time) { $next = $next_time; + } } - if ($next){ - if (is_null($nb_jobs_scheduled)) - $nb_jobs_scheduled = sql_countsel('spip_jobs',"status=".intval(_JQ_SCHEDULED)." AND date<".sql_quote(date('Y-m-d H:i:s',$time))); - elseif ($next<=$time) + if ($next) { + if (is_null($nb_jobs_scheduled)) { + $nb_jobs_scheduled = sql_countsel('spip_jobs', + "status=" . intval(_JQ_SCHEDULED) . " AND date<" . sql_quote(date('Y-m-d H:i:s', $time))); + } elseif ($next <= $time) { $nb_jobs_scheduled++; + } // si trop de jobs en attente, on force la purge en fin de hit // pour assurer le coup - if ($nb_jobs_scheduled> (defined('_JQ_NB_JOBS_OVERFLOW')?_JQ_NB_JOBS_OVERFLOW:10000)) - define('_DIRECT_CRON_FORCE',true); + if ($nb_jobs_scheduled > (defined('_JQ_NB_JOBS_OVERFLOW') ? _JQ_NB_JOBS_OVERFLOW : 10000)) { + define('_DIRECT_CRON_FORCE', true); + } } queue_set_next_job_time($next); @@ -490,6 +550,7 @@ function queue_update_next_job_time($next_time = null){ /** * Mettre a jour la date de prochain job + * * @param int $next */ function queue_set_next_job_time($next) { @@ -500,16 +561,15 @@ function queue_set_next_job_time($next) { // toujours relire la valeur pour comparer, pour tenir compte des maj concourrantes // et ne mettre a jour que si il y a un interet a le faire // permet ausis d'initialiser le nom de fichier a coup sur - $curr_next = $_SERVER['REQUEST_TIME'] + max(0,queue_sleep_time_to_next_job(true)); + $curr_next = $_SERVER['REQUEST_TIME']+max(0, queue_sleep_time_to_next_job(true)); if ( - ($curr_next<=$time AND $next>$time) // le prochain job est dans le futur mais pas la date planifiee actuelle - OR $curr_next>$next // le prochain job est plus tot que la date planifiee actuelle - ) { + ($curr_next <= $time AND $next > $time) // le prochain job est dans le futur mais pas la date planifiee actuelle + OR $curr_next > $next // le prochain job est plus tot que la date planifiee actuelle + ) { if (function_exists("cache_set") AND defined('_MEMOIZE_MEMORY') AND _MEMOIZE_MEMORY) { - cache_set(_JQ_NEXT_JOB_TIME_FILENAME,intval($next)); - } - else { - ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME,intval($next)); + cache_set(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); + } else { + ecrire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, intval($next)); } queue_sleep_time_to_next_job($next); } @@ -519,27 +579,28 @@ function queue_set_next_job_time($next) { /** * Déclenche le cron en asynchrone ou retourne le code HTML pour le déclencher - * + * * Retourne le HTML à ajouter à la page pour declencher le cron * ou rien si on a réussi à le lancer en asynchrone. * * Un verrou (cron.lock) empêche l'exécution du cron plus d'une fois par seconde. - * + * * @uses queue_sleep_time_to_next_job() - * @see action_cron() L'URL appelée pour déclencher le cron - * + * @see action_cron() L'URL appelée pour déclencher le cron + * * @return string */ -function queue_affichage_cron(){ +function queue_affichage_cron() { $texte = ""; $time_to_next = queue_sleep_time_to_next_job(); // rien a faire si le prochain job est encore dans le futur - if ($time_to_next>0 OR defined('_DEBUG_BLOCK_QUEUE')) + if ($time_to_next > 0 OR defined('_DEBUG_BLOCK_QUEUE')) { return $texte; + } // ne pas relancer si on vient de lancer dans la meme seconde par un hit concurent - if (file_exists($lock = _DIR_TMP . "cron.lock") AND !(@filemtime($lock)<$_SERVER['REQUEST_TIME'])) { + if (file_exists($lock = _DIR_TMP . "cron.lock") AND !(@filemtime($lock) < $_SERVER['REQUEST_TIME'])) { return $texte; } @@ -549,20 +610,21 @@ function queue_affichage_cron(){ // si depuis plus de 5min, on essaye de lancer le cron par tous les moyens pour rattraper le coup // on est sans doute sur un site qui n'autorise pas http sortant ou avec peu de trafic $urgent = false; - if ($time_to_next<-300) + if ($time_to_next < -300) { $urgent = true; + } - $url_cron = generer_url_action('cron','',false,true); + $url_cron = generer_url_action('cron', '', false, true); - if (!defined('_HTML_BG_CRON_FORCE') OR !_HTML_BG_CRON_FORCE){ + if (!defined('_HTML_BG_CRON_FORCE') OR !_HTML_BG_CRON_FORCE) { // methode la plus rapide : // Si fsockopen est possible, on lance le cron via un socket en asynchrone // si fsockopen echoue (disponibilite serveur, firewall) on essaye pas cURL // car on a toutes les chances d'echouer pareil mais sans moyen de le savoir // on passe direct a la methode background-image - if(function_exists('fsockopen')){ - $parts=parse_url($url_cron); + if (function_exists('fsockopen')) { + $parts = parse_url($url_cron); switch ($parts['scheme']) { case 'https': @@ -574,35 +636,36 @@ function queue_affichage_cron(){ $scheme = ''; $port = 80; } - $fp = @fsockopen($scheme.$parts['host'], - isset($parts['port'])?$parts['port']:$port, + $fp = @fsockopen($scheme . $parts['host'], + isset($parts['port']) ? $parts['port'] : $port, $errno, $errstr, 1); if ($fp) { $timeout = 200; // ms - stream_set_timeout($fp,0,$timeout * 1000); - $query = $parts['path'].($parts['query']?"?".$parts['query']:""); - $out = "GET ".$query." HTTP/1.1\r\n"; - $out.= "Host: ".$parts['host']."\r\n"; - $out.= "Connection: Close\r\n\r\n"; + stream_set_timeout($fp, 0, $timeout*1000); + $query = $parts['path'] . ($parts['query'] ? "?" . $parts['query'] : ""); + $out = "GET " . $query . " HTTP/1.1\r\n"; + $out .= "Host: " . $parts['host'] . "\r\n"; + $out .= "Connection: Close\r\n\r\n"; fwrite($fp, $out); spip_timer('read'); $t = 0; // on lit la reponse si possible pour fermer proprement la connexion // avec un timeout total de 200ms pour ne pas se bloquer - while (!feof($fp) AND $t<$timeout) { + while (!feof($fp) AND $t < $timeout) { @fgets($fp, 1024); - $t += spip_timer('read',true); + $t += spip_timer('read', true); spip_timer('read'); } fclose($fp); - if (!$urgent) + if (!$urgent) { return $texte; + } } } // si fsockopen n'est pas dispo on essaye cURL : // lancer le cron par un cURL asynchrone si cURL est present - elseif (function_exists("curl_init")){ + elseif (function_exists("curl_init")) { //setting the curl parameters. $ch = curl_init($url_cron); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); @@ -614,20 +677,23 @@ function queue_affichage_cron(){ curl_exec($ch); // fermer curl_close($ch); - if (!$urgent) + if (!$urgent) { return $texte; + } } } // si deja force, on retourne sans rien - if (defined('_DIRECT_CRON_FORCE')) + if (defined('_DIRECT_CRON_FORCE')) { return $texte; + } // si c'est un bot // inutile de faire un appel par image background, // on force un appel direct en fin de hit - if ((defined('_IS_BOT') AND _IS_BOT)){ - define('_DIRECT_CRON_FORCE',true); + if ((defined('_IS_BOT') AND _IS_BOT)) { + define('_DIRECT_CRON_FORCE', true); + return $texte; } @@ -638,4 +704,5 @@ function queue_affichage_cron(){ return $texte; } + ?> diff --git a/ecrire/inc/recherche_to_array.php b/ecrire/inc/recherche_to_array.php index b0ee402eb8..3633dc2519 100644 --- a/ecrire/inc/recherche_to_array.php +++ b/ecrire/inc/recherche_to_array.php @@ -11,7 +11,9 @@ \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // methodes sql @@ -20,11 +22,11 @@ function inc_recherche_to_array_dist($recherche, $options = array()) { // options par defaut $options = array_merge( array( - 'score' => true, - 'champs' => false, - 'toutvoir' => false, - 'matches' => false, - 'jointures' => false + 'score' => true, + 'champs' => false, + 'toutvoir' => false, + 'matches' => false, + 'jointures' => false ), $options ); @@ -33,19 +35,19 @@ function inc_recherche_to_array_dist($recherche, $options = array()) { include_spip('inc/autoriser'); $requete = array( - "SELECT"=>array(), - "FROM"=>array(), - "WHERE"=>array(), - "GROUPBY"=>array(), - "ORDERBY"=>array(), - "LIMIT"=>"", - "HAVING"=>array() + "SELECT" => array(), + "FROM" => array(), + "WHERE" => array(), + "GROUPBY" => array(), + "ORDERBY" => array(), + "LIMIT" => "", + "HAVING" => array() ); $table = sinon($options['table'], 'article'); - if ($options['champs']) + if ($options['champs']) { $champs = $options['champs']; - else { + } else { $l = liste_des_champs(); $champs = $l['article']; } @@ -61,42 +63,46 @@ function inc_recherche_to_array_dist($recherche, $options = array()) { // c'est un pis-aller : ca a peu de chance de marcher, mais mieux quand meme que en conservant la ',' // (aka ca marche au moins dans certains cas comme avec spip_formulaires_reponses_champs) - if (strpos($_id_table,",")!==false){ - $_id_table = explode(',',$_id_table); + if (strpos($_id_table, ",") !== false) { + $_id_table = explode(',', $_id_table); $_id_table = reset($_id_table); } - $requete['SELECT'][] = "t.".$_id_table; + $requete['SELECT'][] = "t." . $_id_table; $a = array(); // Recherche fulltext foreach ($champs as $champ => $poids) { - if (is_array($champ)){ + if (is_array($champ)) { spip_log("requetes imbriquees interdites"); } else { - if (strpos($champ,".")===FALSE) + if (strpos($champ, ".") === false) { $champ = "t.$champ"; + } $requete['SELECT'][] = $champ; - $a[] = $champ.' '.$methode.' '.$q; + $a[] = $champ . ' ' . $methode . ' ' . $q; } } - if ($a) $requete['WHERE'][] = join(" OR ", $a); - $requete['FROM'][] = table_objet_sql($table).' AS t'; + if ($a) { + $requete['WHERE'][] = join(" OR ", $a); + } + $requete['FROM'][] = table_objet_sql($table) . ' AS t'; $results = array(); $s = sql_select( $requete['SELECT'], $requete['FROM'], $requete['WHERE'], - implode(" ",$requete['GROUPBY']), + implode(" ", $requete['GROUPBY']), $requete['ORDERBY'], $requete['LIMIT'], $requete['HAVING'], $serveur ); - while ($t = sql_fetch($s,$serveur) - AND (!isset($t['score']) OR $t['score']>0)) { + while ($t = sql_fetch($s, $serveur) + AND (!isset($t['score']) OR $t['score'] > 0)) { $id = intval($t[$_id_table]); if ($options['toutvoir'] - OR autoriser('voir', $table, $id)) { + OR autoriser('voir', $table, $id) + ) { // indiquer les champs concernes $champs_vus = array(); $score = 0; @@ -104,41 +110,50 @@ function inc_recherche_to_array_dist($recherche, $options = array()) { $vu = false; foreach ($champs as $champ => $poids) { - $champ = explode('.',$champ); + $champ = explode('.', $champ); $champ = end($champ); // translitteration_rapide uniquement si on est deja en utf-8 - $value = ($GLOBALS['meta']['charset']=='utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ])); + $value = ($GLOBALS['meta']['charset'] == 'utf-8' ? translitteration_rapide($t[$champ]) : translitteration($t[$champ])); if ($n = ($options['score'] || $options['matches']) - ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER) - : preg_match($preg, $value) + ? preg_match_all($preg, $value, $regs, PREG_SET_ORDER) + : preg_match($preg, $value) ) { $vu = true; - if ($options['champs']) + if ($options['champs']) { $champs_vus[$champ] = $t[$champ]; - if ($options['score']) - $score += $n * $poids; - if ($options['matches']) + } + if ($options['score']) { + $score += $n*$poids; + } + if ($options['matches']) { $matches[$champ] = $regs; + } if (!$options['champs'] - AND !$options['score'] - AND !$options['matches']) + AND !$options['score'] + AND !$options['matches'] + ) { break; + } } } if ($vu) { - if (!isset($results)) + if (!isset($results)) { $results = array(); + } $results[$id] = array(); - if ($champs_vus) + if ($champs_vus) { $results[$id]['champs'] = $champs_vus; - if ($score) + } + if ($score) { $results[$id]['score'] = $score; - if ($matches) + } + if ($matches) { $results[$id]['matches'] = $matches; + } } } } @@ -148,63 +163,68 @@ function inc_recherche_to_array_dist($recherche, $options = array()) { // ici on est un peu naze : pas capables de reconstruire une jointure complexe // on ne sait passer que par table de laison en 1 coup if (isset($jointures[$table]) - AND $joints = recherche_en_base( + AND $joints = recherche_en_base( $recherche, $jointures[$table], array_merge($options, array('jointures' => false)) ) ) { include_spip('action/editer_liens'); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $cle_depart = id_table_objet($table); - $table_depart = table_objet($table,$serveur); - $desc_depart = $trouver_table($table_depart,$serveur); + $table_depart = table_objet($table, $serveur); + $desc_depart = $trouver_table($table_depart, $serveur); $depart_associable = objet_associable($table); foreach ($joints as $table_liee => $ids_trouves) { // on peut definir une fonction de recherche jointe pour regler les cas particuliers if ( - !( - $rechercher_joints = charger_fonction("rechercher_joints_${table}_${table_liee}","inc",true) - or $rechercher_joints = charger_fonction("rechercher_joints_objet_${table_liee}","inc",true) - or $rechercher_joints = charger_fonction("rechercher_joints_${table}_objet_lie","inc",true) - ) - ){ - $cle_arrivee = id_table_objet($table_liee); - $table_arrivee = table_objet($table_liee,$serveur); - $desc_arrivee = $trouver_table($table_arrivee,$serveur); + !( + $rechercher_joints = charger_fonction("rechercher_joints_${table}_${table_liee}", "inc", true) + or $rechercher_joints = charger_fonction("rechercher_joints_objet_${table_liee}", "inc", true) + or $rechercher_joints = charger_fonction("rechercher_joints_${table}_objet_lie", "inc", true) + ) + ) { + $cle_arrivee = id_table_objet($table_liee); + $table_arrivee = table_objet($table_liee, $serveur); + $desc_arrivee = $trouver_table($table_arrivee, $serveur); // cas simple : $cle_depart dans la table_liee - if (isset($desc_arrivee['field'][$cle_depart])){ - $s = sql_select("$cle_depart, $cle_arrivee", $desc_arrivee['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur); - } - // cas simple : $cle_arrivee dans la table - elseif (isset($desc_depart['field'][$cle_arrivee])){ - $s = sql_select("$cle_depart, $cle_arrivee", $desc_depart['table_sql'], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur); + if (isset($desc_arrivee['field'][$cle_depart])) { + $s = sql_select("$cle_depart, $cle_arrivee", $desc_arrivee['table_sql'], + sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); + } // cas simple : $cle_arrivee dans la table + elseif (isset($desc_depart['field'][$cle_arrivee])) { + $s = sql_select("$cle_depart, $cle_arrivee", $desc_depart['table_sql'], + sql_in($cle_arrivee, array_keys($ids_trouves)), '', '', '', '', $serveur); } // sinon cherchons une table de liaison // cas recherche principale article, objet lie document : passer par spip_documents_liens - elseif ($l = objet_associable($table_liee)){ + elseif ($l = objet_associable($table_liee)) { list($primary, $table_liens) = $l; - $s = sql_select("id_objet as $cle_depart, $primary as $cle_arrivee", $table_liens, array("objet='$table'",sql_in($primary, array_keys($ids_trouves))), '','','','',$serveur); - } - // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens - elseif ($l = $depart_associable){ + $s = sql_select("id_objet as $cle_depart, $primary as $cle_arrivee", $table_liens, + array("objet='$table'", sql_in($primary, array_keys($ids_trouves))), '', '', '', '', $serveur); + } // cas recherche principale auteur, objet lie article: passer par spip_auteurs_liens + elseif ($l = $depart_associable) { list($primary, $table_liens) = $l; - $s = sql_select("$primary as $cle_depart, id_objet as $cle_arrivee", $table_liens, array("objet='$table_liee'",sql_in('id_objet', array_keys($ids_trouves))), '','','','',$serveur); - } - // cas table de liaison generique spip_xxx_yyy - elseif($t=$trouver_table($table_arrivee."_".$table_depart,$serveur) - OR $t=$trouver_table($table_depart."_".$table_arrivee,$serveur)){ - $s = sql_select("$cle_depart,$cle_arrivee", $t["table_sql"], sql_in($cle_arrivee, array_keys($ids_trouves)), '','','','',$serveur); + $s = sql_select("$primary as $cle_depart, id_objet as $cle_arrivee", $table_liens, + array("objet='$table_liee'", sql_in('id_objet', array_keys($ids_trouves))), '', '', '', '', $serveur); + } // cas table de liaison generique spip_xxx_yyy + elseif ($t = $trouver_table($table_arrivee . "_" . $table_depart, $serveur) + OR $t = $trouver_table($table_depart . "_" . $table_arrivee, $serveur) + ) { + $s = sql_select("$cle_depart,$cle_arrivee", $t["table_sql"], sql_in($cle_arrivee, array_keys($ids_trouves)), + '', '', '', '', $serveur); } + } else { + list($cle_depart, $cle_arrivee, $s) = $rechercher_joints($table, $table_liee, array_keys($ids_trouves), + $serveur); } - else - list($cle_depart,$cle_arrivee,$s) = $rechercher_joints($table,$table_liee,array_keys($ids_trouves), $serveur); - while ($t = is_array($s)?array_shift($s):sql_fetch($s)) { + while ($t = is_array($s) ? array_shift($s) : sql_fetch($s)) { $id = $t[$cle_depart]; $joint = $ids_trouves[$t[$cle_arrivee]]; - if (!isset($results)) + if (!isset($results)) { $results = array(); + } if (!isset($results[$id])) { $results[$id] = array(); } @@ -215,13 +235,13 @@ function inc_recherche_to_array_dist($recherche, $options = array()) { $results[$id]['score'] += $joint['score']; } if (isset($joint['champs']) and $joint['champs']) { - foreach($joint['champs'] as $c => $val) { - $results[$id]['champs'][$table_liee.'.'.$c] = $val; + foreach ($joint['champs'] as $c => $val) { + $results[$id]['champs'][$table_liee . '.' . $c] = $val; } } if (isset($joint['matches']) and $joint['matches']) { - foreach($joint['matches'] as $c => $val) { - $results[$id]['matches'][$table_liee.'.'.$c] = $val; + foreach ($joint['matches'] as $c => $val) { + $results[$id]['matches'][$table_liee . '.' . $c] = $val; } } } diff --git a/ecrire/inc/rechercher.php b/ecrire/inc/rechercher.php index da6e1fcc5d..021266d392 100644 --- a/ecrire/inc/rechercher.php +++ b/ecrire/inc/rechercher.php @@ -14,29 +14,32 @@ * Gestion des recherches * * @package SPIP\Core\Recherche -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Donne la liste des champs/tables ou l'on sait chercher/remplacer // avec un poids pour le score // http://code.spip.net/@liste_des_champs function liste_des_champs() { - static $liste=null; + static $liste = null; if (is_null($liste)) { $liste = array(); // recuperer les tables_objets_sql declarees include_spip('base/objets'); $tables_objets = lister_tables_objets_sql(); - foreach($tables_objets as $t=>$infos){ - if ($infos['rechercher_champs']){ + foreach ($tables_objets as $t => $infos) { + if ($infos['rechercher_champs']) { $liste[$infos['type']] = $infos['rechercher_champs']; } } // puis passer dans le pipeline $liste = pipeline('rechercher_liste_des_champs', $liste); } + return $liste; } @@ -45,20 +48,21 @@ function liste_des_champs() { // en ne regardant que le titre ou le nom // http://code.spip.net/@liste_des_jointures function liste_des_jointures() { - static $liste=null; + static $liste = null; if (is_null($liste)) { $liste = array(); // recuperer les tables_objets_sql declarees include_spip('base/objets'); $tables_objets = lister_tables_objets_sql(); - foreach($tables_objets as $t=>$infos){ - if ($infos['rechercher_jointures']){ + foreach ($tables_objets as $t => $infos) { + if ($infos['rechercher_jointures']) { $liste[$infos['type']] = $infos['rechercher_jointures']; } } // puis passer dans le pipeline $liste = pipeline('rechercher_liste_des_jointures', $liste); } + return $liste; } @@ -67,23 +71,24 @@ function expression_recherche($recherche, $options) { // (meme si utilisee dans plusieurs boucles) static $expression = array(); $key = serialize(array($recherche, $options['preg_flags'])); - if (isset($expression[$key])) + if (isset($expression[$key])) { return $expression[$key]; + } $u = $GLOBALS['meta']['pcre_u']; - if ($u AND strpos($options['preg_flags'],$u)===false) + if ($u AND strpos($options['preg_flags'], $u) === false) { $options['preg_flags'] .= $u; + } include_spip('inc/charsets'); $recherche = trim($recherche); $is_preg = false; - if (substr($recherche,0,1)=='/' AND substr($recherche,-1,1)=='/'){ + if (substr($recherche, 0, 1) == '/' AND substr($recherche, -1, 1) == '/') { // c'est une preg $recherche_trans = translitteration($recherche); - $preg = $recherche_trans.$options['preg_flags']; + $preg = $recherche_trans . $options['preg_flags']; $is_preg = true; - } - else{ + } else { // s'il y a plusieurs mots il faut les chercher tous : oblige REGEXP, // sauf ceux de moins de 4 lettres (on supprime ainsi 'le', 'les', 'un', // 'une', 'des' ...) @@ -93,15 +98,15 @@ function expression_recherche($recherche, $options) { // les expressions entre " " sont un mot a chercher tel quel // -> on remplace les espaces par un \x1 et on enleve les guillemets - if (preg_match(',["][^"]+["],Uims',$recherche_mod,$matches)){ - foreach ($matches as $match){ - $word = preg_replace(",\s+,Uims","\x1",$match); - $word = trim($word,'"'); - $recherche_mod = str_replace($match,$word,$recherche_mod); + if (preg_match(',["][^"]+["],Uims', $recherche_mod, $matches)) { + foreach ($matches as $match) { + $word = preg_replace(",\s+,Uims", "\x1", $match); + $word = trim($word, '"'); + $recherche_mod = str_replace($match, $word, $recherche_mod); } } - if (preg_match(",\s+,".$u, $recherche_mod)){ + if (preg_match(",\s+," . $u, $recherche_mod)) { $is_preg = true; $recherche_inter = '|'; @@ -110,29 +115,30 @@ function expression_recherche($recherche, $options) { foreach ($recherche_mots as $mot) { if (strlen($mot) >= $min_long) { // echapper les caracteres de regexp qui sont eventuellement dans la recherche - $recherche_inter .= preg_quote($mot).' '; + $recherche_inter .= preg_quote($mot) . ' '; } } - $recherche_inter = str_replace("\x1",'\s', $recherche_inter); + $recherche_inter = str_replace("\x1", '\s', $recherche_inter); // mais on cherche quand même l'expression complète, même si elle // comporte des mots de moins de quatre lettres - $recherche = rtrim(preg_quote($recherche).preg_replace(',\s+,'.$u, '|', $recherche_inter), '|'); + $recherche = rtrim(preg_quote($recherche) . preg_replace(',\s+,' . $u, '|', $recherche_inter), '|'); $recherche_trans = translitteration($recherche); } - $preg = '/'.str_replace('/', '\\/', $recherche_trans).'/' . $options['preg_flags']; + $preg = '/' . str_replace('/', '\\/', $recherche_trans) . '/' . $options['preg_flags']; } // Si la chaine est inactive, on va utiliser LIKE pour aller plus vite // ou si l'expression reguliere est invalide if (!$is_preg - OR (@preg_match($preg,'')===FALSE) ) { + OR (@preg_match($preg, '') === false) + ) { $methode = 'LIKE'; $u = $GLOBALS['meta']['pcre_u']; // echapper les % et _ - $q = str_replace(array('%','_'), array('\%', '\_'), trim($recherche)); + $q = str_replace(array('%', '_'), array('\%', '\_'), trim($recherche)); // eviter les parentheses et autres caractères qui interferent avec pcre par la suite (dans le preg_match_all) s'il y a des reponses $recherche = preg_quote($recherche); @@ -142,28 +148,28 @@ function expression_recherche($recherche, $options) { // les expressions entre " " sont un mot a chercher tel quel // -> on remplace les espaces par un _ et on enleve les guillemets // corriger le like dans le $q - if (preg_match(',["][^"]+["],Uims',$q,$matches)){ - foreach ($matches as $match){ + if (preg_match(',["][^"]+["],Uims', $q, $matches)) { + foreach ($matches as $match) { $word = preg_replace(",\s+,Uims", "_", $match); $word = trim($word, '"'); $q = str_replace($match, $word, $q); } } // corriger la regexp - if (preg_match(',["][^"]+["],Uims',$recherche_mod,$matches)){ - foreach ($matches as $match){ - $word = preg_replace(",\s+,Uims","[\s]",$match); - $word = trim($word,'"'); - $recherche_mod = str_replace($match,$word,$recherche_mod); + if (preg_match(',["][^"]+["],Uims', $recherche_mod, $matches)) { + foreach ($matches as $match) { + $word = preg_replace(",\s+,Uims", "[\s]", $match); + $word = trim($word, '"'); + $recherche_mod = str_replace($match, $word, $recherche_mod); } } $q = sql_quote( "%" - . preg_replace(",\s+,".$u, "%", $q) + . preg_replace(",\s+," . $u, "%", $q) . "%" ); - $preg = '/'.preg_replace(",\s+,".$u, ".+", trim($recherche_mod)).'/' . $options['preg_flags']; + $preg = '/' . preg_replace(",\s+," . $u, ".+", trim($recherche_mod)) . '/' . $options['preg_flags']; } else { $methode = 'REGEXP'; @@ -173,12 +179,13 @@ function expression_recherche($recherche, $options) { // tous les caracteres transliterables de $q sont remplaces par un joker // permet de matcher en SQL meme si on est sensible aux accents (SQLite) $q_t = $q; - for($i = 0;$i<spip_strlen($q);$i++){ - $char = spip_substr($q,$i,1); + for ($i = 0; $i < spip_strlen($q); $i++) { + $char = spip_substr($q, $i, 1); if (!is_ascii($char) - AND $char_t = translitteration($char) - AND $char_t !== $char){ - $q_t = str_replace($char,$is_preg?".":"_", $q_t); + AND $char_t = translitteration($char) + AND $char_t !== $char + ) { + $q_t = str_replace($char, $is_preg ? "." : "_", $q_t); } } @@ -187,12 +194,14 @@ function expression_recherche($recherche, $options) { // fix : SQLite 3 est sensible aux accents, on jokerise les caracteres // les plus frequents qui peuvent etre accentues // (oui c'est tres dicustable...) - if (isset($GLOBALS['connexions'][$options['serveur']?$options['serveur']:0]['type']) - AND strncmp($GLOBALS['connexions'][$options['serveur']?$options['serveur']:0]['type'],'sqlite',6)==0){ - $q_t = strtr($q,"aeuioc",$is_preg?"......":"______"); + if (isset($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type']) + AND strncmp($GLOBALS['connexions'][$options['serveur'] ? $options['serveur'] : 0]['type'], 'sqlite', 6) == 0 + ) { + $q_t = strtr($q, "aeuioc", $is_preg ? "......" : "______"); // si il reste au moins un char significatif... - if (preg_match(",[^'%_.],",$q_t)) + if (preg_match(",[^'%_.],", $q_t)) { $q = $q_t; + } } return $expression[$key] = array($methode, $q, $preg); @@ -207,26 +216,31 @@ function expression_recherche($recherche, $options) { // - score pour retourner un score // On peut passer les tables, ou une chaine listant les tables souhaitees // http://code.spip.net/@recherche_en_base -function recherche_en_base($recherche = '', $tables = NULL, $options = array(), $serveur = '') { +function recherche_en_base($recherche = '', $tables = null, $options = array(), $serveur = '') { include_spip('base/abstract_sql'); if (!is_array($tables)) { $liste = liste_des_champs(); if (is_string($tables) - AND $tables != '') { + AND $tables != '' + ) { $toutes = array(); - foreach(explode(',', $tables) as $t) - if (isset($liste[$t])) + foreach (explode(',', $tables) as $t) { + if (isset($liste[$t])) { $toutes[$t] = $liste[$t]; + } + } $tables = $toutes; unset($toutes); - } else + } else { $tables = $liste; + } } - if (!strlen($recherche) OR !count($tables)) + if (!strlen($recherche) OR !count($tables)) { return array(); + } include_spip('inc/autoriser'); @@ -239,7 +253,7 @@ function recherche_en_base($recherche = '', $tables = NULL, $options = array(), 'matches' => false, 'jointures' => false, 'serveur' => $serveur - ), + ), $options ); @@ -254,8 +268,9 @@ function recherche_en_base($recherche = '', $tables = NULL, $options = array(), foreach ($tables as $table => $champs) { # lock via memoization, si dispo - if (function_exists('cache_lock')) - cache_lock($lock = 'recherche '.$table.' '.$recherche); + if (function_exists('cache_lock')) { + cache_lock($lock = 'recherche ' . $table . ' ' . $recherche); + } spip_timer('rech'); @@ -268,10 +283,12 @@ function recherche_en_base($recherche = '', $tables = NULL, $options = array(), ##var_dump($results[$table]); - spip_log("recherche $table ($recherche) : ".count($results[$table])." resultats ".spip_timer('rech'),'recherche'); + spip_log("recherche $table ($recherche) : " . count($results[$table]) . " resultats " . spip_timer('rech'), + 'recherche'); - if (isset($lock)) + if (isset($lock)) { cache_unlock($lock); + } } return $results; @@ -280,44 +297,50 @@ function recherche_en_base($recherche = '', $tables = NULL, $options = array(), // Effectue une recherche sur toutes les tables de la base de donnees // http://code.spip.net/@remplace_en_base -function remplace_en_base($recherche = '', $remplace = NULL, $tables = NULL, $options = array()) { +function remplace_en_base($recherche = '', $remplace = null, $tables = null, $options = array()) { include_spip('inc/modifier'); // options par defaut $options = array_merge(array( 'preg_flags' => 'UimsS', 'toutmodifier' => false - ), + ), $options ); $options['champs'] = true; - if (!is_array($tables)) + if (!is_array($tables)) { $tables = liste_des_champs(); + } $results = recherche_en_base($recherche, $tables, $options); - $preg = '/'.str_replace('/', '\\/', $recherche).'/' . $options['preg_flags']; + $preg = '/' . str_replace('/', '\\/', $recherche) . '/' . $options['preg_flags']; foreach ($results as $table => $r) { $_id_table = id_table_objet($table); foreach ($r as $id => $x) { if ($options['toutmodifier'] - OR autoriser('modifier', $table, $id)) { + OR autoriser('modifier', $table, $id) + ) { $modifs = array(); foreach ($x['champs'] as $key => $val) { - if ($key == $_id_table) next; + if ($key == $_id_table) { + next; + } $repl = preg_replace($preg, $remplace, $val); - if ($repl <> $val) + if ($repl <> $val) { $modifs[$key] = $repl; + } } - if ($modifs) + if ($modifs) { objet_modifier_champs($table, $id, array( 'champs' => array_keys($modifs), ), $modifs); + } } } } diff --git a/ecrire/inc/roles.php b/ecrire/inc/roles.php index afbb34dac5..456ce8f1f5 100644 --- a/ecrire/inc/roles.php +++ b/ecrire/inc/roles.php @@ -24,18 +24,19 @@ * des rôles différents. Chaque ligne de la table lien correspond alors à * un des rôles. * - * @package SPIP\Core\Roles + * @package SPIP\Core\Roles */ -if (!defined('_ECRIRE_INC_VERSION')) return; - +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** - * Vérifie qu'un objet dispose de rôles fonctionnels + * Vérifie qu'un objet dispose de rôles fonctionnels * * Retourne une description des rôles si c'est le cas - * + * * @param string $objet * Objet source qui possède la table de liaison * @param string $objet_destination @@ -45,7 +46,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return bool|array * false si rôles indisponibles on non déclarés * array : description des roles applicables dans 3 index : colonne, titres, roles -**/ + **/ function roles_presents($objet, $objet_destination = '') { $desc = lister_tables_objets_sql(table_objet_sql($objet)); @@ -63,7 +64,7 @@ function roles_presents($objet, $objet_destination = '') { // on cherche ensuite si la colonne existe bien dans la table de liaison (par défaut 'role') $colonne = isset($desc['roles_colonne']) ? $desc['roles_colonne'] : 'role'; $trouver_table = charger_fonction('trouver_table', 'base'); - list(,$table_lien) = $lien; + list(, $table_lien) = $lien; $desc_lien = $trouver_table($table_lien); if (!isset($desc_lien['field'][$colonne])) { return false; @@ -81,11 +82,10 @@ function roles_presents($objet, $objet_destination = '') { // pour l'objet if (isset($application[$objet_destination])) { $application = $application[$objet_destination]; - // sinon pour tous les objets + // sinon pour tous les objets } elseif (isset($application['*'])) { $application = $application['*']; - } - // sinon tant pis + } // sinon tant pis else { return false; } @@ -93,8 +93,8 @@ function roles_presents($objet, $objet_destination = '') { // tout est ok return array( - 'titres' => $titres, - 'roles' => $application, + 'titres' => $titres, + 'roles' => $application, 'colonne' => $colonne ); } @@ -108,11 +108,12 @@ function roles_presents($objet, $objet_destination = '') { * Objet sur quoi on veut lier * @return string * Nom de la colonne, sinon vide -**/ + **/ function roles_colonne($objet, $objet_destination) { if ($roles = roles_presents($objet, $objet_destination)) { return $roles['colonne']; } + return ''; } @@ -126,14 +127,14 @@ function roles_colonne($objet, $objet_destination) { * on retrouve le rôle en question dans le tableau de qualification. * Si le rôle n'est pas défini dedans, on prend le rôle par défaut * déclaré. - * - * @param string $objet Objet source de la liaison - * @param string $objet_destination Objet de destination de la liaison - * @param array $qualif tableau de qualifications array(champ => valeur) + * + * @param string $objet Objet source de la liaison + * @param string $objet_destination Objet de destination de la liaison + * @param array $qualif tableau de qualifications array(champ => valeur) * @return array * Liste (role, colonne, (array)condition) si role possible * Liste ('', '', array()) sinon. -**/ + **/ function roles_trouver_dans_qualif($objet, $objet_destination, $qualif = array()) { // si des rôles sont possibles, on les utilise $role = $colonne_role = ''; # role défini @@ -143,7 +144,8 @@ function roles_trouver_dans_qualif($objet, $objet_destination, $qualif = array() $colonne_role = $roles['colonne']; // qu'il n'est pas défini if (!isset($qualif[$colonne_role]) - OR !($role = $qualif[$colonne_role])) { + OR !($role = $qualif[$colonne_role]) + ) { $role = $roles['roles']['defaut']; } // where @@ -157,9 +159,9 @@ function roles_trouver_dans_qualif($objet, $objet_destination, $qualif = array() * Gérer l'ajout dans la condition where du rôle * * On ajoute la condition uniquement si la liaison entre les 2 objets a une colonne de rôle ! - * - * @param string $objet_source Objet source (qui possède la table de liens) - * @param string $objet Objet de destination + * + * @param string $objet_source Objet source (qui possède la table de liens) + * @param string $objet Objet de destination * @param array $cond * Tableau de conditions where * qui peut avoir un index spécial 'role' définissant le role à appliquer @@ -170,7 +172,7 @@ function roles_trouver_dans_qualif($objet, $objet_destination, $qualif = array() * pas de rôle par défaut si aucun n'est défini. * @return array * Liste (Tableau de conditions where complété du role, Colonne du role, role utilisé) -**/ + **/ function roles_creer_condition_role($objet_source, $objet, $cond, $tous_si_absent = false) { // role par défaut, colonne list($role_defaut, $colonne_role) = roles_trouver_dans_qualif($objet_source, $objet); @@ -182,26 +184,27 @@ function roles_creer_condition_role($objet_source, $objet, $cond, $tous_si_absen if ($colonne_role) { // on ajoute la condition du role aux autres conditions. if ($role != '*') { - $cond[] = "$colonne_role=" .sql_quote($role); + $cond[] = "$colonne_role=" . sql_quote($role); } } + return array($cond, $colonne_role, $role); } /** * Liste des identifiants dont on ne peut ajouter de rôle - * + * * Lister les id objet_source associés à l'objet id_objet * via la table de lien objet_lien, et détermine dans cette liste * lesquels ont les rôles complets, c'est à dire qu'on ne peut leur * affecteur d'autres rôles parmi ceux qui existe pour cette liaison. * * @see lister_objets_lies() - * + * * @param string $objet_source Objet dont on veut récupérer la liste des identifiants - * @param string $objet Objet sur lequel est liée la source - * @param int $id_objet Identifiant d'objet sur lequel est liée la source - * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) + * @param string $objet Objet sur lequel est liée la source + * @param int $id_objet Identifiant d'objet sur lequel est liée la source + * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) * @return array Liste des identifiants */ function roles_complets($objet_source, $objet, $id_objet, $objet_lien) { @@ -231,15 +234,14 @@ function roles_complets($objet_source, $objet, $id_objet, $objet_lien) { } - /** * Liste les roles attribués entre 2 objets/id_objet sur une table de liaison donnée - * + * * @param string $id_objet_source Identifiant de l'objet qu'on lie - * @param string $objet_source Objet qu'on lie - * @param string $objet Objet sur lequel est liée la source - * @param int $id_objet Identifiant d'objet sur lequel est liée la source - * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) + * @param string $objet_source Objet qu'on lie + * @param string $objet Objet sur lequel est liée la source + * @param int $id_objet Identifiant d'objet sur lequel est liée la source + * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) * @return array Liste des roles */ function roles_presents_sur_id($id_objet_source, $objet_source, $objet, $id_objet, $objet_lien) { @@ -258,7 +260,6 @@ function roles_presents_sur_id($id_objet_source, $objet_source, $objet, $id_obje } - /** * Lister des rôles présents sur une liaion, pour un objet sur un autre, * classés par identifiant de l'objet @@ -272,9 +273,9 @@ function roles_presents_sur_id($id_objet_source, $objet_source, $objet, $id_obje * aux fonctions utilisant celle ci. * * @param string $objet_source Objet dont on veut récupérer la liste des identifiants - * @param string $objet Objet sur lequel est liée la source - * @param int $id_objet Identifiant d'objet sur lequel est liée la source - * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) + * @param string $objet Objet sur lequel est liée la source + * @param int $id_objet Identifiant d'objet sur lequel est liée la source + * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) * @return array|bool * - Tableau d'index * - roles : tableau de description des roles, @@ -291,17 +292,16 @@ function roles_presents_liaisons($objet_source, $objet, $id_objet, $objet_lien) } // pas de roles sur ces objets, on sort - $roles = roles_presents($objet_lien, ($objet_lien==$objet) ? $objet_source : $objet); + $roles = roles_presents($objet_lien, ($objet_lien == $objet) ? $objet_source : $objet); if (!$roles) { return $done[$hash] = false; } // inspiré de lister_objets_lies() - if ($objet_lien==$objet){ - $res = objet_trouver_liens(array($objet=>$id_objet),array($objet_source=>'*')); - } - else{ - $res = objet_trouver_liens(array($objet_source=>'*'),array($objet=>$id_objet)); + if ($objet_lien == $objet) { + $res = objet_trouver_liens(array($objet => $id_objet), array($objet_source => '*')); + } else { + $res = objet_trouver_liens(array($objet_source => '*'), array($objet => $id_objet)); } // types de roles possibles @@ -333,13 +333,13 @@ function roles_presents_liaisons($objet_source, $objet, $id_objet, $objet_lien) * On retourne cette liste dans le datalist de saisie libre role. * * @param string $objet_source Objet dont on veut récupérer la liste des identifiants - * @param string $objet Objet sur lequel est liée la source - * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) + * @param string $objet Objet sur lequel est liée la source + * @param string $objet_lien Objet dont on utilise la table de liaison (c'est forcément soit $objet_source, soit $objet) * @return array|bool * - Tableau de roles : tableau de description des roles, * - false si pas de role déclarés */ -function roles_connus_en_base($objet_source, $objet, $objet_lien){ +function roles_connus_en_base($objet_source, $objet, $objet_lien) { static $done = array(); // stocker le résultat @@ -348,21 +348,22 @@ function roles_connus_en_base($objet_source, $objet, $objet_lien){ return $done[$hash]; } - if (!$lien = objet_associable($objet_lien)){ + if (!$lien = objet_associable($objet_lien)) { return $done[$hash] = false; } // pas de roles sur ces objets, on sort - $roles = roles_presents($objet_lien, ($objet_lien==$objet) ? $objet_source : $objet); + $roles = roles_presents($objet_lien, ($objet_lien == $objet) ? $objet_source : $objet); if (!$roles) { return $done[$hash] = false; } - list($primary,$l) = $lien; + list($primary, $l) = $lien; $colone_role = $roles['colonne']; - $all = sql_allfetsel("DISTINCT $colone_role",$l,"objet=".sql_quote(($objet_source==$objet_lien)?$objet:$objet_source)); - $done[$hash] = array_map("reset",$all); + $all = sql_allfetsel("DISTINCT $colone_role", $l, + "objet=" . sql_quote(($objet_source == $objet_lien) ? $objet : $objet_source)); + $done[$hash] = array_map("reset", $all); return $done[$hash]; } diff --git a/ecrire/inc/rubriques.php b/ecrire/inc/rubriques.php index ea515887ac..ab5b7246f9 100644 --- a/ecrire/inc/rubriques.php +++ b/ecrire/inc/rubriques.php @@ -15,28 +15,30 @@ * * @package SPIP\Core\Rubriques */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Recalcule les statuts d'une rubrique - * + * * Fonction à appeler lorsque le statut d'un objet change dans une rubrique * ou que la rubrique est deplacée. - * + * * Si le statut passe a "publie", la rubrique et ses parents y passent aussi * et les langues utilisees sont recalculées. * Conséquences symétriques s'il est depublié. - * + * * S'il est deplacé alors qu'il était publiée, double conséquence. - * + * * Tout cela devrait passer en SQL, sous forme de Cascade SQL. * * @uses depublier_branche_rubrique_if() * @uses calculer_prochain_postdate() * @uses publier_branche_rubrique() - * + * * @param int $id_rubrique * Identifiant de la rubrique * @param array $modifs @@ -50,35 +52,36 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * true pour recalculer aussi la date du prochain article post-daté * @return bool * true si le statut change effectivement -**/ -function calculer_rubriques_if ($id_rubrique, $modifs, $statut_ancien = '', $postdate = false) -{ + **/ +function calculer_rubriques_if($id_rubrique, $modifs, $statut_ancien = '', $postdate = false) { $neuf = false; if ($statut_ancien == 'publie') { if (isset($modifs['statut']) OR isset($modifs['id_rubrique']) - OR ($postdate AND strtotime($postdate)>time())) + OR ($postdate AND strtotime($postdate) > time()) + ) { $neuf |= depublier_branche_rubrique_if($id_rubrique); + } // ne publier que si c'est pas un postdate, ou si la date n'est pas dans le futur - if ($postdate){ + if ($postdate) { calculer_prochain_postdate(true); - $neuf |= (strtotime($postdate)<=time()); // par securite - } - elseif (isset($modifs['id_rubrique'])) + $neuf |= (strtotime($postdate) <= time()); // par securite + } elseif (isset($modifs['id_rubrique'])) { $neuf |= publier_branche_rubrique($modifs['id_rubrique']); - } - elseif (isset($modifs['statut']) and $modifs['statut']=='publie'){ - if ($postdate){ - calculer_prochain_postdate(true); - $neuf |= (strtotime($postdate)<=time()); // par securite } - else + } elseif (isset($modifs['statut']) and $modifs['statut'] == 'publie') { + if ($postdate) { + calculer_prochain_postdate(true); + $neuf |= (strtotime($postdate) <= time()); // par securite + } else { $neuf |= publier_branche_rubrique($id_rubrique); + } } - if ($neuf) - // Sauver la date de la derniere mise a jour (pour menu_rubriques) - ecrire_meta("date_calcul_rubriques", date("U")); + if ($neuf) // Sauver la date de la derniere mise a jour (pour menu_rubriques) + { + ecrire_meta("date_calcul_rubriques", date("U")); + } $langues = calculer_langues_utilisees(); ecrire_meta('langues_utilisees', $langues); @@ -87,26 +90,28 @@ function calculer_rubriques_if ($id_rubrique, $modifs, $statut_ancien = '', $pos /** * Publie une rubrique et sa hiérarchie de rubriques - * + * * Fonction à appeler lorsqu'on dépublie ou supprime quelque chose - * dans une rubrique. + * dans une rubrique. * * @todo Le nom de la fonction est trompeur, vu que la fonction remonte dans la hierarchie ! - * + * * @param int $id_rubrique * Identifiant de la rubrique * @return bool * true si le statut change effectivement */ -function publier_branche_rubrique($id_rubrique) -{ +function publier_branche_rubrique($id_rubrique) { $id_pred = $id_rubrique; while (true) { - sql_updateq('spip_rubriques', array('statut'=>'publie', 'date'=>date('Y-m-d H:i:s')), "id_rubrique=".intval($id_rubrique)); - $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', "R.id_rubrique=".intval($id_rubrique)); - if (!$id_parent) break; + sql_updateq('spip_rubriques', array('statut' => 'publie', 'date' => date('Y-m-d H:i:s')), + "id_rubrique=" . intval($id_rubrique)); + $id_parent = sql_getfetsel('id_parent', 'spip_rubriques AS R', "R.id_rubrique=" . intval($id_rubrique)); + if (!$id_parent) { + break; + } $id_rubrique = $id_parent; - } + } # spip_log(" publier_branche_rubrique($id_rubrique $id_pred"); return $id_pred != $id_rubrique; @@ -114,29 +119,30 @@ function publier_branche_rubrique($id_rubrique) /** * Dépublie si nécessaire des éléments d'une hiérarchie de rubriques - * + * * Fonction à appeler lorsqu'on dépublie ou supprime quelque chose - * dans une rubrique. + * dans une rubrique. * * @uses depublier_rubrique_if() * @todo Le nom de la fonction est trompeur, vu que la fonction remonte dans la hierarchie ! - * + * * @param int $id_rubrique * Identifiant de la rubrique * @return bool * true si le statut change effectivement */ -function depublier_branche_rubrique_if($id_rubrique){ +function depublier_branche_rubrique_if($id_rubrique) { $date = date('Y-m-d H:i:s'); // figer la date # spip_log("depublier_branche_rubrique($id_rubrique ?"); $id_pred = $id_rubrique; while ($id_pred) { - if (!depublier_rubrique_if($id_pred,$date)) + if (!depublier_rubrique_if($id_pred, $date)) { return $id_pred != $id_rubrique; + } // passer au parent si on a depublie - $r = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=".intval($id_pred)); + $r = sql_fetsel("id_parent", "spip_rubriques", "id_rubrique=" . intval($id_pred)); $id_pred = $r['id_parent']; } @@ -147,7 +153,7 @@ function depublier_branche_rubrique_if($id_rubrique){ * Dépublier une rubrique si aucun contenu publié connu n'est trouvé dedans * * @pipeline_appel objet_compte_enfants - * + * * @param int $id_rubrique * Identifiant de la rubrique à tester * @param string|null $date @@ -156,29 +162,32 @@ function depublier_branche_rubrique_if($id_rubrique){ * @return bool * true si la rubrique a été dépubliée */ -function depublier_rubrique_if($id_rubrique, $date = null){ +function depublier_rubrique_if($id_rubrique, $date = null) { if (is_null($date)) { $date = date('Y-m-d H:i:s'); } $postdates = ($GLOBALS['meta']["post_dates"] == "non") ? - " AND date <= ".sql_quote($date) : ''; + " AND date <= " . sql_quote($date) : ''; - if (!$id_rubrique=intval($id_rubrique)) + if (!$id_rubrique = intval($id_rubrique)) { return false; + } // verifier qu'elle existe et est bien publiee - $r = sql_fetsel('id_rubrique,statut','spip_rubriques',"id_rubrique=".intval($id_rubrique)); - if (!$r OR $r['statut']!=='publie') + $r = sql_fetsel('id_rubrique,statut', 'spip_rubriques', "id_rubrique=" . intval($id_rubrique)); + if (!$r OR $r['statut'] !== 'publie') { return false; + } // On met le nombre de chaque type d'enfants dans un tableau // Le type de l'objet est au pluriel $compte = array( - 'articles' => sql_countsel("spip_articles", "id_rubrique=".intval($id_rubrique)." AND statut='publie'$postdates"), - 'rubriques' => sql_countsel("spip_rubriques", "id_parent=".intval($id_rubrique)." AND statut='publie'"), - 'documents' => sql_countsel("spip_documents_liens", "id_objet=".intval($id_rubrique)." AND objet='rubrique'") + 'articles' => sql_countsel("spip_articles", + "id_rubrique=" . intval($id_rubrique) . " AND statut='publie'$postdates"), + 'rubriques' => sql_countsel("spip_rubriques", "id_parent=" . intval($id_rubrique) . " AND statut='publie'"), + 'documents' => sql_countsel("spip_documents_liens", "id_objet=" . intval($id_rubrique) . " AND objet='rubrique'") ); - + // On passe le tableau des comptes dans un pipeline pour que les plugins puissent ajouter (ou retirer) des enfants $compte = pipeline('objet_compte_enfants', array( @@ -191,13 +200,16 @@ function depublier_rubrique_if($id_rubrique, $date = null){ 'data' => $compte ) ); - + // S'il y a au moins un enfant de n'importe quoi, on ne dépublie pas - foreach($compte as $objet => $n) - if ($n) + foreach ($compte as $objet => $n) { + if ($n) { return false; + } + } + + sql_updateq("spip_rubriques", array("statut" => 'prepa'), "id_rubrique=" . intval($id_rubrique)); - sql_updateq("spip_rubriques", array("statut" => 'prepa'), "id_rubrique=".intval($id_rubrique)); # spip_log("depublier_rubrique $id_pred"); return true; } @@ -208,18 +220,18 @@ function depublier_rubrique_if($id_rubrique, $date = null){ * * Recalcule le statut des rubriques, les langues héritées et la date * du prochain article post-daté - * + * * Cette fonction est appelée après importation: elle calcule les meta-donnes * resultantes et remet de la coherence au cas où la base importée en manquait - * + * * Cette fonction doit etre invoquée sans processus concurrent potentiel. * * @uses calculer_rubriques_publiees() * @uses calculer_langues_utilisees() * @uses calculer_prochain_postdate() - * + * * @return void -**/ + **/ function calculer_rubriques() { calculer_rubriques_publiees(); @@ -239,15 +251,15 @@ function calculer_rubriques() { /** * Recalcule l'ensemble des données associées à l'arborescence des rubriques - * + * * Attention, faute de SQL transactionnel on travaille sur * des champs temporaires afin de ne pas casser la base * pendant la demi seconde de recalculs * * @pipeline_appel calculer_rubriques - * + * * @return void -**/ + **/ function calculer_rubriques_publiees() { // Mettre les compteurs a zero @@ -259,14 +271,16 @@ function calculer_rubriques_publiees() { // Afficher les articles post-dates ? $postdates = ($GLOBALS['meta']["post_dates"] == "non") ? - "AND A.date <= ".sql_quote(date('Y-m-d H:i:s')) : ''; + "AND A.date <= " . sql_quote(date('Y-m-d H:i:s')) : ''; $r = sql_select( "R.id_rubrique AS id, max(A.date) AS date_h", "spip_rubriques AS R JOIN spip_articles AS A ON R.id_rubrique = A.id_rubrique", "A.date>R.date_tmp AND A.statut='publie' $postdates ", "R.id_rubrique"); - while ($row = sql_fetch($r)) - sql_updateq("spip_rubriques", array("statut_tmp" => 'publie', "date_tmp" => $row['date_h']), "id_rubrique=".intval($row['id'])); + while ($row = sql_fetch($r)) { + sql_updateq("spip_rubriques", array("statut_tmp" => 'publie', "date_tmp" => $row['date_h']), + "id_rubrique=" . intval($row['id'])); + } // point d'entree pour permettre a des plugins de gerer le statut // autrement (par ex: toute rubrique est publiee des sa creation) @@ -274,7 +288,7 @@ function calculer_rubriques_publiees() { // c'est statut_tmp/date_tmp qu'il doit modifier // [C'est un trigger... a renommer en trig_calculer_rubriques ?] pipeline('calculer_rubriques', null); - + // Les rubriques qui ont une rubrique fille plus recente // on tourne tant que les donnees remontent vers la racine. @@ -285,13 +299,14 @@ function calculer_rubriques_publiees() { "spip_rubriques AS R JOIN spip_rubriques AS SR ON R.id_rubrique = SR.id_parent", "(SR.date_tmp>R.date_tmp OR R.statut_tmp<>'publie') AND SR.statut_tmp='publie' ", "R.id_rubrique"); while ($row = sql_fetch($r)) { - sql_updateq('spip_rubriques', array('statut_tmp'=>'publie', 'date_tmp'=>$row['date_h']),"id_rubrique=".intval($row['id'])); + sql_updateq('spip_rubriques', array('statut_tmp' => 'publie', 'date_tmp' => $row['date_h']), + "id_rubrique=" . intval($row['id'])); $continuer = true; } } while ($continuer); // Enregistrement des modifs - sql_update('spip_rubriques', array('date'=>'date_tmp', 'statut'=>'statut_tmp')); + sql_update('spip_rubriques', array('date' => 'date_tmp', 'statut' => 'statut_tmp')); } /** @@ -302,17 +317,16 @@ function calculer_rubriques_publiees() { * On procede en iterant la profondeur de 1 en 1 pour ne pas risquer une boucle infinie sur reference circulaire * * @pipeline_appel trig_propager_les_secteurs - * + * * @return void -**/ -function propager_les_secteurs() -{ + **/ +function propager_les_secteurs() { // Profondeur 0 // Toutes les rubriques racines sont de profondeur 0 // et fixer les id_secteur des rubriques racines - sql_update('spip_rubriques', array('id_secteur'=>'id_rubrique','profondeur'=>0), "id_parent=0"); + sql_update('spip_rubriques', array('id_secteur' => 'id_rubrique', 'profondeur' => 0), "id_parent=0"); // Toute rubrique non racine est de profondeur >0 - sql_updateq('spip_rubriques', array('profondeur'=>1), "id_parent<>0 AND profondeur=0"); + sql_updateq('spip_rubriques', array('profondeur' => 1), "id_parent<>0 AND profondeur=0"); // securite : pas plus d'iteration que de rubriques dans la base $maxiter = sql_countsel("spip_rubriques"); @@ -335,24 +349,28 @@ function propager_les_secteurs() $maxiter2 = $maxiter; while ($maxiter2-- AND $rows = sql_allfetsel( - "A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur", - "spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique", - "R.profondeur=".intval($prof)." AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)", - "","R.id_secteur","0,100")){ + "A.id_rubrique AS id, R.id_secteur AS id_secteur, R.profondeur+1 as profondeur", + "spip_rubriques AS A JOIN spip_rubriques AS R ON A.id_parent = R.id_rubrique", + "R.profondeur=" . intval($prof) . " AND (A.id_secteur <> R.id_secteur OR A.profondeur > R.profondeur+1)", + "", "R.id_secteur", "0,100")) { $id_secteur = null; $ids = array(); while ($row = array_shift($rows)) { - if ($row['id_secteur']!==$id_secteur){ - if (count($ids)) - sql_updateq("spip_rubriques", array("id_secteur" => $id_secteur,'profondeur' => $prof+1), sql_in('id_rubrique',$ids)); + if ($row['id_secteur'] !== $id_secteur) { + if (count($ids)) { + sql_updateq("spip_rubriques", array("id_secteur" => $id_secteur, 'profondeur' => $prof+1), + sql_in('id_rubrique', $ids)); + } $id_secteur = $row['id_secteur']; $ids = array(); } $ids[] = $row['id']; } - if (count($ids)) - sql_updateq("spip_rubriques", array("id_secteur" => $id_secteur,'profondeur' => $prof+1), sql_in('id_rubrique',$ids)); + if (count($ids)) { + sql_updateq("spip_rubriques", array("id_secteur" => $id_secteur, 'profondeur' => $prof+1), + sql_in('id_rubrique', $ids)); + } } @@ -360,40 +378,42 @@ function propager_les_secteurs() $maxiter2 = $maxiter; while ($maxiter2-- AND $rows = sql_allfetsel( - "id_rubrique as id", - "spip_rubriques", - "profondeur=".intval($prof+1)." AND id_parent NOT IN (".sql_get_select("zzz.id_rubrique","spip_rubriques AS zzz","zzz.profondeur=".intval($prof)).")",'','','0,100')){ - $rows = array_map('reset',$rows); - sql_updateq("spip_rubriques", array('profondeur' => $prof+2), sql_in("id_rubrique",$rows)); + "id_rubrique as id", + "spip_rubriques", + "profondeur=" . intval($prof+1) . " AND id_parent NOT IN (" . sql_get_select("zzz.id_rubrique", + "spip_rubriques AS zzz", "zzz.profondeur=" . intval($prof)) . ")", '', '', '0,100')) { + $rows = array_map('reset', $rows); + sql_updateq("spip_rubriques", array('profondeur' => $prof+2), sql_in("id_rubrique", $rows)); } // ici on a fini de valider $prof+1, toutes les rubriques de prondeur 0 a $prof+1 sont OK // si pas de rubrique a profondeur $prof+1 pas la peine de continuer // si il reste des rubriques non vues, c'est une branche morte ou reference circulaire (base foireuse) // on arrete les frais - if (sql_countsel("spip_rubriques","profondeur=".intval($prof+1))){ + if (sql_countsel("spip_rubriques", "profondeur=" . intval($prof+1))) { $prof++; $continuer = true; } - } - while ($continuer AND $maxiter--); + } while ($continuer AND $maxiter--); // loger si la table des rubriques semble foireuse // et mettre un id_secteur=0 sur ces rubriques pour eviter toute selection par les boucles - if (sql_countsel("spip_rubriques","profondeur>".intval($prof+1))){ - spip_log("Les rubriques de profondeur>".($prof+1)." semblent suspectes (branches morte ou reference circulaire dans les parents)",_LOG_CRITIQUE); - sql_update("spip_rubriques",array('id_secteur'=>0),"profondeur>".intval($prof+1)); + if (sql_countsel("spip_rubriques", "profondeur>" . intval($prof+1))) { + spip_log("Les rubriques de profondeur>" . ($prof+1) . " semblent suspectes (branches morte ou reference circulaire dans les parents)", + _LOG_CRITIQUE); + sql_update("spip_rubriques", array('id_secteur' => 0), "profondeur>" . intval($prof+1)); } // reparer les articles - $r = sql_select("A.id_article AS id, R.id_secteur AS secteur", "spip_articles AS A, spip_rubriques AS R", "A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur"); + $r = sql_select("A.id_article AS id, R.id_secteur AS secteur", "spip_articles AS A, spip_rubriques AS R", + "A.id_rubrique = R.id_rubrique AND A.id_secteur <> R.id_secteur"); while ($row = sql_fetch($r)) { - sql_update("spip_articles", array("id_secteur" => $row['secteur']), "id_article=".intval($row['id'])); + sql_update("spip_articles", array("id_secteur" => $row['secteur']), "id_article=" . intval($row['id'])); } // avertir les plugins qui peuvent faire leur mises a jour egalement - pipeline('trig_propager_les_secteurs',''); + pipeline('trig_propager_les_secteurs', ''); } @@ -403,17 +423,19 @@ function propager_les_secteurs() * Cherche les langues incorrectes de sous rubriques, qui doivent hériter * de la rubrique parente lorsque langue_choisie est différent de oui, * et les corrige. - * + * * @return bool * true si un changement a eu lieu -**/ + **/ function calculer_langues_rubriques_etape() { - $s = sql_select("A.id_rubrique AS id_rubrique, R.lang AS lang", "spip_rubriques AS A, spip_rubriques AS R", "A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang"); + $s = sql_select("A.id_rubrique AS id_rubrique, R.lang AS lang", "spip_rubriques AS A, spip_rubriques AS R", + "A.id_parent = R.id_rubrique AND A.langue_choisie != 'oui' AND R.lang<>'' AND R.lang<>A.lang"); $t = false; while ($row = sql_fetch($s)) { $id_rubrique = $row['id_rubrique']; - $t = sql_updateq('spip_rubriques', array('lang' => $row['lang'], 'langue_choisie'=>'non'), "id_rubrique=".intval($id_rubrique)); + $t = sql_updateq('spip_rubriques', array('lang' => $row['lang'], 'langue_choisie' => 'non'), + "id_rubrique=" . intval($id_rubrique)); } return $t; @@ -424,27 +446,32 @@ function calculer_langues_rubriques_etape() { * * Redéfinit la langue du site sur les rubriques sans langue spécifiée * (langue_choisie différent de 'oui') - * + * * Redéfinit les langues des articles sans langue spécifiée * (langue_choisie différent de 'oui') en les rebasant sur la langue * de la rubrique parente lorsque ce n'est pas le cas. * * @uses calculer_langues_rubriques_etape() * @pipeline_appel trig_calculer_langues_rubriques - * - * @return void -**/ + * + * @return void + **/ function calculer_langues_rubriques() { // rubriques (recursivite) - sql_updateq("spip_rubriques", array("lang" => $GLOBALS['meta']['langue_site'], "langue_choisie" => 'non'), "id_parent=0 AND langue_choisie != 'oui'"); - while (calculer_langues_rubriques_etape()); + sql_updateq("spip_rubriques", array("lang" => $GLOBALS['meta']['langue_site'], "langue_choisie" => 'non'), + "id_parent=0 AND langue_choisie != 'oui'"); + while (calculer_langues_rubriques_etape()) { + ; + } // articles - $s = sql_select("A.id_article AS id_article, R.lang AS lang", "spip_articles AS A, spip_rubriques AS R", "A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang"); + $s = sql_select("A.id_article AS id_article, R.lang AS lang", "spip_articles AS A, spip_rubriques AS R", + "A.id_rubrique = R.id_rubrique AND A.langue_choisie != 'oui' AND (length(A.lang)=0 OR length(R.lang)>0) AND R.lang<>A.lang"); while ($row = sql_fetch($s)) { $id_article = $row['id_article']; - sql_updateq('spip_articles', array("lang"=> $row['lang'], 'langue_choisie'=>'non'), "id_article=".intval($id_article)); + sql_updateq('spip_articles', array("lang" => $row['lang'], 'langue_choisie' => 'non'), + "id_article=" . intval($id_article)); } if ($GLOBALS['meta']['multi_rubriques'] == 'oui') { @@ -452,9 +479,9 @@ function calculer_langues_rubriques() { $langues = calculer_langues_utilisees(); ecrire_meta('langues_utilisees', $langues); } - + // avertir les plugins qui peuvent faire leur mises a jour egalement - pipeline('trig_calculer_langues_rubriques',''); + pipeline('trig_calculer_langues_rubriques', ''); } @@ -464,13 +491,13 @@ function calculer_langues_rubriques() { * 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 = '') { + **/ +function calculer_langues_utilisees($serveur = '') { include_spip('public/interfaces'); include_spip('public/compiler'); include_spip('public/composer'); @@ -481,14 +508,15 @@ function calculer_langues_utilisees ($serveur = '') { include_spip('base/objets'); $tables = lister_tables_objets_sql(); - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); - foreach(array_keys($tables) as $t){ - $desc = $trouver_table($t,$serveur); + 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'])){ + AND isset($desc['field']['lang']) + AND isset($desc['field']['langue_choisie']) + ) { $boucle = new Boucle(); $boucle->show = $desc; @@ -508,7 +536,8 @@ function calculer_langues_utilisees ($serveur = '') { $boucle = pipeline('pre_boucle', $boucle); if (isset($desc['statut']) - AND $desc['statut']){ + AND $desc['statut'] + ) { $boucles = array( 'calculer_langues_utilisees' => $boucle, ); @@ -516,18 +545,17 @@ function calculer_langues_utilisees ($serveur = '') { 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.'();'; + $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){ + $res = explode(',', $res); + foreach ($res as $lang) { $langues[$lang] = 1; } - } - else { - $res = sql_select(implode(',',$boucle->select),$boucle->from); + } else { + $res = sql_select(implode(',', $boucle->select), $boucle->from); while ($row = sql_fetch($res)) { $langues[$row['lang']] = 1; } @@ -537,31 +565,32 @@ function calculer_langues_utilisees ($serveur = '') { $langues = array_filter(array_keys($langues)); sort($langues); - $langues = join(',',$langues); + $langues = join(',', $langues); spip_log("langues utilisees: $langues"); + return $langues; } /** * Calcule une branche de rubriques - * + * * Dépréciée, pour compatibilité * * @deprecated * @see calcul_branche_in() - * + * * @param string|int|array $generation * @return string */ -function calcul_branche ($generation) {return calcul_branche_in($generation);} +function calcul_branche($generation) { return calcul_branche_in($generation); } /** * Calcul d'une branche de rubrique - * + * * Liste des id_rubrique contenues dans une rubrique donnée * * @see inc_calcul_branche_in_dist() - * + * * @param string|int|array $id * Identifiant de la, ou des rubriques noeuds * @return string @@ -569,13 +598,14 @@ function calcul_branche ($generation) {return calcul_branche_in($generation);} * incluant les rubriques noeuds et toutes leurs descendances */ function calcul_branche_in($id) { - $calcul_branche_in = charger_fonction('calcul_branche_in','inc'); + $calcul_branche_in = charger_fonction('calcul_branche_in', 'inc'); + return $calcul_branche_in($id); } /** * Calcul d'une hiérarchie - * + * * Liste des id_rubrique contenant une rubrique donnée * * @see inc_calcul_hierarchie_in_dist() @@ -588,17 +618,18 @@ function calcul_branche_in($id) { * incluant les rubriques transmises et toutes leurs parentées */ function calcul_hierarchie_in($id, $tout = true) { - $calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in','inc'); + $calcul_hierarchie_in = charger_fonction('calcul_hierarchie_in', 'inc'); + return $calcul_hierarchie_in($id, $tout); } /** * Calcul d'une branche de rubriques - * + * * Liste des id_rubrique contenues dans une rubrique donnée * pour le critere {branche} - * + * * Fonction surchargeable pour optimisation * * @see inc_calcul_hierarchie_in_dist() pour la hierarchie @@ -613,10 +644,13 @@ function inc_calcul_branche_in_dist($id) { static $b = array(); // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN - if (!is_array($id)) $id = explode(',',$id); + if (!is_array($id)) { + $id = explode(',', $id); + } $id = join(',', array_map('intval', $id)); - if (isset($b[$id])) + if (isset($b[$id])) { return $b[$id]; + } // Notre branche commence par la rubrique de depart $branche = $r = $id; @@ -625,30 +659,32 @@ function inc_calcul_branche_in_dist($id) { // jusqu'a epuisement, en se protegeant des references circulaires $maxiter = 10000; while ($maxiter-- AND $filles = sql_allfetsel( - 'id_rubrique', - 'spip_rubriques', - sql_in('id_parent', $r) ." AND ". sql_in('id_rubrique', $r, 'NOT') - )) { + 'id_rubrique', + 'spip_rubriques', + sql_in('id_parent', $r) . " AND " . sql_in('id_rubrique', $r, 'NOT') + )) { $r = join(',', array_map('reset', $filles)); $branche .= ',' . $r; } # securite pour ne pas plomber la conso memoire sur les sites prolifiques - if (strlen($branche)<10000) + if (strlen($branche) < 10000) { $b[$id] = $branche; + } + return $branche; } /** * Calcul d'une hiérarchie - * + * * Liste des id_rubrique contenant une rubrique donnée, * contrairement à la fonction calcul_branche_in() qui calcule les * rubriques contenues * * @see inc_calcul_branche_in_dist() pour la descendence - * + * * @param string|int|array $id * Identifiant de la, ou des rubriques dont on veut obtenir les hierarchies * @param bool $tout @@ -661,7 +697,9 @@ function inc_calcul_hierarchie_in_dist($id, $tout = true) { static $b = array(); // normaliser $id qui a pu arriver comme un array, comme un entier, ou comme une chaine NN,NN,NN - if (!is_array($id)) $id = explode(',',$id); + if (!is_array($id)) { + $id = explode(',', $id); + } $id = join(',', array_map('intval', $id)); if (isset($b[$id])) { @@ -678,14 +716,14 @@ function inc_calcul_hierarchie_in_dist($id, $tout = true) { while ($maxiter-- AND $parents = sql_allfetsel( 'id_parent', 'spip_rubriques', - sql_in('id_rubrique', $ids_nouveaux_parents) ." AND ". sql_in('id_parent',$hier,'NOT') - )) { + sql_in('id_rubrique', $ids_nouveaux_parents) . " AND " . sql_in('id_parent', $hier, 'NOT') + )) { $ids_nouveaux_parents = join(',', array_map('reset', $parents)); - $hier = $ids_nouveaux_parents.(strlen($hier)?','.$hier:''); + $hier = $ids_nouveaux_parents . (strlen($hier) ? ',' . $hier : ''); } # securite pour ne pas plomber la conso memoire sur les sites prolifiques - if (strlen($hier)<10000) { + if (strlen($hier) < 10000) { $b[$id] = $hier; } @@ -697,43 +735,46 @@ function inc_calcul_hierarchie_in_dist($id, $tout = true) { /** - * Calcule la date du prochain article post-daté + * Calcule la date du prochain article post-daté * * Appelée lorsqu'un (ou plusieurs) article post-daté arrive à terme * ou est redaté * * @uses publier_branche_rubrique() * @pipeline_appel trig_calculer_prochain_postdate - * + * * @param bool $check * true pour affecter le statut des rubriques concernées. * @return void -**/ -function calculer_prochain_postdate($check= false) { + **/ +function calculer_prochain_postdate($check = false) { include_spip('base/abstract_sql'); if ($check) { $postdates = ($GLOBALS['meta']["post_dates"] == "non") ? - "AND A.date <= ".sql_quote(date('Y-m-d H:i:s')) : ''; + "AND A.date <= " . sql_quote(date('Y-m-d H:i:s')) : ''; $r = sql_select("DISTINCT A.id_rubrique AS id", - "spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique", "R.statut != 'publie' AND A.statut='publie'$postdates"); - while ($row = sql_fetch($r)) + "spip_articles AS A LEFT JOIN spip_rubriques AS R ON A.id_rubrique=R.id_rubrique", + "R.statut != 'publie' AND A.statut='publie'$postdates"); + while ($row = sql_fetch($r)) { publier_branche_rubrique($row['id']); + } - pipeline('trig_calculer_prochain_postdate',''); + pipeline('trig_calculer_prochain_postdate', ''); } - $t = sql_fetsel("date", "spip_articles", "statut='publie' AND date > ".sql_quote(date('Y-m-d H:i:s')), "", "date", "1"); - + $t = sql_fetsel("date", "spip_articles", "statut='publie' AND date > " . sql_quote(date('Y-m-d H:i:s')), "", "date", + "1"); + if ($t) { - $t = $t['date']; + $t = $t['date']; if (!isset($GLOBALS['meta']['date_prochain_postdate']) - OR $t<>$GLOBALS['meta']['date_prochain_postdate']){ + OR $t <> $GLOBALS['meta']['date_prochain_postdate'] + ) { ecrire_meta('date_prochain_postdate', strtotime($t)); ecrire_meta('derniere_modif', time()); } - } - else { + } else { effacer_meta('date_prochain_postdate'); ecrire_meta('derniere_modif', time()); } @@ -743,12 +784,12 @@ function calculer_prochain_postdate($check= false) { /** * Crée une arborescence de rubrique - * + * * creer_rubrique_nommee('truc/machin/chose') va créer * une rubrique truc, une sous-rubrique machin, et une sous-sous-rubrique * chose, sans créer de rubrique si elle existe déjà * à partir de $id_parent (par défaut, à partir de la racine) - * + * * NB: cette fonction est très pratique, mais pas utilisée dans le core * pour rester légère elle n'appelle pas calculer_rubriques() * @@ -765,25 +806,27 @@ function creer_rubrique_nommee($titre, $id_parent = 0, $serveur = '') { // eclater l'arborescence demandee // echapper les </multi> et autres balises fermantes html - $titre = preg_replace(",</([a-z][^>]*)>,ims","<@\\1>",$titre); + $titre = preg_replace(",</([a-z][^>]*)>,ims", "<@\\1>", $titre); $arbo = explode('/', preg_replace(',^/,', '', $titre)); include_spip('base/abstract_sql'); foreach ($arbo as $titre) { // retablir les </multi> et autres balises fermantes html - $titre = preg_replace(",<@([a-z][^>]*)>,ims","</\\1>",$titre); - $r = sql_getfetsel("id_rubrique", "spip_rubriques", "titre = ".sql_quote($titre)." AND id_parent=".intval($id_parent), - $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur); - if ($r !== NULL) { + $titre = preg_replace(",<@([a-z][^>]*)>,ims", "</\\1>", $titre); + $r = sql_getfetsel("id_rubrique", "spip_rubriques", + "titre = " . sql_quote($titre) . " AND id_parent=" . intval($id_parent), + $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur); + if ($r !== null) { $id_parent = $r; } else { $id_rubrique = sql_insertq('spip_rubriques', array( - 'titre' => $titre, - 'id_parent' => $id_parent, - 'statut' => 'prepa') - ,$desc=array(), $serveur); + 'titre' => $titre, + 'id_parent' => $id_parent, + 'statut' => 'prepa' + ) + , $desc = array(), $serveur); if ($id_parent > 0) { $data = sql_fetsel("id_secteur,lang", "spip_rubriques", "id_rubrique=$id_parent", - $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur); + $groupby = array(), $orderby = array(), $limit = '', $having = array(), $serveur); $id_secteur = $data['id_secteur']; $lang = $data['lang']; } else { @@ -791,7 +834,8 @@ function creer_rubrique_nommee($titre, $id_parent = 0, $serveur = '') { $lang = $GLOBALS['meta']['langue_site']; } - sql_updateq('spip_rubriques', array('id_secteur'=>$id_secteur, "lang"=>$lang), "id_rubrique=".intval($id_rubrique), $desc='', $serveur); + sql_updateq('spip_rubriques', array('id_secteur' => $id_secteur, "lang" => $lang), + "id_rubrique=" . intval($id_rubrique), $desc = '', $serveur); // pour la recursion $id_parent = $id_rubrique; diff --git a/ecrire/inc/securiser_action.php b/ecrire/inc/securiser_action.php index 9bb9055d6f..bc42353959 100644 --- a/ecrire/inc/securiser_action.php +++ b/ecrire/inc/securiser_action.php @@ -14,13 +14,15 @@ * Gestion des actions sécurisées * * @package SPIP\Core\Actions -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Génère ou vérifie une action sécurisée - * + * * Interface d'appel: * * - au moins un argument: retourne une URL ou un formulaire securisés @@ -47,16 +49,16 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param bool $public * @return array|string */ -function inc_securiser_action_dist($action = '', $arg = '', $redirect = "", $mode = false, $att = '', $public = false) -{ - if ($action) +function inc_securiser_action_dist($action = '', $arg = '', $redirect = "", $mode = false, $att = '', $public = false) { + if ($action) { return securiser_action_auteur($action, $arg, $redirect, $mode, $att, $public); - else { + } else { $arg = _request('arg'); $hash = _request('hash'); - $action = _request('action')?_request('action'):_request('formulaire_action'); - if ($a = verifier_action_auteur("$action-$arg", $hash)) + $action = _request('action') ? _request('action') : _request('formulaire_action'); + if ($a = verifier_action_auteur("$action-$arg", $hash)) { return $arg; + } include_spip('inc/minipres'); echo minipres(); exit; @@ -73,7 +75,7 @@ function inc_securiser_action_dist($action = '', $arg = '', $redirect = "", $mod * * @uses calculer_action_auteur() * @uses generer_form_action() - * + * * @param string $action * @param string $arg * @param string $redirect @@ -93,21 +95,24 @@ function inc_securiser_action_dist($action = '', $arg = '', $redirect = "", $mod function securiser_action_auteur($action, $arg, $redirect = "", $mode = false, $att = '', $public = false) { // mode URL ou array - if (!is_string($mode)){ - $hash = calculer_action_auteur("$action-$arg",is_numeric($att)?$att:null); + if (!is_string($mode)) { + $hash = calculer_action_auteur("$action-$arg", is_numeric($att) ? $att : null); $r = rawurlencode($redirect); - if ($mode===-1) - return array('action'=>$action,'arg'=>$arg,'hash'=>$hash); - else - return generer_url_action($action, "arg=".rawurlencode($arg)."&hash=$hash" . (!$r ? '' : "&redirect=$r"), $mode, $public); + if ($mode === -1) { + return array('action' => $action, 'arg' => $arg, 'hash' => $hash); + } else { + return generer_url_action($action, "arg=" . rawurlencode($arg) . "&hash=$hash" . (!$r ? '' : "&redirect=$r"), + $mode, $public); + } } // mode formulaire $hash = calculer_action_auteur("$action-$arg"); $att .= " style='margin: 0px; border: 0px'"; - if ($redirect) - $redirect = "\n\t\t<input name='redirect' type='hidden' value='". str_replace("'", ''', $redirect) ."' />"; + if ($redirect) { + $redirect = "\n\t\t<input name='redirect' type='hidden' value='" . str_replace("'", ''', $redirect) . "' />"; + } $mode .= $redirect . " <input name='hash' type='hidden' value='$hash' /> <input name='arg' type='hidden' value='$arg' />"; @@ -125,37 +130,43 @@ function caracteriser_auteur($id_auteur = null) { static $caracterisation = array(); if (is_null($id_auteur) AND !isset($GLOBALS['visiteur_session']['id_auteur'])) { - // si l'auteur courant n'est pas connu alors qu'il peut demander une action - // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie. - // S'il n'avait pas le droit de realiser cette action, le hash sera faux. + // si l'auteur courant n'est pas connu alors qu'il peut demander une action + // c'est une connexion par php_auth ou 1 instal, on se rabat sur le cookie. + // S'il n'avait pas le droit de realiser cette action, le hash sera faux. if (isset($_COOKIE['spip_session']) - AND (preg_match('/^(\d+)/',$_COOKIE['spip_session'],$r))) { - return array($r[1], ''); - // Necessaire aux forums anonymes. - // Pour le reste, ca echouera. - } else return array('0',''); + AND (preg_match('/^(\d+)/', $_COOKIE['spip_session'], $r)) + ) { + return array($r[1], ''); + // Necessaire aux forums anonymes. + // Pour le reste, ca echouera. + } else { + return array('0', ''); + } } // Eviter l'acces SQL si le pass est connu de PHP - if (is_null($id_auteur)){ - $id_auteur = isset($GLOBALS['visiteur_session']['id_auteur'])?$GLOBALS['visiteur_session']['id_auteur']:0; - if (isset($GLOBALS['visiteur_session']['pass']) AND $GLOBALS['visiteur_session']['pass']) + if (is_null($id_auteur)) { + $id_auteur = isset($GLOBALS['visiteur_session']['id_auteur']) ? $GLOBALS['visiteur_session']['id_auteur'] : 0; + if (isset($GLOBALS['visiteur_session']['pass']) AND $GLOBALS['visiteur_session']['pass']) { return $caracterisation[$id_auteur] = array($id_auteur, $GLOBALS['visiteur_session']['pass']); + } } - if (isset($caracterisation[$id_auteur])) return $caracterisation[$id_auteur]; + if (isset($caracterisation[$id_auteur])) { + return $caracterisation[$id_auteur]; + } if ($id_auteur) { include_spip('base/abstract_sql'); $t = sql_fetsel("id_auteur, pass", "spip_auteurs", "id_auteur=$id_auteur"); - if ($t) + if ($t) { return $caracterisation[$id_auteur] = array($t['id_auteur'], $t['pass']); + } include_spip('inc/minipres'); echo minipres(); exit; - } - // Visiteur anonyme, pour ls forums par exemple + } // Visiteur anonyme, pour ls forums par exemple else { - return array('0',''); + return array('0', ''); } } @@ -172,8 +183,8 @@ function caracteriser_auteur($id_auteur = null) { */ function _action_auteur($action, $id_auteur, $pass, $alea) { static $sha = array(); - if (!isset($sha[$id_auteur.$pass.$alea])){ - if (!isset($GLOBALS['meta'][$alea]) AND _request('exec')!=='install') { + if (!isset($sha[$id_auteur . $pass . $alea])) { + if (!isset($GLOBALS['meta'][$alea]) AND _request('exec') !== 'install') { include_spip('base/abstract_sql'); $GLOBALS['meta'][$alea] = sql_getfetsel('valeur', 'spip_meta', "nom=" . sql_quote($alea)); if (!($GLOBALS['meta'][$alea])) { @@ -184,12 +195,13 @@ function _action_auteur($action, $id_auteur, $pass, $alea) { } } include_spip('auth/sha256.inc'); - $sha[$id_auteur.$pass.$alea] = _nano_sha256($id_auteur.$pass.@$GLOBALS['meta'][$alea]); + $sha[$id_auteur . $pass . $alea] = _nano_sha256($id_auteur . $pass . @$GLOBALS['meta'][$alea]); + } + if (function_exists('sha1')) { + return sha1($action . $sha[$id_auteur . $pass . $alea]); + } else { + return md5($action . $sha[$id_auteur . $pass . $alea]); } - if (function_exists('sha1')) - return sha1($action.$sha[$id_auteur.$pass.$alea]); - else - return md5($action.$sha[$id_auteur.$pass.$alea]); } /** @@ -201,6 +213,7 @@ function _action_auteur($action, $id_auteur, $pass, $alea) { */ function calculer_action_auteur($action, $id_auteur = null) { list($id_auteur, $pass) = caracteriser_auteur($id_auteur); + return _action_auteur($action, $id_auteur, $pass, 'alea_ephemere'); } @@ -215,10 +228,13 @@ function calculer_action_auteur($action, $id_auteur = null) { */ function verifier_action_auteur($action, $hash) { list($id_auteur, $pass) = caracteriser_auteur(); - if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) + if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere')) { return true; - if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien')) + } + if ($hash == _action_auteur($action, $id_auteur, $pass, 'alea_ephemere_ancien')) { return true; + } + return false; } @@ -235,17 +251,20 @@ function verifier_action_auteur($action, $hash) { * @return string */ function secret_du_site() { - if (!isset($GLOBALS['meta']['secret_du_site'])){ + if (!isset($GLOBALS['meta']['secret_du_site'])) { include_spip('base/abstract_sql'); $GLOBALS['meta']['secret_du_site'] = sql_getfetsel('valeur', 'spip_meta', "nom='secret_du_site'"); } if (!isset($GLOBALS['meta']['secret_du_site']) - OR (strlen($GLOBALS['meta']['secret_du_site'])<64)) { + OR (strlen($GLOBALS['meta']['secret_du_site']) < 64) + ) { include_spip('inc/acces'); include_spip('auth/sha256.inc'); - ecrire_meta('secret_du_site', _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non'); + ecrire_meta('secret_du_site', + _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non'); lire_metas(); // au cas ou ecrire_meta() ne fonctionne pas } + return $GLOBALS['meta']['secret_du_site']; } @@ -256,10 +275,11 @@ function secret_du_site() { * @return string */ function calculer_cle_action($action) { - if (function_exists('sha1')) + if (function_exists('sha1')) { return sha1($action . secret_du_site()); - else + } else { return md5($action . secret_du_site()); + } } /** diff --git a/ecrire/inc/selectionner.php b/ecrire/inc/selectionner.php index efb5a1eee6..690f13f09c 100644 --- a/ecrire/inc/selectionner.php +++ b/ecrire/inc/selectionner.php @@ -14,9 +14,11 @@ * Gestion le l'affichage du sélecteur de rubrique AJAX * * @package SPIP\Core\Rubriques -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres'); @@ -27,9 +29,9 @@ include_spip('inc/filtres'); * @uses mini_hier() * @uses construire_selectionner_hierarchie() * @uses inc_plonger_dist() - * - * @see exec_rechercher_dist() - * + * + * @see exec_rechercher_dist() + * * @param int $sel * Identifiant de la rubrique * @param string $idom @@ -41,10 +43,14 @@ include_spip('inc/filtres'); * Type d'action * @return string * Code HTML -**/ -function inc_selectionner_dist ($sel, $idom = "", $exclus = 0, $aff_racine = false, $recur = true, $do = 'aff') { + **/ +function inc_selectionner_dist($sel, $idom = "", $exclus = 0, $aff_racine = false, $recur = true, $do = 'aff') { - if ($recur) $recur = mini_hier($sel); else $sel = 0; + if ($recur) { + $recur = mini_hier($sel); + } else { + $sel = 0; + } if ($aff_racine) { $info = generer_url_ecrire('informer', "type=rubrique&rac=$idom&do=$do&id="); @@ -53,32 +59,33 @@ function inc_selectionner_dist ($sel, $idom = "", $exclus = 0, $aff_racine = fal $onClick = "jQuery(this).parent().addClass('on');jQuery('#choix_parent_principal .on').removeClass('on'); aff_selection(0, '$idom3', '$info', event);return false;"; $ondbClick = strtr(str_replace("'", "’", - str_replace('"', """, - textebrut(_T('info_racine_site')))), - "\n\r", " "); + str_replace('"', """, + textebrut(_T('info_racine_site')))), + "\n\r", " "); $js_func = $do . '_selection_titre'; $ondbClick = "$js_func('$ondbClick',0,'selection_rubrique','id_parent');"; $aff_racine = "<div class='petite-racine item'>" - . "<a href='#'" + . "<a href='#'" . "onclick=\"" . $onClick . "\"\nondbclick=\"" . $ondbClick . $onClick - . "\">" - . _T("info_racine_site") - . "</a></div>"; + . "\">" + . _T("info_racine_site") + . "</a></div>"; } - $url_init = generer_url_ecrire('plonger',"rac=$idom&exclus=$exclus&id=0&col=1&do=$do"); + $url_init = generer_url_ecrire('plonger', "rac=$idom&exclus=$exclus&id=0&col=1&do=$do"); $plonger = charger_fonction('plonger', 'inc'); $plonger_r = $plonger($sel, $idom, $recur, 1, $exclus, $do); // url completee par la fonction JS onkeypress_rechercher $url = generer_url_ecrire('rechercher', "exclus=$exclus&rac=$idom&do=$do&type="); + return construire_selectionner_hierarchie($idom, $plonger_r, $aff_racine, $url, 'id_parent', $url_init); } @@ -94,55 +101,55 @@ function inc_selectionner_dist ($sel, $idom = "", $exclus = 0, $aff_racine = fal * @param string $url_init * @return string * Code HTML -**/ -function construire_selectionner_hierarchie($idom, $liste, $racine, $url, $name, $url_init = '') -{ + **/ +function construire_selectionner_hierarchie($idom, $liste, $racine, $url, $name, $url_init = '') { $idom1 = $idom . "_champ_recherche"; $idom2 = $idom . "_principal"; $idom3 = $idom . "_selection"; $idom4 = $idom . "_col_1"; $idom5 = 'img_' . $idom4; - $idom6 = $idom."_fonc"; + $idom6 = $idom . "_fonc"; return "<div id='$idom'>" . "<a id='$idom6' style='visibility: hidden;'" - . ($url_init ? "\nhref='$url_init'" : '') + . ($url_init ? "\nhref='$url_init'" : '') . "></a>" . "<div class='recherche_rapide_parent'>" - . http_img_pack("searching.gif", "*", "style='visibility: hidden;float:".$GLOBALS['spip_lang_right']."' id='$idom5'") + . http_img_pack("searching.gif", "*", + "style='visibility: hidden;float:" . $GLOBALS['spip_lang_right'] . "' id='$idom5'") . "" - . "<input style='width: 100px;float:".$GLOBALS['spip_lang_right'].";' type='search' id='$idom1'" - // eliminer Return car il provoque la soumission (balise unique) - // et eliminer Tab pour la navigation au clavier - // ce serait encore mieux de ne le faire que s'il y a encore plusieurs - // resultats retournes par la recherche + . "<input style='width: 100px;float:" . $GLOBALS['spip_lang_right'] . ";' type='search' id='$idom1'" + // eliminer Return car il provoque la soumission (balise unique) + // et eliminer Tab pour la navigation au clavier + // ce serait encore mieux de ne le faire que s'il y a encore plusieurs + // resultats retournes par la recherche . "\nonkeypress=\"k=event.keyCode;if (k==13 || k==3 || k==9){return false;}\"" - // lancer la recherche apres le filtrage ci-dessus sauf sur le tab (navigation au clavier) + // lancer la recherche apres le filtrage ci-dessus sauf sur le tab (navigation au clavier) . "\nonkeyup=\"if(event.keyCode==9){return false;};return onkey_rechercher(this.value," - // la destination de la recherche + // la destination de la recherche . "'$idom4'" # . "this.parentNode.parentNode.parentNode.parentNode.nextSibling.firstChild.id" . ",'" - // l'url effectuant la recherche + // l'url effectuant la recherche . $url - . "'," - // le noeud contenant un gif anime - // . "'idom5'" + . "'," + // le noeud contenant un gif anime + // . "'idom5'" . "this.parentNode.previousSibling.firstChild" . ",'" - // la valeur de l'attribut Name a remplir - . $name + // la valeur de l'attribut Name a remplir + . $name . "','" - // noeud invisible memorisant l'URL initiale (pour re-initialisation) + // noeud invisible memorisant l'URL initiale (pour re-initialisation) . $idom6 - . "')\"" + . "')\"" . " />" . "\n</div>" - . ($racine?"<div>$racine</div>":"") + . ($racine ? "<div>$racine</div>" : "") . "<div id='" - . $idom2 - . "'><div id='$idom4'" + . $idom2 + . "'><div id='$idom4'" . " class=''>" . $liste . "</div></div>\n<div id='$idom3'></div></div>\n"; @@ -154,14 +161,16 @@ function construire_selectionner_hierarchie($idom, $liste, $racine, $url, $name, * @param int $id_rubrique * @return array * Liste de tous les id_parent de la rubrique -**/ -function mini_hier ($id_rubrique) { - + **/ +function mini_hier($id_rubrique) { + $liste = $id_rubrique; $id_rubrique = intval($id_rubrique); - while ($id_rubrique = sql_getfetsel("id_parent", "spip_rubriques", "id_rubrique = " . $id_rubrique)) + while ($id_rubrique = sql_getfetsel("id_parent", "spip_rubriques", "id_rubrique = " . $id_rubrique)) { $liste = $id_rubrique . ",$liste"; - return explode(',',"0,$liste"); + } + + return explode(',', "0,$liste"); } ?> diff --git a/ecrire/inc/session.php b/ecrire/inc/session.php index 2665804872..c60579882b 100644 --- a/ecrire/inc/session.php +++ b/ecrire/inc/session.php @@ -18,7 +18,9 @@ * @package SPIP\Core\Session */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} $GLOBALS['visiteur_session'] = array(); # globale decrivant l'auteur @@ -37,14 +39,16 @@ $GLOBALS['visiteur_session'] = array(); # globale decrivant l'auteur * @param int|array|bool $auteur * @return bool|null|void */ -function inc_session_dist($auteur = false) -{ - if (is_numeric($auteur)) +function inc_session_dist($auteur = false) { + if (is_numeric($auteur)) { return supprimer_sessions($auteur, $auteur > 0); - else if (is_array($auteur)) - return ajouter_session($auteur); - else - return verifier_session($auteur); + } else { + if (is_array($auteur)) { + return ajouter_session($auteur); + } else { + return verifier_session($auteur); + } + } } @@ -73,20 +77,20 @@ function inc_session_dist($auteur = false) */ function supprimer_sessions($id_auteur, $toutes = true, $actives = true) { - spip_log("supprimer sessions auteur $id_auteur","session"); - if ($toutes OR $id_auteur!==$GLOBALS['visiteur_session']['id_auteur']) { - if ($dir = opendir(_DIR_SESSIONS)){ - $t = time() - (4*_RENOUVELLE_ALEA); - while(($f = readdir($dir)) !== false) { - if (preg_match(",^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,", $f, $regs)){ + spip_log("supprimer sessions auteur $id_auteur", "session"); + if ($toutes OR $id_auteur !== $GLOBALS['visiteur_session']['id_auteur']) { + if ($dir = opendir(_DIR_SESSIONS)) { + $t = time()-(4*_RENOUVELLE_ALEA); + while (($f = readdir($dir)) !== false) { + if (preg_match(",^[^\d-]*(-?\d+)_\w{32}\.php[3]?$,", $f, $regs)) { $f = _DIR_SESSIONS . $f; - if (($actives AND $regs[1] == $id_auteur) OR ($t > filemtime($f))) + if (($actives AND $regs[1] == $id_auteur) OR ($t > filemtime($f))) { spip_unlink($f); + } } } } - } - else { + } else { verifier_session(); spip_unlink(fichier_session('alea_ephemere', true)); } @@ -103,7 +107,7 @@ function supprimer_sessions($id_auteur, $toutes = true, $actives = true) { * @uses preparer_ecriture_session() * @uses fichier_session() * @uses ecrire_fichier_session() - * + * * @param array $auteur * Description de la session de l'auteur. Peut contenir (par exemple) * les clés : id_auteur, nom, login, email, statut, lang, ... @@ -119,43 +123,61 @@ function ajouter_session($auteur) { // Si ce n'est pas un inscrit (les inscrits ont toujours des choses en session) // on va vérifier s'il y a vraiment des choses à écrire - if (!$id_auteur){ + if (!$id_auteur) { // On supprime les données de base pour voir le contenu réel de la session $auteur_verif = $auteur; - if (isset($auteur_verif['id_auteur'])) unset($auteur_verif['id_auteur']); - if (isset($auteur_verif['hash_env'])) unset($auteur_verif['hash_env']); - if (isset($auteur_verif['ip_change'])) unset($auteur_verif['ip_change']); - if (isset($auteur_verif['date_session'])) unset($auteur_verif['date_session']); + if (isset($auteur_verif['id_auteur'])) { + unset($auteur_verif['id_auteur']); + } + if (isset($auteur_verif['hash_env'])) { + unset($auteur_verif['hash_env']); + } + if (isset($auteur_verif['ip_change'])) { + unset($auteur_verif['ip_change']); + } + if (isset($auteur_verif['date_session'])) { + unset($auteur_verif['date_session']); + } // Les variables vraiment nulle ne sont pas à prendre en compte non plus - foreach($auteur_verif as $variable=>$valeur){ - if ($valeur === null){ + foreach ($auteur_verif as $variable => $valeur) { + if ($valeur === null) { unset($auteur_verif[$variable]); } } // Si après ça la session est vide alors on supprime l'éventuel fichier et on arrête là - if (!$auteur_verif){ - if (isset($_COOKIE['spip_session']) AND isset($_SESSION[$_COOKIE['spip_session']])) + if (!$auteur_verif) { + if (isset($_COOKIE['spip_session']) AND isset($_SESSION[$_COOKIE['spip_session']])) { unset($_SESSION[$_COOKIE['spip_session']]); - if (isset($_COOKIE['spip_session'])) + } + if (isset($_COOKIE['spip_session'])) { unset($_COOKIE['spip_session']); + } + return false; } } if (!isset($_COOKIE['spip_session']) - OR !preg_match(',^'.$id_auteur.'_,', $_COOKIE['spip_session'])){ - $_COOKIE['spip_session'] = $id_auteur.'_'.md5(uniqid(rand(),true)); + OR !preg_match(',^' . $id_auteur . '_,', $_COOKIE['spip_session']) + ) { + $_COOKIE['spip_session'] = $id_auteur . '_' . md5(uniqid(rand(), true)); } // Maintenant on sait qu'on a des choses à écrire // On s'assure d'avoir au moins ces valeurs $auteur['id_auteur'] = $id_auteur; - if (!isset($auteur['hash_env'])) $auteur['hash_env'] = hash_env(); - if (!isset($auteur['ip_change'])) $auteur['ip_change'] = false; + if (!isset($auteur['hash_env'])) { + $auteur['hash_env'] = hash_env(); + } + if (!isset($auteur['ip_change'])) { + $auteur['ip_change'] = false; + } - if (!isset($auteur['date_session'])) $auteur['date_session'] = time(); + if (!isset($auteur['date_session'])) { + $auteur['date_session'] = time(); + } if (isset($auteur['prefs']) and is_string($auteur['prefs'])) { $auteur['prefs'] = unserialize($auteur['prefs']); } @@ -163,14 +185,13 @@ function ajouter_session($auteur) { $fichier_session = ""; // les sessions anonymes sont stockees dans $_SESSION - if (!$id_auteur){ + if (!$id_auteur) { spip_php_session_start(); $_SESSION[$_COOKIE['spip_session']] = preparer_ecriture_session($auteur); - } - else { + } else { $fichier_session = fichier_session('alea_ephemere'); if (!ecrire_fichier_session($fichier_session, $auteur)) { - spip_log('Echec ecriture fichier session '.$fichier_session,"session"._LOG_HS); + spip_log('Echec ecriture fichier session ' . $fichier_session, "session" . _LOG_HS); include_spip('inc/minipres'); echo minipres(); exit; @@ -179,17 +200,17 @@ function ajouter_session($auteur) { // poser le cookie de session SPIP include_spip('inc/cookie'); - $duree = _RENOUVELLE_ALEA * - (!isset($auteur['cookie']) - ? 2 : (is_numeric($auteur['cookie']) - ? $auteur['cookie'] : 20)); + $duree = _RENOUVELLE_ALEA* + (!isset($auteur['cookie']) + ? 2 : (is_numeric($auteur['cookie']) + ? $auteur['cookie'] : 20)); spip_setcookie( 'spip_session', $_COOKIE['spip_session'], - time() + $duree + time()+$duree ); - spip_log("ajoute session $fichier_session cookie $duree","session"); + spip_log("ajoute session $fichier_session cookie $duree", "session"); # on en profite pour purger les vieilles sessions anonymes abandonnees # supprimer_sessions(0, true, false); @@ -200,7 +221,7 @@ function ajouter_session($auteur) { /** * Vérifie si le cookie spip_session indique une session valide - * + * * Si oui, la decrit dans le tableau $visiteur_session et retourne id_auteur * La rejoue si IP change puis accepte le changement si $change=true * @@ -210,26 +231,26 @@ function ajouter_session($auteur) { * @uses fichier_session() * @uses ajouter_session() * @uses hash_env() - * + * * @param bool $change * @return bool|int|null */ function verifier_session($change = false) { // si pas de cookie, c'est fichu - if (!isset($_COOKIE['spip_session'])) + if (!isset($_COOKIE['spip_session'])) { return false; + } $fichier_session = ""; // est-ce une session anonyme ? - if (!intval($_COOKIE['spip_session'])){ + if (!intval($_COOKIE['spip_session'])) { spip_php_session_start(); if (!isset($_SESSION[$_COOKIE['spip_session']]) OR !is_array($_SESSION[$_COOKIE['spip_session']])) { return false; } $GLOBALS['visiteur_session'] = $_SESSION[$_COOKIE['spip_session']]; - } - else { + } else { // Tester avec alea courant $fichier_session = fichier_session('alea_ephemere', true); if ($fichier_session AND @file_exists($fichier_session)) { @@ -237,11 +258,13 @@ function verifier_session($change = false) { } else { // Sinon, tester avec alea precedent $fichier_session = fichier_session('alea_ephemere_ancien', true); - if (!$fichier_session OR !@file_exists($fichier_session)) return false; + if (!$fichier_session OR !@file_exists($fichier_session)) { + return false; + } // Renouveler la session avec l'alea courant include($fichier_session); - spip_log('renouvelle session '.$GLOBALS['visiteur_session']['id_auteur'],"session"); + spip_log('renouvelle session ' . $GLOBALS['visiteur_session']['id_auteur'], "session"); spip_unlink($fichier_session); ajouter_session($GLOBALS['visiteur_session']); } @@ -251,8 +274,9 @@ function verifier_session($change = false) { // c'est un auteur SPIP authentifie (tandis qu'un visiteur_session peut // n'etre qu'identifie, sans aucune authentification). - if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) + if (isset($GLOBALS['visiteur_session']['id_auteur']) AND $GLOBALS['visiteur_session']['id_auteur']) { $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session']; + } // Si l'adresse IP change, inc/presentation mettra une balise image @@ -262,27 +286,34 @@ function verifier_session($change = false) { // sa victime, mais se ferait deconnecter par elle. if (hash_env() != $GLOBALS['visiteur_session']['hash_env']) { if (!$GLOBALS['visiteur_session']['ip_change']) { - define('_SESSION_REJOUER',rejouer_session()); + define('_SESSION_REJOUER', rejouer_session()); $GLOBALS['visiteur_session']['ip_change'] = true; ajouter_session($GLOBALS['visiteur_session']); - } else if ($change) { - spip_log("session non rejouee, vol de cookie ?","session"); + } else { + if ($change) { + spip_log("session non rejouee, vol de cookie ?", "session"); + } + } + } else { + if ($change) { + spip_log("rejoue session $fichier_session " . $_COOKIE['spip_session'], "session"); + if ($fichier_session) { + spip_unlink($fichier_session); + } + $GLOBALS['visiteur_session']['ip_change'] = false; + unset($_COOKIE['spip_session']); + ajouter_session($GLOBALS['visiteur_session']); } - } else if ($change) { - spip_log("rejoue session $fichier_session ".$_COOKIE['spip_session'],"session"); - if ($fichier_session) - spip_unlink($fichier_session); - $GLOBALS['visiteur_session']['ip_change'] = false; - unset($_COOKIE['spip_session']); - ajouter_session($GLOBALS['visiteur_session']); } // Si la session a ete initiee il y a trop longtemps, elle est annulee if (isset($GLOBALS['visiteur_session']) - AND defined('_AGE_SESSION_MAX') - AND _AGE_SESSION_MAX > 0 - AND time() - @$GLOBALS['visiteur_session']['date_session'] > _AGE_SESSION_MAX) { + AND defined('_AGE_SESSION_MAX') + AND _AGE_SESSION_MAX > 0 + AND time()-@$GLOBALS['visiteur_session']['date_session'] > _AGE_SESSION_MAX + ) { unset($GLOBALS['visiteur_session']); + return false; } @@ -309,7 +340,7 @@ function session_get($nom) { * @api * @uses ajouter_session() * @uses terminer_actualiser_sessions() Ajoute la fonction en fin de hit. - * + * * @param string $nom * @param null $val * @return void|array @@ -317,21 +348,24 @@ function session_get($nom) { function session_set($nom, $val = null) { static $remove = array(); static $actualiser_sessions = false; - if ($nom===false) return $remove; - if (is_null($val)){ + if ($nom === false) { + return $remove; + } + if (is_null($val)) { // rien a faire - if (!isset($GLOBALS['visiteur_session'][$nom])) return; + if (!isset($GLOBALS['visiteur_session'][$nom])) { + return; + } unset($GLOBALS['visiteur_session'][$nom]); $remove[] = $nom; - } - else { + } else { // On ajoute la valeur dans la globale $GLOBALS['visiteur_session'][$nom] = $val; if ($remove) { $remove = array_diff($remove, array($nom)); } } - if (!$actualiser_sessions){ + if (!$actualiser_sessions) { // il faut creer la session si on en a pas, la premiere fois ajouter_session($GLOBALS['visiteur_session']); // in register la fonction qui mettra a jour toutes les sessions en fin de hit @@ -345,7 +379,7 @@ function session_set($nom, $val = null) { * * @uses actualiser_sessions() */ -function terminer_actualiser_sessions(){ +function terminer_actualiser_sessions() { // se remettre dans le dossier de travail au cas ou Apache a change chdir(_ROOT_CWD); // recuperer les variables a effacer @@ -357,7 +391,7 @@ function terminer_actualiser_sessions(){ /** * Mettre à jour les sessions existantes pour un auteur - * + * * Quand on modifie une fiche auteur on appelle cette fonction qui va * mettre à jour les fichiers de session de l'auteur en question. * (auteurs identifiés seulement) @@ -369,7 +403,7 @@ function terminer_actualiser_sessions(){ * @uses preg_files() * @uses preparer_ecriture_session() * @uses ecrire_fichier_session() - * + * * @param array $auteur * @param array $supprimer_cles * Liste des clés à supprimer des tableaux de sessions @@ -381,17 +415,18 @@ function actualiser_sessions($auteur, $supprimer_cles = array()) { // si l'auteur est celui de la session courante, verifier/creer la session si besoin $fichier_session_courante = ""; - if ($id_auteur == $id_auteur_courant){ + if ($id_auteur == $id_auteur_courant) { $auteur = array_merge($GLOBALS['visiteur_session'], $auteur); ajouter_session($auteur); - if ($id_auteur){ + if ($id_auteur) { $fichier_session_courante = fichier_session('alea_ephemere'); } } // si session anonyme on ne fait rien d'autre ici : les sessions anonymes sont non partagees - if (!$id_auteur) + if (!$id_auteur) { return; + } // les préférences sont désérialisées, toujours. if (isset($auteur['prefs']) and is_string($auteur['prefs'])) { @@ -404,14 +439,15 @@ function actualiser_sessions($auteur, $supprimer_cles = array()) { // .. mettre a jour les sessions de l'auteur cible // attention au $ final pour ne pas risquer d'embarquer un .php.jeton temporaire // cree par une ecriture concurente d'une session (fichier atomique temporaire) - $sessions = preg_files(_DIR_SESSIONS, '/'.$id_auteur.'_.*\.php$'); + $sessions = preg_files(_DIR_SESSIONS, '/' . $id_auteur . '_.*\.php$'); // 1ere passe : lire et fusionner les sessions - foreach($sessions as $session) { + foreach ($sessions as $session) { $GLOBALS['visiteur_session'] = array(); // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence) if ($session !== $fichier_session_courante - AND @file_exists($session)){ + AND @file_exists($session) + ) { include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible $auteur = array_merge($GLOBALS['visiteur_session'], $auteur); @@ -426,24 +462,23 @@ function actualiser_sessions($auteur, $supprimer_cles = array()) { $auteur_session = preparer_ecriture_session($auteur); // seconde passe : ecrire les sessions qui ne sont pas a jour - foreach($sessions as $session) { + foreach ($sessions as $session) { $GLOBALS['visiteur_session'] = array(); // a pu etre supprime entre le preg initial et le moment ou l'on arrive la (concurrence) - if (@file_exists($session)){ + if (@file_exists($session)) { include $session; # $GLOBALS['visiteur_session'] est alors l'auteur cible // est-ce que cette session est a mettre a jour ? - if ($auteur_session != $GLOBALS['visiteur_session']){ + if ($auteur_session != $GLOBALS['visiteur_session']) { ecrire_fichier_session($session, $auteur); } } } - if ($id_auteur == $id_auteur_courant){ + if ($id_auteur == $id_auteur_courant) { $GLOBALS['visiteur_session'] = $auteur; $GLOBALS['auteur_session'] = &$GLOBALS['visiteur_session']; - } - else { + } else { // restaurer l'auteur courant $GLOBALS['visiteur_session'] = $sauve; } @@ -453,14 +488,14 @@ function actualiser_sessions($auteur, $supprimer_cles = array()) { /** * Préparer le tableau de session avant écriture - * + * * Nettoyage de quelques variables sensibles, et appel d'un pipeline * * @pipeline preparer_fichier_session * @param array $auteur * @return array */ -function preparer_ecriture_session($auteur){ +function preparer_ecriture_session($auteur) { $row = $auteur; // ne pas enregistrer ces elements de securite @@ -471,11 +506,11 @@ function preparer_ecriture_session($auteur){ unset($auteur['alea_actuel']); unset($auteur['alea_futur']); - $auteur = pipeline('preparer_fichier_session',array('args'=>array('row'=>$row),'data'=>$auteur)); + $auteur = pipeline('preparer_fichier_session', array('args' => array('row' => $row), 'data' => $auteur)); // ne pas enregistrer les valeurs vraiment nulle dans le fichier - foreach($auteur as $variable=>$valeur){ - if ($valeur === null){ + foreach ($auteur as $variable => $valeur) { + if ($valeur === null) { unset($auteur[$variable]); } } @@ -495,11 +530,12 @@ function ecrire_fichier_session($fichier, $auteur) { $auteur = preparer_ecriture_session($auteur); // enregistrer les autres donnees du visiteur - $texte = "<"."?php\n"; - foreach ($auteur as $var => $val) - $texte .= '$GLOBALS[\'visiteur_session\'][\''.$var.'\'] = ' - . var_export($val,true).";\n"; - $texte .= "?".">\n"; + $texte = "<" . "?php\n"; + foreach ($auteur as $var => $val) { + $texte .= '$GLOBALS[\'visiteur_session\'][\'' . $var . '\'] = ' + . var_export($val, true) . ";\n"; + } + $texte .= "?" . ">\n"; return ecrire_fichier($fichier, $texte); } @@ -516,21 +552,23 @@ function fichier_session($alea, $tantpis = false) { if (!isset($GLOBALS['meta'][$alea])) { include_spip('base/abstract_sql'); - $GLOBALS['meta'][$alea] = sql_getfetsel('valeur', 'spip_meta', "nom=" . sql_quote($alea), '','', '', '', '', 'continue'); + $GLOBALS['meta'][$alea] = sql_getfetsel('valeur', 'spip_meta', "nom=" . sql_quote($alea), '', '', '', '', '', + 'continue'); } if (!$GLOBALS['meta'][$alea]) { if (!$tantpis) { - spip_log("fichier session ($tantpis): $alea indisponible","session"); + spip_log("fichier session ($tantpis): $alea indisponible", "session"); include_spip('inc/minipres'); echo minipres(); } + return ''; // echec mais $tanpis - } - else { - $repertoire = sous_repertoire(_DIR_SESSIONS,'',false,$tantpis); + } else { + $repertoire = sous_repertoire(_DIR_SESSIONS, '', false, $tantpis); $c = $_COOKIE['spip_session']; - return $repertoire . intval($c) .'_' . md5($c.' '.$GLOBALS['meta'][$alea]). '.php'; + + return $repertoire . intval($c) . '_' . md5($c . ' ' . $GLOBALS['meta'][$alea]) . '.php'; } } @@ -547,9 +585,8 @@ function fichier_session($alea, $tantpis = false) { * * @return string */ -function rejouer_session() -{ - return '<img src="'.generer_url_action('cookie','change_session=oui', true).'" width="0" height="0" alt="" />'; +function rejouer_session() { + return '<img src="' . generer_url_action('cookie', 'change_session=oui', true) . '" width="0" height="0" alt="" />'; } @@ -559,9 +596,12 @@ function rejouer_session() * @return string */ function hash_env() { - static $res =''; - if ($res) return $res; - return $res = md5($GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '')); + static $res = ''; + if ($res) { + return $res; + } + + return $res = md5($GLOBALS['ip'] . (isset($_SERVER['HTTP_USER_AGENT']) ? $_SERVER['HTTP_USER_AGENT'] : '')); } @@ -571,11 +611,12 @@ function hash_env() { * @link http://php.net/manual/fr/function.session-start.php * @uses is_php_session_started() * @return bool True si une session PHP est ouverte. -**/ + **/ function spip_php_session_start() { if (!is_php_session_started()) { return session_start(); } + return true; } @@ -584,16 +625,17 @@ function spip_php_session_start() { * * @link http://php.net/manual/fr/function.session-status.php#113468 * @return bool true si une session PHP est active -**/ + **/ function is_php_session_started() { - if ( php_sapi_name() !== 'cli' ) { - if ( version_compare(phpversion(), '5.4.0', '>=') ) { - return session_status() === PHP_SESSION_ACTIVE ? TRUE : FALSE; + if (php_sapi_name() !== 'cli') { + if (version_compare(phpversion(), '5.4.0', '>=')) { + return session_status() === PHP_SESSION_ACTIVE ? true : false; } else { - return session_id() === '' ? FALSE : TRUE; + return session_id() === '' ? false : true; } } - return FALSE; + + return false; } ?> diff --git a/ecrire/inc/simplexml_to_array.php b/ecrire/inc/simplexml_to_array.php index a1989fba0d..7e398fb3d2 100644 --- a/ecrire/inc/simplexml_to_array.php +++ b/ecrire/inc/simplexml_to_array.php @@ -10,22 +10,25 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; - - +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Transforme un texte XML en tableau PHP + * * @param string|object $u * @param bool $utiliser_namespace * @return array */ -function inc_simplexml_to_array_dist($u, $utiliser_namespace = false){ +function inc_simplexml_to_array_dist($u, $utiliser_namespace = false) { // decoder la chaine en SimpleXML si pas deja fait - if (is_string($u)) + if (is_string($u)) { $u = simplexml_load_string($u); - return array('root'=>@xmlObjToArr($u, $utiliser_namespace)); + } + + return array('root' => @xmlObjToArr($u, $utiliser_namespace)); } @@ -37,7 +40,7 @@ function inc_simplexml_to_array_dist($u, $utiliser_namespace = false){ * @param object $obj * @param bool $utiliser_namespace * @return array -**/ + **/ function xmlObjToArr($obj, $utiliser_namespace = false) { $tableau = array(); @@ -45,29 +48,29 @@ function xmlObjToArr($obj, $utiliser_namespace = false) { // Cette fonction getDocNamespaces() est longue sur de gros xml. On permet donc // de l'activer ou pas suivant le contenu supposé du XML if (is_object($obj)) { - if (is_array($utiliser_namespace)){ + if (is_array($utiliser_namespace)) { $namespace = $utiliser_namespace; - } - else { - if ($utiliser_namespace) + } else { + if ($utiliser_namespace) { $namespace = $obj->getDocNamespaces(true); - $namespace[NULL] = NULL; + } + $namespace[null] = null; } $name = strtolower((string)$obj->getName()); $text = trim((string)$obj); if (strlen($text) <= 0) { - $text = NULL; + $text = null; } $children = array(); $attributes = array(); // get info for all namespaces - foreach( $namespace as $ns=>$nsUrl ) { + foreach ($namespace as $ns => $nsUrl) { // attributes $objAttributes = $obj->attributes($ns, true); - foreach( $objAttributes as $attributeName => $attributeValue ) { + foreach ($objAttributes as $attributeName => $attributeValue) { $attribName = strtolower(trim((string)$attributeName)); $attribVal = trim((string)$attributeValue); if (!empty($ns)) { @@ -78,24 +81,27 @@ function xmlObjToArr($obj, $utiliser_namespace = false) { // children $objChildren = $obj->children($ns, true); - foreach( $objChildren as $childName=>$child ) { + foreach ($objChildren as $childName => $child) { $childName = strtolower((string)$childName); - if( !empty($ns) ) { - $childName = $ns.':'.$childName; + if (!empty($ns)) { + $childName = $ns . ':' . $childName; } $children[$childName][] = xmlObjToArr($child, $namespace); } } $tableau = array( - 'name'=>$name, + 'name' => $name, ); - if ($text) + if ($text) { $tableau['text'] = $text; - if ($attributes) + } + if ($attributes) { $tableau['attributes'] = $attributes; - if ($children) + } + if ($children) { $tableau['children'] = $children; + } } return $tableau; diff --git a/ecrire/inc/surligne.php b/ecrire/inc/surligne.php index 130981a50a..ebe17fd35a 100644 --- a/ecrire/inc/surligne.php +++ b/ecrire/inc/surligne.php @@ -14,20 +14,24 @@ * Gestion du surlignage des mots d'une recherche * * @package SPIP\Core\Surligne -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Ancien marqueur de début de surlignement + * * @see balise_DEBUT_SURLIGNE_dist() * @deprecated N'a plus d'effet -**/ + **/ define('MARQUEUR_SURLIGNE', 'debut_surligneconditionnel'); /** * Ancien marqueur de fin de surlignement + * * @see balise_FIN_SURLIGNE_dist() * @deprecated N'a plus d'effet -**/ + **/ define('MARQUEUR_FSURLIGNE', 'finde_surligneconditionnel'); @@ -45,10 +49,13 @@ define('MARQUEUR_FSURLIGNE', 'finde_surligneconditionnel'); * Mots à surligner transmis * @return string * Page HTML -**/ + **/ function surligner_mots($page, $surcharge_surligne = '') { $surlignejs_engines = array( - array(",".str_replace(array("/", "."), array("\/", "\."), $GLOBALS['meta']['adresse_site']).",i", ",recherche=([^&]+),i"), //SPIP + array( + "," . str_replace(array("/", "."), array("\/", "\."), $GLOBALS['meta']['adresse_site']) . ",i", + ",recherche=([^&]+),i" + ), //SPIP array(",^http://(www\.)?google\.,i", ",q=([^&]+),i"), // Google array(",^http://(www\.)?search\.yahoo\.,i", ",p=([^&]+),i"), // Yahoo array(",^http://(www\.)?search\.msn\.,i", ",q=([^&]+),i"), // MSN @@ -65,35 +72,37 @@ function surligner_mots($page, $surcharge_surligne = '') { $ref = $_SERVER['HTTP_REFERER']; //avoid a js injection - if ($surcharge_surligne){ + if ($surcharge_surligne) { $surcharge_surligne = preg_replace(",(?<!\\\\)((?:(?>\\\\){2})*)('),", "$1\\\\$2", $surcharge_surligne); $surcharge_surligne = str_replace("\\", "\\\\", $surcharge_surligne); - if ($GLOBALS['meta']['charset']=='utf-8'){ + if ($GLOBALS['meta']['charset'] == 'utf-8') { include_spip('inc/charsets'); - if (!is_utf8($surcharge_surligne)) $surcharge_surligne = utf8_encode($surcharge_surligne); + if (!is_utf8($surcharge_surligne)) { + $surcharge_surligne = utf8_encode($surcharge_surligne); + } } $surcharge_surligne = preg_replace(',\*$,', '', trim($surcharge_surligne)); # supprimer un * final } - foreach ($surlignejs_engines as $engine) - if ($surcharge_surligne || (preg_match($engine[0], $ref) && preg_match($engine[1], $ref))){ + foreach ($surlignejs_engines as $engine) { + if ($surcharge_surligne || (preg_match($engine[0], $ref) && preg_match($engine[1], $ref))) { //good referrer found or var_recherche is not null include_spip('inc/filtres'); $script = " - <script type='text/javascript' src='".url_absolue(find_in_path('javascript/SearchHighlight.js'))."'></script> + <script type='text/javascript' src='" . url_absolue(find_in_path('javascript/SearchHighlight.js')) . "'></script> <script type='text/javascript'>/*<![CDATA[*/ if (window.jQuery) (function(\$){\$(function(){ \$(document).SearchHighlight({ - tag_name:'".(html5_permis() ? 'mark' : 'span')."', + tag_name:'" . (html5_permis() ? 'mark' : 'span') . "', style_name:'spip_surligne', exact:'whole', style_name_suffix:false, - engines:[/^".str_replace(array("/", "."), array("\/", "\."), $GLOBALS['meta']['adresse_site'])."/i,/recherche=([^&]+)/i], + engines:[/^" . str_replace(array("/", "."), array("\/", "\."), $GLOBALS['meta']['adresse_site']) . "/i,/recherche=([^&]+)/i], highlight:'.surlignable', - nohighlight:'.pas_surlignable'". - ($surcharge_surligne ? ", - keys:'$surcharge_surligne'" : "").", + nohighlight:'.pas_surlignable'" . + ($surcharge_surligne ? ", + keys:'$surcharge_surligne'" : "") . ", min_length: 3 }) }); @@ -101,11 +110,14 @@ function surligner_mots($page, $surcharge_surligne = '') { /*]]>*/</script> "; // on l'insere juste avant </head>, sinon tout en bas - if (is_null($l = strpos($page, '</head>'))) + if (is_null($l = strpos($page, '</head>'))) { $l = strlen($page); + } $page = substr_replace($page, $script, $l, 0); break; } + } + return $page; } diff --git a/ecrire/inc/texte.php b/ecrire/inc/texte.php index 0b55d7c614..fd5b2ec901 100644 --- a/ecrire/inc/texte.php +++ b/ecrire/inc/texte.php @@ -14,9 +14,11 @@ * Gestion des textes et raccourcis SPIP * * @package SPIP\Core\Texte -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/texte_mini'); include_spip('inc/lien'); @@ -28,10 +30,11 @@ include_spip('inc/lien'); /** * Raccourcis dépendant du sens de la langue + * * @return array Tablea ('','') */ -function definir_raccourcis_alineas(){ - return array('',''); +function definir_raccourcis_alineas() { + return array('', ''); } @@ -39,7 +42,7 @@ function definir_raccourcis_alineas(){ * Traitement des raccourcis de tableaux * * Ne fait rien ici. Voir plugin Textwheel. - * + * * @param sring $bloc * @return string */ @@ -53,11 +56,11 @@ function traiter_tableau($bloc) { * * Ne fais rien. Voir Plugin Textwheel. * (merci a Michael Parienti) - * + * * @param string $texte * @return string */ -function traiter_listes ($texte) { +function traiter_listes($texte) { return $texte; } @@ -65,10 +68,10 @@ function traiter_listes ($texte) { * Nettoie un texte, traite les raccourcis autre qu'URL, la typo, etc. * * Ne fais rien ici. Voir plugin Textwheel. - * + * * @pipeline_appel pre_propre * @pipeline_appel post_propre - * + * * @param string $letexte * @return string */ @@ -99,64 +102,71 @@ function traiter_raccourcis($letexte) { * @return string */ function echappe_js($t, $class = ' class = "echappe-js"') { - foreach(array('script','iframe') as $tag){ - if (stripos($t,"<$tag")!==false - AND preg_match_all(',<'.$tag.'.*?($|</'.$tag.'.),isS', $t, $r, PREG_SET_ORDER)){ - foreach ($r as $regs) + foreach (array('script', 'iframe') as $tag) { + if (stripos($t, "<$tag") !== false + AND preg_match_all(',<' . $tag . '.*?($|</' . $tag . '.),isS', $t, $r, PREG_SET_ORDER) + ) { + foreach ($r as $regs) { $t = str_replace($regs[0], - "<code$class>".nl2br(spip_htmlspecialchars($regs[0])).'</code>', + "<code$class>" . nl2br(spip_htmlspecialchars($regs[0])) . '</code>', $t); + } } } + return $t; } - /** * Empêcher l'exécution de code PHP et JS * * Sécurité : empêcher l'exécution de code PHP, en le transformant en joli code * dans l'espace privé. Cette fonction est aussi appelée par propre et typo. - * + * * De la même manière, la fonction empêche l'exécution de JS mais selon le mode * de protection déclaré par la globale filtrer_javascript : * - -1 : protection dans l'espace privé et public * - 0 : protection dans l'espace public * - 1 : aucune protection - * + * * Il ne faut pas désactiver globalement la fonction dans l'espace privé car elle protège * aussi les balises des squelettes qui ne passent pas forcement par propre ou typo après * si elles sont appelées en direct - * + * * @param string $arg * Code à protéger * @return string * Code protégé -**/ + **/ function interdire_scripts($arg) { // on memorise le resultat sur les arguments non triviaux static $dejavu = array(); // Attention, si ce n'est pas une chaine, laisser intact - if (!$arg OR !is_string($arg) OR !strstr($arg, '<')) return $arg; + if (!$arg OR !is_string($arg) OR !strstr($arg, '<')) { + return $arg; + } - if (isset($dejavu[$GLOBALS['filtrer_javascript']][$arg])) return $dejavu[$GLOBALS['filtrer_javascript']][$arg]; + if (isset($dejavu[$GLOBALS['filtrer_javascript']][$arg])) { + return $dejavu[$GLOBALS['filtrer_javascript']][$arg]; + } // echapper les tags asp/php - $t = str_replace('<'.'%', '<%', $arg); + $t = str_replace('<' . '%', '<%', $arg); // echapper le php - $t = str_replace('<'.'?', '<?', $t); + $t = str_replace('<' . '?', '<?', $t); // echapper le < script language=php > $t = preg_replace(',<(script\b[^>]+\blanguage\b[^\w>]+php\b),UimsS', '<\1', $t); // Pour le js, trois modes : parano (-1), prive (0), ok (1) - switch($GLOBALS['filtrer_javascript']) { + switch ($GLOBALS['filtrer_javascript']) { case 0: - if (!_DIR_RESTREINT) + if (!_DIR_RESTREINT) { $t = echappe_js($t); + } break; case -1: $t = echappe_js($t); @@ -167,10 +177,12 @@ function interdire_scripts($arg) { $t = preg_replace(',<(base\b),iS', '<\1', $t); // Reinserer les echappements des modeles - if (defined('_PROTEGE_JS_MODELES')) - $t = echappe_retour($t,"javascript"._PROTEGE_JS_MODELES); - if (defined('_PROTEGE_PHP_MODELES')) - $t = echappe_retour($t,"php"._PROTEGE_PHP_MODELES); + if (defined('_PROTEGE_JS_MODELES')) { + $t = echappe_retour($t, "javascript" . _PROTEGE_JS_MODELES); + } + if (defined('_PROTEGE_PHP_MODELES')) { + $t = echappe_retour($t, "php" . _PROTEGE_PHP_MODELES); + } return $dejavu[$GLOBALS['filtrer_javascript']][$arg] = $t; } @@ -187,8 +199,8 @@ function interdire_scripts($arg) { * @uses traiter_modeles() * @uses corriger_typo() * @uses echapper_faux_tags() - * @see propre() - * + * @see propre() + * * @param string $letexte * Texte d'origine * @param bool $echapper @@ -199,10 +211,12 @@ function interdire_scripts($arg) { * Environnement (pour les calculs de modèles) * @return string $t * Texte transformé -**/ + **/ function typo($letexte, $echapper = true, $connect = null, $env = array()) { // Plus vite ! - if (!$letexte) return $letexte; + if (!$letexte) { + return $letexte; + } // les appels directs a cette fonction depuis le php de l'espace // prive etant historiquement ecrit sans argment $connect @@ -211,15 +225,16 @@ function typo($letexte, $echapper = true, $connect = null, $env = array()) { // les appels dans les squelettes (de l'espace prive) fournissant un $connect // ne seront pas perturbes $interdire_script = false; - if (is_null($connect)){ + if (is_null($connect)) { $connect = ''; $interdire_script = true; $env['espace_prive'] = test_espace_prive(); } // Echapper les codes <html> etc - if ($echapper) + if ($echapper) { $letexte = echappe_html($letexte, 'TYPO'); + } // // Installer les modeles, notamment images et documents ; @@ -228,23 +243,27 @@ function typo($letexte, $echapper = true, $connect = null, $env = array()) { // cf. inc/lien $letexte = traiter_modeles($mem = $letexte, false, $echapper ? 'TYPO' : '', $connect, null, $env); - if ($letexte != $mem) $echapper = true; + if ($letexte != $mem) { + $echapper = true; + } unset($mem); $letexte = corriger_typo($letexte); $letexte = echapper_faux_tags($letexte); // reintegrer les echappements - if ($echapper) + if ($echapper) { $letexte = echappe_retour($letexte, 'TYPO'); + } // Dans les appels directs hors squelette, securiser ici aussi - if ($interdire_script) + if ($interdire_script) { $letexte = interdire_scripts($letexte); + } // Dans l'espace prive on se mefie de tout contenu dangereux // https://core.spip.net/issues/3371 - if (isset($env['espace_prive']) AND $env['espace_prive']){ + if (isset($env['espace_prive']) AND $env['espace_prive']) { $letexte = echapper_html_suspect($letexte); } @@ -255,18 +274,18 @@ function typo($letexte, $echapper = true, $connect = null, $env = array()) { define('_TYPO_PROTEGER', "!':;?~%-"); define('_TYPO_PROTECTEUR', "\x1\x2\x3\x4\x5\x6\x7\x8"); -define('_TYPO_BALISE', ",</?[a-z!][^<>]*[".preg_quote(_TYPO_PROTEGER)."][^<>]*>,imsS"); +define('_TYPO_BALISE', ",</?[a-z!][^<>]*[" . preg_quote(_TYPO_PROTEGER) . "][^<>]*>,imsS"); /** * Corrige la typographie * * Applique les corrections typographiques adaptées à la langue indiquée. - * + * * @pipeline_appel pre_typo * @pipeline_appel post_typo * @uses corriger_caracteres() * @uses corriger_caracteres() - * + * * @param string $letexte Texte * @param string $lang Langue * @return string Texte @@ -274,7 +293,9 @@ define('_TYPO_BALISE', ",</?[a-z!][^<>]*[".preg_quote(_TYPO_PROTEGER)."][^<>]*>, function corriger_typo($letexte, $lang = '') { // Plus vite ! - if (!$letexte) return $letexte; + if (!$letexte) { + return $letexte; + } $letexte = pipeline('pre_typo', $letexte); @@ -301,7 +322,9 @@ function corriger_typo($letexte, $lang = '') { $letexte = $typographie($letexte); // Les citations en une autre langue, s'il y a lieu - if (!$e) $letexte = echappe_retour($letexte, 'multi'); + if (!$e) { + $letexte = echappe_retour($letexte, 'multi'); + } // Retablir les caracteres proteges $letexte = strtr($letexte, _TYPO_PROTECTEUR, _TYPO_PROTEGER); @@ -320,9 +343,9 @@ function corriger_typo($letexte, $lang = '') { * Paragrapher seulement * * /!\ appelée dans inc/filtres et public/composer - * + * * Ne fait rien ici. Voir plugin Textwheel - * + * * @param string $letexte * @param null $forcer * @return string @@ -335,14 +358,15 @@ function paragrapher($letexte, $forcer = true) { * Harmonise les retours chariots et mange les paragraphes HTML * * Ne sert plus - * + * * @param string $letexte Texte * @return string Texte -**/ + **/ function traiter_retours_chariots($letexte) { $letexte = preg_replace(",\r\n?,S", "\n", $letexte); $letexte = preg_replace(",<p[>[:space:]],iS", "\n\n\\0", $letexte); $letexte = preg_replace(",</p[>[:space:]],iS", "\\0\n\n", $letexte); + return $letexte; } @@ -351,14 +375,14 @@ function traiter_retours_chariots($letexte) { * Transforme les raccourcis SPIP, liens et modèles d'un texte en code HTML * * Filtre à appliquer aux champs du type `#TEXTE*` - * + * * @filtre * @uses echappe_html() * @uses expanser_liens() * @uses traiter_raccourcis() * @uses echappe_retour_modeles() - * @see typo() - * + * @see typo() + * * @param string $t * Texte avec des raccourcis SPIP * @param string|null $connect @@ -367,7 +391,7 @@ function traiter_retours_chariots($letexte) { * Environnement (pour les calculs de modèles) * @return string $t * Texte transformé -**/ + **/ function propre($t, $connect = null, $env = array()) { // les appels directs a cette fonction depuis le php de l'espace // prive etant historiquement ecrits sans argment $connect @@ -376,15 +400,17 @@ function propre($t, $connect = null, $env = array()) { // les appels dans les squelettes (de l'espace prive) fournissant un $connect // ne seront pas perturbes $interdire_script = false; - if (is_null($connect)){ + if (is_null($connect)) { $connect = ''; $interdire_script = true; } - if (!$t) return strval($t); + if (!$t) { + return strval($t); + } $t = echappe_html($t); - $t = expanser_liens($t,$connect, $env); + $t = expanser_liens($t, $connect, $env); $t = traiter_raccourcis($t); $t = echappe_retour_modeles($t, $interdire_script); diff --git a/ecrire/inc/texte_mini.php b/ecrire/inc/texte_mini.php index 413db78312..6f06969979 100644 --- a/ecrire/inc/texte_mini.php +++ b/ecrire/inc/texte_mini.php @@ -14,9 +14,11 @@ * Gestion des textes et échappements (fonctions d'usages fréquents) * * @package SPIP\Core\Texte -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/filtres'); include_spip('inc/lang'); @@ -26,15 +28,15 @@ include_spip('inc/lang'); * * Le nom de l'image est déterminé par la globale 'puce' ou 'puce_prive' * ou les mêmes suffixées de '_rtl' pour ce type de langues. - * + * * @note * On initialise la puce pour éviter `find_in_path()` à chaque rencontre de `\n-` * Mais attention elle depend de la direction et de X_fonctions.php, ainsi que * de l'espace choisi (public/prive) - * + * * @return string * Code HTML de la puce -**/ + **/ function definir_puce() { // Attention au sens, qui n'est pas defini de la meme facon dans @@ -43,13 +45,16 @@ function definir_puce() { $dir = _DIR_RESTREINT ? lang_dir() : lang_dir($GLOBALS['spip_lang']); $p = 'puce' . (test_espace_prive() ? '_prive' : ''); - if ($dir == 'rtl') $p .= '_rtl'; + if ($dir == 'rtl') { + $p .= '_rtl'; + } if (!isset($GLOBALS[$p])) { - $img = find_in_path($p.'.gif'); - list(,,,$size) = @getimagesize($img); - $GLOBALS[$p] = '<img src="'.$img.'" '.$size.' class="puce" alt="-" />'; + $img = find_in_path($p . '.gif'); + list(, , , $size) = @getimagesize($img); + $GLOBALS[$p] = '<img src="' . $img . '" ' . $size . ' class="puce" alt="-" />'; } + return $GLOBALS[$p]; } @@ -57,12 +62,15 @@ function definir_puce() { // XHTML - Preserver les balises-bloc : on liste ici tous les elements // dont on souhaite qu'ils provoquent un saut de paragraphe -if (!defined('_BALISES_BLOCS')) define('_BALISES_BLOCS', +if (!defined('_BALISES_BLOCS')) { + define('_BALISES_BLOCS', 'address|applet|article|aside|blockquote|button|center|d[ltd]|div|fieldset|fig(ure|caption)|footer|form|h[1-6r]|hgroup|head|header|iframe|li|map|marquee|nav|noscript|object|ol|pre|section|t(able|[rdh]|body|foot|extarea)|ul|script|style' -); + ); +} -if (!defined('_BALISES_BLOCS_REGEXP')) - define('_BALISES_BLOCS_REGEXP',',</?('._BALISES_BLOCS.')[>[:space:]],iS'); +if (!defined('_BALISES_BLOCS_REGEXP')) { + define('_BALISES_BLOCS_REGEXP', ',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS'); +} // // Echapper les elements perilleux en les passant en base64 @@ -72,17 +80,20 @@ if (!defined('_BALISES_BLOCS_REGEXP')) // une $source differente ; le script detecte automagiquement si ce qu'on // echappe est un div ou un span // http://code.spip.net/@code_echappement -function code_echappement($rempl, $source = '', $no_transform = false, $mode = NULL) { - if (!strlen($rempl)) return ''; +function code_echappement($rempl, $source = '', $no_transform = false, $mode = null) { + if (!strlen($rempl)) { + return ''; + } // Tester si on echappe en span ou en div - if (is_null($mode) OR !in_array($mode,array('div','span'))) - $mode = preg_match(',</?('._BALISES_BLOCS.')[>[:space:]],iS', $rempl) ? 'div' : 'span'; + if (is_null($mode) OR !in_array($mode, array('div', 'span'))) { + $mode = preg_match(',</?(' . _BALISES_BLOCS . ')[>[:space:]],iS', $rempl) ? 'div' : 'span'; + } // Decouper en morceaux, base64 a des probleme selon la taille de la pile $taille = 30000; $return = ""; - for($i = 0; $i < strlen($rempl); $i += $taille) { + for ($i = 0; $i < strlen($rempl); $i += $taille) { // Convertir en base64 et cacher dans un attribut // utiliser les " pour eviter le re-encodage de ' et ’ $base64 = base64_encode(substr($rempl, $i, $taille)); @@ -103,24 +114,25 @@ function traiter_echap_html_dist($regs) { // Echapper les <code>...</ code> // http://code.spip.net/@traiter_echap_code_dist function traiter_echap_code_dist($regs) { - list(,,$att,$corps) = $regs; + list(, , $att, $corps) = $regs; $echap = spip_htmlspecialchars($corps); // il ne faut pas passer dans entites_html, ne pas transformer les &#xxx; du code ! // ne pas mettre le <div...> s'il n'y a qu'une ligne - if (is_int(strpos($echap,"\n"))) { + if (is_int(strpos($echap, "\n"))) { // supprimer les sauts de ligne debut/fin // (mais pas les espaces => ascii art). $echap = preg_replace("/^[\n\r]+|[\n\r]+$/s", "", $echap); $echap = nl2br($echap); $echap = "<div style='text-align: left;' " - . "class='spip_code' dir='ltr'><code$att>" - .$echap."</code></div>"; + . "class='spip_code' dir='ltr'><code$att>" + . $echap . "</code></div>"; } else { - $echap = "<code$att class='spip_code' dir='ltr'>".$echap."</code>"; + $echap = "<code$att class='spip_code' dir='ltr'>" . $echap . "</code>"; } $echap = str_replace("\t", " ", $echap); $echap = str_replace(" ", " ", $echap); + return $echap; } @@ -129,14 +141,17 @@ function traiter_echap_code_dist($regs) { function traiter_echap_cadre_dist($regs) { $echap = trim(entites_html($regs[3])); // compter les lignes un peu plus finement qu'avec les \n - $lignes = explode("\n",trim($echap)); + $lignes = explode("\n", trim($echap)); $n = 0; - foreach($lignes as $l) - $n+=floor(strlen($l)/60)+1; - $n = max($n,2); + foreach ($lignes as $l) { + $n += floor(strlen($l)/60)+1; + } + $n = max($n, 2); $echap = "\n<textarea readonly='readonly' cols='40' rows='$n' class='spip_cadre' dir='ltr'>$echap</textarea>"; + return $echap; } + // http://code.spip.net/@traiter_echap_frame_dist function traiter_echap_frame_dist($regs) { return traiter_echap_cadre_dist($regs); @@ -145,8 +160,9 @@ function traiter_echap_frame_dist($regs) { // http://code.spip.net/@traiter_echap_script_dist function traiter_echap_script_dist($regs) { // rendre joli (et inactif) si c'est un script language=php - if (preg_match(',<script\b[^>]+php,ims', $regs[0])) - return highlight_string($regs[0],true); + if (preg_match(',<script\b[^>]+php,ims', $regs[0])) { + return highlight_string($regs[0], true); + } // Cas normal : le script passe tel quel return $regs[0]; @@ -157,54 +173,68 @@ define('_PROTEGE_BLOCS', ',<(html|code|cadre|frame|script|style)(\s[^>]*)?>(.*)< // - pour $source voir commentaire infra (echappe_retour) // - pour $no_transform voir le filtre post_autobr dans inc/filtres // http://code.spip.net/@echappe_html -function echappe_html($letexte, $source = '', $no_transform = false, -$preg='') { - if (!is_string($letexte) or !strlen($letexte)) +function echappe_html( + $letexte, + $source = '', + $no_transform = false, + $preg = '' +) { + if (!is_string($letexte) or !strlen($letexte)) { return $letexte; + } // si le texte recu est long PCRE risque d'exploser, on // fait donc un mic-mac pour augmenter pcre.backtrack_limit if (($len = strlen($letexte)) > 100000) { - if (!$old = @ini_get('pcre.backtrack_limit')) $old = 100000; + if (!$old = @ini_get('pcre.backtrack_limit')) { + $old = 100000; + } if ($len > $old) { $a = @ini_set('pcre.backtrack_limit', $len); spip_log("ini_set pcre.backtrack_limit=$len ($old)"); } } - if (($preg OR strpos($letexte,"<")!==false) - AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER)) { + if (($preg OR strpos($letexte, "<") !== false) + AND preg_match_all($preg ? $preg : _PROTEGE_BLOCS, $letexte, $matches, PREG_SET_ORDER) + ) { foreach ($matches as $regs) { // echappements tels quels ? if ($no_transform) { $echap = $regs[0]; + } // sinon les traiter selon le cas + else { + if (function_exists($f = 'traiter_echap_' . strtolower($regs[1]))) { + $echap = $f($regs); + } else { + if (function_exists($f = $f . '_dist')) { + $echap = $f($regs); + } + } } - // sinon les traiter selon le cas - else if (function_exists($f = 'traiter_echap_'.strtolower($regs[1]))) - $echap = $f($regs); - else if (function_exists($f = $f.'_dist')) - $echap = $f($regs); - - $p = strpos($letexte,$regs[0]); - $letexte = substr_replace($letexte,code_echappement($echap, $source, $no_transform),$p,strlen($regs[0])); + $p = strpos($letexte, $regs[0]); + $letexte = substr_replace($letexte, code_echappement($echap, $source, $no_transform), $p, strlen($regs[0])); } } - if ($no_transform) + if ($no_transform) { return $letexte; + } // Echapper le php pour faire joli (ici, c'est pas pour la securite) // seulement si on a echappe les <script> // (derogatoire car on ne peut pas faire passer < ? ... ? > // dans une callback autonommee - if (strpos($preg ? $preg : _PROTEGE_BLOCS,'script')!==false){ - if (strpos($letexte,"<"."?")!==false AND preg_match_all(',<[?].*($|[?]>),UisS', - $letexte, $matches, PREG_SET_ORDER)) - foreach ($matches as $regs) { - $letexte = str_replace($regs[0], - code_echappement(highlight_string($regs[0],true), $source), - $letexte); + if (strpos($preg ? $preg : _PROTEGE_BLOCS, 'script') !== false) { + if (strpos($letexte, "<" . "?") !== false AND preg_match_all(',<[?].*($|[?]>),UisS', + $letexte, $matches, PREG_SET_ORDER) + ) { + foreach ($matches as $regs) { + $letexte = str_replace($regs[0], + code_echappement(highlight_string($regs[0], true), $source), + $letexte); + } } } @@ -217,45 +247,50 @@ $preg='') { // par propre() : exemple dans multi et dans typo() // http://code.spip.net/@echappe_retour function echappe_retour($letexte, $source = '', $filtre = "") { - if (strpos($letexte,"base64$source")) { + if (strpos($letexte, "base64$source")) { # spip_log(spip_htmlspecialchars($letexte)); ## pour les curieux $max_prof = 5; - while (strpos($letexte,"<")!==false + while (strpos($letexte, "<") !== false AND - preg_match_all(',<(span|div)\sclass=[\'"]base64'.$source.'[\'"]\s(.*)>\s*</\1>,UmsS', - $letexte, $regs, PREG_SET_ORDER) - AND $max_prof--) { + preg_match_all(',<(span|div)\sclass=[\'"]base64' . $source . '[\'"]\s(.*)>\s*</\1>,UmsS', + $letexte, $regs, PREG_SET_ORDER) + AND $max_prof--) { foreach ($regs as $reg) { $rempl = base64_decode(extraire_attribut($reg[0], 'title')); // recherche d'attributs supplementaires $at = array(); - foreach(array('lang', 'dir') as $attr) { - if ($a = extraire_attribut($reg[0], $attr)) + foreach (array('lang', 'dir') as $attr) { + if ($a = extraire_attribut($reg[0], $attr)) { $at[$attr] = $a; + } } if ($at) { - $rempl = '<'.$reg[1].'>'.$rempl.'</'.$reg[1].'>'; - foreach($at as $attr => $a) + $rempl = '<' . $reg[1] . '>' . $rempl . '</' . $reg[1] . '>'; + foreach ($at as $attr => $a) { $rempl = inserer_attribut($rempl, $attr, $a); + } + } + if ($filtre) { + $rempl = $filtre($rempl); } - if ($filtre) $rempl = $filtre($rempl); $letexte = str_replace($reg[0], $rempl, $letexte); } } } + return $letexte; } // Reinserer le javascript de confiance (venant des modeles) // http://code.spip.net/@echappe_retour_modeles -function echappe_retour_modeles($letexte, $interdire_scripts = false) -{ +function echappe_retour_modeles($letexte, $interdire_scripts = false) { $letexte = echappe_retour($letexte); // Dans les appels directs hors squelette, securiser aussi ici - if ($interdire_scripts) + if ($interdire_scripts) { $letexte = interdire_scripts($letexte); + } return trim($letexte); } @@ -274,7 +309,7 @@ function echappe_retour_modeles($letexte, $interdire_scripts = false) * * @filtre * @link http://www.spip.net/4275 - * + * * @param string $texte * Texte à couper * @param int $taille @@ -283,18 +318,23 @@ function echappe_retour_modeles($letexte, $interdire_scripts = false) * Points de suite ajoutés. * @return string * Texte coupé -**/ + **/ function couper($texte, $taille = 50, $suite = ' (...)') { - if (!($length=strlen($texte)) OR $taille <= 0) return ''; - $offset = 400 + 2*$taille; - while ($offset<$length - AND strlen(preg_replace(",<(!--|\w|/)[^>]+>,Uims","",substr($texte,0,$offset)))<$taille) + if (!($length = strlen($texte)) OR $taille <= 0) { + return ''; + } + $offset = 400+2*$taille; + while ($offset < $length + AND strlen(preg_replace(",<(!--|\w|/)[^>]+>,Uims", "", substr($texte, 0, $offset))) < $taille) { $offset = 2*$offset; - if ( $offset<$length - && ($p_tag_ouvrant = strpos($texte,'<',$offset))!==NULL){ - $p_tag_fermant = strpos($texte,'>',$offset); - if ($p_tag_fermant && ($p_tag_fermant<$p_tag_ouvrant)) - $offset = $p_tag_fermant+1; // prolonger la coupe jusqu'au tag fermant suivant eventuel + } + if ($offset < $length + && ($p_tag_ouvrant = strpos($texte, '<', $offset)) !== null + ) { + $p_tag_fermant = strpos($texte, '>', $offset); + if ($p_tag_fermant && ($p_tag_fermant < $p_tag_ouvrant)) { + $offset = $p_tag_fermant+1; + } // prolonger la coupe jusqu'au tag fermant suivant eventuel } $texte = substr($texte, 0, $offset); /* eviter de travailler sur 10ko pour extraire 150 caracteres */ @@ -304,51 +344,57 @@ function couper($texte, $taille = 50, $suite = ' (...)') { // sauts de ligne et paragraphes $texte = preg_replace("/\n\n+/", "\r", $texte); - $texte = preg_replace("/<(p|br)( [^>]*)?".">/", "\r", $texte); + $texte = preg_replace("/<(p|br)( [^>]*)?" . ">/", "\r", $texte); // supprimer les traits, lignes etc $texte = preg_replace("/(^|\r|\n)(-[-#\*]*|_ )/", "\r", $texte); // travailler en accents charset - $texte = unicode2charset(html2unicode($texte, /* secure */ true)); - if (!function_exists('nettoyer_raccourcis_typo')) + $texte = unicode2charset(html2unicode($texte, /* secure */ + true)); + if (!function_exists('nettoyer_raccourcis_typo')) { include_spip('inc/lien'); + } $texte = nettoyer_raccourcis_typo($texte); // supprimer les tags $texte = supprimer_tags($texte); - $texte = trim(str_replace("\n"," ", $texte)); - $texte .= "\n"; // marquer la fin + $texte = trim(str_replace("\n", " ", $texte)); + $texte .= "\n"; // marquer la fin // corriger la longueur de coupe // en fonction de la presence de caracteres utf - if ($GLOBALS['meta']['charset']=='utf-8'){ + if ($GLOBALS['meta']['charset'] == 'utf-8') { $long = charset2unicode($texte); - $long = spip_substr($long, 0, max($taille,1)); + $long = spip_substr($long, 0, max($taille, 1)); $nbcharutf = preg_match_all('/(&#[0-9]{3,6};)/S', $long, $matches); $taille += $nbcharutf; } // couper au mot precedent - $long = spip_substr($texte, 0, max($taille-4,1)); + $long = spip_substr($texte, 0, max($taille-4, 1)); $u = $GLOBALS['meta']['pcre_u']; - $court = preg_replace("/([^\s][\s]+)[^\s]*\n?$/".$u, "\\1", $long); + $court = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long); $points = $suite; // trop court ? ne pas faire de (...) - if (spip_strlen($court) < max(0.75 * $taille,2)) { + if (spip_strlen($court) < max(0.75*$taille, 2)) { $points = ''; $long = spip_substr($texte, 0, $taille); - $texte = preg_replace("/([^\s][\s]+)[^\s]*\n?$/".$u, "\\1", $long); + $texte = preg_replace("/([^\s][\s]+)[^\s]*\n?$/" . $u, "\\1", $long); // encore trop court ? couper au caractere - if (spip_strlen($texte) < 0.75 * $taille) + if (spip_strlen($texte) < 0.75*$taille) { $texte = $long; - } else + } + } else { $texte = $court; + } - if (strpos($texte, "\n")) // la fin est encore la : c'est qu'on n'a pas de texte de suite + if (strpos($texte, "\n")) // la fin est encore la : c'est qu'on n'a pas de texte de suite + { $points = ''; + } // remettre les paragraphes $texte = preg_replace("/\r+/", "\n\n", $texte); @@ -356,47 +402,52 @@ function couper($texte, $taille = 50, $suite = ' (...)') { // supprimer l'eventuelle entite finale mal coupee $texte = preg_replace('/&#?[a-z0-9]*$/S', '', $texte); - return quote_amp(trim($texte)).$points; + return quote_amp(trim($texte)) . $points; } // http://code.spip.net/@protege_js_modeles function protege_js_modeles($t) { - if (isset($GLOBALS['visiteur_session'])){ - if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)){ - if (!defined('_PROTEGE_JS_MODELES')){ + if (isset($GLOBALS['visiteur_session'])) { + if (preg_match_all(',<script.*?($|</script.),isS', $t, $r, PREG_SET_ORDER)) { + if (!defined('_PROTEGE_JS_MODELES')) { include_spip('inc/acces'); - define('_PROTEGE_JS_MODELES',creer_uniqid()); + define('_PROTEGE_JS_MODELES', creer_uniqid()); + } + foreach ($r as $regs) { + $t = str_replace($regs[0], code_echappement($regs[0], 'javascript' . _PROTEGE_JS_MODELES), $t); } - foreach ($r as $regs) - $t = str_replace($regs[0],code_echappement($regs[0],'javascript'._PROTEGE_JS_MODELES),$t); } - if (preg_match_all(',<\?php.*?($|\?'.'>),isS', $t, $r, PREG_SET_ORDER)){ - if (!defined('_PROTEGE_PHP_MODELES')){ + if (preg_match_all(',<\?php.*?($|\?' . '>),isS', $t, $r, PREG_SET_ORDER)) { + if (!defined('_PROTEGE_PHP_MODELES')) { include_spip('inc/acces'); - define('_PROTEGE_PHP_MODELES',creer_uniqid()); + define('_PROTEGE_PHP_MODELES', creer_uniqid()); + } + foreach ($r as $regs) { + $t = str_replace($regs[0], code_echappement($regs[0], 'php' . _PROTEGE_PHP_MODELES), $t); } - foreach ($r as $regs) - $t = str_replace($regs[0],code_echappement($regs[0],'php'._PROTEGE_PHP_MODELES),$t); } } + return $t; } -function echapper_faux_tags($letexte){ - if (strpos($letexte,'<')===false) +function echapper_faux_tags($letexte) { + if (strpos($letexte, '<') === false) { return $letexte; - $textMatches = preg_split (',(</?[a-z!][^<>]*>),', $letexte, null, PREG_SPLIT_DELIM_CAPTURE); - - $letexte = ""; - while (count($textMatches)) { - // un texte a echapper - $letexte .= str_replace("<",'<',array_shift($textMatches)); - // un tag html qui a servit a faite le split - $letexte .= array_shift($textMatches); - } - return $letexte; + } + $textMatches = preg_split(',(</?[a-z!][^<>]*>),', $letexte, null, PREG_SPLIT_DELIM_CAPTURE); + + $letexte = ""; + while (count($textMatches)) { + // un texte a echapper + $letexte .= str_replace("<", '<', array_shift($textMatches)); + // un tag html qui a servit a faite le split + $letexte .= array_shift($textMatches); + } + + return $letexte; } /** @@ -407,15 +458,16 @@ function echapper_faux_tags($letexte){ * @param string $texte * @return string */ -function echapper_html_suspect($texte){ - if (strpos($texte,'<')===false OR strpos($texte,'=')===false) +function echapper_html_suspect($texte) { + if (strpos($texte, '<') === false OR strpos($texte, '=') === false) { return $texte; + } // on teste sur strlen car safehtml supprime le contenu dangereux // mais il peut aussi changer des ' en " sur les attributs html, // donc un test d'egalite est trop strict - if (strlen(safehtml($texte))!==strlen($texte)){ - $texte = str_replace("<","<",$texte); + if (strlen(safehtml($texte)) !== strlen($texte)) { + $texte = str_replace("<", "<", $texte); } return $texte; @@ -423,7 +475,7 @@ function echapper_html_suspect($texte){ /** - * Sécurise un texte HTML + * Sécurise un texte HTML * * Échappe le code PHP et JS. * Applique en plus safehtml si un plugin le définit dans inc/safehtml.php @@ -432,28 +484,32 @@ function echapper_html_suspect($texte){ * * @filtre * @link http://www.spip.net/4310 - * + * * @param string $t * Texte à sécuriser * @return string * Texte sécurisé -**/ + **/ function safehtml($t) { static $safehtml; - if (!$t OR !is_string($t)) + if (!$t OR !is_string($t)) { return $t; + } # attention safehtml nettoie deux ou trois caracteres de plus. A voir - if (strpos($t,'<')===false) + if (strpos($t, '<') === false) { return str_replace("\x00", '', $t); + } $t = interdire_scripts($t); // jolifier le php $t = echappe_js($t); - if (!isset($safehtml)) + if (!isset($safehtml)) { $safehtml = charger_fonction('safehtml', 'inc', true); - if ($safehtml) + } + if ($safehtml) { $t = $safehtml($t); + } return interdire_scripts($t); // interdire le php (2 precautions) } @@ -468,16 +524,19 @@ function safehtml($t) { * * @todo * gérer les autres modèles ? - * + * * @param string $letexte * Texte à nettoyer * @param string|null $message * Message de remplacement pour chaque image enlevée * @return string * Texte sans les modèles d'image -**/ -function supprime_img($letexte, $message = NULL) { - if ($message===NULL) $message = '(' . _T('img_indisponible') . ')'; - return preg_replace(',<(img|doc|emb)([0-9]+)(\|([^>]*))?'.'\s*/?'.'>,i', + **/ +function supprime_img($letexte, $message = null) { + if ($message === null) { + $message = '(' . _T('img_indisponible') . ')'; + } + + return preg_replace(',<(img|doc|emb)([0-9]+)(\|([^>]*))?' . '\s*/?' . '>,i', $message, $letexte); } diff --git a/ecrire/inc/traduire.php b/ecrire/inc/traduire.php index 18838355df..f9b81fec24 100644 --- a/ecrire/inc/traduire.php +++ b/ecrire/inc/traduire.php @@ -14,20 +14,22 @@ * Outils pour la traduction et recherche de traductions * * @package SPIP\Core\Traductions -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Rechercher tous les lang/file dans le path * qui seront ensuite chargés dans l'ordre du path - * + * * Version dédiée et optimisée pour cet usage de find_in_path * * @see find_in_path() - * + * * @staticvar array $dirs - * + * * @param string $file * Nom du fichier cherché, tel que `mots_fr.php` * @param string $dirname @@ -35,18 +37,20 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return array * Liste des fichiers de langue trouvés, dans l'ordre des chemins */ -function find_langs_in_path ($file, $dirname = 'lang') { - static $dirs=array(); +function find_langs_in_path($file, $dirname = 'lang') { + static $dirs = array(); $liste = array(); - foreach(creer_chemin() as $dir) { - if (!isset($dirs[$a = $dir . $dirname])) - $dirs[$a] = (is_dir($a) || !$a) ; + foreach (creer_chemin() as $dir) { + if (!isset($dirs[$a = $dir . $dirname])) { + $dirs[$a] = (is_dir($a) || !$a); + } if ($dirs[$a]) { if (is_readable($a .= $file)) { $liste[] = $a; } } } + return array_reverse($liste); } @@ -60,20 +64,23 @@ function find_langs_in_path ($file, $dirname = 'lang') { * Paramètre optionnel uniquement si le module est `local` * @return array * Liste des fichiers touvés pour ce module et cette langue. -**/ + **/ function chercher_module_lang($module, $lang = '') { - if ($lang) - $lang = '_'.$lang; + if ($lang) { + $lang = '_' . $lang; + } // 1) dans un repertoire nomme lang/ se trouvant sur le chemin if ($f = ($module == 'local' - ? find_in_path($module.$lang.'.php', 'lang/') - : find_langs_in_path($module.$lang.'.php', 'lang/'))) - return is_array($f)?$f:array($f); + ? find_in_path($module . $lang . '.php', 'lang/') + : find_langs_in_path($module . $lang . '.php', 'lang/')) + ) { + return is_array($f) ? $f : array($f); + } // 2) directement dans le chemin (old style, uniquement pour local) return (($module == 'local') OR strpos($module, '/')) - ? (($f = find_in_path($module.$lang. '.php')) ? array($f):false) + ? (($f = find_in_path($module . $lang . '.php')) ? array($f) : false) : false; } @@ -87,16 +94,16 @@ function chercher_module_lang($module, $lang = '') { * * Définit la globale `idx_lang` qui sert à la lecture du fichier de langue * (include) et aux surcharges via `surcharger_langue()` - * + * * @uses chercher_module_lang() * @uses surcharger_langue() - * - * @param string $lang Code de langue - * @param string $module Nom du module de langue -**/ + * + * @param string $lang Code de langue + * @param string $module Nom du module de langue + **/ function charger_langue($lang, $module = 'spip') { if ($lang AND $fichiers_lang = chercher_module_lang($module, $lang)) { - $GLOBALS['idx_lang']='i18n_'.$module.'_'.$lang; + $GLOBALS['idx_lang'] = 'i18n_' . $module . '_' . $lang; include(array_shift($fichiers_lang)); surcharger_langue($fichiers_lang); } else { @@ -105,15 +112,16 @@ function charger_langue($lang, $module = 'spip') { // *par definition* doit exister, et on copie le tableau dans la // var liee a la langue $l = $GLOBALS['meta']['langue_site']; - if (!$fichiers_lang = chercher_module_lang($module, $l)) + if (!$fichiers_lang = chercher_module_lang($module, $l)) { $fichiers_lang = chercher_module_lang($module, _LANGUE_PAR_DEFAUT); + } if ($fichiers_lang) { - $GLOBALS['idx_lang']='i18n_'.$module.'_' .$l; + $GLOBALS['idx_lang'] = 'i18n_' . $module . '_' . $l; include(array_shift($fichiers_lang)); surcharger_langue($fichiers_lang); - $GLOBALS['i18n_'.$module.'_'.$lang] - = &$GLOBALS['i18n_'.$module.'_'.$l]; + $GLOBALS['i18n_' . $module . '_' . $lang] + = &$GLOBALS['i18n_' . $module . '_' . $l]; #spip_log("module de langue : ${module}_$l.php"); } } @@ -134,17 +142,23 @@ function charger_langue($lang, $module = 'spip') { * * @param array $fichiers * Liste des chemins de fichiers de langue à surcharger. -**/ + **/ function surcharger_langue($fichiers) { static $surcharges = array(); - if (!isset($GLOBALS['idx_lang'])) return; + if (!isset($GLOBALS['idx_lang'])) { + return; + } - if (!is_array($fichiers)) $fichiers = array($fichiers); - if (!count($fichiers)) return; - foreach($fichiers as $fichier){ + if (!is_array($fichiers)) { + $fichiers = array($fichiers); + } + if (!count($fichiers)) { + return; + } + foreach ($fichiers as $fichier) { if (!isset($surcharges[$fichier])) { $idx_lang_normal = $GLOBALS['idx_lang']; - $GLOBALS['idx_lang'] = $GLOBALS['idx_lang'].'@temporaire'; + $GLOBALS['idx_lang'] = $GLOBALS['idx_lang'] . '@temporaire'; include($fichier); $surcharges[$fichier] = $GLOBALS[$GLOBALS['idx_lang']]; unset ($GLOBALS[$GLOBALS['idx_lang']]); @@ -181,28 +195,29 @@ function surcharger_langue($fichiers) { * dans les globales `i18n_${module}_${lang}` tel que `i18n_mots_es` * et sont également sauvés dans la variable statique `deja_vu` * de cette fonction. - * + * * @uses charger_langue() * @uses chercher_module_lang() * @uses surcharger_langue() - * + * * @param string $ori * Clé de traduction, tel que `bouton_enregistrer` ou `mots:titre_mot` * @param string $lang * Code de langue, la traduction doit se faire si possible dans cette langue * @return string * Traduction demandée. Chaîne vide si aucune traduction trouvée. -**/ + **/ function inc_traduire_dist($ori, $lang) { static $deja_vu = array(); static $local = array(); - if (isset($deja_vu[$lang][$ori]) AND (_request('var_mode') != 'traduction')) + if (isset($deja_vu[$lang][$ori]) AND (_request('var_mode') != 'traduction')) { return $deja_vu[$lang][$ori]; + } // modules demandes explicitement <xxx|yyy|zzz:code> cf MODULES_IDIOMES - if (strpos($ori,':')) { - list($modules,$code) = explode(':',$ori,2); + if (strpos($ori, ':')) { + list($modules, $code) = explode(':', $ori, 2); $modules = explode('|', $modules); $ori_complet = $ori; } else { @@ -215,25 +230,28 @@ function inc_traduire_dist($ori, $lang) { $module_retenu = ''; // parcourir tous les modules jusqu'a ce qu'on trouve foreach ($modules as $module) { - $var = "i18n_".$module."_".$lang; + $var = "i18n_" . $module . "_" . $lang; if (empty($GLOBALS[$var])) { charger_langue($lang, $module); // surcharges persos -- on cherche // (lang/)local_xx.php et/ou (lang/)local.php ... - if (!isset($local['local_'.$lang])) { + if (!isset($local['local_' . $lang])) { // redéfinir la langue en cours pour les surcharges (chercher_langue a pu le changer) - $GLOBALS['idx_lang']= $var; + $GLOBALS['idx_lang'] = $var; // ... (lang/)local_xx.php - $local['local_'.$lang] = chercher_module_lang('local', $lang); + $local['local_' . $lang] = chercher_module_lang('local', $lang); + } + if ($local['local_' . $lang]) { + surcharger_langue($local['local_' . $lang]); } - if ($local['local_'.$lang]) - surcharger_langue($local['local_'.$lang]); // ... puis (lang/)local.php - if (!isset($local['local'])) + if (!isset($local['local'])) { $local['local'] = chercher_module_lang('local'); - if ($local['local']) + } + if ($local['local']) { surcharger_langue($local['local']); + } } if (isset($GLOBALS[$var][$code])) { @@ -247,43 +265,45 @@ function inc_traduire_dist($ori, $lang) { // on essaie d'abord la langue du site, puis a defaut la langue fr $langue_retenue = $lang; if (!strlen($text) - AND $lang !== _LANGUE_PAR_DEFAUT) { + AND $lang !== _LANGUE_PAR_DEFAUT + ) { if ($lang !== $GLOBALS['meta']['langue_site']) { $text = inc_traduire_dist($ori, $GLOBALS['meta']['langue_site']); $langue_retenue = (!strlen($text) ? $GLOBALS['meta']['langue_site'] : ''); - } - else { + } else { $text = inc_traduire_dist($ori, _LANGUE_PAR_DEFAUT); $langue_retenue = (!strlen($text) ? _LANGUE_PAR_DEFAUT : ''); } } // Supprimer la mention <NEW> ou <MODIF> - if (substr($text,0,1) === '<') + if (substr($text, 0, 1) === '<') { $text = str_replace(array('<NEW>', '<MODIF>'), array(), $text); + } // Si on n'est pas en utf-8, la chaine peut l'etre... // le cas echeant on la convertit en entites html &#xxx; if ((!isset($GLOBALS['meta']['charset']) OR $GLOBALS['meta']['charset'] !== 'utf-8') - AND preg_match(',[\x7f-\xff],S', $text)) { + AND preg_match(',[\x7f-\xff],S', $text) + ) { include_spip('inc/charsets'); - $text = charset2unicode($text,'utf-8'); + $text = charset2unicode($text, 'utf-8'); } if (_request('var_mode') == 'traduction') { - if ($text) { + if ($text) { $classe = 'debug-traduction' . ($module_retenu == 'ecrire' ? '-prive' : ''); $text = '<span lang=' . $langue_retenue . ' class=' . $classe . ' title=' . $ori_complet . '(' . $langue_retenue . ')>' . $text . '</span>'; $text = str_replace( - array("$module_retenu:", "$module_retenu|"), - array("*$module_retenu*:", "*$module_retenu*|"), - $text); + array("$module_retenu:", "$module_retenu|"), + array("*$module_retenu*:", "*$module_retenu*|"), + $text); } - } - else { + } else { $deja_vu[$lang][$ori] = $text; } return $text; } + ?> diff --git a/ecrire/inc/urls.php b/ecrire/inc/urls.php index 9b96fc199a..f7c78dc254 100644 --- a/ecrire/inc/urls.php +++ b/ecrire/inc/urls.php @@ -15,24 +15,26 @@ * Gestion des URLS * * @package SPIP\Core\URLs -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/objets'); /** * Décoder une URL en utilisant les fonctions inverses - * + * * Gère les URLs transformées par le htaccess. * * @note * `$renommer = 'urls_propres_dist';` * renvoie `array($contexte, $type, $url_redirect, $nfond)` - * + * * `$nfond` n'est retourné que si l'URL est définie apres le `?` * et risque d'être effacée par un form en get. * Elle est utilisée par form_hidden exclusivement. - * + * * Compat ascendante si le retour est NULL en gérant une sauvegarde/restauration * des globales modifiées par les anciennes fonctions * @@ -49,13 +51,13 @@ include_spip('base/objets'); * provenant du htaccess * @return array * Liste `$fond, $contexte, $url_redirect`. - * + * * Si l'url n'est pas valide, $fond restera à la valeur initiale passée. * Il suffit d'appeler la fonction sans $fond et de vérifier qu'à son retour celui-ci * est non vide pour vérifier une URL * */ -function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = false){ +function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = false) { static $current_base = null; // les anciennes fonctions modifient directement les globales @@ -68,74 +70,82 @@ function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = fa $GLOBALS['profondeur_url'] ); - if (is_null($current_base)){ + if (is_null($current_base)) { include_spip('inc/filtres_mini'); // le decodage des urls se fait toujours par rapport au site public - $current_base = url_absolue(_DIR_RACINE?_DIR_RACINE:'./'); + $current_base = url_absolue(_DIR_RACINE ? _DIR_RACINE : './'); + } + if (strncmp($url, $current_base, strlen($current_base)) == 0) { + $url = substr($url, strlen($current_base)); } - if (strncmp($url,$current_base,strlen($current_base))==0) - $url = substr($url,strlen($current_base)); // si on est en train d'assembler la page principale, // recuperer l'url depuis les globales url propres si fournies // sinon extraire la bonne portion d'url if ($assembler) { - if (isset($_SERVER['REDIRECT_url_propre'])) + if (isset($_SERVER['REDIRECT_url_propre'])) { $url = $_SERVER['REDIRECT_url_propre']; - elseif (isset($_ENV['url_propre'])) + } elseif (isset($_ENV['url_propre'])) { $url = $_ENV['url_propre']; - else { - $qs = explode("?",$url); + } else { + $qs = explode("?", $url); // ne prendre que le segment d'url qui correspond, en fonction de la profondeur calculee - $url = ltrim($qs[0],'/'); - $url = explode('/',$url); - while (count($url)>$GLOBALS['profondeur_url']+1) + $url = ltrim($qs[0], '/'); + $url = explode('/', $url); + while (count($url) > $GLOBALS['profondeur_url']+1) { array_shift($url); - $qs[0] = implode('/',$url); - $url = implode("?",$qs); + } + $qs[0] = implode('/', $url); + $url = implode("?", $qs); } } unset($_SERVER['REDIRECT_url_propre']); unset($_ENV['url_propre']); include_spip('inc/filtres_mini'); - if (strpos($url,"://")===false){ - $GLOBALS['profondeur_url'] = substr_count(ltrim(resolve_path("/$url"),'/'),'/'); - } - else { - $GLOBALS['profondeur_url'] = max(0,substr_count($url,"/")-substr_count($current_base,"/")); + if (strpos($url, "://") === false) { + $GLOBALS['profondeur_url'] = substr_count(ltrim(resolve_path("/$url"), '/'), '/'); + } else { + $GLOBALS['profondeur_url'] = max(0, substr_count($url, "/")-substr_count($current_base, "/")); } $url_redirect = ""; - $renommer = generer_url_entite('','','','',true); - if (!$renommer AND !function_exists('recuperer_parametres_url')) - $renommer = charger_fonction('page','urls'); // fallback pour decoder l'url + $renommer = generer_url_entite('', '', '', '', true); + if (!$renommer AND !function_exists('recuperer_parametres_url')) { + $renommer = charger_fonction('page', 'urls'); + } // fallback pour decoder l'url if ($renommer) { $a = $renommer($url, $fond, $contexte); if (is_array($a)) { list($ncontexte, $type, $url_redirect, $nfond) = array_pad($a, 4, null); - if ($url_redirect == $url) - $url_redirect = ""; // securite pour eviter une redirection infinie + if ($url_redirect == $url) { + $url_redirect = ""; + } // securite pour eviter une redirection infinie if ($assembler AND strlen($url_redirect)) { spip_log("Redirige $url vers $url_redirect"); include_spip('inc/headers'); redirige_par_entete($url_redirect, '', 301); } - if (isset($nfond)) + if (isset($nfond)) { $fond = $nfond; - else if ($fond == '' - OR $fond == 'type_urls' /* compat avec htaccess 2.0.0 */ - ) - $fond = $type; - if (isset($ncontexte)) + } else { + if ($fond == '' + OR $fond == 'type_urls' /* compat avec htaccess 2.0.0 */ + ) { + $fond = $type; + } + } + if (isset($ncontexte)) { $contexte = $ncontexte; - if (defined('_DEFINIR_CONTEXTE_TYPE') AND _DEFINIR_CONTEXTE_TYPE) + } + if (defined('_DEFINIR_CONTEXTE_TYPE') AND _DEFINIR_CONTEXTE_TYPE) { $contexte['type'] = $type; - if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') AND _DEFINIR_CONTEXTE_TYPE_PAGE) + } + if (defined('_DEFINIR_CONTEXTE_TYPE_PAGE') AND _DEFINIR_CONTEXTE_TYPE_PAGE) { $contexte['type-page'] = $type; + } } - } - // compatibilite <= 1.9.2 + } // compatibilite <= 1.9.2 elseif (function_exists('recuperer_parametres_url')) { $GLOBALS['fond'] = $fond; $GLOBALS['contexte'] = $contexte; @@ -145,8 +155,8 @@ function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = fa } // retablir les globales - list($GLOBALS['fond'],$GLOBALS['contexte'],$_SERVER['REDIRECT_url_propre'],$_ENV['url_propre'],$GLOBALS['profondeur_url']) = $save; - + list($GLOBALS['fond'], $GLOBALS['contexte'], $_SERVER['REDIRECT_url_propre'], $_ENV['url_propre'], $GLOBALS['profondeur_url']) = $save; + // vider les globales url propres qui ne doivent plus etre utilisees en cas // d'inversion url => objet // maintenir pour compat ? @@ -155,7 +165,7 @@ function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = fa # unset($_ENV['url_propre']); #} - return array($fond,$contexte,$url_redirect); + return array($fond, $contexte, $url_redirect); } @@ -168,27 +178,30 @@ function urls_decoder_url($url, $fond = '', $contexte = array(), $assembler = fa * pour utiliser en preg, ou un array() * @return string|array */ -function urls_liste_objets($preg = true){ +function urls_liste_objets($preg = true) { static $url_objets = null; - if (is_null($url_objets)){ + if (is_null($url_objets)) { $url_objets = array(); // recuperer les tables_objets_sql declarees $tables_objets = lister_tables_objets_sql(); - foreach($tables_objets as $t=>$infos){ + foreach ($tables_objets as $t => $infos) { if ($infos['page']) { $url_objets[] = $infos['type']; - $url_objets = array_merge($url_objets,$infos['type_surnoms']); + $url_objets = array_merge($url_objets, $infos['type_surnoms']); } } - $url_objets = pipeline('declarer_url_objets',$url_objets); + $url_objets = pipeline('declarer_url_objets', $url_objets); + } + if (!$preg) { + return $url_objets; } - if (!$preg) return $url_objets; - return implode('|',array_map('preg_quote',$url_objets)); + + return implode('|', array_map('preg_quote', $url_objets)); } /** * Nettoyer une URL, en repérant notamment les raccourcis d'objets - * + * * Repère les entités comme `?article13`, `?rubrique21` ... * les traduisant pour compléter le contexte fourni en entrée * @@ -196,29 +209,31 @@ function urls_liste_objets($preg = true){ * @param array $contexte * @return array */ -function nettoyer_url_page($url, $contexte = array()) -{ +function nettoyer_url_page($url, $contexte = array()) { $url_objets = urls_liste_objets(); - $raccourci_url_page_html = ',^(?:[^?]*/)?('. $url_objets . ')([0-9]+)(?:\.html)?([?&].*)?$,'; - $raccourci_url_page_id = ',^(?:[^?]*/)?('. $url_objets .')\.php3?[?]id_\1=([0-9]+)([?&].*)?$,'; - $raccourci_url_page_spip = ',^(?:[^?]*/)?(?:spip[.]php)?[?]('. $url_objets .')([0-9]+)=?(&.*)?$,'; + $raccourci_url_page_html = ',^(?:[^?]*/)?(' . $url_objets . ')([0-9]+)(?:\.html)?([?&].*)?$,'; + $raccourci_url_page_id = ',^(?:[^?]*/)?(' . $url_objets . ')\.php3?[?]id_\1=([0-9]+)([?&].*)?$,'; + $raccourci_url_page_spip = ',^(?:[^?]*/)?(?:spip[.]php)?[?](' . $url_objets . ')([0-9]+)=?(&.*)?$,'; if (preg_match($raccourci_url_page_html, $url, $regs) OR preg_match($raccourci_url_page_id, $url, $regs) - OR preg_match($raccourci_url_page_spip, $url, $regs)) { - $regs = array_pad($regs, 4, null); - $type = objet_type($regs[1]); - $_id = id_table_objet($type); - $contexte[$_id] = $regs[2]; - $suite = $regs[3]; - return array($contexte, $type, null, $type, $suite); + OR preg_match($raccourci_url_page_spip, $url, $regs) + ) { + $regs = array_pad($regs, 4, null); + $type = objet_type($regs[1]); + $_id = id_table_objet($type); + $contexte[$_id] = $regs[2]; + $suite = $regs[3]; + + return array($contexte, $type, null, $type, $suite); } + return array(); } /** * Générer l'URL d'un objet dans l'espace privé - * + * * L'URL est calculée en fonction de son état publié ou non, * calculé à partir de la déclaration de statut. * @@ -231,29 +246,35 @@ function nettoyer_url_page($url, $contexte = array()) * @return string * */ -function generer_url_ecrire_objet($objet, $id, $args = '', $ancre = '', $public = null, $connect = ''){ +function generer_url_ecrire_objet($objet, $id, $args = '', $ancre = '', $public = null, $connect = '') { static $furls = array(); - if (!isset($furls[$objet])){ + if (!isset($furls[$objet])) { if (function_exists($f = 'generer_url_ecrire_' . $objet) // ou definie par un plugin - OR $f = charger_fonction($f,'urls',true)) - $furls[$objet] = $f; - else + OR $f = charger_fonction($f, 'urls', true) + ) { + $furls[$objet] = $f; + } else { $furls[$objet] = ''; + } } - if ($furls[$objet]) + if ($furls[$objet]) { return $furls[$objet]($id, $args, $ancre, $public, $connect); + } // si pas de flag public fourni // le calculer en fonction de la declaration de statut - if (is_null($public) AND !$connect) + if (is_null($public) AND !$connect) { $public = objet_test_si_publie($objet, $id, $connect); - if ($public OR $connect){ + } + if ($public OR $connect) { return generer_url_entite_absolue($id, $objet, $args, $ancre, $connect); } $a = id_table_objet($objet) . "=" . intval($id); - if (!function_exists('objet_info')) + if (!function_exists('objet_info')) { include_spip('inc/filtres'); - return generer_url_ecrire(objet_info($objet,'url_voir'), $a . ($args ? "&$args" : '')). ($ancre ? "#$ancre" : ''); + } + + return generer_url_ecrire(objet_info($objet, 'url_voir'), $a . ($args ? "&$args" : '')) . ($ancre ? "#$ancre" : ''); } ?> diff --git a/ecrire/inc/utils.php b/ecrire/inc/utils.php index 55694bdd0b..12e005393b 100644 --- a/ecrire/inc/utils.php +++ b/ecrire/inc/utils.php @@ -14,9 +14,11 @@ * Utilitaires indispensables autour du serveur Http. * * @package SPIP\Core\Utilitaires -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -48,33 +50,49 @@ if (!defined('_ECRIRE_INC_VERSION')) return; function charger_fonction($nom, $dossier = 'exec', $continue = false) { static $echecs = array(); - if (strlen($dossier) AND substr($dossier,-1) != '/') $dossier .= '/'; - $f = str_replace('/','_',$dossier) . $nom; + if (strlen($dossier) AND substr($dossier, -1) != '/') { + $dossier .= '/'; + } + $f = str_replace('/', '_', $dossier) . $nom; - if (function_exists($f)) + if (function_exists($f)) { return $f; - if (function_exists($g = $f . '_dist')) + } + if (function_exists($g = $f . '_dist')) { return $g; + } - if (isset($echecs[$f])) return $echecs[$f]; + if (isset($echecs[$f])) { + return $echecs[$f]; + } // Sinon charger le fichier de declaration si plausible - if (!preg_match(',^\w+$,', $f)){ - if ($continue) return false; //appel interne, on passe - die(spip_htmlspecialchars($nom)." pas autorise"); + if (!preg_match(',^\w+$,', $f)) { + if ($continue) { + return false; + } //appel interne, on passe + die(spip_htmlspecialchars($nom) . " pas autorise"); } // passer en minuscules (cf les balises de formulaires) // et inclure le fichier - if (!$inc = include_spip($dossier.($d = strtolower($nom))) + if (!$inc = include_spip($dossier . ($d = strtolower($nom))) // si le fichier truc/machin/nom.php n'existe pas, // la fonction peut etre definie dans truc/machin.php qui regroupe plusieurs petites fonctions - AND strlen(dirname($dossier)) AND dirname($dossier)!='.') - include_spip(substr($dossier,0,-1)); - if (function_exists($f)) return $f; - if (function_exists($g)) return $g; + AND strlen(dirname($dossier)) AND dirname($dossier) != '.' + ) { + include_spip(substr($dossier, 0, -1)); + } + if (function_exists($f)) { + return $f; + } + if (function_exists($g)) { + return $g; + } - if ($continue) return $echecs[$f] = false; + if ($continue) { + return $echecs[$f] = false; + } // Echec : message d'erreur spip_log("fonction $nom ($f ou $g) indisponible" . @@ -82,21 +100,27 @@ function charger_fonction($nom, $dossier = 'exec', $continue = false) { include_spip('inc/minipres'); echo minipres(_T('forum_titre_erreur'), - _T('fichier_introuvable', array('fichier'=> '<b>'.spip_htmlentities($d).'</b>'))); + _T('fichier_introuvable', array('fichier' => '<b>' . spip_htmlentities($d) . '</b>'))); exit; } /** * Inclusion unique avec verification d'existence du fichier + log en crash sinon + * * @param string $file * @return bool */ -function include_once_check($file){ - if (file_exists($file)) {include_once $file;return true;} - $crash = (isset($GLOBALS['message_crash_plugins'])?unserialize($GLOBALS['message_crash_plugins']):''); - $crash = ($crash?$crash:array()); +function include_once_check($file) { + if (file_exists($file)) { + include_once $file; + + return true; + } + $crash = (isset($GLOBALS['message_crash_plugins']) ? unserialize($GLOBALS['message_crash_plugins']) : ''); + $crash = ($crash ? $crash : array()); $crash[$file] = true; - ecrire_meta('message_crash_plugins',serialize($crash)); + ecrire_meta('message_crash_plugins', serialize($crash)); + return false; } @@ -119,7 +143,7 @@ function include_once_check($file){ * @return string|bool * - false : fichier introuvable * - string : chemin du fichier trouvé -**/ + **/ function include_spip($f, $include = true) { return find_in_path($f . '.php', '', $include); } @@ -128,7 +152,7 @@ function include_spip($f, $include = true) { * Requiert un fichier PHP (en le cherchant dans les chemins) * * @uses find_in_path() - * @see include_spip() + * @see include_spip() * @example * ``` * require_spip('inc/texte'); @@ -139,7 +163,7 @@ function include_spip($f, $include = true) { * @return string|bool * - false : fichier introuvable * - string : chemin du fichier trouvé -**/ + **/ function require_spip($f) { return find_in_path($f . '.php', '', 'required'); } @@ -165,18 +189,23 @@ function require_spip($f) { * Les paramètres du pipeline, son environnement * @return string|array $val * Les paramètres du pipeline modifiés -**/ -function minipipe($fonc, &$val){ + **/ +function minipipe($fonc, &$val) { // fonction - if (function_exists($fonc)) + if (function_exists($fonc)) { $val = call_user_func($fonc, $val); - // Class::Methode - else if (preg_match("/^(\w*)::(\w*)$/S", $fonc, $regs) - AND $methode = array($regs[1], $regs[2]) - AND is_callable($methode)) - $val = call_user_func($methode, $val); - else - spip_log("Erreur - '$fonc' non definie !"); + } // Class::Methode + else { + if (preg_match("/^(\w*)::(\w*)$/S", $fonc, $regs) + AND $methode = array($regs[1], $regs[2]) + AND is_callable($methode) + ) { + $val = call_user_func($methode, $val); + } else { + spip_log("Erreur - '$fonc' non definie !"); + } + } + return $val; } @@ -192,8 +221,9 @@ function pipeline($action, $val = null) { // generer les fichiers php precompiles // de chargement des plugins et des pipelines actualise_plugins_actifs(); - if (!($ok = @is_readable($charger))) + if (!($ok = @is_readable($charger))) { spip_log("fichier $charger pas cree"); + } } if ($ok) { @@ -202,22 +232,24 @@ function pipeline($action, $val = null) { } // appliquer notre fonction si elle existe - $fonc = 'execute_pipeline_'.strtolower($action); + $fonc = 'execute_pipeline_' . strtolower($action); if (function_exists($fonc)) { $val = $fonc($val); - } - // plantage ? + } // plantage ? else { - spip_log("fonction $fonc absente : pipeline desactive",_LOG_ERREUR); + spip_log("fonction $fonc absente : pipeline desactive", _LOG_ERREUR); } // si le flux est une table avec 2 cle args&data // on ne ressort du pipe que les donnees dans 'data' // array_key_exists pour php 4.1.0 if (is_array($val) - AND count($val)==2 - AND (array_key_exists('data',$val))) + AND count($val) == 2 + AND (array_key_exists('data', $val)) + ) { $val = $val['data']; + } + return $val; } @@ -261,30 +293,35 @@ function pipeline($action, $val = null) { * Cette dernière notation est controversée mais le 3ème * paramètre est planté pour cause de compatibilité ascendante. */ -function spip_log($message = NULL, $name = NULL) { +function spip_log($message = null, $name = null) { static $pre = array(); static $log; - preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string) $name, $regs); - if (!isset($regs[1]) OR !$logname = $regs[1]) + preg_match('/^([a-z_]*)\.?(\d)?$/iS', (string)$name, $regs); + if (!isset($regs[1]) OR !$logname = $regs[1]) { $logname = null; - if (!isset($regs[2]) OR !$niveau = $regs[2]) + } + if (!isset($regs[2]) OR !$niveau = $regs[2]) { $niveau = _LOG_INFO; + } if ($niveau <= (defined('_LOG_FILTRE_GRAVITE') ? _LOG_FILTRE_GRAVITE : _LOG_INFO_IMPORTANTE)) { - if (!$pre){ + if (!$pre) { $pre = array( - _LOG_HS=>'HS:', - _LOG_ALERTE_ROUGE=>'ALERTE:', - _LOG_CRITIQUE=>'CRITIQUE:', - _LOG_ERREUR=>'ERREUR:', - _LOG_AVERTISSEMENT=>'WARNING:', - _LOG_INFO_IMPORTANTE=>'!INFO:', - _LOG_INFO=>'info:', - _LOG_DEBUG=>'debug:'); + _LOG_HS => 'HS:', + _LOG_ALERTE_ROUGE => 'ALERTE:', + _LOG_CRITIQUE => 'CRITIQUE:', + _LOG_ERREUR => 'ERREUR:', + _LOG_AVERTISSEMENT => 'WARNING:', + _LOG_INFO_IMPORTANTE => '!INFO:', + _LOG_INFO => 'info:', + _LOG_DEBUG => 'debug:' + ); $log = charger_fonction('log', 'inc'); } - if (!is_string($message)) $message = print_r($message, true); - $log($pre[$niveau].' '.$message, $logname); + if (!is_string($message)) { + $message = print_r($message, true); + } + $log($pre[$niveau] . ' ' . $message, $logname); } } @@ -294,7 +331,7 @@ function spip_log($message = NULL, $name = NULL) { * @uses inc_journal_dist() * @param string $phrase Texte du journal * @param array $opt Tableau d'options -**/ + **/ function journal($phrase, $opt = array()) { $journal = charger_fonction('journal', 'inc'); $journal($phrase, $opt); @@ -313,29 +350,34 @@ function journal($phrase, $opt = array()) { * @return mixed|null * - null si la clé n'a pas été trouvée * - la valeur de la clé sinon. -**/ + **/ function _request($var, $c = false) { - if (is_array($c)) - return isset($c[$var]) ? $c[$var] : NULL; + if (is_array($c)) { + return isset($c[$var]) ? $c[$var] : null; + } - if (isset($_GET[$var])) $a = $_GET[$var]; - elseif (isset($_POST[$var])) $a = $_POST[$var]; - else return NULL; + if (isset($_GET[$var])) { + $a = $_GET[$var]; + } elseif (isset($_POST[$var])) { + $a = $_POST[$var]; + } else { + return null; + } // Si on est en ajax et en POST tout a ete encode // via encodeURIComponent, il faut donc repasser // dans le charset local... if (defined('_AJAX') - AND _AJAX - AND isset($GLOBALS['meta']['charset']) - AND $GLOBALS['meta']['charset'] != 'utf-8' - AND is_string($a) - // check rapide mais pas fiable - AND preg_match(',[\x80-\xFF],', $a) - // check fiable - AND include_spip('inc/charsets') - AND is_utf8($a) + AND _AJAX + AND isset($GLOBALS['meta']['charset']) + AND $GLOBALS['meta']['charset'] != 'utf-8' + AND is_string($a) + // check rapide mais pas fiable + AND preg_match(',[\x80-\xFF],', $a) + // check fiable + AND include_spip('inc/charsets') + AND is_utf8($a) ) { return importer_charset($a, 'utf-8'); } @@ -356,19 +398,22 @@ function _request($var, $c = false) { * @return array|bool * - array $c complété si un $c est transmis, * - false sinon -**/ -function set_request($var, $val = NULL, $c = false) { + **/ +function set_request($var, $val = null, $c = false) { if (is_array($c)) { unset($c[$var]); - if ($val !== NULL) + if ($val !== null) { $c[$var] = $val; + } + return $c; } unset($_GET[$var]); unset($_POST[$var]); - if ($val !== NULL) + if ($val !== null) { $_GET[$var] = $val; + } return false; # n'affecte pas $c } @@ -376,11 +421,12 @@ function set_request($var, $val = NULL, $c = false) { /** * Tester si une URL est absolue + * * @param string $url * @return bool */ -function tester_url_absolue($url){ - return preg_match(";^([a-z]{3,7}:)?//;Uims",trim($url))?true:false; +function tester_url_absolue($url) { + return preg_match(";^([a-z]{3,7}:)?//;Uims", trim($url)) ? true : false; } /** @@ -401,53 +447,57 @@ function tester_url_absolue($url){ * @param string $sep Séparateur entre les paramètres * @return string URL */ -function parametre_url($url, $c, $v = NULL, $sep = '&') { +function parametre_url($url, $c, $v = null, $sep = '&') { // requete erronnee : plusieurs variable dans $c et aucun $v - if (strpos($c,"|")!==false AND is_null($v)) + if (strpos($c, "|") !== false AND is_null($v)) { return null; + } // lever l'#ancre if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) { $url = $r[1]; $ancre = $r[2]; - } else + } else { $ancre = ''; + } // eclater $url = preg_split(',[?]|&|&,', $url); // recuperer la base $a = array_shift($url); - if (!$a) $a= './'; + if (!$a) { + $a = './'; + } - $regexp = ',^(' . str_replace('[]','\[\]',$c) . '[[]?[]]?)(=.*)?$,'; - $ajouts = array_flip(explode('|',$c)); + $regexp = ',^(' . str_replace('[]', '\[\]', $c) . '[[]?[]]?)(=.*)?$,'; + $ajouts = array_flip(explode('|', $c)); $u = is_array($v) ? $v : rawurlencode($v); - $testv = (is_array($v)?count($v):strlen($v)); + $testv = (is_array($v) ? count($v) : strlen($v)); $v_read = null; // lire les variables et agir foreach ($url as $n => $val) { if (preg_match($regexp, urldecode($val), $r)) { $r = array_pad($r, 3, null); - if ($v === NULL) { + if ($v === null) { // c'est un tableau, on memorise les valeurs - if (substr($r[1],-2)=="[]"){ - if (!$v_read) $v_read = array(); - $v_read[] = $r[2]?substr($r[2],1):''; - } - // c'est un scalaire, on retourne direct + if (substr($r[1], -2) == "[]") { + if (!$v_read) { + $v_read = array(); + } + $v_read[] = $r[2] ? substr($r[2], 1) : ''; + } // c'est un scalaire, on retourne direct else { - return $r[2]?substr($r[2],1):''; + return $r[2] ? substr($r[2], 1) : ''; } - } - // suppression + } // suppression elseif (!$testv) { unset($url[$n]); } // Ajout. Pour une variable, remplacer au meme endroit, // pour un tableau ce sera fait dans la prochaine boucle - elseif (substr($r[1],-2) != '[]') { - $url[$n] = $r[1].'='.$u; + elseif (substr($r[1], -2) != '[]') { + $url[$n] = $r[1] . '=' . $u; unset($ajouts[$r[1]]); } // Pour les tableaux on laisse tomber les valeurs de @@ -459,18 +509,19 @@ function parametre_url($url, $c, $v = NULL, $sep = '&') { } // traiter les parametres pas encore trouves - if ($v === NULL - AND $args = func_get_args() - AND count($args)==2) { + if ($v === null + AND $args = func_get_args() + AND count($args) == 2 + ) { return $v_read; // rien trouve ou un tableau } elseif ($testv) { - foreach($ajouts as $k => $n) { - if (!is_array($v)) - $url[] = $k .'=' . $u; - else { - $id = (substr($k,-2) == '[]') ? $k : ($k ."[]"); + foreach ($ajouts as $k => $n) { + if (!is_array($v)) { + $url[] = $k . '=' . $u; + } else { + $id = (substr($k, -2) == '[]') ? $k : ($k . "[]"); foreach ($v as $w) { - $url[] = $id .'=' . (is_array($w) ? 'Array' : $w); + $url[] = $id . '=' . (is_array($w) ? 'Array' : $w); } } } @@ -480,8 +531,9 @@ function parametre_url($url, $c, $v = NULL, $sep = '&') { $url = array_filter($url); // recomposer l'adresse - if ($url) + if ($url) { $a .= '?' . join($sep, $url); + } return $a . $ancre; } @@ -495,13 +547,15 @@ function ancre_url($url, $ancre) { if (preg_match(',^([^#]*)(#.*)$,', $url, $r)) { $url = $r[1]; } - if (preg_match('/[^-_a-zA-Z0-9]+/S',$ancre)){ - if (!function_exists('translitteration')) + if (preg_match('/[^-_a-zA-Z0-9]+/S', $ancre)) { + if (!function_exists('translitteration')) { include_spip('inc/charsets'); + } $ancre = preg_replace(array('/^[^-_a-zA-Z0-9]+/', '/[^-_a-zA-Z0-9]/'), array('', '-'), - translitteration($ancre)); + translitteration($ancre)); } - return $url . (strlen($ancre) ? '#'. $ancre : ''); + + return $url . (strlen($ancre) ? '#' . $ancre : ''); } /** @@ -510,21 +564,24 @@ function ancre_url($url, $ancre) { * @param string|null $reset * @return string */ -function nettoyer_uri($reset = null) -{ +function nettoyer_uri($reset = null) { static $done = false; static $propre = ''; - if (!is_null($reset)) return $propre=$reset; - if ($done) return $propre; + if (!is_null($reset)) { + return $propre = $reset; + } + if ($done) { + return $propre; + } $done = true; $uri1 = $GLOBALS['REQUEST_URI']; do { $uri = $uri1; $uri1 = preg_replace - (',([?&])(PHPSESSID|(var_[^=&]*))=[^&]*(&|$),i', + (',([?&])(PHPSESSID|(var_[^=&]*))=[^&]*(&|$),i', '\1', $uri); - } while ($uri<>$uri1); + } while ($uri <> $uri1); return $propre = (preg_replace(',[?&]$,', '', $uri1)); } @@ -538,27 +595,30 @@ function nettoyer_uri($reset = null) * @param bool $root * @return string * URL vers soi-même -**/ + **/ function self($amp = '&', $root = false) { $url = nettoyer_uri(); if (!$root AND ( // si pas de profondeur on peut tronquer - $GLOBALS['profondeur_url']<(_DIR_RESTREINT?1:2) + $GLOBALS['profondeur_url'] < (_DIR_RESTREINT ? 1 : 2) // sinon c'est OK si _SET_HTML_BASE a ete force a false OR (defined('_SET_HTML_BASE') AND !_SET_HTML_BASE)) - ) + ) { $url = preg_replace(',^[^?]*/,', '', $url); + } // ajouter le cas echeant les variables _POST['id_...'] - foreach ($_POST as $v => $c) - if (substr($v,0,3) == 'id_') + foreach ($_POST as $v => $c) { + if (substr($v, 0, 3) == 'id_') { $url = parametre_url($url, $v, $c, '&'); + } + } // supprimer les variables sans interet if (test_espace_prive()) { - $url = preg_replace (',([?&])(' - .'lang|show_docs|' - .'changer_lang|var_lang|action)=[^&]*,i', '\1', $url); + $url = preg_replace(',([?&])(' + . 'lang|show_docs|' + . 'changer_lang|var_lang|action)=[^&]*,i', '\1', $url); $url = preg_replace(',([?&])[&]+,', '\1', $url); $url = preg_replace(',[&]$,', '\1', $url); } @@ -568,8 +628,9 @@ function self($amp = '&', $root = false) { $url = spip_htmlspecialchars($url); // & ? - if ($amp != '&') + if ($amp != '&') { $url = str_replace('&', $amp, $url); + } // Si ca demarre par ? ou vide, donner './' $url = preg_replace(',^([?].*)?$,', './\1', $url); @@ -594,8 +655,8 @@ function test_espace_prive() { * @param string $plugin * @return bool */ -function test_plugin_actif($plugin){ - return ($plugin AND defined('_DIR_PLUGIN_'.strtoupper($plugin)))? true:false; +function test_plugin_actif($plugin) { + return ($plugin AND defined('_DIR_PLUGIN_' . strtoupper($plugin))) ? true : false; } /** @@ -625,44 +686,46 @@ function test_plugin_actif($plugin){ * Texte */ function _T($texte, $args = array(), $options = array()) { - static $traduire=false ; - $o = array('class'=>'', 'force'=>true); - if ($options){ + static $traduire = false; + $o = array('class' => '', 'force' => true); + if ($options) { // support de l'ancien argument $class - if (is_string($options)) - $options = array('class'=>$options); - $o = array_merge($o,$options); + if (is_string($options)) { + $options = array('class' => $options); + } + $o = array_merge($o, $options); } - if (!$traduire) { + if (!$traduire) { $traduire = charger_fonction('traduire', 'inc'); include_spip('inc/lang'); } // On peut passer explicitement la langue dans le tableau // On utilise le même nom de variable que la globale - if (isset($args['spip_lang'])){ + if (isset($args['spip_lang'])) { $lang = $args['spip_lang']; // On l'enleve pour ne pas le passer au remplacement unset($args['spip_lang']); - } - // Sinon on prend la langue du contexte + } // Sinon on prend la langue du contexte else { $lang = $GLOBALS['spip_lang']; } $text = $traduire($texte, $lang); - if (!strlen($text)){ - if (!$o['force']) + if (!strlen($text)) { + if (!$o['force']) { return ''; + } $text = $texte; // pour les chaines non traduites, assurer un service minimum - if (!$GLOBALS['test_i18n'] AND (_request('var_mode') != 'traduction')) + if (!$GLOBALS['test_i18n'] AND (_request('var_mode') != 'traduction')) { $text = str_replace('_', ' ', - (($n = strpos($text,':')) === false ? $texte : + (($n = strpos($text, ':')) === false ? $texte : substr($texte, $n+1))); + } $o['class'] = null; } @@ -697,30 +760,39 @@ function _L($text, $args = array(), $class = null) { $f = $text; if (is_array($args)) { foreach ($args as $name => $value) { - if ($class) + if ($class) { $value = "<span class='$class'>$value</span>"; - $t = str_replace ("@$name@", $value, $text); - if ($text !== $t) {unset($args[$name]); $text = $t;} + } + $t = str_replace("@$name@", $value, $text); + if ($text !== $t) { + unset($args[$name]); + $text = $t; + } } // Si des variables n'ont pas ete inserees, le signaler // (chaines de langues pas a jour) - if ($args) spip_log("$f: variables inutilisees " . join(', ', array_keys($args)),_LOG_DEBUG); + if ($args) { + spip_log("$f: variables inutilisees " . join(', ', array_keys($args)), _LOG_DEBUG); + } } - if (($GLOBALS['test_i18n'] OR (_request('var_mode') == 'traduction')) AND $class===null) + if (($GLOBALS['test_i18n'] OR (_request('var_mode') == 'traduction')) AND $class === null) { return "<span class=debug-traduction-erreur>$text</span>"; - else + } else { return $text; + } } // Afficher "ecrire/data/" au lieu de "data/" dans les messages // ou tmp/ au lieu de ../tmp/ // http://code.spip.net/@joli_repertoire function joli_repertoire($rep) { - $a = substr($rep,0,1); - if ($a<>'.' AND $a<>'/') - $rep = (_DIR_RESTREINT?'':_DIR_RESTREINT_ABS).$rep; + $a = substr($rep, 0, 1); + if ($a <> '.' AND $a <> '/') { + $rep = (_DIR_RESTREINT ? '' : _DIR_RESTREINT_ABS) . $rep; + } $rep = preg_replace(',(^\.\.\/),', '', $rep); + return $rep; } @@ -731,25 +803,31 @@ function joli_repertoire($rep) { // http://code.spip.net/@spip_timer function spip_timer($t = 'rien', $raw = false) { static $time; - $a=time(); $b=microtime(); + $a = time(); + $b = microtime(); // microtime peut contenir les microsecondes et le temps - $b=explode(' ',$b); - if (count($b)==2) $a = end($b); // plus precis ! + $b = explode(' ', $b); + if (count($b) == 2) { + $a = end($b); + } // plus precis ! $b = reset($b); if (!isset($time[$t])) { - $time[$t] = $a + $b; + $time[$t] = $a+$b; } else { - $p = ($a + $b - $time[$t]) * 1000; + $p = ($a+$b-$time[$t])*1000; unset($time[$t]); # echo "'$p'";exit; - if ($raw) return $p; - if ($p < 1000) + if ($raw) { + return $p; + } + if ($p < 1000) { $s = ''; - else { + } else { $s = sprintf("%d ", $x = floor($p/1000)); $p -= ($x*1000); } - return $s . sprintf($s?"%07.3f ms":"%.3f ms", $p); + + return $s . sprintf($s ? "%07.3f ms" : "%.3f ms", $p); } } @@ -760,13 +838,18 @@ function spip_timer($t = 'rien', $raw = false) { function spip_touch($fichier, $duree = 0, $touch = true) { if ($duree) { clearstatcache(); - if ((@$f=filemtime($fichier)) AND ($f >= time() - $duree)) + if ((@$f = filemtime($fichier)) AND ($f >= time()-$duree)) { return false; + } } - if ($touch!==false) { - if (!@touch($fichier)) { spip_unlink($fichier); @touch($fichier); }; + if ($touch !== false) { + if (!@touch($fichier)) { + spip_unlink($fichier); + @touch($fichier); + }; @chmod($fichier, _SPIP_CHMOD & ~0111); } + return true; } @@ -774,10 +857,10 @@ function spip_touch($fichier, $duree = 0, $touch = true) { /** * Action qui déclenche une tache de fond * - * @see queue_affichage_cron() - * @see action_super_cron_dist() + * @see queue_affichage_cron() + * @see action_super_cron_dist() * @uses cron() -**/ + **/ function action_cron() { include_spip('inc/headers'); http_status(204); // No Content @@ -788,9 +871,9 @@ function action_cron() { /** * Exécution des tâches de fond - * + * * @uses inc_genie_dist() - * + * * @param array $taches * Tâches forcées * @param array $taches_old @@ -800,17 +883,24 @@ function action_cron() { */ function cron($taches = array(), $taches_old = array()) { // si pas en mode cron force, laisser tomber. - if (!defined('_DIRECT_CRON_FORCE')) return false; - if (!is_array($taches)) $taches = $taches_old; // compat anciens appels + if (!defined('_DIRECT_CRON_FORCE')) { + return false; + } + if (!is_array($taches)) { + $taches = $taches_old; + } // compat anciens appels // si taches a inserer en base et base inaccessible, laisser tomber // sinon on ne verifie pas la connexion tout de suite, car si ca se trouve // queue_sleep_time_to_next_job() dira qu'il n'y a rien a faire // et on evite d'ouvrir une connexion pour rien (utilisation de _DIRECT_CRON_FORCE dans mes_options.php) - if ($taches AND count($taches) AND !spip_connect()) return false; - spip_log("cron !",'jq'._LOG_DEBUG); + if ($taches AND count($taches) AND !spip_connect()) { + return false; + } + spip_log("cron !", 'jq' . _LOG_DEBUG); if ($genie = charger_fonction('genie', 'inc', true)) { return $genie($taches); } + return false; } @@ -836,35 +926,46 @@ function cron($taches = array(), $taches_old = array()) { * @return int * id of the job */ -function job_queue_add($function, $description, $arguments = array(), $file = '', $no_duplicate = FALSE, $time = 0, $priority = 0) { +function job_queue_add( + $function, + $description, + $arguments = array(), + $file = '', + $no_duplicate = false, + $time = 0, + $priority = 0 +) { include_spip('inc/queue'); + return queue_add_job($function, $description, $arguments, $file, $no_duplicate, $time, $priority); } /** * Supprimer une tache de la file d'attente - * + * * @param int $id_job * id of jonb to delete * @return bool */ -function job_queue_remove($id_job){ +function job_queue_remove($id_job) { include_spip('inc/queue'); + return queue_remove_job($id_job); } /** * Associer une tache a un/des objets de SPIP - * + * * @param int $id_job * id of job to link * @param array $objets * can be a simple array('objet'=>'article', 'id_objet'=>23) * or an array of simple array to link multiples objet in one time */ -function job_queue_link($id_job, $objets){ +function job_queue_link($id_job, $objets) { include_spip('inc/queue'); - return queue_link_job($id_job,$objets); + + return queue_link_job($id_job, $objets); } @@ -885,30 +986,34 @@ function job_queue_link($id_job, $objets){ */ function queue_sleep_time_to_next_job($force = null) { static $queue_next_job_time = -1; - if ($force===true) + if ($force === true) { $queue_next_job_time = -1; - elseif ($force) + } elseif ($force) { $queue_next_job_time = $force; + } - if ($queue_next_job_time==-1) { + if ($queue_next_job_time == -1) { if (!defined('_JQ_NEXT_JOB_TIME_FILENAME')) { define('_JQ_NEXT_JOB_TIME_FILENAME', _DIR_TMP . "job_queue_next.txt"); } // utiliser un cache memoire si dispo if (function_exists("cache_get") AND defined('_MEMOIZE_MEMORY') AND _MEMOIZE_MEMORY) { $queue_next_job_time = cache_get(_JQ_NEXT_JOB_TIME_FILENAME); - } - else { + } else { $queue_next_job_time = null; - if (lire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, $contenu)) + if (lire_fichier(_JQ_NEXT_JOB_TIME_FILENAME, $contenu)) { $queue_next_job_time = intval($contenu); + } } } - if (is_null($queue_next_job_time)) + if (is_null($queue_next_job_time)) { return null; - if (!$_SERVER['REQUEST_TIME']) + } + if (!$_SERVER['REQUEST_TIME']) { $_SERVER['REQUEST_TIME'] = time(); + } + return $queue_next_job_time-$_SERVER['REQUEST_TIME']; } @@ -918,7 +1023,7 @@ function queue_sleep_time_to_next_job($force = null) { function quote_amp($u) { return preg_replace( "/&(?![a-z]{0,4}\w{2,3};|#x?[0-9a-f]{2,6};)/i", - "&",$u); + "&", $u); } @@ -939,32 +1044,35 @@ function quote_amp($u) { * Contenu de la balise `<noscript>` * @return string * Balise HTML `<script>` et son contenu -**/ + **/ function http_script($script, $src = '', $noscript = '') { static $done = array(); - if ($src && !isset($done[$src])){ + if ($src && !isset($done[$src])) { $done[$src] = true; $src = find_in_path($src, _JAVASCRIPT); $src = " src='$src'"; + } else { + $src = ''; } - else $src = ''; - if ($script) + if ($script) { $script = ("/*<![CDATA[*/\n" . - preg_replace(',</([^>]*)>,','<\/\1>', $script) . - "/*]]>*/"); - if ($noscript) + preg_replace(',</([^>]*)>,', '<\/\1>', $script) . + "/*]]>*/"); + } + if ($noscript) { $noscript = "<noscript>\n\t$noscript\n</noscript>\n"; + } return ($src OR $script OR $noscript) - ? "<script type='text/javascript'$src>$script</script>$noscript" - : ''; + ? "<script type='text/javascript'$src>$script</script>$noscript" + : ''; } /** * Sécurise du texte à écrire dans du PHP ou du Javascript. - * + * * Transforme n'importe quel texte en une chaîne utilisable * en PHP ou Javascript en toute sécurité, à l'intérieur d'apostrophes * simples (`'` uniquement ; pas `"`) @@ -991,7 +1099,7 @@ function http_script($script, $src = '', $noscript = '') { * Texte à échapper * @return string * Texte échappé -**/ + **/ function texte_script($texte) { return str_replace('\'', '\\\'', str_replace('\\', '\\\\', $texte)); } @@ -1028,57 +1136,70 @@ function texte_script($texte) { * - '' provoque un recalcul des chemins. * @return array * Liste des chemins, par ordre de priorité. -**/ -function _chemin($dir_path = NULL){ - static $path_base = NULL; - static $path_full = NULL; - if ($path_base==NULL){ + **/ +function _chemin($dir_path = null) { + static $path_base = null; + static $path_full = null; + if ($path_base == null) { // Chemin standard depuis l'espace public $path = defined('_SPIP_PATH') ? _SPIP_PATH : - _DIR_RACINE.':'. - _DIR_RACINE.'squelettes-dist/:'. - _DIR_RACINE.'prive/:'. + _DIR_RACINE . ':' . + _DIR_RACINE . 'squelettes-dist/:' . + _DIR_RACINE . 'prive/:' . _DIR_RESTREINT; // Ajouter squelettes/ - if (@is_dir(_DIR_RACINE.'squelettes')) - $path = _DIR_RACINE.'squelettes/:' . $path; + if (@is_dir(_DIR_RACINE . 'squelettes')) { + $path = _DIR_RACINE . 'squelettes/:' . $path; + } foreach (explode(':', $path) as $dir) { - if (strlen($dir) AND substr($dir,-1) != '/') + if (strlen($dir) AND substr($dir, -1) != '/') { $dir .= "/"; + } $path_base[] = $dir; } $path_full = $path_base; // Et le(s) dossier(s) des squelettes nommes - if (strlen($GLOBALS['dossier_squelettes'])) - foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) + if (strlen($GLOBALS['dossier_squelettes'])) { + foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) { array_unshift($path_full, ($d[0] == '/' ? '' : _DIR_RACINE) . $d . '/'); + } + } $GLOBALS['path_sig'] = md5(serialize($path_full)); } - if ($dir_path===NULL) return $path_full; + if ($dir_path === null) { + return $path_full; + } - if (strlen($dir_path)){ + if (strlen($dir_path)) { $tete = ""; - if (reset($path_base)==_DIR_RACINE.'squelettes/') + if (reset($path_base) == _DIR_RACINE . 'squelettes/') { $tete = array_shift($path_base); - $dirs = array_reverse(explode(':',$dir_path)); - foreach($dirs as $dir_path){ - #if ($dir_path{0}!='/') - # $dir_path = $dir_path; - if (substr($dir_path,-1) != '/') - $dir_path .= "/"; - if (!in_array($dir_path,$path_base)) - array_unshift($path_base,$dir_path); - } - if (strlen($tete)) - array_unshift($path_base,$tete); + } + $dirs = array_reverse(explode(':', $dir_path)); + foreach ($dirs as $dir_path) { + #if ($dir_path{0}!='/') + # $dir_path = $dir_path; + if (substr($dir_path, -1) != '/') { + $dir_path .= "/"; + } + if (!in_array($dir_path, $path_base)) { + array_unshift($path_base, $dir_path); + } + } + if (strlen($tete)) { + array_unshift($path_base, $tete); + } } $path_full = $path_base; // Et le(s) dossier(s) des squelettes nommes - if (strlen($GLOBALS['dossier_squelettes'])) - foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) + if (strlen($GLOBALS['dossier_squelettes'])) { + foreach (array_reverse(explode(':', $GLOBALS['dossier_squelettes'])) as $d) { array_unshift($path_full, ((isset($d[0]) and $d[0] == '/') ? '' : _DIR_RACINE) . $d . '/'); + } + } $GLOBALS['path_sig'] = md5(serialize($path_full)); + return $path_full; } @@ -1090,7 +1211,7 @@ function _chemin($dir_path = NULL){ * @uses _chemin() * * @return array Liste de chemins -**/ + **/ function creer_chemin() { $path_a = _chemin(); static $c = ''; @@ -1101,16 +1222,18 @@ function creer_chemin() { $c = $GLOBALS['dossier_squelettes']; $path_a = _chemin(''); // forcer un recalcul du chemin } + return $path_a; } -function lister_themes_prives(){ +function lister_themes_prives() { static $themes = null; - if (is_null($themes)){ + if (is_null($themes)) { // si pas encore definie - if (!defined('_SPIP_THEME_PRIVE')) + if (!defined('_SPIP_THEME_PRIVE')) { define('_SPIP_THEME_PRIVE', 'spip'); + } $themes = array(_SPIP_THEME_PRIVE); // lors d'une installation neuve, prefs n'est pas definie. if (isset($GLOBALS['visiteur_session']['prefs'])) { @@ -1118,26 +1241,34 @@ function lister_themes_prives(){ } else { $prefs = array(); } - if (is_string($prefs)) + if (is_string($prefs)) { $prefs = unserialize($GLOBALS['visiteur_session']['prefs']); + } if ( ((isset($prefs['theme']) AND $theme = $prefs['theme']) - OR (isset($GLOBALS['theme_prive_defaut']) AND $theme = $GLOBALS['theme_prive_defaut'])) - AND $theme != _SPIP_THEME_PRIVE) - array_unshift($themes,$theme); // placer le theme choisi en tete + OR (isset($GLOBALS['theme_prive_defaut']) AND $theme = $GLOBALS['theme_prive_defaut'])) + AND $theme != _SPIP_THEME_PRIVE + ) { + array_unshift($themes, $theme); + } // placer le theme choisi en tete } + return $themes; } -function find_in_theme($file, $subdir = '', $include = false){ - static $themefiles=array(); - if (isset($themefiles["$subdir$file"])) return $themefiles["$subdir$file"]; +function find_in_theme($file, $subdir = '', $include = false) { + static $themefiles = array(); + if (isset($themefiles["$subdir$file"])) { + return $themefiles["$subdir$file"]; + } $themes = lister_themes_prives(); - foreach($themes as $theme){ - if ($f = find_in_path($file,"prive/themes/$theme/$subdir",$include)) + foreach ($themes as $theme) { + if ($f = find_in_path($file, "prive/themes/$theme/$subdir", $include)) { return $themefiles["$subdir$file"] = $f; + } } - spip_log("$file introuvable dans le theme prive ".reset($themes),'theme'); + spip_log("$file introuvable dans le theme prive " . reset($themes), 'theme'); + return $themefiles["$subdir$file"] = ""; } @@ -1160,24 +1291,30 @@ function find_in_theme($file, $subdir = '', $include = false){ * @return string * Chemin complet de l'icone depuis la racine si l'icone est trouée, * sinon chaîne vide. -**/ -function chemin_image($icone){ + **/ +function chemin_image($icone) { static $icone_renommer; // gerer le cas d'un double appel en evitant de refaire le travail inutilement - if (strpos($icone,"/")!==false AND file_exists($icone)) return $icone; + if (strpos($icone, "/") !== false AND file_exists($icone)) { + return $icone; + } // si c'est un nom d'image complet (article-24.png) essayer de le renvoyer direct - if (preg_match(',[.](png|gif|jpg)$,',$icone) AND $f = find_in_theme("images/$icone")) + if (preg_match(',[.](png|gif|jpg)$,', $icone) AND $f = find_in_theme("images/$icone")) { return $f; + } // sinon passer par le module de renommage - if (is_null($icone_renommer)) - $icone_renommer = charger_fonction('icone_renommer','inc',true); - if ($icone_renommer){ - list($icone,$fonction) = $icone_renommer($icone,""); - if (file_exists($icone)) + if (is_null($icone_renommer)) { + $icone_renommer = charger_fonction('icone_renommer', 'inc', true); + } + if ($icone_renommer) { + list($icone, $fonction) = $icone_renommer($icone, ""); + if (file_exists($icone)) { return $icone; + } } - return find_in_path ($icone, _NOM_IMG_PACK); + + return find_in_path($icone, _NOM_IMG_PACK); } // @@ -1194,7 +1331,7 @@ $GLOBALS['path_files'] = null; * suivant l'ordre des chemins connus de SPIP. * * @api - * @see charger_fonction() + * @see charger_fonction() * @uses creer_chemin() Pour la liste des chemins. * @example * ``` @@ -1213,81 +1350,92 @@ $GLOBALS['path_files'] = null; * @return string|bool * - string : chemin du fichier trouvé * - false : fichier introuvable -**/ -function find_in_path ($file, $dirname = '', $include = false) { - static $dirs=array(); + **/ +function find_in_path($file, $dirname = '', $include = false) { + static $dirs = array(); static $inc = array(); # cf http://trac.rezo.net/trac/spip/changeset/14743 static $c = ''; // on calcule le chemin si le dossier skel a change - if ($c != $GLOBALS['dossier_squelettes']){ + if ($c != $GLOBALS['dossier_squelettes']) { // assurer le non plantage lors de la montee de version : $c = $GLOBALS['dossier_squelettes']; creer_chemin(); // forcer un recalcul du chemin et la mise a jour de path_sig } if (isset($GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file])) { - if (!$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]) + if (!$GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]) { return false; + } if ($include AND !isset($inc[$dirname][$file])) { include_once _ROOT_CWD . $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]; $inc[$dirname][$file] = $inc[''][$dirname . $file] = true; } + return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file]; } - $a = strrpos($file,'/'); + $a = strrpos($file, '/'); if ($a !== false) { $dirname .= substr($file, 0, ++$a); $file = substr($file, $a); } - foreach(creer_chemin() as $dir) { - if (!isset($dirs[$a = $dir . $dirname])) - $dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a) ; + foreach (creer_chemin() as $dir) { + if (!isset($dirs[$a = $dir . $dirname])) { + $dirs[$a] = (is_dir(_ROOT_CWD . $a) || !$a); + } if ($dirs[$a]) { if (file_exists(_ROOT_CWD . ($a .= $file))) { if ($include AND !isset($inc[$dirname][$file])) { include_once _ROOT_CWD . $a; $inc[$dirname][$file] = $inc[''][$dirname . $file] = true; } - if (!defined('_SAUVER_CHEMIN')){ + if (!defined('_SAUVER_CHEMIN')) { // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher - if (is_null($GLOBALS['path_files'])) return $a; + if (is_null($GLOBALS['path_files'])) { + return $a; + } define('_SAUVER_CHEMIN', true); } + return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = $a; } } } - if ($include){ + if ($include) { spip_log("include_spip $dirname$file non trouve"); - if ($include==='required'){ + if ($include === 'required') { echo '<pre>', "<strong>Erreur Fatale</strong><br />"; - if (function_exists('debug_print_backtrace')) + if (function_exists('debug_print_backtrace')) { echo debug_print_backtrace(); + } echo '</pre>'; die("Erreur interne: ne peut inclure $dirname$file"); } } - if (!defined('_SAUVER_CHEMIN')){ + if (!defined('_SAUVER_CHEMIN')) { // si le chemin n'a pas encore ete charge, ne pas lever le flag, ne pas cacher - if (is_null($GLOBALS['path_files'])) return false; + if (is_null($GLOBALS['path_files'])) { + return false; + } define('_SAUVER_CHEMIN', true); } + return $GLOBALS['path_files'][$GLOBALS['path_sig']][$dirname][$file] = $GLOBALS['path_files'][$GLOBALS['path_sig']][''][$dirname . $file] = false; } -function clear_path_cache(){ +function clear_path_cache() { $GLOBALS['path_files'] = array(); spip_unlink(_CACHE_CHEMIN); } -function load_path_cache(){ + +function load_path_cache() { // charger le path des plugins - if (@is_readable(_CACHE_PLUGINS_PATH)){ + if (@is_readable(_CACHE_PLUGINS_PATH)) { include_once(_CACHE_PLUGINS_PATH); } $GLOBALS['path_files'] = array(); @@ -1300,24 +1448,27 @@ function load_path_cache(){ // on blinde par un second test au moment de la lecture de la session // !isset($_COOKIE[$GLOBALS['cookie_prefix'].'_admin']) // et en ignorant ce cache en cas de recalcul explicite - !_request('var_mode') - ){ + !_request('var_mode') + ) { // on essaye de lire directement sans verrou pour aller plus vite - if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)){ + if ($contenu = spip_file_get_contents(_CACHE_CHEMIN)) { // mais si semble corrompu on relit avec un verrou - if (!$GLOBALS['path_files']=unserialize($contenu)){ - lire_fichier(_CACHE_CHEMIN,$contenu); - if (!$GLOBALS['path_files']=unserialize($contenu)) + if (!$GLOBALS['path_files'] = unserialize($contenu)) { + lire_fichier(_CACHE_CHEMIN, $contenu); + if (!$GLOBALS['path_files'] = unserialize($contenu)) { $GLOBALS['path_files'] = array(); + } } } } } -function save_path_cache(){ +function save_path_cache() { if (defined('_SAUVER_CHEMIN') - AND _SAUVER_CHEMIN) - ecrire_fichier(_CACHE_CHEMIN,serialize($GLOBALS['path_files'])); + AND _SAUVER_CHEMIN + ) { + ecrire_fichier(_CACHE_CHEMIN, serialize($GLOBALS['path_files'])); + } } @@ -1336,36 +1487,38 @@ function save_path_cache(){ * @param bool $recurs * @return array */ -function find_all_in_path($dir, $pattern, $recurs = false){ - $liste_fichiers=array(); +function find_all_in_path($dir, $pattern, $recurs = false) { + $liste_fichiers = array(); $maxfiles = 10000; // Parcourir le chemin foreach (creer_chemin() as $d) { - $f = $d.$dir; - if (@is_dir($f)){ - $liste = preg_files($f,$pattern,$maxfiles-count($liste_fichiers),$recurs===true?array():$recurs); - foreach($liste as $chemin){ + $f = $d . $dir; + if (@is_dir($f)) { + $liste = preg_files($f, $pattern, $maxfiles-count($liste_fichiers), $recurs === true ? array() : $recurs); + foreach ($liste as $chemin) { $nom = basename($chemin); // ne prendre que les fichiers pas deja trouves // car find_in_path prend le premier qu'il trouve, // les autres sont donc masques - if (!isset($liste_fichiers[$nom])) + if (!isset($liste_fichiers[$nom])) { $liste_fichiers[$nom] = $chemin; + } } } } + return $liste_fichiers; } // predicat sur les scripts de ecrire qui n'authentifient pas par cookie // http://code.spip.net/@autoriser_sans_cookie -function autoriser_sans_cookie($nom) -{ - static $autsanscookie = array('install', 'base_repair'); - $nom = preg_replace('/.php[3]?$/', '', basename($nom)); - return in_array($nom, $autsanscookie); +function autoriser_sans_cookie($nom) { + static $autsanscookie = array('install', 'base_repair'); + $nom = preg_replace('/.php[3]?$/', '', basename($nom)); + + return in_array($nom, $autsanscookie); } /** @@ -1390,79 +1543,100 @@ function autoriser_sans_cookie($nom) * array : derogatoire, la fonction d'url retourne (objet,id_objet) utilises par nettoyer_raccourcis_typo() pour generer un lien titre * (cas des raccourcis personalises [->spip20] : il faut implementer une fonction generer_url_spip et une fonction generer_url_ecrire_spip) */ -function generer_url_entite($id = '', $entite = '', $args = '', $ancre = '', $public = NULL, $type = NULL) -{ - if ($public === NULL) $public = !test_espace_prive(); +function generer_url_entite($id = '', $entite = '', $args = '', $ancre = '', $public = null, $type = null) { + if ($public === null) { + $public = !test_espace_prive(); + } $entite = objet_type($entite); // cas particulier d'appels sur objet/id_objet... if (!$public) { - if (!$entite) return ''; - if (!function_exists('generer_url_ecrire_objet')) + if (!$entite) { + return ''; + } + if (!function_exists('generer_url_ecrire_objet')) { include_spip('inc/urls'); - $res = generer_url_ecrire_objet($entite,$id, $args, $ancre, false); + } + $res = generer_url_ecrire_objet($entite, $id, $args, $ancre, false); } else { - if ($type === NULL) { - $type = (isset($GLOBALS['type_urls'])) - ? $GLOBALS['type_urls'] // pour surcharge via fichier d'options - : ((isset($GLOBALS['meta']['type_urls'])) // sinon la config url_etendues - ? ($GLOBALS['meta']['type_urls']) : "page") ; // sinon type "page" par défaut + if ($type === null) { + $type = (isset($GLOBALS['type_urls'])) + ? $GLOBALS['type_urls'] // pour surcharge via fichier d'options + : ((isset($GLOBALS['meta']['type_urls'])) // sinon la config url_etendues + ? ($GLOBALS['meta']['type_urls']) : "page"); // sinon type "page" par défaut } $f = charger_fonction($type, 'urls', true); // se rabattre sur les urls page si les urls perso non dispo - if (!$f) $f = charger_fonction('page', 'urls', true); + if (!$f) { + $f = charger_fonction('page', 'urls', true); + } // si $entite='', on veut la fonction de passage URL ==> id // sinon on veut effectuer le passage id ==> URL - if (!$entite) return $f; + if (!$entite) { + return $f; + } // mais d'abord il faut tester le cas des urls sur une // base distante if (is_string($public) - AND $g = charger_fonction('connect', 'urls', true)) + AND $g = charger_fonction('connect', 'urls', true) + ) { $f = $g; + } $res = $f(intval($id), $entite, $args, $ancre, $public); } - if ($res) return $res; + if ($res) { + return $res; + } // Sinon c'est un raccourci ou compat SPIP < 2 if (!function_exists($f = 'generer_url_' . $entite)) { - if (!function_exists($f .= '_dist')) $f = ''; + if (!function_exists($f .= '_dist')) { + $f = ''; + } } if ($f) { $url = $f($id, $args, $ancre); - if (strlen($args)) + if (strlen($args)) { $url .= strstr($url, '?') - ? '&'.$args - : '?'.$args; + ? '&' . $args + : '?' . $args; + } + return $url; } // On a ete gentil mais la .... spip_log("generer_url_entite: entite $entite ($f) inconnue $type $public"); + return ''; } -function generer_url_ecrire_entite_edit($id, $entite, $args = '', $ancre = ''){ - $exec = objet_info($entite,'url_edit'); - $url = generer_url_ecrire($exec,$args); - if (intval($id)) - $url = parametre_url($url,id_table_objet($entite),$id); - else - $url = parametre_url($url,'new','oui'); - if ($ancre) - $url = ancre_url($url,$ancre); +function generer_url_ecrire_entite_edit($id, $entite, $args = '', $ancre = '') { + $exec = objet_info($entite, 'url_edit'); + $url = generer_url_ecrire($exec, $args); + if (intval($id)) { + $url = parametre_url($url, id_table_objet($entite), $id); + } else { + $url = parametre_url($url, 'new', 'oui'); + } + if ($ancre) { + $url = ancre_url($url, $ancre); + } + return $url; } // http://code.spip.net/@urls_connect_dist function urls_connect_dist($i, &$entite, $args = '', $ancre = '', $public = null) { include_spip('base/connect_sql'); - $id_type = id_table_objet($entite,$public); + $id_type = id_table_objet($entite, $public); + return _DIR_RACINE . get_spip_script('./') - . "?"._SPIP_PAGE."=$entite&$id_type=$i&connect=$public" - . (!$args ? '' : "&$args") - . (!$ancre ? '' : "#$ancre"); + . "?" . _SPIP_PAGE . "=$entite&$id_type=$i&connect=$public" + . (!$args ? '' : "&$args") + . (!$ancre ? '' : "#$ancre"); } @@ -1473,34 +1647,38 @@ function urls_connect_dist($i, &$entite, $args = '', $ancre = '', $public = null * @return string */ function urlencode_1738($url) { - if (preg_match(',[^\x00-\x7E],sS', $url)){ + if (preg_match(',[^\x00-\x7E],sS', $url)) { $uri = ''; - for ($i=0; $i < strlen($url); $i++) { - if (ord($a = $url[$i]) > 127) + for ($i = 0; $i < strlen($url); $i++) { + if (ord($a = $url[$i]) > 127) { $a = rawurlencode($a); + } $uri .= $a; } $url = $uri; } + return quote_amp($url); } // http://code.spip.net/@generer_url_entite_absolue -function generer_url_entite_absolue($id = '', $entite = '', $args = '', $ancre = '', $connect = NULL) -{ - if (!$connect) $connect = true; +function generer_url_entite_absolue($id = '', $entite = '', $args = '', $ancre = '', $connect = null) { + if (!$connect) { + $connect = true; + } $h = generer_url_entite($id, $entite, $args, $ancre, $connect); if (!preg_match(',^\w+:,', $h)) { include_spip('inc/filtres_mini'); $h = url_absolue($h); } - return $h; + + return $h; } /** * Tester qu'une variable d'environnement est active - * + * * Sur certains serveurs, la valeur 'Off' tient lieu de false dans certaines * variables d'environnement comme $_SERVER[HTTPS] ou ini_get(register_globals) * @@ -1508,9 +1686,12 @@ function generer_url_entite_absolue($id = '', $entite = '', $args = '', $ancre = * La valeur de la variable d'environnement * @return bool * true si la valeur est considérée active ; false sinon. -**/ + **/ function test_valeur_serveur($truc) { - if (!$truc) return false; + if (!$truc) { + return false; + } + return (strtolower($truc) !== 'off'); } @@ -1523,7 +1704,7 @@ function test_valeur_serveur($truc) { * Calcule l'URL de base du site, en priorité sans se fier à la méta (adresse_site) qui * peut être fausse (sites avec plusieurs noms d’hôtes, déplacements, erreurs). * En dernier recours, lorsqu'on ne trouve rien, on utilise adresse_site comme fallback. - * + * * @note * La globale `$profondeur_url` doit être initialisée de manière à * indiquer le nombre de sous-répertoires de l'url courante par rapport à la @@ -1540,24 +1721,30 @@ function test_valeur_serveur($truc) { function url_de_base($profondeur = null) { static $url = array(); - if (is_array($profondeur)) return $url = $profondeur; - if ($profondeur===false) return $url; + if (is_array($profondeur)) { + return $url = $profondeur; + } + if ($profondeur === false) { + return $url; + } - if (is_null($profondeur)) $profondeur = $GLOBALS['profondeur_url']; + if (is_null($profondeur)) { + $profondeur = $GLOBALS['profondeur_url']; + } - if (isset($url[$profondeur])) + if (isset($url[$profondeur])) { return $url[$profondeur]; + } $http = ( (isset($_SERVER["SCRIPT_URI"]) AND - substr($_SERVER["SCRIPT_URI"],0,5) == 'https') + substr($_SERVER["SCRIPT_URI"], 0, 5) == 'https') OR (isset($_SERVER['HTTPS']) AND - test_valeur_serveur($_SERVER['HTTPS'])) + test_valeur_serveur($_SERVER['HTTPS'])) ) ? 'https' : 'http'; - if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])){ + if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { $host = strtr($_SERVER['HTTP_X_FORWARDED_HOST'], "<>?\"' \r\n", '________'); - } - else { + } else { // note : HTTP_HOST contient le :port si necessaire $host = $_SERVER['HTTP_HOST']; // si on n'a pas trouvé d'hôte du tout, en dernier recours on utilise adresse_site comme fallback @@ -1569,46 +1756,60 @@ function url_de_base($profondeur = null) { } } if (isset($_SERVER['SERVER_PORT']) - AND $port=$_SERVER['SERVER_PORT'] - AND strpos($host,":")==false){ - if (!defined('_PORT_HTTP_STANDARD')) define('_PORT_HTTP_STANDARD','80'); - if (!defined('_PORT_HTTPS_STANDARD')) define('_PORT_HTTPS_STANDARD','443'); - if ($http=="http" AND !in_array($port,explode(',',_PORT_HTTP_STANDARD))) $host.=":$port"; - if ($http=="https" AND !in_array($port,explode(',',_PORT_HTTPS_STANDARD))) $host.=":$port"; + AND $port = $_SERVER['SERVER_PORT'] + AND strpos($host, ":") == false + ) { + if (!defined('_PORT_HTTP_STANDARD')) { + define('_PORT_HTTP_STANDARD', '80'); + } + if (!defined('_PORT_HTTPS_STANDARD')) { + define('_PORT_HTTPS_STANDARD', '443'); + } + if ($http == "http" AND !in_array($port, explode(',', _PORT_HTTP_STANDARD))) { + $host .= ":$port"; + } + if ($http == "https" AND !in_array($port, explode(',', _PORT_HTTPS_STANDARD))) { + $host .= ":$port"; + } } } - if (!$GLOBALS['REQUEST_URI']){ + if (!$GLOBALS['REQUEST_URI']) { if (isset($_SERVER['REQUEST_URI'])) { $GLOBALS['REQUEST_URI'] = $_SERVER['REQUEST_URI']; } else { $GLOBALS['REQUEST_URI'] = $_SERVER['PHP_SELF']; if ($_SERVER['QUERY_STRING'] - AND !strpos($_SERVER['REQUEST_URI'], '?')) - $GLOBALS['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING']; + AND !strpos($_SERVER['REQUEST_URI'], '?') + ) { + $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; + } } } - $url[$profondeur] = url_de_($http,$host,$GLOBALS['REQUEST_URI'],$profondeur); + $url[$profondeur] = url_de_($http, $host, $GLOBALS['REQUEST_URI'], $profondeur); return $url[$profondeur]; } + /** * fonction testable de construction d'une url appelee par url_de_base() + * * @param string $http * @param string $host * @param string $request * @param int $prof * @return string */ -function url_de_($http, $host, $request, $prof = 0){ - $prof = max($prof,0); +function url_de_($http, $host, $request, $prof = 0) { + $prof = max($prof, 0); - $myself = ltrim($request,'/'); + $myself = ltrim($request, '/'); # supprimer la chaine de GET list($myself) = explode('?', $myself); - $url = join('/', array_slice(explode('/', $myself), 0, -1-$prof)).'/'; + $url = join('/', array_slice(explode('/', $myself), 0, -1-$prof)) . '/'; + + $url = $http . '://' . rtrim($host, '/') . '/' . ltrim($url, '/'); - $url = $http.'://'.rtrim($host,'/').'/'.ltrim($url,'/'); return $url; } @@ -1642,26 +1843,32 @@ function url_de_($http, $host, $request, $prof = 0){ * - true : l’URL sera relavive. * - string : on transmet l'url à la fonction * @return string URL -**/ + **/ function generer_url_ecrire($script = '', $args = "", $no_entities = false, $rel = false) { - if (!$rel) + if (!$rel) { $rel = url_de_base() . _DIR_RESTREINT_ABS . _SPIP_ECRIRE_SCRIPT; - else if (!is_string($rel)) - $rel = _DIR_RESTREINT ? _DIR_RESTREINT : - ('./' . _SPIP_ECRIRE_SCRIPT); + } else { + if (!is_string($rel)) { + $rel = _DIR_RESTREINT ? _DIR_RESTREINT : + ('./' . _SPIP_ECRIRE_SCRIPT); + } + } list($script, $ancre) = array_pad(explode('#', $script), 2, null); - if ($script AND ($script<>'accueil' OR $rel)) + if ($script AND ($script <> 'accueil' OR $rel)) { $args = "?exec=$script" . (!$args ? '' : "&$args"); - elseif ($args) - $args ="?$args"; - if ($ancre) $args .= "#$ancre"; + } elseif ($args) { + $args = "?$args"; + } + if ($ancre) { + $args .= "#$ancre"; + } + return $rel . ($no_entities ? $args : str_replace('&', '&', $args)); } // http://code.spip.net/@generer_url_retour -function generer_url_retour($script, $args = "") -{ +function generer_url_retour($script, $args = "") { return rawurlencode(generer_url_ecrire($script, $args, true, true)); } @@ -1682,13 +1889,14 @@ function generer_url_retour($script, $args = "") * Script par défaut * @return string * Nom du fichier (constante _SPIP_SCRIPT), sinon nom par défaut -**/ + **/ function get_spip_script($default = '') { # cas define('_SPIP_SCRIPT', ''); - if (_SPIP_SCRIPT) + if (_SPIP_SCRIPT) { return _SPIP_SCRIPT; - else + } else { return $default; + } } /** @@ -1715,35 +1923,41 @@ function get_spip_script($default = '') { * @param string $action * - Fichier d'exécution public (spip.php par défaut) * @return string URL -**/ + **/ function generer_url_public($script = '', $args = "", $no_entities = false, $rel = true, $action = '') { // si le script est une action (spip_pass, spip_inscription), // standardiser vers la nouvelle API - if (!$action) $action = get_spip_script(); - if ($script) + if (!$action) { + $action = get_spip_script(); + } + if ($script) { $action = parametre_url($action, _SPIP_PAGE, $script, '&'); + } if ($args) { if (is_array($args)) { $r = ''; - foreach($args as $k => $v) $r .= '&' . $k . '=' . $v; - $args = substr($r,1); + foreach ($args as $k => $v) { + $r .= '&' . $k . '=' . $v; + } + $args = substr($r, 1); } $action .= (strpos($action, '?') !== false ? '&' : '?') . $args; } - if (!$no_entities) + if (!$no_entities) { $action = quote_amp($action); + } // ne pas generer une url avec /./?page= en cas d'url absolue et de _SPIP_SCRIPT vide - return ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(),'/') . preg_replace(",^/[.]/,","/","/$action")); + return ($rel ? _DIR_RACINE . $action : rtrim(url_de_base(), '/') . preg_replace(",^/[.]/,", "/", "/$action")); } // http://code.spip.net/@generer_url_prive function generer_url_prive($script, $args = "", $no_entities = false) { - return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php'); + return generer_url_public($script, $args, $no_entities, false, _DIR_RESTREINT_ABS . 'prive.php'); } // Pour les formulaires en methode POST, @@ -1765,7 +1979,7 @@ function generer_url_prive($script, $args = "", $no_entities = false) { * Si indiqué, un bouton de soumission est créé avec texte sa valeur. * @return string * Code HTML du formulaire -**/ + **/ function generer_form_ecrire($script, $corps, $atts = '', $submit = '') { $script1 = explode('&', $script); @@ -1775,11 +1989,11 @@ function generer_form_ecrire($script, $corps, $atts = '', $submit = '') { . ($script ? generer_url_ecrire($script) : '') . "' " . ($atts ? $atts : " method='post'") - . "><div>\n" + . "><div>\n" . "<input type='hidden' name='exec' value='$script1' />" . $corps . (!$submit ? '' : - ("<div style='text-align: ".$GLOBALS['spip_lang_right']."'><input class='fondo' type='submit' value=\"".entites_html($submit)."\" /></div>")) + ("<div style='text-align: " . $GLOBALS['spip_lang_right'] . "'><input class='fondo' type='submit' value=\"" . entites_html($submit) . "\" /></div>")) . "</div></form>\n"; } @@ -1802,18 +2016,18 @@ function generer_form_action($script, $corps, $atts = '', $public = false) { // l'exec a l'origine de l'action, qui permet de savoir si il est necessaire // ou non de proceder a l'authentification (cas typique de l'install par exemple) $h = (_DIR_RACINE AND !$public) - ? generer_url_ecrire(_request('exec')) - : generer_url_public(); + ? generer_url_ecrire(_request('exec')) + : generer_url_public(); return "\n<form action='" . - $h . - "'" . - $atts . - ">\n" . - "<div>" . - "\n<input type='hidden' name='action' value='$script' />" . - $corps . - "</div></form>"; + $h . + "'" . + $atts . + ">\n" . + "<div>" . + "\n<input type='hidden' name='action' value='$script' />" . + $corps . + "</div></form>"; } /** @@ -1833,17 +2047,22 @@ function generer_form_action($script, $corps, $atts = '', $public = false) { * @return string * URL */ -function generer_url_action($script, $args = "", $no_entities = false , $public = false) { +function generer_url_action($script, $args = "", $no_entities = false, $public = false) { // si l'on est dans l'espace prive, on garde dans l'url // l'exec a l'origine de l'action, qui permet de savoir si il est necessaire // ou non de proceder a l'authentification (cas typique de l'install par exemple) - $url = (_DIR_RACINE AND !$public) - ? generer_url_ecrire(_request('exec')) - : generer_url_public('','',false,false); - $url = parametre_url($url,'action',$script); - if ($args) $url .= quote_amp('&'.$args); + $url = (_DIR_RACINE AND !$public) + ? generer_url_ecrire(_request('exec')) + : generer_url_public('', '', false, false); + $url = parametre_url($url, 'action', $script); + if ($args) { + $url .= quote_amp('&' . $args); + } + + if ($no_entities) { + $url = str_replace('&', '&', $url); + } - if ($no_entities) $url = str_replace('&','&',$url); return $url; } @@ -1856,8 +2075,8 @@ function generer_url_action($script, $args = "", $no_entities = false , $public * @param string $ti Répertoire temporaire inaccessible * @param string $ta Répertoire temporaire accessible */ -function spip_initialisation($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL) { - spip_initialisation_core($pi,$pa,$ti,$ta); +function spip_initialisation($pi = null, $pa = null, $ti = null, $ta = null) { + spip_initialisation_core($pi, $pa, $ti, $ta); spip_initialisation_suite(); } @@ -1877,111 +2096,205 @@ function spip_initialisation($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL) { * @param string $ti Répertoire temporaire inaccessible * @param string $ta Répertoire temporaire accessible */ -function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL) { +function spip_initialisation_core($pi = null, $pa = null, $ti = null, $ta = null) { static $too_late = 0; - if ($too_late++) return; + if ($too_late++) { + return; + } // Declaration des repertoires // le nom du repertoire plugins/ activables/desactivables - if (!defined('_DIR_PLUGINS')) define('_DIR_PLUGINS', _DIR_RACINE . "plugins/"); + if (!defined('_DIR_PLUGINS')) { + define('_DIR_PLUGINS', _DIR_RACINE . "plugins/"); + } // le nom du repertoire des extensions/ permanentes du core, toujours actives - if (!defined('_DIR_PLUGINS_DIST')) define('_DIR_PLUGINS_DIST', _DIR_RACINE . "plugins-dist/"); + if (!defined('_DIR_PLUGINS_DIST')) { + define('_DIR_PLUGINS_DIST', _DIR_RACINE . "plugins-dist/"); + } // le nom du repertoire des librairies - if (!defined('_DIR_LIB')) define('_DIR_LIB', _DIR_RACINE . "lib/"); + if (!defined('_DIR_LIB')) { + define('_DIR_LIB', _DIR_RACINE . "lib/"); + } - if (!defined('_DIR_IMG')) define('_DIR_IMG', $pa); - if (!defined('_DIR_LOGOS')) define('_DIR_LOGOS', $pa); - if (!defined('_DIR_IMG_ICONES')) define('_DIR_IMG_ICONES', _DIR_LOGOS . "icones/"); + if (!defined('_DIR_IMG')) { + define('_DIR_IMG', $pa); + } + if (!defined('_DIR_LOGOS')) { + define('_DIR_LOGOS', $pa); + } + if (!defined('_DIR_IMG_ICONES')) { + define('_DIR_IMG_ICONES', _DIR_LOGOS . "icones/"); + } - if (!defined('_DIR_DUMP')) define('_DIR_DUMP', $ti . "dump/"); - if (!defined('_DIR_SESSIONS')) define('_DIR_SESSIONS', $ti . "sessions/"); - if (!defined('_DIR_TRANSFERT')) define('_DIR_TRANSFERT', $ti . "upload/"); - if (!defined('_DIR_CACHE')) define('_DIR_CACHE', $ti . "cache/"); - if (!defined('_DIR_CACHE_XML')) define('_DIR_CACHE_XML', _DIR_CACHE . "xml/"); - if (!defined('_DIR_SKELS')) define('_DIR_SKELS', _DIR_CACHE . "skel/"); - if (!defined('_DIR_AIDE')) define('_DIR_AIDE', _DIR_CACHE . "aide/"); - if (!defined('_DIR_TMP')) define('_DIR_TMP', $ti); + if (!defined('_DIR_DUMP')) { + define('_DIR_DUMP', $ti . "dump/"); + } + if (!defined('_DIR_SESSIONS')) { + define('_DIR_SESSIONS', $ti . "sessions/"); + } + if (!defined('_DIR_TRANSFERT')) { + define('_DIR_TRANSFERT', $ti . "upload/"); + } + if (!defined('_DIR_CACHE')) { + define('_DIR_CACHE', $ti . "cache/"); + } + if (!defined('_DIR_CACHE_XML')) { + define('_DIR_CACHE_XML', _DIR_CACHE . "xml/"); + } + if (!defined('_DIR_SKELS')) { + define('_DIR_SKELS', _DIR_CACHE . "skel/"); + } + if (!defined('_DIR_AIDE')) { + define('_DIR_AIDE', _DIR_CACHE . "aide/"); + } + if (!defined('_DIR_TMP')) { + define('_DIR_TMP', $ti); + } - if (!defined('_DIR_VAR')) define('_DIR_VAR', $ta); + if (!defined('_DIR_VAR')) { + define('_DIR_VAR', $ta); + } - if (!defined('_DIR_ETC')) define('_DIR_ETC', $pi); - if (!defined('_DIR_CONNECT')) define('_DIR_CONNECT', $pi); - if (!defined('_DIR_CHMOD')) define('_DIR_CHMOD', $pi); + if (!defined('_DIR_ETC')) { + define('_DIR_ETC', $pi); + } + if (!defined('_DIR_CONNECT')) { + define('_DIR_CONNECT', $pi); + } + if (!defined('_DIR_CHMOD')) { + define('_DIR_CHMOD', $pi); + } if (!isset($GLOBALS['test_dirs'])) - // Pas $pi car il est bon de le mettre hors ecriture apres intstall - // il sera rajoute automatiquement si besoin a l'etape 2 de l'install - $GLOBALS['test_dirs'] = array($pa, $ti, $ta); + // Pas $pi car il est bon de le mettre hors ecriture apres intstall + // il sera rajoute automatiquement si besoin a l'etape 2 de l'install + { + $GLOBALS['test_dirs'] = array($pa, $ti, $ta); + } // Declaration des fichiers - if (!defined('_CACHE_PLUGINS_PATH')) define('_CACHE_PLUGINS_PATH', _DIR_CACHE . "charger_plugins_chemins.php"); - if (!defined('_CACHE_PLUGINS_OPT')) define('_CACHE_PLUGINS_OPT', _DIR_CACHE . "charger_plugins_options.php"); - if (!defined('_CACHE_PLUGINS_FCT')) define('_CACHE_PLUGINS_FCT', _DIR_CACHE . "charger_plugins_fonctions.php"); - if (!defined('_CACHE_PIPELINES')) define('_CACHE_PIPELINES', _DIR_CACHE."charger_pipelines.php"); - if (!defined('_CACHE_CHEMIN')) define('_CACHE_CHEMIN', _DIR_CACHE."chemin.txt"); + if (!defined('_CACHE_PLUGINS_PATH')) { + define('_CACHE_PLUGINS_PATH', _DIR_CACHE . "charger_plugins_chemins.php"); + } + if (!defined('_CACHE_PLUGINS_OPT')) { + define('_CACHE_PLUGINS_OPT', _DIR_CACHE . "charger_plugins_options.php"); + } + if (!defined('_CACHE_PLUGINS_FCT')) { + define('_CACHE_PLUGINS_FCT', _DIR_CACHE . "charger_plugins_fonctions.php"); + } + if (!defined('_CACHE_PIPELINES')) { + define('_CACHE_PIPELINES', _DIR_CACHE . "charger_pipelines.php"); + } + if (!defined('_CACHE_CHEMIN')) { + define('_CACHE_CHEMIN', _DIR_CACHE . "chemin.txt"); + } # attention .php obligatoire pour ecrire_fichier_securise - if (!defined('_FILE_META')) define('_FILE_META', $ti . 'meta_cache.php'); - if (!defined('_DIR_LOG')) define('_DIR_LOG', _DIR_TMP . 'log/'); - if (!defined('_FILE_LOG')) define('_FILE_LOG', 'spip'); - if (!defined('_FILE_LOG_SUFFIX')) define('_FILE_LOG_SUFFIX', '.log'); + if (!defined('_FILE_META')) { + define('_FILE_META', $ti . 'meta_cache.php'); + } + if (!defined('_DIR_LOG')) { + define('_DIR_LOG', _DIR_TMP . 'log/'); + } + if (!defined('_FILE_LOG')) { + define('_FILE_LOG', 'spip'); + } + if (!defined('_FILE_LOG_SUFFIX')) { + define('_FILE_LOG_SUFFIX', '.log'); + } // Le fichier de connexion a la base de donnees // tient compte des anciennes versions (inc_connect...) - if (!defined('_FILE_CONNECT_INS')) define('_FILE_CONNECT_INS', 'connect'); - if (!defined('_FILE_CONNECT')) define('_FILE_CONNECT', + if (!defined('_FILE_CONNECT_INS')) { + define('_FILE_CONNECT_INS', 'connect'); + } + if (!defined('_FILE_CONNECT')) { + define('_FILE_CONNECT', (@is_readable($f = _DIR_CONNECT . _FILE_CONNECT_INS . '.php') ? $f - : (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f - : false))); + : (@is_readable($f = _DIR_RESTREINT . 'inc_connect.php') ? $f + : false))); + } // Le fichier de reglages des droits - if (!defined('_FILE_CHMOD_INS')) define('_FILE_CHMOD_INS', 'chmod'); - if (!defined('_FILE_CHMOD')) define('_FILE_CHMOD', + if (!defined('_FILE_CHMOD_INS')) { + define('_FILE_CHMOD_INS', 'chmod'); + } + if (!defined('_FILE_CHMOD')) { + define('_FILE_CHMOD', (@is_readable($f = _DIR_CHMOD . _FILE_CHMOD_INS . '.php') ? $f - : false)); + : false)); + } - if (!defined('_FILE_LDAP')) define('_FILE_LDAP', 'ldap.php'); + if (!defined('_FILE_LDAP')) { + define('_FILE_LDAP', 'ldap.php'); + } - if (!defined('_FILE_TMP_SUFFIX')) define('_FILE_TMP_SUFFIX', '.tmp.php'); - if (!defined('_FILE_CONNECT_TMP')) define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX); - if (!defined('_FILE_CHMOD_TMP')) define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX); + if (!defined('_FILE_TMP_SUFFIX')) { + define('_FILE_TMP_SUFFIX', '.tmp.php'); + } + if (!defined('_FILE_CONNECT_TMP')) { + define('_FILE_CONNECT_TMP', _DIR_CONNECT . _FILE_CONNECT_INS . _FILE_TMP_SUFFIX); + } + if (!defined('_FILE_CHMOD_TMP')) { + define('_FILE_CHMOD_TMP', _DIR_CHMOD . _FILE_CHMOD_INS . _FILE_TMP_SUFFIX); + } // Definition des droits d'acces en ecriture - if (!defined('_SPIP_CHMOD') AND _FILE_CHMOD) + if (!defined('_SPIP_CHMOD') AND _FILE_CHMOD) { include_once _FILE_CHMOD; + } // Se mefier des fichiers mal remplis! - if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', 0777); + if (!defined('_SPIP_CHMOD')) { + define('_SPIP_CHMOD', 0777); + } if (!defined('_DEFAULT_CHARSET')) { /** Le charset par défaut lors de l'installation */ define('_DEFAULT_CHARSET', 'utf-8'); } - if (!defined('_ROOT_PLUGINS')) define('_ROOT_PLUGINS', _ROOT_RACINE . "plugins/"); - if (!defined('_ROOT_PLUGINS_DIST')) define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . "plugins-dist/"); - if (!defined('_ROOT_PLUGINS_SUPPL') && defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE,'',_DIR_PLUGINS_SUPPL)); + if (!defined('_ROOT_PLUGINS')) { + define('_ROOT_PLUGINS', _ROOT_RACINE . "plugins/"); + } + if (!defined('_ROOT_PLUGINS_DIST')) { + define('_ROOT_PLUGINS_DIST', _ROOT_RACINE . "plugins-dist/"); + } + if (!defined('_ROOT_PLUGINS_SUPPL') && defined('_DIR_PLUGINS_SUPPL') && _DIR_PLUGINS_SUPPL) { + define('_ROOT_PLUGINS_SUPPL', _ROOT_RACINE . str_replace(_DIR_RACINE, '', _DIR_PLUGINS_SUPPL)); + } // La taille des Log - if (!defined('_MAX_LOG')) define('_MAX_LOG', 100); + if (!defined('_MAX_LOG')) { + define('_MAX_LOG', 100); + } // Sommes-nous dans l'empire du Mal ? // (ou sous le signe du Pingouin, ascendant GNU ?) - if (isset($_SERVER['SERVER_SOFTWARE']) AND strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false){ - if (!defined('_OS_SERVEUR')) define('_OS_SERVEUR', 'windows'); - if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',1); // utiliser le flock php - } - else { - if (!defined('_OS_SERVEUR')) define('_OS_SERVEUR', ''); - if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',1); // utiliser le flock php + if (isset($_SERVER['SERVER_SOFTWARE']) AND strpos($_SERVER['SERVER_SOFTWARE'], '(Win') !== false) { + if (!defined('_OS_SERVEUR')) { + define('_OS_SERVEUR', 'windows'); + } + if (!defined('_SPIP_LOCK_MODE')) { + define('_SPIP_LOCK_MODE', 1); + } // utiliser le flock php + } else { + if (!defined('_OS_SERVEUR')) { + define('_OS_SERVEUR', ''); + } + if (!defined('_SPIP_LOCK_MODE')) { + define('_SPIP_LOCK_MODE', 1); + } // utiliser le flock php #if (!defined('_SPIP_LOCK_MODE')) define('_SPIP_LOCK_MODE',2); // utiliser le nfslock de spip mais link() est tres souvent interdite } // Langue par defaut - if (!defined('_LANGUE_PAR_DEFAUT')) define('_LANGUE_PAR_DEFAUT','fr'); + if (!defined('_LANGUE_PAR_DEFAUT')) { + define('_LANGUE_PAR_DEFAUT', 'fr'); + } // // Module de lecture/ecriture/suppression de fichiers utilisant flock() @@ -2000,7 +2313,9 @@ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL // // Ne pas se faire manger par un bug php qui accepte ?GLOBALS[truc]=toto - if (isset($_REQUEST['GLOBALS'])) die(); + if (isset($_REQUEST['GLOBALS'])) { + die(); + } // nettoyer les magic quotes \' et les caracteres nuls %00 spip_desinfecte($_GET); spip_desinfecte($_POST); @@ -2008,7 +2323,7 @@ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL spip_desinfecte($_REQUEST); // Par ailleurs on ne veut pas de magic_quotes au cours de l'execution - if(version_compare(PHP_VERSION, '5.3.0', '<')){ + if (version_compare(PHP_VERSION, '5.3.0', '<')) { set_magic_quotes_runtime(0); } @@ -2019,7 +2334,7 @@ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL if (test_valeur_serveur(@ini_get('register_globals'))) { // ne pas desinfecter les globales en profondeur car elle contient aussi les // precedentes, qui seraient desinfectees 2 fois. - spip_desinfecte($GLOBALS,false); + spip_desinfecte($GLOBALS, false); // plugin grenier if (include_spip('inc/php3')) { spip_register_globals(true); @@ -2052,12 +2367,16 @@ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL } else { $GLOBALS['REQUEST_URI'] = $_SERVER['PHP_SELF']; if (!empty($_SERVER['QUERY_STRING']) - AND !strpos($_SERVER['REQUEST_URI'], '?')) - $GLOBALS['REQUEST_URI'] .= '?'.$_SERVER['QUERY_STRING']; + AND !strpos($_SERVER['REQUEST_URI'], '?') + ) { + $GLOBALS['REQUEST_URI'] .= '?' . $_SERVER['QUERY_STRING']; + } } // Duree de validite de l'alea pour les cookies et ce qui s'ensuit. - if (!defined('_RENOUVELLE_ALEA')) define('_RENOUVELLE_ALEA', 12 * 3600); + if (!defined('_RENOUVELLE_ALEA')) { + define('_RENOUVELLE_ALEA', 12*3600); + } // charger les meta si possible et renouveller l'alea au besoin // charge aussi effacer_meta et ecrire_meta @@ -2065,17 +2384,18 @@ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL $inc_meta(); // on a pas pu le faire plus tot - if ($avertir_register_globals) { - avertir_auteurs("register_globals", _L("Problème de sécurité : register_globals=on; dans php.ini à corriger.")); + if ($avertir_register_globals) { + avertir_auteurs("register_globals", + _L("Problème de sécurité : register_globals=on; dans php.ini à corriger.")); } // nombre de repertoires depuis la racine // on compare a l'adresse de spip.php : $_SERVER["SCRIPT_NAME"] // ou a defaut celle donnee en meta ; (mais si celle-ci est fausse // le calcul est faux) - if (!_DIR_RESTREINT) + if (!_DIR_RESTREINT) { $GLOBALS['profondeur_url'] = 1; - else { + } else { $uri = isset($_SERVER['REQUEST_URI']) ? explode('?', $_SERVER['REQUEST_URI']) : ''; $uri_ref = $_SERVER["SCRIPT_NAME"]; if (!$uri_ref @@ -2083,29 +2403,32 @@ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL // si jamais c'est de la mutu avec sous rep, on est perdu si on se fie // a spip.php qui est a la racine du spip, et vue qu'on sait pas se reperer // s'en remettre a l'adresse du site. alea jacta est. - OR $ti!==_NOM_TEMPORAIRES_INACCESSIBLES){ + OR $ti !== _NOM_TEMPORAIRES_INACCESSIBLES + ) { if (isset($GLOBALS['meta']['adresse_site'])) { $uri_ref = parse_url($GLOBALS['meta']['adresse_site']); - $uri_ref = $uri_ref['path'].'/'; - } - else + $uri_ref = $uri_ref['path'] . '/'; + } else { $uri_ref = ""; + } } - if (!$uri OR !$uri_ref) + if (!$uri OR !$uri_ref) { $GLOBALS['profondeur_url'] = 0; - else { + } else { $GLOBALS['profondeur_url'] = max(0, substr_count($uri[0], '/') - - substr_count($uri_ref,'/')); + -substr_count($uri_ref, '/')); } } // s'il y a un cookie ou PHP_AUTH, initialiser visiteur_session if (_FILE_CONNECT) { - if (verifier_visiteur()=='0minirezo' + if (verifier_visiteur() == '0minirezo' // si c'est un admin sans cookie admin, il faut ignorer le cache chemin ! - AND !isset($_COOKIE['spip_admin'])) + AND !isset($_COOKIE['spip_admin']) + ) { clear_path_cache(); + } } } @@ -2115,12 +2438,16 @@ function spip_initialisation_core($pi = NULL, $pa = NULL, $ti = NULL, $ta = NULL * par les plugins * */ -function spip_initialisation_suite(){ +function spip_initialisation_suite() { static $too_late = 0; - if ($too_late++) return; + if ($too_late++) { + return; + } // taille mini des login - if (!defined('_LOGIN_TROP_COURT')) define('_LOGIN_TROP_COURT', 4); + if (!defined('_LOGIN_TROP_COURT')) { + define('_LOGIN_TROP_COURT', 4); + } // la taille maxi des logos (0 : pas de limite) (pas de define par defaut, ce n'est pas utile) #if (!defined('_LOGO_MAX_SIZE')) define('_LOGO_MAX_SIZE', 0); # poids en ko @@ -2133,47 +2460,75 @@ function spip_initialisation_suite(){ #if (!defined('_IMG_MAX_WIDTH')) define('_IMG_MAX_WIDTH', 0); # largeur en pixels #if (!defined('_IMG_MAX_HEIGHT')) define('_IMG_MAX_HEIGHT', 0); # hauteur en pixels - if (!defined('_PASS_LONGUEUR_MINI')) define('_PASS_LONGUEUR_MINI', 6); + if (!defined('_PASS_LONGUEUR_MINI')) { + define('_PASS_LONGUEUR_MINI', 6); + } // Qualite des images calculees automatiquement. C'est un nombre entre 0 et 100, meme pour imagick (on ramene a 0..1 par la suite) - if (!defined('_IMG_QUALITE')) define('_IMG_QUALITE', 85); # valeur par defaut - if (!defined('_IMG_GD_QUALITE')) define('_IMG_GD_QUALITE', _IMG_QUALITE); # surcharge pour la lib GD - if (!defined('_IMG_CONVERT_QUALITE')) define('_IMG_CONVERT_QUALITE', _IMG_QUALITE); # surcharge pour imagick en ligne de commande + if (!defined('_IMG_QUALITE')) { + define('_IMG_QUALITE', 85); + } # valeur par defaut + if (!defined('_IMG_GD_QUALITE')) { + define('_IMG_GD_QUALITE', _IMG_QUALITE); + } # surcharge pour la lib GD + if (!defined('_IMG_CONVERT_QUALITE')) { + define('_IMG_CONVERT_QUALITE', _IMG_QUALITE); + } # surcharge pour imagick en ligne de commande // Historiquement la valeur pour imagick semble differente. Si ca n'est pas necessaire, il serait preferable de garder _IMG_QUALITE - if (!defined('_IMG_IMAGICK_QUALITE')) define('_IMG_IMAGICK_QUALITE', 75); # surcharge pour imagick en PHP + if (!defined('_IMG_IMAGICK_QUALITE')) { + define('_IMG_IMAGICK_QUALITE', 75); + } # surcharge pour imagick en PHP - if (!defined('_COPIE_LOCALE_MAX_SIZE')) define('_COPIE_LOCALE_MAX_SIZE', 33554432); // poids en octet + if (!defined('_COPIE_LOCALE_MAX_SIZE')) { + define('_COPIE_LOCALE_MAX_SIZE', 33554432); + } // poids en octet // qq chaines standard - if (!defined('_ACCESS_FILE_NAME')) define('_ACCESS_FILE_NAME', '.htaccess'); - if (!defined('_AUTH_USER_FILE')) define('_AUTH_USER_FILE', '.htpasswd'); - if (!defined('_SPIP_DUMP')) define('_SPIP_DUMP', 'dump@nom_site@@stamp@.xml'); - if (!defined('_CACHE_RUBRIQUES')){ + if (!defined('_ACCESS_FILE_NAME')) { + define('_ACCESS_FILE_NAME', '.htaccess'); + } + if (!defined('_AUTH_USER_FILE')) { + define('_AUTH_USER_FILE', '.htpasswd'); + } + if (!defined('_SPIP_DUMP')) { + define('_SPIP_DUMP', 'dump@nom_site@@stamp@.xml'); + } + if (!defined('_CACHE_RUBRIQUES')) { /** Fichier cache pour le navigateur de rubrique du bandeau */ define('_CACHE_RUBRIQUES', _DIR_TMP . 'menu-rubriques-cache.txt'); } - if (!defined('_CACHE_RUBRIQUES_MAX')){ + if (!defined('_CACHE_RUBRIQUES_MAX')) { /** Nombre maxi de rubriques enfants affichées pour chaque rubrique du navigateur de rubrique du bandeau */ define('_CACHE_RUBRIQUES_MAX', 500); } - if (!defined('_EXTENSION_SQUELETTES')) define('_EXTENSION_SQUELETTES', 'html'); + if (!defined('_EXTENSION_SQUELETTES')) { + define('_EXTENSION_SQUELETTES', 'html'); + } - if (!defined('_DOCTYPE_ECRIRE')) define('_DOCTYPE_ECRIRE', - // "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n"); - //"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>\n"); - //"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>\n"); - // "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1 //EN' 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n"); - "<!DOCTYPE html>\n"); - if (!defined('_DOCTYPE_AIDE')) define('_DOCTYPE_AIDE', - "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"); + if (!defined('_DOCTYPE_ECRIRE')) { + define('_DOCTYPE_ECRIRE', + // "<!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML 4.01 Transitional//EN' 'http://www.w3.org/TR/html4/loose.dtd'>\n"); + //"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Transitional//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd'>\n"); + //"<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.0 Strict//EN' 'http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd'>\n"); + // "<!DOCTYPE html PUBLIC '-//W3C//DTD XHTML 1.1 //EN' 'http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd'>\n"); + "<!DOCTYPE html>\n"); + } + if (!defined('_DOCTYPE_AIDE')) { + define('_DOCTYPE_AIDE', + "<!DOCTYPE html PUBLIC '-//W3C//DTD HTML 4.01 Frameset//EN' 'http://www.w3.org/TR/1999/REC-html401-19991224/frameset.dtd'>"); + } /** L'adresse de base du site ; on peut mettre '' si la racine est gerée par * le script de l'espace public, alias index.php */ - if (!defined('_SPIP_SCRIPT')) define('_SPIP_SCRIPT', 'spip.php'); + if (!defined('_SPIP_SCRIPT')) { + define('_SPIP_SCRIPT', 'spip.php'); + } /** Argument page, personalisable en cas de conflit avec un autre script */ - if (!defined('_SPIP_PAGE')) define('_SPIP_PAGE', 'page'); + if (!defined('_SPIP_PAGE')) { + define('_SPIP_PAGE', 'page'); + } // le script de l'espace prive // Mettre a "index.php" si DirectoryIndex ne le fait pas ou pb connexes: @@ -2186,55 +2541,70 @@ function spip_initialisation_suite(){ } - if (!defined('_SPIP_AJAX')) + if (!defined('_SPIP_AJAX')) { define('_SPIP_AJAX', ((!isset($_COOKIE['spip_accepte_ajax'])) ? 1 - : (($_COOKIE['spip_accepte_ajax']!=-1) ? 1 : 0))); + : (($_COOKIE['spip_accepte_ajax'] != -1) ? 1 : 0))); + } // La requete est-elle en ajax ? - if (!defined('_AJAX')) define('_AJAX', - (isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery - OR !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery - OR !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins - OR !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip - ) - AND empty($_REQUEST['var_noajax']) # horrible exception, car c'est pas parce que la requete est ajax jquery qu'il faut tuer tous les formulaires ajax qu'elle contient - ); + if (!defined('_AJAX')) { + define('_AJAX', + (isset($_SERVER['HTTP_X_REQUESTED_WITH']) # ajax jQuery + OR !empty($_REQUEST['var_ajax_redir']) # redirection 302 apres ajax jQuery + OR !empty($_REQUEST['var_ajaxcharset']) # compat ascendante pour plugins + OR !empty($_REQUEST['var_ajax']) # forms ajax & inclure ajax de spip + ) + AND empty($_REQUEST['var_noajax']) # horrible exception, car c'est pas parce que la requete est ajax jquery qu'il faut tuer tous les formulaires ajax qu'elle contient + ); + } # nombre de pixels maxi pour calcul de la vignette avec gd # au dela de 5500000 on considere que php n'est pas limite en memoire pour cette operation # les configurations limitees en memoire ont un seuil plutot vers 1MPixel - if (!defined('_IMG_GD_MAX_PIXELS')) define('_IMG_GD_MAX_PIXELS', - (isset($GLOBALS['meta']['max_taille_vignettes']) AND $GLOBALS['meta']['max_taille_vignettes']) - ? $GLOBALS['meta']['max_taille_vignettes'] - : 0); + if (!defined('_IMG_GD_MAX_PIXELS')) { + define('_IMG_GD_MAX_PIXELS', + (isset($GLOBALS['meta']['max_taille_vignettes']) AND $GLOBALS['meta']['max_taille_vignettes']) + ? $GLOBALS['meta']['max_taille_vignettes'] + : 0); + } - if (!defined('_MEMORY_LIMIT_MIN')) define('_MEMORY_LIMIT_MIN', 16); // en Mo + if (!defined('_MEMORY_LIMIT_MIN')) { + define('_MEMORY_LIMIT_MIN', 16); + } // en Mo // si on est dans l'espace prive et si le besoin est superieur a 8Mo (qui est vraiment le standard) // on verifie que la memoire est suffisante pour le compactage css+js pour eviter la page blanche // il y aura d'autres problemes et l'utilisateur n'ira pas tres loin, mais ce sera plus comprehensible qu'une page blanche - if (test_espace_prive() AND _MEMORY_LIMIT_MIN>8){ - if ($memory = trim(ini_get('memory_limit'))){ + if (test_espace_prive() AND _MEMORY_LIMIT_MIN > 8) { + if ($memory = trim(ini_get('memory_limit'))) { $unit = strtolower(substr($memory, strlen($memory/1), 1)); switch ($unit) { // Le modifieur 'G' est disponible depuis PHP 5.1.0 - case 'g': $memory *= 1024; - case 'm': $memory *= 1024; - case 'k': $memory *= 1024; + case 'g': + $memory *= 1024; + case 'm': + $memory *= 1024; + case 'k': + $memory *= 1024; } - if ($memory<_MEMORY_LIMIT_MIN*1024*1024){ + if ($memory < _MEMORY_LIMIT_MIN*1024*1024) { @ini_set('memory_limit', $m = _MEMORY_LIMIT_MIN . 'M'); - if (trim(ini_get('memory_limit'))!=$m){ - if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true); // evite une page blanche car on ne saura pas calculer la css dans ce hit + if (trim(ini_get('memory_limit')) != $m) { + if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) { + define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true); + } // evite une page blanche car on ne saura pas calculer la css dans ce hit } } - } - else - if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true); // evite une page blanche car on ne saura pas calculer la css dans ce hit + } else { + if (!defined('_INTERDIRE_COMPACTE_HEAD_ECRIRE')) { + define('_INTERDIRE_COMPACTE_HEAD_ECRIRE', true); + } + } // evite une page blanche car on ne saura pas calculer la css dans ce hit } // Protocoles a normaliser dans les chaines de langues - if (!defined('_PROTOCOLES_STD')) + if (!defined('_PROTOCOLES_STD')) { define('_PROTOCOLES_STD', 'http|https|ftp|mailto|webcal'); + } init_var_mode(); } @@ -2242,17 +2612,20 @@ function spip_initialisation_suite(){ // Reperer les variables d'URL qui conditionnent la perennite du cache, des urls // ou d'autres petit caches (trouver_table, css et js compactes ...) // http://code.spip.net/@init_var_mode -function init_var_mode(){ +function init_var_mode() { static $done = false; if (!$done) { if (isset($_GET['var_mode'])) { - $var_mode = explode(',',$_GET['var_mode']); + $var_mode = explode(',', $_GET['var_mode']); // tout le monde peut calcul/recalcul - if (!defined('_VAR_MODE')){ - if (in_array('recalcul',$var_mode)) define('_VAR_MODE','recalcul'); - elseif (in_array('calcul',$var_mode)) define('_VAR_MODE','calcul'); - $var_mode = array_diff($var_mode,array('calcul','recalcul')); + if (!defined('_VAR_MODE')) { + if (in_array('recalcul', $var_mode)) { + define('_VAR_MODE', 'recalcul'); + } elseif (in_array('calcul', $var_mode)) { + define('_VAR_MODE', 'calcul'); + } + $var_mode = array_diff($var_mode, array('calcul', 'recalcul')); } if ($var_mode) { include_spip('inc/autoriser'); @@ -2262,71 +2635,101 @@ function init_var_mode(){ ? 'previsualiser' : 'debug' )) { - if (in_array('traduction',$var_mode)){ + if (in_array('traduction', $var_mode)) { // forcer le calcul pour passer dans traduire - if (!defined('_VAR_MODE')) define('_VAR_MODE', 'calcul'); + if (!defined('_VAR_MODE')) { + define('_VAR_MODE', 'calcul'); + } // et ne pas enregistrer de cache pour ne pas trainer les surlignages sur d'autres pages - if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE', true); - $var_mode = array_diff($var_mode,array('traduction')); + if (!defined('_VAR_NOCACHE')) { + define('_VAR_NOCACHE', true); + } + $var_mode = array_diff($var_mode, array('traduction')); } - if (in_array('preview',$var_mode)){ + if (in_array('preview', $var_mode)) { // basculer sur les criteres de preview dans les boucles - if (!defined('_VAR_PREVIEW')) define('_VAR_PREVIEW', true); + if (!defined('_VAR_PREVIEW')) { + define('_VAR_PREVIEW', true); + } // forcer le calcul - if (!defined('_VAR_MODE')) define('_VAR_MODE', 'calcul'); + if (!defined('_VAR_MODE')) { + define('_VAR_MODE', 'calcul'); + } // et ne pas enregistrer de cache - if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE', true); - $var_mode = array_diff($var_mode,array('preview')); + if (!defined('_VAR_NOCACHE')) { + define('_VAR_NOCACHE', true); + } + $var_mode = array_diff($var_mode, array('preview')); } - if (in_array('inclure',$var_mode)){ + if (in_array('inclure', $var_mode)) { // forcer le compilo et ignorer les caches existants - if (!defined('_VAR_MODE')) define('_VAR_MODE', 'calcul'); - if (!defined('_VAR_INCLURE')) define('_VAR_INCLURE', true); + if (!defined('_VAR_MODE')) { + define('_VAR_MODE', 'calcul'); + } + if (!defined('_VAR_INCLURE')) { + define('_VAR_INCLURE', true); + } // et ne pas enregistrer de cache - if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE', true); - $var_mode = array_diff($var_mode,array('inclure')); + if (!defined('_VAR_NOCACHE')) { + define('_VAR_NOCACHE', true); + } + $var_mode = array_diff($var_mode, array('inclure')); } - if (in_array('urls',$var_mode)){ + if (in_array('urls', $var_mode)) { // forcer le compilo et ignorer les caches existants - if (!defined('_VAR_MODE')) define('_VAR_MODE', 'calcul'); - if (!defined('_VAR_URLS')) define('_VAR_URLS', true); - $var_mode = array_diff($var_mode,array('urls')); + if (!defined('_VAR_MODE')) { + define('_VAR_MODE', 'calcul'); + } + if (!defined('_VAR_URLS')) { + define('_VAR_URLS', true); + } + $var_mode = array_diff($var_mode, array('urls')); } - if (in_array('images',$var_mode)){ + if (in_array('images', $var_mode)) { // forcer le compilo et ignorer les caches existants - if (!defined('_VAR_MODE')) define('_VAR_MODE', 'calcul'); + if (!defined('_VAR_MODE')) { + define('_VAR_MODE', 'calcul'); + } // indiquer qu'on doit recalculer les images - if (!defined('_VAR_IMAGES')) define('_VAR_IMAGES', true); - $var_mode = array_diff($var_mode,array('images')); + if (!defined('_VAR_IMAGES')) { + define('_VAR_IMAGES', true); + } + $var_mode = array_diff($var_mode, array('images')); } - if (in_array('debug',$var_mode)){ - if (!defined('_VAR_MODE')) define('_VAR_MODE', 'debug'); + if (in_array('debug', $var_mode)) { + if (!defined('_VAR_MODE')) { + define('_VAR_MODE', 'debug'); + } // et ne pas enregistrer de cache - if (!defined('_VAR_NOCACHE')) define('_VAR_NOCACHE', true); - $var_mode = array_diff($var_mode,array('debug')); + if (!defined('_VAR_NOCACHE')) { + define('_VAR_NOCACHE', true); + } + $var_mode = array_diff($var_mode, array('debug')); } - if (count($var_mode) AND !defined('_VAR_MODE')){ - define('_VAR_MODE',reset($var_mode)); + if (count($var_mode) AND !defined('_VAR_MODE')) { + define('_VAR_MODE', reset($var_mode)); } - if (isset($GLOBALS['visiteur_session']['nom'])) - spip_log($GLOBALS['visiteur_session']['nom'] - . " "._VAR_MODE); - } - // pas autorise ? + if (isset($GLOBALS['visiteur_session']['nom'])) { + spip_log($GLOBALS['visiteur_session']['nom'] + . " " . _VAR_MODE); + } + } // pas autorise ? else { // si on n'est pas connecte on se redirige if (!$GLOBALS['visiteur_session']) { include_spip('inc/headers'); redirige_par_entete(generer_url_public('login', - 'url='.rawurlencode( - parametre_url(self(), 'var_mode', $_GET['var_mode'], '&') - ), true)); + 'url=' . rawurlencode( + parametre_url(self(), 'var_mode', $_GET['var_mode'], '&') + ), true)); } // sinon tant pis } } } - if (!defined('_VAR_MODE')) define('_VAR_MODE',false); + if (!defined('_VAR_MODE')) { + define('_VAR_MODE', false); + } $done = true; } } @@ -2337,18 +2740,22 @@ function init_var_mode(){ // http://code.spip.net/@spip_desinfecte function spip_desinfecte(&$t, $deep = true) { static $magic_quotes; - if (!isset($magic_quotes)) + if (!isset($magic_quotes)) { $magic_quotes = @get_magic_quotes_gpc(); + } foreach ($t as $key => $val) { if (is_string($t[$key])) { - if ($magic_quotes) + if ($magic_quotes) { $t[$key] = stripslashes($t[$key]); + } $t[$key] = str_replace(chr(0), '-', $t[$key]); + } // traiter aussi les "texte_plus" de article_edit + else { + if ($deep AND is_array($t[$key]) AND $key !== 'GLOBALS') { + spip_desinfecte($t[$key], $deep); + } } - // traiter aussi les "texte_plus" de article_edit - else if ($deep AND is_array($t[$key]) AND $key!=='GLOBALS') - spip_desinfecte($t[$key],$deep); } } @@ -2361,10 +2768,10 @@ function verifier_visiteur() { // mais on risque de perturber des plugins en initialisant trop tot // certaines constantes @spip_initialisation_core( - (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES), - (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES), - (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES), - (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES) + (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES), + (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES), + (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES), + (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES) ); // Demarrer une session NON AUTHENTIFIEE si on donne son nom @@ -2372,7 +2779,7 @@ function verifier_visiteur() { // Attention on separe bien session_nom et nom, pour eviter // les melanges entre donnees SQL et variables plus aleatoires $variables_session = array('session_nom', 'session_email'); - foreach($variables_session as $var) { + foreach ($variables_session as $var) { if (_request($var) !== null) { $init = true; break; @@ -2383,28 +2790,33 @@ function verifier_visiteur() { $session = charger_fonction('session', 'inc'); $session(); include_spip('inc/texte'); - foreach($variables_session as $var) - if (($a = _request($var)) !== null) + foreach ($variables_session as $var) { + if (($a = _request($var)) !== null) { $GLOBALS['visiteur_session'][$var] = safehtml($a); - if (!isset($GLOBALS['visiteur_session']['id_auteur'])) + } + } + if (!isset($GLOBALS['visiteur_session']['id_auteur'])) { $GLOBALS['visiteur_session']['id_auteur'] = 0; + } $session($GLOBALS['visiteur_session']); + return 0; } - $h = (isset($_SERVER['PHP_AUTH_USER']) AND !$GLOBALS['ignore_auth_http']); - if ($h OR isset($_COOKIE['spip_session']) OR isset($_COOKIE[$GLOBALS['cookie_prefix'].'_session'])) { + $h = (isset($_SERVER['PHP_AUTH_USER']) AND !$GLOBALS['ignore_auth_http']); + if ($h OR isset($_COOKIE['spip_session']) OR isset($_COOKIE[$GLOBALS['cookie_prefix'] . '_session'])) { $session = charger_fonction('session', 'inc'); if ($session()) { return $GLOBALS['visiteur_session']['statut']; } - if ($h AND isset($_SERVER['PHP_AUTH_PW'])) { + if ($h AND isset($_SERVER['PHP_AUTH_PW'])) { include_spip('inc/auth'); $h = lire_php_auth($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']); } if ($h) { $GLOBALS['visiteur_session'] = $h; + return $GLOBALS['visiteur_session']['statut']; } } @@ -2434,13 +2846,13 @@ function verifier_visiteur() { * - null : Pour restituer la dernière langue mémorisée. * @return string * - string Langue utilisée. -**/ -function lang_select($lang = NULL) { + **/ +function lang_select($lang = null) { static $pile_langues = array(); if (!function_exists('changer_langue')) { include_spip('inc/lang'); } - if ($lang === NULL) { + if ($lang === null) { $lang = array_pop($pile_langues); } else { array_push($pile_langues, $GLOBALS['spip_lang']); @@ -2449,6 +2861,7 @@ function lang_select($lang = NULL) { return $lang; } changer_langue($lang); + return $lang; } @@ -2458,24 +2871,25 @@ function lang_select($lang = NULL) { * Permet de savoir si on peut utiliser un cache enregistré pour cette session. * Cette chaîne est courte (8 cars) pour pouvoir être utilisée dans un nom * de fichier cache. - * + * * @pipeline_appel definir_session - * + * * @param bool $force * @return string * Identifiant de la session -**/ + **/ function spip_session($force = false) { static $session; if ($force OR !isset($session)) { $s = pipeline('definir_session', $GLOBALS['visiteur_session'] - ? serialize($GLOBALS['visiteur_session']) + ? serialize($GLOBALS['visiteur_session']) . '_' . @$_COOKIE['spip_session'] - : '' + : '' ); $session = $s ? substr(md5($s), 0, 8) : ''; } + #spip_log('session: '.$session); return $session; } @@ -2488,15 +2902,16 @@ function spip_session($force = false) { * Surchargeable mais pas d'erreur fatale si indisponible. * * @param string $aide - * Cle d'identification de l'aide desiree + * Cle d'identification de l'aide desiree * @param bool $distante - * Generer une url locale (par defaut) - * ou une url distante [directement sur spip.net] + * Generer une url locale (par defaut) + * ou une url distante [directement sur spip.net] * @return Lien sur une icone d'aide -**/ + **/ function aide($aide = '', $distante = false) { - $aider = charger_fonction('aider', 'inc', true); - return $aider ? $aider($aide, '', array(), $distante) : ''; + $aider = charger_fonction('aider', 'inc', true); + + return $aider ? $aider($aide, '', array(), $distante) : ''; } /** @@ -2506,10 +2921,11 @@ function aide($aide = '', $distante = false) { */ function exec_info_dist() { - if ($GLOBALS['connect_statut'] == '0minirezo') + if ($GLOBALS['connect_statut'] == '0minirezo') { phpinfo(); - else + } else { echo "pas admin"; + } } /** @@ -2527,13 +2943,14 @@ function exec_info_dist() { * @return null|string * - Rien dans la plupart des cas * - string si $message à false. -**/ + **/ function erreur_squelette($message = '', $lieu = '') { $debusquer = charger_fonction('debusquer', 'public'); if (is_array($lieu)) { include_spip('public/compiler'); $lieu = reconstruire_contexte_compil($lieu); } + return $debusquer($message, $lieu); } @@ -2550,7 +2967,7 @@ function erreur_squelette($message = '', $lieu = '') { * pour chaque $fond fourni. * * @api - * @param string/array $fond + * @param string /array $fond * - Le ou les squelettes à utiliser, sans l'extension, {@example prive/liste/auteurs} * - Le fichier sera retrouvé dans la liste des chemins connus de SPIP (squelettes, plugins, spip) * @param array $contexte @@ -2571,14 +2988,19 @@ function erreur_squelette($message = '', $lieu = '') { * - ou tableau d'information sur le squelette. */ function recuperer_fond($fond, $contexte = array(), $options = array(), $connect = '') { - if (!function_exists('evaluer_fond')) + if (!function_exists('evaluer_fond')) { include_spip('public/assembler'); + } // assurer la compat avec l'ancienne syntaxe // (trim etait le 3eme argument, par defaut a true) - if (!is_array($options)) $options = array('trim'=>$options); - if (!isset($options['trim'])) $options['trim']=true; + if (!is_array($options)) { + $options = array('trim' => $options); + } + if (!isset($options['trim'])) { + $options['trim'] = true; + } - if (isset($contexte['connect'])){ + if (isset($contexte['connect'])) { $connect = ($connect ? $connect : $contexte['connect']); unset($contexte['connect']); } @@ -2586,10 +3008,11 @@ function recuperer_fond($fond, $contexte = array(), $options = array(), $connect $texte = ""; $pages = array(); $lang_select = ''; - if (!isset($options['etoile']) OR !$options['etoile']){ + if (!isset($options['etoile']) OR !$options['etoile']) { // Si on a inclus sans fixer le critere de lang, on prend la langue courante - if (!isset($contexte['lang'])) + if (!isset($contexte['lang'])) { $contexte['lang'] = $GLOBALS['spip_lang']; + } if ($contexte['lang'] != $GLOBALS['meta']['langue_site']) { $lang_select = lang_select($contexte['lang']); @@ -2603,40 +3026,46 @@ function recuperer_fond($fond, $contexte = array(), $options = array(), $connect $GLOBALS['_INC_PUBLIC']++; - foreach(is_array($fond) ? $fond : array($fond) as $f){ + foreach (is_array($fond) ? $fond : array($fond) as $f) { $page = evaluer_fond($f, $contexte, $connect); if ($page === '') { - $c = isset($options['compil']) ? $options['compil'] :''; - $a = array('fichier'=>$fond); + $c = isset($options['compil']) ? $options['compil'] : ''; + $a = array('fichier' => $fond); $erreur = _T('info_erreur_squelette2', $a); // squelette introuvable erreur_squelette($erreur, $c); // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 $page = array('texte' => '', 'erreur' => $erreur); } - $page = pipeline('recuperer_fond',array( - 'args'=>array('fond'=>$f,'contexte'=>$contexte,'options'=>$options,'connect'=>$connect), - 'data'=>$page + $page = pipeline('recuperer_fond', array( + 'args' => array('fond' => $f, 'contexte' => $contexte, 'options' => $options, 'connect' => $connect), + 'data' => $page )); - if (isset($options['ajax']) AND $options['ajax']){ - if (!function_exists('encoder_contexte_ajax')) + if (isset($options['ajax']) AND $options['ajax']) { + if (!function_exists('encoder_contexte_ajax')) { include_spip('inc/filtres'); - $page['texte'] = encoder_contexte_ajax(array_merge($contexte,array('fond'=>$f)),'',$page['texte'], $options['ajax']); + } + $page['texte'] = encoder_contexte_ajax(array_merge($contexte, array('fond' => $f)), '', $page['texte'], + $options['ajax']); } - if (isset($options['raw']) AND $options['raw']) + if (isset($options['raw']) AND $options['raw']) { $pages[] = $page; - else + } else { $texte .= $options['trim'] ? rtrim($page['texte']) : $page['texte']; + } } $GLOBALS['_INC_PUBLIC']--; - if ($lang_select) lang_select(); - if (isset($options['raw']) AND $options['raw']) - return is_array($fond)?$pages:reset($pages); - else + if ($lang_select) { + lang_select(); + } + if (isset($options['raw']) AND $options['raw']) { + return is_array($fond) ? $pages : reset($pages); + } else { return $options['trim'] ? ltrim($texte) : $texte; + } } /** @@ -2646,7 +3075,7 @@ function recuperer_fond($fond, $contexte = array(), $options = array(), $connect * @return string */ function trouve_modele($nom) { - return trouver_fond($nom,'modeles/'); + return trouver_fond($nom, 'modeles/'); } /** @@ -2662,17 +3091,20 @@ function trouve_modele($nom) { * @return array|string */ function trouver_fond($nom, $dir = '', $pathinfo = false) { - $f = find_in_path($nom.'.'. _EXTENSION_SQUELETTES, $dir?rtrim($dir,'/').'/':''); - if (!$pathinfo) return $f; + $f = find_in_path($nom . '.' . _EXTENSION_SQUELETTES, $dir ? rtrim($dir, '/') . '/' : ''); + if (!$pathinfo) { + return $f; + } // renvoyer un tableau detaille si $pathinfo==true $p = pathinfo($f); if (!isset($p['extension']) OR !$p['extension']) { $p['extension'] = _EXTENSION_SQUELETTES; } if (!isset($p['extension']) OR !$p['filename']) { - $p['filename'] = ($p['basename']?substr($p['basename'],0,-strlen($p['extension'])-1):''); + $p['filename'] = ($p['basename'] ? substr($p['basename'], 0, -strlen($p['extension'])-1) : ''); } - $p['fond'] = ($f?substr($f,0,-strlen($p['extension'])-1):''); + $p['fond'] = ($f ? substr($f, 0, -strlen($p['extension'])-1) : ''); + return $p; } @@ -2692,23 +3124,26 @@ function trouver_fond($nom, $dir = '', $pathinfo = false) { * Nom de la page * @return string * Nom de l'exec, sinon chaîne vide. -**/ -function tester_url_ecrire($nom){ - static $exec=array(); - if (isset($exec[$nom])) return $exec[$nom]; + **/ +function tester_url_ecrire($nom) { + static $exec = array(); + if (isset($exec[$nom])) { + return $exec[$nom]; + } // tester si c'est une page en squelette - if (trouver_fond($nom, 'prive/squelettes/contenu/')) + if (trouver_fond($nom, 'prive/squelettes/contenu/')) { return $exec[$nom] = 'fond'; - // compat skels orthogonaux version precedente - elseif (trouver_fond($nom, 'prive/exec/')) + } // compat skels orthogonaux version precedente + elseif (trouver_fond($nom, 'prive/exec/')) { return $exec[$nom] = 'fond_monobloc'; - // echafaudage d'un fond ! - elseif(include_spip('public/styliser_par_z') AND z_echafaudable($nom)) + } // echafaudage d'un fond ! + elseif (include_spip('public/styliser_par_z') AND z_echafaudable($nom)) { return $exec[$nom] = 'fond'; + } // attention, il ne faut pas inclure l'exec ici // car sinon #URL_ECRIRE provoque des inclusions // et des define intrusifs potentiels - return $exec[$nom] = ((find_in_path("{$nom}.php",'exec/') OR charger_fonction($nom,'exec',true))?$nom:''); + return $exec[$nom] = ((find_in_path("{$nom}.php", 'exec/') OR charger_fonction($nom, 'exec', true)) ? $nom : ''); } @@ -2723,12 +3158,13 @@ function tester_url_ecrire($nom){ * * @param string $module Nom du module à charger * @return bool true si le module est chargé -**/ + **/ function charger_php_extension($module) { if (extension_loaded($module)) { return true; } else { - $charger_php_extension = charger_fonction('charger_php_extension','inc'); + $charger_php_extension = charger_fonction('charger_php_extension', 'inc'); + return $charger_php_extension($module); } } @@ -2739,7 +3175,7 @@ function charger_php_extension($module) { * * @return bool * true si et seulement si la configuration autorise le code HTML5 sur le site public -**/ + **/ function html5_permis() { return (isset($GLOBALS['meta']['version_html_max']) AND ('html5' == $GLOBALS['meta']['version_html_max'])); @@ -2753,11 +3189,12 @@ function html5_permis() { /** * lire_meta : fonction dépréciée + * * @deprecated Utiliser `$GLOBALS['meta'][$nom]` ou `lire_config('nom')` * @see lire_config() * @param string $nom Clé de meta à lire * @return mixed Valeur de la meta. -**/ + **/ function lire_meta($nom) { return isset($GLOBALS['meta'][$nom]) ? $GLOBALS['meta'][$nom] : null; } @@ -2765,9 +3202,10 @@ function lire_meta($nom) { /** * ecrire_metas : fonction dépréciée + * * @deprecated -**/ -function ecrire_metas() {} + **/ +function ecrire_metas() { } /** * Retourne une ligne d'un résultat de requête mysql (déprécié) @@ -2777,16 +3215,26 @@ function ecrire_metas() {} * @param Ressource $r Ressource mysql * @param int|null $t Type de retour * @return array|void|bool Tableau de la ligne SQL -**/ -function spip_fetch_array($r, $t = NULL) { + **/ +function spip_fetch_array($r, $t = null) { if (!isset($t)) { - if ($r) return sql_fetch($r); + if ($r) { + return sql_fetch($r); + } } else { - if ($t=='SPIP_NUM') $t = MYSQLI_NUM; - if ($t=='SPIP_BOTH') $t = MYSQLI_BOTH; - if ($t=='SPIP_ASSOC') $t = MYSQLI_ASSOC; + if ($t == 'SPIP_NUM') { + $t = MYSQLI_NUM; + } + if ($t == 'SPIP_BOTH') { + $t = MYSQLI_BOTH; + } + if ($t == 'SPIP_ASSOC') { + $t = MYSQLI_ASSOC; + } spip_log("appel deprecie de spip_fetch_array(..., $t)", 'vieilles_defs'); - if ($r) return mysqli_fetch_array($r, $t); + if ($r) { + return mysqli_fetch_array($r, $t); + } } } @@ -2800,15 +3248,19 @@ function spip_fetch_array($r, $t = NULL) { * @param string $message * @param string $statut */ -function avertir_auteurs($nom, $message, $statut = ''){ +function avertir_auteurs($nom, $message, $statut = '') { $alertes = $GLOBALS['meta']['message_alertes_auteurs']; if (!$alertes - OR !is_array($alertes = unserialize($alertes))) + OR !is_array($alertes = unserialize($alertes)) + ) { $alertes = array(); + } - if (!isset($alertes[$statut])) + if (!isset($alertes[$statut])) { $alertes[$statut] = array(); + } $alertes[$statut][$nom] = $message; - ecrire_meta("message_alertes_auteurs",serialize($alertes)); + ecrire_meta("message_alertes_auteurs", serialize($alertes)); } + ?> diff --git a/ecrire/inc/xml.php b/ecrire/inc/xml.php index d8faa29ec0..7dc400c614 100644 --- a/ecrire/inc/xml.php +++ b/ecrire/inc/xml.php @@ -14,9 +14,11 @@ * Outils pour lecture de XML * * @package SPIP\Core\XML -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -29,7 +31,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * ``` * * @uses spip_xml_parse() - * + * * @param string $fichier * Chemin local ou URL distante du fichier XML * @param bool $strict @@ -43,28 +45,32 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return array|bool * - array : l'arbre XML, * - false si l'arbre xml ne peut être créé ou est vide -**/ -function spip_xml_load($fichier, $strict = true, $clean = true, $taille_max = 1048576, $datas = '', $profondeur = -1){ + **/ +function spip_xml_load($fichier, $strict = true, $clean = true, $taille_max = 1048576, $datas = '', $profondeur = -1) { $contenu = ""; - if (tester_url_absolue($fichier)){ + if (tester_url_absolue($fichier)) { include_spip('inc/distant'); - $contenu = recuperer_page($fichier,false,false,$taille_max, $datas); + $contenu = recuperer_page($fichier, false, false, $taille_max, $datas); + } else { + lire_fichier($fichier, $contenu); } - else lire_fichier ($fichier, $contenu); $arbre = array(); - if ($contenu) + if ($contenu) { $arbre = spip_xml_parse($contenu, $strict, $clean, $profondeur); - - return count($arbre)?$arbre:false; + } + + return count($arbre) ? $arbre : false; } -if (!defined('_SPIP_XML_TAG_SPLIT')) define('_SPIP_XML_TAG_SPLIT', "{<([^:>][^>]*?)>}sS"); +if (!defined('_SPIP_XML_TAG_SPLIT')) { + define('_SPIP_XML_TAG_SPLIT', "{<([^:>][^>]*?)>}sS"); +} /** * Parse une chaine XML donnée et retourne un tableau. * * @see spip_xml_aplatit() pour l'inverse - * + * * @param string $texte * Texte XML * @param bool $strict @@ -74,133 +80,153 @@ if (!defined('_SPIP_XML_TAG_SPLIT')) define('_SPIP_XML_TAG_SPLIT', "{<([^:>][^>] * @return array|bool * - array : l'arbre XML, * - false si l'arbre xml ne peut être créé ou est vide -**/ -function spip_xml_parse(&$texte, $strict = true, $clean = true, $profondeur = -1){ + **/ +function spip_xml_parse(&$texte, $strict = true, $clean = true, $profondeur = -1) { $out = array(); - // enlever les commentaires - $charset = 'AUTO'; - if ($clean===true){ - if (preg_match(",<\?xml\s(.*?)encoding=['\"]?(.*?)['\"]?(\s(.*))?\?>,im",$texte,$regs)) - $charset = $regs[2]; - $texte = preg_replace(',<!--(.*?)-->,is','',$texte); - $texte = preg_replace(',<\?(.*?)\?>,is','',$texte); + // enlever les commentaires + $charset = 'AUTO'; + if ($clean === true) { + if (preg_match(",<\?xml\s(.*?)encoding=['\"]?(.*?)['\"]?(\s(.*))?\?>,im", $texte, $regs)) { + $charset = $regs[2]; + } + $texte = preg_replace(',<!--(.*?)-->,is', '', $texte); + $texte = preg_replace(',<\?(.*?)\?>,is', '', $texte); include_spip('inc/charsets'); $clean = $charset; //$texte = importer_charset($texte,$charset); - } - if (is_string($clean)) $charset = $clean; - $txt = $texte; + } + if (is_string($clean)) { + $charset = $clean; + } + $txt = $texte; // tant qu'il y a des tags - $chars = preg_split(_SPIP_XML_TAG_SPLIT,$txt,2,PREG_SPLIT_DELIM_CAPTURE); - while(count($chars)>=2){ + $chars = preg_split(_SPIP_XML_TAG_SPLIT, $txt, 2, PREG_SPLIT_DELIM_CAPTURE); + while (count($chars) >= 2) { // tag ouvrant //$chars = preg_split("{<([^>]*?)>}s",$txt,2,PREG_SPLIT_DELIM_CAPTURE); - + // $before doit etre vide ou des espaces uniquements! $before = trim($chars[0]); - if (strlen($before)>0) - return importer_charset($texte,$charset);//$texte; // before non vide, donc on est dans du texte - + if (strlen($before) > 0) { + return importer_charset($texte, $charset); + }//$texte; // before non vide, donc on est dans du texte + $tag = rtrim($chars[1]); $txt = $chars[2]; - - if (strncmp($tag,'![CDATA[',8)==0) return importer_charset($texte,$charset);//$texte; - if(substr($tag,-1)=='/'){ // self closing tag - $tag = rtrim(substr($tag,0,strlen($tag)-1)); - $out[$tag][]=""; - } - else{ - $closing_tag = preg_split(",\s|\t|\n|\r,",trim($tag)); - $closing_tag=reset($closing_tag); + + if (strncmp($tag, '![CDATA[', 8) == 0) { + return importer_charset($texte, $charset); + }//$texte; + if (substr($tag, -1) == '/') { // self closing tag + $tag = rtrim(substr($tag, 0, strlen($tag)-1)); + $out[$tag][] = ""; + } else { + $closing_tag = preg_split(",\s|\t|\n|\r,", trim($tag)); + $closing_tag = reset($closing_tag); // tag fermant $ncclos = strlen("</$closing_tag>"); - $p = strpos($txt,"</$closing_tag>"); - if ($p!==FALSE AND (strpos($txt,"<")<$p)){ - $nclose =0; $nopen = 0; + $p = strpos($txt, "</$closing_tag>"); + if ($p !== false AND (strpos($txt, "<") < $p)) { + $nclose = 0; + $nopen = 0; $d = 0; while ( - $p!==FALSE - AND ($morceau = substr($txt,$d,$p-$d)) - AND (($nopen+=preg_match_all("{<".preg_quote($closing_tag)."(\s*>|\s[^>]*[^/>]>)}is",$morceau,$matches,PREG_SET_ORDER))>$nclose) - ){ + $p !== false + AND ($morceau = substr($txt, $d, $p-$d)) + AND (($nopen += preg_match_all("{<" . preg_quote($closing_tag) . "(\s*>|\s[^>]*[^/>]>)}is", $morceau, + $matches, PREG_SET_ORDER)) > $nclose) + ) { $nclose++; - $d=$p+$ncclos; - $p = strpos($txt,"</$closing_tag>",$d); + $d = $p+$ncclos; + $p = strpos($txt, "</$closing_tag>", $d); } } - if ($p===FALSE){ - if ($strict){ - $out[$tag][]="erreur : tag fermant $tag manquant::$txt"; + if ($p === false) { + if ($strict) { + $out[$tag][] = "erreur : tag fermant $tag manquant::$txt"; + return $out; - } - else return importer_charset($texte,$charset);//$texte // un tag qui constitue du texte a reporter dans $before + } else { + return importer_charset($texte, $charset); + }//$texte // un tag qui constitue du texte a reporter dans $before + } + $content = substr($txt, 0, $p); + $txt = substr($txt, $p+$ncclos); + if ($profondeur == 0 OR strpos($content, "<") === false) // eviter une recursion si pas utile + { + $out[$tag][] = importer_charset($content, $charset); + }//$content; + else { + $out[$tag][] = spip_xml_parse($content, $strict, $clean, $profondeur-1); } - $content = substr($txt,0,$p); - $txt = substr($txt,$p+$ncclos); - if ($profondeur==0 OR strpos($content,"<")===FALSE) // eviter une recursion si pas utile - $out[$tag][] = importer_charset($content,$charset);//$content; - else - $out[$tag][]=spip_xml_parse($content, $strict, $clean, $profondeur-1); } - $chars = preg_split(_SPIP_XML_TAG_SPLIT,$txt,2,PREG_SPLIT_DELIM_CAPTURE); + $chars = preg_split(_SPIP_XML_TAG_SPLIT, $txt, 2, PREG_SPLIT_DELIM_CAPTURE); } - if (count($out)&&(strlen(trim($txt))==0)) + if (count($out) && (strlen(trim($txt)) == 0)) { return $out; - else - return importer_charset($texte,$charset);//$texte; + } else { + return importer_charset($texte, $charset); + }//$texte; } // http://code.spip.net/@spip_xml_aplatit -function spip_xml_aplatit($arbre, $separateur = " "){ +function spip_xml_aplatit($arbre, $separateur = " ") { $s = ""; - if (is_array($arbre)) - foreach($arbre as $tag=>$feuille){ - if (is_array($feuille)){ - if ($tag!==intval($tag)){ + if (is_array($arbre)) { + foreach ($arbre as $tag => $feuille) { + if (is_array($feuille)) { + if ($tag !== intval($tag)) { $f = spip_xml_aplatit($feuille, $separateur); if (strlen($f)) { - $tagf = explode(" ",$tag); + $tagf = explode(" ", $tag); $tagf = $tagf[0]; - $s.="<$tag>$f</$tagf>"; + $s .= "<$tag>$f</$tagf>"; + } else { + $s .= "<$tag />"; } - else $s.="<$tag />"; + } else { + $s .= spip_xml_aplatit($feuille); } - else - $s.=spip_xml_aplatit($feuille); $s .= $separateur; + } else { + $s .= "$feuille$separateur"; } - else - $s.="$feuille$separateur"; } + } + return strlen($separateur) ? substr($s, 0, -strlen($separateur)) : $s; } // http://code.spip.net/@spip_xml_tagname -function spip_xml_tagname($tag){ - if (preg_match(',^([a-z][\w:]*),i',$tag,$reg)) +function spip_xml_tagname($tag) { + if (preg_match(',^([a-z][\w:]*),i', $tag, $reg)) { return $reg[1]; + } + return ""; } + // http://code.spip.net/@spip_xml_decompose_tag -function spip_xml_decompose_tag($tag){ +function spip_xml_decompose_tag($tag) { $tagname = spip_xml_tagname($tag); $liste = array(); - $p=strpos($tag,' '); - $tag = substr($tag,$p); - $p=strpos($tag,'='); - while($p!==false){ - $attr = trim(substr($tag,0,$p)); - $tag = ltrim(substr($tag,$p+1)); + $p = strpos($tag, ' '); + $tag = substr($tag, $p); + $p = strpos($tag, '='); + while ($p !== false) { + $attr = trim(substr($tag, 0, $p)); + $tag = ltrim(substr($tag, $p+1)); $quote = $tag{0}; - $p=strpos($tag,$quote,1); - $cont = substr($tag,1,$p-1); + $p = strpos($tag, $quote, 1); + $cont = substr($tag, 1, $p-1); $liste[$attr] = $cont; - $tag = substr($tag,$p+1); - $p=strpos($tag,'='); + $tag = substr($tag, $p+1); + $p = strpos($tag, '='); } - return array($tagname,$liste); + + return array($tagname, $liste); } /** @@ -211,7 +237,7 @@ function spip_xml_decompose_tag($tag){ * * @see spip_xml_parse() * @see spip_xml_decompose_tag() - * + * * @param string $regexp * Expression régulière * @param array $arbre @@ -221,18 +247,24 @@ function spip_xml_decompose_tag($tag){ * @param bool $init ? * @return bool * false si aucun élément ne valide l'expression régulière, true sinon. -**/ -function spip_xml_match_nodes($regexp, &$arbre, &$matches, $init = true){ - if ($init) + **/ +function spip_xml_match_nodes($regexp, &$arbre, &$matches, $init = true) { + if ($init) { $matches = array(); - if(is_array($arbre) && count($arbre)) - foreach(array_keys($arbre) as $tag){ - if (preg_match($regexp,$tag)) + } + if (is_array($arbre) && count($arbre)) { + foreach (array_keys($arbre) as $tag) { + if (preg_match($regexp, $tag)) { $matches[$tag] = &$arbre[$tag]; - if (is_array($arbre[$tag])) - foreach(array_keys($arbre[$tag]) as $occurences) - spip_xml_match_nodes($regexp,$arbre[$tag][$occurences],$matches,false); + } + if (is_array($arbre[$tag])) { + foreach (array_keys($arbre[$tag]) as $occurences) { + spip_xml_match_nodes($regexp, $arbre[$tag][$occurences], $matches, false); + } + } } + } + return (count($matches)); } diff --git a/ecrire/inc_version.php b/ecrire/inc_version.php index 4a94ff0337..0437f5ea35 100644 --- a/ecrire/inc_version.php +++ b/ecrire/inc_version.php @@ -11,12 +11,14 @@ \***************************************************************************/ /** - * Initialisation de SPIP + * Initialisation de SPIP * * @package SPIP\Core\Chargement -**/ + **/ -if (defined('_ECRIRE_INC_VERSION')) return; +if (defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Indique que SPIP est chargé @@ -31,7 +33,7 @@ define('_ECRIRE_INC_VERSION', "1"); error_reporting(E_ALL ^ E_NOTICE); /** version PHP minimum exigee (cf. inc/utils) */ -define ('_PHP_MIN', '5.1.0'); +define('_PHP_MIN', '5.1.0'); if (!defined('_DIR_RESTREINT_ABS')) { /** le nom du repertoire ecrire/ */ @@ -41,21 +43,23 @@ if (!defined('_DIR_RESTREINT_ABS')) { /** Chemin relatif pour aller dans ecrire * vide si on est dans ecrire, 'ecrire/' sinon */ define('_DIR_RESTREINT', - (!is_dir(_DIR_RESTREINT_ABS) ? "" : _DIR_RESTREINT_ABS)); +(!is_dir(_DIR_RESTREINT_ABS) ? "" : _DIR_RESTREINT_ABS)); /** Chemin relatif pour aller à la racine */ define('_DIR_RACINE', _DIR_RESTREINT ? '' : '../'); /** chemin absolu vers la racine */ -define('_ROOT_RACINE', dirname(dirname(__FILE__)).'/'); +define('_ROOT_RACINE', dirname(dirname(__FILE__)) . '/'); /** chemin absolu vers le repertoire de travail */ -define('_ROOT_CWD', getcwd().'/'); +define('_ROOT_CWD', getcwd() . '/'); /** chemin absolu vers ecrire */ define('_ROOT_RESTREINT', _ROOT_CWD . _DIR_RESTREINT); // Icones /** Nom du dossier images */ -if (!defined('_NOM_IMG_PACK')) define('_NOM_IMG_PACK', 'images/'); +if (!defined('_NOM_IMG_PACK')) { + define('_NOM_IMG_PACK', 'images/'); +} /** le chemin http (relatif) vers les images standard */ define('_DIR_IMG_PACK', (_DIR_RACINE . 'prive/' . _NOM_IMG_PACK)); @@ -63,7 +67,9 @@ define('_DIR_IMG_PACK', (_DIR_RACINE . 'prive/' . _NOM_IMG_PACK)); define('_ROOT_IMG_PACK', dirname(dirname(__FILE__)) . '/prive/' . _NOM_IMG_PACK); /** Nom du repertoire des bibliotheques JavaScript */ -if (!defined('_JAVASCRIPT')) define('_JAVASCRIPT', 'javascript/'); // utilisable avec #CHEMIN et find_in_path +if (!defined('_JAVASCRIPT')) { + define('_JAVASCRIPT', 'javascript/'); +} // utilisable avec #CHEMIN et find_in_path /** le nom du repertoire des bibliotheques JavaScript du prive */ define('_DIR_JAVASCRIPT', (_DIR_RACINE . 'prive/' . _JAVASCRIPT)); @@ -72,32 +78,45 @@ define('_DIR_JAVASCRIPT', (_DIR_RACINE . 'prive/' . _JAVASCRIPT)); # mais on peut les mettre ailleurs et changer completement les noms /** le nom du repertoire des fichiers Temporaires Inaccessibles par http:// */ -if (!defined('_NOM_TEMPORAIRES_INACCESSIBLES')) define('_NOM_TEMPORAIRES_INACCESSIBLES', "tmp/"); +if (!defined('_NOM_TEMPORAIRES_INACCESSIBLES')) { + define('_NOM_TEMPORAIRES_INACCESSIBLES', "tmp/"); +} /** le nom du repertoire des fichiers Temporaires Accessibles par http:// */ -if (!defined('_NOM_TEMPORAIRES_ACCESSIBLES')) define('_NOM_TEMPORAIRES_ACCESSIBLES', "local/"); +if (!defined('_NOM_TEMPORAIRES_ACCESSIBLES')) { + define('_NOM_TEMPORAIRES_ACCESSIBLES', "local/"); +} /** le nom du repertoire des fichiers Permanents Inaccessibles par http:// */ -if (!defined('_NOM_PERMANENTS_INACCESSIBLES')) define('_NOM_PERMANENTS_INACCESSIBLES', "config/"); +if (!defined('_NOM_PERMANENTS_INACCESSIBLES')) { + define('_NOM_PERMANENTS_INACCESSIBLES', "config/"); +} /** le nom du repertoire des fichiers Permanents Accessibles par http:// */ -if (!defined('_NOM_PERMANENTS_ACCESSIBLES')) define('_NOM_PERMANENTS_ACCESSIBLES', "IMG/"); +if (!defined('_NOM_PERMANENTS_ACCESSIBLES')) { + define('_NOM_PERMANENTS_ACCESSIBLES', "IMG/"); +} /** Le nom du fichier de personnalisation */ -if (!defined('_NOM_CONFIG')) define('_NOM_CONFIG', 'mes_options'); +if (!defined('_NOM_CONFIG')) { + define('_NOM_CONFIG', 'mes_options'); +} // Son emplacement absolu si on le trouve if (@file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . _NOM_CONFIG . '.php') -OR (@file_exists($f = _ROOT_RESTREINT . _NOM_CONFIG . '.php'))) { + OR (@file_exists($f = _ROOT_RESTREINT . _NOM_CONFIG . '.php')) +) { /** Emplacement absolu du fichier d'option */ define('_FILE_OPTIONS', $f); -} else define('_FILE_OPTIONS', ''); +} else { + define('_FILE_OPTIONS', ''); +} if (!defined('MODULES_IDIOMES')) { -/** - * Modules par défaut pour la traduction. - * - * Constante utilisée par le compilateur et le décompilateur - * sa valeur etant traitée par inc_traduire_dist - */ + /** + * Modules par défaut pour la traduction. + * + * Constante utilisée par le compilateur et le décompilateur + * sa valeur etant traitée par inc_traduire_dist + */ define('MODULES_IDIOMES', 'public|spip|ecrire'); } @@ -106,14 +125,16 @@ if (!defined('MODULES_IDIOMES')) { // Inclure l'ecran de securite if (!defined('_ECRAN_SECURITE') -AND @file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . 'ecran_securite.php')) + AND @file_exists($f = _ROOT_RACINE . _NOM_PERMANENTS_INACCESSIBLES . 'ecran_securite.php') +) { include $f; +} /* * Détecteur de robot d'indexation */ -if (!defined('_IS_BOT')){ +if (!defined('_IS_BOT')) { define('_IS_BOT', isset($_SERVER['HTTP_USER_AGENT']) AND preg_match( @@ -144,7 +165,7 @@ defined('_LOG_ALERTE_ROUGE') || define('_LOG_ALERTE_ROUGE', 1); defined('_LOG_CRITIQUE') || define('_LOG_CRITIQUE', 2); defined('_LOG_ERREUR') || define('_LOG_ERREUR', 3); defined('_LOG_AVERTISSEMENT') || define('_LOG_AVERTISSEMENT', 4); -defined('_LOG_INFO_IMPORTANTE') || define ('_LOG_INFO_IMPORTANTE', 5); +defined('_LOG_INFO_IMPORTANTE') || define('_LOG_INFO_IMPORTANTE', 5); defined('_LOG_INFO') || define('_LOG_INFO', 6); defined('_LOG_DEBUG') || define('_LOG_DEBUG', 7); @@ -183,12 +204,15 @@ $filtrer_javascript = 0; $debut_date_publication = null; - // // On note le numero IP du client dans la variable $ip // -if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; -if (isset($_SERVER['REMOTE_ADDR'])) $ip = $_SERVER['REMOTE_ADDR']; +if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { + $ip = $_SERVER['HTTP_X_FORWARDED_FOR']; +} +if (isset($_SERVER['REMOTE_ADDR'])) { + $ip = $_SERVER['REMOTE_ADDR']; +} // Pour renforcer la privacy, decommentez la ligne ci-dessous (ou recopiez-la // dans le fichier config/mes_options) : SPIP ne pourra alors conserver aucun @@ -228,7 +252,7 @@ $quota_cache = 10; $home_server = 'http://www.spip.net'; $help_server = array($home_server . '/aide'); # glossaire pour raccourci [?X]. Aussi: [?X#G] et definir glossaire_G -$url_glossaire_externe = "http://@lang@.wikipedia.org/wiki/%s"; +$url_glossaire_externe = "http://@lang@.wikipedia.org/wiki/%s"; # TeX $tex_server = 'http://math.spip.org/tex.php'; @@ -242,7 +266,7 @@ $traiter_math = 'tex'; $xhtml = false; $xml_indent = false; -$formats_logos = array ('gif', 'jpg', 'png'); +$formats_logos = array('gif', 'jpg', 'png'); // Controler les dates des item dans les flux RSS ? $controler_dates_rss = true; @@ -259,7 +283,7 @@ $controler_dates_rss = true; $spip_pipeline = array(); # la matrice standard (fichiers definissant les fonctions a inclure) -$spip_matrice = array (); +$spip_matrice = array(); # les plugins a activer $plugins = array(); // voir le contenu du repertoire /plugins/ # les surcharges de include_spip() @@ -279,7 +303,7 @@ $tables_jointures = array(); // Liste des statuts. $liste_des_statuts = array( "info_administrateurs" => '0minirezo', - "info_redacteurs" =>'1comite', + "info_redacteurs" => '1comite', "info_visiteurs" => '6forum', "texte_statut_poubelle" => '5poubelle' ); @@ -294,8 +318,8 @@ $liste_des_etats = array( // liste des methodes d'authentifications $liste_des_authentifications = array( - 'spip'=>'spip', - 'ldap'=>'ldap' + 'spip' => 'spip', + 'ldap' => 'ldap' ); // Experimental : pour supprimer systematiquement l'affichage des numeros @@ -325,7 +349,7 @@ $spip_sql_version = 1; $spip_version_affichee = "$spip_version_branche"; // ** Securite ** -$visiteur_session = $auteur_session = $connect_statut = $connect_toutes_rubriques = $hash_recherche = $hash_recherche_strict = $ldap_present =''; +$visiteur_session = $auteur_session = $connect_statut = $connect_toutes_rubriques = $hash_recherche = $hash_recherche_strict = $ldap_present = ''; $meta = $connect_id_rubrique = array(); // *** Fin des globales *** // @@ -338,7 +362,9 @@ require_once _ROOT_RESTREINT . 'base/connect_sql.php'; // Definition personnelles eventuelles -if (_FILE_OPTIONS) {include_once _FILE_OPTIONS;} +if (_FILE_OPTIONS) { + include_once _FILE_OPTIONS; +} if (!defined('E_DEPRECATED')) { /** Compatibilite PHP 5.3 */ @@ -359,10 +385,10 @@ error_reporting(SPIP_ERREUR_REPORT); // ===> on execute en neutralisant les messages d'erreur spip_initialisation_core( - (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES), - (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES), - (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES), - (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES) + (_DIR_RACINE . _NOM_PERMANENTS_INACCESSIBLES), + (_DIR_RACINE . _NOM_PERMANENTS_ACCESSIBLES), + (_DIR_RACINE . _NOM_TEMPORAIRES_INACCESSIBLES), + (_DIR_RACINE . _NOM_TEMPORAIRES_ACCESSIBLES) ); @@ -371,7 +397,7 @@ spip_initialisation_core( // qui ne sera pas execute car _ECRIRE_INC_VERSION est defini // donc il faut avoir tout fini ici avant de charger les plugins -if (@is_readable(_CACHE_PLUGINS_OPT) AND @is_readable(_CACHE_PLUGINS_PATH)){ +if (@is_readable(_CACHE_PLUGINS_OPT) AND @is_readable(_CACHE_PLUGINS_PATH)) { // chargement optimise precompile include_once(_CACHE_PLUGINS_OPT); } else { @@ -396,26 +422,28 @@ if (!defined('_OUTILS_DEVELOPPEURS')) { } // charger systematiquement inc/autoriser dans l'espace restreint -if (test_espace_prive()) +if (test_espace_prive()) { include_spip('inc/autoriser'); +} // // Installer Spip si pas installe... sauf si justement on est en train // if (!(_FILE_CONNECT -OR autoriser_sans_cookie(_request('exec')) -OR _request('action') == 'cookie' -OR _request('action') == 'converser' -OR _request('action') == 'test_dirs')) { + OR autoriser_sans_cookie(_request('exec')) + OR _request('action') == 'cookie' + OR _request('action') == 'converser' + OR _request('action') == 'test_dirs') +) { // Si on peut installer, on lance illico if (test_espace_prive()) { include_spip('inc/headers'); redirige_url_ecrire("install"); } else { - // Si on est dans le site public, dire que qq s'en occupe + // Si on est dans le site public, dire que qq s'en occupe include_spip('inc/minipres'); utiliser_langue_visiteur(); - echo minipres(_T('info_travaux_titre'), "<p style='text-align: center;'>"._T('info_travaux_texte')."</p>"); + echo minipres(_T('info_travaux_titre'), "<p style='text-align: center;'>" . _T('info_travaux_texte') . "</p>"); exit; } // autrement c'est une install ad hoc (spikini...), on sait pas faire @@ -423,29 +451,35 @@ OR _request('action') == 'test_dirs')) { // memoriser un tri sessionne eventuel if (isset($_REQUEST['var_memotri']) - AND $t = $_REQUEST['var_memotri'] - AND (strncmp($t,'trisession',10)==0 OR strncmp($t,'senssession',11)==0)){ - if (!function_exists('session_set')) + AND $t = $_REQUEST['var_memotri'] + AND (strncmp($t, 'trisession', 10) == 0 OR strncmp($t, 'senssession', 11) == 0) +) { + if (!function_exists('session_set')) { include_spip('inc/session'); - session_set($t,_request($t)); + } + session_set($t, _request($t)); } /** * Header "Composed-By" - * + * * Vanter notre art de la composition typographique * La globale $spip_header_silencieux permet de rendre le header minimal pour raisons de securite */ -if (!defined('_HEADER_COMPOSED_BY')) define('_HEADER_COMPOSED_BY', "Composed-By: SPIP"); +if (!defined('_HEADER_COMPOSED_BY')) { + define('_HEADER_COMPOSED_BY', "Composed-By: SPIP"); +} if (!headers_sent()) { header("Vary: Cookie, Accept-Encoding"); - if (!isset($GLOBALS['spip_header_silencieux']) OR !$GLOBALS['spip_header_silencieux']) - header(_HEADER_COMPOSED_BY . " $spip_version_affichee @ www.spip.net" . (isset($GLOBALS['meta']['plugin_header'])?(" + ".$GLOBALS['meta']['plugin_header']):"")); - else // header minimal + if (!isset($GLOBALS['spip_header_silencieux']) OR !$GLOBALS['spip_header_silencieux']) { + header(_HEADER_COMPOSED_BY . " $spip_version_affichee @ www.spip.net" . (isset($GLOBALS['meta']['plugin_header']) ? (" + " . $GLOBALS['meta']['plugin_header']) : "")); + } else // header minimal + { header(_HEADER_COMPOSED_BY . " @ www.spip.net"); + } } $methode = (isset($_SERVER['REQUEST_METHOD']) ? $_SERVER['REQUEST_METHOD'] : ((php_sapi_name() == 'cli') ? 'cli' : '')); -spip_log($methode.' '.self() . ' - '._FILE_CONNECT,_LOG_DEBUG); +spip_log($methode . ' ' . self() . ' - ' . _FILE_CONNECT, _LOG_DEBUG); ?> diff --git a/ecrire/index.php b/ecrire/index.php index 16303656cd..c9c504546a 100644 --- a/ecrire/index.php +++ b/ecrire/index.php @@ -14,16 +14,20 @@ * Fichier d'exécution de l'interface privée * * @package SPIP\Core\Chargement -**/ + **/ /** Drapeau indiquant que l'on est dans l'espace privé */ define('_ESPACE_PRIVE', true); -if (!defined('_ECRIRE_INC_VERSION')) include 'inc_version.php'; +if (!defined('_ECRIRE_INC_VERSION')) { + include 'inc_version.php'; +} // Verification anti magic_quotes_sybase, pour qui addslashes("'") = "''" // On prefere la faire ici plutot que dans inc_version, c'est moins souvent et // si le reglage est modifie sur un site en prod, ca fait moins mal -if (addslashes("'") !== "\\'") die('SPIP incompatible magic_quotes_sybase'); +if (addslashes("'") !== "\\'") { + die('SPIP incompatible magic_quotes_sybase'); +} include_spip('inc/cookie'); @@ -32,24 +36,26 @@ include_spip('inc/cookie'); // $exec = (string)_request('exec'); -$reinstall = (!is_null(_request('reinstall')))?_request('reinstall'):($exec=='install'?'oui':NULL); +$reinstall = (!is_null(_request('reinstall'))) ? _request('reinstall') : ($exec == 'install' ? 'oui' : null); // // Les scripts d'insallation n'authentifient pas, forcement, // alors il faut blinder les variables d'URL // if (autoriser_sans_cookie($exec)) { - if (!isset($reinstall)) $reinstall = 'non'; + if (!isset($reinstall)) { + $reinstall = 'non'; + } set_request('transformer_xml'); $var_auth = true; } else { // Authentification, redefinissable $auth = charger_fonction('auth', 'inc'); $var_auth = $auth(); - if ($var_auth) { + if ($var_auth) { echo auth_echec($var_auth); exit; } - } +} // initialiser a la langue par defaut include_spip('inc/lang'); @@ -58,19 +64,21 @@ utiliser_langue_visiteur(); $forcer_lang = true; -if (_request('action') OR _request('var_ajax') OR _request('formulaire_action')){ +if (_request('action') OR _request('var_ajax') OR _request('formulaire_action')) { // Charger l'aiguilleur qui va mettre sur la bonne voie les traitements derogatoires include_spip('public/aiguiller'); if ( // cas des appels actions ?action=xxx traiter_appels_actions() - OR + OR // cas des hits ajax sur les inclusions ajax traiter_appels_inclusions_ajax() - OR - // cas des formulaires charger/verifier/traiter - traiter_formulaires_dynamiques()) - exit; // le hit est fini ! + OR + // cas des formulaires charger/verifier/traiter + traiter_formulaires_dynamiques() + ) { + exit; + } // le hit est fini ! } // @@ -78,11 +86,13 @@ if (_request('action') OR _request('var_ajax') OR _request('formulaire_action')) // // Controle de la version, sauf si on est deja en train de s'en occuper -if (!$reinstall=='oui' -AND !_AJAX -AND isset($GLOBALS['meta']['version_installee']) -AND ($GLOBALS['spip_version_base'] != (str_replace(',','.',$GLOBALS['meta']['version_installee'])))) +if (!$reinstall == 'oui' + AND !_AJAX + AND isset($GLOBALS['meta']['version_installee']) + AND ($GLOBALS['spip_version_base'] != (str_replace(',', '.', $GLOBALS['meta']['version_installee']))) +) { $exec = 'demande_mise_a_jour'; +} // Quand une action d'administration est en cours (meta "admin"), // refuser les connexions non-admin ou Ajax pour laisser la base intacte. @@ -91,24 +101,26 @@ AND ($GLOBALS['spip_version_base'] != (str_replace(',','.',$GLOBALS['meta']['ver // sinon c'est qu'elle a ete interrompue et il faut la reprendre elseif (isset($GLOBALS['meta']["admin"])) { - if (preg_match('/^(.*)_(\d+)_/', $GLOBALS['meta']["admin"], $l)) - list(,$var_f,$n) = $l; - if (_AJAX + if (preg_match('/^(.*)_(\d+)_/', $GLOBALS['meta']["admin"], $l)) { + list(, $var_f, $n) = $l; + } + if (_AJAX OR !( isset($_COOKIE['spip_admin']) - OR (isset($GLOBALS['visiteur_session']) AND $GLOBALS['visiteur_session']['statut']=='0minirezo') - ) - ) { + OR (isset($GLOBALS['visiteur_session']) AND $GLOBALS['visiteur_session']['statut'] == '0minirezo') + ) + ) { spip_log("Quand la meta admin vaut " . - $GLOBALS['meta']["admin"] . - " seul un admin peut se connecter et sans AJAX." . - " En cas de probleme, detruire cette meta."); + $GLOBALS['meta']["admin"] . + " seul un admin peut se connecter et sans AJAX." . + " En cas de probleme, detruire cette meta."); die(_T('info_travaux_texte')); } if ($n) { - list(,$var_f,$n) = $l; - if (tester_url_ecrire("base_$var_f")) + list(, $var_f, $n) = $l; + if (tester_url_ecrire("base_$var_f")) { $var_f = "base_$var_f"; + } if ($var_f != $exec) { spip_log("Le script $var_f lance par auteur$n se substitue a l'exec $exec"); $exec = $var_f; @@ -134,9 +146,10 @@ $GLOBALS['spip_ecran'] = isset($_COOKIE['spip_ecran']) ? $_COOKIE['spip_ecran'] // on appelle directement la fonction, car un appel d'action peut conduire a une boucle infinie // si le cookie n'est pas pose correctement dans l'action if (!$var_auth AND isset($_COOKIE['spip_lang_ecrire']) - AND $_COOKIE['spip_lang_ecrire'] <> $GLOBALS['visiteur_session']['lang']) { - include_spip('action/converser'); - action_converser_post($GLOBALS['visiteur_session']['lang'],true); + AND $_COOKIE['spip_lang_ecrire'] <> $GLOBALS['visiteur_session']['lang'] +) { + include_spip('action/converser'); + action_converser_post($GLOBALS['visiteur_session']['lang'], true); } @@ -147,10 +160,9 @@ if ($var_f = _request('transformer_xml')) { $exec = $var_f; } if ($var_f = tester_url_ecrire($exec)) { - $var_f = charger_fonction ($var_f); + $var_f = charger_fonction($var_f); $var_f(); // at last -} -else { +} else { // Rien de connu: rerouter vers exec=404 au lieu d'echouer // ce qui permet de laisser la main a un plugin $var_f = charger_fonction('404'); diff --git a/ecrire/install/etape_.php b/ecrire/install/etape_.php index 08f4873591..1a8a70512d 100644 --- a/ecrire/install/etape_.php +++ b/ecrire/install/etape_.php @@ -13,19 +13,20 @@ /** * Affichage de l'écran d'installation (étape 0 : écran d'accueil) - * + * * @package SPIP\Core\Installation */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Affiche l'étape 0 d'installation : écran d'accueil. * * @uses info_copyright() -**/ -function install_etape__dist() -{ + **/ +function install_etape__dist() { utiliser_langue_visiteur(); $menu_langues = menu_langues('var_lang_ecrire'); if (!$menu_langues) { @@ -33,12 +34,13 @@ function install_etape__dist() } else { include_spip('inc/presentation'); // pour info_copyright - $res = "<div class='petit-centre'><img alt='SPIP' src='" . chemin_image('logo-spip2.gif') . "' />\n" . - "<p class='small'>" .info_copyright() ."</p></div>\n" . - "<p>" ._T('install_select_langue') ."</p>" . - "<div>" .$menu_langues ."</div>\n" . + $res = "<div class='petit-centre'><img alt='SPIP' src='" . chemin_image('logo-spip2.gif') . "' />\n" . + "<p class='small'>" . info_copyright() . "</p></div>\n" . + "<p>" . _T('install_select_langue') . "</p>" . + "<div>" . $menu_langues . "</div>\n" . generer_form_ecrire('install', "<input type='hidden' name='etape' value='chmod' />" . bouton_suivant()); echo minipres('AUTO', $res); } } + ?> diff --git a/ecrire/install/etape_1.php b/ecrire/install/etape_1.php index 934eabe2ac..61ceecb84d 100644 --- a/ecrire/install/etape_1.php +++ b/ecrire/install/etape_1.php @@ -13,11 +13,13 @@ /** * Affichage de l'écran d'installation (étape 1 : tests des répertoires * et hébergement, et demande d'identifiants de connexion à la BDD) - * + * * @package SPIP\Core\Installation */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Affichage de l'étape 1 d'installation : tests des répertoires @@ -30,10 +32,9 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @uses tester_compatibilite_hebergement() * @uses analyse_fichier_connection() * @uses login_hebergeur() - * + * */ -function install_etape_1_dist() -{ +function install_etape_1_dist() { echo install_debut_html(); // stopper en cas de grosse incompatibilite de l'hebergement @@ -41,32 +42,34 @@ function install_etape_1_dist() // Recuperer les anciennes donnees pour plus de facilite (si presentes) $s = !@is_readable(_FILE_CONNECT_TMP) ? '' - : analyse_fichier_connection(_FILE_CONNECT_TMP); + : analyse_fichier_connection(_FILE_CONNECT_TMP); list($adresse_db, $login_db) = $s ? $s : login_hebergeur(); - $chmod = (isset($_GET['chmod']) AND preg_match(',^[0-9]+$,', $_GET['chmod']))? sprintf('%04o', $_GET['chmod']):'0777'; + $chmod = (isset($_GET['chmod']) AND preg_match(',^[0-9]+$,', $_GET['chmod'])) ? sprintf('%04o', + $_GET['chmod']) : '0777'; - if(@is_readable(_FILE_CHMOD_TMP)){ + if (@is_readable(_FILE_CHMOD_TMP)) { $s = @join('', @file(_FILE_CHMOD_TMP)); - if(preg_match("#define\('_SPIP_CHMOD', (.*)\)#", $s, $regs)) { - $chmod = $regs[1]; + if (preg_match("#define\('_SPIP_CHMOD', (.*)\)#", $s, $regs)) { + $chmod = $regs[1]; } } - - + $db = array($adresse_db, _T('entree_base_donnee_2')); $login = array($login_db, _T('entree_login_connexion_2')); $pass = array('', _T('entree_mot_passe_2')); - $predef = array(defined('_INSTALL_SERVER_DB') ? _INSTALL_SERVER_DB:'', - defined('_INSTALL_HOST_DB'), - defined('_INSTALL_USER_DB'), - defined('_INSTALL_PASS_DB')); + $predef = array( + defined('_INSTALL_SERVER_DB') ? _INSTALL_SERVER_DB : '', + defined('_INSTALL_HOST_DB'), + defined('_INSTALL_USER_DB'), + defined('_INSTALL_PASS_DB') + ); - echo info_progression_etape(1,'etape_','install/'); + echo info_progression_etape(1, 'etape_', 'install/'); // ces deux chaines de langues doivent etre reecrites # echo info_etape(_T('info_connexion_mysql'), _T('texte_connexion_mysql').aide ("install1", true)); diff --git a/ecrire/install/etape_2.php b/ecrire/install/etape_2.php index 785c05679f..dff42b1128 100644 --- a/ecrire/install/etape_2.php +++ b/ecrire/install/etape_2.php @@ -10,20 +10,23 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); // http://code.spip.net/@install_etape_2_dist -function install_etape_2_dist() -{ +function install_etape_2_dist() { $adresse_db = defined('_INSTALL_HOST_DB') ? _INSTALL_HOST_DB : _request('adresse_db'); - if (preg_match(',(.*):(.*),', $adresse_db, $r)) - list(,$adresse_db, $port) = $r; - else $port = ''; + if (preg_match(',(.*):(.*),', $adresse_db, $r)) { + list(, $adresse_db, $port) = $r; + } else { + $port = ''; + } $login_db = defined('_INSTALL_USER_DB') ? _INSTALL_USER_DB @@ -37,7 +40,7 @@ function install_etape_2_dist() ? _INSTALL_SERVER_DB : _request('server_db'); - $name_db = defined('_INSTALL_NAME_DB') + $name_db = defined('_INSTALL_NAME_DB') ? _INSTALL_NAME_DB : ''; @@ -47,7 +50,7 @@ function install_etape_2_dist() $GLOBALS['connexions'][$server_db] = $link; $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] - = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; echo install_debut_html(); @@ -64,34 +67,34 @@ function install_etape_2_dist() //echo join(', ', $GLOBALS['connexions'][$server_db]); //echo "\n-->\n"; - if (($db_connect=="0") && $link) { - echo "<div class='success'><b>"._T('info_connexion_ok')."</b></div>"; - echo info_progression_etape(2,'etape_','install/'); + if (($db_connect == "0") && $link) { + echo "<div class='success'><b>" . _T('info_connexion_ok') . "</b></div>"; + echo info_progression_etape(2, 'etape_', 'install/'); - echo info_etape(_T('menu_aide_installation_choix_base').aide ("install2", true)); + echo info_etape(_T('menu_aide_installation_choix_base') . aide("install2", true)); - echo "\n", '<!-- ', sql_version($server_db), ' -->' ; + echo "\n", '<!-- ', sql_version($server_db), ' -->'; list($checked, $res) = install_etape_2_bases($login_db, $server_db); $hidden = (defined('_SPIP_CHMOD') - ? '' - : ("\n<input type='hidden' name='chmod' value='".spip_htmlspecialchars($chmod)."' />")) - . predef_ou_cache($adresse_db.($port?':'.$port:''), $login_db, $pass_db, $server_db); + ? '' + : ("\n<input type='hidden' name='chmod' value='" . spip_htmlspecialchars($chmod) . "' />")) + . predef_ou_cache($adresse_db . ($port ? ':' . $port : ''), $login_db, $pass_db, $server_db); echo install_etape_2_form($hidden, $checked, $res, 3); - } else { - echo info_progression_etape(1,'etape_','install/',true); + } else { + echo info_progression_etape(1, 'etape_', 'install/', true); echo "<div class='error'>"; echo info_etape(_T('info_connexion_base')); echo "<h3>" . _T('avis_connexion_echec_1') . "</h3>"; - echo "<p>"._T('avis_connexion_echec_2')."</p>"; + echo "<p>" . _T('avis_connexion_echec_2') . "</p>"; echo "<p style='font-size: small;'>", - _T('avis_connexion_echec_3'), - "</p></div>"; + _T('avis_connexion_echec_3'), + "</p></div>"; } - + echo install_fin_html(); } @@ -99,79 +102,80 @@ function install_etape_2_dist() // avec une heuristique pour preselectionner la plus probable // http://code.spip.net/@install_etape_2_bases -function install_etape_2_bases($login_db, $server_db) -{ - $res = install_etape_liste_bases($server_db, $login_db); +function install_etape_2_bases($login_db, $server_db) { + $res = install_etape_liste_bases($server_db, $login_db); if ($res) { list($checked, $bases) = $res; - return array($checked, - "<label for='choix_db'><b>" - ._T('texte_choix_base_2') - ."</b><br />" - ._T('texte_choix_base_3') - ."</label>" - . "<ul>\n<li>" - . join("</li>\n<li>",$bases) - . "</li>\n</ul><p>" - . _T('info_ou') - . " " - ); + + return array( + $checked, + "<label for='choix_db'><b>" + . _T('texte_choix_base_2') + . "</b><br />" + . _T('texte_choix_base_3') + . "</label>" + . "<ul>\n<li>" + . join("</li>\n<li>", $bases) + . "</li>\n</ul><p>" + . _T('info_ou') + . " " + ); } - $res = "<b>"._T('avis_lecture_noms_bases_1')."</b> - "._T('avis_lecture_noms_bases_2')."<p>"; + $res = "<b>" . _T('avis_lecture_noms_bases_1') . "</b> + " . _T('avis_lecture_noms_bases_2') . "<p>"; $checked = false; if ($login_db) { // Si un login comporte un point, le nom de la base est plus // probablement le login sans le point -- testons pour savoir - $test_base = $login_db; - $ok = sql_selectdb($test_base, $server_db); - $test_base2 = str_replace('.', '_', $test_base); - if (sql_selectdb($test_base2, $server_db)) { - $test_base = $test_base2; - $ok = true; - } - - if ($ok) { - $res .= _T('avis_lecture_noms_bases_3') + $test_base = $login_db; + $ok = sql_selectdb($test_base, $server_db); + $test_base2 = str_replace('.', '_', $test_base); + if (sql_selectdb($test_base2, $server_db)) { + $test_base = $test_base2; + $ok = true; + } + + if ($ok) { + $res .= _T('avis_lecture_noms_bases_3') . "<ul>" - . "<li><input name=\"choix_db\" value=\"".$test_base."\" type='radio' id='stand' checked='checked' />" - . "<label for='stand'>".$test_base."</label></li>\n" + . "<li><input name=\"choix_db\" value=\"" . $test_base . "\" type='radio' id='stand' checked='checked' />" + . "<label for='stand'>" . $test_base . "</label></li>\n" . "</ul>" - . "<p>"._T('info_ou')." "; - $checked = true; - } + . "<p>" . _T('info_ou') . " "; + $checked = true; + } } return array($checked, $res); } // http://code.spip.net/@install_etape_2_form -function install_etape_2_form($hidden, $checked, $res, $etape) - { +function install_etape_2_form($hidden, $checked, $res, $etape) { return generer_form_ecrire('install', ( - "\n<input type='hidden' name='etape' value='$etape' />" - . $hidden - . (defined('_INSTALL_NAME_DB') - ? '<h3>'._T('install_nom_base_hebergeur'). ' <tt>'._INSTALL_NAME_DB.'</tt>'.'</h3>' - : "\n<fieldset><legend>"._T('texte_choix_base_1')."</legend>\n" - . $res - . "\n<input name=\"choix_db\" value=\"new_spip\" type='radio' id='nou'" - . ($checked ? '' : " checked='checked'") - . " />\n<label for='nou'>"._T('info_creer_base')."</label></p>\n<p>" - . "\n<input type='text' name='table_new' class='text' value=\"spip\" size='20' /></p></fieldset>\n" - ) - - . ((defined('_INSTALL_TABLE_PREFIX') - OR $GLOBALS['table_prefix'] != 'spip') - ? '<h3>'._T('install_table_prefix_hebergeur').' <tt>'.$GLOBALS['table_prefix'].'</tt>'.'</h3>' - : "<fieldset><legend>"._T('texte_choix_table_prefix')."</legend>\n" - . "<p><label for='table_prefix'>"._T('info_table_prefix')."</label></p><p>" - . "\n<input type='text' id='tprefix' name='tprefix' class='text' value='" - . 'spip' # valeur par defaut - . "' size='20' /></p></fieldset>" - ) - - . bouton_suivant())); + "\n<input type='hidden' name='etape' value='$etape' />" + . $hidden + . (defined('_INSTALL_NAME_DB') + ? '<h3>' . _T('install_nom_base_hebergeur') . ' <tt>' . _INSTALL_NAME_DB . '</tt>' . '</h3>' + : "\n<fieldset><legend>" . _T('texte_choix_base_1') . "</legend>\n" + . $res + . "\n<input name=\"choix_db\" value=\"new_spip\" type='radio' id='nou'" + . ($checked ? '' : " checked='checked'") + . " />\n<label for='nou'>" . _T('info_creer_base') . "</label></p>\n<p>" + . "\n<input type='text' name='table_new' class='text' value=\"spip\" size='20' /></p></fieldset>\n" + ) + + . ((defined('_INSTALL_TABLE_PREFIX') + OR $GLOBALS['table_prefix'] != 'spip') + ? '<h3>' . _T('install_table_prefix_hebergeur') . ' <tt>' . $GLOBALS['table_prefix'] . '</tt>' . '</h3>' + : "<fieldset><legend>" . _T('texte_choix_table_prefix') . "</legend>\n" + . "<p><label for='table_prefix'>" . _T('info_table_prefix') . "</label></p><p>" + . "\n<input type='text' id='tprefix' name='tprefix' class='text' value='" + . 'spip' # valeur par defaut + . "' size='20' /></p></fieldset>" + ) + + . bouton_suivant())); } + ?> diff --git a/ecrire/install/etape_3.php b/ecrire/install/etape_3.php index cbffc0c173..bbee713fa4 100644 --- a/ecrire/install/etape_3.php +++ b/ecrire/install/etape_3.php @@ -10,13 +10,15 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/headers'); include_spip('base/abstract_sql'); // http://code.spip.net/@install_bases -function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db){ +function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db) { // Prefix des tables : // contrairement a ce qui est dit dans le message (trop strict mais c'est @@ -25,24 +27,27 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, // a partir de ce qui est envoye a l'installation if (!defined('_INSTALL_TABLE_PREFIX')) { $table_prefix = ($GLOBALS['table_prefix'] != 'spip') - ? $GLOBALS['table_prefix'] - : trim(preg_replace(',[^a-z0-9],','',strtolower(_request('tprefix')))); + ? $GLOBALS['table_prefix'] + : trim(preg_replace(',[^a-z0-9],', '', strtolower(_request('tprefix')))); // S'il est vide on remet spip - if (!$table_prefix) + if (!$table_prefix) { $table_prefix = 'spip'; + } } else { $table_prefix = _INSTALL_TABLE_PREFIX; } - if (preg_match(',(.*):(.*),', $adresse_db, $r)) - list(,$adresse_db, $port) = $r; - else $port = ''; + if (preg_match(',(.*):(.*),', $adresse_db, $r)) { + list(, $adresse_db, $port) = $r; + } else { + $port = ''; + } $GLOBALS['connexions'][$server_db] - = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); + = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] - = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; $fquery = sql_serveur('query', $server_db); if ($choix_db == "new_spip") { @@ -52,12 +57,14 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, if (!$ok) { $re = "Impossible de creer la base $re"; spip_log($re); - return "<p>"._T("avis_connexion_erreur_creer_base")."</p><!--\n$re\n-->"; + + return "<p>" . _T("avis_connexion_erreur_creer_base") . "</p><!--\n$re\n-->"; } } else { $re = "Le nom de la base doit correspondre a $re"; spip_log($re); - return "<p>"._T("avis_connexion_erreur_nom_base")."</p><!--\n$re\n-->"; + + return "<p>" . _T("avis_connexion_erreur_nom_base") . "</p><!--\n$re\n-->"; } } @@ -65,18 +72,20 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, // un sql_mode install_mode_appel($server_db, false); $GLOBALS['connexions'][$server_db] - = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); + = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] - = $GLOBALS['spip_' . $server_db .'_functions_' . $GLOBALS['spip_sql_version']]; + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; // Completer le tableau decrivant la connexion $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; $GLOBALS['connexions'][$server_db]['db'] = $sel_db; - $old = sql_showbase($table_prefix . "_meta", $server_db); - if ($old) $old = sql_fetch($old, $server_db); + $old = sql_showbase($table_prefix . "_meta", $server_db); + if ($old) { + $old = sql_fetch($old, $server_db); + } if (!$old) { // Si possible, demander au serveur d'envoyer les textes @@ -85,11 +94,11 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, if ($charset) { sql_set_charset($charset['charset'], $server_db); - $GLOBALS['meta']['charset_sql_base'] = + $GLOBALS['meta']['charset_sql_base'] = $charset['charset']; - $GLOBALS['meta']['charset_collation_sql_base'] = + $GLOBALS['meta']['charset_collation_sql_base'] = $charset['collation']; - $GLOBALS['meta']['charset_sql_connexion'] = + $GLOBALS['meta']['charset_sql_connexion'] = $charset['charset']; $charsetbase = $charset['charset']; } else { @@ -101,9 +110,11 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, // memoriser avec quel charset on l'a creee if ($charset) { - $t = array('nom' => 'charset_sql_base', - 'valeur' => $charset['charset'], - 'impt' => 'non'); + $t = array( + 'nom' => 'charset_sql_base', + 'valeur' => $charset['charset'], + 'impt' => 'non' + ); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'charset_collation_sql_base'; $t['valeur'] = $charset['collation']; @@ -112,218 +123,236 @@ function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $t['valeur'] = $charset['charset']; @sql_insertq('spip_meta', $t, '', $server_db); } - $t = array('nom' => 'version_installee', - 'valeur' => $GLOBALS['spip_version_base'], - 'impt' => 'non'); + $t = array( + 'nom' => 'version_installee', + 'valeur' => $GLOBALS['spip_version_base'], + 'impt' => 'non' + ); @sql_insertq('spip_meta', $t, '', $server_db); $t['nom'] = 'nouvelle_install'; $t['valeur'] = 1; @sql_insertq('spip_meta', $t, '', $server_db); // positionner la langue par defaut du site si un cookie de lang a ete mis - if (isset($_COOKIE['spip_lang_ecrire'])){ - @sql_insertq('spip_meta', array('nom'=>'langue_site','valeur'=>$_COOKIE['spip_lang_ecrire']), '', $server_db); + if (isset($_COOKIE['spip_lang_ecrire'])) { + @sql_insertq('spip_meta', array('nom' => 'langue_site', 'valeur' => $_COOKIE['spip_lang_ecrire']), '', + $server_db); } } else { - // pour recreer les tables disparues au besoin - spip_log("Table des Meta deja la. Verification des autres."); - creer_base($server_db); - $fupdateq = sql_serveur('updateq', $server_db); - - $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); - - if ($r) $r = sql_fetch($r, $server_db); - $version_installee = !$r ? 0 : (double) $r['valeur']; - if (!$version_installee OR ($GLOBALS['spip_version_base'] < $version_installee)) { - $fupdateq('spip_meta', array('valeur'=>$GLOBALS['spip_version_base'], 'impt'=>'non'), "nom='version_installee'",'', $server_db); - spip_log("nouvelle version installee: " . $GLOBALS['spip_version_base']); - } - // eliminer la derniere operation d'admin mal terminee - // notamment la mise a jour - @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); + // pour recreer les tables disparues au besoin + spip_log("Table des Meta deja la. Verification des autres."); + creer_base($server_db); + $fupdateq = sql_serveur('updateq', $server_db); + + $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); + + if ($r) { + $r = sql_fetch($r, $server_db); + } + $version_installee = !$r ? 0 : (double)$r['valeur']; + if (!$version_installee OR ($GLOBALS['spip_version_base'] < $version_installee)) { + $fupdateq('spip_meta', array('valeur' => $GLOBALS['spip_version_base'], 'impt' => 'non'), + "nom='version_installee'", '', $server_db); + spip_log("nouvelle version installee: " . $GLOBALS['spip_version_base']); + } + // eliminer la derniere operation d'admin mal terminee + // notamment la mise a jour + @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); } // recuperer le charset de la connexion dans les meta $charset = ''; $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='charset_sql_connexion'", $server_db); - if ($r) $r = sql_fetch($r, $server_db); - if ($r) $charset = $r['valeur']; + if ($r) { + $r = sql_fetch($r, $server_db); + } + if ($r) { + $charset = $r['valeur']; + } $ligne_rappel = install_mode_appel($server_db); $result_ok = @$fquery("SELECT COUNT(*) FROM spip_meta", $server_db); - if (!$result_ok) return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; + if (!$result_ok) { + return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; + } if ($chmod_db) { - install_fichier_connexion(_FILE_CHMOD_TMP, "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', ". sprintf('0%3o',$chmod_db).");\n"); + install_fichier_connexion(_FILE_CHMOD_TMP, + "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n"); } // si ce fichier existe a cette etape c'est qu'il provient // d'une installation qui ne l'a pas cree correctement. // Le supprimer pour que _FILE_CONNECT_TMP prime. - if (_FILE_CONNECT AND file_exists(_FILE_CONNECT)) + if (_FILE_CONNECT AND file_exists(_FILE_CONNECT)) { spip_unlink(_FILE_CONNECT); + } + + install_fichier_connexion(_FILE_CONNECT_TMP, + $ligne_rappel + . install_connexion($adresse_db, + $port, + $login_db, + $pass_db, + $sel_db, + $server_db, + $table_prefix, + '', + $charset)); - install_fichier_connexion(_FILE_CONNECT_TMP, - $ligne_rappel - . install_connexion($adresse_db, - $port, - $login_db, - $pass_db, - $sel_db, - $server_db, - $table_prefix, - '', - $charset)); return ''; } // http://code.spip.net/@install_propose_ldap -function install_propose_ldap() -{ +function install_propose_ldap() { return generer_form_ecrire('install', ( - fieldset(_T('info_authentification_externe'), - array( - 'etape' => array( - 'label' => _T('texte_annuaire_ldap_1'), - 'valeur' => 'ldap1', - 'hidden' => true - )), - bouton_suivant(_T('bouton_acces_ldap')) - ))); + fieldset(_T('info_authentification_externe'), + array( + 'etape' => array( + 'label' => _T('texte_annuaire_ldap_1'), + 'valeur' => 'ldap1', + 'hidden' => true + ) + ), + bouton_suivant(_T('bouton_acces_ldap')) + ))); } // http://code.spip.net/@install_premier_auteur -function install_premier_auteur($email, $login, $nom, $pass, $hidden, $auteur_obligatoire) -{ - return info_progression_etape(3,'etape_','install/') . - info_etape(_T('info_informations_personnelles'), - - "<b>"._T('texte_informations_personnelles_1')."</b>" . - aide ("install5", true) . - "<p>" . - ($auteur_obligatoire? - '' - : - _T('texte_informations_personnelles_2') . " " . _T('info_laisser_champs_vides') - )) +function install_premier_auteur($email, $login, $nom, $pass, $hidden, $auteur_obligatoire) { + return info_progression_etape(3, 'etape_', 'install/') . + info_etape(_T('info_informations_personnelles'), + + "<b>" . _T('texte_informations_personnelles_1') . "</b>" . + aide("install5", true) . + "<p>" . + ($auteur_obligatoire ? + '' + : + _T('texte_informations_personnelles_2') . " " . _T('info_laisser_champs_vides') + )) . generer_form_ecrire('install', ( - "\n<input type='hidden' name='etape' value='3b' />" - . $hidden - . fieldset(_T('info_identification_publique'), - array( - 'nom' => array( - 'label' => "<b>"._T('entree_signature')."</b><br />\n"._T('entree_nom_pseudo_1')."\n", - 'valeur' => $nom, - 'required' => $auteur_obligatoire, - ), - 'email' => array( - 'label' => "<b>"._T('entree_adresse_email')."</b>\n", - 'valeur' => $email, - ) - ) - ) - - . fieldset(_T('entree_identifiants_connexion'), - array( - 'login' => array( - 'label' => "<b>"._T('entree_login')."</b><br />\n"._T('info_login_trop_court_car_pluriel', array('nb' => _LOGIN_TROP_COURT))."\n", - 'valeur' => $login, - 'required' => $auteur_obligatoire, - ), - 'pass' => array( - 'label' => "<b>"._T('entree_mot_passe')."</b><br />\n"._T('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI))."\n", - 'valeur' => $pass, - 'required' => $auteur_obligatoire, - ), - 'pass_verif' => array( - 'label' => "<b>"._T('info_confirmer_passe')."</b><br />\n", - 'valeur' => $pass, - 'required' => $auteur_obligatoire, - ) - ) - ) - . bouton_suivant())); + "\n<input type='hidden' name='etape' value='3b' />" + . $hidden + . fieldset(_T('info_identification_publique'), + array( + 'nom' => array( + 'label' => "<b>" . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n", + 'valeur' => $nom, + 'required' => $auteur_obligatoire, + ), + 'email' => array( + 'label' => "<b>" . _T('entree_adresse_email') . "</b>\n", + 'valeur' => $email, + ) + ) + ) + + . fieldset(_T('entree_identifiants_connexion'), + array( + 'login' => array( + 'label' => "<b>" . _T('entree_login') . "</b><br />\n" . _T('info_login_trop_court_car_pluriel', + array('nb' => _LOGIN_TROP_COURT)) . "\n", + 'valeur' => $login, + 'required' => $auteur_obligatoire, + ), + 'pass' => array( + 'label' => "<b>" . _T('entree_mot_passe') . "</b><br />\n" . _T('info_passe_trop_court_car_pluriel', + array('nb' => _PASS_LONGUEUR_MINI)) . "\n", + 'valeur' => $pass, + 'required' => $auteur_obligatoire, + ), + 'pass_verif' => array( + 'label' => "<b>" . _T('info_confirmer_passe') . "</b><br />\n", + 'valeur' => $pass, + 'required' => $auteur_obligatoire, + ) + ) + ) + . bouton_suivant())); } // http://code.spip.net/@install_etape_3_dist -function install_etape_3_dist() -{ +function install_etape_3_dist() { $ldap_present = _request('ldap_present'); if (!$ldap_present) { $adresse_db = defined('_INSTALL_HOST_DB') - ? _INSTALL_HOST_DB - : _request('adresse_db'); + ? _INSTALL_HOST_DB + : _request('adresse_db'); $login_db = defined('_INSTALL_USER_DB') - ? _INSTALL_USER_DB - : _request('login_db'); + ? _INSTALL_USER_DB + : _request('login_db'); $pass_db = defined('_INSTALL_PASS_DB') - ? _INSTALL_PASS_DB - : _request('pass_db'); + ? _INSTALL_PASS_DB + : _request('pass_db'); $server_db = defined('_INSTALL_SERVER_DB') - ? _INSTALL_SERVER_DB - : _request('server_db'); + ? _INSTALL_SERVER_DB + : _request('server_db'); $chmod_db = defined('_SPIP_CHMOD') - ? _SPIP_CHMOD - : _request('chmod'); + ? _SPIP_CHMOD + : _request('chmod'); $choix_db = defined('_INSTALL_NAME_DB') - ? _INSTALL_NAME_DB - : _request('choix_db'); + ? _INSTALL_NAME_DB + : _request('choix_db'); $sel_db = ($choix_db == "new_spip") - ? _request('table_new') : $choix_db; + ? _request('table_new') : $choix_db; - $res = install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db); + $res = install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db); if ($res) { - $res = info_progression_etape(2,'etape_','install/', true) - . "<div class='error'><h3>"._T('avis_operation_echec')."</h3>" - . $res - . "<p>"._T('texte_operation_echec')."</p>" - . "</div>"; + $res = info_progression_etape(2, 'etape_', 'install/', true) + . "<div class='error'><h3>" . _T('avis_operation_echec') . "</h3>" + . $res + . "<p>" . _T('texte_operation_echec') . "</p>" + . "</div>"; } - - } else { + + } else { $res = ''; list($adresse_db, $login_db, $pass_db, $sel_db, $server_db) = analyse_fichier_connection(_FILE_CONNECT_TMP); - $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); + $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, + $server_db); } if (!$res) { - if (file_exists(_FILE_CONNECT_TMP)) + if (file_exists(_FILE_CONNECT_TMP)) { include(_FILE_CONNECT_TMP); - else + } else { redirige_url_ecrire('install'); - - if (file_exists(_FILE_CHMOD_TMP)) + } + + if (file_exists(_FILE_CHMOD_TMP)) { include(_FILE_CHMOD_TMP); - else + } else { redirige_url_ecrire('install'); + } $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) - . (defined('_INSTALL_NAME_DB') ? '' - : "\n<input type='hidden' name='sel_db' value='$sel_db' />"); - - $auteur_obligatoire = ($ldap_present?0:!sql_countsel('spip_auteurs','','','',$server_db)); - - $res = "<div class='success'><b>" - . _T('info_base_installee') - . "</b></div>" - . install_premier_auteur(_request('email'), - _request('login'), - _request('nom'), - _request('pass'), - $hidden, $auteur_obligatoire) - . (($ldap_present OR !function_exists('ldap_connect')) - ? '' : install_propose_ldap()); + . (defined('_INSTALL_NAME_DB') ? '' + : "\n<input type='hidden' name='sel_db' value='$sel_db' />"); + + $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); + + $res = "<div class='success'><b>" + . _T('info_base_installee') + . "</b></div>" + . install_premier_auteur(_request('email'), + _request('login'), + _request('nom'), + _request('pass'), + $hidden, $auteur_obligatoire) + . (($ldap_present OR !function_exists('ldap_connect')) + ? '' : install_propose_ldap()); } echo install_debut_html(); diff --git a/ecrire/install/etape_3b.php b/ecrire/install/etape_3b.php index 5c703d47f2..c081c038ec 100644 --- a/ecrire/install/etape_3b.php +++ b/ecrire/install/etape_3b.php @@ -10,12 +10,13 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/headers'); -function install_etape_3b_dist() -{ +function install_etape_3b_dist() { $login = _request('login'); $email = _request('email'); $nom = _request('nom'); @@ -26,38 +27,45 @@ function install_etape_3b_dist() ? _INSTALL_SERVER_DB : _request('server_db'); - if (!defined('_PASS_LONGUEUR_MINI')) define('_PASS_LONGUEUR_MINI',6); - if (!defined('_LOGIN_TROP_COURT')) define('_LOGIN_TROP_COURT',4); - if($login) { - $echec = ($pass!=$pass_verif) ? - _T('info_passes_identiques') - : ((strlen($pass)<_PASS_LONGUEUR_MINI) ? - _T('info_passe_trop_court_car_pluriel',array('nb'=>_PASS_LONGUEUR_MINI)) - : ((strlen($login)<_LOGIN_TROP_COURT) ? - _T('info_login_trop_court') - : '')); + if (!defined('_PASS_LONGUEUR_MINI')) { + define('_PASS_LONGUEUR_MINI', 6); + } + if (!defined('_LOGIN_TROP_COURT')) { + define('_LOGIN_TROP_COURT', 4); + } + if ($login) { + $echec = ($pass != $pass_verif) ? + _T('info_passes_identiques') + : ((strlen($pass) < _PASS_LONGUEUR_MINI) ? + _T('info_passe_trop_court_car_pluriel', array('nb' => _PASS_LONGUEUR_MINI)) + : ((strlen($login) < _LOGIN_TROP_COURT) ? + _T('info_login_trop_court') + : '')); include_spip('inc/filtres'); - if (!$echec AND $email AND !email_valide($email)) + if (!$echec AND $email AND !email_valide($email)) { $echec = _T('form_email_non_valide'); + } if ($echec) { echo minipres( - 'AUTO', - info_progression_etape(3,'etape_','install/', true). - "<div class='error'><h3>$echec</h3>\n". - "<p>"._T('avis_connexion_echec_2')."</p>". - "</div>" + 'AUTO', + info_progression_etape(3, 'etape_', 'install/', true) . + "<div class='error'><h3>$echec</h3>\n" . + "<p>" . _T('avis_connexion_echec_2') . "</p>" . + "</div>" ); exit; } } - if (@file_exists(_FILE_CHMOD_TMP)) + if (@file_exists(_FILE_CHMOD_TMP)) { include(_FILE_CHMOD_TMP); - else + } else { redirige_url_ecrire('install'); + } - if (!@file_exists(_FILE_CONNECT_TMP)) + if (!@file_exists(_FILE_CONNECT_TMP)) { redirige_url_ecrire('install'); + } # maintenant on connait le vrai charset du site s'il est deja configure # sinon par defaut lire_meta reglera _DEFAULT_CHARSET @@ -78,18 +86,27 @@ function install_etape_3b_dist() $htpass = generer_htpass($pass); $alea_actuel = creer_uniqid(); $alea_futur = creer_uniqid(); - $shapass = _nano_sha256($alea_actuel.$pass); + $shapass = _nano_sha256($alea_actuel . $pass); // prelablement, creer le champ webmestre si il n'existe pas (install neuve // sur une vieille base $t = sql_showtable("spip_auteurs", true); - if (!isset($t['field']['webmestre'])) + if (!isset($t['field']['webmestre'])) { @sql_alter("TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"); + } $id_auteur = sql_getfetsel("id_auteur", "spip_auteurs", "login=" . sql_quote($login)); - if ($id_auteur !== NULL) { - sql_updateq('spip_auteurs', array("nom"=> $nom, 'email'=> $email, 'login'=>$login, 'pass'=>$shapass, 'alea_actuel'=>$alea_actuel, 'alea_futur'=> $alea_futur, 'htpass'=>$htpass, 'statut'=>'0minirezo'), "id_auteur=$id_auteur"); - } - else { + if ($id_auteur !== null) { + sql_updateq('spip_auteurs', array( + "nom" => $nom, + 'email' => $email, + 'login' => $login, + 'pass' => $shapass, + 'alea_actuel' => $alea_actuel, + 'alea_futur' => $alea_futur, + 'htpass' => $htpass, + 'statut' => '0minirezo' + ), "id_auteur=$id_auteur"); + } else { $id_auteur = sql_insertq('spip_auteurs', array( 'nom' => $nom, 'email' => $email, @@ -98,22 +115,26 @@ function install_etape_3b_dist() 'htpass' => $htpass, 'alea_actuel' => $alea_actuel, 'alea_futur' => $alea_futur, - 'statut' =>'0minirezo')); + 'statut' => '0minirezo' + )); } // le passer webmestre separrement du reste, au cas ou l'alter n'aurait pas fonctionne @sql_updateq('spip_auteurs', array('webmestre' => 'oui'), "id_auteur=$id_auteur"); // inserer email comme email webmaster principal // (sauf s'il est vide: cas de la re-installation) - if ($email) + if ($email) { ecrire_meta('email_webmaster', $email); + } // Connecter directement celui qui vient de (re)donner son login // mais sans cookie d'admin ni connexion longue include_spip('inc/auth'); if (!$auteur = auth_identifier_login($login, $pass) - OR !auth_loger($auteur, true)) + OR !auth_loger($auteur, true) + ) { spip_log("login automatique impossible $auth_spip $session" . count($row)); + } } // installer les metas @@ -128,8 +149,8 @@ function install_etape_3b_dist() include_spip('inc/distant'); - redirige_par_entete(parametre_url(self(),'etape','4','&')); - + redirige_par_entete(parametre_url(self(), 'etape', '4', '&')); + } ?> diff --git a/ecrire/install/etape_4.php b/ecrire/install/etape_4.php index d9d01e0f06..98426892e0 100644 --- a/ecrire/install/etape_4.php +++ b/ecrire/install/etape_4.php @@ -10,23 +10,24 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/headers'); // http://code.spip.net/@install_etape_4_dist -function install_etape_4_dist() -{ +function install_etape_4_dist() { // creer le repertoire cache, qui sert partout ! - if(!@file_exists(_DIR_CACHE)) { - $rep = preg_replace(','._DIR_TMP.',', '', _DIR_CACHE); - $rep = sous_repertoire(_DIR_TMP, $rep, true,true); + if (!@file_exists(_DIR_CACHE)) { + $rep = preg_replace(',' . _DIR_TMP . ',', '', _DIR_CACHE); + $rep = sous_repertoire(_DIR_TMP, $rep, true, true); } echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"'); - echo info_progression_etape(4,'etape_','install/'); + echo info_progression_etape(4, 'etape_', 'install/'); echo "<div class='success'><b>" . _T('info_derniere_etape') @@ -36,20 +37,22 @@ function install_etape_4_dist() echo "<p>" - ._T('plugin_info_plugins_dist_1', array('plugins_dist' => "<tt>".joli_repertoire(_DIR_PLUGINS_DIST)."</tt>")) - ."</p>"; + . _T('plugin_info_plugins_dist_1', array('plugins_dist' => "<tt>" . joli_repertoire(_DIR_PLUGINS_DIST) . "</tt>")) + . "</p>"; // installer les extensions include_spip('inc/plugin'); - $afficher = charger_fonction("afficher_liste",'plugins'); - echo $afficher(self(), liste_plugin_files(_DIR_PLUGINS_DIST),array(), array(), _DIR_PLUGINS_DIST,'afficher_nom_plugin'); + $afficher = charger_fonction("afficher_liste", 'plugins'); + echo $afficher(self(), liste_plugin_files(_DIR_PLUGINS_DIST), array(), array(), _DIR_PLUGINS_DIST, + 'afficher_nom_plugin'); // si la base de SPIP est up, on peut installer les plugins, sinon on passe cette etape // car les plugins supposent que la base de SPIP est dans son etat normal (mise a jour) // au premier passage dans l'espace prive on aura une demande d'upgrade qui se poursuit sur la page plugin // et procede alors a l'installation if (!isset($GLOBALS['meta']['version_installee']) - OR ($GLOBALS['spip_version_base'] == (str_replace(',','.',$GLOBALS['meta']['version_installee'])))){ + OR ($GLOBALS['spip_version_base'] == (str_replace(',', '.', $GLOBALS['meta']['version_installee']))) + ) { plugin_installes_meta(); } @@ -59,10 +62,11 @@ function install_etape_4_dist() appliquer_adresse_site(''); // aller a la derniere etape qui clos l'install et redirige - $suite = "\n<input type='hidden' name='etape' value='fin' />" - . bouton_suivant(_T('login_espace_prive')); + $suite = "\n<input type='hidden' name='etape' value='fin' />" + . bouton_suivant(_T('login_espace_prive')); - echo generer_form_ecrire('install', $suite); echo install_fin_html(); + echo generer_form_ecrire('install', $suite); + echo install_fin_html(); } ?> diff --git a/ecrire/install/etape_chmod.php b/ecrire/install/etape_chmod.php index a2992cdd52..55e5eb6167 100644 --- a/ecrire/install/etape_chmod.php +++ b/ecrire/install/etape_chmod.php @@ -10,9 +10,13 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -if (defined('_TEST_DIRS')) return; +if (defined('_TEST_DIRS')) { + return; +} define('_TEST_DIRS', "1"); include_spip('inc/minipres'); @@ -24,7 +28,7 @@ utiliser_langue_visiteur(); // http://code.spip.net/@test_ecrire function test_ecrire($my_dir) { static $chmod = 0; - + $ok = false; $script = @file_exists('spip_loader.php') ? 'spip_loader.php' : $_SERVER['PHP_SELF']; $self = basename($script); @@ -36,16 +40,19 @@ function test_ecrire($my_dir) { // Comparer l'appartenance d'un fichier cree par PHP // avec celle du script et du repertoire courant - if(!$chmod) { + if (!$chmod) { @rmdir('test'); spip_unlink('test'); // effacer au cas ou @touch('test'); - if ($uid > 0 && $uid == $uid2 && @fileowner('test') == $uid) + if ($uid > 0 && $uid == $uid2 && @fileowner('test') == $uid) { $chmod = 0700; - else if ($gid > 0 && $gid == $gid2 && @filegroup('test') == $gid) - $chmod = 0770; - else - $chmod = 0777; + } else { + if ($gid > 0 && $gid == $gid2 && @filegroup('test') == $gid) { + $chmod = 0770; + } else { + $chmod = 0777; + } + } // Appliquer de plus les droits d'acces du script if ($perms > 0) { $perms = ($perms & 0777) | (($perms & 0444) >> 2); @@ -54,15 +61,16 @@ function test_ecrire($my_dir) { spip_unlink('test'); } // Verifier que les valeurs sont correctes - $f = @fopen($my_dir.'test.php', 'w'); + $f = @fopen($my_dir . 'test.php', 'w'); if ($f) { - @fputs($f, '<'.'?php $ok = true; ?'.'>'); + @fputs($f, '<' . '?php $ok = true; ?' . '>'); @fclose($f); - @chmod($my_dir.'test.php', $chmod); - include($my_dir.'test.php'); + @chmod($my_dir . 'test.php', $chmod); + include($my_dir . 'test.php'); } - spip_unlink($my_dir.'test.php'); - return $ok?$chmod:false; + spip_unlink($my_dir . 'test.php'); + + return $ok ? $chmod : false; } // @@ -71,15 +79,18 @@ function test_ecrire($my_dir) { // // http://code.spip.net/@install_etape_chmod_dist -function install_etape_chmod_dist() -{ +function install_etape_chmod_dist() { - $test_dir = _request('test_dir'); + $test_dir = _request('test_dir'); $chmod = 0; if ($test_dir) { - if (substr($test_dir,-1)!=='/') $test_dir .= '/'; - if (!in_array($test_dir, $GLOBALS['test_dirs'])) $GLOBALS['test_dirs'][] = _DIR_RACINE . $test_dir; + if (substr($test_dir, -1) !== '/') { + $test_dir .= '/'; + } + if (!in_array($test_dir, $GLOBALS['test_dirs'])) { + $GLOBALS['test_dirs'][] = _DIR_RACINE . $test_dir; + } } else { if (!_FILE_CONNECT) { $GLOBALS['test_dirs'][] = _DIR_CONNECT; @@ -88,58 +99,65 @@ function install_etape_chmod_dist() } $bad_dirs = array(); - $absent_dirs = array();; + $absent_dirs = array();; while (list(, $my_dir) = each($GLOBALS['test_dirs'])) { $test = test_ecrire($my_dir); if (!$test) { - $m = preg_replace(',^' . _DIR_RACINE . ',', '',$my_dir); + $m = preg_replace(',^' . _DIR_RACINE . ',', '', $my_dir); if (@file_exists($my_dir)) { - $bad_dirs["<li>".$m."</li>"] = 1; - } else - $absent_dirs["<li>".$m."</li>"] = 1; - } else $chmod = max($chmod, $test); + $bad_dirs["<li>" . $m . "</li>"] = 1; + } else { + $absent_dirs["<li>" . $m . "</li>"] = 1; + } + } else { + $chmod = max($chmod, $test); + } } if ($bad_dirs OR $absent_dirs) { - if (!_FILE_CONNECT) { - $titre = _T('dirs_preliminaire'); - $continuer = ' '._T('dirs_commencer') . '.'; - } else - $titre = _T('dirs_probleme_droits'); + if (!_FILE_CONNECT) { + $titre = _T('dirs_preliminaire'); + $continuer = ' ' . _T('dirs_commencer') . '.'; + } else { + $titre = _T('dirs_probleme_droits'); + } - $res = "<div align='right'>". menu_langues('var_lang_ecrire')."</div>\n"; + $res = "<div align='right'>" . menu_langues('var_lang_ecrire') . "</div>\n"; - if ($bad_dirs) { - $res .= - _T('dirs_repertoires_suivants', - array('bad_dirs' => join("\n", array_keys($bad_dirs)))) . - "<b>". _T('login_recharger')."</b>."; - } + if ($bad_dirs) { + $res .= + _T('dirs_repertoires_suivants', + array('bad_dirs' => join("\n", array_keys($bad_dirs)))) . + "<b>" . _T('login_recharger') . "</b>."; + } - if ($absent_dirs) { - $res .= - _T('dirs_repertoires_absents', - array('bad_dirs' => join("\n", array_keys($absent_dirs)))) . - "<b>". _T('login_recharger')."</b>."; - } - $res = "<p>" . $continuer . $res . aide ("install0", true) . "</p>"; + if ($absent_dirs) { + $res .= + _T('dirs_repertoires_absents', + array('bad_dirs' => join("\n", array_keys($absent_dirs)))) . + "<b>" . _T('login_recharger') . "</b>."; + } + $res = "<p>" . $continuer . $res . aide("install0", true) . "</p>"; - $t = _T('login_recharger'); - $t = (!$test_dir ? "" : - "<input type='hidden' name='test_dir' value='$test_dir' />") - . "<input type='hidden' name='etape' value='chmod' />" - . "<div style='text-align: right'><input type='submit' value='$t' /></div>"; + $t = _T('login_recharger'); + $t = (!$test_dir ? "" : + "<input type='hidden' name='test_dir' value='$test_dir' />") + . "<input type='hidden' name='etape' value='chmod' />" + . "<div style='text-align: right'><input type='submit' value='$t' /></div>"; - echo minipres($titre, $res . generer_form_ecrire('install', $t)); + echo minipres($titre, $res . generer_form_ecrire('install', $t)); } else { $deja = (_FILE_CONNECT AND analyse_fichier_connection(_FILE_CONNECT)); - if (!$deja) - redirige_url_ecrire("install", "etape=1&chmod=".$chmod); - else redirige_url_ecrire(); + if (!$deja) { + redirige_url_ecrire("install", "etape=1&chmod=" . $chmod); + } else { + redirige_url_ecrire(); + } } } + ?> diff --git a/ecrire/install/etape_fin.php b/ecrire/install/etape_fin.php index ad7e0a1a04..80a41428f3 100644 --- a/ecrire/install/etape_fin.php +++ b/ecrire/install/etape_fin.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/headers'); include_spip('inc/acces'); @@ -18,32 +20,33 @@ include_spip('inc/acces'); // Mise en place des fichiers de configuration si ce n'est fait // http://code.spip.net/@install_etape_fin_dist -function install_etape_fin_dist() -{ +function install_etape_fin_dist() { ecrire_acces(); - $f = str_replace( _FILE_TMP_SUFFIX, '.php', _FILE_CHMOD_TMP); + $f = str_replace(_FILE_TMP_SUFFIX, '.php', _FILE_CHMOD_TMP); if (file_exists(_FILE_CHMOD_TMP)) { if (!@rename(_FILE_CHMOD_TMP, $f)) { - if (@copy(_FILE_CHMOD_TMP, $f)) + if (@copy(_FILE_CHMOD_TMP, $f)) { spip_unlink(_FILE_CHMOD_TMP); + } } } - $f = str_replace( _FILE_TMP_SUFFIX, '.php', _FILE_CONNECT_TMP); + $f = str_replace(_FILE_TMP_SUFFIX, '.php', _FILE_CONNECT_TMP); if (file_exists(_FILE_CONNECT_TMP)) { spip_log("renomme $f"); if (!@rename(_FILE_CONNECT_TMP, $f)) { - if (@copy(_FILE_CONNECT_TMP, $f)) + if (@copy(_FILE_CONNECT_TMP, $f)) { @spip_unlink(_FILE_CONNECT_TMP); + } } } // creer le repertoire cache, qui sert partout ! // deja fait en etape 4 en principe, on garde au cas ou - if(!@file_exists(_DIR_CACHE)) { - $rep = preg_replace(','._DIR_TMP.',', '', _DIR_CACHE); - $rep = sous_repertoire(_DIR_TMP, $rep, true,true); + if (!@file_exists(_DIR_CACHE)) { + $rep = preg_replace(',' . _DIR_TMP . ',', '', _DIR_CACHE); + $rep = sous_repertoire(_DIR_TMP, $rep, true, true); } // Verifier la securite des htaccess @@ -51,25 +54,31 @@ function install_etape_fin_dist() $msg = install_verifier_htaccess(); if ($msg) { $cible = _T('public:accueil_site'); - $cible = generer_form_ecrire('accueil', '','', $cible); + $cible = generer_form_ecrire('accueil', '', '', $cible); echo minipres('AUTO', $msg . $cible); - // ok, deboucher dans l'espace prive - } else redirige_url_ecrire('accueil'); + // ok, deboucher dans l'espace prive + } else { + redirige_url_ecrire('accueil'); + } } -function install_verifier_htaccess() -{ +function install_verifier_htaccess() { if (verifier_htaccess(_DIR_TMP, true) - AND verifier_htaccess(_DIR_CONNECT, true)) + AND verifier_htaccess(_DIR_CONNECT, true) + ) { return ''; + } $titre = _T('htaccess_inoperant'); - $averti = _T('htaccess_a_simuler', - array('htaccess' => '<tt>' . _ACCESS_FILE_NAME . '</tt>', - 'constantes' => '<tt>_DIR_TMP & _DIR_CONNECT</tt>', - 'document_root' => '<tt>' . $_SERVER['DOCUMENT_ROOT'] . '</tt>')); + $averti = _T('htaccess_a_simuler', + array( + 'htaccess' => '<tt>' . _ACCESS_FILE_NAME . '</tt>', + 'constantes' => '<tt>_DIR_TMP & _DIR_CONNECT</tt>', + 'document_root' => '<tt>' . $_SERVER['DOCUMENT_ROOT'] . '</tt>' + )); return "<div class='error'><h3>$titre</h3><p>$averti</p></div>"; } + ?> diff --git a/ecrire/install/etape_ldap1.php b/ecrire/install/etape_ldap1.php index bd72b65915..bd451e2d52 100644 --- a/ecrire/install/etape_ldap1.php +++ b/ecrire/install/etape_ldap1.php @@ -10,14 +10,15 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // http://code.spip.net/@install_etape_ldap1_dist -function install_etape_ldap1_dist() -{ +function install_etape_ldap1_dist() { $adresse_ldap = defined('_INSTALL_HOST_LDAP') ? _INSTALL_HOST_LDAP - : 'localhost'; + : 'localhost'; $port_ldap = defined('_INSTALL_PORT_LDAP') ? _INSTALL_PORT_LDAP @@ -29,7 +30,7 @@ function install_etape_ldap1_dist() $protocole_ldap = defined('_INSTALL_PROTOCOLE_LDAP') ? _INSTALL_PROTOCOLE_LDAP - : 3 ; // on essaie 2 en cas d'echec + : 3; // on essaie 2 en cas d'echec $login_ldap = defined('_INSTALL_USER_LDAP') ? _INSTALL_USER_LDAP @@ -41,55 +42,56 @@ function install_etape_ldap1_dist() echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"'); - echo info_etape(_T('titre_connexion_ldap'),info_progression_etape(1,'etape_ldap','install/'), _T('entree_informations_connexion_ldap')); + echo info_etape(_T('titre_connexion_ldap'), info_progression_etape(1, 'etape_ldap', 'install/'), + _T('entree_informations_connexion_ldap')); echo generer_form_ecrire('install', ( - "\n<input type='hidden' name='etape' value='ldap2' />" - - . fieldset(_T('entree_adresse_annuaire'), - array( - 'adresse_ldap' => array( - 'label' => _T('texte_adresse_annuaire_1'), - 'valeur' => $adresse_ldap - ), - 'port_ldap' => array( - 'label' => _T('entree_port_annuaire').'<br />'._T('texte_port_annuaire'), - 'valeur' => $port_ldap - ), - 'tls_ldap' => array( - 'label' => '<b>'._T('tls_ldap').'</b>', - 'valeur' => $tls_ldap, - 'alternatives' => array( - 'non' => _T('item_non'), - 'oui' => _T('item_oui') - ) - ), - 'protocole_ldap' => array( - 'label' => _T('protocole_ldap'), - 'valeur' => $protocole_ldap, - 'alternatives' => array( - '3' => '3', - '2' => '2' + "\n<input type='hidden' name='etape' value='ldap2' />" + + . fieldset(_T('entree_adresse_annuaire'), + array( + 'adresse_ldap' => array( + 'label' => _T('texte_adresse_annuaire_1'), + 'valeur' => $adresse_ldap + ), + 'port_ldap' => array( + 'label' => _T('entree_port_annuaire') . '<br />' . _T('texte_port_annuaire'), + 'valeur' => $port_ldap + ), + 'tls_ldap' => array( + 'label' => '<b>' . _T('tls_ldap') . '</b>', + 'valeur' => $tls_ldap, + 'alternatives' => array( + 'non' => _T('item_non'), + 'oui' => _T('item_oui') + ) + ), + 'protocole_ldap' => array( + 'label' => _T('protocole_ldap'), + 'valeur' => $protocole_ldap, + 'alternatives' => array( + '3' => '3', + '2' => '2' + ) ) ) ) - ) - - . "\n<p>"._T('texte_acces_ldap_anonyme_1').'</p>' - . fieldset(_T('connexion_ldap'), - array( - 'login_ldap' => array( - 'label' => _T('texte_login_ldap_1'), - 'valeur' => $login_ldap - ), - 'pass_ldap' => array( - 'label' => _T('entree_passe_ldap'), - 'valeur' => $pass_ldap + + . "\n<p>" . _T('texte_acces_ldap_anonyme_1') . '</p>' + . fieldset(_T('connexion_ldap'), + array( + 'login_ldap' => array( + 'label' => _T('texte_login_ldap_1'), + 'valeur' => $login_ldap + ), + 'pass_ldap' => array( + 'label' => _T('entree_passe_ldap'), + 'valeur' => $pass_ldap + ) ) ) - ) - . bouton_suivant())); + . bouton_suivant())); echo install_fin_html(); } diff --git a/ecrire/install/etape_ldap2.php b/ecrire/install/etape_ldap2.php index 8ee82dfc1d..fa2fd8b82b 100644 --- a/ecrire/install/etape_ldap2.php +++ b/ecrire/install/etape_ldap2.php @@ -11,41 +11,44 @@ \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // http://code.spip.net/@install_etape_ldap2_dist -function install_etape_ldap2_dist() -{ +function install_etape_ldap2_dist() { echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"'); - $adresse_ldap = _request('adresse_ldap'); + $adresse_ldap = _request('adresse_ldap'); $port_ldap = _request('port_ldap'); - $tls_ldap = _request('tls_ldap'); + $tls_ldap = _request('tls_ldap'); - $protocole_ldap = _request('protocole_ldap'); + $protocole_ldap = _request('protocole_ldap'); - $login_ldap = _request('login_ldap'); + $login_ldap = _request('login_ldap'); - $pass_ldap = _request('pass_ldap'); + $pass_ldap = _request('pass_ldap'); $port_ldap = intval($port_ldap); $tls = false; if ($tls_ldap == 'oui') { - if ($port_ldap==636) { - $adresse_ldap = "ldaps://$adresse_ldap"; + if ($port_ldap == 636) { + $adresse_ldap = "ldaps://$adresse_ldap"; - } else $tls = true; + } else { + $tls = true; + } } $ldap_link = ldap_connect($adresse_ldap, $port_ldap); $erreur = "ldap_connect($adresse_ldap, $port_ldap)"; if ($ldap_link) { - if ( !ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap) ) { - $protocole_ldap = 2 ; + if (!ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap)) { + $protocole_ldap = 2; ldap_set_option($ldap_link, LDAP_OPT_PROTOCOL_VERSION, $protocole_ldap); } if ($tls === true) { @@ -61,24 +64,23 @@ function install_etape_ldap2_dist() } if ($ldap_link) { - echo info_etape(_T('titre_connexion_ldap'),info_progression_etape(2,'etape_ldap','install/')), _T('info_connexion_ldap_ok'); + echo info_etape(_T('titre_connexion_ldap'), + info_progression_etape(2, 'etape_ldap', 'install/')), _T('info_connexion_ldap_ok'); echo generer_form_ecrire('install', ( - "\n<input type='hidden' name='etape' value='ldap3' />" - . "\n<input type='hidden' name='adresse_ldap' value=\"$adresse_ldap\" />" - . "\n<input type='hidden' name='port_ldap' value=\"$port_ldap\" />" - . "\n<input type='hidden' name='login_ldap' value=\"$login_ldap\" />" - . "\n<input type='hidden' name='pass_ldap' value=\"$pass_ldap\" />" - . "\n<input type='hidden' name='protocole_ldap' value=\"$protocole_ldap\" />" - . "\n<input type='hidden' name='tls_ldap' value=\"$tls_ldap\" />" - . bouton_suivant())); - } - else { - echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1,'etape_ldap','install/', true), - "<div class='error'><p>"._T('avis_connexion_ldap_echec_1')."</p>", - "<p>"._T('avis_connexion_ldap_echec_2'). - "<br />\n"._T('avis_connexion_ldap_echec_3') . - '<br /><br />'. $erreur. '<b> ?</b></p></div>' - ; + "\n<input type='hidden' name='etape' value='ldap3' />" + . "\n<input type='hidden' name='adresse_ldap' value=\"$adresse_ldap\" />" + . "\n<input type='hidden' name='port_ldap' value=\"$port_ldap\" />" + . "\n<input type='hidden' name='login_ldap' value=\"$login_ldap\" />" + . "\n<input type='hidden' name='pass_ldap' value=\"$pass_ldap\" />" + . "\n<input type='hidden' name='protocole_ldap' value=\"$protocole_ldap\" />" + . "\n<input type='hidden' name='tls_ldap' value=\"$tls_ldap\" />" + . bouton_suivant())); + } else { + echo info_etape(_T('titre_connexion_ldap')), info_progression_etape(1, 'etape_ldap', 'install/', true), + "<div class='error'><p>" . _T('avis_connexion_ldap_echec_1') . "</p>", + "<p>" . _T('avis_connexion_ldap_echec_2') . + "<br />\n" . _T('avis_connexion_ldap_echec_3') . + '<br /><br />' . $erreur . '<b> ?</b></p></div>'; } echo install_fin_html(); diff --git a/ecrire/install/etape_ldap3.php b/ecrire/install/etape_ldap3.php index 844413a110..29a8efc973 100644 --- a/ecrire/install/etape_ldap3.php +++ b/ecrire/install/etape_ldap3.php @@ -11,11 +11,12 @@ \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // http://code.spip.net/@install_etape_ldap3_dist -function install_etape_ldap3_dist() -{ +function install_etape_ldap3_dist() { $adresse_ldap = _request('adresse_ldap'); $login_ldap = _request('login_ldap'); $pass_ldap = _request('pass_ldap'); @@ -27,7 +28,8 @@ function install_etape_ldap3_dist() echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"'); - echo info_etape(_T('info_chemin_acces_1'),info_progression_etape(3,'etape_ldap','install/')),_T('info_chemin_acces_2'); + echo info_etape(_T('info_chemin_acces_1'), + info_progression_etape(3, 'etape_ldap', 'install/')), _T('info_chemin_acces_2'); $ldap_link = @ldap_connect("$adresse_ldap", "$port_ldap"); if ($ldap_link) { @@ -36,11 +38,11 @@ function install_etape_ldap3_dist() $info = @ldap_get_entries($ldap_link, $result); @ldap_close($ldap_link); } - + $checked = false; $res = ''; if (is_array($info) AND $info["count"] > 0) { - $res .= "<p>"._T('info_selection_chemin_acces')."</p>"; + $res .= "<p>" . _T('info_selection_chemin_acces') . "</p>"; $res .= "<ul>"; $n = 0; for ($i = 0; $i < $info["count"]; $i++) { @@ -48,18 +50,18 @@ function install_etape_ldap3_dist() if (is_array($names)) { for ($j = 0; $j < $names["count"]; $j++) { $n++; - $res .= "<li><input name=\"base_ldap\" value=\"".spip_htmlspecialchars($names[$j])."\" type='radio' id='tab$n'"; + $res .= "<li><input name=\"base_ldap\" value=\"" . spip_htmlspecialchars($names[$j]) . "\" type='radio' id='tab$n'"; if (!$checked) { $res .= " checked=\"checked\""; $checked = true; } $res .= " />"; - $res .= "<label for='tab$n'>".spip_htmlspecialchars($names[$j])."</label></li>\n"; + $res .= "<label for='tab$n'>" . spip_htmlspecialchars($names[$j]) . "</label></li>\n"; } } } $res .= "</ul>"; - $res .= _T('info_ou')." "; + $res .= _T('info_ou') . " "; } $res .= "<br />\n<input name=\"base_ldap\" value=\"\" type='radio' id='manuel'"; if (!$checked) { @@ -68,13 +70,13 @@ function install_etape_ldap3_dist() } $res .= " />" - . "\n<label for='manuel'>"._T('entree_chemin_acces')."</label> " - . "\n<fieldset>" - . "<input type='text' name='base_ldap_text' class='text' value=\"$base_ldap_text\" size='40' />" - . "\n</fieldset>" - . "\n<input type='hidden' name='etape' value='ldap4' />" - . install_propager(array('adresse_ldap','port_ldap','login_ldap','pass_ldap','protocole_ldap','tls_ldap')) - . bouton_suivant(); + . "\n<label for='manuel'>" . _T('entree_chemin_acces') . "</label> " + . "\n<fieldset>" + . "<input type='text' name='base_ldap_text' class='text' value=\"$base_ldap_text\" size='40' />" + . "\n</fieldset>" + . "\n<input type='hidden' name='etape' value='ldap4' />" + . install_propager(array('adresse_ldap', 'port_ldap', 'login_ldap', 'pass_ldap', 'protocole_ldap', 'tls_ldap')) + . bouton_suivant(); echo generer_form_ecrire('install', $res); diff --git a/ecrire/install/etape_ldap4.php b/ecrire/install/etape_ldap4.php index 3198beec9b..452f208eff 100644 --- a/ecrire/install/etape_ldap4.php +++ b/ecrire/install/etape_ldap4.php @@ -10,20 +10,23 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('auth/ldap'); // http://code.spip.net/@install_etape_ldap4_dist -function install_etape_ldap4_dist() -{ +function install_etape_ldap4_dist() { $adresse_ldap = _request('adresse_ldap'); $login_ldap = _request('login_ldap'); $pass_ldap = _request('pass_ldap'); $port_ldap = _request('port_ldap'); $base_ldap = _request('base_ldap'); $base_ldap_text = _request('base_ldap_text'); - if (!$base_ldap) $base_ldap = $base_ldap_text; + if (!$base_ldap) { + $base_ldap = $base_ldap_text; + } echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"'); @@ -36,36 +39,35 @@ function install_etape_ldap4_dist() if ($fail) { echo info_etape(_T('info_chemin_acces_annuaire')), - info_progression_etape(3,'etape_ldap','install/', true), - "<div class='error'><p><b>"._T('avis_operation_echec')."</b></p><p>"._T('avis_chemin_invalide_1'), - " (<tt>".spip_htmlspecialchars($base_ldap)."</tt>) "._T('avis_chemin_invalide_2')."</p></div>"; - } - else { + info_progression_etape(3, 'etape_ldap', 'install/', true), + "<div class='error'><p><b>" . _T('avis_operation_echec') . "</b></p><p>" . _T('avis_chemin_invalide_1'), + " (<tt>" . spip_htmlspecialchars($base_ldap) . "</tt>) " . _T('avis_chemin_invalide_2') . "</p></div>"; + } else { info_etape(_T('info_reglage_ldap')); - echo info_progression_etape(4,'etape_ldap','install/'); + echo info_progression_etape(4, 'etape_ldap', 'install/'); $statuts = liste_statuts_ldap(); $statut_ldap = defined('_INSTALL_STATUT_LDAP') - ? _INSTALL_STATUT_LDAP - : $GLOBALS['liste_des_statuts']['info_redacteurs']; - - - $res = install_propager(array('adresse_ldap','port_ldap','login_ldap','pass_ldap','protocole_ldap','tls_ldap')) - . "<input type='hidden' name='etape' value='ldap5' />" - . "<input type='hidden' name='base_ldap' value='" . spip_htmlentities($base_ldap) . "' />" - . fieldset(_T('info_statut_utilisateurs_1'), - array( - 'statut_ldap' => array( - 'label' => _T('info_statut_utilisateurs_2').'<br />', - 'valeur' => $statut_ldap, - 'alternatives' => $statuts + ? _INSTALL_STATUT_LDAP + : $GLOBALS['liste_des_statuts']['info_redacteurs']; + + + $res = install_propager(array('adresse_ldap', 'port_ldap', 'login_ldap', 'pass_ldap', 'protocole_ldap', 'tls_ldap')) + . "<input type='hidden' name='etape' value='ldap5' />" + . "<input type='hidden' name='base_ldap' value='" . spip_htmlentities($base_ldap) . "' />" + . fieldset(_T('info_statut_utilisateurs_1'), + array( + 'statut_ldap' => array( + 'label' => _T('info_statut_utilisateurs_2') . '<br />', + 'valeur' => $statut_ldap, + 'alternatives' => $statuts ) ) - ) - . install_ldap_correspondances() - . bouton_suivant(); + ) + . install_ldap_correspondances() + . bouton_suivant(); - echo generer_form_ecrire('install', $res); + echo generer_form_ecrire('install', $res); } echo install_fin_html(); @@ -73,29 +75,35 @@ function install_etape_ldap4_dist() // http://code.spip.net/@liste_statuts_ldap function liste_statuts_ldap() { - $recom = array("info_administrateurs" => ("<b>" ._T('info_administrateur_1')."</b> "._T('info_administrateur_2')."<br />"), - "info_redacteurs" => ("<b>"._T('info_redacteur_1')."</b> "._T('info_redacteur_2')."<br />"), - "info_visiteurs" => ("<b>"._T('info_visiteur_1')."</b> "._T('info_visiteur_2')."<br />")); - + $recom = array( + "info_administrateurs" => ("<b>" . _T('info_administrateur_1') . "</b> " . _T('info_administrateur_2') . "<br />"), + "info_redacteurs" => ("<b>" . _T('info_redacteur_1') . "</b> " . _T('info_redacteur_2') . "<br />"), + "info_visiteurs" => ("<b>" . _T('info_visiteur_1') . "</b> " . _T('info_visiteur_2') . "<br />") + ); + $res = array(); - foreach($GLOBALS['liste_des_statuts'] as $k => $v) { - if (isset($recom[$k])) $res[$v] = $recom[$k]; + foreach ($GLOBALS['liste_des_statuts'] as $k => $v) { + if (isset($recom[$k])) { + $res[$v] = $recom[$k]; + } } + return $res; } -function install_ldap_correspondances() -{ +function install_ldap_correspondances() { $champs = array(); - foreach (is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : array() as $champ => $v ) { - $nom = 'ldap_' . $champ; - $val = is_array($v) ? join(',', $v) : strval($v); - $champs[$nom]= array( - 'label' => _T('ldap_correspondance', array('champ' => "<tt>$champ</tt>")).'<br />', - 'valeur' => $val - ); + foreach (is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : array() as $champ => $v) { + $nom = 'ldap_' . $champ; + $val = is_array($v) ? join(',', $v) : strval($v); + $champs[$nom] = array( + 'label' => _T('ldap_correspondance', array('champ' => "<tt>$champ</tt>")) . '<br />', + 'valeur' => $val + ); } - return !$champs ? '' : fieldset(_T('ldap_correspondance_1'), $champs, '', _T('ldap_correspondance_2') . '<br /><br />'); + return !$champs ? '' : fieldset(_T('ldap_correspondance_1'), $champs, '', + _T('ldap_correspondance_2') . '<br /><br />'); } + ?> diff --git a/ecrire/install/etape_ldap5.php b/ecrire/install/etape_ldap5.php index 845c58005d..2835336dfb 100644 --- a/ecrire/install/etape_ldap5.php +++ b/ecrire/install/etape_ldap5.php @@ -10,73 +10,80 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/headers'); include_spip('auth/ldap'); // http://code.spip.net/@install_etape_ldap5_dist -function install_etape_ldap5_dist() -{ +function install_etape_ldap5_dist() { etape_ldap5_save(); etape_ldap5_suite(); } -function etape_ldap5_save() -{ - if (!@file_exists(_FILE_CONNECT_TMP)) +function etape_ldap5_save() { + if (!@file_exists(_FILE_CONNECT_TMP)) { redirige_url_ecrire('install'); + } ecrire_meta('ldap_statut_import', _request('statut_ldap')); lire_fichier(_FILE_CONNECT_TMP, $conn); if ($p = strpos($conn, "'');")) { - ecrire_fichier(_FILE_CONNECT_TMP, - substr($conn, 0, $p+1) - . _FILE_LDAP - . substr($conn, $p+1)); + ecrire_fichier(_FILE_CONNECT_TMP, + substr($conn, 0, $p+1) + . _FILE_LDAP + . substr($conn, $p+1)); } - $adresse_ldap = addcslashes(_request('adresse_ldap'),"'\\"); - $login_ldap = addcslashes(_request('login_ldap'),"'\\"); - $pass_ldap = addcslashes(_request('pass_ldap'),"'\\"); - $port_ldap = addcslashes(_request('port_ldap'),"'\\"); - $tls_ldap = addcslashes(_request('tls_ldap'),"'\\"); - $protocole_ldap = addcslashes(_request('protocole_ldap'),"'\\"); - $base_ldap = addcslashes(_request('base_ldap'),"'\\"); - $base_ldap_text = addcslashes(_request('base_ldap_text'),"'\\"); + $adresse_ldap = addcslashes(_request('adresse_ldap'), "'\\"); + $login_ldap = addcslashes(_request('login_ldap'), "'\\"); + $pass_ldap = addcslashes(_request('pass_ldap'), "'\\"); + $port_ldap = addcslashes(_request('port_ldap'), "'\\"); + $tls_ldap = addcslashes(_request('tls_ldap'), "'\\"); + $protocole_ldap = addcslashes(_request('protocole_ldap'), "'\\"); + $base_ldap = addcslashes(_request('base_ldap'), "'\\"); + $base_ldap_text = addcslashes(_request('base_ldap_text'), "'\\"); $conn = "\$GLOBALS['ldap_base'] = '$base_ldap';\n" . "\$GLOBALS['ldap_link'] = @ldap_connect('$adresse_ldap','$port_ldap');\n" . "@ldap_set_option(\$GLOBALS['ldap_link'],LDAP_OPT_PROTOCOL_VERSION,'$protocole_ldap');\n" . (($tls_ldap != 'oui') ? '' : - "@ldap_start_tls(\$GLOBALS['ldap_link']);\n") + "@ldap_start_tls(\$GLOBALS['ldap_link']);\n") . "@ldap_bind(\$GLOBALS['ldap_link'],'$login_ldap','$pass_ldap');\n"; $champs = is_array($GLOBALS['ldap_attributes']) ? $GLOBALS['ldap_attributes'] : array(); $res = ''; - foreach ($champs as $champ => $v ) { + foreach ($champs as $champ => $v) { $nom = 'ldap_' . $champ; $val = trim(_request($nom)); if (preg_match('/^\w*$/', $val)) { - if ($val) $val = _q($val); - } else $val = "array(" . _q(preg_split('/\W+/', $val)) . ')';; - if ($val) $res .= "'$champ' => " . $val . ","; + if ($val) { + $val = _q($val); + } + } else { + $val = "array(" . _q(preg_split('/\W+/', $val)) . ')'; + }; + if ($val) { + $res .= "'$champ' => " . $val . ","; + } } $conn .= "\$GLOBALS['ldap_champs'] = array($res);\n"; - + install_fichier_connexion(_DIR_CONNECT . _FILE_LDAP, $conn); } -function etape_ldap5_suite() -{ +function etape_ldap5_suite() { echo install_debut_html('AUTO', ' onload="document.getElementById(\'suivant\').focus();return false;"'); - echo info_etape(_T('info_ldap_ok'), info_progression_etape(5,'etape_ldap','install/'), _T('info_terminer_installation')); + echo info_etape(_T('info_ldap_ok'), info_progression_etape(5, 'etape_ldap', 'install/'), + _T('info_terminer_installation')); echo generer_form_ecrire('install', ( "<input type='hidden' name='etape' value='3' />" . - "<input type='hidden' name='ldap_present' value='true' />" + "<input type='hidden' name='ldap_present' value='true' />" . bouton_suivant())); echo install_fin_html(); diff --git a/ecrire/iterateur/condition.php b/ecrire/iterateur/condition.php index d3864a3dbc..7449bf2171 100644 --- a/ecrire/iterateur/condition.php +++ b/ecrire/iterateur/condition.php @@ -14,16 +14,18 @@ * Gestion de l'itérateur CONDITION * * @package SPIP\Core\Iterateur\CONDITION -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('iterateur/data'); /** * Créer une boucle sur un itérateur CONDITION - * + * * Annonce au compilateur les "champs" disponibles, * c'est à dire aucun. Une boucle CONDITION n'a pas de données ! * @@ -37,6 +39,7 @@ function iterateur_CONDITION_dist($b) { $b->show = array( 'field' => array() ); + return $b; } @@ -50,8 +53,8 @@ class IterateurCONDITION extends IterateurData { * Obtenir les données de la boucle CONDITION * * @param array $command - **/ + **/ protected function select($command) { - $this->tableau = array(0=>1); + $this->tableau = array(0 => 1); } } diff --git a/ecrire/iterateur/data.php b/ecrire/iterateur/data.php index c9aee39a96..995b05517f 100644 --- a/ecrire/iterateur/data.php +++ b/ecrire/iterateur/data.php @@ -14,16 +14,20 @@ * Gestion de l'itérateur DATA * * @package SPIP\Core\Iterateur\DATA -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -if (!defined('_DATA_SOURCE_MAX_SIZE')) define('_DATA_SOURCE_MAX_SIZE',2*1048576); +if (!defined('_DATA_SOURCE_MAX_SIZE')) { + define('_DATA_SOURCE_MAX_SIZE', 2*1048576); +} /** * Créer une boucle sur un itérateur DATA - * + * * Annonce au compilateur les "champs" disponibles, c'est à dire * 'cle', 'valeur' et '*' (tout nom possible). * @@ -47,6 +51,7 @@ function iterateur_DATA_dist($b) { ) ); $b->select[] = '.valeur'; + return $b; } @@ -59,6 +64,7 @@ function iterateur_DATA_dist($b) { class IterateurDATA implements Iterator { /** * tableau de donnees + * * @var array */ protected $tableau = array(); @@ -66,6 +72,7 @@ class IterateurDATA implements Iterator { /** * Conditions de filtrage * ie criteres de selection + * * @var array */ protected $filtre = array(); @@ -73,28 +80,30 @@ class IterateurDATA implements Iterator { /** * Cle courante + * * @var null */ protected $cle = null; /** * Valeur courante + * * @var null */ protected $valeur = null; /** - * Erreur presente ? + * Erreur presente ? * * @var bool - **/ + **/ public $err = false; /** - * Calcul du total des elements + * Calcul du total des elements * * @var int|null - **/ + **/ public $total = null; /** @@ -104,7 +113,7 @@ class IterateurDATA implements Iterator { * @param array $info */ public function __construct($command, $info = array()) { - $this->type='DATA'; + $this->type = 'DATA'; $this->command = $command; $this->info = $info; @@ -113,6 +122,7 @@ class IterateurDATA implements Iterator { /** * Revenir au depart + * * @return void */ public function rewind() { @@ -122,6 +132,7 @@ class IterateurDATA implements Iterator { /** * Déclarer les critères exceptions + * * @return array */ public function exception_des_criteres() { @@ -130,39 +141,51 @@ class IterateurDATA implements Iterator { /** * Récupérer depuis le cache si possible + * * @param string $cle * @return mixed */ protected function cache_get($cle) { - if (!$cle) return; + if (!$cle) { + return; + } # utiliser memoization si dispo - if (!function_exists('cache_get')) return; + if (!function_exists('cache_get')) { + return; + } + return cache_get($cle); } /** * Stocker en cache si possible + * * @param string $cle * @param int $ttl * @param null|mixed $valeur * @return bool */ protected function cache_set($cle, $ttl, $valeur = null) { - if (!$cle) return; + if (!$cle) { + return; + } if (is_null($valeur)) { $valeur = $this->tableau; } # utiliser memoization si dispo - if (!function_exists('cache_set')) return; + if (!function_exists('cache_set')) { + return; + } + return cache_set($cle, array( 'data' => $valeur, 'time' => time(), 'ttl' => $ttl ), - 3600 + $ttl); - # conserver le cache 1h de plus que la validite demandee, - # pour le cas ou le serveur distant ne reponde plus + 3600+$ttl); + # conserver le cache 1h de plus que la validite demandee, + # pour le cas ou le serveur distant ne reponde plus } /** @@ -187,10 +210,11 @@ class IterateurDATA implements Iterator { // cherchons differents moyens de creer le tableau de donnees // les commandes connues pour l'iterateur DATA // sont : {tableau #ARRAY} ; {cle=...} ; {valeur=...} - + // {source format, [URL], [arg2]...} if (isset($this->command['source']) - AND isset($this->command['sourcemode'])) { + AND isset($this->command['sourcemode']) + ) { $this->select_source(); } @@ -205,14 +229,15 @@ class IterateurDATA implements Iterator { // Si a ce stade on n'a pas de table, il y a un bug if (!is_array($this->tableau)) { $this->err = true; - spip_log("erreur datasource ".var_export($command,true)); + spip_log("erreur datasource " . var_export($command, true)); } // {datapath query.results} // extraire le chemin "query.results" du tableau de donnees if (!$this->err - AND isset($this->command['datapath']) - AND is_array($this->command['datapath'])) { + AND isset($this->command['datapath']) + AND is_array($this->command['datapath']) + ) { $this->select_datapath(); } @@ -242,91 +267,116 @@ class IterateurDATA implements Iterator { # l'objet en cache ; cf plugins/icalendar # perf : pas de fonction table_to_array ! (table est deja un array) if (isset($this->command['sourcemode']) - AND !in_array($this->command['sourcemode'],array('table', 'array', 'tableau'))) + AND !in_array($this->command['sourcemode'], array('table', 'array', 'tableau')) + ) { charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true); + } # le premier argument peut etre un array, une URL etc. $src = $this->command['source'][0]; # avons-nous un cache dispo ? $cle = null; - if (is_string($src)) - $cle = 'datasource_'.md5($this->command['sourcemode'].':'.var_export($this->command['source'],true)); + if (is_string($src)) { + $cle = 'datasource_' . md5($this->command['sourcemode'] . ':' . var_export($this->command['source'], true)); + } $cache = $this->cache_get($cle); - if (isset($this->command['datacache'])) + if (isset($this->command['datacache'])) { $ttl = intval($this->command['datacache']); + } if ($cache - AND ($cache['time'] + (isset($ttl) ? $ttl : $cache['ttl']) - > time()) - AND !(_request('var_mode') === 'recalcul' - AND include_spip('inc/autoriser') - AND autoriser('recalcul') - )) { + AND ($cache['time']+(isset($ttl) ? $ttl : $cache['ttl']) + > time()) + AND !(_request('var_mode') === 'recalcul' + AND include_spip('inc/autoriser') + AND autoriser('recalcul') + ) + ) { $this->tableau = $cache['data']; - } - else try { - # dommage que ca ne soit pas une option de yql_to_array... - if ($this->command['sourcemode'] == 'yql') - if (!isset($ttl)) $ttl = 3600; - - if (isset($this->command['sourcemode']) - AND in_array($this->command['sourcemode'], - array('table', 'array', 'tableau')) - ) { - if (is_array($a = $src) - OR (is_string($a) - AND $a = str_replace('"', '"', $a) # fragile! - AND is_array($a = @unserialize($a))) - ) - $this->tableau = $a; - } - else { - if (tester_url_absolue($src)) { - include_spip('inc/distant'); - $u = recuperer_page($src, false, false, _DATA_SOURCE_MAX_SIZE); - if (!$u) - throw new Exception("404"); - if (!isset($ttl)) $ttl = 24*3600; - } else if (@is_dir($src)) { - $u = $src; - if (!isset($ttl)) $ttl = 10; - } else if (@is_readable($src) && @is_file($src)) { - $u = spip_file_get_contents($src); - if (!isset($ttl)) $ttl = 10; - } else { - $u = $src; - if (!isset($ttl)) $ttl = 10; + } else { + try { + # dommage que ca ne soit pas une option de yql_to_array... + if ($this->command['sourcemode'] == 'yql') { + if (!isset($ttl)) { + $ttl = 3600; + } } - if (!$this->err - AND $g = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true)) { - $args = $this->command['source']; - $args[0] = $u; - if (is_array($a = call_user_func_array($g,$args))) { + + if (isset($this->command['sourcemode']) + AND in_array($this->command['sourcemode'], + array('table', 'array', 'tableau')) + ) { + if (is_array($a = $src) + OR (is_string($a) + AND $a = str_replace('"', '"', $a) # fragile! + AND is_array($a = @unserialize($a))) + ) { $this->tableau = $a; } + } else { + if (tester_url_absolue($src)) { + include_spip('inc/distant'); + $u = recuperer_page($src, false, false, _DATA_SOURCE_MAX_SIZE); + if (!$u) { + throw new Exception("404"); + } + if (!isset($ttl)) { + $ttl = 24*3600; + } + } else { + if (@is_dir($src)) { + $u = $src; + if (!isset($ttl)) { + $ttl = 10; + } + } else { + if (@is_readable($src) && @is_file($src)) { + $u = spip_file_get_contents($src); + if (!isset($ttl)) { + $ttl = 10; + } + } else { + $u = $src; + if (!isset($ttl)) { + $ttl = 10; + } + } + } + } + if (!$this->err + AND $g = charger_fonction($this->command['sourcemode'] . '_to_array', 'inc', true) + ) { + $args = $this->command['source']; + $args[0] = $u; + if (is_array($a = call_user_func_array($g, $args))) { + $this->tableau = $a; + } + } } - } - if (!is_array($this->tableau)) - $this->err = true; + if (!is_array($this->tableau)) { + $this->err = true; + } - if (!$this->err AND isset($ttl) and $ttl>0) - $this->cache_set($cle, $ttl); + if (!$this->err AND isset($ttl) and $ttl > 0) { + $this->cache_set($cle, $ttl); + } - } - catch (Exception $e) { - $e = $e->getMessage(); - $err = sprintf("[%s, %s] $e", - $src, - $this->command['sourcemode']); - erreur_squelette(array($err, array())); - $this->err = true; + } catch (Exception $e) { + $e = $e->getMessage(); + $err = sprintf("[%s, %s] $e", + $src, + $this->command['sourcemode']); + erreur_squelette(array($err, array())); + $this->err = true; + } } # en cas d'erreur, utiliser le cache si encore dispo if ($this->err - AND $cache) { + AND $cache + ) { $this->tableau = $cache['data']; $this->err = false; } @@ -335,12 +385,12 @@ class IterateurDATA implements Iterator { /** * Retourne un tableau donne depuis un critère liste - * + * * Critère `{liste X1, X2, X3}` * * @see critere_DATA_liste_dist() - * - **/ + * + **/ protected function select_liste() { # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE if (!isset($this->command['liste'][1])) { @@ -357,7 +407,7 @@ class IterateurDATA implements Iterator { * Retourne un tableau donne depuis un critere liste * Critere {enum Xmin, Xmax} * - **/ + **/ protected function select_enum() { # s'il n'y a qu'une valeur dans la liste, sans doute une #BALISE if (!isset($this->command['enum'][1])) { @@ -367,10 +417,12 @@ class IterateurDATA implements Iterator { $this->command['enum'] = $this->command['enum'][0]; } } - if (count($this->command['enum'])>=3) - $enum = range(array_shift($this->command['enum']),array_shift($this->command['enum']),array_shift($this->command['enum'])); - else - $enum = range(array_shift($this->command['enum']),array_shift($this->command['enum'])); + if (count($this->command['enum']) >= 3) { + $enum = range(array_shift($this->command['enum']), array_shift($this->command['enum']), + array_shift($this->command['enum'])); + } else { + $enum = range(array_shift($this->command['enum']), array_shift($this->command['enum'])); + } $this->tableau = $enum; } @@ -378,11 +430,11 @@ class IterateurDATA implements Iterator { /** * extraire le chemin "query.results" du tableau de donnees * {datapath query.results} - * - **/ + * + **/ protected function select_datapath() { - list(,$base) = each($this->command['datapath']); - if (strlen($base = ltrim(trim($base),"/"))) { + list(, $base) = each($this->command['datapath']); + if (strlen($base = ltrim(trim($base), "/"))) { $this->tableau = table_valeur($this->tableau, $base); if (!is_array($this->tableau)) { $this->tableau = array(); @@ -395,51 +447,54 @@ class IterateurDATA implements Iterator { /** * Ordonner les resultats * {par x} - * - **/ + * + **/ protected function select_orderby() { $sortfunc = ''; $aleas = 0; - foreach($this->command['orderby'] as $tri) { + foreach ($this->command['orderby'] as $tri) { // virer le / initial pour les criteres de la forme {par /xx} if (preg_match(',^\.?([/\w]+)( DESC)?$,iS', ltrim($tri, '/'), $r)) { $r = array_pad($r, 3, null); // tri par cle - if ($r[1] == 'cle'){ - if (isset($r[2]) and $r[2]) + if ($r[1] == 'cle') { + if (isset($r[2]) and $r[2]) { krsort($this->tableau); - else + } else { ksort($this->tableau); - } - # {par hasard} - else if ($r[1] == 'alea') { - $k = array_keys($this->tableau); - shuffle($k); - $v = array(); - foreach($k as $cle) - $v[$cle] = $this->tableau[$cle]; - $this->tableau = $v; - } + } + } # {par hasard} else { - # {par valeur} - if ($r[1] == 'valeur') - $tv = '%s'; - # {par valeur/xx/yy} ?? - else - $tv = 'table_valeur(%s, '.var_export($r[1],true).')'; - $sortfunc .= ' - $a = '.sprintf($tv,'$aa').'; - $b = '.sprintf($tv,'$bb').'; + if ($r[1] == 'alea') { + $k = array_keys($this->tableau); + shuffle($k); + $v = array(); + foreach ($k as $cle) { + $v[$cle] = $this->tableau[$cle]; + } + $this->tableau = $v; + } else { + # {par valeur} + if ($r[1] == 'valeur') { + $tv = '%s'; + } # {par valeur/xx/yy} ?? + else { + $tv = 'table_valeur(%s, ' . var_export($r[1], true) . ')'; + } + $sortfunc .= ' + $a = ' . sprintf($tv, '$aa') . '; + $b = ' . sprintf($tv, '$bb') . '; if ($a <> $b) - return ($a ' . ((isset($r[2]) and $r[2]) ? '>' : '<').' $b) ? -1 : 1;'; + return ($a ' . ((isset($r[2]) and $r[2]) ? '>' : '<') . ' $b) ? -1 : 1;'; + } } } } if ($sortfunc) { uasort($this->tableau, create_function('$aa,$bb', - $sortfunc.' + $sortfunc . ' return 0;' )); } @@ -449,33 +504,36 @@ class IterateurDATA implements Iterator { /** * Grouper les resultats * {fusion /x/y/z} - * - **/ + * + **/ protected function select_groupby() { // virer le / initial pour les criteres de la forme {fusion /xx} if (strlen($fusion = ltrim($this->command['groupby'][0], '/'))) { $vu = array(); - foreach($this->tableau as $k => $v) { + foreach ($this->tableau as $k => $v) { $val = table_valeur($v, $fusion); - if (isset($vu[$val])) + if (isset($vu[$val])) { unset($this->tableau[$k]); - else + } else { $vu[$val] = true; + } } } } - - + + /** * L'iterateur est-il encore valide ? + * * @return bool */ - public function valid(){ + public function valid() { return !is_null($this->cle); } /** * Retourner la valeur + * * @return null */ public function current() { @@ -484,6 +542,7 @@ class IterateurDATA implements Iterator { /** * Retourner la cle + * * @return null */ public function key() { @@ -492,21 +551,26 @@ class IterateurDATA implements Iterator { /** * Passer a la valeur suivante + * * @return void */ - public function next(){ - if ($this->valid()) + public function next() { + if ($this->valid()) { list($this->cle, $this->valeur) = each($this->tableau); + } } /** * Compter le nombre total de resultats + * * @return int */ public function count() { - if (is_null($this->total)) + if (is_null($this->total)) { $this->total = count($this->tableau); - return $this->total; + } + + return $this->total; } } @@ -526,15 +590,18 @@ function inc_file_to_array_dist($u) { /** * plugins -> tableau + * * @return unknown */ function inc_plugins_to_array_dist() { include_spip('inc/plugin'); + return liste_chemin_plugin_actifs(); } /** * xml -> tableau + * * @param string $u * @return array */ @@ -546,118 +613,144 @@ function inc_xml_to_array_dist($u) { * * object -> tableau * - * @param object $object The object to convert + * @param object $object The object to convert * @return array * */ -function inc_object_to_array( $object ) { - if( !is_object( $object ) && !is_array( $object ) ) { - return $object; - } - if( is_object( $object ) ) { - $object = get_object_vars( $object ); - } - return array_map( 'inc_object_to_array', $object ); +function inc_object_to_array($object) { + if (!is_object($object) && !is_array($object)) { + return $object; + } + if (is_object($object)) { + $object = get_object_vars($object); + } + + return array_map('inc_object_to_array', $object); } /** * yql -> tableau + * * @throws Exception * @param string $u * @return array|bool */ function inc_yql_to_array_dist($u) { define('_YQL_ENDPOINT', 'http://query.yahooapis.com/v1/public/yql?&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys&q='); - $v = recuperer_url($url = _YQL_ENDPOINT.urlencode($u).'&format=json'); + $v = recuperer_url($url = _YQL_ENDPOINT . urlencode($u) . '&format=json'); if (!$v['page'] - OR !$w = json_decode($v['page'],true)) { + OR !$w = json_decode($v['page'], true) + ) { throw new Exception('YQL: réponse vide ou mal formée'); } - if (isset($w['error'])){ + if (isset($w['error'])) { throw new Exception($w['error']['description']); } + return inc_object_to_array($w); } /** * sql -> tableau + * * @param string $u * @return array|bool */ function inc_sql_to_array_dist($u) { # sortir le connecteur de $u preg_match(',^(?:(\w+):)?(.*)$,S', $u, $v); - $serveur = (string) $v[1]; + $serveur = (string)$v[1]; $req = trim($v[2]); if ($s = sql_query($req, $serveur)) { $r = array(); - while ($t = sql_fetch($s)) + while ($t = sql_fetch($s)) { $r[] = $t; + } + return $r; } + return false; } /** * json -> tableau + * * @param string $u * @return array|bool */ function inc_json_to_array_dist($u) { if (is_array($json = json_decode($u)) - OR is_object($json)) - return (array) $json; + OR is_object($json) + ) { + return (array)$json; + } } /** * csv -> tableau + * * @param string $u * @return array|bool */ function inc_csv_to_array_dist($u) { include_spip('inc/csv'); - list($entete,$csv) = analyse_csv($u); - array_unshift($csv,$entete); + list($entete, $csv) = analyse_csv($u); + array_unshift($csv, $entete); include_spip('inc/charsets'); - $i = 1 ; + $i = 1; foreach ($entete as $k => $v) { - if (trim($v) == "") $v = "col".$i ; // reperer des eventuelles cases vides - if (is_numeric($v) and $v < 0) $v = "__".$v; // ne pas risquer d'ecraser une cle numerique - if (is_numeric($v)) $v = "_".$v; // ne pas risquer d'ecraser une cle numerique + if (trim($v) == "") { + $v = "col" . $i; + } // reperer des eventuelles cases vides + if (is_numeric($v) and $v < 0) { + $v = "__" . $v; + } // ne pas risquer d'ecraser une cle numerique + if (is_numeric($v)) { + $v = "_" . $v; + } // ne pas risquer d'ecraser une cle numerique $v = strtolower(preg_replace(',\W+,', '_', translitteration($v))); - foreach ($csv as &$item) + foreach ($csv as &$item) { $item[$v] = &$item[$k]; - $i++; + } + $i++; } + return $csv; } /** * RSS -> tableau + * * @param string $u * @return array|bool */ function inc_rss_to_array_dist($u) { include_spip('inc/syndic'); - if (is_array($rss = analyser_backend($u))) + if (is_array($rss = analyser_backend($u))) { $tableau = $rss; + } + return $tableau; } /** * atom, alias de rss -> tableau + * * @param string $u * @return array|bool */ function inc_atom_to_array_dist($u) { $g = charger_fonction('rss_to_array', 'inc'); + return $g($u); } /** * glob -> tableau * lister des fichiers selon un masque, pour la syntaxe cf php.net/glob + * * @param string $u * @return array|bool */ @@ -665,19 +758,22 @@ function inc_glob_to_array_dist($u) { $a = glob($u, GLOB_MARK | GLOB_NOSORT | GLOB_BRACE ); + return $a ? $a : array(); } /** * YAML -> tableau + * * @param string $u * @return bool|array * @throws Exception */ -function inc_yaml_to_array_dist($u){ +function inc_yaml_to_array_dist($u) { include_spip('inc/yaml-mini'); - if (!function_exists("yaml_decode")){ + if (!function_exists("yaml_decode")) { throw new Exception('YAML: impossible de trouver la fonction yaml_decode'); + return false; } @@ -689,19 +785,21 @@ function inc_yaml_to_array_dist($u){ * pregfiles -> tableau * lister des fichiers a partir d'un dossier de base et selon une regexp. * pour la syntaxe cf la fonction spip preg_files + * * @param string $dir * @param string $regexp * @param int $limit * @return array|bool */ function inc_pregfiles_to_array_dist($dir, $regexp = -1, $limit = 10000) { - return (array) preg_files($dir, $regexp, $limit); + return (array)preg_files($dir, $regexp, $limit); } /** * ls -> tableau * ls : lister des fichiers selon un masque glob * et renvoyer aussi leurs donnees php.net/stat + * * @param string $u * @return array|bool */ @@ -709,41 +807,49 @@ function inc_ls_to_array_dist($u) { $glob = charger_fonction('glob_to_array', 'inc'); $a = $glob($u); foreach ($a as &$v) { - $b = (array) @stat($v); - foreach ($b as $k => $ignore) - if (is_numeric($k)) unset($b[$k]); + $b = (array)@stat($v); + foreach ($b as $k => $ignore) { + if (is_numeric($k)) { + unset($b[$k]); + } + } $b['file'] = basename($v); $v = array_merge( pathinfo($v), $b ); } + return $a; } /** * Object -> tableau + * * @param Object $object * @return array|bool */ -function XMLObjectToArray($object){ +function XMLObjectToArray($object) { $xml_array = array(); - for( $object->rewind(); $object->valid(); $object->next() ) { - if(array_key_exists($key = $object->key(), $xml_array)){ - $key .= '-'.uniqid(); + for ($object->rewind(); $object->valid(); $object->next()) { + if (array_key_exists($key = $object->key(), $xml_array)) { + $key .= '-' . uniqid(); } $vars = get_object_vars($object->current()); - if (isset($vars['@attributes'])) - foreach($vars['@attributes'] as $k => $v) - $xml_array[$key][$k] = $v; - if($object->hasChildren()){ + if (isset($vars['@attributes'])) { + foreach ($vars['@attributes'] as $k => $v) { + $xml_array[$key][$k] = $v; + } + } + if ($object->hasChildren()) { $xml_array[$key][] = XMLObjectToArray( $object->current()); - } - else{ + } else { $xml_array[$key][] = strval($object->current()); } } + return $xml_array; } + ?> diff --git a/ecrire/iterateur/php.php b/ecrire/iterateur/php.php index 60728c3043..09b189f293 100644 --- a/ecrire/iterateur/php.php +++ b/ecrire/iterateur/php.php @@ -15,15 +15,17 @@ * Gestion de l'itérateur PHP * * @package SPIP\Core\Iterateur\PHP -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Créer une boucle sur un itérateur PHP - * + * * Annonce au compilateur les "champs" disponibles, c'est à dire * 'cle', 'valeur' et toutes les méthodes de l'itérateur désigné. * @@ -43,13 +45,15 @@ function iterateur_php_dist($b, $iteratorName) { ) ); foreach (get_class_methods($iteratorName) as $method) { - $b->show['field'][ strtolower($method) ] = 'METHOD'; + $b->show['field'][strtolower($method)] = 'METHOD'; } + /* foreach (get_class_vars($iteratorName) as $property) { $b->show['field'][ strtolower($property) ] = 'PROPERTY'; } */ + return $b; } diff --git a/ecrire/iterateur/pour.php b/ecrire/iterateur/pour.php index 03a5440140..4fd5438739 100644 --- a/ecrire/iterateur/pour.php +++ b/ecrire/iterateur/pour.php @@ -14,16 +14,18 @@ * Gestion de l'itérateur POUR * * @package SPIP\Core\Iterateur\POUR -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('iterateur/data'); /** * Créer une boucle sur un itérateur POUR - * + * * Annonce au compilateur les "champs" disponibles, * c'est à dire 'cle' et 'valeur'. * @@ -40,6 +42,7 @@ function iterateur_POUR_dist($b) { 'valeur' => 'STRING', ) ); + return $b; } diff --git a/ecrire/iterateur/sql.php b/ecrire/iterateur/sql.php index a87b8cff55..9f3beed788 100644 --- a/ecrire/iterateur/sql.php +++ b/ecrire/iterateur/sql.php @@ -14,9 +14,11 @@ * Gestion de l'itérateur SQL * * @package SPIP\Core\Iterateur\SQL -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -28,12 +30,14 @@ class IterateurSQL implements Iterator { /** * ressource sql + * * @var resource|bool */ protected $sqlresult = false; /** * row sql courante + * * @var array|null */ protected $row = null; @@ -41,27 +45,29 @@ class IterateurSQL implements Iterator { protected $firstseek = false; /** - * Erreur presente ? + * Erreur presente ? * * @var bool - **/ + **/ public $err = false; /** - * Calcul du total des elements + * Calcul du total des elements * * @var int|null - **/ + **/ public $total = null; /** * selectionner les donnees, ie faire la requete SQL + * * @return void */ protected function select() { $this->row = null; $v = &$this->command; - $this->sqlresult = calculer_select($v['select'], $v['from'], $v['type'], $v['where'], $v['join'], $v['groupby'], $v['orderby'], $v['limit'], $v['having'], $v['table'], $v['id'], $v['connect'], $this->info); + $this->sqlresult = calculer_select($v['select'], $v['from'], $v['type'], $v['where'], $v['join'], $v['groupby'], + $v['orderby'], $v['limit'], $v['having'], $v['table'], $v['id'], $v['connect'], $this->info); $this->err = !$this->sqlresult; $this->firstseek = false; $this->pos = -1; @@ -75,7 +81,7 @@ class IterateurSQL implements Iterator { * array info: les infos sur le squelette */ public function __construct($command, $info = array()) { - $this->type='SQL'; + $this->type = 'SQL'; $this->command = $command; $this->info = $info; $this->select(); @@ -83,6 +89,7 @@ class IterateurSQL implements Iterator { /** * Rembobiner + * * @return bool */ public function rewind() { @@ -93,18 +100,23 @@ class IterateurSQL implements Iterator { /** * Verifier l'etat de l'iterateur + * * @return bool */ public function valid() { - if ($this->err) + if ($this->err) { return false; - if (!$this->firstseek) + } + if (!$this->firstseek) { $this->next(); + } + return is_array($this->row); } /** * Valeurs sur la position courante + * * @return array */ public function current() { @@ -114,9 +126,10 @@ class IterateurSQL implements Iterator { public function key() { return $this->pos; } - + /** * Sauter a une position absolue + * * @param int $n * @param null|string $continue * @return bool @@ -126,7 +139,7 @@ class IterateurSQL implements Iterator { // SQLite ne sait pas seek(), il faut relancer la query // si la position courante est apres la position visee // il faut relancer la requete - if ($this->pos>$n){ + if ($this->pos > $n) { $this->free(); $this->select(); $this->valid(); @@ -136,46 +149,56 @@ class IterateurSQL implements Iterator { return false; } $this->row = sql_fetch($this->sqlresult, $this->command['connect']); - $this->pos = min($n,$this->count()); + $this->pos = min($n, $this->count()); + return true; } /** * Avancer d'un cran + * * @return void */ - public function next(){ + public function next() { $this->row = sql_fetch($this->sqlresult, $this->command['connect']); - $this->pos ++; + $this->pos++; $this->firstseek |= true; } /** * Avancer et retourner les donnees pour le nouvel element + * * @return array|bool|null */ - public function fetch(){ + public function fetch() { if ($this->valid()) { $r = $this->current(); $this->next(); - } else + } else { $r = false; + } + return $r; } /** * liberer les ressources + * * @return bool */ - public function free(){ - if (!$this->sqlresult) return true; + public function free() { + if (!$this->sqlresult) { + return true; + } $a = sql_free($this->sqlresult, $this->command['connect']); - $this->sqlresult = null; - return $a; + $this->sqlresult = null; + + return $a; } - + /** * Compter le nombre de resultats + * * @return int */ public function count() { @@ -188,10 +211,12 @@ class IterateurSQL implements Iterator { $this->valid(); $s = $this->current(); $this->total = $s['count(*)']; - } else + } else { $this->total = sql_count($this->sqlresult, $this->command['connect']); + } } } + return $this->total; } } diff --git a/ecrire/maj/svn10000.php b/ecrire/maj/svn10000.php index 7745bfe909..8ebab8dd96 100644 --- a/ecrire/maj/svn10000.php +++ b/ecrire/maj/svn10000.php @@ -15,10 +15,12 @@ * * Gestion des mises à jour du cÅ“ur de SPIP par un tableau global `maj` * indexé par le numero SVN du changement - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Type cls et sty pour LaTeX @@ -39,48 +41,52 @@ $GLOBALS['maj'][11171] = array( /** * Mise à jour 11268 : renommer spip_recherches la mal nommée en spip_resultats -**/ + **/ function maj_11268() { global $tables_auxiliaires; include_spip('base/auxiliaires'); - $v = $tables_auxiliaires[$k='spip_resultats']; + $v = $tables_auxiliaires[$k = 'spip_resultats']; sql_create($k, $v['field'], $v['key'], false, false); } + $GLOBALS['maj'][11268] = array(array('maj_11268')); /** * Mise à jour 11276 : réparer les éventuelles tables spip_documents * en se fondant sur l'extension de la colonne fichier + * * @uses maj_1_938() -**/ -function maj_11276 () { + **/ +function maj_11276() { include_spip('maj/v019'); maj_1_938(); } + $GLOBALS['maj'][11276] = array(array('maj_11276')); /** * Mise à jour 11388 : réparer les referers d'article, qui sont vides depuis r10572 */ -function maj_11388 () { +function maj_11388() { $s = sql_select('referer_md5', 'spip_referers_articles', "referer='' OR referer IS NULL"); while ($t = sql_fetch($s)) { - $k = sql_fetsel('referer', 'spip_referers', 'referer_md5='.sql_quote($t['referer_md5'])); + $k = sql_fetsel('referer', 'spip_referers', 'referer_md5=' . sql_quote($t['referer_md5'])); if ($k['referer']) { spip_query('UPDATE spip_referers_articles - SET referer='.sql_quote($k['referer']).' - WHERE referer_md5='.sql_quote($t['referer_md5']) - ." AND (referer='' OR referer IS NULL)" + SET referer=' . sql_quote($k['referer']) . ' + WHERE referer_md5=' . sql_quote($t['referer_md5']) + . " AND (referer='' OR referer IS NULL)" ); } } } + $GLOBALS['maj'][11388] = array(array('maj_11388')); /** * Mise à jour 11431 : réparer spip_mots.type = titre du groupe */ -function maj_11431 () { +function maj_11431() { // mysql only // spip_query("UPDATE spip_mots AS a LEFT JOIN spip_groupes_mots AS b ON (a.id_groupe = b.id_groupe) SET a.type=b.titre"); @@ -90,18 +96,19 @@ function maj_11431 () { array("spip_mots AS a LEFT JOIN spip_groupes_mots AS b ON (a.id_groupe = b.id_groupe)"), array("a.type != b.titre")); // mise a jour de ces mots la - if ($res){ - while ($r = sql_fetch($res)){ - sql_updateq('spip_mots', array('type'=>$r['type']), 'id_mot='.sql_quote($r['id_mot'])); + if ($res) { + while ($r = sql_fetch($res)) { + sql_updateq('spip_mots', array('type' => $r['type']), 'id_mot=' . sql_quote($r['id_mot'])); } } } + $GLOBALS['maj'][11431] = array(array('maj_11431')); /** * Mise à jour 11778 : réparer spip_types_documents.id_type qui est parfois encore présent */ -function maj_11778 () { +function maj_11778() { // si presence id_type $s = sql_showtable('spip_types_documents'); if (isset($s['field']['id_type'])) { @@ -110,12 +117,13 @@ function maj_11778 () { sql_alter('TABLE spip_types_documents ADD PRIMARY KEY (extension)'); } } + $GLOBALS['maj'][11778] = array(array('maj_11778')); /** * Mise à jour 11790 : Optimisation des forums */ -function maj_11790 () { +function maj_11790() { # sql_alter('TABLE spip_forum DROP INDEX id_message id_message'); sql_alter('TABLE spip_forum ADD INDEX id_parent (id_parent)'); sql_alter('TABLE spip_forum ADD INDEX id_auteur (id_auteur)'); @@ -127,15 +135,28 @@ $GLOBALS['maj'][11790] = array(array('maj_11790')); $GLOBALS['maj'][11794] = array(); // ajout de spip_documents_forum - $GLOBALS['maj'][11961] = array( -array('sql_alter',"TABLE spip_groupes_mots CHANGE `tables` tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"), // si tables a ete cree on le renomme -array('sql_alter',"TABLE spip_groupes_mots ADD tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"), // sinon on l'ajoute -array('sql_update','spip_groupes_mots',array('tables_liees'=>"''"),"articles REGEXP '.*'"), // si le champ articles est encore la, on reinit la conversion -array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'articles,')"),"articles='oui'"), // sinon ces 4 requetes ne feront rien -array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'breves,')"),"breves='oui'"), -array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'rubriques,')"),"rubriques='oui'"), -array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liees,'syndic,')"),"syndic='oui'"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `tables` tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"), + // si tables a ete cree on le renomme + array('sql_alter', "TABLE spip_groupes_mots ADD tables_liees text DEFAULT '' NOT NULL AFTER obligatoire"), + // sinon on l'ajoute + array('sql_update', 'spip_groupes_mots', array('tables_liees' => "''"), "articles REGEXP '.*'"), + // si le champ articles est encore la, on reinit la conversion + array( + 'sql_update', + 'spip_groupes_mots', + array('tables_liees' => "concat(tables_liees,'articles,')"), + "articles='oui'" + ), + // sinon ces 4 requetes ne feront rien + array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'breves,')"), "breves='oui'"), + array( + 'sql_update', + 'spip_groupes_mots', + array('tables_liees' => "concat(tables_liees,'rubriques,')"), + "rubriques='oui'" + ), + array('sql_update', 'spip_groupes_mots', array('tables_liees' => "concat(tables_liees,'syndic,')"), "syndic='oui'"), ); @@ -143,17 +164,18 @@ array('sql_update','spip_groupes_mots',array('tables_liees'=>"concat(tables_liee * Mise à jour 12008 : Réunir en une seule table les liens de documents * spip_documents_articles et spip_documents_forum */ -function maj_12008 () { +function maj_12008() { // Creer spip_documents_liens global $tables_auxiliaires; include_spip('base/auxiliaires'); - $v = $tables_auxiliaires[$k='spip_documents_liens']; + $v = $tables_auxiliaires[$k = 'spip_documents_liens']; sql_create($k, $v['field'], $v['key'], false, false); // Recopier les donnees foreach (array('article', 'breve', 'rubrique', 'auteur', 'forum') as $l) { - if ($s = sql_select('*', 'spip_documents_'.$l.'s') - OR $s = sql_select('*', 'spip_documents_'.$l)) { + if ($s = sql_select('*', 'spip_documents_' . $l . 's') + OR $s = sql_select('*', 'spip_documents_' . $l) + ) { $tampon = array(); while ($t = sql_fetch($s)) { // transformer id_xx=N en (id_objet=N, objet=xx) @@ -162,8 +184,8 @@ function maj_12008 () { unset($t["id_$l"]); unset($t['maj']); $tampon[] = $t; - if (count($tampon)>10000) { - sql_insertq_multi('spip_documents_liens',$tampon); + if (count($tampon) > 10000) { + sql_insertq_multi('spip_documents_liens', $tampon); $tampon = array(); } } @@ -176,45 +198,70 @@ function maj_12008 () { $GLOBALS['maj'][12008] = array( //array('sql_drop_table',"spip_documents_liens"), // tant pis pour ceux qui ont joue a 11974 -array('sql_alter',"TABLE spip_documents_liens DROP PRIMARY KEY"), -array('sql_alter',"TABLE spip_documents_liens ADD id_objet bigint(21) DEFAULT '0' NOT NULL AFTER id_document"), -array('sql_alter',"TABLE spip_documents_liens ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"), -array('sql_update','spip_documents_liens',array('id_objet'=>"id_article",'objet'=>"'article'"),"id_article IS NOT NULL AND id_article>0"), -array('sql_update','spip_documents_liens',array('id_objet'=>"id_rubrique",'objet'=>"'rubrique'"),"id_rubrique IS NOT NULL AND id_rubrique>0"), -array('sql_update','spip_documents_liens',array('id_objet'=>"id_breve",'objet'=>"'breve'"),"id_breve IS NOT NULL AND id_breve>0"), -array('sql_update','spip_documents_liens',array('id_objet'=>"id_auteur",'objet'=>"'auteur'"),"id_auteur IS NOT NULL AND id_auteur>0"), -array('sql_update','spip_documents_liens',array('id_objet'=>"id_forum",'objet'=>"'forum'"),"id_forum IS NOT NULL AND id_forum>0"), -array('sql_alter',"TABLE spip_documents_liens ADD PRIMARY KEY (id_document,id_objet,objet)"), -array('sql_alter',"TABLE spip_documents_liens DROP id_article"), -array('sql_alter',"TABLE spip_documents_liens DROP id_rubrique"), -array('sql_alter',"TABLE spip_documents_liens DROP id_breve"), -array('sql_alter',"TABLE spip_documents_liens DROP id_auteur"), -array('sql_alter',"TABLE spip_documents_liens DROP id_forum"), -array('maj_12008'), + array('sql_alter', "TABLE spip_documents_liens DROP PRIMARY KEY"), + array('sql_alter', "TABLE spip_documents_liens ADD id_objet bigint(21) DEFAULT '0' NOT NULL AFTER id_document"), + array('sql_alter', "TABLE spip_documents_liens ADD objet VARCHAR (25) DEFAULT '' NOT NULL AFTER id_objet"), + array( + 'sql_update', + 'spip_documents_liens', + array('id_objet' => "id_article", 'objet' => "'article'"), + "id_article IS NOT NULL AND id_article>0" + ), + array( + 'sql_update', + 'spip_documents_liens', + array('id_objet' => "id_rubrique", 'objet' => "'rubrique'"), + "id_rubrique IS NOT NULL AND id_rubrique>0" + ), + array( + 'sql_update', + 'spip_documents_liens', + array('id_objet' => "id_breve", 'objet' => "'breve'"), + "id_breve IS NOT NULL AND id_breve>0" + ), + array( + 'sql_update', + 'spip_documents_liens', + array('id_objet' => "id_auteur", 'objet' => "'auteur'"), + "id_auteur IS NOT NULL AND id_auteur>0" + ), + array( + 'sql_update', + 'spip_documents_liens', + array('id_objet' => "id_forum", 'objet' => "'forum'"), + "id_forum IS NOT NULL AND id_forum>0" + ), + array('sql_alter', "TABLE spip_documents_liens ADD PRIMARY KEY (id_document,id_objet,objet)"), + array('sql_alter', "TABLE spip_documents_liens DROP id_article"), + array('sql_alter', "TABLE spip_documents_liens DROP id_rubrique"), + array('sql_alter', "TABLE spip_documents_liens DROP id_breve"), + array('sql_alter', "TABLE spip_documents_liens DROP id_auteur"), + array('sql_alter', "TABLE spip_documents_liens DROP id_forum"), + array('maj_12008'), ); // destruction des tables spip_documents_articles etc, cf. 12008 $GLOBALS['maj'][12009] = array( -array('sql_drop_table',"spip_documents_articles"), -array('sql_drop_table',"spip_documents_breves"), -array('sql_drop_table',"spip_documents_rubriques"), -array('sql_drop_table',"spip_documents_auteurs"), # plugin #FORMULAIRE_UPLOAD -array('sql_drop_table',"spip_documents_syndic") # plugin podcast_client + array('sql_drop_table', "spip_documents_articles"), + array('sql_drop_table', "spip_documents_breves"), + array('sql_drop_table', "spip_documents_rubriques"), + array('sql_drop_table', "spip_documents_auteurs"), # plugin #FORMULAIRE_UPLOAD + array('sql_drop_table', "spip_documents_syndic") # plugin podcast_client ); // destruction des champs articles breves rubriques et syndic, cf. 11961 $GLOBALS['maj'][12010] = array( -array('sql_alter',"TABLE spip_groupes_mots DROP articles"), -array('sql_alter',"TABLE spip_groupes_mots DROP breves"), -array('sql_alter',"TABLE spip_groupes_mots DROP rubriques"), -array('sql_alter',"TABLE spip_groupes_mots DROP syndic"), + array('sql_alter', "TABLE spip_groupes_mots DROP articles"), + array('sql_alter', "TABLE spip_groupes_mots DROP breves"), + array('sql_alter', "TABLE spip_groupes_mots DROP rubriques"), + array('sql_alter', "TABLE spip_groupes_mots DROP syndic"), ); /** * Mise à jour 13135 : réparer le calcul des rubriques ayant des articles postdatés */ -function maj_13135 () { +function maj_13135() { include_spip('inc/rubriques'); calculer_prochain_postdate(); @@ -231,20 +278,25 @@ $GLOBALS['maj'][13333] = array(array('upgrade_types_documents')); // http://archives.rezo.net/spip-zone.mbox/200903.mbox/%3Cbfc33ad70903141606q2e4c53f2k4fef6b45e611a04f@mail.gmail.com%3E $GLOBALS['maj'][13833] = array( -array('sql_alter',"TABLE spip_documents_liens ADD INDEX objet(id_objet,objet)")) -; + array('sql_alter', "TABLE spip_documents_liens ADD INDEX objet(id_objet,objet)") +); // Fin upgrade commun branche 2.0 $GLOBALS['maj'][13904] = array( -array('sql_alter',"TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"), -array('sql_update','spip_auteurs',array('webmestre'=>"'oui'"),sql_in("id_auteur",defined('_ID_WEBMESTRES')?explode(':',_ID_WEBMESTRES):(autoriser('configurer')?array($GLOBALS['visiteur_session']['id_auteur']):array(0)))) // le webmestre est celui qui fait l'upgrade si rien de defini -) -; + array('sql_alter', "TABLE spip_auteurs ADD webmestre varchar(3) DEFAULT 'non' NOT NULL"), + array( + 'sql_update', + 'spip_auteurs', + array('webmestre' => "'oui'"), + sql_in("id_auteur", defined('_ID_WEBMESTRES') ? explode(':', + _ID_WEBMESTRES) : (autoriser('configurer') ? array($GLOBALS['visiteur_session']['id_auteur']) : array(0))) + ) // le webmestre est celui qui fait l'upgrade si rien de defini +); // sites plantes en mode "'su" au lieu de "sus" $GLOBALS['maj'][13929] = array( - array('sql_update',"spip_syndic",array('syndication'=>"'sus'"),"syndication LIKE '\\'%'") + array('sql_update', "spip_syndic", array('syndication' => "'sus'"), "syndication LIKE '\\'%'") ); // Types de fichiers m4a/m4b/m4p/m4u/m4v/dv @@ -261,16 +313,22 @@ if (@$GLOBALS['meta']['version_installee'] >= 14588) { // "mode" est un mot-cle d'Oracle $GLOBALS['maj'][14588] = array( - array('sql_alter',"TABLE spip_documents DROP INDEX mode"), - array('sql_alter',"TABLE spip_documents CHANGE mode genre ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"), - array('sql_alter',"TABLE spip_documents ADD INDEX genre(genre)") - ); + array('sql_alter', "TABLE spip_documents DROP INDEX mode"), + array( + 'sql_alter', + "TABLE spip_documents CHANGE mode genre ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL" + ), + array('sql_alter', "TABLE spip_documents ADD INDEX genre(genre)") + ); // solution moins intrusive au pb de mot-cle d'Oracle, retour avant 14588 $GLOBALS['maj'][14598] = array( - array('sql_alter',"TABLE spip_documents DROP INDEX genre"), - array('sql_alter',"TABLE spip_documents CHANGE genre mode ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL"), - array('sql_alter',"TABLE spip_documents ADD INDEX mode(mode)") - ); + array('sql_alter', "TABLE spip_documents DROP INDEX genre"), + array( + 'sql_alter', + "TABLE spip_documents CHANGE genre mode ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL" + ), + array('sql_alter', "TABLE spip_documents ADD INDEX mode(mode)") + ); } // Restauration correcte des types mime des fichiers Ogg @@ -283,13 +341,13 @@ $GLOBALS['maj'][15676] = array(array('upgrade_types_documents')); $GLOBALS['maj'][15827] = array(array('upgrade_types_documents')); $GLOBALS['maj'][16428] = array( - array('maj_liens','auteur'), // creer la table liens - array('maj_liens','auteur','article'), - array('sql_drop_table',"spip_auteurs_articles"), - array('maj_liens','auteur','rubrique'), - array('sql_drop_table',"spip_auteurs_rubriques"), - array('maj_liens','auteur','message'), - array('sql_drop_table',"spip_auteurs_messages"), + array('maj_liens', 'auteur'), // creer la table liens + array('maj_liens', 'auteur', 'article'), + array('sql_drop_table', "spip_auteurs_articles"), + array('maj_liens', 'auteur', 'rubrique'), + array('sql_drop_table', "spip_auteurs_rubriques"), + array('maj_liens', 'auteur', 'message'), + array('sql_drop_table', "spip_auteurs_messages"), ); /** @@ -302,10 +360,10 @@ $GLOBALS['maj'][16428] = array( * spip_documents_articles et spip_documents_forum * * Supprime la table au vieux format une fois les données transférées. - * + * * @uses creer_ou_upgrader_table() * @uses maj_liens_insertq_multi_check() - * + * * @param string $pivot * Nom de la table pivot, tel que `auteur` * @param string $l @@ -315,76 +373,87 @@ $GLOBALS['maj'][16428] = array( */ function maj_liens($pivot, $l = '') { - @define('_LOG_FILTRE_GRAVITE',8); + @define('_LOG_FILTRE_GRAVITE', 8); - $exceptions_pluriel = array('forum'=>'forum','syndic'=>'syndic'); + $exceptions_pluriel = array('forum' => 'forum', 'syndic' => 'syndic'); - $pivot = preg_replace(',[^\w],','',$pivot); // securite - $pivots = (isset($exceptions_pluriel[$pivot])?$exceptions_pluriel[$pivot]:$pivot."s"); - $liens = "spip_".$pivots."_liens"; - $id_pivot = "id_".$pivot; + $pivot = preg_replace(',[^\w],', '', $pivot); // securite + $pivots = (isset($exceptions_pluriel[$pivot]) ? $exceptions_pluriel[$pivot] : $pivot . "s"); + $liens = "spip_" . $pivots . "_liens"; + $id_pivot = "id_" . $pivot; // Creer spip_auteurs_liens global $tables_auxiliaires; if (!$l) { include_spip('base/auxiliaires'); include_spip('base/create'); creer_ou_upgrader_table($liens, $tables_auxiliaires[$liens], false); - } - else { + } else { // Preparer - $l = preg_replace(',[^\w],','',$l); // securite + $l = preg_replace(',[^\w],', '', $l); // securite $primary = "id_$l"; - $objet = ($l=='syndic'?'site':$l); - $ls = (isset($exceptions_pluriel[$l])?$exceptions_pluriel[$l]:$l."s"); - $ancienne_table = 'spip_'.$pivots.'_'.$ls; + $objet = ($l == 'syndic' ? 'site' : $l); + $ls = (isset($exceptions_pluriel[$l]) ? $exceptions_pluriel[$l] : $l . "s"); + $ancienne_table = 'spip_' . $pivots . '_' . $ls; $pool = 400; - $trouver_table = charger_fonction('trouver_table','base'); - if (!$desc = $trouver_table($ancienne_table)) + $trouver_table = charger_fonction('trouver_table', 'base'); + if (!$desc = $trouver_table($ancienne_table)) { return; + } // securite pour ne pas perdre de donnees - if (!$trouver_table($liens)) + if (!$trouver_table($liens)) { return; + } $champs = $desc['field']; - if (isset($champs['maj'])) unset($champs['maj']); - if (isset($champs[$primary])) unset($champs[$primary]); + if (isset($champs['maj'])) { + unset($champs['maj']); + } + if (isset($champs[$primary])) { + unset($champs[$primary]); + } $champs = array_keys($champs); // ne garder que les champs qui existent sur la table destination - if ($desc_cible = $trouver_table($liens)){ - $champs = array_intersect($champs,array_keys($desc_cible['field'])); + if ($desc_cible = $trouver_table($liens)) { + $champs = array_intersect($champs, array_keys($desc_cible['field'])); } $champs[] = "$primary as id_objet"; $champs[] = "'$objet' as objet"; - $champs = implode(', ',$champs); + $champs = implode(', ', $champs); // Recopier les donnees $sub_pool = 100; - while ($ids = array_map('reset',sql_allfetsel("$primary",$ancienne_table,'','','',"0,$sub_pool"))){ + while ($ids = array_map('reset', sql_allfetsel("$primary", $ancienne_table, '', '', '', "0,$sub_pool"))) { $insert = array(); - foreach($ids as $id){ - $n = sql_countsel($liens,"objet='$objet' AND id_objet=".intval($id)); - while ($t = sql_allfetsel($champs, $ancienne_table,"$primary=".intval($id),'',$id_pivot,"$n,$pool")) { - $n+=count($t); + foreach ($ids as $id) { + $n = sql_countsel($liens, "objet='$objet' AND id_objet=" . intval($id)); + while ($t = sql_allfetsel($champs, $ancienne_table, "$primary=" . intval($id), '', $id_pivot, "$n,$pool")) { + $n += count($t); // empiler en s'assurant a minima de l'unicite - while ($r = array_shift($t)) - $insert[$r[$id_pivot].':'.$r['id_objet']] = $r; - if (count($insert)>=$sub_pool){ - maj_liens_insertq_multi_check($liens,$insert,$tables_auxiliaires[$liens]); + while ($r = array_shift($t)) { + $insert[$r[$id_pivot] . ':' . $r['id_objet']] = $r; + } + if (count($insert) >= $sub_pool) { + maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]); $insert = array(); } // si timeout, sortir, la relance nous ramenera dans cette fonction // et on verifiera/repartira de la - if (time() >= _TIME_OUT) return; + if (time() >= _TIME_OUT) { + return; + } } - if (time() >= _TIME_OUT) return; + if (time() >= _TIME_OUT) { + return; + } + } + if (count($insert)) { + maj_liens_insertq_multi_check($liens, $insert, $tables_auxiliaires[$liens]); } - if (count($insert)) - maj_liens_insertq_multi_check($liens,$insert,$tables_auxiliaires[$liens]); - sql_delete ($ancienne_table, sql_in($primary,$ids)); + sql_delete($ancienne_table, sql_in($primary, $ids)); } } } @@ -393,86 +462,97 @@ function maj_liens($pivot, $l = '') { * Insère des données dans une table de liaison de façon un peu sécurisée * * Si une insertion multiple échoue, on réinsère ligne par ligne. - * + * * @param string $table Table de liaison * @param array $couples Tableau de couples de données à insérer * @param array $desc Description de la table de liaison * @return void -**/ -function maj_liens_insertq_multi_check($table, $couples, $desc = array()){ + **/ +function maj_liens_insertq_multi_check($table, $couples, $desc = array()) { $n_before = sql_countsel($table); - sql_insertq_multi($table,$couples,$desc); + sql_insertq_multi($table, $couples, $desc); $n_after = sql_countsel($table); - if (($n_after-$n_before)==count($couples)) + if (($n_after-$n_before) == count($couples)) { return; + } // si ecart, on recommence l'insertion ligne par ligne... // moins rapide mais secure : seul le couple en doublon echouera, et non toute la serie - foreach($couples as $c) - sql_insertq($table,$c,$desc); + foreach ($couples as $c) { + sql_insertq($table, $c, $desc); + } } $GLOBALS['maj'][17311] = array( - array('ecrire_meta',"multi_objets",implode(',', - array_diff( - array( - (isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques']=='oui') - ?'spip_rubriques':'', - (isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles']=='oui') - ?'spip_articles':'' - ), - array('') - ))), - array('ecrire_meta',"gerer_trad_objets",implode(',', - array_diff( - array( - (isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad']=='oui') - ?'spip_articles':'' - ), - array('') - ))), + array( + 'ecrire_meta', + "multi_objets", + implode(',', + array_diff( + array( + (isset($GLOBALS['meta']['multi_rubriques']) and $GLOBALS['meta']['multi_rubriques'] == 'oui') + ? 'spip_rubriques' : '', + (isset($GLOBALS['meta']['multi_articles']) and $GLOBALS['meta']['multi_articles'] == 'oui') + ? 'spip_articles' : '' + ), + array('') + )) + ), + array( + 'ecrire_meta', + "gerer_trad_objets", + implode(',', + array_diff( + array( + (isset($GLOBALS['meta']['gerer_trad']) and $GLOBALS['meta']['gerer_trad'] == 'oui') + ? 'spip_articles' : '' + ), + array('') + )) + ), ); $GLOBALS['maj'][17555] = array( - array('sql_alter',"TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"), - array('sql_alter',"TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_resultats ADD table_objet varchar(30) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_resultats ADD serveur char(16) DEFAULT '' NOT NULL"), ); $GLOBALS['maj'][17563] = array( - array('sql_alter',"TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"), - array('sql_update','spip_articles',array('virtuel'=>'SUBSTRING(chapo,2)','chapo'=>"''"),"chapo LIKE '=_%'"), + array('sql_alter', "TABLE spip_articles ADD virtuel VARCHAR(255) DEFAULT '' NOT NULL"), + array('sql_update', 'spip_articles', array('virtuel' => 'SUBSTRING(chapo,2)', 'chapo' => "''"), "chapo LIKE '=_%'"), ); $GLOBALS['maj'][17577] = array( - array('maj_tables',array('spip_jobs','spip_jobs_liens')), + array('maj_tables', array('spip_jobs', 'spip_jobs_liens')), ); $GLOBALS['maj'][17743] = array( - array('sql_update','spip_auteurs',array('prefs'=>'bio','bio'=>"''"),"statut='nouveau' AND bio<>''"), + array('sql_update', 'spip_auteurs', array('prefs' => 'bio', 'bio' => "''"), "statut='nouveau' AND bio<>''"), ); $GLOBALS['maj'][18219] = array( - array('sql_alter',"TABLE spip_rubriques DROP id_import"), - array('sql_alter',"TABLE spip_rubriques DROP export"), + array('sql_alter', "TABLE spip_rubriques DROP id_import"), + array('sql_alter', "TABLE spip_rubriques DROP export"), ); $GLOBALS['maj'][18310] = array( - array('sql_alter',"TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs_liens CHANGE vu vu VARCHAR(6) DEFAULT 'non' NOT NULL"), ); $GLOBALS['maj'][18597] = array( - array('sql_alter',"TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"), + array('sql_alter', "TABLE spip_rubriques ADD profondeur smallint(5) DEFAULT '0' NOT NULL"), array('maj_propager_les_secteurs'), ); $GLOBALS['maj'][18955] = array( - array('sql_alter',"TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)"), - array('sql_alter',"TABLE spip_auteurs_liens ADD INDEX objet (objet)"), + array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX id_objet (id_objet)"), + array('sql_alter', "TABLE spip_auteurs_liens ADD INDEX objet (objet)"), ); /** * Mise à jour pour recalculer les secteurs des rubriques + * * @uses propager_les_secteurs() -**/ -function maj_propager_les_secteurs(){ + **/ +function maj_propager_les_secteurs() { include_spip('inc/rubriques'); propager_les_secteurs(); } @@ -480,65 +560,70 @@ function maj_propager_les_secteurs(){ /** * Mise à jour des bdd SQLite pour réparer les collation des champs texte * pour les passer en NOCASE - * + * * @uses base_lister_toutes_tables() * @uses _sqlite_remplacements_definitions_table() -**/ -function maj_collation_sqlite(){ + **/ +function maj_collation_sqlite() { include_spip('base/dump'); $tables = base_lister_toutes_tables(); // rien a faire si base non sqlite - if (strncmp($GLOBALS['connexions'][0]['type'],'sqlite',6)!==0) + if (strncmp($GLOBALS['connexions'][0]['type'], 'sqlite', 6) !== 0) { return; + } - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); // forcer le vidage de cache $trouver_table(''); // cas particulier spip_auteurs : retablir le collate binary sur le login $desc = $trouver_table("spip_auteurs"); - spip_log("spip_auteurs : ".var_export($desc['field'],true),"maj."._LOG_INFO_IMPORTANTE); - if (stripos($desc['field']['login'],"BINARY")===false){ - spip_log("Retablir champ login BINARY sur table spip_auteurs","maj"); + spip_log("spip_auteurs : " . var_export($desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE); + if (stripos($desc['field']['login'], "BINARY") === false) { + spip_log("Retablir champ login BINARY sur table spip_auteurs", "maj"); sql_alter("table spip_auteurs change login login VARCHAR(255) BINARY"); $trouver_table(''); $new_desc = $trouver_table("spip_auteurs"); - spip_log("Apres conversion spip_auteurs : ".var_export($new_desc['field'],true),"maj."._LOG_INFO_IMPORTANTE); + spip_log("Apres conversion spip_auteurs : " . var_export($new_desc['field'], true), "maj." . _LOG_INFO_IMPORTANTE); } - foreach ($tables as $table){ - if (time() >= _TIME_OUT) return; - if ($desc = $trouver_table($table)){ + foreach ($tables as $table) { + if (time() >= _TIME_OUT) { + return; + } + if ($desc = $trouver_table($table)) { $desc_collate = _sqlite_remplacements_definitions_table($desc['field']); - if ($d=array_diff($desc['field'],$desc_collate)){ - spip_log("Table $table COLLATE incorrects","maj"); + if ($d = array_diff($desc['field'], $desc_collate)) { + spip_log("Table $table COLLATE incorrects", "maj"); // cas particulier spip_urls : // supprimer les doublons avant conversion sinon echec (on garde les urls les plus recentes) - if ($table=='spip_urls'){ + if ($table == 'spip_urls') { // par date DESC pour conserver les urls les plus recentes - $data = sql_allfetsel("*","spip_urls",'','','date DESC'); + $data = sql_allfetsel("*", "spip_urls", '', '', 'date DESC'); $urls = array(); - foreach ($data as $d){ - $key = $d['id_parent']."::".strtolower($d['url']); - if (!isset($urls[$key])) + foreach ($data as $d) { + $key = $d['id_parent'] . "::" . strtolower($d['url']); + if (!isset($urls[$key])) { $urls[$key] = true; - else { - spip_log("Suppression doublon dans spip_urls avant conversion : ".serialize($d),"maj."._LOG_INFO_IMPORTANTE); - sql_delete("spip_urls","id_parent=".sql_quote($d['id_parent'])." AND url=".sql_quote($d['url'])); + } else { + spip_log("Suppression doublon dans spip_urls avant conversion : " . serialize($d), + "maj." . _LOG_INFO_IMPORTANTE); + sql_delete("spip_urls", "id_parent=" . sql_quote($d['id_parent']) . " AND url=" . sql_quote($d['url'])); } } } - foreach ($desc['field'] as $field=>$type){ - if ($desc['field'][$field]!==$desc_collate[$field]){ - spip_log("Conversion COLLATE table $table","maj."._LOG_INFO_IMPORTANTE); - sql_alter("table $table change $field $field ".$desc_collate[$field]); + foreach ($desc['field'] as $field => $type) { + if ($desc['field'][$field] !== $desc_collate[$field]) { + spip_log("Conversion COLLATE table $table", "maj." . _LOG_INFO_IMPORTANTE); + sql_alter("table $table change $field $field " . $desc_collate[$field]); $trouver_table(''); $new_desc = $trouver_table($table); - spip_log("Apres conversion $table : ".var_export($new_desc['field'],true),"maj."._LOG_INFO_IMPORTANTE); + spip_log("Apres conversion $table : " . var_export($new_desc['field'], true), + "maj." . _LOG_INFO_IMPORTANTE); continue 2; // inutile de continuer pour cette table : un seul alter remet tout a jour en sqlite } } @@ -553,8 +638,8 @@ function maj_collation_sqlite(){ $GLOBALS['maj'][19236] = array( - array('sql_updateq','spip_meta',array('impt'=>'oui'),"nom='version_installee'"), // version base principale - array('sql_updateq','spip_meta',array('impt'=>'oui'),"nom LIKE '%_base_version'"), // version base plugins + array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom='version_installee'"), // version base principale + array('sql_updateq', 'spip_meta', array('impt' => 'oui'), "nom LIKE '%_base_version'"), // version base plugins array('maj_collation_sqlite'), ); @@ -566,13 +651,15 @@ $GLOBALS['maj'][19268] = array( * Supprime toutes les sessions des auteurs * * Obligera tous les auteurs à se reconnecter ! -**/ + **/ function supprimer_toutes_sessions() { spip_log("supprimer sessions auteur"); $dir = opendir(_DIR_SESSIONS); - while(($f = readdir($dir)) !== false) { + while (($f = readdir($dir)) !== false) { spip_unlink(_DIR_SESSIONS . $f); - if (time() >= _TIME_OUT) return; + if (time() >= _TIME_OUT) { + return; + } } } @@ -584,24 +671,27 @@ $GLOBALS['maj'][21676] = array( array('ranger_cache_gd2'), ); -function ranger_cache_gd2(){ +function ranger_cache_gd2() { spip_log("ranger_cache_gd2"); - $base = _DIR_VAR."cache-gd2/"; + $base = _DIR_VAR . "cache-gd2/"; $dir = opendir($base); - while(($f = readdir($dir)) !== false) { - if (!is_dir($base.$f) AND strncmp($f,".",1)!==0 - AND preg_match(",[0-9a-f]{32}\.\w+,",$f)){ - $sub = substr($f,0,2); - $sub = sous_repertoire($base,$sub); - @rename($base.$f,$sub.substr($f,2)); - @unlink($base.$f); // au cas ou le rename a foire (collision) + while (($f = readdir($dir)) !== false) { + if (!is_dir($base . $f) AND strncmp($f, ".", 1) !== 0 + AND preg_match(",[0-9a-f]{32}\.\w+,", $f) + ) { + $sub = substr($f, 0, 2); + $sub = sous_repertoire($base, $sub); + @rename($base . $f, $sub . substr($f, 2)); + @unlink($base . $f); // au cas ou le rename a foire (collision) + } + if (time() >= _TIME_OUT) { + return; } - if (time() >= _TIME_OUT) return; } } $GLOBALS['maj'][21742] = array( - array('sql_alter',"TABLE spip_articles CHANGE url_site url_site text DEFAULT '' NOT NULL"), - array('sql_alter',"TABLE spip_articles CHANGE virtuel virtuel text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE url_site url_site text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE virtuel virtuel text DEFAULT '' NOT NULL"), ); diff --git a/ecrire/maj/v009.php b/ecrire/maj/v009.php index 29b8ab83b2..4c871b260f 100644 --- a/ecrire/maj/v009.php +++ b/ecrire/maj/v009.php @@ -12,19 +12,20 @@ /** * Gestion des mises à jour de SPIP, versions 0.9* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°009 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v009_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v009_dist($version_installee, $version_cible) { if (upgrade_vers(0.98, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD maj TIMESTAMP"); @@ -40,34 +41,38 @@ function maj_v009_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_auteurs ADD pgp BLOB NOT NULL"); spip_query("ALTER TABLE spip_auteurs_articles ADD INDEX id_auteur (id_auteur), ADD INDEX id_article (id_article)"); - + spip_query("ALTER TABLE spip_rubriques ADD maj TIMESTAMP"); spip_query("ALTER TABLE spip_rubriques ADD export VARCHAR(10) DEFAULT 'oui', ADD id_import BIGINT DEFAULT '0'"); - + spip_query("ALTER TABLE spip_breves ADD maj TIMESTAMP"); spip_query("ALTER TABLE spip_breves DROP INDEX id_breve"); spip_query("ALTER TABLE spip_breves DROP INDEX id_breve_2"); spip_query("ALTER TABLE spip_breves ADD INDEX id_rubrique (id_rubrique)"); - + spip_query("ALTER TABLE spip_forum ADD ip VARCHAR(16)"); spip_query("ALTER TABLE spip_forum ADD maj TIMESTAMP"); spip_query("ALTER TABLE spip_forum DROP INDEX id_forum"); spip_query("ALTER TABLE spip_forum ADD INDEX id_parent (id_parent), ADD INDEX id_rubrique (id_rubrique), ADD INDEX id_article(id_article), ADD INDEX id_breve(id_breve)"); - maj_version (0.98); + maj_version(0.98); } if (upgrade_vers(0.99, $version_installee, $version_cible)) { - + $result = spip_query("SELECT DISTINCT id_article FROM spip_forum WHERE id_article!=0 AND id_parent=0"); while ($row = sql_fetch($result)) { unset($forums_article); $id_article = $row['id_article']; $result2 = spip_query("SELECT id_forum FROM spip_forum WHERE id_article=$id_article"); - for (;;) { + for (; ;) { unset($forums); - while ($row2 = sql_fetch($result2)) $forums[] = $row2['id_forum']; - if (!$forums) break; + while ($row2 = sql_fetch($result2)) { + $forums[] = $row2['id_forum']; + } + if (!$forums) { + break; + } $forums = join(',', $forums); $forums_article[] = $forums; $result2 = spip_query("SELECT id_forum FROM spip_forum WHERE id_parent IN ($forums)"); @@ -75,17 +80,21 @@ function maj_v009_dist($version_installee, $version_cible) $forums_article = join(',', $forums_article); spip_query("UPDATE spip_forum SET id_article=$id_article WHERE id_forum IN ($forums_article)"); } - + $result = spip_query("SELECT DISTINCT id_breve FROM spip_forum WHERE id_breve!=0 AND id_parent=0"); while ($row = sql_fetch($result)) { unset($forums_breve); $id_breve = $row['id_breve']; $result2 = spip_query("SELECT id_forum FROM spip_forum WHERE id_breve=$id_breve"); - for (;;) { + for (; ;) { unset($forums); - while ($row2 = sql_fetch($result2)) $forums[] = $row2['id_forum']; - if (!$forums) break; + while ($row2 = sql_fetch($result2)) { + $forums[] = $row2['id_forum']; + } + if (!$forums) { + break; + } $forums = join(',', $forums); $forums_breve[] = $forums; $result2 = spip_query("SELECT id_forum FROM spip_forum WHERE id_parent IN ($forums)"); @@ -93,18 +102,22 @@ function maj_v009_dist($version_installee, $version_cible) $forums_breve = join(',', $forums_breve); spip_query("UPDATE spip_forum SET id_breve=$id_breve WHERE id_forum IN ($forums_breve)"); } - + $result = spip_query("SELECT DISTINCT id_rubrique FROM spip_forum WHERE id_rubrique!=0 AND id_parent=0"); while ($row = sql_fetch($result)) { unset($forums_rubrique); $id_rubrique = $row['id_rubrique']; $result2 = spip_query("SELECT id_forum FROM spip_forum WHERE id_rubrique=$id_rubrique"); - for (;;) { + for (; ;) { unset($forums); - while ($row2 = sql_fetch($result2)) $forums[] = $row2['id_forum']; - if (!$forums) break; + while ($row2 = sql_fetch($result2)) { + $forums[] = $row2['id_forum']; + } + if (!$forums) { + break; + } $forums = join(',', $forums); $forums_rubrique[] = $forums; $result2 = spip_query("SELECT id_forum FROM spip_forum WHERE id_parent IN ($forums)"); @@ -113,12 +126,12 @@ function maj_v009_dist($version_installee, $version_cible) spip_query("UPDATE spip_forum SET id_rubrique=$id_rubrique WHERE id_forum IN ($forums_rubrique)"); } - maj_version (0.99); + maj_version(0.99); } if (upgrade_vers(0.997, $version_installee, $version_cible)) { spip_query("DROP TABLE spip_index"); - maj_version (0.997); + maj_version(0.997); } if (upgrade_vers(0.999, $version_installee, $version_cible)) { @@ -127,12 +140,12 @@ function maj_v009_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_auteurs ADD htpass tinyblob NOT NULL"); $result = spip_query("SELECT id_auteur, pass FROM spip_auteurs WHERE pass!=''"); - while ($r= sql_fetch($result)) { + while ($r = sql_fetch($result)) { $htpass = generer_htpass($r['pass']); $pass = md5($pass); spip_query("UPDATE spip_auteurs SET pass='$pass', htpass='$htpass' WHERE id_auteur=" . $r['id_auteur']); } - maj_version (0.999); + maj_version(0.999); } } diff --git a/ecrire/maj/v010.php b/ecrire/maj/v010.php index 08226f98e9..2c35eb2e6d 100644 --- a/ecrire/maj/v010.php +++ b/ecrire/maj/v010.php @@ -12,45 +12,46 @@ /** * Gestion des mises à jour de SPIP, versions 1.0* - * + * * @package SPIP\Core\SQL\Upgrade -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°010 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v010_dist($version_installee, $version_cible) -{ - + * @param float $version_cible Version de destination + **/ +function maj_v010_dist($version_installee, $version_cible) { + if (upgrade_vers(1.01, $version_installee, $version_cible)) { spip_query("UPDATE spip_forum SET statut='publie' WHERE statut=''"); - maj_version (1.01); + maj_version(1.01); } - + if (upgrade_vers(1.02, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_forum ADD id_auteur BIGINT DEFAULT '0' NOT NULL"); - maj_version (1.02); + maj_version(1.02); } if (upgrade_vers(1.03, $version_installee, $version_cible)) { spip_query("DROP TABLE spip_maj"); - maj_version (1.03); + maj_version(1.03); } if (upgrade_vers(1.04, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD accepter_forum VARCHAR(3)"); - maj_version (1.04); + maj_version(1.04); } if (upgrade_vers(1.05, $version_installee, $version_cible)) { spip_query("DROP TABLE spip_petition"); spip_query("DROP TABLE spip_signatures_petition"); - maj_version (1.05); + maj_version(1.05); } } diff --git a/ecrire/maj/v011.php b/ecrire/maj/v011.php index 98cb2845f0..8b3f9ae503 100644 --- a/ecrire/maj/v011.php +++ b/ecrire/maj/v011.php @@ -12,24 +12,25 @@ /** * Gestion des mises à jour de SPIP, versions 1.1* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°011 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v011_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v011_dist($version_installee, $version_cible) { if (upgrade_vers(1.1, $version_installee, $version_cible)) { spip_query("DROP TABLE spip_petition"); spip_query("DROP TABLE spip_signatures_petition"); - maj_version (1.1); + maj_version(1.1); } } diff --git a/ecrire/maj/v012.php b/ecrire/maj/v012.php index 95275b9819..ca1b1199b3 100644 --- a/ecrire/maj/v012.php +++ b/ecrire/maj/v012.php @@ -12,19 +12,20 @@ /** * Gestion des mises à jour de SPIP, versions 1.2* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°012 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v012_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v012_dist($version_installee, $version_cible) { // Correction de l'oubli des modifs creations depuis 1.04 if (upgrade_vers(1.204, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD accepter_forum VARCHAR(3) NOT NULL"); @@ -33,7 +34,7 @@ function maj_v012_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_auteurs ADD en_ligne datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); spip_query("ALTER TABLE spip_auteurs ADD imessage VARCHAR(3) not null"); spip_query("ALTER TABLE spip_auteurs ADD messagerie VARCHAR(3) not null"); - maj_version (1.204); + maj_version(1.204); } if (upgrade_vers(1.207, $version_installee, $version_cible)) { @@ -43,7 +44,7 @@ function maj_v012_dist($version_installee, $version_cible) // Declencher le calcul des rubriques publiques include_spip('inc/rubriques'); calculer_rubriques(); - maj_version (1.207); + maj_version(1.207); } if (upgrade_vers(1.208, $version_installee, $version_cible)) { @@ -61,14 +62,14 @@ function maj_v012_dist($version_installee, $version_cible) } spip_query("ALTER TABLE spip_auteurs_messages DROP statut"); - maj_version (1.208); + maj_version(1.208); } if (upgrade_vers(1.209, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic ADD maj TIMESTAMP"); spip_query("ALTER TABLE spip_syndic_articles ADD maj TIMESTAMP"); spip_query("ALTER TABLE spip_messages ADD maj TIMESTAMP"); - maj_version (1.209); + maj_version(1.209); } if (upgrade_vers(1.210, $version_installee, $version_cible)) { @@ -85,7 +86,7 @@ function maj_v012_dist($version_installee, $version_cible) stripslashes_base('spip_signatures', array('nom_email', 'nom_site', 'message')); stripslashes_base('spip_syndic', array('nom_site', 'descriptif')); stripslashes_base('spip_syndic_articles', array('titre', 'lesauteurs')); - maj_version (1.210); + maj_version(1.210); } } diff --git a/ecrire/maj/v013.php b/ecrire/maj/v013.php index 4b6c581c5b..08bfd1dc8c 100644 --- a/ecrire/maj/v013.php +++ b/ecrire/maj/v013.php @@ -12,19 +12,20 @@ /** * Gestion des mises à jour de SPIP, versions 1.3* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°013 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v013_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v013_dist($version_installee, $version_cible) { if (upgrade_vers(1.3, $version_installee, $version_cible)) { // Modifier la syndication (pour liste de sites) spip_query("ALTER TABLE spip_syndic ADD syndication VARCHAR(3) NOT NULL"); @@ -35,12 +36,12 @@ function maj_v013_dist($version_installee, $version_cible) // Statut pour articles syndication, pour pouvoir desactiver un article spip_query("ALTER TABLE spip_syndic_articles ADD statut VARCHAR(10) NOT NULL"); spip_query("UPDATE spip_syndic_articles SET statut='publie'"); - maj_version (1.3); + maj_version(1.3); } if (upgrade_vers(1.301, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_forum ADD id_syndic bigint(21) DEFAULT '0' NOT NULL"); - maj_version (1.301); + maj_version(1.301); } if (upgrade_vers(1.302, $version_installee, $version_cible)) { @@ -48,26 +49,26 @@ function maj_v013_dist($version_installee, $version_cible) # spip_query("ALTER TABLE spip_forum_cache DROP INDEX fichier"); # spip_query("ALTER TABLE spip_forum_cache ADD PRIMARY KEY (fichier, id_forum, id_article, id_rubrique, id_breve, id_syndic)"); spip_query("ALTER TABLE spip_forum ADD INDEX id_syndic (id_syndic)"); - maj_version (1.302); + maj_version(1.302); } if (upgrade_vers(1.303, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_rubriques ADD date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); spip_query("ALTER TABLE spip_syndic ADD date_syndic datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); spip_query("UPDATE spip_syndic SET date_syndic=date"); - maj_version (1.303); + maj_version(1.303); } if (upgrade_vers(1.306, $version_installee, $version_cible)) { spip_query("DROP TABLE spip_index_syndic_articles"); spip_query("ALTER TABLE spip_syndic ADD date_index datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); spip_query("ALTER TABLE spip_syndic ADD INDEX date_index (date_index)"); - maj_version (1.306); + maj_version(1.306); } if (upgrade_vers(1.307, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic_articles ADD descriptif blob NOT NULL"); - maj_version (1.307); + maj_version(1.307); } } diff --git a/ecrire/maj/v014.php b/ecrire/maj/v014.php index 81f3f1ffd1..2ab8649450 100644 --- a/ecrire/maj/v014.php +++ b/ecrire/maj/v014.php @@ -12,45 +12,46 @@ /** * Gestion des mises à jour de SPIP, versions 1.4* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°014 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v014_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v014_dist($version_installee, $version_cible) { if (upgrade_vers(1.404, $version_installee, $version_cible)) { spip_query("UPDATE spip_mots SET type='Mots sans groupe...' WHERE type=''"); $result = spip_query("SELECT * FROM spip_mots GROUP BY type"); - while($row = sql_fetch($result)) { - $type = addslashes($row['type']); - // Old style, doit echouer - spip_log('ne pas tenir compte de l erreur spip_groupes_mots ci-dessous:', 'mysql'); - spip_query("INSERT INTO spip_groupes_mots (titre, unseul, obligatoire, articles, breves, rubriques, syndic, 0minirezo, 1comite, 6forum) VALUES (\"$type\", 'non', 'non', 'oui', 'oui', 'non', 'oui', 'oui', 'oui', 'non')"); - // New style, devrait marcher - spip_query("INSERT INTO spip_groupes_mots (titre, unseul, obligatoire, articles, breves, rubriques, syndic, minirezo, comite, forum) VALUES (\"$type\", 'non', 'non', 'oui', 'oui', 'non', 'oui', 'oui', 'oui', 'non')"); + while ($row = sql_fetch($result)) { + $type = addslashes($row['type']); + // Old style, doit echouer + spip_log('ne pas tenir compte de l erreur spip_groupes_mots ci-dessous:', 'mysql'); + spip_query("INSERT INTO spip_groupes_mots (titre, unseul, obligatoire, articles, breves, rubriques, syndic, 0minirezo, 1comite, 6forum) VALUES (\"$type\", 'non', 'non', 'oui', 'oui', 'non', 'oui', 'oui', 'oui', 'non')"); + // New style, devrait marcher + spip_query("INSERT INTO spip_groupes_mots (titre, unseul, obligatoire, articles, breves, rubriques, syndic, minirezo, comite, forum) VALUES (\"$type\", 'non', 'non', 'oui', 'oui', 'non', 'oui', 'oui', 'oui', 'non')"); } sql_delete("spip_mots", "titre='kawax'"); - maj_version (1.404); + maj_version(1.404); } if (upgrade_vers(1.405, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_mots ADD id_groupe bigint(21) NOT NULL"); - + $result = spip_query("SELECT * FROM spip_groupes_mots"); - while($row = sql_fetch($result)) { - $id_groupe = addslashes($row['id_groupe']); - $type = addslashes($row['titre']); - spip_query("UPDATE spip_mots SET id_groupe = '$id_groupe' WHERE type='$type'"); + while ($row = sql_fetch($result)) { + $id_groupe = addslashes($row['id_groupe']); + $type = addslashes($row['titre']); + spip_query("UPDATE spip_mots SET id_groupe = '$id_groupe' WHERE type='$type'"); } - maj_version (1.405); + maj_version(1.405); } if (upgrade_vers(1.408, $version_installee, $version_cible)) { @@ -96,18 +97,18 @@ function maj_v014_dist($version_installee, $version_cible) } spip_query("ALTER TABLE spip_articles DROP images"); - maj_version (1.408); + maj_version(1.408); } if (upgrade_vers(1.414, $version_installee, $version_cible)) { // Forum par defaut "en dur" dans les spip_articles // -> non, prio (priori), pos (posteriori), abo (abonnement) - $accepter_forum = substr($GLOBALS['meta']["forums_publics"],0,3) ; + $accepter_forum = substr($GLOBALS['meta']["forums_publics"], 0, 3); $result = spip_query("ALTER TABLE spip_articles CHANGE accepter_forum accepter_forum CHAR(3) NOT NULL"); $result = spip_query("UPDATE spip_articles SET accepter_forum='$accepter_forum' WHERE accepter_forum != 'non'"); - maj_version (1.414); + maj_version(1.414); } /* @@ -119,7 +120,7 @@ function maj_v014_dist($version_installee, $version_cible) if (upgrade_vers(1.417, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic_articles DROP date_index"); - maj_version (1.417); + maj_version(1.417); } if (upgrade_vers(1.418, $version_installee, $version_cible)) { @@ -128,49 +129,49 @@ function maj_v014_dist($version_installee, $version_cible) if ($webmaster = sql_fetch($result)) { ecrire_meta('email_webmaster', $webmaster['email']); } - maj_version (1.418); + maj_version(1.418); } if (upgrade_vers(1.419, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD alea_actuel TINYTEXT DEFAULT ''"); spip_query("ALTER TABLE spip_auteurs ADD alea_futur TINYTEXT DEFAULT ''"); spip_query("UPDATE spip_auteurs SET alea_futur = FLOOR(32000*RAND())"); - maj_version (1.419); + maj_version(1.419); } if (upgrade_vers(1.420, $version_installee, $version_cible)) { spip_query("UPDATE spip_auteurs SET alea_actuel='' WHERE statut='nouveau'"); - maj_version (1.420); + maj_version(1.420); } - + if (upgrade_vers(1.421, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD auteur_modif bigint(21) DEFAULT '0' NOT NULL"); spip_query("ALTER TABLE spip_articles ADD date_modif datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); - maj_version (1.421); + maj_version(1.421); } if (upgrade_vers(1.432, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles DROP referers"); spip_query("ALTER TABLE spip_articles ADD referers INTEGER DEFAULT '0' NOT NULL"); spip_query("ALTER TABLE spip_articles ADD popularite INTEGER DEFAULT '0' NOT NULL"); - maj_version (1.432); + maj_version(1.432); } if (upgrade_vers(1.436, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_documents ADD date datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); - maj_version (1.436); + maj_version(1.436); } if (upgrade_vers(1.437, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_visites ADD maj TIMESTAMP"); spip_query("ALTER TABLE spip_visites_referers ADD maj TIMESTAMP"); - maj_version (1.437); + maj_version(1.437); } if (upgrade_vers(1.438, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD INDEX id_secteur (id_secteur)"); spip_query("ALTER TABLE spip_articles ADD INDEX statut (statut, date)"); - maj_version (1.438); + maj_version(1.438); } if (upgrade_vers(1.439, $version_installee, $version_cible)) { @@ -178,24 +179,24 @@ function maj_v014_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_syndic_articles ADD INDEX statut (statut)"); spip_query("ALTER TABLE spip_syndic_articles CHANGE url url VARCHAR(255) NOT NULL"); spip_query("ALTER TABLE spip_syndic_articles ADD INDEX url (url)"); - maj_version (1.439); + maj_version(1.439); } if (upgrade_vers(1.440, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_visites_temp CHANGE ip ip INTEGER UNSIGNED NOT NULL"); - maj_version (1.440); + maj_version(1.440); } if (upgrade_vers(1.441, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_visites_temp CHANGE date date DATE NOT NULL"); spip_query("ALTER TABLE spip_visites CHANGE date date DATE NOT NULL"); spip_query("ALTER TABLE spip_visites_referers CHANGE date date DATE NOT NULL"); - maj_version (1.441); + maj_version(1.441); } if (upgrade_vers(1.442, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD prefs TINYTEXT NOT NULL"); - maj_version (1.442); + maj_version(1.442); } if (upgrade_vers(1.443, $version_installee, $version_cible)) { @@ -203,12 +204,12 @@ function maj_v014_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_auteurs CHANGE statut statut VARCHAR(255) NOT NULL"); spip_query("ALTER TABLE spip_auteurs ADD INDEX login (login)"); spip_query("ALTER TABLE spip_auteurs ADD INDEX statut (statut)"); - maj_version (1.443); + maj_version(1.443); } if (upgrade_vers(1.444, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic ADD moderation VARCHAR(3) NOT NULL"); - maj_version (1.444); + maj_version(1.444); } if (upgrade_vers(1.457, $version_installee, $version_cible)) { @@ -216,12 +217,12 @@ function maj_v014_dist($version_installee, $version_cible) spip_query("DROP TABLE spip_visites_temp"); spip_query("DROP TABLE spip_visites_referers"); creer_base(); // crade, a ameliorer :-(( - maj_version (1.457); + maj_version(1.457); } if (upgrade_vers(1.458, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD cookie_oubli TINYTEXT NOT NULL"); - maj_version (1.458); + maj_version(1.458); } if (upgrade_vers(1.459, $version_installee, $version_cible)) { @@ -237,7 +238,7 @@ function maj_v014_dist($version_installee, $version_cible) } } spip_query("UPDATE spip_articles SET popularite=0"); - maj_version (1.459); + maj_version(1.459); } if (upgrade_vers(1.460, $version_installee, $version_cible)) { @@ -247,26 +248,26 @@ function maj_v014_dist($version_installee, $version_cible) $result = spip_query("SELECT * FROM spip_groupes_mots ORDER BY id_groupe"); while ($row = sql_fetch($result)) { $titre = addslashes($row['titre']); - if (! $vu[$titre] ) { + if (!$vu[$titre]) { $vu[$titre] = true; $id_groupe = $row['id_groupe']; spip_query("UPDATE spip_mots SET id_groupe=$id_groupe WHERE type='$titre'"); sql_delete("spip_groupes_mots", "titre='$titre' AND id_groupe<>$id_groupe"); } } - maj_version (1.460); + maj_version(1.460); } if (upgrade_vers(1.462, $version_installee, $version_cible)) { spip_query("UPDATE spip_types_documents SET inclus='embed' WHERE inclus!='non' AND extension IN ('aiff', 'asf', 'avi', 'mid', 'mov', 'mp3', 'mpg', 'ogg', 'qt', 'ra', 'ram', 'rm', 'swf', 'wav', 'wmv')"); - maj_version (1.462); + maj_version(1.462); } if (upgrade_vers(1.463, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles CHANGE popularite popularite DOUBLE"); spip_query("ALTER TABLE spip_visites_temp ADD maj TIMESTAMP"); spip_query("ALTER TABLE spip_referers_temp ADD maj TIMESTAMP"); - maj_version (1.463); + maj_version(1.463); } // l'upgrade < 1.462 ci-dessus etait fausse, d'ou correctif @@ -277,36 +278,36 @@ function maj_v014_dist($version_installee, $version_cible) $id_type = $row['id_type']; spip_query("UPDATE spip_documents SET id_type=$id_type WHERE fichier like '%.$extension'"); } - maj_version (1.464); + maj_version(1.464); } if (upgrade_vers(1.465, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles CHANGE popularite popularite DOUBLE NOT NULL"); - maj_version (1.465); + maj_version(1.465); } if (upgrade_vers(1.466, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD source VARCHAR(10) DEFAULT 'spip' NOT NULL"); - maj_version (1.466); + maj_version(1.466); } if (upgrade_vers(1.468, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD INDEX en_ligne (en_ligne)"); spip_query("ALTER TABLE spip_forum ADD INDEX statut (statut, date_heure)"); - maj_version (1.468); + maj_version(1.468); } if (upgrade_vers(1.470, $version_installee, $version_cible)) { - if ($version_installee >= 1.467) { // annule les "listes de diff" + if ($version_installee >= 1.467) { // annule les "listes de diff" spip_query("DROP TABLE spip_listes"); spip_query("ALTER TABLE spip_auteurs DROP abonne"); spip_query("ALTER TABLE spip_auteurs DROP abonne_pass"); } - maj_version (1.470); + maj_version(1.470); } if (upgrade_vers(1.471, $version_installee, $version_cible)) { - if ($version_installee >= 1.470) { // annule les "maj" + if ($version_installee >= 1.470) { // annule les "maj" spip_query("ALTER TABLE spip_auteurs_articles DROP maj TIMESTAMP"); spip_query("ALTER TABLE spip_auteurs_rubriques DROP maj TIMESTAMP"); spip_query("ALTER TABLE spip_auteurs_messages DROP maj TIMESTAMP"); @@ -319,18 +320,18 @@ function maj_v014_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_mots_syndic DROP maj TIMESTAMP"); spip_query("ALTER TABLE spip_mots_forum DROP maj TIMESTAMP"); } - maj_version (1.471); + maj_version(1.471); } if (upgrade_vers(1.472, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_referers ADD visites_jour INTEGER UNSIGNED NOT NULL"); - maj_version (1.472); + maj_version(1.472); } if (upgrade_vers(1.473, $version_installee, $version_cible)) { spip_query("UPDATE spip_syndic_articles SET url = REPLACE(url, '&', '&')"); spip_query("UPDATE spip_syndic SET url_site = REPLACE(url_site, '&', '&')"); - maj_version (1.473); + maj_version(1.473); } } diff --git a/ecrire/maj/v015.php b/ecrire/maj/v015.php index 1b8259b217..7e69c52d6f 100644 --- a/ecrire/maj/v015.php +++ b/ecrire/maj/v015.php @@ -12,19 +12,20 @@ /** * Gestion des mises à jour de SPIP, versions 1.5* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°015 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v015_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v015_dist($version_installee, $version_cible) { } ?> diff --git a/ecrire/maj/v016.php b/ecrire/maj/v016.php index d2505b388b..36c28dc015 100644 --- a/ecrire/maj/v016.php +++ b/ecrire/maj/v016.php @@ -12,31 +12,32 @@ /** * Gestion des mises à jour de SPIP, versions 1.6* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°016 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v016_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v016_dist($version_installee, $version_cible) { if (upgrade_vers(1.600, $version_installee, $version_cible)) { #8/08/07 plus d'indexation dans le core # include_spip('inc/indexation'); # purger_index(); # creer_liste_indexation(); - maj_version (1.600); + maj_version(1.600); } if (upgrade_vers(1.601, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_forum ADD INDEX id_syndic (id_syndic)"); - maj_version (1.601); + maj_version(1.601); } if (upgrade_vers(1.603, $version_installee, $version_cible)) { @@ -44,7 +45,7 @@ function maj_v016_dist($version_installee, $version_cible) spip_unlink('inc_meta_cache.php'); spip_unlink('inc_meta_cache.php3'); spip_unlink('data/engines-list.ini'); - maj_version (1.603); + maj_version(1.603); } if (upgrade_vers(1.604, $version_installee, $version_cible)) { @@ -54,10 +55,10 @@ function maj_v016_dist($version_installee, $version_cible) $prefs = unserialize($row['prefs']); $l = $prefs['spip_lang']; unset ($prefs['spip_lang']); - spip_query("UPDATE spip_auteurs SET lang=" . _q($l) . ", prefs='".addslashes(serialize($prefs))."' WHERE id_auteur=".$row['id_auteur']); + spip_query("UPDATE spip_auteurs SET lang=" . _q($l) . ", prefs='" . addslashes(serialize($prefs)) . "' WHERE id_auteur=" . $row['id_auteur']); } $u = spip_query("SELECT lang FROM spip_auteurs"); - maj_version (1.604, $u); + maj_version(1.604, $u); } } diff --git a/ecrire/maj/v017.php b/ecrire/maj/v017.php index 731fddf6e1..db45861fdb 100644 --- a/ecrire/maj/v017.php +++ b/ecrire/maj/v017.php @@ -12,19 +12,20 @@ /** * Gestion des mises à jour de SPIP, versions 1.7* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°017 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v017_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v017_dist($version_installee, $version_cible) { if (upgrade_vers(1.702, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD extra longblob NULL"); spip_query("ALTER TABLE spip_auteurs ADD extra longblob NULL"); @@ -45,32 +46,32 @@ function maj_v017_dist($version_installee, $version_cible) spip_query("UPDATE spip_mots SET extra = supplement"); spip_query("ALTER TABLE spip_mots DROP supplement"); } - + $u = spip_query("SELECT extra FROM spip_articles"); - $u&= spip_query("SELECT extra FROM spip_auteurs"); - $u&= spip_query("SELECT extra FROM spip_breves"); - $u&= spip_query("SELECT extra FROM spip_rubriques"); - $u&= spip_query("SELECT extra FROM spip_mots"); - maj_version (1.702,$u); + $u &= spip_query("SELECT extra FROM spip_auteurs"); + $u &= spip_query("SELECT extra FROM spip_breves"); + $u &= spip_query("SELECT extra FROM spip_rubriques"); + $u &= spip_query("SELECT extra FROM spip_mots"); + maj_version(1.702, $u); } if (upgrade_vers(1.703, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD lang VARCHAR(10) DEFAULT '' NOT NULL"); spip_query("ALTER TABLE spip_rubriques ADD lang VARCHAR(10) DEFAULT '' NOT NULL"); - maj_version (1.703); + maj_version(1.703); } if (upgrade_vers(1.704, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD INDEX lang (lang)"); spip_query("ALTER TABLE spip_auteurs ADD INDEX lang (lang)"); spip_query("ALTER TABLE spip_rubriques ADD INDEX lang (lang)"); - maj_version (1.704); + maj_version(1.704); } if (upgrade_vers(1.705, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD langue_choisie VARCHAR(3) DEFAULT 'non'"); spip_query("ALTER TABLE spip_rubriques ADD langue_choisie VARCHAR(3) DEFAULT 'non'"); - maj_version (1.705); + maj_version(1.705); } if (upgrade_vers(1.707, $version_installee, $version_cible)) { @@ -78,31 +79,31 @@ function maj_v017_dist($version_installee, $version_cible) spip_query("UPDATE spip_articles SET lang=MID(lang,2,8) WHERE langue_choisie = 'non'"); spip_query("UPDATE spip_rubriques SET langue_choisie='oui' WHERE MID(lang,1,1) != '.' AND lang != ''"); spip_query("UPDATE spip_rubriques SET lang=MID(lang,2,8) WHERE langue_choisie = 'non'"); - maj_version (1.707); + maj_version(1.707); } if (upgrade_vers(1.708, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_breves ADD lang VARCHAR(10) DEFAULT '' NOT NULL"); spip_query("ALTER TABLE spip_breves ADD langue_choisie VARCHAR(3) DEFAULT 'non'"); - maj_version (1.708); + maj_version(1.708); } if (upgrade_vers(1.709, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD id_trad bigint(21) DEFAULT '0' NOT NULL"); spip_query("ALTER TABLE spip_articles ADD INDEX id_trad (id_trad)"); - maj_version (1.709); + maj_version(1.709); } if (upgrade_vers(1.717, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD INDEX date_modif (date_modif)"); - maj_version (1.717); + maj_version(1.717); } if (upgrade_vers(1.718, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_referers DROP domaine"); spip_query("ALTER TABLE spip_referers_articles DROP domaine"); spip_query("ALTER TABLE spip_referers_temp DROP domaine"); - maj_version (1.718); + maj_version(1.718); } if (upgrade_vers(1.722, $version_installee, $version_cible)) { @@ -114,7 +115,7 @@ function maj_v017_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_articles DROP INDEX url_ref"); spip_query("ALTER TABLE spip_articles DROP url_ref"); } - maj_version (1.722); + maj_version(1.722); } if (upgrade_vers(1.723, $version_installee, $version_cible)) { @@ -123,17 +124,17 @@ function maj_v017_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_articles DROP INDEX url_site;"); spip_query("ALTER TABLE spip_articles ADD INDEX url_site (url_site);"); } - maj_version (1.723); + maj_version(1.723); } if (upgrade_vers(1.724, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_messages ADD date_fin datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); - maj_version (1.724); + maj_version(1.724); } if (upgrade_vers(1.726, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_auteurs ADD low_sec tinytext NOT NULL"); - maj_version (1.726); + maj_version(1.726); } if (upgrade_vers(1.727, $version_installee, $version_cible)) { @@ -142,13 +143,13 @@ function maj_v017_dist($version_installee, $version_cible) spip_query("UPDATE spip_rubriques SET lang=REPLACE(lang,'oci_', 'oc_') WHERE lang LIKE 'oci_%'"); spip_query("UPDATE spip_articles SET lang=REPLACE(lang,'oci_', 'oc_') WHERE lang LIKE 'oci_%'"); spip_query("UPDATE spip_breves SET lang=REPLACE(lang,'oci_', 'oc_') WHERE lang LIKE 'oci_%'"); - maj_version (1.727); + maj_version(1.727); } // Ici version 1.7 officielle if (upgrade_vers(1.728, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_articles ADD id_version int unsigned DEFAULT '0' NOT NULL"); - maj_version (1.728); + maj_version(1.728); } if (upgrade_vers(1.730, $version_installee, $version_cible)) { @@ -168,7 +169,7 @@ function maj_v017_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_forum ADD INDEX idx (idx)"); spip_query("ALTER TABLE spip_signatures ADD idx ENUM('', '1', 'non', 'oui', 'idx') DEFAULT '' NOT NULL"); spip_query("ALTER TABLE spip_signatures ADD INDEX idx (idx)"); - maj_version (1.730); + maj_version(1.730); } if (upgrade_vers(1.731, $version_installee, $version_cible)) { @@ -176,12 +177,13 @@ function maj_v017_dist($version_installee, $version_cible) spip_query("UPDATE spip_rubriques SET idx='1' where lang IN ('de','vi')"); spip_query("UPDATE spip_breves SET idx='1' where lang IN ('de','vi')"); spip_query("UPDATE spip_auteurs SET idx='1' where lang IN ('de','vi')"); - maj_version (1.731); + maj_version(1.731); } - if (upgrade_vers(1.732, $version_installee, $version_cible)) { // en correction d'un vieux truc qui avait fait sauter le champ inclus sur les bases version 1.415 + if (upgrade_vers(1.732, $version_installee, + $version_cible)) { // en correction d'un vieux truc qui avait fait sauter le champ inclus sur les bases version 1.415 spip_query("ALTER TABLE spip_documents ADD inclus VARCHAR(3) DEFAULT 'non'"); - maj_version (1.732); + maj_version(1.732); } if (upgrade_vers(1.733, $version_installee, $version_cible)) { diff --git a/ecrire/maj/v018.php b/ecrire/maj/v018.php index 0d40807e7d..4d5abcbd7f 100644 --- a/ecrire/maj/v018.php +++ b/ecrire/maj/v018.php @@ -12,19 +12,20 @@ /** * Gestion des mises à jour de SPIP, versions 1.8* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°018 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function maj_v018_dist($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function maj_v018_dist($version_installee, $version_cible) { if (upgrade_vers(1.801, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_rubriques ADD statut_tmp VARCHAR(10) NOT NULL, ADD date_tmp datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"); include_spip('inc/rubriques'); @@ -52,9 +53,9 @@ function maj_v018_dist($version_installee, $version_cible) } if (upgrade_vers(1.803, $version_installee, $version_cible)) { - # 27 AOUT 2004 : conservons cette table pour autoriser les retours - # de SPIP 1.8a6 CVS vers 1.7.2 - # spip_query("DROP TABLE spip_forum_cache"); + # 27 AOUT 2004 : conservons cette table pour autoriser les retours + # de SPIP 1.8a6 CVS vers 1.7.2 + # spip_query("DROP TABLE spip_forum_cache"); spip_query("DROP TABLE spip_inclure_caches"); maj_version(1.803); @@ -68,24 +69,26 @@ function maj_v018_dist($version_installee, $version_cible) /** * Recalculer tous les threads - * + * * Fonction du plugin forum recopiee ici pour assurer la montee * de version dans tous les cas de figure - **/ + **/ function maj_v018_calculer_threads() { // fixer les id_thread des debuts de discussion - sql_update('spip_forum', array('id_thread'=>'id_forum'), "id_parent=0"); + sql_update('spip_forum', array('id_thread' => 'id_forum'), "id_parent=0"); // reparer les messages qui n'ont pas l'id_secteur de leur parent do { $discussion = "0"; $precedent = 0; - $r = sql_select("fille.id_forum AS id, maman.id_thread AS thread", 'spip_forum AS fille, spip_forum AS maman', "fille.id_parent = maman.id_forum AND fille.id_thread <> maman.id_thread",'', "thread"); + $r = sql_select("fille.id_forum AS id, maman.id_thread AS thread", 'spip_forum AS fille, spip_forum AS maman', + "fille.id_parent = maman.id_forum AND fille.id_thread <> maman.id_thread", '', "thread"); while ($row = sql_fetch($r)) { - if ($row['thread'] == $precedent) + if ($row['thread'] == $precedent) { $discussion .= "," . $row['id']; - else { - if ($precedent) + } else { + if ($precedent) { sql_updateq("spip_forum", array("id_thread" => $precedent), "id_forum IN ($discussion)"); + } $precedent = $row['thread']; $discussion = $row['id']; } @@ -93,6 +96,7 @@ function maj_v018_dist($version_installee, $version_cible) sql_updateq("spip_forum", array("id_thread" => $precedent), "id_forum IN ($discussion)"); } while ($discussion != "0"); } + if (upgrade_vers(1.805, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_forum ADD id_thread bigint(21) DEFAULT '0' NOT NULL"); maj_v018_calculer_threads(); @@ -147,7 +151,7 @@ function maj_v018_dist($version_installee, $version_cible) spip_query("ALTER TABLE spip_syndic ADD extra longblob NULL"); maj_version(1.811); } - + if (upgrade_vers(1.812, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_documents ADD idx ENUM('', '1', 'non', 'oui', 'idx') DEFAULT '' NOT NULL"); maj_version(1.812); diff --git a/ecrire/maj/v019.php b/ecrire/maj/v019.php index cb07720320..bd452b4bd7 100644 --- a/ecrire/maj/v019.php +++ b/ecrire/maj/v019.php @@ -18,68 +18,77 @@ * * On la fait coincider rétroactivement avec l'état de la 1.9.2 * L'index numérique entier est multiplié par 1000 (resultat < SVN c'est ok) - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} - // FLV est incrustable, la MAJ precedente l'avait oublie +// FLV est incrustable, la MAJ precedente l'avait oublie $GLOBALS['maj'][1931] = array( array('spip_query', "UPDATE spip_types_documents SET `inclus`='embed' WHERE `extension`='flv'") - ); +); - // Ajout de spip_forum.date_thread, et on essaie de le remplir - // a coup de table temporaire (est-ce autorise partout... sinon - // tant pis, ca ne marchera que pour les forums recemment modifies) +// Ajout de spip_forum.date_thread, et on essaie de le remplir +// a coup de table temporaire (est-ce autorise partout... sinon +// tant pis, ca ne marchera que pour les forums recemment modifies) $GLOBALS['maj'][1932] = array( array('sql_alter', "TABLE spip_forum ADD `date_thread` datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"), array('sql_alter', "TABLE spip_forum ADD INDEX `date_thread` (`date_thread`)"), array('spip_query', "DROP TABLE IF EXISTS spip_tmp"), - array('spip_query', "CREATE TABLE spip_tmp SELECT `id_thread`,MAX(`date_heure`) AS dt FROM spip_forum GROUP BY `id_thread`"), + array( + 'spip_query', + "CREATE TABLE spip_tmp SELECT `id_thread`,MAX(`date_heure`) AS dt FROM spip_forum GROUP BY `id_thread`" + ), array('sql_alter', "TABLE spip_tmp ADD INDEX `p` (`id_thread`)"), array('spip_query', "UPDATE spip_forum AS F JOIN spip_tmp AS T ON F.id_thread=T.id_thread SET F.date_thread=T.dt"), array('spip_query', "DROP TABLE spip_tmp"), - ); +); /** * Mise à jour 1_934 : Retrait de `_DIR_IMG` dans le champ fichier de la table des doc -**/ -function maj_1_934 () { - // attention, en cas de mutualisation _DIR_IMG contient quelque chose comme sites/urldusite/IMG/ - // essayons en ne prenant que le dernier segment - $dir_img = basename(_DIR_IMG).'/'; - $res = spip_query("SELECT fichier FROM spip_documents WHERE fichier LIKE " . _q($dir_img . '%') . " LIMIT 0,1"); - if (!$row = spip_fetch_array($res)){ - //Êsinon on essaye avec le chemin complet - // il faut donc verifier qu'on a bien le bon nom de repertoire - $dir_img = substr(_DIR_IMG,strlen(_DIR_RACINE)); - } - $n = strlen($dir_img) + 1; - spip_query("UPDATE spip_documents SET `fichier`=substring(fichier,$n) WHERE `fichier` LIKE " . _q($dir_img . '%')); + **/ +function maj_1_934() { + // attention, en cas de mutualisation _DIR_IMG contient quelque chose comme sites/urldusite/IMG/ + // essayons en ne prenant que le dernier segment + $dir_img = basename(_DIR_IMG) . '/'; + $res = spip_query("SELECT fichier FROM spip_documents WHERE fichier LIKE " . _q($dir_img . '%') . " LIMIT 0,1"); + if (!$row = spip_fetch_array($res)) { + //Êsinon on essaye avec le chemin complet + // il faut donc verifier qu'on a bien le bon nom de repertoire + $dir_img = substr(_DIR_IMG, strlen(_DIR_RACINE)); + } + $n = strlen($dir_img)+1; + spip_query("UPDATE spip_documents SET `fichier`=substring(fichier,$n) WHERE `fichier` LIKE " . _q($dir_img . '%')); } $GLOBALS['maj'][1934] = array(array('maj_1_934')); /** - * Mise à jour 1_935 : calcul du nouveau champ 'vu' sur les associations documents_xx -**/ -function maj_1_935 () { + * Mise à jour 1_935 : calcul du nouveau champ 'vu' sur les associations documents_xx + **/ +function maj_1_935() { include_spip('inc/texte'); - foreach(array('article'=>'id_article','rubrique'=>'id_rubrique','breve'=>'id_breve') as $type => $id_table_objet){ - $table_objet = "$type"."s"; - $chapo = $type=='article' ? ",a.chapo":""; + foreach (array( + 'article' => 'id_article', + 'rubrique' => 'id_rubrique', + 'breve' => 'id_breve' + ) as $type => $id_table_objet) { + $table_objet = "$type" . "s"; + $chapo = $type == 'article' ? ",a.chapo" : ""; $res = spip_query("SELECT a.$id_table_objet,a.texte $chapo FROM spip_documents_$table_objet AS d JOIN spip_$table_objet AS a ON a.$id_table_objet=d.$id_table_objet GROUP BY $id_table_objet"); - while ($row = sql_fetch($res)){ + while ($row = sql_fetch($res)) { $GLOBALS['doublons_documents_inclus'] = array(); - traiter_modeles(($chapo?$row['chapo']:"").$row['texte'],true); // detecter les doublons - if (count($GLOBALS['doublons_documents_inclus'])){ - $id = $row[$id_table_objet]; - $liste = "(".implode(",$id,'oui'),(",$GLOBALS['doublons_documents_inclus']).",$id,'oui')"; - spip_query("REPLACE INTO spip_documents_$table_objet (`id_document`,`$id_table_objet`,`vu`) VALUES $liste"); - } + traiter_modeles(($chapo ? $row['chapo'] : "") . $row['texte'], true); // detecter les doublons + if (count($GLOBALS['doublons_documents_inclus'])) { + $id = $row[$id_table_objet]; + $liste = "(" . implode(",$id,'oui'),(", $GLOBALS['doublons_documents_inclus']) . ",$id,'oui')"; + spip_query("REPLACE INTO spip_documents_$table_objet (`id_document`,`$id_table_objet`,`vu`) VALUES $liste"); } + } } } @@ -88,7 +97,7 @@ $GLOBALS['maj'][1935] = array( array('sql_alter', "TABLE spip_documents_rubriques ADD `vu` ENUM('non', 'oui') DEFAULT 'non' NOT NULL"), array('sql_alter', "TABLE spip_documents_breves ADD `vu` ENUM('non', 'oui') DEFAULT 'non' NOT NULL"), array('maj_1_935') - ); +); /** @@ -96,68 +105,71 @@ $GLOBALS['maj'][1935] = array( * * @param string $table Nom de la table * @param string $champ Nom du champ dans la table - * @param string $type Type de champ de destination, par exemple `LONGTEXT` -**/ -function convertir_un_champ_blob_en_text($table, $champ, $type){ + * @param string $type Type de champ de destination, par exemple `LONGTEXT` + **/ +function convertir_un_champ_blob_en_text($table, $champ, $type) { // precaution : definir le charset par defaut de la table, car c'est lui qui prevaut // et il faut qu'il corresponde au charset de la connexion qui est celui // dans lequel on a ecrit le champ en blob - if ($charset = sql_getfetsel('@@character_set_connection')){ - sql_alter("TABLE $table DEFAULT CHARACTER SET ".$charset); + if ($charset = sql_getfetsel('@@character_set_connection')) { + sql_alter("TABLE $table DEFAULT CHARACTER SET " . $charset); } $res = spip_query("SHOW FULL COLUMNS FROM $table LIKE '$champ'"); - if ($row = sql_fetch($res)){ - if (strtolower($row['Type'])!=strtolower($type)) { - $default = $row['Default']?(" DEFAULT ".sql_quote($row['Default'])):""; - $notnull = ($row['Null']=='YES')?"":" NOT NULL"; + if ($row = sql_fetch($res)) { + if (strtolower($row['Type']) != strtolower($type)) { + $default = $row['Default'] ? (" DEFAULT " . sql_quote($row['Default'])) : ""; + $notnull = ($row['Null'] == 'YES') ? "" : " NOT NULL"; sql_alter("TABLE $table CHANGE $champ $champ $type $default $notnull"); } } } $GLOBALS['maj'][1937] = array( - // convertir les champs blob des tables spip en champs texte - array('convertir_un_champ_blob_en_text',"spip_articles","texte","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_articles","extra","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_auteurs","extra","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_breves","texte","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_breves","extra","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_messages","texte","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_mots","texte","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_mots","extra","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_groupes_mots","texte","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_rubriques","texte","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_rubriques","extra","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_syndic","nom_site","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_syndic","descriptif","TEXT"), - array('convertir_un_champ_blob_en_text',"spip_syndic","extra","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_syndic_articles","descriptif","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_petitions","texte","LONGTEXT"), - array('convertir_un_champ_blob_en_text',"spip_ortho_cache","suggest","TEXT"), - ); + // convertir les champs blob des tables spip en champs texte + array('convertir_un_champ_blob_en_text', "spip_articles", "texte", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_articles", "extra", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_auteurs", "extra", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_breves", "texte", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_breves", "extra", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_messages", "texte", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_mots", "texte", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_mots", "extra", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_groupes_mots", "texte", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_rubriques", "texte", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_rubriques", "extra", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_syndic", "nom_site", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_syndic", "descriptif", "TEXT"), + array('convertir_un_champ_blob_en_text', "spip_syndic", "extra", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_syndic_articles", "descriptif", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_petitions", "texte", "LONGTEXT"), + array('convertir_un_champ_blob_en_text', "spip_ortho_cache", "suggest", "TEXT"), +); /** * Mise à jour 1_938 : suppression des id_type de documents, remplacés par extension -**/ -function maj_1_938 () { - $res = sql_select('extension','spip_documents',"extension='' OR extension is NULL"); + **/ +function maj_1_938() { + $res = sql_select('extension', 'spip_documents', "extension='' OR extension is NULL"); if ($n = sql_count($res)) { $repli = false; // verifier que la colonne id_type est toujours la (update post 1.938) $desc = sql_showtable('spip_documents'); - if (!$desc OR !isset($desc['field']['id_type'])) + if (!$desc OR !isset($desc['field']['id_type'])) { $repli = true; - - $s = sql_select('extension'.($repli?'':',id_type'),'spip_types_documents'); + } + + $s = sql_select('extension' . ($repli ? '' : ',id_type'), 'spip_types_documents'); while ($t = sql_fetch($s)) { - if (isset($t['id_type'])) - spip_query("UPDATE spip_documents SET `extension`="._q($t['extension']) ." WHERE `id_type`="._q($t['id_type'])); - else - spip_query("UPDATE spip_documents SET `extension`="._q($t['extension']) ." WHERE fichier LIKE "._q("%." . $t['extension'])); + if (isset($t['id_type'])) { + spip_query("UPDATE spip_documents SET `extension`=" . _q($t['extension']) . " WHERE `id_type`=" . _q($t['id_type'])); + } else { + spip_query("UPDATE spip_documents SET `extension`=" . _q($t['extension']) . " WHERE fichier LIKE " . _q("%." . $t['extension'])); + } } - $res = sql_select('extension','spip_documents',"extension='' OR extension is NULL"); - if ($n = sql_count($res)) + $res = sql_select('extension', 'spip_documents', "extension='' OR extension is NULL"); + if ($n = sql_count($res)) { spip_log("Table spip_documents : Colonne extension incomplete : $n lignes vides"); + } } } @@ -170,15 +182,15 @@ $GLOBALS['maj'][1938] = array( array('maj_1_938'), array('sql_alter', "TABLE spip_documents DROP INDEX `id_type`, DROP `id_type`"), - ## supprimer l'autoincrement avant de supprimer la PRIMARY KEY - array('sql_alter', "TABLE spip_types_documents CHANGE `id_type` `id_type` BIGINT( 21 ) NOT NULL ") , + ## supprimer l'autoincrement avant de supprimer la PRIMARY KEY + array('sql_alter', "TABLE spip_types_documents CHANGE `id_type` `id_type` BIGINT( 21 ) NOT NULL "), array('sql_alter', "TABLE spip_types_documents DROP PRIMARY KEY"), array('sql_alter', "TABLE spip_types_documents DROP `id_type`"), array('sql_alter', "TABLE spip_types_documents DROP INDEX `extension`"), - ## recreer la PRIMARY KEY sur spip_types_documents.extension + ## recreer la PRIMARY KEY sur spip_types_documents.extension array('sql_alter', "TABLE spip_types_documents ADD PRIMARY KEY (`extension`)"), - ); +); $GLOBALS['maj'][1939] = array( array('sql_alter', "TABLE spip_visites CHANGE `visites` `visites` INT UNSIGNED DEFAULT '0' NOT NULL"), @@ -187,18 +199,21 @@ $GLOBALS['maj'][1939] = array( array('sql_alter', "TABLE spip_referers CHANGE `visites_jour` `visites_jour` INT UNSIGNED DEFAULT '0' NOT NULL"), array('sql_alter', "TABLE spip_referers CHANGE `visites_veille` `visites_veille` INT UNSIGNED DEFAULT '0' NOT NULL"), array('sql_alter', "TABLE spip_referers_articles CHANGE `visites` `visites` INT UNSIGNED DEFAULT '0' NOT NULL") - ); +); $GLOBALS['maj'][1940] = array( - array('spip_query', "DROP TABLE spip_caches"), - ); + array('spip_query', "DROP TABLE spip_caches"), +); $GLOBALS['maj'][1941] = array( array('spip_query', "UPDATE spip_meta SET `valeur` = '' WHERE `nom`='preview' AND `valeur`='non' "), - array('spip_query', "UPDATE spip_meta SET `valeur` = ',0minirezo,1comite,' WHERE `nom`='preview' AND `valeur`='1comite' "), + array( + 'spip_query', + "UPDATE spip_meta SET `valeur` = ',0minirezo,1comite,' WHERE `nom`='preview' AND `valeur`='1comite' " + ), array('spip_query', "UPDATE spip_meta SET `valeur` = ',0minirezo,' WHERE `nom`='preview' AND `valeur`='oui' "), - ); +); $GLOBALS['maj'][1942] = array( array('sql_alter', "TABLE spip_auteurs CHANGE `statut` `statut` varchar(255) DEFAULT '0' NOT NULL"), @@ -210,10 +225,10 @@ $GLOBALS['maj'][1942] = array( array('sql_alter', "TABLE spip_syndic_articles CHANGE `statut` `statut` varchar(10) DEFAULT '0' NOT NULL"), array('sql_alter', "TABLE spip_forum CHANGE `statut` `statut` varchar(8) DEFAULT '0' NOT NULL"), array('sql_alter', "TABLE spip_signatures CHANGE `statut` `statut` varchar(10) DEFAULT '0' NOT NULL") - ); +); - // suppression de l'indexation dans la version standard +// suppression de l'indexation dans la version standard $GLOBALS['maj'][1943] = array( array('sql_alter', "TABLE spip_articles DROP KEY `idx`"), array('sql_alter', "TABLE spip_articles DROP `idx`"), @@ -236,159 +251,175 @@ $GLOBALS['maj'][1943] = array( array('spip_query', "DROP TABLE spip_index"), array('spip_query', "DROP TABLE spip_index_dico"), - ); +); $GLOBALS['maj'][1944] = array( - array('sql_alter', "TABLE spip_documents CHANGE `taille` `taille` integer"), - array('sql_alter', "TABLE spip_documents CHANGE `largeur` `largeur` integer"), - array('sql_alter', "TABLE spip_documents CHANGE `hauteur` `hauteur` integer") - ); + array('sql_alter', "TABLE spip_documents CHANGE `taille` `taille` integer"), + array('sql_alter', "TABLE spip_documents CHANGE `largeur` `largeur` integer"), + array('sql_alter', "TABLE spip_documents CHANGE `hauteur` `hauteur` integer") +); $GLOBALS['maj'][1945] = array( - array('sql_alter', "TABLE spip_petitions CHANGE `email_unique` `email_unique` CHAR (3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_petitions CHANGE `site_obli` `site_obli` CHAR (3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_petitions CHANGE `site_unique` `site_unique` CHAR (3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_petitions CHANGE `message` `message` CHAR (3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_petitions CHANGE `texte` `texte` LONGTEXT DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `surtitre` `surtitre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `soustitre` `soustitre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `chapo` `chapo` mediumtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `ps` `ps` mediumtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `accepter_forum` `accepter_forum` CHAR(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `nom_site` `nom_site` tinytext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `url_site` `url_site` VARCHAR(255) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_articles CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `nom` `nom` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `bio` `bio` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `email` `email` tinytext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `nom_site` `nom_site` tinytext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `pass` `pass` tinytext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `low_sec` `low_sec` tinytext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `pgp` `pgp` TEXT DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_auteurs CHANGE `htpass` `htpass` tinytext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_breves CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_breves CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_breves CHANGE `lien_titre` `lien_titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_breves CHANGE `lien_url` `lien_url` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_messages CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_messages CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_messages CHANGE `type` `type` varchar(6) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_messages CHANGE `rv` `rv` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_mots CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_mots CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_mots CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_mots CHANGE `type` `type` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_mots CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `unseul` `unseul` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `obligatoire` `obligatoire` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `articles` `articles` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `breves` `breves` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `rubriques` `rubriques` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `syndic` `syndic` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `minirezo` `minirezo` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `comite` `comite` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_groupes_mots CHANGE `forum` `forum` varchar(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_rubriques CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_rubriques CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_rubriques CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_rubriques CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_documents CHANGE `extension` `extension` VARCHAR(10) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_documents CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_documents CHANGE `date` `date` datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"), - array('sql_alter', "TABLE spip_documents CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_documents CHANGE `fichier` `fichier` varchar(255) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_types_documents CHANGE `extension` `extension` varchar(10) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_types_documents CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_types_documents CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_types_documents CHANGE `mime_type` `mime_type` varchar(100) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic CHANGE `nom_site` `nom_site` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic CHANGE `url_syndic` `url_syndic` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic CHANGE `syndication` `syndication` VARCHAR(3) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic_articles CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic_articles CHANGE `url` `url` VARCHAR(255) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic_articles CHANGE `lesauteurs` `lesauteurs` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_syndic_articles CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_forum CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_forum CHANGE `texte` `texte` mediumtext DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_forum CHANGE `auteur` `auteur` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_forum CHANGE `email_auteur` `email_auteur` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_forum CHANGE `nom_site` `nom_site` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_forum CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_forum CHANGE `ip` `ip` varchar(16) DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_signatures CHANGE `nom_email` `nom_email` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_signatures CHANGE `ad_email` `ad_email` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_signatures CHANGE `nom_site` `nom_site` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_signatures CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), - array('sql_alter', "TABLE spip_signatures CHANGE `message` `message` mediumtext DEFAULT '' NOT NULL") - ); + array('sql_alter', "TABLE spip_petitions CHANGE `email_unique` `email_unique` CHAR (3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_petitions CHANGE `site_obli` `site_obli` CHAR (3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_petitions CHANGE `site_unique` `site_unique` CHAR (3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_petitions CHANGE `message` `message` CHAR (3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_petitions CHANGE `texte` `texte` LONGTEXT DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `surtitre` `surtitre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `soustitre` `soustitre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `chapo` `chapo` mediumtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `ps` `ps` mediumtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `accepter_forum` `accepter_forum` CHAR(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `nom_site` `nom_site` tinytext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `url_site` `url_site` VARCHAR(255) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_articles CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `nom` `nom` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `bio` `bio` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `email` `email` tinytext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `nom_site` `nom_site` tinytext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `pass` `pass` tinytext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `low_sec` `low_sec` tinytext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `pgp` `pgp` TEXT DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_auteurs CHANGE `htpass` `htpass` tinytext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_breves CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_breves CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_breves CHANGE `lien_titre` `lien_titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_breves CHANGE `lien_url` `lien_url` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_messages CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_messages CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_messages CHANGE `type` `type` varchar(6) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_messages CHANGE `rv` `rv` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_mots CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_mots CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_mots CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_mots CHANGE `type` `type` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_mots CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `unseul` `unseul` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `obligatoire` `obligatoire` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `articles` `articles` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `breves` `breves` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `rubriques` `rubriques` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `syndic` `syndic` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `minirezo` `minirezo` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `comite` `comite` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_groupes_mots CHANGE `forum` `forum` varchar(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_rubriques CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_rubriques CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_rubriques CHANGE `texte` `texte` longtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_rubriques CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_documents CHANGE `extension` `extension` VARCHAR(10) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_documents CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_documents CHANGE `date` `date` datetime DEFAULT '0000-00-00 00:00:00' NOT NULL"), + array('sql_alter', "TABLE spip_documents CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_documents CHANGE `fichier` `fichier` varchar(255) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_types_documents CHANGE `extension` `extension` varchar(10) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_types_documents CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_types_documents CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_types_documents CHANGE `mime_type` `mime_type` varchar(100) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic CHANGE `nom_site` `nom_site` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic CHANGE `url_syndic` `url_syndic` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic CHANGE `url_propre` `url_propre` VARCHAR(255) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic CHANGE `syndication` `syndication` VARCHAR(3) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic_articles CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic_articles CHANGE `url` `url` VARCHAR(255) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic_articles CHANGE `lesauteurs` `lesauteurs` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_syndic_articles CHANGE `descriptif` `descriptif` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_forum CHANGE `titre` `titre` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_forum CHANGE `texte` `texte` mediumtext DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_forum CHANGE `auteur` `auteur` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_forum CHANGE `email_auteur` `email_auteur` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_forum CHANGE `nom_site` `nom_site` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_forum CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_forum CHANGE `ip` `ip` varchar(16) DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_signatures CHANGE `nom_email` `nom_email` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_signatures CHANGE `ad_email` `ad_email` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_signatures CHANGE `nom_site` `nom_site` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_signatures CHANGE `url_site` `url_site` text DEFAULT '' NOT NULL"), + array('sql_alter', "TABLE spip_signatures CHANGE `message` `message` mediumtext DEFAULT '' NOT NULL") +); $GLOBALS['maj'][1946] = array( - array('sql_alter', "TABLE spip_forum DROP INDEX `id_parent`"), - array('sql_alter', "TABLE spip_forum DROP INDEX `id_article`"), - array('sql_alter', "TABLE spip_forum DROP INDEX `id_breve`"), - array('sql_alter', "TABLE spip_forum DROP INDEX `id_syndic`"), - array('sql_alter', "TABLE spip_forum DROP INDEX `id_rubrique`"), - array('sql_alter', "TABLE spip_forum DROP INDEX `date_thread`"), - array('sql_alter', "TABLE spip_forum DROP INDEX `statut`"), - array('sql_alter', "TABLE spip_forum ADD INDEX `optimal` (`statut`,`id_parent`,`id_article`,`date_heure`,`id_breve`,`id_syndic`,`id_rubrique`)") - ); + array('sql_alter', "TABLE spip_forum DROP INDEX `id_parent`"), + array('sql_alter', "TABLE spip_forum DROP INDEX `id_article`"), + array('sql_alter', "TABLE spip_forum DROP INDEX `id_breve`"), + array('sql_alter', "TABLE spip_forum DROP INDEX `id_syndic`"), + array('sql_alter', "TABLE spip_forum DROP INDEX `id_rubrique`"), + array('sql_alter', "TABLE spip_forum DROP INDEX `date_thread`"), + array('sql_alter', "TABLE spip_forum DROP INDEX `statut`"), + array( + 'sql_alter', + "TABLE spip_forum ADD INDEX `optimal` (`statut`,`id_parent`,`id_article`,`date_heure`,`id_breve`,`id_syndic`,`id_rubrique`)" + ) +); $GLOBALS['maj'][1947] = array( - array('sql_alter', "TABLE spip_articles DROP INDEX `url_site`"), - array('sql_alter', "TABLE spip_articles DROP INDEX `date_modif`"), - array('sql_alter', "TABLE spip_auteurs DROP INDEX `lang`") - ); + array('sql_alter', "TABLE spip_articles DROP INDEX `url_site`"), + array('sql_alter', "TABLE spip_articles DROP INDEX `date_modif`"), + array('sql_alter', "TABLE spip_auteurs DROP INDEX `lang`") +); - // mauvaise manip +// mauvaise manip $GLOBALS['maj'][1949] = array( - array('sql_alter', "TABLE spip_versions DROP INDEX `date`"), - array('sql_alter', "TABLE spip_versions DROP INDEX `id_auteur`") - ); + array('sql_alter', "TABLE spip_versions DROP INDEX `date`"), + array('sql_alter', "TABLE spip_versions DROP INDEX `id_auteur`") +); /** * Mise à jour 1_950 : Gestion du prefixe pour la table des urls - * + * * @param float $installee Numéro de version actuellement installée -**/ + **/ function maj_1_950($installee) { - // oubli de gerer le prefixe lors l'introduction de l'abstraction - // => Relancer les MAJ concernees si la version dont on part les avait fait - if ($installee >= 1.946) serie_alter('950a', $GLOBALS['maj'][1946]); - if ($installee >= 1.947) serie_alter('950b', $GLOBALS['maj'][1947]); - if ($installee >= 1.949) @serie_alter('950c', $GLOBALS['maj'][1949]); + // oubli de gerer le prefixe lors l'introduction de l'abstraction + // => Relancer les MAJ concernees si la version dont on part les avait fait + if ($installee >= 1.946) { + serie_alter('950a', $GLOBALS['maj'][1946]); + } + if ($installee >= 1.947) { + serie_alter('950b', $GLOBALS['maj'][1947]); + } + if ($installee >= 1.949) { + @serie_alter('950c', $GLOBALS['maj'][1949]); + } global $tables_auxiliaires; include_spip('base/auxiliaires'); - $v = $tables_auxiliaires[$k='spip_urls']; + $v = $tables_auxiliaires[$k = 'spip_urls']; sql_create($k, $v['field'], $v['key'], false, false); - foreach(array('article'=>'id_article', - 'rubrique'=>'id_rubrique', - 'breve'=>'id_breve', - 'auteur' => 'id_auteur', - 'mot' => 'id_mot', - 'syndic' => 'id_syndic') as $type => $id_objet){ - $table = ($type == 'syndic') ? $type : ($type ."s"); + foreach (array( + 'article' => 'id_article', + 'rubrique' => 'id_rubrique', + 'breve' => 'id_breve', + 'auteur' => 'id_auteur', + 'mot' => 'id_mot', + 'syndic' => 'id_syndic' + ) as $type => $id_objet) { + $table = ($type == 'syndic') ? $type : ($type . "s"); $date = ($type == 'breve') ? 'date_heure' : - (($type == 'auteur') ? 'maj' : - (($type == 'mot') ? 'maj' : 'date')); - $q = @sql_select("url_propre AS url, $id_objet AS id_objet, '$type' AS type, $date as date", "spip_$table", "url_propre<>''"); - if (!$q) return; // anormal, mais ne pas boucler en erreur - while ($r = sql_fetch($q)) sql_replace('spip_urls', $r); + (($type == 'auteur') ? 'maj' : + (($type == 'mot') ? 'maj' : 'date')); + $q = @sql_select("url_propre AS url, $id_objet AS id_objet, '$type' AS type, $date as date", "spip_$table", + "url_propre<>''"); + if (!$q) { + return; + } // anormal, mais ne pas boucler en erreur + while ($r = sql_fetch($q)) { + sql_replace('spip_urls', $r); + } spip_log("table $table : " . sql_count($q) . " urls propres copiees"); sql_alter("TABLE spip_$table DROP INDEX `url_propre`"); sql_alter("TABLE spip_$table DROP `url_propre`"); @@ -397,7 +428,7 @@ function maj_1_950($installee) { // Donner a la fonction ci-dessus le numero de version installee // AVANT que la mise a jour ait commencee -$GLOBALS['maj'][1950] = array(array('maj_1_950', $GLOBALS['meta']['version_installee'] )); +$GLOBALS['maj'][1950] = array(array('maj_1_950', $GLOBALS['meta']['version_installee'])); // Erreur dans maj_1_948(): // // http://trac.rezo.net/trac/spip/changeset/10194 @@ -405,8 +436,8 @@ $GLOBALS['maj'][1950] = array(array('maj_1_950', $GLOBALS['meta']['version_inst $GLOBALS['maj'][1951] = array( - array('sql_alter', "TABLE spip_versions CHANGE `id_version` `id_version` bigint(21) DEFAULT 0 NOT NULL") - ); + array('sql_alter', "TABLE spip_versions CHANGE `id_version` `id_version` bigint(21) DEFAULT 0 NOT NULL") +); /** @@ -414,23 +445,28 @@ $GLOBALS['maj'][1951] = array( * * - image => mode=image * - vignette => mode=vignette -**/ + **/ function maj_1_952() { $ok = sql_alter("TABLE spip_documents CHANGE `mode` `mode` enum('vignette','image','document') DEFAULT NULL"); - if($ok) { + if ($ok) { - $s = sql_select("v.id_document as id_document", "spip_documents as d join spip_documents as v ON d.id_vignette=v.id_document"); + $s = sql_select("v.id_document as id_document", + "spip_documents as d join spip_documents as v ON d.id_vignette=v.id_document"); $vignettes = array(); - while ($t = sql_fetch($s)) + while ($t = sql_fetch($s)) { $vignettes[] = intval($t['id_document']); + } $ok &= spip_query("UPDATE spip_documents SET `mode`='image' WHERE `mode`='vignette'"); - $ok &= spip_query("UPDATE spip_documents SET `mode`='vignette' WHERE `mode`='image' AND ".sql_in('id_document', $vignettes)); + $ok &= spip_query("UPDATE spip_documents SET `mode`='vignette' WHERE `mode`='image' AND " . sql_in('id_document', + $vignettes)); + } + if (!$ok) { + die('echec sur maj_1_952()'); } - if (!$ok) die('echec sur maj_1_952()'); } $GLOBALS['maj'][1952] = array(array('maj_1_952')); @@ -439,30 +475,49 @@ $GLOBALS['maj'][1953] = array(array('upgrade_types_documents')); $GLOBALS['maj'][1954] = array( - //pas de psd en <img> - array('spip_query', "UPDATE spip_types_documents SET `inclus`='non' WHERE `extension`='psd'"), - //ajout csv - array('spip_query', "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`) VALUES ('csv', 'CSV')"), - array('spip_query', "UPDATE spip_types_documents SET `mime_type`='text/csv' WHERE `extension`='csv'"), - //ajout mkv - array('spip_query', "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`, `inclus`) VALUES ('mkv', 'Matroska Video', 'embed')"), - array('spip_query', "UPDATE spip_types_documents SET `mime_type`='video/x-mkv' WHERE `extension`='mkv'"), - //ajout mka - array('spip_query', "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`, `inclus`) VALUES ('mka', 'Matroska Audio', 'embed')"), - array('spip_query', "UPDATE spip_types_documents SET `mime_type`='audio/x-mka' WHERE `extension`='mka'"), - //ajout kml - array('spip_query', "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`) VALUES ('kml', 'Keyhole Markup Language')"), - array('spip_query', "UPDATE spip_types_documents SET `mime_type`='application/vnd.google-earth.kml+xml' WHERE `extension`='kml'"), - //ajout kmz - array('spip_query', "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`) VALUES ('kmz', 'Google Earth Placemark File')"), - array('spip_query', "UPDATE spip_types_documents SET `mime_type`='application/vnd.google-earth.kmz' WHERE `extension`='kmz'") - ); - -if ($GLOBALS['meta']['version_installee'] > 1.950) - // 1.950 lisait un bug dans auxiliaires.php corrige a present + //pas de psd en <img> + array('spip_query', "UPDATE spip_types_documents SET `inclus`='non' WHERE `extension`='psd'"), + //ajout csv + array('spip_query', "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`) VALUES ('csv', 'CSV')"), + array('spip_query', "UPDATE spip_types_documents SET `mime_type`='text/csv' WHERE `extension`='csv'"), + //ajout mkv + array( + 'spip_query', + "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`, `inclus`) VALUES ('mkv', 'Matroska Video', 'embed')" + ), + array('spip_query', "UPDATE spip_types_documents SET `mime_type`='video/x-mkv' WHERE `extension`='mkv'"), + //ajout mka + array( + 'spip_query', + "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`, `inclus`) VALUES ('mka', 'Matroska Audio', 'embed')" + ), + array('spip_query', "UPDATE spip_types_documents SET `mime_type`='audio/x-mka' WHERE `extension`='mka'"), + //ajout kml + array( + 'spip_query', + "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`) VALUES ('kml', 'Keyhole Markup Language')" + ), + array( + 'spip_query', + "UPDATE spip_types_documents SET `mime_type`='application/vnd.google-earth.kml+xml' WHERE `extension`='kml'" + ), + //ajout kmz + array( + 'spip_query', + "INSERT IGNORE INTO spip_types_documents (`extension`, `titre`) VALUES ('kmz', 'Google Earth Placemark File')" + ), + array( + 'spip_query', + "UPDATE spip_types_documents SET `mime_type`='application/vnd.google-earth.kmz' WHERE `extension`='kmz'" + ) +); + +if ($GLOBALS['meta']['version_installee'] > 1.950) // 1.950 lisait un bug dans auxiliaires.php corrige a present +{ $GLOBALS['maj'][1955] = array( - array('sql_alter', "TABLE spip_urls CHANGE `maj` date DATETIME DEFAULT '0000-00-00 00:00:00' NOT NULL") - ); + array('sql_alter', "TABLE spip_urls CHANGE `maj` date DATETIME DEFAULT '0000-00-00 00:00:00' NOT NULL") + ); +} // la mise a jour vers 1.938 contient une erreur // il faut supprimer l'autoincrement avant de supprimer la PRIMARY KEY @@ -476,11 +531,11 @@ $GLOBALS['maj'][1938] = array( # supprimer l'ancien champ et son index array('sql_alter', "TABLE spip_documents DROP INDEX `id_type`, DROP `id_type`"), ## supprimer l'autoincrement avant de supprimer la PRIMARY KEY - array('sql_alter', "TABLE spip_types_documents CHANGE `id_type` `id_type` BIGINT( 21 ) NOT NULL ") , + array('sql_alter', "TABLE spip_types_documents CHANGE `id_type` `id_type` BIGINT( 21 ) NOT NULL "), # le champ id_type devient superflu array('sql_alter', "TABLE spip_types_documents DROP `id_type`"), array('sql_alter', "TABLE spip_types_documents ADD PRIMARY KEY (`extension`)") - ); +); // PG veut une valeur par defaut a l'insertion @@ -488,8 +543,11 @@ $GLOBALS['maj'][1938] = array( $GLOBALS['maj'][1957] = array( array('sql_alter', "TABLE spip_mots CHANGE `id_groupe` `id_groupe` bigint(21) DEFAULT 0 NOT NULL"), - array('sql_alter', "TABLE spip_documents CHANGE `mode` `mode` ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL") - ); + array( + 'sql_alter', + "TABLE spip_documents CHANGE `mode` `mode` ENUM('vignette', 'image', 'document') DEFAULT 'document' NOT NULL" + ) +); // Ce champ est inutile et provoque une erreur a l'insertion qui l'oublie $GLOBALS['maj'][1958] = array( diff --git a/ecrire/maj/v019_pre193.php b/ecrire/maj/v019_pre193.php index 51550454c9..7d45186e3c 100644 --- a/ecrire/maj/v019_pre193.php +++ b/ecrire/maj/v019_pre193.php @@ -12,19 +12,20 @@ /** * Gestion des mises à jour de SPIP, versions 1.9* - * + * * @package SPIP\Core\SQL\Upgrade -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Mises à jour de SPIP n°019 - * + * * @param float $version_installee Version actuelle - * @param float $version_cible Version de destination -**/ -function v019_pre193($version_installee, $version_cible) -{ + * @param float $version_cible Version de destination + **/ +function v019_pre193($version_installee, $version_cible) { // Syndication : ajout de l'option resume=oui/non et de la langue if (upgrade_vers(1.901, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_syndic ADD `resume` VARCHAR(3) DEFAULT 'oui'"); @@ -66,47 +67,47 @@ function v019_pre193($version_installee, $version_cible) spip_query("ALTER TABLE spip_meta CHANGE `valeur` `valeur` TEXT"); // table des correspondances table->id_table $liste_tables = array(); - $liste_tables[1]='spip_articles'; - $liste_tables[2]='spip_auteurs'; - $liste_tables[3]='spip_breves'; - $liste_tables[4]='spip_documents'; - $liste_tables[5]='spip_forum'; - $liste_tables[6]='spip_mots'; - $liste_tables[7]='spip_rubriques'; - $liste_tables[8]='spip_signatures'; - $liste_tables[9]='spip_syndic'; + $liste_tables[1] = 'spip_articles'; + $liste_tables[2] = 'spip_auteurs'; + $liste_tables[3] = 'spip_breves'; + $liste_tables[4] = 'spip_documents'; + $liste_tables[5] = 'spip_forum'; + $liste_tables[6] = 'spip_mots'; + $liste_tables[7] = 'spip_rubriques'; + $liste_tables[8] = 'spip_signatures'; + $liste_tables[9] = 'spip_syndic'; ecrire_meta('index_table', serialize($liste_tables)); ## devenu inutile car suppression totale de l'indexation -/* - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_article` as id_objet,'1' as id_table FROM spip_index_articles"); - spip_query("DROP TABLE IF EXISTS spip_index_articles"); + /* + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_article` as id_objet,'1' as id_table FROM spip_index_articles"); + spip_query("DROP TABLE IF EXISTS spip_index_articles"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_auteur` as id_objet,'2' as id_table FROM spip_index_auteurs"); - spip_query("DROP TABLE IF EXISTS spip_index_auteurs"); + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_auteur` as id_objet,'2' as id_table FROM spip_index_auteurs"); + spip_query("DROP TABLE IF EXISTS spip_index_auteurs"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_breve` as id_objet,'3' as id_table FROM spip_index_breves"); - spip_query("DROP TABLE IF EXISTS spip_index_breves"); + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_breve` as id_objet,'3' as id_table FROM spip_index_breves"); + spip_query("DROP TABLE IF EXISTS spip_index_breves"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_document` as id_objet,'4' as id_table FROM spip_index_documents"); - spip_query("DROP TABLE IF EXISTS spip_index_documents"); + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_document` as id_objet,'4' as id_table FROM spip_index_documents"); + spip_query("DROP TABLE IF EXISTS spip_index_documents"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_forum` as id_objet,'5' as id_table FROM spip_index_forum"); - spip_query("DROP TABLE IF EXISTS spip_index_forum"); + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_forum` as id_objet,'5' as id_table FROM spip_index_forum"); + spip_query("DROP TABLE IF EXISTS spip_index_forum"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_mot` as id_objet,'6' as id_table FROM spip_index_mots"); - spip_query("DROP TABLE IF EXISTS spip_index_mots"); + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_mot` as id_objet,'6' as id_table FROM spip_index_mots"); + spip_query("DROP TABLE IF EXISTS spip_index_mots"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_rubrique` as id_objet,'7' as id_table FROM spip_index_rubriques"); - spip_query("DROP TABLE IF EXISTS spip_index_rubriques"); + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_rubrique` as id_objet,'7' as id_table FROM spip_index_rubriques"); + spip_query("DROP TABLE IF EXISTS spip_index_rubriques"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_signature` as id_objet,'8' as id_table FROM spip_index_signatures"); - spip_query("DROP TABLE IF EXISTS spip_index_signatures"); + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_signature` as id_objet,'8' as id_table FROM spip_index_signatures"); + spip_query("DROP TABLE IF EXISTS spip_index_signatures"); - spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_syndic` as id_objet,'9' as `id_table FROM spip_index_syndic"); - spip_query("DROP TABLE IF EXISTS spip_index_syndic"); -*/ + spip_query("INSERT INTO spip_index (`hash`,`points`,`id_objet`,`id_table`) SELECT `hash`,`points`,`id_syndic` as id_objet,'9' as `id_table FROM spip_index_syndic"); + spip_query("DROP TABLE IF EXISTS spip_index_syndic"); + */ maj_version(1.905); } @@ -166,12 +167,12 @@ function v019_pre193($version_installee, $version_cible) // Le logo du site n'est plus le logo par defaut des rubriques // mais pour assurer la compatibilite ascendante, on le duplique if (upgrade_vers(1.912, $version_installee, $version_cible)) { - @copy(_DIR_LOGOS.'rubon0.gif', _DIR_LOGOS.'siteon0.gif'); - @copy(_DIR_LOGOS.'ruboff0.gif', _DIR_LOGOS.'siteoff0.gif'); - @copy(_DIR_LOGOS.'rubon0.jpg', _DIR_LOGOS.'siteon0.jpg'); - @copy(_DIR_LOGOS.'ruboff0.jpg', _DIR_LOGOS.'siteoff0.jpg'); - @copy(_DIR_LOGOS.'rubon0.png', _DIR_LOGOS.'siteon0.png'); - @copy(_DIR_LOGOS.'ruboff0.png', _DIR_LOGOS.'siteoff0.png'); + @copy(_DIR_LOGOS . 'rubon0.gif', _DIR_LOGOS . 'siteon0.gif'); + @copy(_DIR_LOGOS . 'ruboff0.gif', _DIR_LOGOS . 'siteoff0.gif'); + @copy(_DIR_LOGOS . 'rubon0.jpg', _DIR_LOGOS . 'siteon0.jpg'); + @copy(_DIR_LOGOS . 'ruboff0.jpg', _DIR_LOGOS . 'siteoff0.jpg'); + @copy(_DIR_LOGOS . 'rubon0.png', _DIR_LOGOS . 'siteon0.png'); + @copy(_DIR_LOGOS . 'ruboff0.png', _DIR_LOGOS . 'siteoff0.png'); maj_version(1.912); } @@ -231,18 +232,44 @@ function v019_pre193($version_installee, $version_cible) } if (upgrade_vers(1.922, $version_installee, $version_cible)) { spip_query("ALTER TABLE spip_meta ADD `impt` ENUM('non', 'oui') DEFAULT 'oui' NOT NULL AFTER `valeur`"); - $meta_serveur = array('version_installee','adresse_site','alea_ephemere_ancien','alea_ephemere','alea_ephemere_date','langue_site','langues_proposees','date_calcul_rubriques','derniere_modif','optimiser_table','drapeau_edition','creer_preview','taille_preview','creer_htpasswd','creer_htaccess','gd_formats_read','gd_formats', - 'netpbm_formats','formats_graphiques','image_process','plugin_header','plugin'); - foreach($meta_serveur as $nom) - spip_query("UPDATE spip_meta SET `impt`='non' WHERE `nom`="._q($nom)); + $meta_serveur = array( + 'version_installee', + 'adresse_site', + 'alea_ephemere_ancien', + 'alea_ephemere', + 'alea_ephemere_date', + 'langue_site', + 'langues_proposees', + 'date_calcul_rubriques', + 'derniere_modif', + 'optimiser_table', + 'drapeau_edition', + 'creer_preview', + 'taille_preview', + 'creer_htpasswd', + 'creer_htaccess', + 'gd_formats_read', + 'gd_formats', + 'netpbm_formats', + 'formats_graphiques', + 'image_process', + 'plugin_header', + 'plugin' + ); + foreach ($meta_serveur as $nom) { + spip_query("UPDATE spip_meta SET `impt`='non' WHERE `nom`=" . _q($nom)); + } maj_version('1.922'); } if (upgrade_vers(1.923, $version_installee, $version_cible)) { - if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])){ + if (isset($GLOBALS['meta']['IMPORT_tables_noimport'])) { $IMPORT_tables_noimport = unserialize($GLOBALS['meta']['IMPORT_tables_noimport']); - foreach ($IMPORT_tables_noimport as $key=>$table) - if ($table=='spip_meta') unset($IMPORT_tables_noimport[$key]); - ecrire_meta('IMPORT_tables_noimport',serialize($IMPORT_tables_noimport),'non'); + foreach ($IMPORT_tables_noimport as $key => $table) { + if ($table == 'spip_meta') { + unset($IMPORT_tables_noimport[$key]); + } + } + ecrire_meta('IMPORT_tables_noimport', serialize($IMPORT_tables_noimport), 'non'); } maj_version('1.923'); } @@ -257,49 +284,51 @@ function v019_pre193($version_installee, $version_cible) /* deplacement des sessions */ $f_session = preg_files('data', 'session_'); $repertoire = _DIR_SESSIONS; - if(!@file_exists($repertoire)) { - $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire); + if (!@file_exists($repertoire)) { + $repertoire = preg_replace(',' . _DIR_TMP . ',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } - foreach($f_session as $f) { + foreach ($f_session as $f) { $d = basename($f); - @copy($f, $repertoire.$d); + @copy($f, $repertoire . $d); } /* deplacement des visites */ $f_visites = preg_files('data/visites'); $repertoire = sous_repertoire(_DIR_TMP, 'visites'); - foreach($f_visites as $f) { + foreach ($f_visites as $f) { $d = basename($f); - @copy($f, $repertoire.$d); + @copy($f, $repertoire . $d); } /* deplacement des upload */ $auteurs = array(); $req = spip_query("SELECT `login` FROM spip_auteurs WHERE `statut` = '0minirezo'"); - while($row = sql_fetch($req)) - $auteurs[] = $row['login']; + while ($row = sql_fetch($req)) { + $auteurs[] = $row['login']; + } $f_upload = preg_files('upload', -1, 10000, $auteurs); $repertoire = _DIR_TRANSFERT; - if(!@file_exists($repertoire)) { - $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire); + if (!@file_exists($repertoire)) { + $repertoire = preg_replace(',' . _DIR_TMP . ',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } - foreach($auteurs as $login) { - if(is_dir('upload/'.$login)) + foreach ($auteurs as $login) { + if (is_dir('upload/' . $login)) { $sous_repertoire = sous_repertoire(_DIR_TRANSFERT, $login); + } } - foreach($f_upload as $f) { - @copy($f, _DIR_TMP.$f); + foreach ($f_upload as $f) { + @copy($f, _DIR_TMP . $f); } /* deplacement des dumps */ $f_session = preg_files('data', 'dump'); $repertoire = _DIR_DUMP; - if(!@file_exists($repertoire)) { - $repertoire = preg_replace(','._DIR_TMP.',', '', $repertoire); + if (!@file_exists($repertoire)) { + $repertoire = preg_replace(',' . _DIR_TMP . ',', '', $repertoire); $repertoire = sous_repertoire(_DIR_TMP, $repertoire); } - foreach($f_session as $f) { + foreach ($f_session as $f) { $d = basename($f); - @copy($f, $repertoire.$d); + @copy($f, $repertoire . $d); } maj_version('1.925'); } @@ -310,4 +339,5 @@ function v019_pre193($version_installee, $version_cible) maj_version('1.926'); } } + ?> diff --git a/ecrire/notifications/instituerarticle.php b/ecrire/notifications/instituerarticle.php index 74588d17aa..087fd10798 100644 --- a/ecrire/notifications/instituerarticle.php +++ b/ecrire/notifications/instituerarticle.php @@ -7,7 +7,9 @@ */ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Fonction appelee par divers pipelines // http://code.spip.net/@notifications_instituerarticle_dist @@ -15,7 +17,8 @@ function notifications_instituerarticle_dist($quoi, $id_article, $options) { // ne devrait jamais se produire if ($options['statut'] == $options['statut_ancien']) { - spip_log("statut inchange",'notifications'); + spip_log("statut inchange", 'notifications'); + return; } @@ -23,27 +26,32 @@ function notifications_instituerarticle_dist($quoi, $id_article, $options) { $modele = ""; if ($options['statut'] == 'publie') { - if ($GLOBALS['meta']["post_dates"]=='non' - AND strtotime($options['date'])>time()) + if ($GLOBALS['meta']["post_dates"] == 'non' + AND strtotime($options['date']) > time() + ) { $modele = "notifications/article_valide"; - else + } else { $modele = "notifications/article_publie"; + } } - if ($options['statut'] == 'prop' AND $options['statut_ancien'] != 'publie') + if ($options['statut'] == 'prop' AND $options['statut_ancien'] != 'publie') { $modele = "notifications/article_propose"; + } - if ($modele){ + if ($modele) { $destinataires = array(); - if ($GLOBALS['meta']["suivi_edito"] == "oui") - $destinataires = explode(',',$GLOBALS['meta']["adresse_suivi"]); + if ($GLOBALS['meta']["suivi_edito"] == "oui") { + $destinataires = explode(',', $GLOBALS['meta']["adresse_suivi"]); + } $destinataires = pipeline('notifications_destinataires', array( - 'args'=>array('quoi'=>$quoi,'id'=>$id_article,'options'=>$options) + 'args' => array('quoi' => $quoi, 'id' => $id_article, 'options' => $options) , - 'data'=>$destinataires) + 'data' => $destinataires + ) ); $texte = email_notification_article($id_article, $modele); diff --git a/ecrire/oo/index.php b/ecrire/oo/index.php index b9e5f7d4af..6571d5ad64 100644 --- a/ecrire/oo/index.php +++ b/ecrire/oo/index.php @@ -8,8 +8,9 @@ * * @see ecrire/action/preferer.php * @see prive/formulaires/configurer_preferences.php - * + * * @package SPIP\Core\Auteurs\Preferences -**/ + **/ -header("Location: ../?action=preferer&arg=display:4&redirect=" . urlencode(str_replace('/oo','', $_SERVER['REQUEST_URI']))); +header("Location: ../?action=preferer&arg=display:4&redirect=" . urlencode(str_replace('/oo', '', + $_SERVER['REQUEST_URI']))); diff --git a/ecrire/plugins/afficher_liste.php b/ecrire/plugins/afficher_liste.php index 07c9a8d742..4ac13156cc 100644 --- a/ecrire/plugins/afficher_liste.php +++ b/ecrire/plugins/afficher_liste.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); /** @@ -25,30 +27,37 @@ include_spip('inc/charsets'); * @param string $afficher_un * @return string */ -function plugins_afficher_liste_dist($url_page, $liste_plugins, $liste_plugins_checked, $liste_plugins_actifs, $dir_plugins = _DIR_PLUGINS, $afficher_un = 'afficher_plugin'){ - $get_infos = charger_fonction('get_infos','plugins'); - $ligne_plug = charger_fonction($afficher_un,'plugins'); +function plugins_afficher_liste_dist( + $url_page, + $liste_plugins, + $liste_plugins_checked, + $liste_plugins_actifs, + $dir_plugins = _DIR_PLUGINS, + $afficher_un = 'afficher_plugin' +) { + $get_infos = charger_fonction('get_infos', 'plugins'); + $ligne_plug = charger_fonction($afficher_un, 'plugins'); $all_infos = $get_infos($liste_plugins, false, $dir_plugins); $all_infos = pipeline('filtrer_liste_plugins', - array( - 'args'=>array( - 'liste_plugins'=>$liste_plugins, - 'liste_plugins_checked'=>$liste_plugins_checked, - 'liste_plugins_actifs'=>$liste_plugins_actifs, - 'dir_plugins'=>$dir_plugins), - 'data'=>$all_infos - ) - ); + array( + 'args' => array( + 'liste_plugins' => $liste_plugins, + 'liste_plugins_checked' => $liste_plugins_checked, + 'liste_plugins_actifs' => $liste_plugins_actifs, + 'dir_plugins' => $dir_plugins + ), + 'data' => $all_infos + ) + ); $liste_plugins = array_flip($liste_plugins); - foreach($liste_plugins as $chemin => $v) { + foreach ($liste_plugins as $chemin => $v) { // des plugins ont pu etre enleves de la liste par le pipeline. On en tient compte. - if (isset($all_infos[$chemin])){ + if (isset($all_infos[$chemin])) { $liste_plugins[$chemin] = strtoupper(trim(typo(translitteration(unicode2charset(html2unicode($all_infos[$chemin]['nom'])))))); - } - else { + } else { unset($liste_plugins[$chemin]); } } @@ -58,18 +67,20 @@ function plugins_afficher_liste_dist($url_page, $liste_plugins, $liste_plugins_c $block_par_lettre = false;//count($liste_plugins)>10; $fast_liste_plugins_actifs = array(); $fast_liste_plugins_checked = array(); - if (is_array($liste_plugins_actifs)) + if (is_array($liste_plugins_actifs)) { $fast_liste_plugins_actifs = array_flip($liste_plugins_actifs); - if (is_array($liste_plugins_checked)) + } + if (is_array($liste_plugins_checked)) { $fast_liste_plugins_checked = array_flip($liste_plugins_checked); + } $res = ''; $block = ''; $initiale = ''; $block_actif = false; - foreach($liste_plugins as $plug => $nom){ - if (($i=substr($nom,0,1))!==$initiale){ - $res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block; + foreach ($liste_plugins as $plug => $nom) { + if (($i = substr($nom, 0, 1)) !== $initiale) { + $res .= $block_par_lettre ? affiche_block_initiale($initiale, $block, $block_actif) : $block; $initiale = $i; $block = ''; $block_actif = false; @@ -78,25 +89,28 @@ function plugins_afficher_liste_dist($url_page, $liste_plugins, $liste_plugins_c $actif = isset($fast_liste_plugins_actifs[$plug]); $checked = isset($fast_liste_plugins_checked[$plug]); $block_actif = $block_actif | $actif; - $expose = ($exposed AND ($exposed==$plug OR $exposed==$dir_plugins . $plug OR $exposed==substr($dir_plugins,strlen(_DIR_RACINE)) . $plug)); - $block .= $ligne_plug($url_page, $plug, $checked, $actif, $expose, "item", $dir_plugins)."\n"; + $expose = ($exposed AND ($exposed == $plug OR $exposed == $dir_plugins . $plug OR $exposed == substr($dir_plugins, + strlen(_DIR_RACINE)) . $plug)); + $block .= $ligne_plug($url_page, $plug, $checked, $actif, $expose, "item", $dir_plugins) . "\n"; } - $res .= $block_par_lettre ? affiche_block_initiale($initiale,$block,$block_actif): $block; + $res .= $block_par_lettre ? affiche_block_initiale($initiale, $block, $block_actif) : $block; $class = basename($dir_plugins); + return $res ? "<ul class='liste-items plugins $class'>$res</ul>" : ""; } // http://code.spip.net/@affiche_block_initiale -function affiche_block_initiale($initiale, $block, $block_actif){ - if (strlen($block)){ +function affiche_block_initiale($initiale, $block, $block_actif) { + if (strlen($block)) { return "<li class='item'>" - . bouton_block_depliable($initiale,$block_actif?true:false) - . debut_block_depliable($block_actif) - . "<ul>$block</ul>" - . fin_block() - . "</li>"; + . bouton_block_depliable($initiale, $block_actif ? true : false) + . debut_block_depliable($block_actif) + . "<ul>$block</ul>" + . fin_block() + . "</li>"; } + return ""; } diff --git a/ecrire/plugins/afficher_nom_plugin.php b/ecrire/plugins/afficher_nom_plugin.php index b84840403d..ed1caed325 100644 --- a/ecrire/plugins/afficher_nom_plugin.php +++ b/ecrire/plugins/afficher_nom_plugin.php @@ -10,32 +10,43 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); include_spip('inc/texte'); include_spip('plugins/afficher_plugin'); // http://code.spip.net/@ligne_plug -function plugins_afficher_nom_plugin_dist($url_page, $plug_file, $checked, $actif, $expose = false, $class_li = "item", $dir_plugins = _DIR_PLUGINS){ - static $id_input=0; +function plugins_afficher_nom_plugin_dist( + $url_page, + $plug_file, + $checked, + $actif, + $expose = false, + $class_li = "item", + $dir_plugins = _DIR_PLUGINS +) { + static $id_input = 0; static $versions = array(); $erreur = false; $s = ""; - $get_infos = charger_fonction('get_infos','plugins'); + $get_infos = charger_fonction('get_infos', 'plugins'); $info = $get_infos($plug_file, false, $dir_plugins); // numerotons les occurences d'un meme prefix - $versions[$info['prefix']] = isset($versions[$info['prefix']]) ? $versions[$info['prefix']] + 1 : ''; + $versions[$info['prefix']] = isset($versions[$info['prefix']]) ? $versions[$info['prefix']]+1 : ''; $id = $info['prefix'] . $versions[$info['prefix']]; - + $class = $class_li; - $class .= $actif?" actif":""; - $class .= $expose?" on":""; + $class .= $actif ? " actif" : ""; + $class .= $expose ? " on" : ""; $erreur = isset($info['erreur']); - if ($erreur) + if ($erreur) { $class .= " error"; + } $s .= "<li id='$id' class='$class'>"; // Cartouche Resume @@ -44,18 +55,19 @@ function plugins_afficher_nom_plugin_dist($url_page, $plug_file, $checked, $acti $prefix = $info['prefix']; $dir = "$dir_plugins$plug_file/lang/$prefix"; $desc = plugin_propre($info['description'], $dir); - $url_stat = parametre_url($url_page, "plugin",$dir_plugins.$plug_file); + $url_stat = parametre_url($url_page, "plugin", $dir_plugins . $plug_file); - $s .= "<strong class='nom'>".typo($info['nom'])."</strong>"; - $s .= " <span class='version'>".$info['version']."</span>"; - $s .= " <span class='etat'> - ".plugin_etat_en_clair($info['etat'])."</span>"; + $s .= "<strong class='nom'>" . typo($info['nom']) . "</strong>"; + $s .= " <span class='version'>" . $info['version'] . "</span>"; + $s .= " <span class='etat'> - " . plugin_etat_en_clair($info['etat']) . "</span>"; $s .= "</div>"; - if ($erreur){ + if ($erreur) { $s .= "<div class='erreur'>" . join('<br >', $info['erreur']) . "</div>"; } $s .= "</li>"; + return $s; } diff --git a/ecrire/plugins/afficher_plugin.php b/ecrire/plugins/afficher_plugin.php index 875200b56e..6a7628bced 100644 --- a/ecrire/plugins/afficher_plugin.php +++ b/ecrire/plugins/afficher_plugin.php @@ -14,168 +14,192 @@ * Fonctions pour l'affichage des informations de plugins * * @package SPIP\Core\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); include_spip('inc/texte'); include_spip('inc/plugin'); // pour plugin_est_installe // http://code.spip.net/@ligne_plug -function plugins_afficher_plugin_dist($url_page, $plug_file, $checked, $actif, $expose = false, $class_li = "item", $dir_plugins = _DIR_PLUGINS) { +function plugins_afficher_plugin_dist( + $url_page, + $plug_file, + $checked, + $actif, + $expose = false, + $class_li = "item", + $dir_plugins = _DIR_PLUGINS +) { static $id_input = 0; static $versions = array(); - $force_reload = (_request('var_mode')=='recalcul'); - $get_infos = charger_fonction('get_infos','plugins'); + $force_reload = (_request('var_mode') == 'recalcul'); + $get_infos = charger_fonction('get_infos', 'plugins'); $info = $get_infos($plug_file, $force_reload, $dir_plugins); $prefix = $info['prefix']; $cfg = ""; - $checkable = ($dir_plugins!==_DIR_PLUGINS_DIST); - $nom = plugin_nom($info,$dir_plugins,$plug_file); + $checkable = ($dir_plugins !== _DIR_PLUGINS_DIST); + $nom = plugin_nom($info, $dir_plugins, $plug_file); $erreur = ""; - if (!plugin_version_compatible($info['compatibilite'], $GLOBALS['spip_version_branche'],'spip')){ + if (!plugin_version_compatible($info['compatibilite'], $GLOBALS['spip_version_branche'], 'spip')) { $info['slogan'] = _T('plugin_info_non_compatible_spip'); - $erreur = http_img_pack("plugin-dis-32.png",_T('plugin_info_non_compatible_spip')," class='picto_err'",_T('plugin_info_non_compatible_spip')); + $erreur = http_img_pack("plugin-dis-32.png", _T('plugin_info_non_compatible_spip'), " class='picto_err'", + _T('plugin_info_non_compatible_spip')); $class_li .= " disabled"; $checkable = false; - } - elseif (isset($info['erreur'])) { + } elseif (isset($info['erreur'])) { $class_li .= " error"; - $erreur = http_img_pack("plugin-err-32.png",_T('plugin_info_erreur_xml')," class='picto_err'",_T('plugin_info_erreur_xml')) - . "<div class='erreur'>" . join('<br >', $info['erreur']) . "</div>"; + $erreur = http_img_pack("plugin-err-32.png", _T('plugin_info_erreur_xml'), " class='picto_err'", + _T('plugin_info_erreur_xml')) + . "<div class='erreur'>" . join('<br >', $info['erreur']) . "</div>"; $checkable = false; - } - elseif (isset($GLOBALS['erreurs_activation_raw'][$dir_plugins.$plug_file])){ + } elseif (isset($GLOBALS['erreurs_activation_raw'][$dir_plugins . $plug_file])) { $class_li .= " error"; - $erreur = http_img_pack("plugin-err-32.png",_T('plugin_impossible_activer', array('plugin' => $nom))," class='picto_err'",_T('plugin_impossible_activer', array('plugin' => $nom))) - . "<div class='erreur'>" . implode("<br />",$GLOBALS['erreurs_activation_raw'][$dir_plugins.$plug_file]) . "</div>"; + $erreur = http_img_pack("plugin-err-32.png", _T('plugin_impossible_activer', array('plugin' => $nom)), + " class='picto_err'", _T('plugin_impossible_activer', array('plugin' => $nom))) + . "<div class='erreur'>" . implode("<br />", + $GLOBALS['erreurs_activation_raw'][$dir_plugins . $plug_file]) . "</div>"; + } else { + $cfg = $actif ? plugin_bouton_config($plug_file, $info, $dir_plugins) : ""; } - else - $cfg = $actif ? plugin_bouton_config($plug_file,$info,$dir_plugins) : ""; // numerotons les occurrences d'un meme prefix - $versions[$prefix] = $id = isset($versions[$prefix]) ? $versions[$prefix] + 1 : ''; + $versions[$prefix] = $id = isset($versions[$prefix]) ? $versions[$prefix]+1 : ''; + + $class_li .= ($actif ? " actif" : "") . ($expose ? " on" : ""); - $class_li .= ($actif?" actif":"") . ($expose?" on":""); return "<li id='$prefix$id' class='$class_li'>" . ((!$checkable AND !$checked) - ? '': plugin_checkbox(++$id_input, $dir_plugins.$plug_file, $checked)) - . plugin_resume($info, $dir_plugins, $plug_file, $url_page) + ? '' : plugin_checkbox(++$id_input, $dir_plugins . $plug_file, $checked)) + . plugin_resume($info, $dir_plugins, $plug_file, $url_page) . $cfg . $erreur - . (($dir_plugins!==_DIR_PLUGINS_DIST AND plugin_est_installe($plug_file)) - ? plugin_desintalle($plug_file,$nom,$dir_plugins) : '') + . (($dir_plugins !== _DIR_PLUGINS_DIST AND plugin_est_installe($plug_file)) + ? plugin_desintalle($plug_file, $nom, $dir_plugins) : '') . "<div class='details'>" // pour l'ajax de exec/info_plugin . (!$expose ? '' : affiche_bloc_plugin($plug_file, $info, $dir_plugins)) . "</div>" - ."</li>"; + . "</li>"; } -function plugin_bouton_config($nom, $infos, $dir) -{ +function plugin_bouton_config($nom, $infos, $dir) { // la verification se base sur le filesystem // il faut donc n'utiliser que des minuscules, par convention $prefix = strtolower($infos['prefix']); // si plugin.xml fournit un squelette, le prendre - if (isset($infos['config']) and $infos['config']) + if (isset($infos['config']) and $infos['config']) { return recuperer_fond("$dir$nom/" . $infos['config'], - array('script' => 'configurer_' . $prefix, - 'nom' => $nom)); + array( + 'script' => 'configurer_' . $prefix, + 'nom' => $nom + )); + } // si le plugin CFG est la, l'essayer - if (defined('_DIR_PLUGIN_CFG')) { + if (defined('_DIR_PLUGIN_CFG')) { if (include_spip('inc/cfg')) // test CFG version >= 1.0.5 - if ($cfg = icone_lien_cfg("$dir$nom", "cfg")) + { + if ($cfg = icone_lien_cfg("$dir$nom", "cfg")) { return "<div class='cfg_link'>$cfg</div>"; + } + } } // sinon prendre le squelette std sur le nom std return recuperer_fond("prive/squelettes/inclure/cfg", - array('script' => 'configurer_' . $prefix, - 'nom' => $nom)); + array( + 'script' => 'configurer_' . $prefix, + 'nom' => $nom + )); } // checkbox pour activer ou desactiver // si ce n'est pas une extension -function plugin_checkbox($id_input, $file, $actif) -{ - $name = substr(md5($file),0,16); +function plugin_checkbox($id_input, $file, $actif) { + $name = substr(md5($file), 0, 16); return "<div class='check'>\n" . "<input type='checkbox' name='s$name' id='label_$id_input'" - . ($actif?" checked='checked'":"") + . ($actif ? " checked='checked'" : "") . " class='checkbox' value='O' />" - . "\n<label for='label_$id_input'>"._T('activer_plugin')."</label>" + . "\n<label for='label_$id_input'>" . _T('activer_plugin') . "</label>" . "</div>"; } -function plugin_nom($info, $dir_plugins, $plug_file){ +function plugin_nom($info, $dir_plugins, $plug_file) { $prefix = $info['prefix']; $dir = "$dir_plugins$plug_file"; // Si dtd paquet, on traite le nom soit par son item de langue soit par sa valeur immediate a l'index "nom" if ($info['dtd'] == "paquet") { $nom = PtoBR(plugin_propre("{$prefix}_nom", "$dir/lang/paquet-$prefix")); - if (!$nom) + if (!$nom) { $nom = PtoBR(propre($info['nom'])); - } - else + } + } else { $nom = typo(attribut_html($info['nom'])); + } return trim($nom); } // Cartouche Resume -function plugin_resume($info, $dir_plugins, $plug_file, $url_page){ +function plugin_resume($info, $dir_plugins, $plug_file, $url_page) { $prefix = $info['prefix']; $dir = "$dir_plugins$plug_file"; $slogan = PtoBR(plugin_propre($info['slogan'], "$dir/lang/paquet-$prefix")); // une seule ligne dans le slogan : couper si besoin - if (($p=strpos($slogan, "<br />"))!==FALSE) - $slogan = substr($slogan, 0,$p); + if (($p = strpos($slogan, "<br />")) !== false) { + $slogan = substr($slogan, 0, $p); + } // couper par securite $slogan = couper($slogan, 80); $nom = plugin_nom($info, $dir_plugins, $plug_file); - $url = parametre_url($url_page, "plugin", substr($dir,strlen(_DIR_RACINE))); + $url = parametre_url($url_page, "plugin", substr($dir, strlen(_DIR_RACINE))); if (isset($info['logo']) and $i = trim($info['logo'])) { include_spip("inc/filtres_images_mini"); - $i = inserer_attribut(image_reduire("$dir/$i", 32),'alt',''); + $i = inserer_attribut(image_reduire("$dir/$i", 32), 'alt', ''); $i = "<div class='icon'><a href='$url' rel='info'>$i</a></div>"; - } else $i = ''; + } else { + $i = ''; + } return "<div class='resume'>" . "<h3><a href='$url' rel='info'>" . $nom . "</a></h3>" - . " <span class='version'>".$info['version']."</span>" + . " <span class='version'>" . $info['version'] . "</span>" . " <span class='etat'> - " . plugin_etat_en_clair($info['etat']) . "</span>" - . "<div class='short'>".$slogan."</div>" + . "<div class='short'>" . $slogan . "</div>" . $i . "</div>"; } -function plugin_desintalle($plug_file, $nom, $dir_plugins = null){ - if (!$dir_plugins) +function plugin_desintalle($plug_file, $nom, $dir_plugins = null) { + if (!$dir_plugins) { $dir_plugins = _DIR_PLUGINS; + } - $action = redirige_action_auteur('desinstaller_plugin',"$dir_plugins::$plug_file",'admin_plugin'); + $action = redirige_action_auteur('desinstaller_plugin', "$dir_plugins::$plug_file", 'admin_plugin'); $text = _T('bouton_desinstaller'); $text2 = _T('info_desinstaller_plugin'); $file = basename($plug_file); - return "<div class='actions'>[". - "<a href='$action' + return "<div class='actions'>[" . + "<a href='$action' onclick='return confirm(\"$text $nom ?\\n$text2\")'>" - . $text - . "</a>]</div>" ; + . $text + . "</a>]</div>"; } /** @@ -187,30 +211,34 @@ function plugin_desintalle($plug_file, $nom, $dir_plugins = null){ * Le type d'état (stable, test, ...) * @return string * Traduction de l'état dans la langue en cours -**/ -function plugin_etat_en_clair($etat){ - if (!in_array($etat,array('stable','test','experimental'))) + **/ +function plugin_etat_en_clair($etat) { + if (!in_array($etat, array('stable', 'test', 'experimental'))) { $etat = 'developpement'; - return _T('plugin_etat_'.$etat); + } + + return _T('plugin_etat_' . $etat); } // http://code.spip.net/@plugin_propre function plugin_propre($texte, $module = '') { // retirer le retour a la racine du module, car le find_in_path se fait depuis la racine - if (_DIR_RACINE AND strncmp($module,_DIR_RACINE,strlen(_DIR_RACINE))==0) - $module = substr($module,strlen(_DIR_RACINE)); + if (_DIR_RACINE AND strncmp($module, _DIR_RACINE, strlen(_DIR_RACINE)) == 0) { + $module = substr($module, strlen(_DIR_RACINE)); + } if (preg_match("|^\w+_[\w_]+$|", $texte)) { $texte = _T(($module ? "$module:" : '') . $texte, array(), array('force' => false)); } + return propre($texte); } - // http://code.spip.net/@affiche_bloc_plugin function affiche_bloc_plugin($plug_file, $info, $dir_plugins = null) { - if (!$dir_plugins) + if (!$dir_plugins) { $dir_plugins = _DIR_PLUGINS; + } $prefix = $info['prefix']; $dir = "$dir_plugins$plug_file/lang/paquet-$prefix"; @@ -219,38 +247,48 @@ function affiche_bloc_plugin($plug_file, $info, $dir_plugins = null) { // TODO: le traiter_multi ici n'est pas beau // cf. description du plugin/_stable_/ortho/plugin.xml $description = ""; - if (isset($info['description'])) + if (isset($info['description'])) { $description = plugin_propre($info['description'], $dir); + } if (isset($info['documentation']) - AND $lien = $info['documentation']){ - $description .= "<p><em class='site'><a href='$lien' class='spip_out'>" . _T('en_savoir_plus') .'</a></em></p>'; + AND $lien = $info['documentation'] + ) { + $description .= "<p><em class='site'><a href='$lien' class='spip_out'>" . _T('en_savoir_plus') . '</a></em></p>'; } - $s .= "<dd class='desc'>".$description."</dd>\n"; + $s .= "<dd class='desc'>" . $description . "</dd>\n"; - if (isset($info['auteur'])){ - if (is_array($info['auteur'])) + if (isset($info['auteur'])) { + if (is_array($info['auteur'])) { $a = formater_credits($info['auteur'], ', '); - // pour compat mais ne doit plus arriver - else + } // pour compat mais ne doit plus arriver + else { $a = trim($info['auteur']); - if ($a) - $s .= "<dt class='auteurs'>" . _T('public:par_auteur') ."</dt><dd class='auteurs'>". PtoBR(propre($a, $dir)) . "</dd>\n"; + } + if ($a) { + $s .= "<dt class='auteurs'>" . _T('public:par_auteur') . "</dt><dd class='auteurs'>" . PtoBR(propre($a, + $dir)) . "</dd>\n"; + } } - if (isset($info['credit'])){ - if ($a = formater_credits($info['credit'], ', ')) - $s .= "<dt class='credits'>" . _T('plugin_info_credit') ."</dt><dd class='credits'>". PtoBR(propre($a, $dir)) . "</dd>\n"; + if (isset($info['credit'])) { + if ($a = formater_credits($info['credit'], ', ')) { + $s .= "<dt class='credits'>" . _T('plugin_info_credit') . "</dt><dd class='credits'>" . PtoBR(propre($a, + $dir)) . "</dd>\n"; + } } if (isset($info['licence'])) { - if (is_array($info['licence'])) + if (is_array($info['licence'])) { $a = formater_credits($info['licence'], ', '); - // pour compat mais ne doit plus arriver - else + } // pour compat mais ne doit plus arriver + else { $a = trim($info['licence']); - if ($a) - $s .= "<dt class='licence'>" . _T('intitule_licence') ."</dt><dd class='licence'>". PtoBR(propre($a, $dir)) . "</dd>\n"; + } + if ($a) { + $s .= "<dt class='licence'>" . _T('intitule_licence') . "</dt><dd class='licence'>" . PtoBR(propre($a, + $dir)) . "</dd>\n"; + } } $s = "<dl class='description'>$s</dl>"; @@ -260,25 +298,27 @@ function affiche_bloc_plugin($plug_file, $info, $dir_plugins = null) { // $infotech = array(); - $version = "<dt>"._T('version')."</dt><dd>".$info['version']; + $version = "<dt>" . _T('version') . "</dt><dd>" . $info['version']; // Version SVN - if ($svn_revision = version_svn_courante($dir_plugins.$plug_file)) - $version .= ($svn_revision<0 ? ' SVN':'').' ['.abs($svn_revision).']'; - $version .="</dd>"; + if ($svn_revision = version_svn_courante($dir_plugins . $plug_file)) { + $version .= ($svn_revision < 0 ? ' SVN' : '') . ' [' . abs($svn_revision) . ']'; + } + $version .= "</dd>"; $infotech[] = $version; - $infotech[] = "<dt>"._T('repertoire_plugins')."</dt><dd>".joli_repertoire("$dir_plugins$plug_file")."</dd>"; + $infotech[] = "<dt>" . _T('repertoire_plugins') . "</dt><dd>" . joli_repertoire("$dir_plugins$plug_file") . "</dd>"; // source zip le cas echeant - $infotech[] = (lire_fichier($dir_plugins.$plug_file.'/install.log', $log) - AND preg_match(',^source:(.*)$,m', $log, $r)) - ? '<dt>'._T('plugin_source').'</dt><dd>'.trim($r[1])."</dd>" - :''; + $infotech[] = (lire_fichier($dir_plugins . $plug_file . '/install.log', $log) + AND preg_match(',^source:(.*)$,m', $log, $r)) + ? '<dt>' . _T('plugin_source') . '</dt><dd>' . trim($r[1]) . "</dd>" + : ''; $infotech[] = !$info['necessite'] ? '' : - ('<dt>' . _T('plugin_info_necessite') . '</dt><dd>' . join(' ', array_map('array_shift', $info['necessite'])) . '</dd>'); + ('<dt>' . _T('plugin_info_necessite') . '</dt><dd>' . join(' ', + array_map('array_shift', $info['necessite'])) . '</dd>'); $s .= "<dl class='tech'>" . join('', $infotech) - ."</dl>"; + . "</dl>"; return $s; @@ -288,15 +328,16 @@ function formater_credits($infos, $sep = ', ') { $texte = ''; foreach ($infos as $_credit) { - if ($texte) + if ($texte) { $texte .= $sep; + } // Si le credit en cours n'est pas un array c'est donc un copyright $texte .= (!is_array($_credit)) - ? PtoBR(propre($_credit)) - : ($_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') . - $_credit['nom'] . - ($_credit['url'] ? '</a>' : ''); + ? PtoBR(propre($_credit)) + : ($_credit['url'] ? '<a href="' . $_credit['url'] . '">' : '') . + $_credit['nom'] . + ($_credit['url'] ? '</a>' : ''); } return $texte; diff --git a/ecrire/plugins/afficher_repertoires.php b/ecrire/plugins/afficher_repertoires.php index 3eb09fc64b..70c19f4f5d 100644 --- a/ecrire/plugins/afficher_repertoires.php +++ b/ecrire/plugins/afficher_repertoires.php @@ -10,55 +10,61 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // http://code.spip.net/@affiche_arbre_plugins -function plugins_afficher_repertoires_dist($url_page, $liste_plugins, $liste_plugins_actifs){ - $ligne_plug = charger_fonction('afficher_plugin','plugins'); +function plugins_afficher_repertoires_dist($url_page, $liste_plugins, $liste_plugins_actifs) { + $ligne_plug = charger_fonction('afficher_plugin', 'plugins'); $racine = basename(_DIR_PLUGINS); $init_dir = $current_dir = ""; // liste des repertoires deplies : construit en remontant l'arbo de chaque plugin actif // des qu'un path est deja note deplie on s'arrete - $deplie = array($racine=>true); - $fast_liste_plugins_actifs=array(); - foreach($liste_plugins_actifs as $key=>$plug){ + $deplie = array($racine => true); + $fast_liste_plugins_actifs = array(); + foreach ($liste_plugins_actifs as $key => $plug) { $chemin_plug = chemin_plug($racine, $plug); - $fast_liste_plugins_actifs[$chemin_plug]=true; - $dir = dirname($chemin_plug);$maxiter=100; - while(strlen($dir) && !isset($deplie[$dir]) && $dir!=$racine && $maxiter-->0){ + $fast_liste_plugins_actifs[$chemin_plug] = true; + $dir = dirname($chemin_plug); + $maxiter = 100; + while (strlen($dir) && !isset($deplie[$dir]) && $dir != $racine && $maxiter-- > 0) { $deplie[$dir] = true; $dir = dirname($dir); } } // index repertoires --> plugin - $dir_index=array(); - foreach($liste_plugins as $key=>$plug){ + $dir_index = array(); + foreach ($liste_plugins as $key => $plug) { $liste_plugins[$key] = chemin_plug($racine, $plug); $dir_index[dirname($liste_plugins[$key])][] = $key; } $visible = @isset($deplie[$current_dir]); - $maxiter=1000; + $maxiter = 1000; $res = ''; - while (count($liste_plugins) && $maxiter--){ + while (count($liste_plugins) && $maxiter--) { // le rep suivant $dir = dirname(reset($liste_plugins)); - if ($dir != $current_dir) - $res .= tree_open_close_dir($current_dir,$dir,$deplie); + if ($dir != $current_dir) { + $res .= tree_open_close_dir($current_dir, $dir, $deplie); + } // d'abord tous les plugins du rep courant - if (isset($dir_index[$current_dir])) - foreach($dir_index[$current_dir] as $key){ + if (isset($dir_index[$current_dir])) { + foreach ($dir_index[$current_dir] as $key) { $plug = $liste_plugins[$key]; $actif = @isset($fast_liste_plugins_actifs[$plug]); - $id = substr(md5($plug),0,16); - $res .= $ligne_plug($url_page, str_replace(_DIR_PLUGINS, '', _DIR_RACINE.$plug), $actif, 'menu-entree') . "\n"; + $id = substr(md5($plug), 0, 16); + $res .= $ligne_plug($url_page, str_replace(_DIR_PLUGINS, '', _DIR_RACINE . $plug), $actif, + 'menu-entree') . "\n"; unset($liste_plugins[$key]); } + } } - $res .= tree_open_close_dir($current_dir,$init_dir, true); + $res .= tree_open_close_dir($current_dir, $init_dir, true); return "<ul class='menu-liste plugins'>" . $res @@ -74,37 +80,41 @@ function chemin_plug($racine, $plug) { } // http://code.spip.net/@tree_open_close_dir -function tree_open_close_dir(&$current, $target, $deplie = array()){ - if ($current == $target) return ""; - $tcur = explode("/",$current); - $ttarg = explode("/",$target); +function tree_open_close_dir(&$current, $target, $deplie = array()) { + if ($current == $target) { + return ""; + } + $tcur = explode("/", $current); + $ttarg = explode("/", $target); $tcom = array(); $output = ""; // la partie commune - while (reset($tcur)==reset($ttarg)){ + while (reset($tcur) == reset($ttarg)) { $tcom[] = array_shift($tcur); array_shift($ttarg); } // fermer les repertoires courant jusqu'au point de fork - while($close = array_pop($tcur)){ + while ($close = array_pop($tcur)) { $output .= "</ul>\n"; $output .= fin_block(); $output .= "</li>\n"; } $chemin = ""; - if (count($tcom)) - $chemin .= implode("/",$tcom)."/"; + if (count($tcom)) { + $chemin .= implode("/", $tcom) . "/"; + } // ouvrir les repertoires jusqu'a la cible - while($open = array_shift($ttarg)){ - $visible = @isset($deplie[$chemin.$open]); + while ($open = array_shift($ttarg)) { + $visible = @isset($deplie[$chemin . $open]); $chemin .= $open . "/"; $output .= "<li>"; - $output .= bouton_block_depliable($chemin,$visible); + $output .= bouton_block_depliable($chemin, $visible); $output .= debut_block_depliable($visible); $output .= "<ul>\n"; } $current = $target; + return $output; } diff --git a/ecrire/plugins/extraire_boutons.php b/ecrire/plugins/extraire_boutons.php index 205a4d1a7e..15eb3fe6da 100644 --- a/ecrire/plugins/extraire_boutons.php +++ b/ecrire/plugins/extraire_boutons.php @@ -10,39 +10,42 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Analyser un arbre xml et extraire les infos concernant les boutons et onglets * * @param <type> $arbre - * @return <type> + * @return <type> */ -function plugins_extraire_boutons_dist($arbre){ - $ret = array('bouton'=>array(),'onglet'=>array()); +function plugins_extraire_boutons_dist($arbre) { + $ret = array('bouton' => array(), 'onglet' => array()); // recuperer les boutons et onglets si necessaire - spip_xml_match_nodes(",^(bouton|onglet)\s,",$arbre,$les_boutons); - if (is_array($les_boutons) && count($les_boutons)){ + spip_xml_match_nodes(",^(bouton|onglet)\s,", $arbre, $les_boutons); + if (is_array($les_boutons) && count($les_boutons)) { $ret['bouton'] = array(); $ret['onglet'] = array(); - foreach($les_boutons as $bouton => $val) { + foreach ($les_boutons as $bouton => $val) { $bouton = spip_xml_decompose_tag($bouton); $type = reset($bouton); $bouton = end($bouton); - if (isset($bouton['id'])){ + if (isset($bouton['id'])) { $id = $bouton['id']; $val = reset($val); - if(is_array($val)){ - $ret[$type][$id]['parent'] = isset($bouton['parent'])?$bouton['parent']:''; - $ret[$type][$id]['position'] = isset($bouton['position'])?$bouton['position']:''; - $ret[$type][$id]['titre'] = isset($val['titre'])?trim(spip_xml_aplatit($val['titre'])):''; - $ret[$type][$id]['icone'] = isset($val['icone'])?trim(end($val['icone'])):''; - $ret[$type][$id]['action'] = isset($val['url'])?trim(end($val['url'])):''; - $ret[$type][$id]['parametres'] = isset($val['args'])?trim(end($val['args'])):''; + if (is_array($val)) { + $ret[$type][$id]['parent'] = isset($bouton['parent']) ? $bouton['parent'] : ''; + $ret[$type][$id]['position'] = isset($bouton['position']) ? $bouton['position'] : ''; + $ret[$type][$id]['titre'] = isset($val['titre']) ? trim(spip_xml_aplatit($val['titre'])) : ''; + $ret[$type][$id]['icone'] = isset($val['icone']) ? trim(end($val['icone'])) : ''; + $ret[$type][$id]['action'] = isset($val['url']) ? trim(end($val['url'])) : ''; + $ret[$type][$id]['parametres'] = isset($val['args']) ? trim(end($val['args'])) : ''; } } } } + return $ret; } diff --git a/ecrire/plugins/extraire_pipelines.php b/ecrire/plugins/extraire_pipelines.php index 8f9de7e0b7..c860864090 100644 --- a/ecrire/plugins/extraire_pipelines.php +++ b/ecrire/plugins/extraire_pipelines.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -18,20 +20,23 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * * @param array $arbre */ -function plugins_extraire_pipelines_dist(&$arbre){ +function plugins_extraire_pipelines_dist(&$arbre) { $pipeline = array(); - if (spip_xml_match_nodes(',^pipeline,',$arbre,$pipes)){ - foreach($pipes as $tag=>$p){ - if (!is_array($p[0])){ - list($tag,$att) = spip_xml_decompose_tag($tag); - $pipeline[] = $att; - } - else foreach($p as $pipe){ - $att = array(); - if (is_array($pipe)) - foreach($pipe as $k=>$t) - $att[$k] = trim(end($t)); + if (spip_xml_match_nodes(',^pipeline,', $arbre, $pipes)) { + foreach ($pipes as $tag => $p) { + if (!is_array($p[0])) { + list($tag, $att) = spip_xml_decompose_tag($tag); $pipeline[] = $att; + } else { + foreach ($p as $pipe) { + $att = array(); + if (is_array($pipe)) { + foreach ($pipe as $k => $t) { + $att[$k] = trim(end($t)); + } + } + $pipeline[] = $att; + } } } unset($arbre[$tag]); diff --git a/ecrire/plugins/get_infos.php b/ecrire/plugins/get_infos.php index 350b0c63d9..48064e27de 100644 --- a/ecrire/plugins/get_infos.php +++ b/ecrire/plugins/get_infos.php @@ -14,55 +14,62 @@ * Obtention des description des plugins locaux * * @package SPIP\Core\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Lecture du fichier de configuration d'un plugin * * @staticvar string $filecache * @staticvar array $cache - * + * * @param string|array|bool $plug * @param bool $reload * @param string $dir * @param bool $clean_old * @return array */ -function plugins_get_infos_dist($plug = false, $reload = false, $dir = _DIR_PLUGINS, $clean_old = false){ - static $cache=''; +function plugins_get_infos_dist($plug = false, $reload = false, $dir = _DIR_PLUGINS, $clean_old = false) { + static $cache = ''; static $filecache = ''; - if ($cache===''){ - $filecache = _DIR_TMP."plugin_xml_cache.gz"; - if (is_file($filecache)){ + if ($cache === '') { + $filecache = _DIR_TMP . "plugin_xml_cache.gz"; + if (is_file($filecache)) { lire_fichier($filecache, $contenu); $cache = unserialize($contenu); } - if (!is_array($cache)) $cache = array(); + if (!is_array($cache)) { + $cache = array(); + } } - if (defined('_VAR_MODE') AND _VAR_MODE=='recalcul') + if (defined('_VAR_MODE') AND _VAR_MODE == 'recalcul') { $reload = true; + } - if ($plug===false) { + if ($plug === false) { ecrire_fichier($filecache, serialize($cache)); + return $cache; - } - elseif (is_string($plug)) { + } elseif (is_string($plug)) { $res = plugins_get_infos_un($plug, $reload, $dir, $cache); - } - elseif (is_array($plug)) { + } elseif (is_array($plug)) { $res = false; - if (!$reload) $reload = -1; - foreach($plug as $nom) - $res |= plugins_get_infos_un($nom, $reload, $dir, $cache); + if (!$reload) { + $reload = -1; + } + foreach ($plug as $nom) { + $res |= plugins_get_infos_un($nom, $reload, $dir, $cache); + } // Nettoyer le cache des vieux plugins qui ne sont plus la if ($clean_old and isset($cache[$dir]) and count($cache[$dir])) { foreach (array_keys($cache[$dir]) as $p) { - if (!in_array($p,$plug)) { + if (!in_array($p, $plug)) { unset($cache[$dir][$p]); } } @@ -82,25 +89,29 @@ function plugins_get_infos_dist($plug = false, $reload = false, $dir = _DIR_PLUG } -function plugins_get_infos_un($plug, $reload, $dir, &$cache) -{ +function plugins_get_infos_un($plug, $reload, $dir, &$cache) { if (!is_readable($file = "$dir$plug/" . ($desc = "paquet") . ".xml")) { - if (!is_readable($file = "$dir$plug/" . ($desc = "plugin") . ".xml")) - return false; + if (!is_readable($file = "$dir$plug/" . ($desc = "plugin") . ".xml")) { + return false; + } } - if (($time = intval(@filemtime($file))) < 0) return false; + if (($time = intval(@filemtime($file))) < 0) { + return false; + } $md5 = md5_file($file); - $pcache = isset($cache[$dir][$plug]) - ? $cache[$dir][$plug] : array('filemtime' => 0, 'md5_file' => ''); + $pcache = isset($cache[$dir][$plug]) + ? $cache[$dir][$plug] : array('filemtime' => 0, 'md5_file' => ''); // si le cache est valide if ((intval($reload) <= 0) AND ($time > 0) AND ($time <= $pcache['filemtime']) - AND $md5==$pcache['md5_file']) + AND $md5 == $pcache['md5_file'] + ) { return false; + } // si on arrive pas a lire le fichier, se contenter du cache if (!($texte = spip_file_get_contents($file))) { @@ -122,6 +133,8 @@ function plugins_get_infos_un($plug, $reload, $dir, &$cache) $cache[$dir][$plug] = $ret; # echo count($cache[$dir]), $dir,$plug, " $reloadc<br>"; } + return $diff; } + ?> diff --git a/ecrire/plugins/infos_paquet.php b/ecrire/plugins/infos_paquet.php index b55f52ed87..0e821ae332 100644 --- a/ecrire/plugins/infos_paquet.php +++ b/ecrire/plugins/infos_paquet.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * lecture d'un texte conforme a la DTD paquet.dtd @@ -31,23 +33,26 @@ function plugins_infos_paquet($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { $valider_xml = charger_fonction('valider', 'xml'); $vxml = $valider_xml($desc, false, $process, 'paquet.dtd', "utf-8"); - if (!$vxml->err){ + if (!$vxml->err) { // On veut toutes les variantes selon la version de SPIP - if (!$plug) + if (!$plug) { return $vxml->versions; + } // compatibilite avec l'existant: $tree = $vxml->versions['0']; // l'arbre renvoie parfois un tag vide... etrange. Pas la peine de garder ca. - if (isset($tree['']) and !strlen($tree[''])) + if (isset($tree['']) and !strlen($tree[''])) { unset($tree['']); + } - $tree['slogan'] = $tree['prefix']."_slogan"; - $tree['description'] = $tree['prefix']."_description"; + $tree['slogan'] = $tree['prefix'] . "_slogan"; + $tree['description'] = $tree['prefix'] . "_description"; paquet_readable_files($tree, "$dir_plugins$plug/"); - if (!$tree['chemin']) - $tree['chemin'] = array(array('path' => '')); // initialiser par defaut + if (!$tree['chemin']) { + $tree['chemin'] = array(array('path' => '')); + } // initialiser par defaut // On verifie qu'il existe des balises spip qu'il faudrait rajouter dans // la structure d'infos du paquet en fonction de la version spip courante @@ -55,12 +60,14 @@ function plugins_infos_paquet($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { $vspip = $GLOBALS['spip_version_branche']; foreach ($vxml->versions as $_compatibilite => $_version) { if (($_version['balise'] == 'spip') - AND (plugin_version_compatible($_compatibilite, $vspip,'spip'))) { + AND (plugin_version_compatible($_compatibilite, $vspip, 'spip')) + ) { // on merge les sous-balises de la balise spip compatible avec celles de la // balise paquet foreach ($_version as $_index => $_balise) { - if ($_index AND $_index != 'balise') - $tree[$_index] =array_merge($tree[$_index], $_balise); + if ($_index AND $_index != 'balise') { + $tree[$_index] = array_merge($tree[$_index], $_balise); + } } } } @@ -71,12 +78,13 @@ function plugins_infos_paquet($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { // Prendre les messages d'erreur sans les numeros de lignes $msg = array_map('array_shift', $vxml->err); // Construire le lien renvoyant sur l'application du validateur XML - $h = $GLOBALS['meta']['adresse_site'].'/' - .substr("$dir_plugins$plug/", strlen(_DIR_RACINE)).'paquet.xml'; + $h = $GLOBALS['meta']['adresse_site'] . '/' + . substr("$dir_plugins$plug/", strlen(_DIR_RACINE)) . 'paquet.xml'; $h = generer_url_ecrire('valider_xml', "var_url=$h"); $t = _T('plugins_erreur', array('plugins' => $plug)); array_unshift($msg, "<a href='$h'>$t</a>"); + return array('erreur' => $msg); } @@ -88,12 +96,12 @@ function plugins_infos_paquet($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { * @param string $dir * @return void */ -function paquet_readable_files(&$tree, $dir){ +function paquet_readable_files(&$tree, $dir) { $prefix = strtolower($tree['prefix']); - $tree['options'] = (is_readable($dir.$f = ($prefix.'_options.php'))) ? array($f) : array(); - $tree['fonctions'] = (is_readable($dir.$f = ($prefix.'_fonctions.php'))) ? array($f) : array(); - $tree['install'] = (is_readable($dir.$f = ($prefix.'_administrations.php'))) ? array($f) : array(); + $tree['options'] = (is_readable($dir . $f = ($prefix . '_options.php'))) ? array($f) : array(); + $tree['fonctions'] = (is_readable($dir . $f = ($prefix . '_fonctions.php'))) ? array($f) : array(); + $tree['install'] = (is_readable($dir . $f = ($prefix . '_administrations.php'))) ? array($f) : array(); } /** @@ -111,13 +119,14 @@ function paquet_readable_files(&$tree, $dir){ */ function paquet_debutElement($phraseur, $name, $attrs) { xml_debutElement($phraseur, $name, $attrs); - if ($phraseur->err) return; - if (($name=='paquet') OR ($name=='spip')){ - if ($name=='spip'){ + if ($phraseur->err) { + return; + } + if (($name == 'paquet') OR ($name == 'spip')) { + if ($name == 'spip') { $n = $attrs['compatibilite']; $attrs = array(); - } - else { + } else { $n = '0'; $phraseur->contenu['paquet'] = $attrs; $attrs['menu'] = array(); @@ -134,9 +143,9 @@ function paquet_debutElement($phraseur, $name, $attrs) { } $phraseur->contenu['compatible'] = $n; $phraseur->versions[$phraseur->contenu['compatible']] = $attrs; - } - else + } else { $phraseur->versions[$phraseur->contenu['compatible']][$name][0] = $attrs; + } $phraseur->versions[$phraseur->contenu['compatible']][''] = ''; } @@ -150,7 +159,9 @@ function paquet_debutElement($phraseur, $name, $attrs) { */ function paquet_textElement($phraseur, $data) { xml_textElement($phraseur, $data); - if ($phraseur->err OR !(trim($data))) return; + if ($phraseur->err OR !(trim($data))) { + return; + } $phraseur->versions[$phraseur->contenu['compatible']][''] .= $data; } @@ -163,10 +174,12 @@ function paquet_textElement($phraseur, $data) { * @param string $name */ function paquet_finElement($phraseur, $name) { - if ($phraseur->err) return; + if ($phraseur->err) { + return; + } $n = $phraseur->contenu['compatible']; - if (isset($phraseur->versions[$n][$name][0]) AND is_array($phraseur->versions[$n][$name][0])){ + if (isset($phraseur->versions[$n][$name][0]) AND is_array($phraseur->versions[$n][$name][0])) { $attrs = $phraseur->versions[$n][$name][0]; unset($phraseur->versions[$n][$name][0]); } else { @@ -176,12 +189,12 @@ function paquet_finElement($phraseur, $name) { $texte = trim($phraseur->versions[$n]['']); $phraseur->versions[$n][''] = ''; - $f = 'info_paquet_'.$name; - if (function_exists($f)) + $f = 'info_paquet_' . $name; + if (function_exists($f)) { $f($phraseur, $attrs, $texte); - elseif (!$attrs) + } elseif (!$attrs) { $phraseur->versions[$n][$name] = $texte; - else { + } else { // Traitement generique. Si $attrs['nom'] n'existe pas, ce n'est pas normal ici $phraseur->versions[$n][$name][$attrs['nom']] = $attrs; # echo("<br>pour $name $n " . $attrs['nom']); var_dump($phraseur->versions[$n]); @@ -198,10 +211,11 @@ function paquet_finElement($phraseur, $name) { * @param string $texte */ function info_paquet_licence($phraseur, $attrs, $texte) { - if (isset($attrs['lien'])) + if (isset($attrs['lien'])) { $lien = $attrs['lien']; - else + } else { $lien = ''; + } $n = $phraseur->contenu['compatible']; $phraseur->versions[$n]['licence'][] = array('nom' => $texte, 'url' => $lien); } @@ -216,11 +230,12 @@ function info_paquet_licence($phraseur, $attrs, $texte) { */ function info_paquet_chemin($phraseur, $attrs, $texte) { $n = $phraseur->contenu['compatible']; - if (isset($attrs['path'])){ - if (isset($attrs['type'])) + if (isset($attrs['path'])) { + if (isset($attrs['type'])) { $phraseur->versions[$n]['chemin'][] = array('path' => $attrs['path'], 'type' => $attrs['type']); - else + } else { $phraseur->versions[$n]['chemin'][] = array('path' => $attrs['path']); + } } } @@ -236,18 +251,20 @@ function info_paquet_chemin($phraseur, $attrs, $texte) { */ function info_paquet_auteur($phraseur, $attrs, $texte) { # echo 'auteur ', $texte; var_dump($attrs); - if (isset($attrs['mail'])){ - if (strpos($attrs['mail'], '@')) + if (isset($attrs['mail'])) { + if (strpos($attrs['mail'], '@')) { $attrs['mail'] = str_replace('@', ' AT ', $attrs['mail']); + } $mail = $attrs['mail']; - } - else + } else { $mail = ''; + } - if (isset($attrs['lien'])) + if (isset($attrs['lien'])) { $lien = $attrs['lien']; - else + } else { $lien = ''; + } $n = $phraseur->contenu['compatible']; $phraseur->versions[$n]['auteur'][] = array('nom' => $texte, 'url' => $lien, 'mail' => $mail); @@ -263,10 +280,11 @@ function info_paquet_auteur($phraseur, $attrs, $texte) { */ function info_paquet_credit($phraseur, $attrs, $texte) { - if (isset($attrs['lien'])) + if (isset($attrs['lien'])) { $lien = $attrs['lien']; - else + } else { $lien = ''; + } $n = $phraseur->contenu['compatible']; $phraseur->versions[$n]['credit'][] = array('nom' => $texte, 'url' => $lien); @@ -301,12 +319,12 @@ function info_paquet_paquet($phraseur, $attrs, $texte) { /** * Cas particulier sur la balise traduire : - * Elle n'a pas de 'nom' + * Elle n'a pas de 'nom' * * @param object $phraseur * @param array $attrs * @param string $texte -**/ + **/ function info_paquet_traduire($phraseur, $attrs, $texte) { $n = $phraseur->contenu['compatible']; $phraseur->versions[$n]['traduire'][] = $attrs; @@ -351,14 +369,17 @@ function info_paquet_style($phraseur, $attrs, $texte) { $lien = $chemin = $type = $media = ''; include_spip('inc/utils'); - if (tester_url_absolue($attrs['source'])) + if (tester_url_absolue($attrs['source'])) { $lien = $attrs['source']; - else + } else { $chemin = $attrs['source']; - if (isset($attrs['type'])) + } + if (isset($attrs['type'])) { $type = $attrs['type']; - if (isset($attrs['media'])) + } + if (isset($attrs['media'])) { $media = $attrs['media']; + } $n = $phraseur->contenu['compatible']; $phraseur->versions[$n]['style'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type, 'media' => $media); @@ -377,12 +398,14 @@ function info_paquet_script($phraseur, $attrs, $texte) { $lien = $chemin = $type = $media = ''; include_spip('inc/utils'); - if (tester_url_absolue($attrs['source'])) + if (tester_url_absolue($attrs['source'])) { $lien = $attrs['source']; - else + } else { $chemin = $attrs['source']; - if (isset($attrs['type'])) + } + if (isset($attrs['type'])) { $type = $attrs['type']; + } $n = $phraseur->contenu['compatible']; $phraseur->versions[$n]['script'][] = array('url' => $lien, 'path' => $chemin, 'type' => $type); diff --git a/ecrire/plugins/infos_plugin.php b/ecrire/plugins/infos_plugin.php index 4ba7e2635a..d96dbec308 100644 --- a/ecrire/plugins/infos_plugin.php +++ b/ecrire/plugins/infos_plugin.php @@ -14,9 +14,11 @@ * Calculs des informations contenues dans un plugin.xml * * @package SPIP\Core\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // lecture d'un texte ecrit en pseudo-xml issu d'un fichier plugin.xml // et conversion approximative en tableau PHP. @@ -24,7 +26,7 @@ function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { include_spip('inc/xml'); $arbre = spip_xml_parse($desc); - $verifie_conformite = charger_fonction('verifie_conformite','plugins'); + $verifie_conformite = charger_fonction('verifie_conformite', 'plugins'); $verifie_conformite($plug, $arbre, $dir_plugins); include_spip('inc/charsets'); @@ -32,76 +34,96 @@ function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { // On renvoie la DTD utilisee $ret['dtd'] = "plugin"; - if (isset($arbre['categorie'])) + if (isset($arbre['categorie'])) { $ret['categorie'] = trim(spip_xml_aplatit($arbre['categorie'])); - if (isset($arbre['nom'])) + } + if (isset($arbre['nom'])) { $ret['nom'] = charset2unicode(spip_xml_aplatit($arbre['nom'])); - if (isset($arbre['icon'])) + } + if (isset($arbre['icon'])) { $ret['logo'] = trim(spip_xml_aplatit($arbre['icon'])); - if (isset($arbre['auteur'])) - $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur'])); // garder le 1er niveau en tableau mais traiter le multi possible - if (isset($arbre['licence'])) + } + if (isset($arbre['auteur'])) { + $ret['auteur'][] = trim(spip_xml_aplatit($arbre['auteur'])); + } // garder le 1er niveau en tableau mais traiter le multi possible + if (isset($arbre['licence'])) { $ret['licence'][] = trim(spip_xml_aplatit($arbre['licence'])); - if (isset($arbre['version'])) + } + if (isset($arbre['version'])) { $ret['version'] = trim(spip_xml_aplatit($arbre['version'])); - if (isset($arbre['version_base'])) + } + if (isset($arbre['version_base'])) { $ret['schema'] = trim(spip_xml_aplatit($arbre['version_base'])); - if (isset($arbre['etat'])) + } + if (isset($arbre['etat'])) { $ret['etat'] = trim(spip_xml_aplatit($arbre['etat'])); + } $ret['description'] = $ret['slogan'] = ""; - if (isset($arbre['slogan'])) + if (isset($arbre['slogan'])) { $ret['slogan'] = trim(spip_xml_aplatit($arbre['slogan'])); - if (isset($arbre['description'])){ + } + if (isset($arbre['description'])) { $ret['description'] = trim(spip_xml_aplatit($arbre['description'])); } - if (isset($arbre['lien'])){ - $ret['documentation'] = trim(join(' ',$arbre['lien'])); + if (isset($arbre['lien'])) { + $ret['documentation'] = trim(join(' ', $arbre['lien'])); if ($ret['documentation']) { // le lien de doc doit etre une url et c'est tout - if (!tester_url_absolue($ret['documentation'])) + if (!tester_url_absolue($ret['documentation'])) { $ret['documentation'] = ""; + } } } - if (isset($arbre['options'])) + if (isset($arbre['options'])) { $ret['options'] = $arbre['options']; - if (isset($arbre['fonctions'])) + } + if (isset($arbre['fonctions'])) { $ret['fonctions'] = $arbre['fonctions']; - if (isset($arbre['prefix'][0])) + } + if (isset($arbre['prefix'][0])) { $ret['prefix'] = trim(array_pop($arbre['prefix'])); - if (isset($arbre['install'])) + } + if (isset($arbre['install'])) { $ret['install'] = $arbre['install']; - if (isset($arbre['meta'])) + } + if (isset($arbre['meta'])) { $ret['meta'] = trim(spip_xml_aplatit($arbre['meta'])); + } - $necessite = info_plugin_normalise_necessite(isset($arbre['necessite'])?$arbre['necessite']:''); - $ret['compatibilite'] = isset($necessite['compatible'])?$necessite['compatible']:''; + $necessite = info_plugin_normalise_necessite(isset($arbre['necessite']) ? $arbre['necessite'] : ''); + $ret['compatibilite'] = isset($necessite['compatible']) ? $necessite['compatible'] : ''; $ret['necessite'] = $necessite['necessite']; $ret['lib'] = $necessite['lib']; - $ret['utilise'] = info_plugin_normalise_utilise(isset($arbre['utilise'])?$arbre['utilise']:''); - $ret['procure'] = info_plugin_normalise_procure(isset($arbre['procure'])?$arbre['procure']:''); - $ret['chemin'] = info_plugin_normalise_chemin(isset($arbre['path'])?$arbre['path']:''); + $ret['utilise'] = info_plugin_normalise_utilise(isset($arbre['utilise']) ? $arbre['utilise'] : ''); + $ret['procure'] = info_plugin_normalise_procure(isset($arbre['procure']) ? $arbre['procure'] : ''); + $ret['chemin'] = info_plugin_normalise_chemin(isset($arbre['path']) ? $arbre['path'] : ''); - if (isset($arbre['pipeline'])) + if (isset($arbre['pipeline'])) { $ret['pipeline'] = $arbre['pipeline']; + } - $extraire_boutons = charger_fonction('extraire_boutons','plugins'); + $extraire_boutons = charger_fonction('extraire_boutons', 'plugins'); $les_boutons = $extraire_boutons($arbre); $ret['menu'] = $les_boutons['bouton']; $ret['onglet'] = $les_boutons['onglet']; $ret['traduire'] = isset($arbre['traduire']) ? $arbre['traduire'] : ''; - - if (isset($arbre['config'])) + + if (isset($arbre['config'])) { $ret['config'] = spip_xml_aplatit($arbre['config']); - if (isset($arbre['noisette'])) + } + if (isset($arbre['noisette'])) { $ret['noisette'] = $arbre['noisette']; + } if (isset($arbre['erreur'])) { $ret['erreur'] = $arbre['erreur']; - if ($plug) spip_log("infos_plugin $plug " . @join(' ', $arbre['erreur'])); + if ($plug) { + spip_log("infos_plugin $plug " . @join(' ', $arbre['erreur'])); + } } return $ret; @@ -110,7 +132,7 @@ function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { /** * Normaliser les description des balises `necessite` - * + * * Ajoute les clés * - 'nom' (= id) * - 'compatibilite' (= version) @@ -118,7 +140,7 @@ function plugins_infos_plugin($desc, $plug = '', $dir_plugins = _DIR_PLUGINS) { * @note * Un attribut de nom "id" à une signification particulière en XML * qui ne correspond pas à l'utilissation qu'en font les plugin.xml. - * + * * Pour éviter de complexifier la lecture de paquet.xml * qui n'est pour rien dans cette bévue, on doublonne l'information * sous les deux index "nom" et "id" dans l'arbre de syntaxe abstraite @@ -134,79 +156,85 @@ function info_plugin_normalise_necessite($necessite) { $res = array('necessite' => array(), 'lib' => array()); if (is_array($necessite)) { - foreach($necessite as $need) { + foreach ($necessite as $need) { $id = $need['id']; $v = isset($need['version']) ? $need['version'] : ''; - + // Necessite SPIP version x ? - if (strtoupper($id)=='SPIP') { + if (strtoupper($id) == 'SPIP') { $res['compatible'] = $v; - } else if (preg_match(',^lib:\s*([^\s]*),i', $id, $r)) { - $res['lib'][] = array('nom' => $r[1], 'id' => $r[1], 'lien' => $need['src']); - } else $res['necessite'][] = array('id' => $id, 'nom' => $id, 'version' => $v, 'compatibilite' => $v); + } else { + if (preg_match(',^lib:\s*([^\s]*),i', $id, $r)) { + $res['lib'][] = array('nom' => $r[1], 'id' => $r[1], 'lien' => $need['src']); + } else { + $res['necessite'][] = array('id' => $id, 'nom' => $id, 'version' => $v, 'compatibilite' => $v); + } + } } } - + return $res; } /** * Normaliser la description des utilise - * + * * Ajoute les clés * - 'nom' (= id) * - 'compatibilite' (= version) * * @param array $utilise - * Liste des utilise trouvés pour le plugin + * Liste des utilise trouvés pour le plugin * @return array - * Liste des utilise modifiés. + * Liste des utilise modifiés. */ function info_plugin_normalise_utilise($utilise) { $res = array(); if (is_array($utilise)) { - foreach($utilise as $need){ + foreach ($utilise as $need) { $id = $need['id']; - $v = isset($need['version']) ? $need['version'] : '' ; - $res[]= array('nom' => $id, 'id' => $id, 'version' => $v, 'compatibilite' => $v); + $v = isset($need['version']) ? $need['version'] : ''; + $res[] = array('nom' => $id, 'id' => $id, 'version' => $v, 'compatibilite' => $v); } } + return $res; } /** * Normaliser la description des procurations - * + * * Ajoute la cle 'nom' (= id) * * @param array $procure - * Liste des procure trouvés pour le plugin + * Liste des procure trouvés pour le plugin * @return array - * Liste des procure modifiés. + * Liste des procure modifiés. */ function info_plugin_normalise_procure($procure) { $res = array(); if (is_array($procure)) { - foreach($procure as $need){ + foreach ($procure as $need) { $id = $need['id']; $v = $need['version']; - $res[]= array('nom' => $id, 'id' => $id, 'version' => $v); + $res[] = array('nom' => $id, 'id' => $id, 'version' => $v); } } + return $res; } /** * Normaliser la description du chemin - * + * * Ajoute le clés 'path' (= dir) * * @param array $chemins - * Liste des chemins trouvés pour le plugin + * Liste des chemins trouvés pour le plugin * @return array - * Liste des chemins modifiés. + * Liste des chemins modifiés. */ function info_plugin_normalise_chemin($chemins) { $res = array(); @@ -217,6 +245,8 @@ function info_plugin_normalise_chemin($chemins) { $res[] = $c; } } + return $res; } + ?> diff --git a/ecrire/plugins/installer.php b/ecrire/plugins/installer.php index 5d32ea75e2..3e9bd1d005 100644 --- a/ecrire/plugins/installer.php +++ b/ecrire/plugins/installer.php @@ -14,24 +14,26 @@ * Gestion de l'installation des plugins * * @package SPIP\Core\Plugins -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Installe ou retire un plugin - * + * * Permet d'installer ou retirer un plugin en incluant les fichiers * associés et en lançant les fonctions spécifiques. - * + * * 1. d'abord sur l'argument `test`, * 2. ensuite sur l'action demandée si le test repond `false` * 3. enfin sur l'argument `test` à nouveau. - * + * * L'index `install_test` du tableau résultat est un tableau formé : - * - * - du résultat 3 + * + * - du résultat 3 * - des echo de l'étape 2 * * @note @@ -50,79 +52,92 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * - true si déjà installé, * - le tableau de get_infos sinon */ -function plugins_installer_dist($plug, $action, $dir_type = '_DIR_PLUGINS') -{ - $get_infos = charger_fonction('get_infos','plugins'); +function plugins_installer_dist($plug, $action, $dir_type = '_DIR_PLUGINS') { + $get_infos = charger_fonction('get_infos', 'plugins'); $infos = $get_infos($plug, false, constant($dir_type)); - if (!isset($infos['install']) OR !$infos['install']) return false; + if (!isset($infos['install']) OR !$infos['install']) { + return false; + } // passer en chemin absolu si possible, c'est plus efficace - $dir = str_replace('_DIR_','_ROOT_',$dir_type); - if (!defined($dir)) $dir = $dir_type; + $dir = str_replace('_DIR_', '_ROOT_', $dir_type); + if (!defined($dir)) { + $dir = $dir_type; + } $dir = constant($dir); - foreach($infos['install'] as $file) { + foreach ($infos['install'] as $file) { $file = $dir . $plug . "/" . trim($file); - if (file_exists($file)){ + if (file_exists($file)) { include_once($file); } } - $version = isset($infos['schema'])?$infos['schema']:''; - $arg = $infos ; - $f = $infos['prefix']."_install"; - if (!function_exists($f)) + $version = isset($infos['schema']) ? $infos['schema'] : ''; + $arg = $infos; + $f = $infos['prefix'] . "_install"; + if (!function_exists($f)) { $f = isset($infos['schema']) ? 'spip_plugin_install' : ''; - else - $arg = $infos['prefix']; // stupide: info deja dans le nom + } else { + $arg = $infos['prefix']; + } // stupide: info deja dans le nom if (!$f) { // installation sans operation particuliere $infos['install_test'] = array(true, ''); - return $infos; + + return $infos; } $test = $f('test', $arg, $version); - if ($action == 'uninstall') $test = !$test; + if ($action == 'uninstall') { + $test = !$test; + } // Si deja fait, on ne dit rien - if ($test) return true; + if ($test) { + return true; + } // Si install et que l'on a la meta d'installation, c'est un upgrade - if($action == 'install' && !is_null(lire_meta($infos['prefix'].'_base_version'))) + if ($action == 'install' && !is_null(lire_meta($infos['prefix'] . '_base_version'))) { $infos['upgrade'] = true; - + } + // executer l'installation ou l'inverse // et renvoyer la trace (mais il faudrait passer en AJAX plutot) - ob_start(); + ob_start(); $f($action, $arg, $version); - $aff = ob_get_contents(); + $aff = ob_get_contents(); ob_end_clean(); // vider le cache des descriptions de tables a chaque (de)installation $trouver_table = charger_fonction('trouver_table', 'base'); $trouver_table(''); $infos['install_test'] = array($f('test', $arg, $version), $aff); + return $infos; } // Fonction par defaut pour install/desinstall // http://code.spip.net/@spip_plugin_install -function spip_plugin_install($action, $infos, $version_cible){ +function spip_plugin_install($action, $infos, $version_cible) { $prefix = $infos['prefix']; - if (isset($infos['meta']) AND (($table = $infos['meta']) !== 'meta')) + if (isset($infos['meta']) AND (($table = $infos['meta']) !== 'meta')) { $nom_meta = "base_version"; - else { - $nom_meta = $prefix."_base_version"; + } else { + $nom_meta = $prefix . "_base_version"; $table = 'meta'; } - switch ($action){ + switch ($action) { case 'test': - return (isset($GLOBALS[$table]) - AND isset($GLOBALS[$table][$nom_meta]) - AND spip_version_compare($GLOBALS[$table][$nom_meta],$version_cible,'>=')); + return (isset($GLOBALS[$table]) + AND isset($GLOBALS[$table][$nom_meta]) + AND spip_version_compare($GLOBALS[$table][$nom_meta], $version_cible, '>=')); break; case 'install': - if (function_exists($upgrade = $prefix."_upgrade")) + if (function_exists($upgrade = $prefix . "_upgrade")) { $upgrade($nom_meta, $version_cible, $table); + } break; case 'uninstall': - if (function_exists($vider_tables = $prefix."_vider_tables")) + if (function_exists($vider_tables = $prefix . "_vider_tables")) { $vider_tables($nom_meta, $table); + } break; } } @@ -130,56 +145,59 @@ function spip_plugin_install($action, $infos, $version_cible){ /** * Compare 2 numéros de version entre elles. - * + * * Cette fonction est identique (arguments et retours) a la fonction PHP * version_compare() qu'elle appelle. Cependant, cette fonction reformate * les numeros de versions pour ameliorer certains usages dans SPIP ou bugs * dans PHP. On permet ainsi de comparer 3.0.4 à 3.0.* par exemple. - * + * * @param string $v1 - * Numero de version servant de base a la comparaison. - * Ce numero ne peut pas comporter d'etoile. + * Numero de version servant de base a la comparaison. + * Ce numero ne peut pas comporter d'etoile. * @param string $v2 - * Numero de version a comparer. - * Il peut posseder des etoiles tel que 3.0.* + * Numero de version a comparer. + * Il peut posseder des etoiles tel que 3.0.* * @param string $op - * Un operateur eventuel (<, >, <=, >=, =, == ...) + * Un operateur eventuel (<, >, <=, >=, =, == ...) * @return int|bool - * Sans operateur : int. -1 pour inferieur, 0 pour egal, 1 pour superieur - * Avec operateur : bool. -**/ -function spip_version_compare($v1, $v2, $op = null){ - $v1 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1.\\2',$v1)); - $v2 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i','\\1.\\2',$v2)); - $v1 = str_replace('rc','RC',$v1); // certaines versions de PHP ne comprennent RC qu'en majuscule - $v2 = str_replace('rc','RC',$v2); // certaines versions de PHP ne comprennent RC qu'en majuscule - - $v1 = explode('.',$v1); - $v2 = explode('.',$v2); + * Sans operateur : int. -1 pour inferieur, 0 pour egal, 1 pour superieur + * Avec operateur : bool. + **/ +function spip_version_compare($v1, $v2, $op = null) { + $v1 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v1)); + $v2 = strtolower(preg_replace(',([0-9])[\s-.]?(dev|alpha|a|beta|b|rc|pl|p),i', '\\1.\\2', $v2)); + $v1 = str_replace('rc', 'RC', $v1); // certaines versions de PHP ne comprennent RC qu'en majuscule + $v2 = str_replace('rc', 'RC', $v2); // certaines versions de PHP ne comprennent RC qu'en majuscule + + $v1 = explode('.', $v1); + $v2 = explode('.', $v2); // $v1 est toujours une version, donc sans etoile - while (count($v1)<count($v2)) + while (count($v1) < count($v2)) { $v1[] = '0'; + } // $v2 peut etre une borne, donc accepte l'etoile $etoile = false; foreach ($v1 as $k => $v) { - if (!isset($v2[$k])) - $v2[] = ($etoile AND (is_numeric($v) OR $v=='pl' OR $v=='p')) ? $v : '0'; - else if ($v2[$k] == '*') { - $etoile = true; - $v2[$k] = $v; + if (!isset($v2[$k])) { + $v2[] = ($etoile AND (is_numeric($v) OR $v == 'pl' OR $v == 'p')) ? $v : '0'; + } else { + if ($v2[$k] == '*') { + $etoile = true; + $v2[$k] = $v; + } } } - $v1 = implode('.',$v1); - $v2 = implode('.',$v2); + $v1 = implode('.', $v1); + $v2 = implode('.', $v2); - return $op?version_compare($v1, $v2,$op):version_compare($v1, $v2); + return $op ? version_compare($v1, $v2, $op) : version_compare($v1, $v2); } /** * Retourne un tableau des plugins activés sur le site - * + * * Retourne la meta `plugin` désérialisée. * Chaque élément du tableau est lui-même un tableau contenant * les détails du plugin en question : répertoire et version. @@ -189,27 +207,32 @@ function spip_version_compare($v1, $v2, $op = null){ * l’ancien format en tableau sérialisé pour être conforme au nouveau fonctionnement (SPIP >= 1.9.2) * * @return array Tableau des plugins actifs -**/ -function liste_plugin_actifs(){ - $liste = isset($GLOBALS['meta']['plugin'])?$GLOBALS['meta']['plugin']:''; - if (!$liste) return array(); - if (!is_array($liste=unserialize($liste))) { + **/ +function liste_plugin_actifs() { + $liste = isset($GLOBALS['meta']['plugin']) ? $GLOBALS['meta']['plugin'] : ''; + if (!$liste) { + return array(); + } + if (!is_array($liste = unserialize($liste))) { // compatibilite pre 1.9.2, mettre a jour la meta - spip_log("MAJ meta plugin vieille version : $liste","plugin"); + spip_log("MAJ meta plugin vieille version : $liste", "plugin"); $new = true; - list(, $liste) = liste_plugin_valides(explode(",",$liste)); + list(, $liste) = liste_plugin_valides(explode(",", $liste)); } else { $new = false; // compat au moment d'une migration depuis version anterieure // si pas de dir_type, alors c'est _DIR_PLUGINS - foreach ($liste as $prefix=>$infos) { + foreach ($liste as $prefix => $infos) { if (!isset($infos['dir_type'])) { $liste[$prefix]['dir_type'] = "_DIR_PLUGINS"; $new = true; } } } - if ($new) ecrire_meta('plugin',serialize($liste)); + if ($new) { + ecrire_meta('plugin', serialize($liste)); + } + return $liste; } diff --git a/ecrire/plugins/verifie_conformite.php b/ecrire/plugins/verifie_conformite.php index 4308db8284..98e7b9b0c7 100644 --- a/ecrire/plugins/verifie_conformite.php +++ b/ecrire/plugins/verifie_conformite.php @@ -10,32 +10,35 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/xml'); include_spip('inc/plugin'); // http://code.spip.net/@plugin_verifie_conformite -function plugins_verifie_conformite_dist($plug, &$arbre, $dir_plugins = _DIR_PLUGINS){ - static $etats = array('dev','experimental','test', 'stable'); +function plugins_verifie_conformite_dist($plug, &$arbre, $dir_plugins = _DIR_PLUGINS) { + static $etats = array('dev', 'experimental', 'test', 'stable'); $matches = array(); $silence = false; $p = null; // chercher la declaration <plugin spip='...'> a prendre pour cette version de SPIP - if ($n = spip_xml_match_nodes(",^plugin(\s|$),", $arbre, $matches)){ + if ($n = spip_xml_match_nodes(",^plugin(\s|$),", $arbre, $matches)) { // version de SPIP $vspip = $GLOBALS['spip_version_branche']; - foreach($matches as $tag=>$sous){ - list($tagname,$atts) = spip_xml_decompose_tag($tag); - if ($tagname=='plugin' AND is_array($sous)){ + foreach ($matches as $tag => $sous) { + list($tagname, $atts) = spip_xml_decompose_tag($tag); + if ($tagname == 'plugin' AND is_array($sous)) { // On rajoute la condition sur $n : // -- en effet si $n==1 on a pas plus a choisir la balise que l'on ait // un attribut spip ou pas. Cela permet de traiter tous les cas mono-balise // de la meme facon. if (!isset($atts['spip']) - OR $n==1 - OR plugin_version_compatible($atts['spip'],$vspip,'spip')) { + OR $n == 1 + OR plugin_version_compatible($atts['spip'], $vspip, 'spip') + ) { // on prend la derniere declaration avec ce nom $p = end($sous); $compat_spip = isset($atts['spip']) ? $atts['spip'] : ''; @@ -43,106 +46,136 @@ function plugins_verifie_conformite_dist($plug, &$arbre, $dir_plugins = _DIR_PLU } } } - if (is_null($p)){ - $arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent')." : $plug")); + if (is_null($p)) { + $arbre = array('erreur' => array(_T('erreur_plugin_tag_plugin_absent') . " : $plug")); $silence = true; - } - else + } else { $arbre = $p; - if (!is_array($arbre)) $arbre = array(); - // verification de la conformite du plugin avec quelques - // precautions elementaires - if (!isset($arbre['nom'])){ - if (!$silence) + } + if (!is_array($arbre)) { + $arbre = array(); + } + // verification de la conformite du plugin avec quelques + // precautions elementaires + if (!isset($arbre['nom'])) { + if (!$silence) { $arbre['erreur'][] = _T('erreur_plugin_nom_manquant'); + } $arbre['nom'] = array(""); } - if (!isset($arbre['version'])){ - if (!$silence) + if (!isset($arbre['version'])) { + if (!$silence) { $arbre['erreur'][] = _T('erreur_plugin_version_manquant'); + } $arbre['version'] = array(""); } - if (!isset($arbre['prefix'])){ - if (!$silence) + if (!isset($arbre['prefix'])) { + if (!$silence) { $arbre['erreur'][] = _T('erreur_plugin_prefix_manquant'); + } $arbre['prefix'] = array(""); - } else{ + } else { $prefix = trim(end($arbre['prefix'])); - if (strtoupper($prefix)=='SPIP' AND $plug!="./"){ + if (strtoupper($prefix) == 'SPIP' AND $plug != "./") { $arbre['erreur'][] = _T('erreur_plugin_prefix_interdit'); } - if (isset($arbre['etat'])){ + if (isset($arbre['etat'])) { $etat = trim(end($arbre['etat'])); - if (!in_array($etat, $etats)) - $arbre['erreur'][] = _T('erreur_plugin_etat_inconnu')." : '$etat'"; + if (!in_array($etat, $etats)) { + $arbre['erreur'][] = _T('erreur_plugin_etat_inconnu') . " : '$etat'"; + } } - if (isset($arbre['options'])){ - foreach($arbre['options'] as $optfile){ + if (isset($arbre['options'])) { + foreach ($arbre['options'] as $optfile) { $optfile = trim($optfile); - if (!@is_readable($dir_plugins."$plug/$optfile")) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile"; + if (!@is_readable($dir_plugins . "$plug/$optfile")) { + if (!$silence) { + $arbre['erreur'][] = _T('erreur_plugin_fichier_absent') . " : $optfile"; + } + } } } - if (isset($arbre['fonctions'])){ - foreach($arbre['fonctions'] as $optfile){ + if (isset($arbre['fonctions'])) { + foreach ($arbre['fonctions'] as $optfile) { $optfile = trim($optfile); - if (!@is_readable($dir_plugins."$plug/$optfile")) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $optfile"; + if (!@is_readable($dir_plugins . "$plug/$optfile")) { + if (!$silence) { + $arbre['erreur'][] = _T('erreur_plugin_fichier_absent') . " : $optfile"; + } + } } } $fonctions = array(); - if (isset($arbre['fonctions'])) + if (isset($arbre['fonctions'])) { $fonctions = $arbre['fonctions']; - $liste_methodes_reservees = array('__construct','__destruct','plugin','install','uninstall',strtolower($prefix)); + } + $liste_methodes_reservees = array( + '__construct', + '__destruct', + 'plugin', + 'install', + 'uninstall', + strtolower($prefix) + ); - $extraire_pipelines = charger_fonction("extraire_pipelines","plugins"); - $arbre['pipeline'] = $extraire_pipelines($arbre); - foreach($arbre['pipeline'] as $pipe){ - if (!isset($pipe['nom'])) - if (!$silence) + $extraire_pipelines = charger_fonction("extraire_pipelines", "plugins"); + $arbre['pipeline'] = $extraire_pipelines($arbre); + foreach ($arbre['pipeline'] as $pipe) { + if (!isset($pipe['nom'])) { + if (!$silence) { $arbre['erreur'][] = _T("erreur_plugin_nom_pipeline_non_defini"); - if (isset($pipe['action'])) $action = $pipe['action']; - else $action = $pipe['nom']; + } + } + if (isset($pipe['action'])) { + $action = $pipe['action']; + } else { + $action = $pipe['nom']; + } // verif que la methode a un nom autorise - if (in_array(strtolower($action),$liste_methodes_reservees)){ - if (!$silence) - $arbre['erreur'][] = _T("erreur_plugin_nom_fonction_interdit")." : $action"; + if (in_array(strtolower($action), $liste_methodes_reservees)) { + if (!$silence) { + $arbre['erreur'][] = _T("erreur_plugin_nom_fonction_interdit") . " : $action"; + } } if (isset($pipe['inclure'])) { - $inclure = $dir_plugins."$plug/".$pipe['inclure']; - if (!@is_readable($inclure)) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $inclure"; + $inclure = $dir_plugins . "$plug/" . $pipe['inclure']; + if (!@is_readable($inclure)) { + if (!$silence) { + $arbre['erreur'][] = _T('erreur_plugin_fichier_absent') . " : $inclure"; + } + } } } $necessite = array(); $spip_trouve = false; - if (spip_xml_match_nodes(',^necessite,',$arbre,$needs)){ - foreach(array_keys($needs) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); + if (spip_xml_match_nodes(',^necessite,', $arbre, $needs)) { + foreach (array_keys($needs) as $tag) { + list($tag, $att) = spip_xml_decompose_tag($tag); if (!isset($att['id'])) { if (!$silence) { - $arbre['erreur'][] = _T('erreur_plugin_attribut_balise_manquant', array('attribut' => 'id', 'balise' => $att)); + $arbre['erreur'][] = _T('erreur_plugin_attribut_balise_manquant', + array('attribut' => 'id', 'balise' => $att)); } } else { $necessite[] = $att; } - if (strtolower($att['id']) == 'spip') + if (strtolower($att['id']) == 'spip') { $spip_trouve = true; + } } } - if ($compat_spip AND !$spip_trouve) - $necessite[] = array('id' => 'spip', 'version' => $compat_spip); + if ($compat_spip AND !$spip_trouve) { + $necessite[] = array('id' => 'spip', 'version' => $compat_spip); + } $arbre['necessite'] = $necessite; $utilise = array(); - if (spip_xml_match_nodes(',^utilise,',$arbre,$uses)){ - foreach(array_keys($uses) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); + if (spip_xml_match_nodes(',^utilise,', $arbre, $uses)) { + foreach (array_keys($uses) as $tag) { + list($tag, $att) = spip_xml_decompose_tag($tag); if (!isset($att['id'])) { if (!$silence) { - $arbre['erreur'][] = _T('erreur_plugin_attribut_balise_manquant', array('attribut' => 'id', 'balise' => $att)); + $arbre['erreur'][] = _T('erreur_plugin_attribut_balise_manquant', + array('attribut' => 'id', 'balise' => $att)); } } else { $utilise[] = $att; @@ -151,38 +184,40 @@ function plugins_verifie_conformite_dist($plug, &$arbre, $dir_plugins = _DIR_PLU } $arbre['utilise'] = $utilise; $procure = array(); - if (spip_xml_match_nodes(',^procure,',$arbre,$uses)){ - foreach(array_keys($uses) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); + if (spip_xml_match_nodes(',^procure,', $arbre, $uses)) { + foreach (array_keys($uses) as $tag) { + list($tag, $att) = spip_xml_decompose_tag($tag); $procure[] = $att; } } $arbre['procure'] = $procure; $path = array(); - if (spip_xml_match_nodes(',^chemin,',$arbre,$paths)){ - foreach(array_keys($paths) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); + if (spip_xml_match_nodes(',^chemin,', $arbre, $paths)) { + foreach (array_keys($paths) as $tag) { + list($tag, $att) = spip_xml_decompose_tag($tag); $att['path'] = $att['dir']; // ancienne syntaxe $path[] = $att; } - } - else - $path = array(array('dir'=>'')); // initialiser par defaut + } else { + $path = array(array('dir' => '')); + } // initialiser par defaut $arbre['path'] = $path; // exposer les noisettes - if (isset($arbre['noisette'])){ - foreach($arbre['noisette'] as $k=>$nut){ - $nut = preg_replace(',[.]html$,uims','',trim($nut)); + if (isset($arbre['noisette'])) { + foreach ($arbre['noisette'] as $k => $nut) { + $nut = preg_replace(',[.]html$,uims', '', trim($nut)); $arbre['noisette'][$k] = $nut; - if (!@is_readable($dir_plugins."$plug/$nut.html")) - if (!$silence) - $arbre['erreur'][] = _T('erreur_plugin_fichier_absent')." : $nut"; + if (!@is_readable($dir_plugins . "$plug/$nut.html")) { + if (!$silence) { + $arbre['erreur'][] = _T('erreur_plugin_fichier_absent') . " : $nut"; + } + } } } $traduire = array(); - if (spip_xml_match_nodes(',^traduire,',$arbre,$trads)){ - foreach(array_keys($trads) as $tag){ - list($tag,$att) = spip_xml_decompose_tag($tag); + if (spip_xml_match_nodes(',^traduire,', $arbre, $trads)) { + foreach (array_keys($trads) as $tag) { + list($tag, $att) = spip_xml_decompose_tag($tag); $traduire[] = $att; } } diff --git a/ecrire/prive.php b/ecrire/prive.php index 4df445f1fc..65289e5fd2 100644 --- a/ecrire/prive.php +++ b/ecrire/prive.php @@ -10,7 +10,7 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ - // Script pour appeler un squelette apres s'etre authentifie +// Script pour appeler un squelette apres s'etre authentifie include_once 'inc_version.php'; @@ -21,13 +21,13 @@ $var_auth = $auth(); if ($var_auth !== '') { if (!is_int($var_auth)) { - // si l'authentifie' n'a pas acces a l'espace de redac - // c'est qu'on voulait forcer sa reconnaissance en tant que visiteur. - // On reexecute pour deboucher sur le include public. - // autrement on insiste + // si l'authentifie' n'a pas acces a l'espace de redac + // c'est qu'on voulait forcer sa reconnaissance en tant que visiteur. + // On reexecute pour deboucher sur le include public. + // autrement on insiste if (is_array($var_auth)) { $var_auth = '../?' . $_SERVER['QUERY_STRING']; - spip_setcookie('spip_session', $_COOKIE['spip_session'], time() + 3600 * 24 * 14); + spip_setcookie('spip_session', $_COOKIE['spip_session'], time()+3600*24*14); } include_spip('inc/headers'); redirige_formulaire($var_auth); diff --git a/ecrire/public.php b/ecrire/public.php index cd4ed424c8..877eef932d 100644 --- a/ecrire/public.php +++ b/ecrire/public.php @@ -14,7 +14,7 @@ * Chargement (et affichage) d'une page ou d'un appel public * * @package SPIP\Core\Affichage -**/ + **/ // Distinguer une inclusion d'un appel initial // (cette distinction est obsolete a present, on la garde provisoirement @@ -27,57 +27,63 @@ if (isset($GLOBALS['_INC_PUBLIC']) AND $GLOBALS['_INC_PUBLIC']) { } else { $GLOBALS['_INC_PUBLIC'] = 1; - define('_PIPELINE_SUFFIX', test_espace_prive()?'_prive':''); + define('_PIPELINE_SUFFIX', test_espace_prive() ? '_prive' : ''); // Faut-il initialiser SPIP ? (oui dans le cas general) - if (!defined('_DIR_RESTREINT_ABS')) + if (!defined('_DIR_RESTREINT_ABS')) { if (defined('_DIR_RESTREINT') - AND @file_exists(_ROOT_RESTREINT . 'inc_version.php')) { + AND @file_exists(_ROOT_RESTREINT . 'inc_version.php') + ) { include_once _ROOT_RESTREINT . 'inc_version.php'; - } - else + } else { die('inc_version absent ?'); - - - // $fond defini dans le fichier d'appel ? - - else if (isset($fond) AND !_request('fond')) { } - - // fond demande dans l'url par page=xxxx ? - else if (isset($_GET[_SPIP_PAGE])) { - $fond = (string)$_GET[_SPIP_PAGE]; - - // Securite - if (strstr($fond, '/') - AND !( - isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes - AND include_spip('inc/autoriser') - AND autoriser('webmestre'))) { - include_spip('inc/minipres'); - echo minipres(); - exit; } - // l'argument Page a priorite sur l'argument action - // le cas se presente a cause des RewriteRule d'Apache - // qui permettent d'ajouter un argument dans la QueryString - // mais pas d'en retirer un en conservant les autres. - if (isset($_GET['action']) AND $_GET['action'] === $fond) - unset($_GET['action']); - # sinon, fond par defaut - } else { - // sinon fond par defaut (cf. assembler.php) - $fond = pipeline('detecter_fond_par_defaut',''); + } // $fond defini dans le fichier d'appel ? + + else { + if (isset($fond) AND !_request('fond')) { + } // fond demande dans l'url par page=xxxx ? + else { + if (isset($_GET[_SPIP_PAGE])) { + $fond = (string)$_GET[_SPIP_PAGE]; + + // Securite + if (strstr($fond, '/') + AND !( + isset($GLOBALS['visiteur_session']) // pour eviter d'evaluer la suite pour les anonymes + AND include_spip('inc/autoriser') + AND autoriser('webmestre')) + ) { + include_spip('inc/minipres'); + echo minipres(); + exit; + } + // l'argument Page a priorite sur l'argument action + // le cas se presente a cause des RewriteRule d'Apache + // qui permettent d'ajouter un argument dans la QueryString + // mais pas d'en retirer un en conservant les autres. + if (isset($_GET['action']) AND $_GET['action'] === $fond) { + unset($_GET['action']); + } + # sinon, fond par defaut + } else { + // sinon fond par defaut (cf. assembler.php) + $fond = pipeline('detecter_fond_par_defaut', ''); + } + } } $tableau_des_temps = array(); // Particularites de certains squelettes - if ($fond == 'login') + if ($fond == 'login') { $forcer_lang = true; + } - if (isset($forcer_lang) AND $forcer_lang AND ($forcer_lang!=='non') + if (isset($forcer_lang) AND $forcer_lang AND ($forcer_lang !== 'non') AND !_request('action') - AND $_SERVER['REQUEST_METHOD'] != 'POST') { + AND $_SERVER['REQUEST_METHOD'] != 'POST' + ) { include_spip('inc/lang'); verifier_lang_url(); } @@ -86,21 +92,22 @@ if (isset($GLOBALS['_INC_PUBLIC']) AND $GLOBALS['_INC_PUBLIC']) { // Charger l'aiguilleur des traitements derogatoires // (action en base SQL, formulaires CVT, AJax) - if (_request('action') OR _request('var_ajax') OR _request('formulaire_action')){ + if (_request('action') OR _request('var_ajax') OR _request('formulaire_action')) { include_spip('public/aiguiller'); if ( // cas des appels actions ?action=xxx traiter_appels_actions() - OR + OR // cas des hits ajax sur les inclusions ajax traiter_appels_inclusions_ajax() - OR + OR // cas des formulaires charger/verifier/traiter - traiter_formulaires_dynamiques()){ + traiter_formulaires_dynamiques() + ) { // lancer les taches sur affichage final, comme le cron // mais sans rien afficher $GLOBALS['html'] = false; // ne rien afficher - pipeline('affichage_final'._PIPELINE_SUFFIX, ''); + pipeline('affichage_final' . _PIPELINE_SUFFIX, ''); exit; // le hit est fini ! } } @@ -120,7 +127,7 @@ if (isset($GLOBALS['_INC_PUBLIC']) AND $GLOBALS['_INC_PUBLIC']) { $page['entetes']['Content-Type'] = 'text/html; charset=' . $charset; $html = true; } else { - $html = preg_match(',^\s*text/html,',$page['entetes']['Content-Type']); + $html = preg_match(',^\s*text/html,', $page['entetes']['Content-Type']); } // Tester si on est admin et il y a des choses supplementaires a dire @@ -129,32 +136,33 @@ if (isset($GLOBALS['_INC_PUBLIC']) AND $GLOBALS['_INC_PUBLIC']) { // affiche-t-on les boutons d'administration ? voir f_admin() $affiche_boutons_admin = ($html AND ( - (isset($_COOKIE['spip_admin']) AND (!isset($flag_preserver) OR !$flag_preserver)) - OR ($debug and include_spip('inc/autoriser') and autoriser('debug')) - OR (defined('_VAR_PREVIEW') AND _VAR_PREVIEW) - )); + (isset($_COOKIE['spip_admin']) AND (!isset($flag_preserver) OR !$flag_preserver)) + OR ($debug and include_spip('inc/autoriser') and autoriser('debug')) + OR (defined('_VAR_PREVIEW') AND _VAR_PREVIEW) + )); - if ($affiche_boutons_admin) + if ($affiche_boutons_admin) { include_spip('balise/formulaire_admin'); + } // Execution de la page calculee // traitements sur les entetes avant envoi // peut servir pour le plugin de stats - $page['entetes'] = pipeline('affichage_entetes_final'._PIPELINE_SUFFIX, $page['entetes']); + $page['entetes'] = pipeline('affichage_entetes_final' . _PIPELINE_SUFFIX, $page['entetes']); // eval $page et affecte $res - include _ROOT_RESTREINT."public/evaluer_page.php"; + include _ROOT_RESTREINT . "public/evaluer_page.php"; envoyer_entetes($page['entetes']); if ($res === false) { include_spip('inc/autoriser'); $err = _T('zbug_erreur_execution_page'); if (autoriser('webmestre')) { $err .= "\n<hr />\n" - .highlight_string($page['codephp'],true) - ."\n<hr />\n"; + . highlight_string($page['codephp'], true) + . "\n<hr />\n"; } $msg = array($err); erreur_squelette($msg); @@ -165,9 +173,11 @@ if (isset($GLOBALS['_INC_PUBLIC']) AND $GLOBALS['_INC_PUBLIC']) { // // (c'est ici qu'on fait var_recherche, validation, boutons d'admin, // cf. public/assembler.php) - echo pipeline('affichage_final'._PIPELINE_SUFFIX, $page['texte']); + echo pipeline('affichage_final' . _PIPELINE_SUFFIX, $page['texte']); - if ($lang) lang_select(); + if ($lang) { + lang_select(); + } // l'affichage de la page a pu lever des erreurs (inclusion manquante) // il faut tester a nouveau $debug = ((_request('var_mode') == 'debug') OR $tableau_des_temps) ? array(1) : array(); @@ -178,22 +188,24 @@ if (isset($GLOBALS['_INC_PUBLIC']) AND $GLOBALS['_INC_PUBLIC']) { // en cas d'erreur, retester l'affichage if ($html AND ($affiche_boutons_admin OR $debug)) { $var_mode_affiche = _request('var_mode_affiche'); - $var_mode_objet = _request('var_mode_objet'); - $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche== 'validation' ? $page['texte'] :""); + $var_mode_objet = _request('var_mode_objet'); + $GLOBALS['debug_objets'][$var_mode_affiche][$var_mode_objet . 'tout'] = ($var_mode_affiche == 'validation' ? $page['texte'] : ""); echo erreur_squelette(false); } } else { if (isset($GLOBALS['meta']['date_prochain_postdate']) - AND $GLOBALS['meta']['date_prochain_postdate'] <= time()) { + AND $GLOBALS['meta']['date_prochain_postdate'] <= time() + ) { include_spip('inc/rubriques'); calculer_prochain_postdate(true); } // Effectuer une tache de fond ? // si _DIRECT_CRON_FORCE est present, on force l'appel - if (defined('_DIRECT_CRON_FORCE')) + if (defined('_DIRECT_CRON_FORCE')) { cron(); + } // sauver le cache chemin si necessaire save_path_cache(); diff --git a/ecrire/public/admin.php b/ecrire/public/admin.php index d04aa45f20..02370241eb 100644 --- a/ecrire/public/admin.php +++ b/ecrire/public/admin.php @@ -14,9 +14,11 @@ * Affichage des boutons d'administration * * @package SPIP\Core\Administration -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Ajoute les boutons d'administration de la page s'ils n'y sont pas déjà @@ -25,36 +27,37 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * puis les boutons. * * Feuilles de style admin : d'abord la CSS officielle, puis la perso - * + * * @param string $contenu * Contenu HTML de la page qui va être envoyée au navigateur * @return string * Contenu HTML, avec boutons d'administrations et sa CSS -**/ + **/ function affiche_boutons_admin($contenu) { include_spip('inc/filtres'); // Inserer le css d'admin - $css = "<link rel='stylesheet' href='".url_absolue(direction_css(find_in_path('spip_admin.css'))) - . "' type='text/css' />\n"; - if ($f = find_in_path('spip_admin_perso.css')) + $css = "<link rel='stylesheet' href='" . url_absolue(direction_css(find_in_path('spip_admin.css'))) + . "' type='text/css' />\n"; + if ($f = find_in_path('spip_admin_perso.css')) { $css .= "<link rel='stylesheet' href='" - . url_absolue(direction_css($f)) . "' type='text/css' />\n"; + . url_absolue(direction_css($f)) . "' type='text/css' />\n"; + } ($pos = stripos($contenu, '</head>')) - || ($pos = stripos($contenu, '<body>')) - || ($pos = 0); + || ($pos = stripos($contenu, '<body>')) + || ($pos = 0); $contenu = substr_replace($contenu, $css, $pos, 0); // Inserer la balise #FORMULAIRE_ADMIN, en float $boutons_admin = inclure_balise_dynamique( balise_FORMULAIRE_ADMIN_dyn('spip-admin-float'), - false); + false); ($pos = strripos($contenu, '</body>')) - || ($pos = strripos($contenu, '</html>')) - || ($pos = strlen($contenu)); + || ($pos = strripos($contenu, '</html>')) + || ($pos = strlen($contenu)); $contenu = substr_replace($contenu, $boutons_admin, $pos, 0); diff --git a/ecrire/public/aiguiller.php b/ecrire/public/aiguiller.php index 8272711cc7..102837be54 100644 --- a/ecrire/public/aiguiller.php +++ b/ecrire/public/aiguiller.php @@ -10,25 +10,31 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -function securiser_redirect_action($redirect){ - if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT')){ +function securiser_redirect_action($redirect) { + if (tester_url_absolue($redirect) AND !defined('_AUTORISER_ACTION_ABS_REDIRECT')) { // si l'url est une url du site, on la laisse passer sans rien faire // c'est encore le plus simple - $base = $GLOBALS['meta']['adresse_site']."/"; - if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0) + $base = $GLOBALS['meta']['adresse_site'] . "/"; + if (strlen($base) AND strncmp($redirect, $base, strlen($base)) == 0) { return $redirect; + } $base = url_de_base(); - if (strlen($base) AND strncmp($redirect,$base,strlen($base))==0) + if (strlen($base) AND strncmp($redirect, $base, strlen($base)) == 0) { return $redirect; + } + return ""; } + return $redirect; } // http://code.spip.net/@traiter_appels_actions -function traiter_appels_actions(){ +function traiter_appels_actions() { // cas de l'appel qui renvoie une redirection (302) ou rien (204) if ($action = _request('action')) { include_spip('base/abstract_sql'); // chargement systematique pour les actions @@ -43,96 +49,107 @@ function traiter_appels_actions(){ // si l'action est provoque par un hit {ajax} // il faut transmettre l'env ajax au redirect // on le met avant dans la query string au cas ou l'action fait elle meme sa redirection - if (($v=_request('var_ajax')) - AND ($v!=='form') - AND ($args = _request('var_ajax_env')) - AND ($url = _request('redirect'))){ - $url = parametre_url($url,'var_ajax',$v,'&'); - $url = parametre_url($url,'var_ajax_env',$args,'&'); - set_request('redirect',$url); - } - else if(_request('redirect')){ - set_request('redirect',securiser_redirect_action(_request('redirect'))); + if (($v = _request('var_ajax')) + AND ($v !== 'form') + AND ($args = _request('var_ajax_env')) + AND ($url = _request('redirect')) + ) { + $url = parametre_url($url, 'var_ajax', $v, '&'); + $url = parametre_url($url, 'var_ajax_env', $args, '&'); + set_request('redirect', $url); + } else { + if (_request('redirect')) { + set_request('redirect', securiser_redirect_action(_request('redirect'))); + } } $var_f = charger_fonction($action, 'action'); $var_f(); if (!isset($GLOBALS['redirect'])) { $GLOBALS['redirect'] = _request('redirect'); - if ($_SERVER['REQUEST_METHOD'] == 'POST') + if ($_SERVER['REQUEST_METHOD'] == 'POST') { $GLOBALS['redirect'] = urldecode($GLOBALS['redirect']); + } $GLOBALS['redirect'] = securiser_redirect_action($GLOBALS['redirect']); } if ($url = $GLOBALS['redirect']) { // si l'action est provoque par un hit {ajax} // il faut transmettre l'env ajax au redirect // qui a pu etre defini par l'action - if (($v=_request('var_ajax')) - AND ($v!=='form') - AND ($args = _request('var_ajax_env'))) { - $url = parametre_url($url,'var_ajax',$v,'&'); - $url = parametre_url($url,'var_ajax_env',$args,'&'); + if (($v = _request('var_ajax')) + AND ($v !== 'form') + AND ($args = _request('var_ajax_env')) + ) { + $url = parametre_url($url, 'var_ajax', $v, '&'); + $url = parametre_url($url, 'var_ajax_env', $args, '&'); // passer l'ancre en variable pour pouvoir la gerer cote serveur - $url = preg_replace(',#([^#&?]+)$,',"&var_ajax_ancre=\\1",$url); + $url = preg_replace(',#([^#&?]+)$,', "&var_ajax_ancre=\\1", $url); } - $url = str_replace('&','&',$url); // les redirections se font en &, pas en en & + $url = str_replace('&', '&', $url); // les redirections se font en &, pas en en & redirige_par_entete($url); } if (!headers_sent() - AND !ob_get_length()) - http_status(204); // No Content + AND !ob_get_length() + ) { + http_status(204); + } // No Content return true; } + return false; } // http://code.spip.net/@refuser_traiter_formulaire_ajax -function refuser_traiter_formulaire_ajax(){ - if ($v=_request('var_ajax') - AND $v=='form' +function refuser_traiter_formulaire_ajax() { + if ($v = _request('var_ajax') + AND $v == 'form' AND $form = _request('formulaire_action') AND $args = _request('formulaire_action_args') - AND decoder_contexte_ajax($args,$form)!==false) { + AND decoder_contexte_ajax($args, $form) !== false + ) { // on est bien dans le contexte de traitement d'un formulaire en ajax // mais traiter ne veut pas // on le dit a la page qui va resumbit // sans ajax include_spip('inc/actions'); - ajax_retour('noajax',false); + ajax_retour('noajax', false); exit; } } // http://code.spip.net/@traiter_appels_inclusions_ajax -function traiter_appels_inclusions_ajax(){ +function traiter_appels_inclusions_ajax() { // traiter les appels de bloc ajax (ex: pagination) if ($v = _request('var_ajax') - AND $v !== 'form' - AND $args = _request('var_ajax_env')) { + AND $v !== 'form' + AND $args = _request('var_ajax_env') + ) { include_spip('inc/filtres'); include_spip('inc/actions'); if ($args = decoder_contexte_ajax($args) - AND $fond = $args['fond']) { + AND $fond = $args['fond'] + ) { include_spip('public/assembler'); $contexte = calculer_contexte(); $contexte = array_merge($args, $contexte); - $page = recuperer_fond($fond,$contexte,array('trim'=>false)); + $page = recuperer_fond($fond, $contexte, array('trim' => false)); $texte = $page; - if ($ancre = _request('var_ajax_ancre')){ + if ($ancre = _request('var_ajax_ancre')) { // pas n'importe quoi quand meme dans la variable ! - $ancre = str_replace(array('<','"',"'"),array('<','"',''),$ancre); - $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>".$texte; + $ancre = str_replace(array('<', '"', "'"), array('<', '"', ''), $ancre); + $texte = "<a href='#$ancre' name='ajax_ancre' style='display:none;'>anchor</a>" . $texte; } - } - else { + } else { include_spip('inc/headers'); http_status(403); $texte = _L('signature ajax bloc incorrecte'); } ajax_retour($texte, false); + return true; // on a fini le hit } - return false; + + return false; } // au 1er appel, traite les formulaires dynamiques charger/verifier/traiter @@ -140,21 +157,28 @@ function traiter_appels_inclusions_ajax(){ // Le 1er renvoie True si il faut faire exit a la sortie // http://code.spip.net/@traiter_formulaires_dynamiques -function traiter_formulaires_dynamiques($get = false){ +function traiter_formulaires_dynamiques($get = false) { static $post = array(); static $done = false; - if ($get) return $post; - if ($done) return false; + if ($get) { + return $post; + } + if ($done) { + return false; + } $done = true; if (!($form = _request('formulaire_action') - AND $args = _request('formulaire_action_args'))) - return false; // le hit peut continuer normalement + AND $args = _request('formulaire_action_args')) + ) { + return false; + } // le hit peut continuer normalement include_spip('inc/filtres'); - if (($args = decoder_contexte_ajax($args,$form))===false) { + if (($args = decoder_contexte_ajax($args, $form)) === false) { spip_log("signature ajax form incorrecte : $form"); + return false; // continuons le hit comme si de rien etait } else { include_spip('inc/lang'); @@ -163,43 +187,48 @@ function traiter_formulaires_dynamiques($get = false){ // changer la langue avec celle qui a cours dans le formulaire // on la depile de $args car c'est un argument implicite masque changer_langue(array_shift($args)); - + // inclure mes_fonctions et autres filtres avant verifier/traiter include_spip('public/parametrer'); // ainsi que l'API SQL bien utile dans verifier/traiter include_spip('base/abstract_sql'); - $verifier = charger_fonction("verifier","formulaires/$form/",true); + $verifier = charger_fonction("verifier", "formulaires/$form/", true); $post["erreurs_$form"] = pipeline( - 'formulaire_verifier', - array( - 'args'=>array('form'=>$form,'args'=>$args), - 'data'=>$verifier?call_user_func_array($verifier,$args):array()) - ); + 'formulaire_verifier', + array( + 'args' => array('form' => $form, 'args' => $args), + 'data' => $verifier ? call_user_func_array($verifier, $args) : array() + ) + ); // accessibilite : si des erreurs mais pas de message general l'ajouter - if (count($post["erreurs_$form"]) AND !isset($post["erreurs_$form"]['message_erreur'])){ - $post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(count($post["erreurs_$form"]),'avis_1_erreur_saisie','avis_nb_erreurs_saisie'); + if (count($post["erreurs_$form"]) AND !isset($post["erreurs_$form"]['message_erreur'])) { + $post["erreurs_$form"]['message_erreur'] = singulier_ou_pluriel(count($post["erreurs_$form"]), + 'avis_1_erreur_saisie', 'avis_nb_erreurs_saisie'); } // si on ne demandait qu'une verif json - if (_request('formulaire_action_verifier_json')){ + if (_request('formulaire_action_verifier_json')) { include_spip('inc/json'); include_spip('inc/actions'); - ajax_retour(json_encode($post["erreurs_$form"]),'text/plain'); + ajax_retour(json_encode($post["erreurs_$form"]), 'text/plain'); + return true; // on a fini le hit } $retour = ""; - if ((count($post["erreurs_$form"])==0)){ + if ((count($post["erreurs_$form"]) == 0)) { $rev = ""; - if ($traiter = charger_fonction("traiter","formulaires/$form/",true)) - $rev = call_user_func_array($traiter,$args); + if ($traiter = charger_fonction("traiter", "formulaires/$form/", true)) { + $rev = call_user_func_array($traiter, $args); + } $rev = pipeline( - 'formulaire_traiter', - array( - 'args'=>array('form'=>$form,'args'=>$args), - 'data'=>$rev) - ); + 'formulaire_traiter', + array( + 'args' => array('form' => $form, 'args' => $args), + 'data' => $rev + ) + ); // le retour de traiter est // un tableau explicite ('editable'=>$editable,'message_ok'=>$message,'redirect'=>$redirect,'id_xx'=>$id_xx) // il permet le pipelinage, en particulier @@ -207,46 +236,49 @@ function traiter_formulaires_dynamiques($get = false){ // si message_erreur est present, on considere que le traitement a echoue $post["message_ok_$form"] = ''; // on peut avoir message_ok et message_erreur - if (isset($rev['message_ok'])) + if (isset($rev['message_ok'])) { $post["message_ok_$form"] = $rev['message_ok']; + } // verifier si traiter n'a pas echoue avec une erreur : if (isset($rev['message_erreur'])) { $post["erreurs_$form"]["message_erreur"] = $rev['message_erreur']; // si il y a une erreur on ne redirige pas - } - else { + } else { // sinon faire ce qu'il faut : - if (isset($rev['editable'])) + if (isset($rev['editable'])) { $post["editable_$form"] = $rev['editable']; + } // si une redirection est demandee, appeler redirigae_formulaire qui choisira // le bon mode de redirection (302 et on ne revient pas ici, ou javascript et on continue) - if (isset($rev['redirect']) AND $rev['redirect']){ + if (isset($rev['redirect']) AND $rev['redirect']) { include_spip('inc/headers'); - list($masque,$message) = redirige_formulaire($rev['redirect'], '','ajaxform'); + list($masque, $message) = redirige_formulaire($rev['redirect'], '', 'ajaxform'); $post["message_ok_$form"] .= $message; $retour .= $masque; } } } // si le formulaire a ete soumis en ajax, on le renvoie direct ! - if (_request('var_ajax')){ - if (find_in_path('formulaire_.php','balise/',true)) { + if (_request('var_ajax')) { + if (find_in_path('formulaire_.php', 'balise/', true)) { include_spip('inc/actions'); include_spip('public/assembler'); - array_unshift($args,$form); - $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn',$args),false); + array_unshift($args, $form); + $retour .= inclure_balise_dynamique(call_user_func_array('balise_formulaire__dyn', $args), false); // on ajoute un br en display none en tete du retour ajax pour regler un bug dans IE6/7 // sans cela le formulaire n'est pas actif apres le hit ajax // la classe ajax-form-is-ok sert a s'assurer que le retour ajax s'est bien passe - $retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>".$retour; - ajax_retour($retour,false); + $retour = "<br class='bugajaxie ajax-form-is-ok' style='display:none;'/>" . $retour; + ajax_retour($retour, false); + return true; // on a fini le hit } } // restaurer la lang en cours changer_langue($old_lang); } + return false; // le hit peut continuer normalement } diff --git a/ecrire/public/assembler.php b/ecrire/public/assembler.php index 1e096715aa..6a5d9fe4eb 100644 --- a/ecrire/public/assembler.php +++ b/ecrire/public/assembler.php @@ -12,39 +12,49 @@ /** * Ce fichier regroupe les fonctions permettant de calculer la page et les entêtes - * - * Determine le contexte donne par l'URL (en tenant compte des reecritures) + * + * Determine le contexte donne par l'URL (en tenant compte des reecritures) * grace a la fonction de passage d'URL a id (reciproque dans urls/*php) - * + * * @package SPIP\Core\Compilateur\Assembler -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -if (!defined('_CONTEXTE_IGNORE_VARIABLES')) define('_CONTEXTE_IGNORE_VARIABLES', "/(^var_|^PHPSESSID$)/"); +if (!defined('_CONTEXTE_IGNORE_VARIABLES')) { + define('_CONTEXTE_IGNORE_VARIABLES', "/(^var_|^PHPSESSID$)/"); +} // http://code.spip.net/@assembler -function assembler($fond, $connect = ''){ +function assembler($fond, $connect = '') { // flag_preserver est modifie ici, et utilise en globale // use_cache sert a informer le bouton d'admin pr savoir s'il met un * // contexte est utilise en globale dans le formulaire d'admin $GLOBALS['contexte'] = calculer_contexte(); - $page = array('contexte_implicite'=>calculer_contexte_implicite()); - $page['contexte_implicite']['cache'] = $fond . preg_replace(',\.[a-zA-Z0-9]*$,', '', preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])); + $page = array('contexte_implicite' => calculer_contexte_implicite()); + $page['contexte_implicite']['cache'] = $fond . preg_replace(',\.[a-zA-Z0-9]*$,', '', + preg_replace('/[?].*$/', '', $GLOBALS['REQUEST_URI'])); // Cette fonction est utilisee deux fois $cacher = charger_fonction('cacher', 'public', true); // Les quatre derniers parametres sont modifies par la fonction: // emplacement, validite, et, s'il est valide, contenu & age - if ($cacher) + if ($cacher) { $res = $cacher($GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, $page, $lastmodified); - else + } else { $GLOBALS['use_cache'] = -1; + } // Si un resultat est retourne, c'est un message d'impossibilite - if ($res) {return array('texte' => $res);} + if ($res) { + return array('texte' => $res); + } - if (!$chemin_cache || !$lastmodified) $lastmodified = time(); + if (!$chemin_cache || !$lastmodified) { + $lastmodified = time(); + } $headers_only = ($_SERVER['REQUEST_METHOD'] == 'HEAD'); $calculer_page = true; @@ -53,12 +63,12 @@ function assembler($fond, $connect = ''){ // une perennite valide a meme reponse qu'une requete HEAD (par defaut les // pages sont dynamiques) if (isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) - AND (!defined('_VAR_MODE') OR !_VAR_MODE) - AND $chemin_cache - AND isset($page['entetes']) - AND isset($page['entetes']['Cache-Control']) - AND strstr($page['entetes']['Cache-Control'],'max-age=') - AND !strstr($_SERVER['SERVER_SOFTWARE'],'IIS/') + AND (!defined('_VAR_MODE') OR !_VAR_MODE) + AND $chemin_cache + AND isset($page['entetes']) + AND isset($page['entetes']['Cache-Control']) + AND strstr($page['entetes']['Cache-Control'], 'max-age=') + AND !strstr($_SERVER['SERVER_SOFTWARE'], 'IIS/') ) { $since = preg_replace('/;.*/', '', $_SERVER['HTTP_IF_MODIFIED_SINCE']); @@ -76,7 +86,7 @@ function assembler($fond, $connect = ''){ $page['texte'] = ""; } else { // si la page est prise dans le cache - if (!$GLOBALS['use_cache']) { + if (!$GLOBALS['use_cache']) { // Informer les boutons d'admin du contexte // (fourni par urls_decoder_url ci-dessous lors de la mise en cache) $GLOBALS['contexte'] = $page['contexte']; @@ -86,52 +96,56 @@ function assembler($fond, $connect = ''){ // plus necessaire si on utilise bien la fonction urls_decoder_url #unset($_SERVER['REDIRECT_url_propre']); #unset($_ENV['url_propre']); - } - else { + } else { // Compat ascendante : // 1. $contexte est global // (a evacuer car urls_decoder_url gere ce probleme ?) // et calculer la page if (!test_espace_prive()) { include_spip('inc/urls'); - list($fond,$GLOBALS['contexte'],$url_redirect) = urls_decoder_url(nettoyer_uri(),$fond,$GLOBALS['contexte'],true); + list($fond, $GLOBALS['contexte'], $url_redirect) = urls_decoder_url(nettoyer_uri(), $fond, $GLOBALS['contexte'], + true); } // squelette par defaut - if (!strlen($fond)) + if (!strlen($fond)) { $fond = 'sommaire'; + } // produire la page : peut mettre a jour $lastmodified - $produire_page = charger_fonction('produire_page','public'); - $page = $produire_page($fond, $GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, NULL, $page, $lastmodified, $connect); + $produire_page = charger_fonction('produire_page', 'public'); + $page = $produire_page($fond, $GLOBALS['contexte'], $GLOBALS['use_cache'], $chemin_cache, null, $page, + $lastmodified, $connect); if ($page === '') { $erreur = _T('info_erreur_squelette2', - array('fichier'=>spip_htmlspecialchars($fond).'.'._EXTENSION_SQUELETTES)); + array('fichier' => spip_htmlspecialchars($fond) . '.' . _EXTENSION_SQUELETTES)); erreur_squelette($erreur); // eviter des erreurs strictes ensuite sur $page['cle'] en PHP >= 5.4 $page = array('texte' => '', 'erreur' => $erreur); } } - if ($page AND $chemin_cache) $page['cache'] = $chemin_cache; + if ($page AND $chemin_cache) { + $page['cache'] = $chemin_cache; + } auto_content_type($page); - $GLOBALS['flag_preserver'] |= headers_sent(); + $GLOBALS['flag_preserver'] |= headers_sent(); // Definir les entetes si ce n'est fait if (!$GLOBALS['flag_preserver']) { if ($GLOBALS['flag_ob']) { // Si la page est vide, produire l'erreur 404 ou message d'erreur pour les inclusions if (trim($page['texte']) === '' - AND _VAR_MODE != 'debug' - AND !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur + AND _VAR_MODE != 'debug' + AND !isset($page['entetes']['Location']) // cette page realise une redirection, donc pas d'erreur ) { $GLOBALS['contexte']['fond_erreur'] = $fond; - $page = message_page_indisponible($page, $GLOBALS['contexte']); + $page = message_page_indisponible($page, $GLOBALS['contexte']); } // pas de cache client en mode 'observation' if (defined('_VAR_MODE') AND _VAR_MODE) { - $page['entetes']["Cache-Control"]= "no-cache,must-revalidate"; + $page['entetes']["Cache-Control"] = "no-cache,must-revalidate"; $page['entetes']["Pragma"] = "no-cache"; } } @@ -142,41 +156,46 @@ function assembler($fond, $connect = ''){ // eviter d'etre incoherent en envoyant un lastmodified identique // a celui qu'on a refuse d'honorer plus haut (cf. #655) if ($lastmodified - AND !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) - AND !isset($page['entetes']["Last-Modified"])) - $page['entetes']["Last-Modified"]=gmdate("D, d M Y H:i:s", $lastmodified)." GMT"; + AND !isset($_SERVER['HTTP_IF_MODIFIED_SINCE']) + AND !isset($page['entetes']["Last-Modified"]) + ) { + $page['entetes']["Last-Modified"] = gmdate("D, d M Y H:i:s", $lastmodified) . " GMT"; + } // fermer la connexion apres les headers si requete HEAD - if ($headers_only) + if ($headers_only) { $page['entetes']["Connection"] = "close"; + } return $page; } /** * Calcul le contexte de la page - * + * * lors du calcul d'une page spip etablit le contexte a partir * des variables $_GET et $_POST, purgees des fausses variables var_* - * + * * Note : pour hacker le contexte depuis le fichier d'appel (page.php), * il est recommande de modifier $_GET['toto'] (meme si la page est * appelee avec la methode POST). - * + * * http://code.spip.net/@calculer_contexte - * + * * @return array Un tableau du contexte de la page */ function calculer_contexte() { $contexte = array(); - foreach($_GET as $var => $val) { - if (!preg_match(_CONTEXTE_IGNORE_VARIABLES,$var)) + foreach ($_GET as $var => $val) { + if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { $contexte[$var] = $val; + } } - foreach($_POST as $var => $val) { - if (!preg_match(_CONTEXTE_IGNORE_VARIABLES,$var)) + foreach ($_POST as $var => $val) { + if (!preg_match(_CONTEXTE_IGNORE_VARIABLES, $var)) { $contexte[$var] = $val; + } } return $contexte; @@ -189,21 +208,22 @@ function calculer_contexte() { * @staticvar string $notes * @return array */ -function calculer_contexte_implicite(){ +function calculer_contexte_implicite() { static $notes = null; - if (is_null($notes)) - $notes = charger_fonction('notes','inc',true); + if (is_null($notes)) { + $notes = charger_fonction('notes', 'inc', true); + } $contexte_implicite = array( 'squelettes' => $GLOBALS['dossier_squelettes'], // devrait etre 'chemin' => $GLOBALS['path_sig'], ? 'host' => $_SERVER['HTTP_HOST'], 'https' => (isset($_SERVER['HTTPS']) ? $_SERVER['HTTPS'] : ''), 'espace' => test_espace_prive(), - 'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''), - 'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''), - 'notes' => $notes?$notes('','contexter_cache'):'', + 'marqueur' => (isset($GLOBALS['marqueur']) ? $GLOBALS['marqueur'] : ''), + 'marqueur_skel' => (isset($GLOBALS['marqueur_skel']) ? $GLOBALS['marqueur_skel'] : ''), + 'notes' => $notes ? $notes('', 'contexter_cache') : '', 'spip_version_code' => $GLOBALS['spip_version_code'], ); - if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])){ + if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) { $contexte_implicite['host'] .= "|" . $_SERVER['HTTP_X_FORWARDED_HOST']; } @@ -215,40 +235,46 @@ function calculer_contexte_implicite(){ // // http://code.spip.net/@auto_content_type -function auto_content_type($page){ +function auto_content_type($page) { - if (!isset($GLOBALS['flag_preserver'])){ - $GLOBALS['flag_preserver'] = ($page && preg_match("/header\s*\(\s*.content\-type:/isx",$page['texte']) || (isset($page['entetes']['Content-Type']))); + if (!isset($GLOBALS['flag_preserver'])) { + $GLOBALS['flag_preserver'] = ($page && preg_match("/header\s*\(\s*.content\-type:/isx", + $page['texte']) || (isset($page['entetes']['Content-Type']))); } } // http://code.spip.net/@inclure_page -function inclure_page($fond, $contexte, $connect = ''){ +function inclure_page($fond, $contexte, $connect = '') { static $cacher, $produire_page; // enlever le fond de contexte inclus car sinon il prend la main // dans les sous inclusions -> boucle infinie d'inclusion identique // (cette precaution n'est probablement plus utile) unset($contexte['fond']); - $page = array('contexte_implicite'=>calculer_contexte_implicite()); + $page = array('contexte_implicite' => calculer_contexte_implicite()); $page['contexte_implicite']['cache'] = $fond; - if (is_null($cacher)) + if (is_null($cacher)) { $cacher = charger_fonction('cacher', 'public', true); + } // Les quatre derniers parametres sont modifies par la fonction: // emplacement, validite, et, s'il est valide, contenu & age - if ($cacher) + if ($cacher) { $res = $cacher($contexte, $use_cache, $chemin_cache, $page, $lastinclude); - else + } else { $use_cache = -1; + } // $res = message d'erreur : on sort de la - if ($res) {return array('texte' => $res);} + if ($res) { + return array('texte' => $res); + } // Si use_cache ne vaut pas 0, la page doit etre calculee // produire la page : peut mettre a jour $lastinclude // le contexte_cache envoye a cacher() a ete conserve et est passe a produire if ($use_cache) { - if (is_null($produire_page)) - $produire_page = charger_fonction('produire_page','public'); + if (is_null($produire_page)) { + $produire_page = charger_fonction('produire_page', 'public'); + } $page = $produire_page($fond, $contexte, $use_cache, $chemin_cache, $contexte, $page, $lastinclude, $connect); } // dans tous les cas, mettre a jour $GLOBALS['lastmodified'] @@ -271,25 +297,39 @@ function inclure_page($fond, $contexte, $connect = ''){ * @param string $connect * @return array */ -function public_produire_page_dist($fond, $contexte, $use_cache, $chemin_cache, $contexte_cache, &$page, &$lastinclude, $connect = ''){ - static $parametrer,$cacher; - if (!$parametrer) +function public_produire_page_dist( + $fond, + $contexte, + $use_cache, + $chemin_cache, + $contexte_cache, + &$page, + &$lastinclude, + $connect = '' +) { + static $parametrer, $cacher; + if (!$parametrer) { $parametrer = charger_fonction('parametrer', 'public'); + } $page = $parametrer($fond, $contexte, $chemin_cache, $connect); // et on l'enregistre sur le disque if ($chemin_cache - AND $use_cache>-1 - AND is_array($page) - AND count($page) - AND $page['entetes']['X-Spip-Cache'] > 0){ - if (is_null($cacher)) + AND $use_cache > -1 + AND is_array($page) + AND count($page) + AND $page['entetes']['X-Spip-Cache'] > 0 + ) { + if (is_null($cacher)) { $cacher = charger_fonction('cacher', 'public', true); + } $lastinclude = time(); - if ($cacher) + if ($cacher) { $cacher($contexte_cache, $use_cache, $chemin_cache, $page, $lastinclude); - else + } else { $use_cache = -1; + } } + return $page; } @@ -303,9 +343,10 @@ function public_produire_page_dist($fond, $contexte, $use_cache, $chemin_cache, // 3: ligne // 4: langue -function inserer_balise_dynamique($contexte_exec, $contexte_compil){ - if (!is_array($contexte_exec)) - echo $contexte_exec; // message d'erreur etc +function inserer_balise_dynamique($contexte_exec, $contexte_compil) { + if (!is_array($contexte_exec)) { + echo $contexte_exec; + } // message d'erreur etc else { inclure_balise_dynamique($contexte_exec, true, $contexte_compil); } @@ -314,24 +355,25 @@ function inserer_balise_dynamique($contexte_exec, $contexte_compil){ /** * Inclusion de balise dynamique * Attention, un appel explicite a cette fonction suppose certains include - * + * * http://code.spip.net/@inclure_balise_dynamique - * + * * @param string|array $texte * @param bool $echo Faut-il faire echo ou return * @param array $contexte_compil Contexte de la compilation * @return string */ -function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = array()){ +function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = array()) { if (is_array($texte)) { list($fond, $delainc, $contexte_inclus) = $texte; // delais a l'ancienne, c'est pratiquement mort - $d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : NULL; + $d = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : null; $GLOBALS['delais'] = $delainc; - $page = recuperer_fond($fond,$contexte_inclus,array('trim'=>false, 'raw' => true, 'compil' => $contexte_compil)); + $page = recuperer_fond($fond, $contexte_inclus, + array('trim' => false, 'raw' => true, 'compil' => $contexte_compil)); $texte = $page['texte']; @@ -342,24 +384,26 @@ function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = array unset($page['entetes']['X-Spip-Cache']); unset($page['entetes']['Content-Type']); if (isset($GLOBALS['page']) AND is_array($GLOBALS['page'])) { - if (!is_array($GLOBALS['page']['entetes'])) + if (!is_array($GLOBALS['page']['entetes'])) { $GLOBALS['page']['entetes'] = array(); - $GLOBALS['page']['entetes'] = - array_merge($GLOBALS['page']['entetes'],$page['entetes']); + } + $GLOBALS['page']['entetes'] = + array_merge($GLOBALS['page']['entetes'], $page['entetes']); } } // _pipelines au pluriel array('nom_pipeline' => $args...) avec une syntaxe permettant plusieurs pipelines if (isset($page['contexte']['_pipelines']) AND is_array($page['contexte']['_pipelines']) - AND count($page['contexte']['_pipelines'])) { - foreach($page['contexte']['_pipelines'] as $pipe=>$args){ + AND count($page['contexte']['_pipelines']) + ) { + foreach ($page['contexte']['_pipelines'] as $pipe => $args) { $args['contexte'] = $page['contexte']; unset($args['contexte']['_pipelines']); // par precaution, meme si le risque de boucle infinie est a priori nul $texte = pipeline( $pipe, array( - 'data'=>$texte, - 'args'=>$args + 'data' => $texte, + 'args' => $args ), false ); @@ -369,19 +413,22 @@ function inclure_balise_dynamique($texte, $echo = true, $contexte_compil = array if (defined('_VAR_MODE') AND _VAR_MODE == 'debug') { // compatibilite : avant on donnait le numero de ligne ou rien. - $ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil); + $ligne = intval(isset($contexte_compil[3]) ? $contexte_compil[3] : $contexte_compil); $GLOBALS['debug_objets']['resultat'][$ligne] = $texte; } - if ($echo) + if ($echo) { echo $texte; - else + } else { return $texte; + } } // http://code.spip.net/@message_page_indisponible -function message_page_indisponible ($page, $contexte){ +function message_page_indisponible($page, $contexte) { static $deja = false; - if ($deja) return "erreur"; + if ($deja) { + return "erreur"; + } $codes = array( '404' => '404 Not Found', '503' => '503 Service Unavailable', @@ -390,18 +437,20 @@ function message_page_indisponible ($page, $contexte){ $contexte['status'] = ($page !== false) ? '404' : '503'; $contexte['code'] = $codes[$contexte['status']]; $contexte['fond'] = '404'; // gere les 2 erreurs - if (!isset($contexte['lang'])) + if (!isset($contexte['lang'])) { $contexte['lang'] = $GLOBALS['spip_lang']; + } $deja = true; // passer aux plugins qui peuvent decider d'une page d'erreur plus pertinent // ex restriction d'acces => 401 - $contexte = pipeline('page_indisponible',$contexte); + $contexte = pipeline('page_indisponible', $contexte); // produire la page d'erreur $page = inclure_page($contexte['fond'], $contexte); - if (!$page) + if (!$page) { $page = inclure_page('404', $contexte); + } $page['status'] = $contexte['status']; return $page; @@ -410,23 +459,26 @@ function message_page_indisponible ($page, $contexte){ // temporairement ici : a mettre dans le futur inc/modeles // creer_contexte_de_modele('left', 'autostart=true', ...) renvoie un array() // http://code.spip.net/@creer_contexte_de_modele -function creer_contexte_de_modele($args){ +function creer_contexte_de_modele($args) { $contexte = array(); - foreach ($args as $var=>$val) { - if (is_int($var)){ // argument pas formate + foreach ($args as $var => $val) { + if (is_int($var)) { // argument pas formate if (in_array($val, array('left', 'right', 'center'))) { $var = 'align'; $contexte[$var] = $val; } else { $args = explode('=', $val); - if (count($args)>=2) // Flashvars=arg1=machin&arg2=truc genere plus de deux args - $contexte[trim($args[0])] = substr($val,strlen($args[0])+1); - else // notation abregee + if (count($args) >= 2) // Flashvars=arg1=machin&arg2=truc genere plus de deux args + { + $contexte[trim($args[0])] = substr($val, strlen($args[0])+1); + } else // notation abregee + { $contexte[trim($val)] = trim($val); + } } - } - else + } else { $contexte[$var] = $val; + } } return $contexte; @@ -436,20 +488,22 @@ function creer_contexte_de_modele($args){ * Calcule le modele et retourne la mini-page ainsi calculee * * http://code.spip.net/@inclure_modele - * + * * @param $type string Nom du modele * @param $id int * @param $params array Paramètres du modèle * @param $lien array Informations du lien entourant l'appel du modèle en base de données - * @param $connect string + * @param $connect string * @param $env array * @staticvar string $compteur * @return string */ -function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array()){ +function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array()) { static $compteur; - if (++$compteur>10) return ''; # ne pas boucler indefiniment + if (++$compteur > 10) { + return ''; + } # ne pas boucler indefiniment $type = strtolower($type); @@ -457,30 +511,31 @@ function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array( $params = array_filter(explode('|', $params)); if ($params) { - list(,$soustype) = each($params); + list(, $soustype) = each($params); $soustype = strtolower(trim($soustype)); if (in_array($soustype, - array('left', 'right', 'center', 'ajax'))) { - list(,$soustype) = each($params); + array('left', 'right', 'center', 'ajax'))) { + list(, $soustype) = each($params); $soustype = strtolower($soustype); } if (preg_match(',^[a-z0-9_]+$,', $soustype)) { - if (!trouve_modele($fond = ($type.'_'.$soustype))) { + if (!trouve_modele($fond = ($type . '_' . $soustype))) { $fond = ''; $class = $soustype; } // enlever le sous type des params - $params = array_diff($params,array($soustype)); + $params = array_diff($params, array($soustype)); } } // Si ca marche pas en precisant le sous-type, prendre le type - if (!$fond AND !trouve_modele($fond = $type)){ - spip_log("Modele $type introuvable",_LOG_INFO_IMPORTANTE); + if (!$fond AND !trouve_modele($fond = $type)) { + spip_log("Modele $type introuvable", _LOG_INFO_IMPORTANTE); + return false; } - $fond = 'modeles/'.$fond; + $fond = 'modeles/' . $fond; // Creer le contexte $contexte = $env; $contexte['dir_racine'] = _DIR_RACINE; # eviter de mixer un cache racine et un cache ecrire (meme si pour l'instant les modeles ne sont pas caches, le resultat etant different il faut que le contexte en tienne compte @@ -493,13 +548,14 @@ function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array( $_id = id_table_objet($type); $contexte['id'] = $contexte[$_id] = $id; - if (isset($class)) + if (isset($class)) { $contexte['class'] = $class; + } // Si un lien a ete passe en parametre, ex: [<modele1>->url] ou [<modele1|title_du_lien{hreflang}->url] if ($lien) { # un eventuel guillemet (") sera reechappe par #ENV - $contexte['lien'] = str_replace(""",'"', $lien['href']); + $contexte['lien'] = str_replace(""", '"', $lien['href']); $contexte['lien_class'] = $lien['class']; $contexte['lien_mime'] = $lien['mime']; $contexte['lien_title'] = $lien['title']; @@ -510,7 +566,7 @@ function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array( // par exemple : <img1|center>, <emb12|autostart=true> ou <doc1|lang=en> $arg_list = creer_contexte_de_modele($params); $contexte['args'] = $arg_list; // on passe la liste des arguments du modeles dans une variable args - $contexte = array_merge($contexte,$arg_list); + $contexte = array_merge($contexte, $arg_list); // Appliquer le modele avec le contexte $retour = recuperer_fond($fond, $contexte, array(), $connect); @@ -518,18 +574,21 @@ function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array( // Regarder si le modele tient compte des liens (il *doit* alors indiquer // spip_lien_ok dans les classes de son conteneur de premier niveau ; // sinon, s'il y a un lien, on l'ajoute classiquement - if (strstr(' ' . ($classes = extraire_attribut($retour, 'class')).' ', - 'spip_lien_ok')) { + if (strstr(' ' . ($classes = extraire_attribut($retour, 'class')) . ' ', + 'spip_lien_ok')) { $retour = inserer_attribut($retour, 'class', trim(str_replace(' spip_lien_ok ', ' ', " $classes "))); - } else if ($lien) - $retour = "<a href='".$lien['href']."' class='".$lien['class']."'>".$retour."</a>"; + } else { + if ($lien) { + $retour = "<a href='" . $lien['href'] . "' class='" . $lien['class'] . "'>" . $retour . "</a>"; + } + } $compteur--; - return (isset($arg_list['ajax'])AND $arg_list['ajax']=='ajax') - ? encoder_contexte_ajax($contexte,'',$retour) - : $retour; + return (isset($arg_list['ajax']) AND $arg_list['ajax'] == 'ajax') + ? encoder_contexte_ajax($contexte, '', $retour) + : $retour; } // Un inclure_page qui marche aussi pour l'espace prive @@ -537,77 +596,88 @@ function inclure_modele($type, $id, $params, $lien, $connect = '', $env = array( // pour recuperer $page complet, utiliser: // recuperer_fond($fond,$contexte,array('raw'=>true)) // http://code.spip.net/@evaluer_fond -function evaluer_fond($fond, $contexte = array(), $connect = null){ +function evaluer_fond($fond, $contexte = array(), $connect = null) { $page = inclure_page($fond, $contexte, $connect); - if (!$page) return $page; + if (!$page) { + return $page; + } // eval $page et affecte $res - include _ROOT_RESTREINT."public/evaluer_page.php"; - + include _ROOT_RESTREINT . "public/evaluer_page.php"; + // Lever un drapeau (global) si le fond utilise #SESSION // a destination de public/parametrer // pour remonter vers les inclusions appelantes // il faut bien lever ce drapeau apres avoir evalue le fond // pour ne pas faire descendre le flag vers les inclusions appelees if (isset($page['invalideurs']) - AND isset($page['invalideurs']['session'])) + AND isset($page['invalideurs']['session']) + ) { $GLOBALS['cache_utilise_session'] = $page['invalideurs']['session']; + } return $page; } // http://code.spip.net/@page_base_href -function page_base_href(&$texte){ +function page_base_href(&$texte) { static $set_html_base = null; - if (is_null($set_html_base)){ + if (is_null($set_html_base)) { if (!defined('_SET_HTML_BASE')) // si la profondeur est superieure a 1 // est que ce n'est pas une url page ni une url action // activer par defaut + { $set_html_base = (( - $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT?1:2) + $GLOBALS['profondeur_url'] >= (_DIR_RESTREINT ? 1 : 2) AND _request(_SPIP_PAGE) !== 'login' - AND !_request('action'))?true:false); - else + AND !_request('action')) ? true : false); + } else { $set_html_base = _SET_HTML_BASE; + } } if ($set_html_base - AND isset($GLOBALS['html']) AND $GLOBALS['html'] - AND $GLOBALS['profondeur_url']>0 - AND ($poshead = strpos($texte,'</head>'))!==FALSE){ - $head = substr($texte,0,$poshead); + AND isset($GLOBALS['html']) AND $GLOBALS['html'] + AND $GLOBALS['profondeur_url'] > 0 + AND ($poshead = strpos($texte, '</head>')) !== false + ) { + $head = substr($texte, 0, $poshead); $insert = false; - if (strpos($head, '<base')===false) + if (strpos($head, '<base') === false) { $insert = true; - else { + } else { // si aucun <base ...> n'a de href c'est bon quand meme ! $insert = true; include_spip('inc/filtres'); - $bases = extraire_balises($head,'base'); - foreach ($bases as $base) - if (extraire_attribut($base,'href')) + $bases = extraire_balises($head, 'base'); + foreach ($bases as $base) { + if (extraire_attribut($base, 'href')) { $insert = false; + } + } } if ($insert) { include_spip('inc/filtres_mini'); // ajouter un base qui reglera tous les liens relatifs $base = url_absolue('./'); $bbase = "\n<base href=\"$base\" />"; - if (($pos = strpos($head, '<head>')) !== false) + if (($pos = strpos($head, '<head>')) !== false) { $head = substr_replace($head, $bbase, $pos+6, 0); - elseif(preg_match(",<head[^>]*>,i",$head,$r)){ - $head = str_replace($r[0], $r[0].$bbase, $head); + } elseif (preg_match(",<head[^>]*>,i", $head, $r)) { + $head = str_replace($r[0], $r[0] . $bbase, $head); } - $texte = $head . substr($texte,$poshead); + $texte = $head . substr($texte, $poshead); // gerer les ancres $base = $_SERVER['REQUEST_URI']; - if (strpos($texte,"href='#")!==false) - $texte = str_replace("href='#","href='$base#",$texte); - if (strpos($texte, "href=\"#")!==false) - $texte = str_replace("href=\"#","href=\"$base#",$texte); + if (strpos($texte, "href='#") !== false) { + $texte = str_replace("href='#", "href='$base#", $texte); + } + if (strpos($texte, "href=\"#") !== false) { + $texte = str_replace("href=\"#", "href=\"$base#", $texte); + } } } } @@ -617,9 +687,10 @@ function page_base_href(&$texte){ // et demarrent par X-Spip-... // http://code.spip.net/@envoyer_entetes function envoyer_entetes($entetes) { - foreach ($entetes as $k => $v) - # if (strncmp($k, 'X-Spip-', 7)) - @header(strlen($v)?"$k: $v":$k); + foreach ($entetes as $k => $v) # if (strncmp($k, 'X-Spip-', 7)) + { + @header(strlen($v) ? "$k: $v" : $k); + } } ?> diff --git a/ecrire/public/balises.php b/ecrire/public/balises.php index f1d8ec19b2..189a1d0800 100644 --- a/ecrire/public/balises.php +++ b/ecrire/public/balises.php @@ -12,7 +12,7 @@ /** * Ce fichier regroupe la quasi totalité des définitions de `#BALISES` de SPIP. - * + * * Pour chaque balise, il est possible de surcharger, dans son fichier * mes_fonctions.php, la fonction `balise_TOTO_dist()` par une fonction * `balise_TOTO()` respectant la même API : elle reçoit en entrée un objet @@ -21,11 +21,13 @@ * * Des balises dites «dynamiques» sont également déclarées dans le * répertoire ecrire/balise/ - * + * * @package SPIP\Core\Compilateur\Balises -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Retourne le code PHP d'un argument de balise s'il est présent @@ -37,22 +39,23 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * // #BALISE{premier,deuxieme} * $arg = interprete_argument_balise(1,$p); * ``` - * + * * @param int $n * Numéro de l'argument * @param Champ $p * Pile au niveau de la balise * @return string|null * Code PHP si cet argument est présent, sinon null -**/ + **/ function interprete_argument_balise($n, $p) { - if (($p->param) && (!$p->param[0][0]) && (count($p->param[0])>$n)) + if (($p->param) && (!$p->param[0][0]) && (count($p->param[0]) > $n)) { return calculer_liste($p->param[0][$n], $p->descr, $p->boucles, $p->id_boucle); - else - return NULL; + } else { + return null; + } } @@ -65,14 +68,15 @@ function interprete_argument_balise($n, $p) { * * @balise * @link http://www.spip.net/4622 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_NOM_SITE_SPIP_dist($p) { $p->code = "\$GLOBALS['meta']['nom_site']"; + #$p->interdire_scripts = true; return $p; } @@ -83,14 +87,15 @@ function balise_NOM_SITE_SPIP_dist($p) { * * @balise * @link http://www.spip.net/4586 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_EMAIL_WEBMASTER_dist($p) { $p->code = "\$GLOBALS['meta']['email_webmaster']"; + #$p->interdire_scripts = true; return $p; } @@ -101,14 +106,15 @@ function balise_EMAIL_WEBMASTER_dist($p) { * * @balise * @link http://www.spip.net/4338 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_DESCRIPTIF_SITE_SPIP_dist($p) { $p->code = "\$GLOBALS['meta']['descriptif_site']"; + #$p->interdire_scripts = true; return $p; } @@ -124,14 +130,15 @@ function balise_DESCRIPTIF_SITE_SPIP_dist($p) { * ``` * <meta http-equiv="Content-Type" content="text/html; charset=#CHARSET" /> * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_CHARSET_dist($p) { $p->code = "\$GLOBALS['meta']['charset']"; + #$p->interdire_scripts = true; return $p; } @@ -144,53 +151,55 @@ function balise_CHARSET_dist($p) { * Peut servir à l'écriture de code CSS dans un squelette, mais * pour inclure un fichier css, il vaut mieux utiliser le filtre * `direction_css` si on le souhaite sensible à la langue utilisé. - * + * * @balise * @link http://www.spip.net/4625 * @see lang_dir() * @see balise_LANG_RIGHT_dist() * @see balise_LANG_DIR_dist() * @see direction_css() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_LANG_LEFT_dist($p) { $_lang = champ_sql('lang', $p); $p->code = "lang_dir($_lang, 'left','right')"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#LANG_RIGHT` retournant 'right' si la langue s'écrit * de gauche à droite, sinon 'left' - * + * * @balise * @link http://www.spip.net/4625 * @see lang_dir() * @see balise_LANG_LEFT_dist() * @see balise_LANG_DIR_dist() * @see direction_css() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_LANG_RIGHT_dist($p) { $_lang = champ_sql('lang', $p); $p->code = "lang_dir($_lang, 'right','left')"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#LANG_DIR` retournant 'ltr' si la langue s'écrit * de gauche à droite, sinon 'rtl' - * + * * @balise * @link http://www.spip.net/4625 * @see lang_dir() @@ -202,35 +211,37 @@ function balise_LANG_RIGHT_dist($p) { * xmlns="http://www.w3.org/1999/xhtml" * xml:lang="#LANG" class="[(#LANG_DIR)][ (#LANG)] no-js"> * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_LANG_DIR_dist($p) { $_lang = champ_sql('lang', $p); $p->code = "lang_dir($_lang, 'ltr','rtl')"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#PUCE` affichant une puce - * + * * @balise * @link http://www.spip.net/4628 * @see definir_puce() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_PUCE_dist($p) { $p->code = "definir_puce()"; $p->interdire_scripts = false; + return $p; } @@ -248,17 +259,18 @@ function balise_PUCE_dist($p) { * ``` * <td>[(#DATE|affdate_jourcourt)]</td> * ``` - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ * Pile completée du code PHP d'exécution de la balise */ -function balise_DATE_dist ($p) { +function balise_DATE_dist($p) { $d = champ_sql('date', $p); # if ($d === "@\$Pile[0]['date']") # $d = "isset(\$Pile[0]['date']) ? $d : time()"; $p->code = $d; + return $p; } @@ -272,18 +284,19 @@ function balise_DATE_dist ($p) { * @link http://www.spip.net/3858 Balises DATE_MODIF et DATE_REDAC * @link http://www.spip.net/1971 La gestion des dates * @see balise_DATE_MODIF_dist() - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ * Pile completée du code PHP d'exécution de la balise */ -function balise_DATE_REDAC_dist ($p) { +function balise_DATE_REDAC_dist($p) { $d = champ_sql('date_redac', $p); # if ($d === "@\$Pile[0]['date_redac']") # $d = "isset(\$Pile[0]['date_redac']) ? $d : time()"; $p->code = $d; $p->interdire_scripts = false; + return $p; } @@ -296,15 +309,16 @@ function balise_DATE_REDAC_dist ($p) { * @link http://www.spip.net/3858 Balises DATE_MODIF et DATE_REDAC * @link http://www.spip.net/1971 La gestion des dates * @see balise_DATE_REDAC_dist() - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ * Pile completée du code PHP d'exécution de la balise */ -function balise_DATE_MODIF_dist ($p) { +function balise_DATE_MODIF_dist($p) { $p->code = champ_sql('date_modif', $p); $p->interdire_scripts = false; + return $p; } @@ -316,7 +330,7 @@ function balise_DATE_MODIF_dist ($p) { * @link http://www.spip.net/4337 Balise DATE_NOUVEAUTES * @link http://www.spip.net/1971 La gestion des dates * @see balise_DATE_REDAC_dist() - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ @@ -328,6 +342,7 @@ function balise_DATE_NOUVEAUTES_dist($p) { \$GLOBALS['meta']['dernier_envoi_neuf'] : \"'0000-00-00'\")"; $p->interdire_scripts = false; + return $p; } @@ -340,7 +355,7 @@ function balise_DATE_NOUVEAUTES_dist($p) { * @deprecated Utiliser `#CHEMIN` * @link http://www.spip.net/4627 * @see balise_CHEMIN_dist() - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ @@ -349,7 +364,8 @@ function balise_DATE_NOUVEAUTES_dist($p) { function balise_DOSSIER_SQUELETTE_dist($p) { $code = substr(addslashes(dirname($p->descr['sourcefile'])), strlen(_DIR_RACINE)); $p->code = "_DIR_RACINE . '$code'" . - $p->interdire_scripts = false; + $p->interdire_scripts = false; + return $p; } @@ -358,7 +374,7 @@ function balise_DOSSIER_SQUELETTE_dist($p) { * * @balise * @link http://www.spip.net/4027 - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ @@ -367,7 +383,8 @@ function balise_DOSSIER_SQUELETTE_dist($p) { function balise_SQUELETTE_dist($p) { $code = addslashes($p->descr['sourcefile']); $p->code = "'$code'" . - $p->interdire_scripts = false; + $p->interdire_scripts = false; + return $p; } @@ -380,7 +397,7 @@ function balise_SQUELETTE_dist($p) { * ``` * <meta name="generator" content="SPIP[ (#SPIP_VERSION)]" /> * ``` - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ @@ -389,11 +406,11 @@ function balise_SQUELETTE_dist($p) { function balise_SPIP_VERSION_dist($p) { $p->code = "spip_version()"; $p->interdire_scripts = false; + return $p; } - /** * Compile la balise `#NOM_SITE` qui affiche le nom du site. * @@ -414,17 +431,19 @@ function balise_SPIP_VERSION_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_NOM_SITE_dist($p) { if (!$p->etoile) { $p->code = "supprimer_numero(calculer_url(" . - champ_sql('url_site',$p) ."," . - champ_sql('nom_site',$p) . - ", 'titre', \$connect, false))"; - } else - $p->code = champ_sql('nom_site',$p); + champ_sql('url_site', $p) . "," . + champ_sql('nom_site', $p) . + ", 'titre', \$connect, false))"; + } else { + $p->code = champ_sql('nom_site', $p); + } $p->interdire_scripts = true; + return $p; } @@ -440,10 +459,11 @@ function balise_NOM_SITE_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_NOTES_dist($p) { // Recuperer les notes $p->code = 'calculer_notes()'; + #$p->interdire_scripts = true; return $p; } @@ -465,10 +485,11 @@ function balise_NOTES_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_RECHERCHE_dist($p) { $p->code = 'entites_html(_request("recherche"))'; $p->interdire_scripts = false; + return $p; } @@ -480,23 +501,25 @@ function balise_RECHERCHE_dist($p) { * @balise * @link http://www.spip.net/4333 * @see balise_TOTAL_BOUCLE_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_COMPTEUR_BOUCLE_dist($p) { $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere']; if ($b === '') { - $msg = array('zbug_champ_hors_boucle', - array('champ' => '#COMPTEUR_BOUCLE') - ); + $msg = array( + 'zbug_champ_hors_boucle', + array('champ' => '#COMPTEUR_BOUCLE') + ); erreur_squelette($msg, $p); } else { $p->code = "\$Numrows['$b']['compteur_boucle']"; $p->boucles[$b]->cptrows = true; $p->interdire_scripts = false; + return $p; } } @@ -509,24 +532,26 @@ function balise_COMPTEUR_BOUCLE_dist($p) { * @link http://www.spip.net/4334 * @see balise_COMPTEUR_BOUCLE_dist() * @see balise_GRAND_TOTAL_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_TOTAL_BOUCLE_dist($p) { $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere']; if ($b === '' || !isset($p->boucles[$b])) { - $msg = array('zbug_champ_hors_boucle', - array('champ' => "#$b" . 'TOTAL_BOUCLE') - ); + $msg = array( + 'zbug_champ_hors_boucle', + array('champ' => "#$b" . 'TOTAL_BOUCLE') + ); erreur_squelette($msg, $p); } else { $p->code = "\$Numrows['$b']['total']"; $p->boucles[$b]->numrows = true; $p->interdire_scripts = false; } + return $p; } @@ -536,16 +561,16 @@ function balise_TOTAL_BOUCLE_dist($p) { * * Retourne le calcul `points` réalisé par le critère `recherche`. * Cette balise nécessite donc la présence de ce critère. - * + * * @balise * @link http://www.spip.net/903 Boucles et balises de recherche * @see critere_recherche_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_POINTS_dist($p) { return rindex_pile($p, 'points', 'recherche'); } @@ -555,23 +580,24 @@ function balise_POINTS_dist($p) { * Compile la balise `#POPULARITE_ABSOLUE` qui affiche la popularité absolue * * Cela correspond à la popularité quotidienne de l'article - * + * * @balise * @link http://www.spip.net/1846 La popularité * @see balise_POPULARITE_dist() * @see balise_POPULARITE_MAX_dist() * @see balise_POPULARITE_SITE_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_POPULARITE_ABSOLUE_dist($p) { $p->code = 'ceil(' . - champ_sql('popularite', $p) . - ')'; + champ_sql('popularite', $p) . + ')'; $p->interdire_scripts = false; + return $p; } @@ -585,15 +611,16 @@ function balise_POPULARITE_ABSOLUE_dist($p) { * @see balise_POPULARITE_ABSOLUE_dist() * @see balise_POPULARITE_dist() * @see balise_POPULARITE_MAX_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_POPULARITE_SITE_dist($p) { $p->code = 'ceil($GLOBALS["meta"][\'popularite_total\'])'; $p->interdire_scripts = false; + return $p; } @@ -602,21 +629,22 @@ function balise_POPULARITE_SITE_dist($p) { * parmis les popularités des articles * * Cela correspond à la popularité quotidienne de l'article - * + * * @balise * @link http://www.spip.net/1846 La popularité * @see balise_POPULARITE_ABSOLUE_dist() * @see balise_POPULARITE_dist() * @see balise_POPULARITE_SITE_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_POPULARITE_MAX_dist($p) { $p->code = 'ceil($GLOBALS["meta"][\'popularite_max\'])'; $p->interdire_scripts = false; + return $p; } @@ -625,7 +653,7 @@ function balise_POPULARITE_MAX_dist($p) { * Compile la balise `#VALEUR` retournant le champ `valeur` * * Utile dans une boucle DATA pour retourner une valeur. - * + * * @balise * @link http://www.spip.net/5546 #CLE et #VALEUR * @see table_valeur() @@ -641,14 +669,15 @@ function balise_POPULARITE_MAX_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_VALEUR_dist($p) { $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; $p->code = index_pile($p->id_boucle, 'valeur', $p->boucles, $b);; - if (($v = interprete_argument_balise(1,$p))!==NULL){ - $p->code = 'table_valeur('.$p->code.', '.$v.')'; + if (($v = interprete_argument_balise(1, $p)) !== null) { + $p->code = 'table_valeur(' . $p->code . ', ' . $v . ')'; } $p->interdire_scripts = true; + return $p; } @@ -660,7 +689,7 @@ function balise_VALEUR_dist($p) { * en retournant `on` si l'élément correspond à la page, une chaîne vide sinon. * * On peut passer les paramètres à faire retourner par la balise. - * + * * @example * ``` * <a href="#URL_ARTICLE"[ class="(#EXPOSE)"]> @@ -676,16 +705,18 @@ function balise_VALEUR_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_EXPOSE_dist($p) { $on = "'on'"; - $off= "''"; - if (($v = interprete_argument_balise(1,$p))!==NULL){ + $off = "''"; + if (($v = interprete_argument_balise(1, $p)) !== null) { $on = $v; - if (($v = interprete_argument_balise(2,$p))!==NULL) + if (($v = interprete_argument_balise(2, $p)) !== null) { $off = $v; + } } + return calculer_balise_expose($p, $on, $off); } @@ -693,7 +724,7 @@ function balise_EXPOSE_dist($p) { * Calcul de la balise expose * * @see calcul_exposer() - * + * * @param Champ $p * Pile au niveau de la balise * @param string $on @@ -702,9 +733,8 @@ function balise_EXPOSE_dist($p) { * Texte à afficher si l'élément n'est pas exposé (code à écrire tel que "''") * @return Champ * Pile complétée par le code à générer -**/ -function calculer_balise_expose($p, $on, $off) -{ + **/ +function calculer_balise_expose($p, $on, $off) { $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; $key = $p->boucles[$b]->primary; $type = $p->boucles[$p->id_boucle]->primary; @@ -723,25 +753,27 @@ function calculer_balise_expose($p, $on, $off) $parent = 0; // pour if (!$parent) dans calculer_expose } elseif (isset($desc['field']['id_rubrique'])) { $parent = index_pile($p->id_boucle, 'id_rubrique', $p->boucles, $b); - } elseif (isset($desc['field']['id_groupe'])) { + } elseif (isset($desc['field']['id_groupe'])) { $parent = index_pile($p->id_boucle, 'id_groupe', $p->boucles, $b); - } else $parent = "''"; + } else { + $parent = "''"; + } $p->code = "(calcul_exposer($c, '$type', \$Pile[0], $parent, '$key', $connect) ? $on : $off)"; $p->interdire_scripts = false; + return $p; } - /** * Compile la balise `#DEBUT_SURLIGNE` qui permettait le surlignage * des mots d'une recherche * * @note * Cette balise n'a plus d'effet depuis r9343 - * + * * @balise * @see balise_FIN_SURLIGNE_dist() * @deprecated Utiliser les classes CSS `surlignable` ou `pas_surlignable` @@ -750,10 +782,11 @@ function calculer_balise_expose($p, $on, $off) * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_DEBUT_SURLIGNE_dist($p) { include_spip('inc/surligne'); $p->code = "'<!-- " . MARQUEUR_SURLIGNE . " -->'"; + return $p; } @@ -764,7 +797,7 @@ function balise_DEBUT_SURLIGNE_dist($p) { * * @note * Cette balise n'a plus d'effet depuis r9343 - * + * * @balise * @see balise_DEBUT_SURLIGNE_dist() * @deprecated Utiliser les classes CSS `surlignable` ou `pas_surlignable` @@ -773,15 +806,15 @@ function balise_DEBUT_SURLIGNE_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_FIN_SURLIGNE_dist($p) { include_spip('inc/surligne'); $p->code = "'<!-- " . MARQUEUR_FSURLIGNE . "-->'"; + return $p; } - /** * Compile la balise `#INTRODUCTION` * @@ -808,12 +841,12 @@ function balise_FIN_SURLIGNE_dist($p) { * * @balise * @link http://www.spip.net/@introduction - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_INTRODUCTION_dist($p) { $type = $p->type_requete; @@ -829,17 +862,18 @@ function balise_INTRODUCTION_dist($p) { } // longueur en parametre, ou valeur par defaut - $longueur_defaut = objet_info($type,'introduction_longueur'); - if (!$longueur_defaut) + $longueur_defaut = objet_info($type, 'introduction_longueur'); + if (!$longueur_defaut) { $longueur_defaut = 600; + } $_suite = 'null'; $_longueur = $longueur_defaut; - if (($v = interprete_argument_balise(1,$p))!==NULL) { - $_longueur = 'is_numeric('.$v.')?intval('.$v.'):'.$longueur_defaut; - $_suite = '!is_numeric('.$v.')?'.$v.':null'; + if (($v = interprete_argument_balise(1, $p)) !== null) { + $_longueur = 'is_numeric(' . $v . ')?intval(' . $v . '):' . $longueur_defaut; + $_suite = '!is_numeric(' . $v . ')?' . $v . ':null'; } - if (($v2 = interprete_argument_balise(2,$p))!==NULL) { + if (($v2 = interprete_argument_balise(2, $p)) !== null) { $_suite = $v2; } @@ -858,28 +892,30 @@ function balise_INTRODUCTION_dist($p) { * * La langue courante est celle du site ou celle qui a été passée dans l'URL par le visiteur. * L'étoile `#LANG*` n'affiche rien si aucune langue n'est trouvée dans le SQL ou le contexte. - * + * * @balise * @link http://www.spip.net/3864 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ -function balise_LANG_dist ($p) { + **/ +function balise_LANG_dist($p) { $_lang = champ_sql('lang', $p); - if (!$p->etoile) + if (!$p->etoile) { $p->code = "spip_htmlentities($_lang ? $_lang : \$GLOBALS['spip_lang'])"; - else + } else { $p->code = "spip_htmlentities($_lang)"; + } $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#LESAUTEURS` chargée d'afficher la liste des auteurs d'un objet - * + * * - Soit le champ `lesauteurs` existe dans la table et à ce moment là , * la balise retourne son contenu, * - soit la balise appelle le modele `lesauteurs.html` en lui passant @@ -889,13 +925,13 @@ function balise_LANG_dist ($p) { * @link http://www.spip.net/3966 Description de la balise * @link http://www.spip.net/902 Description de la boucle ARTICLES * @link http://www.spip.net/911 Description de la boucle SYNDIC_ARTICLES - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ -function balise_LESAUTEURS_dist ($p) { +function balise_LESAUTEURS_dist($p) { // Cherche le champ 'lesauteurs' dans la pile $_lesauteurs = champ_sql('lesauteurs', $p, false); @@ -904,16 +940,16 @@ function balise_LESAUTEURS_dist ($p) { // dans le cas contraire on prend le champ 'lesauteurs' // (cf extension sites/) if ($_lesauteurs - AND $_lesauteurs != '@$Pile[0][\'lesauteurs\']') { + AND $_lesauteurs != '@$Pile[0][\'lesauteurs\']' + ) { $p->code = "safehtml($_lesauteurs)"; // $p->interdire_scripts = true; } else { - if(!$p->id_boucle){ + if (!$p->id_boucle) { $connect = ''; $objet = 'article'; $id_table_objet = 'id_article'; - } - else{ + } else { $b = $p->nom_boucle ? $p->nom_boucle : $p->id_boucle; $connect = $p->boucles[$b]->sql_serveur; $type_boucle = $p->boucles[$b]->type_requete; @@ -923,13 +959,13 @@ function balise_LESAUTEURS_dist ($p) { $c = memoriser_contexte_compil($p); $p->code = sprintf(CODE_RECUPERER_FOND, "'modeles/lesauteurs'", - "array('objet'=>'".$objet. - "','id_objet' => ".champ_sql($id_table_objet, $p) . - ",'$id_table_objet' => ".champ_sql($id_table_objet, $p) . - ($objet=='article'?"":",'id_article' => ".champ_sql('id_article', $p)). - ")", - "'trim'=>true, 'compil'=>array($c)", - _q($connect)); + "array('objet'=>'" . $objet . + "','id_objet' => " . champ_sql($id_table_objet, $p) . + ",'$id_table_objet' => " . champ_sql($id_table_objet, $p) . + ($objet == 'article' ? "" : ",'id_article' => " . champ_sql('id_article', $p)) . + ")", + "'trim'=>true, 'compil'=>array($c)", + _q($connect)); $p->interdire_scripts = false; // securite apposee par recuperer_fond() } @@ -939,13 +975,13 @@ function balise_LESAUTEURS_dist ($p) { /** * Compile la balise `#RANG` chargée d'afficher le numéro de l'objet - * + * * Affiche le « numero de l'objet ». Soit `1` quand on a un titre `1. Premier article`. - * + * * Ceci est transitoire afin de préparer une migration vers un vrai système de * tri des articles dans une rubrique (et plus si affinités). * La balise permet d'extraire le numero masqué par le filtre `supprimer_numero`. - * + * * La balise recupère le champ declaré dans la définition `table_titre` * de l'objet, ou à defaut du champ `titre` * @@ -962,52 +998,55 @@ function balise_LESAUTEURS_dist ($p) { function balise_RANG_dist($p) { $b = index_boucle($p); if ($b === '') { - $msg = array('zbug_champ_hors_boucle', - array('champ' => '#RANG') - ); + $msg = array( + 'zbug_champ_hors_boucle', + array('champ' => '#RANG') + ); erreur_squelette($msg, $p); - } - else { + } else { // chercher d'abord un champ sql rang (mais pas dans le env : defaut '' si on trouve pas de champ sql) // dans la boucle immediatement englobante uniquement // sinon on compose le champ calcule $_rang = champ_sql('rang', $p, '', false); // si pas trouve de champ sql rang : - if (!$_rang OR $_rang == "''"){ + if (!$_rang OR $_rang == "''") { $boucle = &$p->boucles[$b]; - $trouver_table = charger_fonction('trouver_table','base'); + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($boucle->id_table); $_titre = ''; # où extraire le numero ? - if (isset($desc['titre'])){ - $t=$desc['titre']; - if (preg_match(';(^|,)([^,]*titre)(,|$);',$t,$m)){ - $m = preg_replace(",as\s+titre$,i","",$m[2]); - $m = trim($m); - if ($m!="''"){ - if (!preg_match(",\W,",$m)) - $m = $boucle->id_table . ".$m"; - $m .= " AS titre_rang"; - - $boucle->select[] = $m; - $_titre = '$Pile[$SP][\'titre_rang\']'; - } - } + if (isset($desc['titre'])) { + $t = $desc['titre']; + if (preg_match(';(^|,)([^,]*titre)(,|$);', $t, $m)) { + $m = preg_replace(",as\s+titre$,i", "", $m[2]); + $m = trim($m); + if ($m != "''") { + if (!preg_match(",\W,", $m)) { + $m = $boucle->id_table . ".$m"; + } + $m .= " AS titre_rang"; + + $boucle->select[] = $m; + $_titre = '$Pile[$SP][\'titre_rang\']'; + } + } } - if (!$_titre) + if (!$_titre) { $_titre = champ_sql('titre', $p); + } $_rang = "recuperer_numero($_titre)"; } $p->code = $_rang; $p->interdire_scripts = false; } + return $p; } /** * Compile la balise `#POPULARITE` qui affiche la popularité relative. - * + * * C'est à dire le pourcentage de la fréquentation de l'article * (la popularité absolue) par rapport à la popularité maximum. * @@ -1016,17 +1055,18 @@ function balise_RANG_dist($p) { * @see balise_POPULARITE_ABSOLUE_dist() * @see balise_POPULARITE_MAX_dist() * @see balise_POPULARITE_SITE_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ -function balise_POPULARITE_dist ($p) { + **/ +function balise_POPULARITE_dist($p) { $_popularite = champ_sql('popularite', $p); $p->code = "(ceil(min(100, 100 * $_popularite / max(1 , 0 + \$GLOBALS['meta']['popularite_max']))))"; $p->interdire_scripts = false; + return $p; } @@ -1038,7 +1078,7 @@ function balise_POPULARITE_dist ($p) { * l'absence peut-être due à une faute de frappe dans le contexte inclus. */ define('CODE_PAGINATION', - '%s($Numrows["%s"]["grand_total"], +'%s($Numrows["%s"]["grand_total"], %s, isset($Pile[0][%4$s])?$Pile[0][%4$s]:intval(_request(%4$s)), %5$s, %6$s, %7$s, %8$s, array(%9$s))'); @@ -1078,10 +1118,12 @@ function balise_PAGINATION_dist($p, $liste = 'true') { // s'il n'y a pas de nom de boucle, on ne peut pas paginer if ($b === '') { - $msg = array('zbug_champ_hors_boucle', + $msg = array( + 'zbug_champ_hors_boucle', array('champ' => $liste ? 'PAGINATION' : 'ANCRE_PAGINATION') - ); + ); erreur_squelette($msg, $p); + return $p; } @@ -1089,11 +1131,13 @@ function balise_PAGINATION_dist($p, $liste = 'true') { // dans un boucle recursive ou qu'on a oublie le critere {pagination} if (!$p->boucles[$b]->mode_partie) { if (!$p->boucles[$b]->table_optionnelle) { - $msg = array('zbug_pagination_sans_critere', - array('champ' => '#PAGINATION') - ); + $msg = array( + 'zbug_pagination_sans_critere', + array('champ' => '#PAGINATION') + ); erreur_squelette($msg, $p); } + return $p; } @@ -1101,36 +1145,37 @@ function balise_PAGINATION_dist($p, $liste = 'true') { // si false, le compilo va bloquer sur des syntaxes avec un filtre sans argument qui suit la balise // si true, les arguments simples (sans truc=chose) vont degager $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false, false); - if (count($_contexte)){ - list($key,$val) = each($_contexte); - if (is_numeric($key)){ + if (count($_contexte)) { + list($key, $val) = each($_contexte); + if (is_numeric($key)) { array_shift($_contexte); - $__modele = interprete_argument_balise(1,$p); + $__modele = interprete_argument_balise(1, $p); } } - if (count($_contexte)){ - $code_contexte = implode(',',$_contexte); - } - else + if (count($_contexte)) { + $code_contexte = implode(',', $_contexte); + } else { $code_contexte = ''; + } $connect = $p->boucles[$b]->sql_serveur; $pas = $p->boucles[$b]->total_parties; $f_pagination = chercher_filtre('pagination'); $type = $p->boucles[$b]->modificateur['debut_nom']; - $modif = ($type[0]!=="'") ? "'debut'.$type" - : ("'debut" .substr($type,1)); + $modif = ($type[0] !== "'") ? "'debut'.$type" + : ("'debut" . substr($type, 1)); - $p->code = sprintf(CODE_PAGINATION, $f_pagination, $b, $type, $modif, $pas, $liste, ((isset($__modele) and $__modele) ? $__modele : "''"), _q($connect), $code_contexte); + $p->code = sprintf(CODE_PAGINATION, $f_pagination, $b, $type, $modif, $pas, $liste, + ((isset($__modele) and $__modele) ? $__modele : "''"), _q($connect), $code_contexte); $p->boucles[$b]->numrows = true; $p->interdire_scripts = false; + return $p; } - /** * Compile la balise `#ANCRE_PAGINATION` chargée d'afficher l'ancre * de la pagination @@ -1138,10 +1183,10 @@ function balise_PAGINATION_dist($p, $liste = 'true') { * Cette ancre peut ainsi être placée au-dessus la liste des éléments * de la boucle alors qu'on mettra les liens de pagination en-dessous de * cette liste paginée. - * + * * Cette balise nécessite le critère `pagination` sur la boucle où elle * est utilisée. - * + * * @balise * @link http://www.spip.net/3367 Le système de pagination * @link http://www.spip.net/4328 Balise ANCRE_PAGINATION @@ -1152,11 +1197,13 @@ function balise_PAGINATION_dist($p, $liste = 'true') { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_ANCRE_PAGINATION_dist($p) { - if ($f = charger_fonction('PAGINATION', 'balise', true)) - return $f($p, $liste='false'); - else return NULL; // ou une erreur ? + if ($f = charger_fonction('PAGINATION', 'balise', true)) { + return $f($p, $liste = 'false'); + } else { + return null; + } // ou une erreur ? } @@ -1170,18 +1217,19 @@ function balise_ANCRE_PAGINATION_dist($p) { * * @balise * @see balise_GRAND_TOTAL_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_GRAND_TOTAL_dist($p) { $b = $p->nom_boucle ? $p->nom_boucle : $p->descr['id_mere']; if ($b === '' || !isset($p->boucles[$b])) { - $msg = array('zbug_champ_hors_boucle', - array('champ' => "#$b" . 'TOTAL_BOUCLE') - ); + $msg = array( + 'zbug_champ_hors_boucle', + array('champ' => "#$b" . 'TOTAL_BOUCLE') + ); erreur_squelette($msg, $p); } else { $p->code = "(isset(\$Numrows['$b']['grand_total']) @@ -1189,6 +1237,7 @@ function balise_GRAND_TOTAL_dist($p) { $p->boucles[$b]->numrows = true; $p->interdire_scripts = false; } + return $p; } @@ -1202,23 +1251,24 @@ function balise_GRAND_TOTAL_dist($p) { * @note * Attention dans un `INCLURE()` ou une balise dynamique, on n'a pas le droit de * mettre en cache `#SELF` car il peut correspondre à une autre page (attaque XSS) - * (Dans ce cas faire <INCLURE{self=#SELF}> pour différencier les caches.) - * + * (Dans ce cas faire <INCLURE{self=#SELF}> pour différencier les caches.) + * * @balise * @link http://www.spip.net/4574 * @example * ``` * <a href="[(#SELF|parametre_url{id_mot,#ID_MOT})]">... * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_SELF_dist($p) { $p->code = 'self()'; $p->interdire_scripts = false; + return $p; } @@ -1230,7 +1280,7 @@ function balise_SELF_dist($p) { * Signature : `#CHEMIN{chemin/vers/fichier.ext}` * * Retourne une chaîne vide si le fichier n'est pas trouvé. - * + * * @balise * @link http://www.spip.net/4332 * @see find_in_path() Recherche de chemin @@ -1239,21 +1289,23 @@ function balise_SELF_dist($p) { * [<script type="text/javascript" src="(#CHEMIN{javascript/jquery.flot.js})"></script>] * [<link rel="stylesheet" href="(#CHEMIN{css/perso.css}|direction_css)" type="text/css" />] * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_CHEMIN_dist($p) { - $arg = interprete_argument_balise(1,$p); + $arg = interprete_argument_balise(1, $p); if (!$arg) { - $msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN')); + $msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN')); erreur_squelette($msg, $p); - } else - $p->code = 'find_in_path(' . $arg .')'; + } else { + $p->code = 'find_in_path(' . $arg . ')'; + } $p->interdire_scripts = false; + return $p; } @@ -1261,29 +1313,31 @@ function balise_CHEMIN_dist($p) { * Compile la balise `#CHEMIN_IMAGE` qui cherche une image dans le thème * de l'espace privé utilisé par SPIP et retourne son chemin complet depuis * la racine - * + * * Signature : `#CHEMIN_IMAGE{image.png}` * * Retourne une chaîne vide si le fichier n'est pas trouvé. - * + * * @balise * @see chemin_image() * @example * ``` * #CHEMIN_IMAGE{article-24.png} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_CHEMIN_IMAGE_dist($p) { - $arg = interprete_argument_balise(1,$p); + $arg = interprete_argument_balise(1, $p); if (!$arg) { $msg = array('zbug_balise_sans_argument', array('balise' => ' CHEMIN_IMAGE')); erreur_squelette($msg, $p); - } else $p->code = 'chemin_image(' . $arg .')'; + } else { + $p->code = 'chemin_image(' . $arg . ')'; + } #$p->interdire_scripts = true; return $p; @@ -1312,7 +1366,7 @@ function balise_CHEMIN_IMAGE_dist($p) { * utilisée pour désactiver les filtres par défaut, par exemple avec * `[(#ENV*{toto})]` , il *faut* s'assurer de la sécurité * anti-javascript, par exemple en filtrant avec `safehtml` : `[(#ENV*{toto}|safehtml)]` - * + * * * @param Champ $p * Pile ; arbre de syntaxe abstrait positionné au niveau de la balise. @@ -1321,22 +1375,22 @@ function balise_CHEMIN_IMAGE_dist($p) { * Par defaut prend dans le contexte du squelette. * @return Champ * Pile completée du code PHP d'exécution de la balise -**/ -function balise_ENV_dist($p, $src = NULL) { + **/ +function balise_ENV_dist($p, $src = null) { // cle du tableau desiree - $_nom = interprete_argument_balise(1,$p); + $_nom = interprete_argument_balise(1, $p); // valeur par defaut - $_sinon = interprete_argument_balise(2,$p); - + $_sinon = interprete_argument_balise(2, $p); + // $src est un tableau de donnees sources eventuellement transmis // en absence, on utilise l'environnement du squelette $Pile[0] - + if (!$_nom) { // cas de #ENV sans argument : on retourne le serialize() du tableau // une belle fonction [(#ENV|affiche_env)] serait pratique if ($src) { - $p->code = '(is_array($a = ('.$src.')) ? serialize($a) : "")'; + $p->code = '(is_array($a = (' . $src . ')) ? serialize($a) : "")'; } else { $p->code = '@serialize($Pile[0])'; } @@ -1350,6 +1404,7 @@ function balise_ENV_dist($p, $src = NULL) { $p->code = "table_valeur($src, (string)$_nom, null)"; } } + #$p->interdire_scripts = true; return $p; @@ -1375,18 +1430,18 @@ function balise_ENV_dist($p, $src = NULL) { * * @balise * @link http://www.spip.net/4335 - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ * Pile completée du code PHP d'exécution de la balise */ function balise_CONFIG_dist($p) { - if (!$arg = interprete_argument_balise(1,$p)) { + if (!$arg = interprete_argument_balise(1, $p)) { $arg = "''"; } - $_sinon = interprete_argument_balise(2,$p); - $_unserialize = sinon(interprete_argument_balise(3,$p),"false"); + $_sinon = interprete_argument_balise(2, $p); + $_unserialize = sinon(interprete_argument_balise(3, $p), "false"); $p->code = '(include_spip(\'inc/config\')?lire_config(' . $arg . ',' . ($_sinon && $_sinon != "''" ? $_sinon : 'null') . ',' . $_unserialize . "):'')"; @@ -1407,7 +1462,7 @@ function balise_CONFIG_dist($p) { * (connect.php), sinon retourne son nom. * * @balise - * + * * @param Champ $p * Pile au niveau de la balise. * @return Champ @@ -1416,6 +1471,7 @@ function balise_CONFIG_dist($p) { function balise_CONNECT_dist($p) { $p->code = '($connect ? $connect : NULL)'; $p->interdire_scripts = false; + return $p; } @@ -1442,7 +1498,7 @@ function balise_CONNECT_dist($p) { * Pile au niveau de la balise. * @return Champ * Pile completée du code PHP d'exécution de la balise -**/ + **/ function balise_SESSION_dist($p) { $p->descr['session'] = true; @@ -1451,6 +1507,7 @@ function balise_SESSION_dist($p) { : 'balise_ENV_dist'; $p = $f($p, '$GLOBALS["visiteur_session"]'); + return $p; } @@ -1458,7 +1515,7 @@ function balise_SESSION_dist($p) { /** * Compile la balise `#SESSION_SET` qui d’insérer dans la session * des données supplémentaires - * + * * @balise * @link http://www.spip.net/3984 * @see balise_AUTORISER_dist() @@ -1472,14 +1529,16 @@ function balise_SESSION_dist($p) { * Pile au niveau de la balise. * @return Champ * Pile completée du code PHP d'exécution de la balise -**/ + **/ function balise_SESSION_SET_dist($p) { - $_nom = interprete_argument_balise(1,$p); - $_val = interprete_argument_balise(2,$p); + $_nom = interprete_argument_balise(1, $p); + $_val = interprete_argument_balise(2, $p); if (!$_nom OR !$_val) { $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'SESSION_SET')); erreur_squelette($err_b_s_a, $p); - } else $p->code = '(include_spip("inc/session") AND session_set('.$_nom.','.$_val.'))'; + } else { + $p->code = '(include_spip("inc/session") AND session_set(' . $_nom . ',' . $_val . '))'; + } $p->interdire_scripts = false; @@ -1513,17 +1572,19 @@ function balise_SESSION_SET_dist($p) { * Pile au niveau de la balise. * @return Champ * Pile completée du code PHP d'exécution de la balise -**/ + **/ function balise_EVAL_dist($p) { - $php = interprete_argument_balise(1,$p); + $php = interprete_argument_balise(1, $p); if ($php) { # optimisation sur les #EVAL{une expression sans #BALISE} # attention au commentaire "// x signes" qui precede if (preg_match(",^([[:space:]]*//[^\n]*\n)'([^']+)'$,ms", - $php,$r)) - $p->code = /* $r[1]. */'('.$r[2].')'; - else + $php, $r)) { + $p->code = /* $r[1]. */ + '(' . $r[2] . ')'; + } else { $p->code = "eval('return '.$php.';')"; + } } else { $msg = array('zbug_balise_sans_argument', array('balise' => ' EVAL')); erreur_squelette($msg, $p); @@ -1553,22 +1614,24 @@ function balise_EVAL_dist($p) { * ``` * #CHAMP_SQL{notes} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ -function balise_CHAMP_SQL_dist($p){ + **/ +function balise_CHAMP_SQL_dist($p) { if ($p->param - AND isset($p->param[0][1][0]) - AND $champ = ($p->param[0][1][0]->texte)) + AND isset($p->param[0][1][0]) + AND $champ = ($p->param[0][1][0]->texte) + ) { $p->code = champ_sql($champ, $p); - else { + } else { $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => ' URL_')); erreur_squelette($err_b_s_a, $p); } + #$p->interdire_scripts = true; return $p; } @@ -1578,7 +1641,7 @@ function balise_CHAMP_SQL_dist($p){ * qui lui est transmis * * Cela permet d'appliquer un filtre à une chaîne de caractère - * + * * @balise * @link http://www.spip.net/4026 * @example @@ -1589,17 +1652,19 @@ function balise_CHAMP_SQL_dist($p){ * #VAL{'1,2'} renvoie '1,2' * [(#VAL{a_suivre}|bouton_spip_rss)] * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ -function balise_VAL_dist($p){ - $p->code = interprete_argument_balise(1,$p); - if (!strlen($p->code)) + **/ +function balise_VAL_dist($p) { + $p->code = interprete_argument_balise(1, $p); + if (!strlen($p->code)) { $p->code = "''"; + } $p->interdire_scripts = false; + return $p; } @@ -1607,16 +1672,16 @@ function balise_VAL_dist($p){ * Compile la balise `#NOOP`, alias (déprécié) de `#VAL` * * Alias pour regler #948. Ne plus utiliser. - * + * * @balise * @see balise_VAL_dist() * @deprecated Utiliser #VAL - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_NOOP_dist($p) { return balise_VAL_dist($p); } @@ -1624,7 +1689,7 @@ function balise_NOOP_dist($p) { return balise_VAL_dist($p); } * Compile la balise `#REM` servant à commenter du texte * * Retourne toujours une chaîne vide. - * + * * @balise * @link http://www.spip.net/4578 * @example @@ -1634,20 +1699,21 @@ function balise_NOOP_dist($p) { return balise_VAL_dist($p); } * non affiché dans le code généré * ] * ``` - * + * * @note * La balise `#REM` n'empêche pas l'exécution des balises SPIP contenues * dedans (elle ne sert pas à commenter du code pour empêcher son * exécution). - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_REM_dist($p) { - $p->code="''"; + $p->code = "''"; $p->interdire_scripts = false; + return $p; } @@ -1657,29 +1723,32 @@ function balise_REM_dist($p) { * * Doit être placée en tête de fichier et ne fonctionne pas dans une * inclusion. - * + * * @balise * @link http://www.spip.net/4631 * @example * ``` - * #HTTP_HEADER{Content-Type: text/csv; charset=#CHARSET} + * #HTTP_HEADER{Content-Type: text/csv; charset=#CHARSET} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_HTTP_HEADER_dist($p) { - $header = interprete_argument_balise(1,$p); + $header = interprete_argument_balise(1, $p); if (!$header) { $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'HTTP_HEADER')); erreur_squelette($err_b_s_a, $p); - } else $p->code = "'<'.'?php header(\"' . " - . $header - . " . '\"); ?'.'>'"; + } else { + $p->code = "'<'.'?php header(\"' . " + . $header + . " . '\"); ?'.'>'"; + } $p->interdire_scripts = false; + return $p; } @@ -1690,7 +1759,7 @@ function balise_HTTP_HEADER_dist($p) { * * Le filtrage se fait au niveau du squelette, sans s'appliquer aux `<INCLURE>`. * Plusieurs filtres peuvent être indiqués, séparés par des barres verticales `|` - * + * * @balise * @link http://www.spip.net/4894 * @example @@ -1698,23 +1767,25 @@ function balise_HTTP_HEADER_dist($p) { * #FILTRE{compacte_head} * #FILTRE{supprimer_tags|filtrer_entites|trim} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_FILTRE_dist($p) { if ($p->param) { $args = array(); - foreach ($p->param as $i => $ignore) - $args[] = interprete_argument_balise($i+1,$p); + foreach ($p->param as $i => $ignore) { + $args[] = interprete_argument_balise($i+1, $p); + } $p->code = "'<' . '" - .'?php header("X-Spip-Filtre: \'.' - .join('.\'|\'.', $args) + . '?php header("X-Spip-Filtre: \'.' + . join('.\'|\'.', $args) . " . '\"); ?'.'>'"; $p->interdire_scripts = false; + return $p; } } @@ -1744,12 +1815,12 @@ function balise_FILTRE_dist($p) { * @note * En absence de cette balise la durée est du cache est donné * par la constante `_DUREE_CACHE_DEFAUT` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_CACHE_dist($p) { if ($p->param) { @@ -1757,18 +1828,19 @@ function balise_CACHE_dist($p) { // noter la duree du cache dans un entete proprietaire - $code = "'<'.'".'?php header("X-Spip-Cache: ' - . $duree - . '"); ?'."'.'>'"; + $code = "'<'.'" . '?php header("X-Spip-Cache: ' + . $duree + . '"); ?' . "'.'>'"; // Remplir le header Cache-Control // cas #CACHE{0} - if ($duree == 0) + if ($duree == 0) { $code .= ".'<'.'" - .'?php header("Cache-Control: no-cache, must-revalidate"); ?' - ."'.'><'.'" - .'?php header("Pragma: no-cache"); ?' - ."'.'>'"; + . '?php header("Cache-Control: no-cache, must-revalidate"); ?' + . "'.'><'.'" + . '?php header("Pragma: no-cache"); ?' + . "'.'>'"; + } // recuperer les parametres suivants $i = 1; @@ -1776,21 +1848,27 @@ function balise_CACHE_dist($p) { $pa = ($p->param[0][$i][0]->texte); if ($pa == 'cache-client' - AND $duree > 0) { - $code .= ".'<'.'".'?php header("Cache-Control: max-age=' - . $duree - . '"); ?'."'.'>'"; - // il semble logique, si on cache-client, de ne pas invalider + AND $duree > 0 + ) { + $code .= ".'<'.'" . '?php header("Cache-Control: max-age=' + . $duree + . '"); ?' . "'.'>'"; + // il semble logique, si on cache-client, de ne pas invalider $pa = 'statique'; } if ($pa == 'statique' - AND $duree > 0) - $code .= ".'<'.'".'?php header("X-Spip-Statique: oui"); ?'."'.'>'"; + AND $duree > 0 + ) { + $code .= ".'<'.'" . '?php header("X-Spip-Statique: oui"); ?' . "'.'>'"; + } } - } else $code = "''"; + } else { + $code = "''"; + } $p->code = $code; $p->interdire_scripts = false; + return $p; } @@ -1798,7 +1876,7 @@ function balise_CACHE_dist($p) { /** * Compile la balise `#INSERT_HEAD` permettant d'insérer du contenu dans * le `<head>` d'une page HTML - * + * * La balise permet aux plugins d'insérer des styles, js ou autre * dans l'entête sans modification du squelette. * Les css doivent être inserées de préférence par `#INSERT_HEAD_CSS` @@ -1808,7 +1886,7 @@ function balise_CACHE_dist($p) { * que le pipeline `insert_head_css` a bien été vu * et dans le cas contraire l'appelera. Ceal permet de ne pas oublier * les css de `#INSERT_HEAD_CSS` même si cette balise n'est pas presente. - * + * * Il faut mettre ce php avant le `insert_head` car le compresseur y mets * ensuite un php du meme type pour collecter * CSS et JS, et on ne veut pas qu'il rate les css insérées en fallback @@ -1824,16 +1902,17 @@ function balise_CACHE_dist($p) { */ function balise_INSERT_HEAD_dist($p) { $p->code = "'<'.'" - .'?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?' - ."'.'>'"; + . '?php header("X-Spip-Filtre: insert_head_css_conditionnel"); ?' + . "'.'>'"; $p->code .= ". pipeline('insert_head','<!-- insert_head -->')"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#INSERT_HEAD_CSS` homologue de `#INSERT_HEAD` pour les CSS - * + * * Et par extension pour le JS inline qui doit préférentiellement * être inséré avant les CSS car bloquant sinon. * @@ -1848,6 +1927,7 @@ function balise_INSERT_HEAD_dist($p) { function balise_INSERT_HEAD_CSS_dist($p) { $p->code = "pipeline('insert_head_css','<!-- insert_head_css -->')"; $p->interdire_scripts = false; + return $p; } @@ -1856,17 +1936,18 @@ function balise_INSERT_HEAD_CSS_dist($p) { * * @balise * @see balise_INCLURE_dist() - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_INCLUDE_dist($p) { - if(function_exists('balise_INCLURE')) + if (function_exists('balise_INCLURE')) { return balise_INCLURE($p); - else + } else { return balise_INCLURE_dist($p); + } } /** @@ -1876,7 +1957,7 @@ function balise_INCLUDE_dist($p) { * * L'argument `env` permet de transmettre tout l'environnement du squelette * en cours au squelette inclus. - * + * * On parle d’inclusion « statique » car le résultat de compilation est * ajouté au squelette en cours, dans le même fichier de cache. * Cette balise est donc différente d’une inclusion « dynamique » avec @@ -1887,18 +1968,18 @@ function balise_INCLUDE_dist($p) { * ainsi le produit du squelette peut être utilisé en entrée de filtres * à suivre. On peut faire un `#INCLURE{fichier}` sans squelette * (Incompatible avec les balises dynamiques). - * + * * @balise * @example * ``` * [(#INCLURE{fond=inclure/documents,id_article, env})] * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_INCLURE_dist($p) { $id_boucle = $p->id_boucle; // la lang n'est pas passe de facon automatique par argumenter @@ -1909,7 +1990,9 @@ function balise_INCLURE_dist($p) { // erreur de syntaxe = fond absent // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP - if (!$_contexte) $contexte = array(); + if (!$_contexte) { + $contexte = array(); + } if (isset($_contexte['fond'])) { @@ -1918,7 +2001,9 @@ function balise_INCLURE_dist($p) { if (preg_match('/^.fond.\s*=>(.*)$/s', $f, $r)) { $f = $r[1]; unset($_contexte['fond']); - } else spip_log("compilation de #INCLURE a revoir"); + } else { + spip_log("compilation de #INCLURE a revoir"); + } // #INCLURE{doublons} if (isset($_contexte['doublons'])) { @@ -1934,23 +2019,25 @@ function balise_INCLURE_dist($p) { $_options = array(); if (isset($_contexte['ajax'])) { - $_options[] = preg_replace(",=>(.*)$,ims",'=> ($v=(\\1))?$v:true',$_contexte['ajax']); + $_options[] = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']); unset($_contexte['ajax']); } - if ($p->etoile) $_options[] = "'etoile'=>true"; - $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) .")"; + if ($p->etoile) { + $_options[] = "'etoile'=>true"; + } + $_options[] = "'compil'=>array(" . memoriser_contexte_compil($p) . ")"; - $_l = 'array(' . join(",\n\t", $_contexte) .')'; - if ($flag_env) $_l = "array_merge(\$Pile[0],$_l)"; + $_l = 'array(' . join(",\n\t", $_contexte) . ')'; + if ($flag_env) { + $_l = "array_merge(\$Pile[0],$_l)"; + } - $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',',$_options),"_request('connect')"); + $p->code = sprintf(CODE_RECUPERER_FOND, $f, $_l, join(',', $_options), "_request('connect')"); - } - elseif (!isset($_contexte[1])) { - $msg = array('zbug_balise_sans_argument', array('balise' => ' INCLURE')); - erreur_squelette($msg, $p); - } - else { + } elseif (!isset($_contexte[1])) { + $msg = array('zbug_balise_sans_argument', array('balise' => ' INCLURE')); + erreur_squelette($msg, $p); + } else { $p->code = 'charge_scripts(' . $_contexte[1] . ',false)'; } @@ -1968,41 +2055,44 @@ function balise_INCLURE_dist($p) { * * Des arguments supplémentaires peuvent être transmis : * `[(#MODELE{nom, argument=xx, argument})]` - * + * * @balise * @see balise_INCLURE_dist() * @example * ``` * #MODELE{article_traductions} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_MODELE_dist($p) { $_contexte = argumenter_inclure($p->param, true, $p, $p->boucles, $p->id_boucle, false); // erreur de syntaxe = fond absent // (2 messages d'erreur SPIP pour le prix d'un, mais pas d'erreur PHP - if (!$_contexte) $contexte = array(); + if (!$_contexte) { + $contexte = array(); + } if (!isset($_contexte[1])) { $msg = array('zbug_balise_sans_argument', array('balise' => ' MODELE')); erreur_squelette($msg, $p); - } - else { + } else { $nom = $_contexte[1]; unset($_contexte[1]); - if (preg_match("/^\s*'[^']*'/s", $nom)) - $nom = "'modeles/" . substr($nom,1); - else $nom = "'modeles/' . $nom"; + if (preg_match("/^\s*'[^']*'/s", $nom)) { + $nom = "'modeles/" . substr($nom, 1); + } else { + $nom = "'modeles/' . $nom"; + } $flag_env = false; - if (isset($_contexte['env'])){ + if (isset($_contexte['env'])) { $flag_env = true; unset($_contexte['env']); } @@ -2011,28 +2101,31 @@ function balise_MODELE_dist($p) { // Reserver la cle primaire de la boucle courante si elle existe if (isset($p->boucles[$p->id_boucle]->primary)) { $primary = $p->boucles[$p->id_boucle]->primary; - if (!strpos($primary,',')) { + if (!strpos($primary, ',')) { $id = champ_sql($primary, $p); - $_contexte[] = "'$primary'=>".$id; - $_contexte[] = "'id'=>".$id; + $_contexte[] = "'$primary'=>" . $id; + $_contexte[] = "'id'=>" . $id; } } $_contexte[] = "'recurs'=>(++\$recurs)"; $connect = ''; - if (isset($p->boucles[$p->id_boucle])) + if (isset($p->boucles[$p->id_boucle])) { $connect = $p->boucles[$p->id_boucle]->sql_serveur; + } $_options = memoriser_contexte_compil($p); $_options = "'compil'=>array($_options), 'trim'=>true"; - if (isset($_contexte['ajax'])){ - $_options .= ", ".preg_replace(",=>(.*)$,ims",'=> ($v=(\\1))?$v:true',$_contexte['ajax']); + if (isset($_contexte['ajax'])) { + $_options .= ", " . preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']); unset($_contexte['ajax']); - } + } - $_l = 'array(' . join(",\n\t", $_contexte) .')'; - if ($flag_env) $_l = "array_merge(\$Pile[0],$_l)"; + $_l = 'array(' . join(",\n\t", $_contexte) . ')'; + if ($flag_env) { + $_l = "array_merge(\$Pile[0],$_l)"; + } - $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l , $_options, _q($connect)); + $page = sprintf(CODE_RECUPERER_FOND, $nom, $_l, $_options, _q($connect)); $p->code = "\n\t(((\$recurs=(isset(\$Pile[0]['recurs'])?\$Pile[0]['recurs']:0))>=5)? '' :\n\t$page)\n"; @@ -2056,15 +2149,15 @@ function balise_MODELE_dist($p) { * #SET{nb,5} * #GET{nb} // affiche 5 * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ -function balise_SET_dist($p){ - $_nom = interprete_argument_balise(1,$p); - $_val = interprete_argument_balise(2,$p); + **/ +function balise_SET_dist($p) { + $_nom = interprete_argument_balise(1, $p); + $_val = interprete_argument_balise(2, $p); if (!$_nom OR !$_val) { $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'SET')); @@ -2072,7 +2165,9 @@ function balise_SET_dist($p){ } // affectation $_zzz inutile, mais permet de contourner un bug OpCode cache sous PHP 5.5.4 // cf https://bugs.php.net/bug.php?id=65845 - else $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)"; + else { + $p->code = "vide(\$Pile['vars'][\$_zzz=(string)$_nom] = $_val)"; + } $p->interdire_scripts = false; // la balise ne renvoie rien return $p; @@ -2085,7 +2180,7 @@ function balise_SET_dist($p){ * Signature : `#GET{cle[,defaut]}` * * La clé peut obtenir des sous clés séparés par des `/` - * + * * @balise * @link http://www.spip.net/3990 Balises #SET et #GET * @see balise_SET_dist() @@ -2098,24 +2193,25 @@ function balise_SET_dist($p){ * #SET{nb,#ARRAY{boucles,3}} * #GET{nb/boucles} affiche 3, équivalent à #GET{nb}|table_valeur{boucles} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_GET_dist($p) { $p->interdire_scripts = false; // le contenu vient de #SET, donc il est de confiance - if (function_exists('balise_ENV')) + if (function_exists('balise_ENV')) { return balise_ENV($p, '$Pile["vars"]'); - else + } else { return balise_ENV_dist($p, '$Pile["vars"]'); + } } /** * Compile la balise `#DOUBLONS` qui redonne les doublons enregistrés - * + * * - `#DOUBLONS{mots}` ou `#DOUBLONS{mots,famille}` * donne l'état des doublons `(MOTS)` à cet endroit * sous forme de tableau d'id_mot comme `array(1,2,3,...)` @@ -2125,23 +2221,25 @@ function balise_GET_dist($p) { * * @balise * @link http://www.spip.net/4123 - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_DOUBLONS_dist($p) { - if ($type = interprete_argument_balise(1,$p)) { - if ($famille = interprete_argument_balise(2,$p)) + if ($type = interprete_argument_balise(1, $p)) { + if ($famille = interprete_argument_balise(2, $p)) { $type .= '.' . $famille; - $p->code = '(isset($doublons['.$type.']) ? $doublons['.$type.'] : "")'; - if (!$p->etoile) + } + $p->code = '(isset($doublons[' . $type . ']) ? $doublons[' . $type . '] : "")'; + if (!$p->etoile) { $p->code = 'array_filter(array_map("intval",explode(",",' . $p->code . ')))'; - } - else + } + } else { $p->code = '$doublons'; + } $p->interdire_scripts = false; @@ -2149,7 +2247,6 @@ function balise_DOUBLONS_dist($p) { } - /** * Compile la balise `#PIPELINE` pour permettre d'insérer des sorties de * pipeline dans un squelette @@ -2167,18 +2264,19 @@ function balise_DOUBLONS_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_PIPELINE_dist($p) { - $_pipe = interprete_argument_balise(1,$p); + $_pipe = interprete_argument_balise(1, $p); if (!$_pipe) { $err_b_s_a = array('zbug_balise_sans_argument', array('balise' => 'PIPELINE')); erreur_squelette($err_b_s_a, $p); } else { - $_flux = interprete_argument_balise(2,$p); - $_flux = $_flux?$_flux:"''"; + $_flux = interprete_argument_balise(2, $p); + $_flux = $_flux ? $_flux : "''"; $p->code = "pipeline( $_pipe , $_flux )"; $p->interdire_scripts = false; } + return $p; } @@ -2190,7 +2288,7 @@ function balise_PIPELINE_dist($p) { * qui redéfinissent cette balise, le nom du champ SQL (ou le nom d'un contrôleur) * correspondant à ce qui est édité. Cela sert particulièrement au plugin Crayons. * Ainsi en absence du plugin, la balise est toujours reconnue (mais n'a aucune action). - * + * * @balise * @link http://www.spip.net/4584 * @example @@ -2202,15 +2300,15 @@ function balise_PIPELINE_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_EDIT_dist($p) { $p->code = "''"; $p->interdire_scripts = false; + return $p; } - /** * Compile la balise `#TOTAL_UNIQUE` qui récupère le nombre d'éléments * différents affichés par le filtre `unique` @@ -2228,11 +2326,12 @@ function balise_EDIT_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_TOTAL_UNIQUE_dist($p) { - $_famille = interprete_argument_balise(1,$p); + $_famille = interprete_argument_balise(1, $p); $_famille = $_famille ? $_famille : "''"; $p->code = "unique('', $_famille, true)"; + return $p; } @@ -2241,7 +2340,7 @@ function balise_TOTAL_UNIQUE_dist($p) { * * Crée un `array` PHP à partir d'arguments calculés. * Chaque paire d'arguments représente la clé et la valeur du tableau. - * + * * @balise * @link http://www.spip.net/4009 * @example @@ -2254,17 +2353,20 @@ function balise_TOTAL_UNIQUE_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_ARRAY_dist($p) { $_code = array(); - $n=1; + $n = 1; do { - $_key = interprete_argument_balise($n++,$p); - $_val = interprete_argument_balise($n++,$p); - if ($_key AND $_val) $_code[] = "$_key => $_val"; + $_key = interprete_argument_balise($n++, $p); + $_val = interprete_argument_balise($n++, $p); + if ($_key AND $_val) { + $_code[] = "$_key => $_val"; + } } while ($_key && $_val); - $p->code = 'array(' . join(', ',$_code).')'; + $p->code = 'array(' . join(', ', $_code) . ')'; $p->interdire_scripts = false; + return $p; } @@ -2275,7 +2377,7 @@ function balise_ARRAY_dist($p) { * @link http://www.spip.net/5547 * @example * ``` - * #LISTE{a,b,c,d,e} + * #LISTE{a,b,c,d,e} * ``` * * @param Champ $p @@ -2285,11 +2387,13 @@ function balise_ARRAY_dist($p) { */ function balise_LISTE_dist($p) { $_code = array(); - $n=1; - while ($_val = interprete_argument_balise($n++,$p)) + $n = 1; + while ($_val = interprete_argument_balise($n++, $p)) { $_code[] = $_val; - $p->code = 'array(' . join(', ',$_code).')'; + } + $p->code = 'array(' . join(', ', $_code) . ')'; $p->interdire_scripts = false; + return $p; } @@ -2304,10 +2408,10 @@ function balise_LISTE_dist($p) { * Cette balise créée un cache par session. * * Signature : `#AUTORISER{faire[,type[,id[,auteur[,options]]]}` - * + * * @note * La priorité des opérateurs exige && plutot que AND - * + * * @balise * @link http://www.spip.net/3896 * @see autoriser() @@ -2322,17 +2426,20 @@ function balise_LISTE_dist($p) { * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_AUTORISER_dist($p) { $_code = array(); $p->descr['session'] = true; // faire un cache par session - $n=1; - while ($_v = interprete_argument_balise($n++,$p)) + $n = 1; + while ($_v = interprete_argument_balise($n++, $p)) { $_code[] = $_v; + } - $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(', ',$_code).')?" ":"")'; + $p->code = '((function_exists("autoriser")||include_spip("inc/autoriser"))&&autoriser(' . join(', ', + $_code) . ')?" ":"")'; $p->interdire_scripts = false; + return $p; } @@ -2350,20 +2457,21 @@ function balise_AUTORISER_dist($p) { * #PLUGIN{prefixe, x} Renvoie l'information x du plugin (s'il est actif) * #PLUGIN{prefixe, tout} Renvoie toutes les informations du plugin (s'il est actif) * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_PLUGIN_dist($p) { - $plugin = interprete_argument_balise(1,$p); + $plugin = interprete_argument_balise(1, $p); $plugin = isset($plugin) ? str_replace('\'', '"', $plugin) : '""'; - $type_info = interprete_argument_balise(2,$p); + $type_info = interprete_argument_balise(2, $p); $type_info = isset($type_info) ? str_replace('\'', '"', $type_info) : '"est_actif"'; $f = chercher_filtre('info_plugin'); - $p->code = $f.'('.$plugin.', '.$type_info.')'; + $p->code = $f . '(' . $plugin . ', ' . $type_info . ')'; + return $p; } @@ -2378,17 +2486,18 @@ function balise_PLUGIN_dist($p) { * ``` * #AIDER{titre} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ + **/ function balise_AIDER_dist($p) { - $_motif = interprete_argument_balise(1,$p); + $_motif = interprete_argument_balise(1, $p); $s = "'" . addslashes($p->descr['sourcefile']) . "'"; - $aider = charger_fonction('aider','inc'); + $aider = charger_fonction('aider', 'inc'); $p->code = "((\$aider=charger_fonction('aider','inc'))?\$aider($_motif,$s, \$Pile[0]):'')"; + return $p; } @@ -2400,7 +2509,7 @@ function balise_AIDER_dist($p) { * Accèpte 2 arguments optionnels : * - L'url de l'action (par défaut `#ENV{action}` * - Le nom du formulaire (par défaut `#ENV{form}` - * + * * @balise * @see form_hidden() * @example @@ -2408,17 +2517,19 @@ function balise_AIDER_dist($p) { * <form method='post' action='#ENV{action}'><div> * #ACTION_FORMULAIRE * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer -**/ -function balise_ACTION_FORMULAIRE($p){ - if (!$_url = interprete_argument_balise(1,$p)) + **/ +function balise_ACTION_FORMULAIRE($p) { + if (!$_url = interprete_argument_balise(1, $p)) { $_url = "@\$Pile[0]['action']"; - if (!$_form = interprete_argument_balise(2,$p)) + } + if (!$_form = interprete_argument_balise(2, $p)) { $_form = "@\$Pile[0]['form']"; + } // envoyer le nom du formulaire que l'on traite // transmettre les eventuels args de la balise formulaire @@ -2432,13 +2543,14 @@ function balise_ACTION_FORMULAIRE($p){ '</div>'"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#BOUTON_ACTION` qui génère un bouton d'action en post, ajaxable - * + * * Cette balise s'utilise à la place des liens `action_auteur`, sous la forme * * - `#BOUTON_ACTION{libelle,url}` @@ -2454,42 +2566,45 @@ function balise_ACTION_FORMULAIRE($p){ * [(#BOUTON_ACTION{<:bouton_tenter_recuperation:>,#URL_ECRIRE{base_repair}})] * ] * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ -function balise_BOUTON_ACTION_dist($p){ +function balise_BOUTON_ACTION_dist($p) { $args = array(); - for ($k=1;$k<=6;$k++){ - $_a = interprete_argument_balise($k,$p); - if (!$_a) $_a="''"; - $args[] = $_a; + for ($k = 1; $k <= 6; $k++) { + $_a = interprete_argument_balise($k, $p); + if (!$_a) { + $_a = "''"; + } + $args[] = $_a; } // supprimer les args vides - while(end($args)=="''" AND count($args)>2) + while (end($args) == "''" AND count($args) > 2) { array_pop($args); - $args = implode(",",$args); + } + $args = implode(",", $args); $bouton_action = chercher_filtre("bouton_action"); $p->code = "$bouton_action($args)"; $p->interdire_scripts = false; + return $p; } - /** * Compile la balise `#SLOGAN_SITE_SPIP` qui retourne le slogan du site - * + * * @balise * @example * ``` * [<p id="slogan">(#SLOGAN_SITE_SPIP)</p>] * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ @@ -2497,6 +2612,7 @@ function balise_BOUTON_ACTION_dist($p){ */ function balise_SLOGAN_SITE_SPIP_dist($p) { $p->code = "\$GLOBALS['meta']['slogan_site']"; + #$p->interdire_scripts = true; return $p; } @@ -2507,7 +2623,7 @@ function balise_SLOGAN_SITE_SPIP_dist($p) { * * Renvoie `' '` si le webmestre souhaite que SPIP génère du code (X)HTML5 sur * le site public, et `''` si le code doit être strictement compatible HTML4 - * + * * @balise * @uses html5_permis() * @example @@ -2515,7 +2631,7 @@ function balise_SLOGAN_SITE_SPIP_dist($p) { * [(#HTML5) required="required"] * <input[ (#HTML5|?{type="email",type="text"})] ... /> * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ @@ -2524,15 +2640,15 @@ function balise_SLOGAN_SITE_SPIP_dist($p) { function balise_HTML5_dist($p) { $p->code = html5_permis() ? "' '" : "''"; $p->interdire_scripts = false; + return $p; } - /** * Compile la balise `#TRI` permettant d'afficher un lien de changement d'ordre de tri * d'une colonne de la boucle - * + * * La balise `#TRI{champ[,libelle]}` champ prend `>` ou `<` pour afficher * le lien de changement de sens croissant ou decroissant (`>` `<` indiquent * un sens par une flèche) @@ -2542,7 +2658,7 @@ function balise_HTML5_dist($p) { * ``` * <th>[(#TRI{titre,<:info_titre:>,ajax})]</th> * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @param string $liste @@ -2560,6 +2676,7 @@ function balise_TRI_dist($p, $liste = 'true') { array('champ' => '#TRI') ), $p->id_boucle); $p->code = "''"; + return $p; } $boucle = $p->boucles[$b]; @@ -2572,44 +2689,47 @@ function balise_TRI_dist($p, $liste = 'true') { array('champ' => '#TRI') ), $p->id_boucle); $p->code = "''"; + return $p; } - $_champ = interprete_argument_balise(1,$p); + $_champ = interprete_argument_balise(1, $p); // si pas de champ, renvoyer le critere de tri utilise - if (!$_champ){ + if (!$_champ) { $p->code = $boucle->modificateur['tri_champ']; + return $p; } // forcer la jointure si besoin, et si le champ est statique - if (preg_match(",^'([\w.]+)'$,i",$_champ,$m)){ - index_pile($b, $m[1], $p->boucles,'',null,true,false); + if (preg_match(",^'([\w.]+)'$,i", $_champ, $m)) { + index_pile($b, $m[1], $p->boucles, '', null, true, false); } - $_libelle = interprete_argument_balise(2,$p); - $_libelle = $_libelle?$_libelle:$_champ; + $_libelle = interprete_argument_balise(2, $p); + $_libelle = $_libelle ? $_libelle : $_champ; - $_class = interprete_argument_balise(3,$p); + $_class = interprete_argument_balise(3, $p); // si champ = ">" c'est un lien vers le tri croissant : de gauche a droite ==> 1 // si champ = "<" c'est un lien vers le tri decroissant : (sens inverse) == -1 $_issens = "in_array($_champ,array('>','<'))"; $_sens = "(strpos('< >',$_champ)-1)"; - $_variable = "((\$s=$_issens)?'sens':'tri').".$boucle->modificateur['tri_nom']; + $_variable = "((\$s=$_issens)?'sens':'tri')." . $boucle->modificateur['tri_nom']; $_url = "parametre_url(self(),$_variable,\$s?$_sens:$_champ)"; - $_url = "parametre_url($_url,'var_memotri',strncmp(".$boucle->modificateur['tri_nom'].",'session',7)==0?$_variable:'')"; - $_on = "\$s?(".$boucle->modificateur['tri_sens']."==$_sens".'):('.$boucle->modificateur['tri_champ']."==$_champ)"; + $_url = "parametre_url($_url,'var_memotri',strncmp(" . $boucle->modificateur['tri_nom'] . ",'session',7)==0?$_variable:'')"; + $_on = "\$s?(" . $boucle->modificateur['tri_sens'] . "==$_sens" . '):(' . $boucle->modificateur['tri_champ'] . "==$_champ)"; - $p->code = "lien_ou_expose($_url,$_libelle,$_on".($_class?",$_class":"").")"; + $p->code = "lien_ou_expose($_url,$_libelle,$_on" . ($_class ? ",$_class" : "") . ")"; //$p->code = "''"; $p->interdire_scripts = false; + return $p; } /** * Compile la balise `#SAUTER{n}` qui permet de sauter en avant n resultats dans une boucle - * + * * La balise modifie le compteur courant de la boucle, mais pas les autres * champs qui restent les valeurs de la boucle avant le saut. Il est donc * preferable d'utiliser la balise juste avant la fermeture `</BOUCLE>` @@ -2617,28 +2737,28 @@ function balise_TRI_dist($p, $liste = 'true') { * L'argument `n` doit être supérieur à zéro sinon la balise ne fait rien * * @balise - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ -function balise_SAUTER_dist($p){ +function balise_SAUTER_dist($p) { $id_boucle = $p->id_boucle; if (empty($p->boucles[$id_boucle])) { $msg = array('zbug_champ_hors_boucle', array('champ' => '#SAUTER')); erreur_squelette($msg, $p); - } - else { + } else { $boucle = $p->boucles[$id_boucle]; - $_saut = interprete_argument_balise(1,$p); + $_saut = interprete_argument_balise(1, $p); $_compteur = "\$Numrows['$id_boucle']['compteur_boucle']"; $_total = "\$Numrows['$id_boucle']['total']"; $p->code = "vide($_compteur=\$iter->skip($_saut,$_total))"; } $p->interdire_scripts = false; + return $p; } @@ -2654,18 +2774,18 @@ function balise_SAUTER_dist($p){ * #PUBLIE : porte sur la boucle en cours * [(#PUBLIE{article, 3}|oui) ... ] : pour l'objet indiqué * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ function balise_PUBLIE_dist($p) { - if (!$_type = interprete_argument_balise(1,$p)){ + if (!$_type = interprete_argument_balise(1, $p)) { $_type = _q($p->type_requete); - $_id = champ_sql($p->boucles[$p->id_boucle]->primary,$p); + $_id = champ_sql($p->boucles[$p->id_boucle]->primary, $p); } else { - $_id = interprete_argument_balise(2,$p); + $_id = interprete_argument_balise(2, $p); } $connect = ''; @@ -2673,8 +2793,9 @@ function balise_PUBLIE_dist($p) { $connect = $p->boucles[$p->id_boucle]->sql_serveur; } - $p->code = "(objet_test_si_publie(".$_type.",intval(".$_id."),"._q($connect).")?' ':'')"; + $p->code = "(objet_test_si_publie(" . $_type . ",intval(" . $_id . ")," . _q($connect) . ")?' ':'')"; $p->interdire_scripts = false; + return $p; } @@ -2697,17 +2818,17 @@ function balise_PUBLIE_dist($p) { * ``` * <link rel="stylesheet" type="text/css" href="#PRODUIRE{fond=css/macss.css,couleur=ffffff}" /> * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ -function balise_PRODUIRE_dist($p){ - $balise_inclure = charger_fonction('INCLURE','balise'); +function balise_PRODUIRE_dist($p) { + $balise_inclure = charger_fonction('INCLURE', 'balise'); $p = $balise_inclure($p); - $p->code = str_replace('recuperer_fond(','produire_fond_statique(',$p->code); + $p->code = str_replace('recuperer_fond(', 'produire_fond_statique(', $p->code); return $p; } @@ -2721,16 +2842,20 @@ function balise_PRODUIRE_dist($p){ * ``` * #LARGEUR_ECRAN{pleine_largeur} * ``` - * + * * @param Champ $p * Pile au niveau de la balise * @return Champ * Pile complétée par le code à générer */ -function balise_LARGEUR_ECRAN_dist($p){ - $_class = interprete_argument_balise(1,$p); - if (!$_class) $_class='null'; +function balise_LARGEUR_ECRAN_dist($p) { + $_class = interprete_argument_balise(1, $p); + if (!$_class) { + $_class = 'null'; + } $p->code = "(is_string($_class)?vide(\$GLOBALS['largeur_ecran']=$_class):(isset(\$GLOBALS['largeur_ecran'])?\$GLOBALS['largeur_ecran']:''))"; + return $p; } + ?> diff --git a/ecrire/public/boucles.php b/ecrire/public/boucles.php index 40f0352747..cebfbb646b 100644 --- a/ecrire/public/boucles.php +++ b/ecrire/public/boucles.php @@ -15,9 +15,11 @@ * Ce fichier definit les boucles standard de SPIP * * @package SPIP\Core\Compilateur\Boucles -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -29,39 +31,39 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * AST du squelette * @return string * Code PHP compilé de la boucle -**/ + **/ function boucle_DEFAUT_dist($id_boucle, &$boucles) { - return calculer_boucle($id_boucle, $boucles); + return calculer_boucle($id_boucle, $boucles); } /** * Compile une boucle récursive - * + * * `<BOUCLE(BOUCLE)>` * * @link http://www.spip.net/914 - * + * * @param string $id_boucle * Identifiant de la boucle * @param array $boucles * AST du squelette * @return string * Code PHP compilé de la boucle -**/ + **/ function boucle_BOUCLE_dist($id_boucle, &$boucles) { - return calculer_boucle($id_boucle, $boucles); + return calculer_boucle($id_boucle, $boucles); } /** * Compile une boucle HIERARCHIE - * + * * La boucle `<BOUCLE(HIERARCHIE)>` retourne la liste des RUBRIQUES * qui mènent de la racine du site à la rubrique ou à l’article en cours. * * 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 @@ -78,7 +80,7 @@ function boucle_BOUCLE_dist($id_boucle, &$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"; @@ -88,22 +90,24 @@ function boucle_HIERARCHIE_dist($id_boucle, &$boucles) { // 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"; + . 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)"'); + $boucle->where[] = array("'IN'", "'$id_table'", '"($hierarchie)"'); $order = "FIELD($id_table, \$hierarchie)"; - if (!isset($boucle->default_order[0]) OR $boucle->default_order[0] != " DESC") + if (!isset($boucle->default_order[0]) OR $boucle->default_order[0] != " DESC") { $boucle->default_order[] = "\"$order\""; - else + } else { $boucle->default_order[0] = "\"$order DESC\""; - return calculer_boucle($id_boucle, $boucles); + } + + return calculer_boucle($id_boucle, $boucles); } diff --git a/ecrire/public/cacher.php b/ecrire/public/cacher.php index 6d6e62f043..8d806d8a4b 100644 --- a/ecrire/public/cacher.php +++ b/ecrire/public/cacher.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Le format souhaite : tmp/cache/ab/cd @@ -25,39 +27,45 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @return string */ function generer_nom_fichier_cache($contexte, $page) { - $u = md5(var_export(array($contexte, $page),true)); + $u = md5(var_export(array($contexte, $page), true)); + return $u . ".cache"; } /** * ecrire le cache dans un casier + * * @param string $nom_cache * @param $valeur * @return bool */ -function ecrire_cache($nom_cache, $valeur){ - $d = substr($nom_cache,0,2); - $u = substr($nom_cache,2,2); +function ecrire_cache($nom_cache, $valeur) { + $d = substr($nom_cache, 0, 2); + $u = substr($nom_cache, 2, 2); $rep = _DIR_CACHE; - $rep = sous_repertoire($rep, '', false,true); - $rep = sous_repertoire($rep, $d, false,true); - return ecrire_fichier($rep . $u . ".cache",serialize(array("nom_cache"=>$nom_cache,"valeur"=>$valeur))); + $rep = sous_repertoire($rep, '', false, true); + $rep = sous_repertoire($rep, $d, false, true); + + return ecrire_fichier($rep . $u . ".cache", serialize(array("nom_cache" => $nom_cache, "valeur" => $valeur))); } /** * lire le cache depuis un casier + * * @param string $nom_cache * @return mixed */ -function lire_cache($nom_cache){ - $d = substr($nom_cache,0,2); - $u = substr($nom_cache,2,2); - if (file_exists($f=_DIR_CACHE."$d/$u.cache") - AND lire_fichier($f,$tmp) - AND $tmp = unserialize($tmp) - AND $tmp['nom_cache']==$nom_cache - AND isset($tmp['valeur'])) +function lire_cache($nom_cache) { + $d = substr($nom_cache, 0, 2); + $u = substr($nom_cache, 2, 2); + if (file_exists($f = _DIR_CACHE . "$d/$u.cache") + AND lire_fichier($f, $tmp) + AND $tmp = unserialize($tmp) + AND $tmp['nom_cache'] == $nom_cache + AND isset($tmp['valeur']) + ) { return $tmp['valeur']; + } return false; } @@ -65,12 +73,14 @@ function lire_cache($nom_cache){ // Parano : on signe le cache, afin d'interdire un hack d'injection // dans notre memcache function cache_signature(&$page) { - if (!isset($GLOBALS['meta']['cache_signature'])){ + if (!isset($GLOBALS['meta']['cache_signature'])) { include_spip('inc/acces'); include_spip('auth/sha256.inc'); - ecrire_meta('cache_signature', _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non'); + ecrire_meta('cache_signature', + _nano_sha256($_SERVER["DOCUMENT_ROOT"] . $_SERVER["SERVER_SIGNATURE"] . creer_uniqid()), 'non'); } - return crc32($GLOBALS['meta']['cache_signature'].$page['texte']); + + return crc32($GLOBALS['meta']['cache_signature'] . $page['texte']); } /** @@ -90,6 +100,7 @@ function gzip_page($page) { } else { $page['gz'] = false; } + return $page; } @@ -114,7 +125,7 @@ function gunzip_page(&$page) { /** * gestion des delais d'expiration du cache... * $page passee par reference pour accelerer - * + * * @param array $page * @param int $date * @return int @@ -128,24 +139,34 @@ function cache_valide(&$page, $date) { // Apparition d'un nouvel article post-date ? if (isset($GLOBALS['meta']['post_dates']) - AND $GLOBALS['meta']['post_dates'] == 'non' - AND isset($GLOBALS['meta']['date_prochain_postdate']) - AND $now > $GLOBALS['meta']['date_prochain_postdate']) { + AND $GLOBALS['meta']['post_dates'] == 'non' + AND isset($GLOBALS['meta']['date_prochain_postdate']) + AND $now > $GLOBALS['meta']['date_prochain_postdate'] + ) { spip_log('Un article post-date invalide le cache'); include_spip('inc/rubriques'); calculer_prochain_postdate(true); } - if (defined('_VAR_NOCACHE') AND _VAR_NOCACHE) return -1; - if (isset($GLOBALS['meta']['cache_inhib']) AND $_SERVER['REQUEST_TIME']<$GLOBALS['meta']['cache_inhib']) return -1; - if (defined('_NO_CACHE')) return (_NO_CACHE==0 AND !isset($page['texte']))?1:_NO_CACHE; + if (defined('_VAR_NOCACHE') AND _VAR_NOCACHE) { + return -1; + } + if (isset($GLOBALS['meta']['cache_inhib']) AND $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) { + return -1; + } + if (defined('_NO_CACHE')) { + return (_NO_CACHE == 0 AND !isset($page['texte'])) ? 1 : _NO_CACHE; + } // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache) - if (!$page OR !isset($page['texte']) OR !isset($page['entetes']['X-Spip-Cache'])) return _IS_BOT?-1:1; + if (!$page OR !isset($page['texte']) OR !isset($page['entetes']['X-Spip-Cache'])) { + return _IS_BOT ? -1 : 1; + } // controle de la signature - if ($page['sig'] !== cache_signature($page)) - return _IS_BOT?-1:1; + if ($page['sig'] !== cache_signature($page)) { + return _IS_BOT ? -1 : 1; + } // #CACHE{n,statique} => on n'invalide pas avec derniere_modif // cf. ecrire/public/balises.php, balise_CACHE_dist() @@ -154,25 +175,32 @@ function cache_valide(&$page, $date) { // Cache invalide par la meta 'derniere_modif' // sauf pour les bots, qui utilisent toujours le cache if (!_IS_BOT - AND $GLOBALS['derniere_modif_invalide'] - AND isset($GLOBALS['meta']['derniere_modif']) - AND $date < $GLOBALS['meta']['derniere_modif']) + AND $GLOBALS['derniere_modif_invalide'] + AND isset($GLOBALS['meta']['derniere_modif']) + AND $date < $GLOBALS['meta']['derniere_modif'] + ) { return 1; + } } // Sinon comparer l'age du fichier a sa duree de cache $duree = intval($page['entetes']['X-Spip-Cache']); - $cache_mark = (isset($GLOBALS['meta']['cache_mark'])?$GLOBALS['meta']['cache_mark']:0); + $cache_mark = (isset($GLOBALS['meta']['cache_mark']) ? $GLOBALS['meta']['cache_mark'] : 0); if ($duree == 0) #CACHE{0} + { return -1; - // sauf pour les bots, qui utilisent toujours le cache - else if ((!_IS_BOT AND $date + $duree < $now) - # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots - OR $date<$cache_mark) - return _IS_BOT?-1:1; - else - return 0; + } // sauf pour les bots, qui utilisent toujours le cache + else { + if ((!_IS_BOT AND $date+$duree < $now) + # le cache est anterieur a la derniere purge : l'ignorer, meme pour les bots + OR $date < $cache_mark + ) { + return _IS_BOT ? -1 : 1; + } else { + return 0; + } + } } /** @@ -192,25 +220,29 @@ function creer_cache(&$page, &$chemin_cache) { // le cas var_nocache ne devrait jamais arriver ici (securite) // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable if ((defined('_VAR_NOCACHE') AND _VAR_NOCACHE) - OR defined('spip_interdire_cache')) + OR defined('spip_interdire_cache') + ) { return; + } // Si la page c1234 a un invalideur de session 'zz', sauver dans // 'tmp/cache/MD5(chemin_cache)_zz' if (isset($page['invalideurs']) - AND isset($page['invalideurs']['session'])) { + AND isset($page['invalideurs']['session']) + ) { // on verifie que le contenu du chemin cache indique seulement // "cache sessionne" ; sa date indique la date de validite // des caches sessionnes if (!$tmp = lire_cache($chemin_cache)) { - spip_log('Creation cache sessionne '.$chemin_cache); + spip_log('Creation cache sessionne ' . $chemin_cache); $tmp = array( 'invalideurs' => array('session' => ''), 'lastmodified' => $_SERVER['REQUEST_TIME'] ); ecrire_cache($chemin_cache, $tmp); } - $chemin_cache = generer_nom_fichier_cache(array("chemin_cache"=>$chemin_cache), array("session"=>$page['invalideurs']['session'])); + $chemin_cache = generer_nom_fichier_cache(array("chemin_cache" => $chemin_cache), + array("session" => $page['invalideurs']['session'])); } // ajouter la date de production dans le cache lui meme @@ -218,13 +250,13 @@ function creer_cache(&$page, &$chemin_cache) { $page['lastmodified'] = $_SERVER['REQUEST_TIME']; // signer le contenu - $page['sig']= cache_signature($page); + $page['sig'] = cache_signature($page); // l'enregistrer, compresse ou non... - $ok = ecrire_cache($chemin_cache,gzip_page($page)); + $ok = ecrire_cache($chemin_cache, gzip_page($page)); - spip_log((_IS_BOT?"Bot:":"")."Creation du cache $chemin_cache pour " - . $page['entetes']['X-Spip-Cache']." secondes". ($ok?'':' (erreur!)'),_LOG_INFO_IMPORTANTE); + spip_log((_IS_BOT ? "Bot:" : "") . "Creation du cache $chemin_cache pour " + . $page['entetes']['X-Spip-Cache'] . " secondes" . ($ok ? '' : ' (erreur!)'), _LOG_INFO_IMPORTANTE); // Inserer ses invalideurs include_spip('inc/invalideur'); @@ -245,11 +277,12 @@ function creer_cache(&$page, &$chemin_cache) { */ function nettoyer_petit_cache($prefix, $duree = 300) { // determiner le repertoire a purger : 'tmp/CACHE/rech/' - $dircache = sous_repertoire(_DIR_CACHE,$prefix); - if (spip_touch($dircache.'purger_'.$prefix, $duree, true)) { - foreach (preg_files($dircache,'[.]txt$') as $f) { - if ($_SERVER['REQUEST_TIME'] - (@file_exists($f)?@filemtime($f):0) > $duree) + $dircache = sous_repertoire(_DIR_CACHE, $prefix); + if (spip_touch($dircache . 'purger_' . $prefix, $duree, true)) { + foreach (preg_files($dircache, '[.]txt$') as $f) { + if ($_SERVER['REQUEST_TIME']-(@file_exists($f) ? @filemtime($f) : 0) > $duree) { spip_unlink($f); + } } } } @@ -283,9 +316,9 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la # fonction de cache minimale : dire "non on ne met rien en cache" # $use_cache = -1; return; - + // Second appel, destine a l'enregistrement du cache sur le disque - if (isset($chemin_cache)){ + if (isset($chemin_cache)) { return creer_cache($page, $chemin_cache); } @@ -294,11 +327,13 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la // Cas ignorant le cache car completement dynamique if ($_SERVER['REQUEST_METHOD'] == 'POST' - OR _request('connect')) { + OR _request('connect') + ) { $use_cache = -1; $lastmodified = 0; $chemin_cache = ""; $page = array(); + return; } @@ -307,19 +342,23 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la $lastmodified = 0; // charger le cache s'il existe (et si il a bien le bon hash = anticollision) - if (!$page = lire_cache($chemin_cache)){ + if (!$page = lire_cache($chemin_cache)) { $page = array(); } // s'il est sessionne, charger celui correspondant a notre session if (isset($page['invalideurs']) - AND isset($page['invalideurs']['session'])) { - $chemin_cache_session = generer_nom_fichier_cache(array("chemin_cache"=>$chemin_cache), array("session"=>spip_session())); + AND isset($page['invalideurs']['session']) + ) { + $chemin_cache_session = generer_nom_fichier_cache(array("chemin_cache" => $chemin_cache), + array("session" => spip_session())); if ($page_session = lire_cache($chemin_cache_session) - AND $page_session['lastmodified'] >= $page['lastmodified']) + AND $page_session['lastmodified'] >= $page['lastmodified'] + ) { $page = $page_session; - else + } else { $page = array(); + } } @@ -329,9 +368,10 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la if (spip_connect()) { include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile - supprimer_fichier(_DIR_CACHE.$chemin_cache); - if (isset($chemin_cache_session) and $chemin_cache_session) - supprimer_fichier(_DIR_CACHE.$chemin_cache_session); + supprimer_fichier(_DIR_CACHE . $chemin_cache); + if (isset($chemin_cache_session) and $chemin_cache_session) { + supprimer_fichier(_DIR_CACHE . $chemin_cache_session); + } } } @@ -339,15 +379,16 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la // on supprime le cache if (defined('_VAR_MODE') && _VAR_MODE && (isset($_COOKIE['spip_session']) - || isset($_COOKIE['spip_admin']) - || @file_exists(_ACCESS_FILE_NAME)) + || isset($_COOKIE['spip_admin']) + || @file_exists(_ACCESS_FILE_NAME)) ) { - $page = array('contexte_implicite'=>$contexte_implicite); // ignorer le cache deja lu + $page = array('contexte_implicite' => $contexte_implicite); // ignorer le cache deja lu include_spip('inc/invalideur'); retire_caches($chemin_cache); # API invalideur inutile - supprimer_fichier(_DIR_CACHE.$chemin_cache); - if (isset($chemin_cache_session) and $chemin_cache_session) - supprimer_fichier(_DIR_CACHE.$chemin_cache_session); + supprimer_fichier(_DIR_CACHE . $chemin_cache); + if (isset($chemin_cache_session) and $chemin_cache_session) { + supprimer_fichier(_DIR_CACHE . $chemin_cache_session); + } } // $delais par defaut @@ -369,11 +410,12 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la if (!$use_cache) { // $page est un cache utilisable gunzip_page($page); + return; } } else { - $page = array('contexte_implicite'=>$contexte_implicite); - $use_cache = cache_valide($page,0); // fichier cache absent : provoque le calcul + $page = array('contexte_implicite' => $contexte_implicite); + $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul } // Si pas valide mais pas de connexion a la base, le garder quand meme @@ -381,15 +423,18 @@ function public_cacher_dist($contexte, &$use_cache, &$chemin_cache, &$page, &$la if (isset($page['texte'])) { gunzip_page($page); $use_cache = 0; - } - else { + } else { spip_log("Erreur base de donnees, impossible utiliser $chemin_cache"); include_spip('inc/minipres'); - return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status'=>503)); + + return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), array('status' => 503)); } } - if ($use_cache < 0) $chemin_cache = ''; + if ($use_cache < 0) { + $chemin_cache = ''; + } + return; } diff --git a/ecrire/public/compiler.php b/ecrire/public/compiler.php index 67b2df9bf5..e05583545c 100644 --- a/ecrire/public/compiler.php +++ b/ecrire/public/compiler.php @@ -15,9 +15,11 @@ * Fichier principal du compilateur de squelettes * * @package SPIP\Core\Compilateur\Compilation -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** Repérer un code ne calculant rien, meme avec commentaire */ define('CODE_MONOTONE', ",^(\n//[^\n]*\n)?\(?'([^'])*'\)?$,"); @@ -57,62 +59,90 @@ include_spip('public/jointures'); // http://code.spip.net/@argumenter_inclure -function argumenter_inclure($params, $rejet_filtres, $p, &$boucles, $id_boucle, $echap = true, $lang = '', $fond1 = false){ +function argumenter_inclure( + $params, + $rejet_filtres, + $p, + &$boucles, + $id_boucle, + $echap = true, + $lang = '', + $fond1 = false +) { $l = array(); $erreur_p_i_i = ''; - if (!is_array($params)) return $l; - foreach($params as $k => $couple) { - // la liste d'arguments d'inclusion peut se terminer par un filtre + if (!is_array($params)) { + return $l; + } + foreach ($params as $k => $couple) { + // la liste d'arguments d'inclusion peut se terminer par un filtre $filtre = array_shift($couple); - if ($filtre) break; - foreach($couple as $n => $val) { + if ($filtre) { + break; + } + foreach ($couple as $n => $val) { $var = $val[0]; if ($var->type != 'texte') { - if ($n OR $k OR $fond1) { - $erreur_p_i_i = array('zbug_parametres_inclus_incorrects', - array('param' => $var->nom_champ)); - erreur_squelette($erreur_p_i_i, $p); - break; - } - else $l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle); + if ($n OR $k OR $fond1) { + $erreur_p_i_i = array( + 'zbug_parametres_inclus_incorrects', + array('param' => $var->nom_champ) + ); + erreur_squelette($erreur_p_i_i, $p); + break; + } else { + $l[1] = calculer_liste($val, $p->descr, $boucles, $id_boucle); + } } else { - preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte,$m); + preg_match(",^([^=]*)(=?)(.*)$,m", $var->texte, $m); $m = array_pad($m, 3, null); $var = $m[1]; $auto = false;; if ($m[2]) { - $v = $m[3]; - if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) $v = $m[1]; - $val[0] = new Texte; - $val[0]->texte = $v; + $v = $m[3]; + if (preg_match(',^[\'"](.*)[\'"]$,', $v, $m)) { + $v = $m[1]; + } + $val[0] = new Texte; + $val[0]->texte = $v; } elseif ($k OR $n OR $fond1) { - $auto = true; - } else $var = 1; + $auto = true; + } else { + $var = 1; + } if ($var == 'lang') { - $lang = !$auto - ? calculer_liste($val, $p->descr, $boucles, $id_boucle) - : '$GLOBALS["spip_lang"]'; + $lang = !$auto + ? calculer_liste($val, $p->descr, $boucles, $id_boucle) + : '$GLOBALS["spip_lang"]'; } else { - $val = $auto - ? index_pile($id_boucle, $var, $boucles) - : calculer_liste($val, $p->descr, $boucles, $id_boucle); - if ($var !== 1) - $val = ($echap?"\'$var\' => ' . argumenter_squelette(":"'$var' => ") - . $val . ($echap? ") . '":" "); - else $val = $echap ? "'.$val.'" : $val; - $l[$var] = $val; + $val = $auto + ? index_pile($id_boucle, $var, $boucles) + : calculer_liste($val, $p->descr, $boucles, $id_boucle); + if ($var !== 1) { + $val = ($echap ? "\'$var\' => ' . argumenter_squelette(" : "'$var' => ") + . $val . ($echap ? ") . '" : " "); + } else { + $val = $echap ? "'.$val.'" : $val; + } + $l[$var] = $val; } } } } - if ($erreur_p_i_i) return false; + if ($erreur_p_i_i) { + return false; + } // Cas particulier de la langue : si {lang=xx} est definie, on // la passe, sinon on passe la langue courante au moment du calcul // sauf si on n'en veut pas - if ($lang === false) return $l; - if (!$lang) $lang = '$GLOBALS["spip_lang"]'; - $l['lang'] = ($echap?"\'lang\' => ' . argumenter_squelette(":"'lang' => ") . $lang . ($echap?") . '":" "); + if ($lang === false) { + return $l; + } + if (!$lang) { + $lang = '$GLOBALS["spip_lang"]'; + } + $l['lang'] = ($echap ? "\'lang\' => ' . argumenter_squelette(" : "'lang' => ") . $lang . ($echap ? ") . '" : " "); return $l; } @@ -135,7 +165,7 @@ define('CODE_RECUPERER_FOND', 'recuperer_fond(%s, %s, array(%s), %s)'); * Identifiant de la boucle contenant l'inclure * @return string * Code PHP appelant l'inclusion -**/ + **/ function calculer_inclure($p, &$boucles, $id_boucle) { $_contexte = argumenter_inclure($p->param, false, $p, $boucles, $id_boucle, true, '', true); @@ -145,21 +175,26 @@ function calculer_inclure($p, &$boucles, $id_boucle) { } else { $code = calculer_liste($p->texte, $p->descr, $boucles, $id_boucle); - if ($code AND preg_match("/^'([^']*)'/s", $code, $r)) + if ($code AND preg_match("/^'([^']*)'/s", $code, $r)) { $fichier = $r[1]; - else $fichier = ''; + } else { + $fichier = ''; + } } if (!$code OR $code === '""') { - $erreur_p_i_i = array('zbug_parametres_inclus_incorrects', - array('param' => $code)); + $erreur_p_i_i = array( + 'zbug_parametres_inclus_incorrects', + array('param' => $code) + ); erreur_squelette($erreur_p_i_i, $p); + return false; } $compil = texte_script(memoriser_contexte_compil($p)); if (is_array($_contexte)) { // Critere d'inclusion {env} (et {self} pour compatibilite ascendante) - if ($env = (isset($_contexte['env'])|| isset($_contexte['self']))) { + if ($env = (isset($_contexte['env']) || isset($_contexte['self']))) { unset($_contexte['env']); } @@ -168,17 +203,17 @@ function calculer_inclure($p, &$boucles, $id_boucle) { $_contexte['doublons'] = "\\'doublons\\' => '.var_export(\$doublons,true).'"; } - if ($ajax = isset($_contexte['ajax'])){ - $ajax = preg_replace(",=>(.*)$,ims",'=> ($v=(\\1))?$v:true',$_contexte['ajax']); + if ($ajax = isset($_contexte['ajax'])) { + $ajax = preg_replace(",=>(.*)$,ims", '=> ($v=(\\1))?$v:true', $_contexte['ajax']); unset($_contexte['ajax']); } $_contexte = join(",\n\t", $_contexte); - } - else - return false; // j'aurais voulu toucher le fond ... - - $contexte = 'array(' . $_contexte .')'; + } else { + return false; + } // j'aurais voulu toucher le fond ... + + $contexte = 'array(' . $_contexte . ')'; if ($env) { $contexte = "array_merge('.var_export(\$Pile[0],1).',$contexte)"; @@ -187,15 +222,17 @@ function calculer_inclure($p, &$boucles, $id_boucle) { // s'il y a une extension .php, ce n'est pas un squelette if (preg_match('/^.+[.]php$/s', $fichier)) { $code = sandbox_composer_inclure_php($fichier, $p, $contexte); - } else { + } else { $_options[] = "\"compil\"=>array($compil)"; - if ($ajax) + if ($ajax) { $_options[] = $ajax; - $code = " ' . argumenter_squelette($code) . '"; - $code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',',$_options), "_request(\"connect\")") . ';'; + } + $code = " ' . argumenter_squelette($code) . '"; + $code = "echo " . sprintf(CODE_RECUPERER_FOND, $code, $contexte, implode(',', $_options), + "_request(\"connect\")") . ';'; } - return "\n'<'.'". "?php ". $code . "\n?'." . "'>'"; + return "\n'<'.'" . "?php " . $code . "\n?'." . "'>'"; } @@ -212,7 +249,7 @@ function calculer_inclure($p, &$boucles, $id_boucle) { * @param bool $ignore_previsu * true pour ne tester que le cas publie et ignorer l'eventuel var_mode=preview de la page */ -function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false){ +function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false) { /* $show['statut'][] = array( 'champ'=>'statut', // champ de la table sur lequel porte le filtrage par le statut @@ -239,12 +276,12 @@ function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false){ */ $id_table = $boucle->id_table; $show = $boucle->show; - if (isset($show['statut']) AND $show['statut']){ - foreach($show['statut'] as $k=>$s){ + if (isset($show['statut']) AND $show['statut']) { + foreach ($show['statut'] as $k => $s) { // Restreindre aux elements publies si pas de {statut} ou autre dans les criteres $filtrer = true; if (isset($s['exception'])) { - foreach(is_array($s['exception'])?$s['exception']:array($s['exception']) as $m) { + foreach (is_array($s['exception']) ? $s['exception'] : array($s['exception']) as $m) { if (isset($boucle->modificateur[$m]) OR isset($boucle->modificateur['criteres'][$m])) { $filtrer = false; break; @@ -253,51 +290,51 @@ function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false){ } if ($filtrer) { - if (is_array($s['champ'])){ - $statut = preg_replace(',\W,','',array_pop($s['champ'])); // securite + if (is_array($s['champ'])) { + $statut = preg_replace(',\W,', '', array_pop($s['champ'])); // securite $jointures = array(); // indiquer la description de chaque table dans le tableau de jointures, // ce qui permet d'eviter certains GROUP BY inutiles. $trouver_table = charger_fonction('trouver_table', 'base'); - foreach($s['champ'] as $j) { + foreach ($s['champ'] as $j) { $id = reset($j); $def = $trouver_table($id); - $jointures[] = array('',array($id,$def),end($j)); + $jointures[] = array('', array($id, $def), end($j)); } $jointures[0][0] = $id_table; - if (!array_search($id, $boucle->from)){ + if (!array_search($id, $boucle->from)) { include_spip('public/jointures'); fabrique_jointures($boucle, $jointures, true, $boucle->show, $id_table, '', $echapper); } // trouver l'alias de la table d'arrivee qui porte le statut $id = array_search($id, $boucle->from); - } - else { + } else { $id = $id_table; - $statut = preg_replace(',\W,','',$s['champ']); // securite + $statut = preg_replace(',\W,', '', $s['champ']); // securite } - $mstatut = $id .'.'.$statut; + $mstatut = $id . '.' . $statut; - $arg_ignore_previsu=($ignore_previsu?",true":''); + $arg_ignore_previsu = ($ignore_previsu ? ",true" : ''); include_spip('public/quete'); if (isset($s['post_date']) AND $s['post_date'] - AND $GLOBALS['meta']["post_dates"] == 'non'){ - $date = $id.'.'.preg_replace(',\W,','',$s['post_date']); // securite + AND $GLOBALS['meta']["post_dates"] == 'non' + ) { + $date = $id . '.' . preg_replace(',\W,', '', $s['post_date']); // securite array_unshift($boucle->where, $echapper ? - "\nquete_condition_postdates('$date',"._q($boucle->sql_serveur)."$arg_ignore_previsu)" - : - quete_condition_postdates($date,$boucle->sql_serveur,$ignore_previsu) + "\nquete_condition_postdates('$date'," . _q($boucle->sql_serveur) . "$arg_ignore_previsu)" + : + quete_condition_postdates($date, $boucle->sql_serveur, $ignore_previsu) ); } array_unshift($boucle->where, $echapper ? "\nquete_condition_statut('$mstatut'," - . _q($s['previsu'])."," - ._q($s['publie'])."," - ._q($boucle->sql_serveur)."$arg_ignore_previsu)" - : - quete_condition_statut($mstatut,$s['previsu'],$s['publie'],$boucle->sql_serveur,$ignore_previsu) + . _q($s['previsu']) . "," + . _q($s['publie']) . "," + . _q($boucle->sql_serveur) . "$arg_ignore_previsu)" + : + quete_condition_statut($mstatut, $s['previsu'], $s['publie'], $boucle->sql_serveur, $ignore_previsu) ); } } @@ -306,17 +343,17 @@ function instituer_boucle(&$boucle, $echapper = true, $ignore_previsu = false){ /** * 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 + * Identifiant de la boucle * @param array $boucles - * AST du squelette + * AST du squelette * @return string - * Code PHP compilé de la boucle + * Code PHP compilé de la boucle */ function calculer_boucle($id_boucle, &$boucles) { @@ -326,51 +363,53 @@ function calculer_boucle($id_boucle, &$boucles) { // en mode debug memoriser les premiers passages dans la boucle, // mais pas tous, sinon ca pete. - if (_request('var_mode_affiche') != 'resultat') + if (_request('var_mode_affiche') != 'resultat') { $trace = ''; - else { + } else { $trace = $boucles[$id_boucle]->descr['nom'] . $id_boucle; $trace = "if (count(@\$GLOBALS['debug_objets']['resultat']['$trace'])<3) \$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); + ? calculer_boucle_rec($id_boucle, $boucles, $trace) + : calculer_boucle_nonrec($id_boucle, $boucles, $trace); } /** - * Compilation d'une boucle recursive. + * Compilation d'une boucle recursive. * * @internal - * Il suffit (ET IL FAUT) sauvegarder les valeurs des arguments passes par - * reference, car par definition un tel passage ne les sauvegarde pas - * + * Il suffit (ET IL FAUT) sauvegarder les valeurs des arguments passes par + * reference, car par definition un tel passage ne les sauvegarde pas + * * @param string $id_boucle - * Identifiant de la boucle + * Identifiant de la boucle * @param array $boucles - * AST du squelette + * AST du squelette * @param string $trace - * Code PHP (en mode debug uniquement) servant à conserver une - * trace des premières valeurs de la boucle afin de pouvoir - * les afficher dans le débugueur ultérieurement + * Code PHP (en mode debug uniquement) servant à conserver une + * trace des premières valeurs de la boucle afin de pouvoir + * les afficher dans le débugueur ultérieurement * @return string - * Code PHP compilé de la boucle récursive -**/ + * Code PHP compilé de la boucle récursive + **/ function calculer_boucle_rec($id_boucle, &$boucles, $trace) { $nom = $boucles[$id_boucle]->param[0]; + return - // Numrows[$nom] peut ne pas être encore defini - "\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());" - . "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";" - . "\n\t\$Numrows['$nom'] = (\$save_numrows);" - . $trace - . "\n\treturn \$t0;"; + // Numrows[$nom] peut ne pas être encore defini + "\n\t\$save_numrows = (isset(\$Numrows['$nom']) ? \$Numrows['$nom'] : array());" + . "\n\t\$t0 = " . $boucles[$id_boucle]->return . ";" + . "\n\t\$Numrows['$nom'] = (\$save_numrows);" + . $trace + . "\n\treturn \$t0;"; } /** * Compilation d'une boucle non recursive. - * + * * La constante donne le cadre systématique du code: * * - %s1: initialisation des arguments de calculer_select @@ -379,9 +418,9 @@ function calculer_boucle_rec($id_boucle, &$boucles, $trace) { * - %s4: sauvegarde de la langue et calcul des invariants de boucle sur elle * - %s5: boucle while sql_fetch ou str_repeat si corps monotone * - %s6: restauration de la langue - * - %s7: liberation de la ressource, en tenant compte du serveur SQL + * - %s7: liberation de la ressource, en tenant compte du serveur SQL * - %s8: code de trace eventuel avant le retour -**/ + **/ define('CODE_CORPS_BOUCLE', '%s if (defined("_BOUCLE_PROFILER")) $timer = time()+microtime(); $t0 = ""; @@ -404,44 +443,48 @@ define('CODE_CORPS_BOUCLE', '%s ); /** - * Compilation d'une boucle (non recursive). + * Compilation d'une boucle (non recursive). * * @param string $id_boucle - * Identifiant de la boucle + * Identifiant de la boucle * @param array $boucles - * AST du squelette + * AST du squelette * @param string $trace - * Code PHP (en mode debug uniquement) servant à conserver une - * trace des premières valeurs de la boucle afin de pouvoir - * les afficher dans le débugueur ultérieurement + * Code PHP (en mode debug uniquement) servant à conserver une + * trace des premières valeurs de la boucle afin de pouvoir + * les afficher dans le débugueur ultérieurement * @return string - * Code PHP compilé de la boucle récursive -**/ + * Code PHP compilé de la boucle récursive + **/ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { $boucle = &$boucles[$id_boucle]; $return = $boucle->return; $type_boucle = $boucle->type_requete; $primary = $boucle->primary; - $constant = preg_match(CODE_MONOTONE, str_replace("\\'",'', $return)); - $flag_cpt = $boucle->mode_partie ||$boucle->cptrows; + $constant = preg_match(CODE_MONOTONE, str_replace("\\'", '', $return)); + $flag_cpt = $boucle->mode_partie || $boucle->cptrows; $corps = ''; // faudrait expanser le foreach a la compil, car y en a souvent qu'un // et puis faire un [] plutot qu'un "','." - if ($boucle->doublons) + if ($boucle->doublons) { $corps .= "\n\t\t\tforeach(" . $boucle->doublons . ' as $k) $doublons[$k] .= "," . ' . - index_pile($id_boucle, $primary, $boucles) - . "; // doublons\n"; + index_pile($id_boucle, $primary, $boucles) + . "; // doublons\n"; + } // La boucle doit-elle selectionner la langue ? // - par defaut, les boucles suivantes le font // (sauf si forcer_lang==true ou si le titre contient <multi>). // - a moins d'une demande explicite via {!lang_select} if (!$constant && $boucle->lang_select != 'non' && - (($boucle->lang_select == 'oui') || - in_array($type_boucle, array( - 'articles', 'rubriques', 'hierarchie', 'breves' + (($boucle->lang_select == 'oui') || + in_array($type_boucle, array( + 'articles', + 'rubriques', + 'hierarchie', + 'breves' ))) ) { // Memoriser la langue avant la boucle et la restituer apres @@ -450,24 +493,27 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { $fin_lang = "lang_select();\n\t"; $fin_lang_select_public = "\n\t\tlang_select();"; - $corps .= + $corps .= "\n\t\tlang_select_public(" . index_pile($id_boucle, 'lang', $boucles) - . ", '".$boucle->lang_select."'" + . ", '" . $boucle->lang_select . "'" . (in_array($type_boucle, array( - 'articles', 'rubriques', 'hierarchie', 'breves' - )) ? ', '.index_pile($id_boucle, 'titre', $boucles) : '') + 'articles', + 'rubriques', + 'hierarchie', + 'breves' + )) ? ', ' . index_pile($id_boucle, 'titre', $boucles) : '') . ');'; - } - else { + } else { $init_lang = ''; $fin_lang = ''; $fin_lang_select_public = ''; // sortir les appels au traducteur (invariants de boucle) if (strpos($return, '?php') === false - AND preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r)) { + AND preg_match_all("/\W(_T[(]'[^']*'[)])/", $return, $r) + ) { $i = 1; - foreach($r[1] as $t) { + foreach ($r[1] as $t) { $init_lang .= "\n\t\$l$i = $t;"; $return = str_replace($t, "\$l$i", $return); $i++; @@ -476,79 +522,89 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { } // gestion optimale des separateurs et des boucles constantes - if (count($boucle->separateur)) - $code_sep = ("'" . str_replace("'","\'",join('',$boucle->separateur)) . "'"); + if (count($boucle->separateur)) { + $code_sep = ("'" . str_replace("'", "\'", join('', $boucle->separateur)) . "'"); + } - $corps .= - ((!$boucle->separateur) ? + $corps .= + ((!$boucle->separateur) ? (($constant && !$corps && !$flag_cpt) ? $return : - (($return==="''") ? '' : - ("\n\t\t" . '$t0 .= ' . $return . ";"))) : - ("\n\t\t\$t1 " . - ((strpos($return, '$t1.') === 0) ? - (".=" . substr($return,4)) : - ('= ' . $return)) . - ";\n\t\t" . - '$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;")); - + (($return === "''") ? '' : + ("\n\t\t" . '$t0 .= ' . $return . ";"))) : + ("\n\t\t\$t1 " . + ((strpos($return, '$t1.') === 0) ? + (".=" . substr($return, 4)) : + ('= ' . $return)) . + ";\n\t\t" . + '$t0 .= ((strlen($t1) && strlen($t0)) ? ' . $code_sep . " : '') . \$t1;")); + // Calculer les invalideurs si c'est une boucle non constante et si on // souhaite invalider ces elements if (!$constant AND $primary) { include_spip('inc/invalideur'); - if (function_exists($i = 'calcul_invalideurs')) + if (function_exists($i = 'calcul_invalideurs')) { $corps = $i($corps, $primary, $boucles, $id_boucle); + } } // gerer le compteur de boucle // avec ou sans son utilisation par les criteres {1/3} {1,4} {n-2,1}... - if ($boucle->partie OR $boucle->cptrows) + if ($boucle->partie OR $boucle->cptrows) { $corps = "\n\t\t\$Numrows['$id_boucle']['compteur_boucle']++;" - . $boucle->partie - . $corps; + . $boucle->partie + . $corps; + } // depiler la lang de la boucle si besoin $corps .= $fin_lang_select_public; // si le corps est une constante, ne pas appeler le serveur N fois! - if (preg_match(CODE_MONOTONE,str_replace("\\'",'',$corps), $r)) { + if (preg_match(CODE_MONOTONE, str_replace("\\'", '', $corps), $r)) { if (!isset($r[2]) OR (!$r[2])) { - if (!$boucle->numrows) + if (!$boucle->numrows) { return "\n\t\$t0 = '';"; - else + } else { $corps = ""; + } } else { $boucle->numrows = true; $corps = "\n\t\$t0 = str_repeat($corps, \$Numrows['$id_boucle']['total']);"; } - } else $corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n }"; + } else { + $corps = "while (\$Pile[\$SP]=\$iter->fetch()) {\n$corps\n }"; + } $count = ''; if (!$boucle->select) { - if (!$boucle->numrows OR $boucle->limit OR $boucle->mode_partie OR $boucle->group) + if (!$boucle->numrows OR $boucle->limit OR $boucle->mode_partie OR $boucle->group) { $count = '1'; - else $count = 'count(*)'; - $boucles[$id_boucle]->select[]= $count; + } else { + $count = 'count(*)'; + } + $boucles[$id_boucle]->select[] = $count; } - if ($flag_cpt) + if ($flag_cpt) { $nums = "\n\t// COMPTEUR\n\t" - . "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t"; - else $nums = ''; + . "\$Numrows['$id_boucle']['compteur_boucle'] = 0;\n\t"; + } else { + $nums = ''; + } if ($boucle->numrows OR $boucle->mode_partie) { $nums .= "\$Numrows['$id_boucle']['total'] = @intval(\$iter->count());" - . $boucle->mode_partie - . "\n\t"; + . $boucle->mode_partie + . "\n\t"; } // Ne calculer la requete que maintenant // car ce qui precede appelle index_pile qui influe dessus $init = (($init = $boucles[$id_boucle]->doublons) - ? ("\n\t$init = array();") : '') - . calculer_requete_sql($boucles[$id_boucle]); + ? ("\n\t$init = array();") : '') + . calculer_requete_sql($boucles[$id_boucle]); $contexte = memoriser_contexte_compil($boucle); @@ -562,7 +618,7 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { $corps, $fin_lang, $trace, - 'BOUCLE'.$id_boucle .' @ '.($boucle->descr['sourcefile']) + 'BOUCLE' . $id_boucle . ' @ ' . ($boucle->descr['sourcefile']) ); # var_dump($a);exit; @@ -577,46 +633,48 @@ function calculer_boucle_nonrec($id_boucle, &$boucles, $trace) { * pour que la boucle produise ensuite sa requête, tel que `$command['from'] = 'spip_articles';` * * @param Boucle $boucle - * AST de la boucle + * AST de la boucle * @return string * Code PHP compilé définissant les informations de requête -**/ -function calculer_requete_sql($boucle) -{ + **/ +function calculer_requete_sql($boucle) { $init = array(); - $init[] = calculer_dec('table', "'" . $boucle->id_table ."'"); - $init[] = calculer_dec('id', "'" . $boucle->id_boucle ."'"); + $init[] = calculer_dec('table', "'" . $boucle->id_table . "'"); + $init[] = calculer_dec('id', "'" . $boucle->id_boucle . "'"); # En absence de champ c'est un decompte : - $init[] = calculer_dec('from', calculer_from($boucle)); + $init[] = calculer_dec('from', calculer_from($boucle)); $init[] = calculer_dec('type', calculer_from_type($boucle)); - $init[] = calculer_dec('groupby', 'array(' . (($g=join("\",\n\t\t\"",$boucle->group))?'"'.$g.'"':'') . ")"); - $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select). "\")"); - $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")"); + $init[] = calculer_dec('groupby', + 'array(' . (($g = join("\",\n\t\t\"", $boucle->group)) ? '"' . $g . '"' : '') . ")"); + $init[] = calculer_dec('select', 'array("' . join("\",\n\t\t\"", $boucle->select) . "\")"); + $init[] = calculer_dec('orderby', 'array(' . calculer_order($boucle) . ")"); $init[] = calculer_dec('where', calculer_dump_array($boucle->where)); $init[] = calculer_dec('join', calculer_dump_join($boucle->join)); $init[] = calculer_dec('limit', - (strpos($boucle->limit, 'intval') === false ? - "'".$boucle->limit."'" - : - $boucle->limit)); + (strpos($boucle->limit, 'intval') === false ? + "'" . $boucle->limit . "'" + : + $boucle->limit)); $init[] = calculer_dec('having', calculer_dump_array($boucle->having)); $s = $d = ""; // l'index 0 de $i indique si l'affectation est statique (contenu) // ou recalculée à chaque passage (vide) - foreach ($init as $i){ - if (reset($i)) - $s .= "\n\t\t".end($i); # statique - else - $d .= "\n\t".end($i); # dynamique + foreach ($init as $i) { + if (reset($i)) { + $s .= "\n\t\t" . end($i); + } # statique + else { + $d .= "\n\t" . end($i); + } # dynamique } return ($boucle->hierarchie ? "\n\t$boucle->hierarchie" : '') - . $boucle->in - . $boucle->hash - . "\n\t".'if (!isset($command[\'table\'])) {' - . $s - . "\n\t}" - . $d; + . $boucle->in + . $boucle->hash + . "\n\t" . 'if (!isset($command[\'table\'])) {' + . $s + . "\n\t}" + . $d; } /** @@ -626,45 +684,50 @@ function calculer_requete_sql($boucle) * de l'élément dans une chaîne. * * @see reconstruire_contexte_compil() - * + * * @param Object $p * Objet de l'AST dont on mémorise le contexte * @return string * Informations du contexte séparés par des virgules, * qui peut être utilisé pour la production d'un tableau array() -**/ + **/ function memoriser_contexte_compil($p) { return join(',', array( _q(isset($p->descr['sourcefile']) ? $p->descr['sourcefile'] : ''), _q(isset($p->descr['nom']) ? $p->descr['nom'] : ''), _q(isset($p->id_boucle) ? $p->id_boucle : null), intval($p->ligne), - '$GLOBALS[\'spip_lang\']')); + '$GLOBALS[\'spip_lang\']' + )); } /** - * Reconstruit un contexte de compilation + * Reconstruit un contexte de compilation * * Pour un tableau d'information de contexte donné, * retourne un objet Contexte (objet générique de l'AST) * avec ces informations * * @see memoriser_contexte_compil() - * + * * @param array $context_compil * Tableau des informations du contexte * @return Contexte * Objet Contexte -**/ -function reconstruire_contexte_compil($context_compil) -{ - if (!is_array($context_compil)) return $context_compil; + **/ +function reconstruire_contexte_compil($context_compil) { + if (!is_array($context_compil)) { + return $context_compil; + } $p = new Contexte; - $p->descr = array('sourcefile' => $context_compil[0], - 'nom' => $context_compil[1]); + $p->descr = array( + 'sourcefile' => $context_compil[0], + 'nom' => $context_compil[1] + ); $p->id_boucle = $context_compil[2]; $p->ligne = $context_compil[3]; $p->lang = $context_compil[4]; + return $p; } @@ -679,20 +742,19 @@ function reconstruire_contexte_compil($context_compil) * de la variable pourra être statique (c'est à dire qu'il ne dépend * pas d'une quelconque variable PHP), et donc attribué une fois pour toutes * quelque soit le nombre d'appels de la boucle. - * + * * @param string $nom * Nom de la commande * @param string $val * Code PHP décrivant la valeur à affecter * @return array - * + * * - index 0 : Code pour une affectation statique. Si non rempli, la propriété devra * être ré-affectée à chaque appel de la boucle. * - index 1 : Code de l'affectation -**/ -function calculer_dec($nom, $val) -{ - $static = 'if (!isset($command[\''.$nom.'\'])) '; + **/ +function calculer_dec($nom, $val) { + $static = 'if (!isset($command[\'' . $nom . '\'])) '; // si une variable apparait dans le calcul de la clause // il faut la re-evaluer a chaque passage if ( @@ -709,7 +771,7 @@ function calculer_dec($nom, $val) $static = ""; } - return array($static,'$command[\''.$nom.'\'] = ' . $val . ';'); + return array($static, '$command[\'' . $nom . '\'] = ' . $val . ';'); } /** @@ -718,38 +780,43 @@ function calculer_dec($nom, $val) * Lorsqu'un tableau est transmis, reconstruit de quoi créer le tableau * en code PHP (une sorte de var_export) en appelant pour chaque valeur * cette fonction de manière récursive. - * + * * Si le premier index (0) du tableau est "'?'", retourne un code * de test entre les 3 autres valeurs (v1 ? v2 : v3). Les valeurs * pouvant être des tableaux aussi. - * + * * @param mixed $a * Les données dont on veut construire un équivalent de var_export * @return string * Expression PHP décrivant un texte ou un tableau -**/ -function calculer_dump_array($a) -{ - if (!is_array($a)) return $a ; - $res = ""; - if ($a AND $a[0] == "'?'") - return ("(" . calculer_dump_array($a[1]) . - " ? " . calculer_dump_array($a[2]) . - " : " . calculer_dump_array($a[3]) . - ")"); - else { - foreach($a as $v) $res .= ", " . calculer_dump_array($v); - return "\n\t\t\tarray(" . substr($res,2) . ')'; - } + **/ +function calculer_dump_array($a) { + if (!is_array($a)) { + return $a; + } + $res = ""; + if ($a AND $a[0] == "'?'") { + return ("(" . calculer_dump_array($a[1]) . + " ? " . calculer_dump_array($a[2]) . + " : " . calculer_dump_array($a[3]) . + ")"); + } else { + foreach ($a as $v) { + $res .= ", " . calculer_dump_array($v); + } + + return "\n\t\t\tarray(" . substr($res, 2) . ')'; + } } // http://code.spip.net/@calculer_dump_join -function calculer_dump_join($a) -{ - $res = ""; - foreach($a as $k => $v) - $res .= ", '$k' => array(".implode(',',$v).")"; - return 'array(' . substr($res,2) . ')'; +function calculer_dump_join($a) { + $res = ""; + foreach ($a as $k => $v) { + $res .= ", '$k' => array(" . implode(',', $v) . ")"; + } + + return 'array(' . substr($res, 2) . ')'; } /** @@ -759,36 +826,41 @@ function calculer_dump_join($a) * Description de la boucle * @return string * Code PHP construisant un tableau des alias et noms des tables du FROM -**/ -function calculer_from(&$boucle) -{ - $res = ""; - foreach($boucle->from as $k => $v) $res .= ",'$k' => '$v'"; - return 'array(' . substr($res,1) . ')'; + **/ +function calculer_from(&$boucle) { + $res = ""; + foreach ($boucle->from as $k => $v) { + $res .= ",'$k' => '$v'"; + } + + return 'array(' . substr($res, 1) . ')'; } /** * Calcule l'expression PHP décrivant des informations de type de jointure * pour un alias de table connu dans le FROM - * + * * @param Boucle $boucle * Description de la boucle * @return string * Code PHP construisant un tableau des alias et type de jointure du FROM -**/ -function calculer_from_type(&$boucle) -{ - $res = ""; - foreach($boucle->from_type as $k => $v) $res .= ",'$k' => '$v'"; - return 'array(' . substr($res,1) . ')'; + **/ +function calculer_from_type(&$boucle) { + $res = ""; + foreach ($boucle->from_type as $k => $v) { + $res .= ",'$k' => '$v'"; + } + + return 'array(' . substr($res, 1) . ')'; } // http://code.spip.net/@calculer_order -function calculer_order(&$boucle) -{ +function calculer_order(&$boucle) { if (!$order = $boucle->order - AND !$order = $boucle->default_order) + AND !$order = $boucle->default_order + ) { $order = array(); + } /*if (isset($boucle->modificateur['collate'])){ $col = "." . $boucle->modificateur['collate']; @@ -796,6 +868,7 @@ function calculer_order(&$boucle) if (strpos($order[$k],'COLLATE')===false) $order[$k].= $col; }*/ + return join(', ', $order); } @@ -806,45 +879,58 @@ function calculer_order(&$boucle) // http://code.spip.net/@calculer_liste function calculer_liste($tableau, $descr, &$boucles, $id_boucle = '') { - if (!$tableau) return "''"; - if (!isset($descr['niv'])) $descr['niv'] = 0; + if (!$tableau) { + return "''"; + } + if (!isset($descr['niv'])) { + $descr['niv'] = 0; + } $codes = compile_cas($tableau, $descr, $boucles, $id_boucle); - if ($codes === false) return false; + if ($codes === false) { + return false; + } $n = count($codes); - if (!$n) return "''"; + if (!$n) { + return "''"; + } $tab = str_repeat("\t", $descr['niv']); if (_request('var_mode_affiche') != 'validation') { - if ($n==1) + if ($n == 1) { return $codes[0]; - else { + } else { $res = ''; - foreach($codes as $code) { + foreach ($codes as $code) { if (!preg_match("/^'[^']*'$/", $code) - OR substr($res,-1,1)!=="'") - $res .= " .\n$tab$code"; - else { - $res = substr($res,0,-1) . substr($code,1); + OR substr($res, -1, 1) !== "'" + ) { + $res .= " .\n$tab$code"; + } else { + $res = substr($res, 0, -1) . substr($code, 1); } } - return '(' . substr($res,2+$descr['niv']) . ')'; + + return '(' . substr($res, 2+$descr['niv']) . ')'; } } else { - $nom = $descr['nom'] . $id_boucle . ($descr['niv']?$descr['niv']:''); - return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab", $codes) . ")))"; + $nom = $descr['nom'] . $id_boucle . ($descr['niv'] ? $descr['niv'] : ''); + + return "join('', array_map('array_shift', \$GLOBALS['debug_objets']['sequence']['$nom'] = array(" . join(" ,\n$tab", + $codes) . ")))"; } } -define('_REGEXP_COND_VIDE_NONVIDE',"/^[(](.*)[?]\s*''\s*:\s*('[^']+')\s*[)]$/"); -define('_REGEXP_COND_NONVIDE_VIDE',"/^[(](.*)[?]\s*('[^']+')\s*:\s*''\s*[)]$/"); +define('_REGEXP_COND_VIDE_NONVIDE', "/^[(](.*)[?]\s*''\s*:\s*('[^']+')\s*[)]$/"); +define('_REGEXP_COND_NONVIDE_VIDE', "/^[(](.*)[?]\s*('[^']+')\s*:\s*''\s*[)]$/"); define('_REGEXP_CONCAT_NON_VIDE', "/^(.*)[.]\s*'[^']+'\s*$/"); // http://code.spip.net/@compile_cas function compile_cas($tableau, $descr, &$boucles, $id_boucle) { - $codes = array(); + $codes = array(); // cas de la boucle recursive - if (is_array($id_boucle)) - $id_boucle = $id_boucle[0]; + if (is_array($id_boucle)) { + $id_boucle = $id_boucle[0]; + } $type = !$id_boucle ? '' : $boucles[$id_boucle]->type_requete; $tab = str_repeat("\t", ++$descr['niv']); $mode = _request('var_mode_affiche'); @@ -853,158 +939,169 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) { // par un caractere distinguant le cas, pour exploitation par debug. foreach ($tableau as $p) { - switch($p->type) { - // texte seul - case 'texte': - $code = sandbox_composer_texte($p->texte, $p); - $commentaire= strlen($p->texte) . " signes"; - $avant=''; - $apres=''; - $altern = "''"; - break; - - case 'polyglotte': - $code = ""; - foreach($p->traductions as $k => $v) { - $code .= ",'" . - str_replace(array("\\","'"),array("\\\\","\\'"), $k) . - "' => '" . - str_replace(array("\\","'"),array("\\\\","\\'"), $v) . - "'"; - } - $code = "choisir_traduction(array(" . - substr($code,1) . - "))"; - $commentaire= '&'; - $avant=''; - $apres=''; - $altern = "''"; - break; - - // inclure - case 'include': - $p->descr = $descr; - $code = calculer_inclure($p, $boucles, $id_boucle); - if ($code === false) { - $err_e_c = true; - $code = "''"; - } else { - $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>'; - $avant=''; - $apres=''; + switch ($p->type) { + // texte seul + case 'texte': + $code = sandbox_composer_texte($p->texte, $p); + $commentaire = strlen($p->texte) . " signes"; + $avant = ''; + $apres = ''; $altern = "''"; - } - break; - - // boucle - case TYPE_RECURSIF: - $nom = $p->id_boucle; - $newdescr = $descr; - $newdescr['id_mere'] = $nom; - $newdescr['niv']++; - $avant = calculer_liste($p->avant, - $newdescr, $boucles, $id_boucle); - $apres = calculer_liste($p->apres, - $newdescr, $boucles, $id_boucle); - $newdescr['niv']--; - $altern = calculer_liste($p->altern, - $newdescr, $boucles, $id_boucle); - if (($avant === false) OR ($apres === false) OR ($altern === false)) { - $err_e_c = true; - $code = "''"; - } else { - $code = 'BOUCLE' . - str_replace("-","_", $nom) . $descr['nom'] . - '($Cache, $Pile, $doublons, $Numrows, $SP)'; - $commentaire= "?$nom"; - if (!$boucles[$nom]->milieu - AND $boucles[$nom]->type_requete <> TYPE_RECURSIF) { - if ($altern != "''") $code .= "\n. $altern"; - if ($avant<>"''" OR $apres<>"''") { - spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]"); + break; + + case 'polyglotte': + $code = ""; + foreach ($p->traductions as $k => $v) { + $code .= ",'" . + str_replace(array("\\", "'"), array("\\\\", "\\'"), $k) . + "' => '" . + str_replace(array("\\", "'"), array("\\\\", "\\'"), $v) . + "'"; + } + $code = "choisir_traduction(array(" . + substr($code, 1) . + "))"; + $commentaire = '&'; + $avant = ''; + $apres = ''; + $altern = "''"; + break; + + // inclure + case 'include': + $p->descr = $descr; + $code = calculer_inclure($p, $boucles, $id_boucle); + if ($code === false) { + $err_e_c = true; + $code = "''"; + } else { + $commentaire = '<INCLURE ' . addslashes(str_replace("\n", ' ', $code)) . '>'; + $avant = ''; + $apres = ''; + $altern = "''"; + } + break; + + // boucle + case TYPE_RECURSIF: + $nom = $p->id_boucle; + $newdescr = $descr; + $newdescr['id_mere'] = $nom; + $newdescr['niv']++; + $avant = calculer_liste($p->avant, + $newdescr, $boucles, $id_boucle); + $apres = calculer_liste($p->apres, + $newdescr, $boucles, $id_boucle); + $newdescr['niv']--; + $altern = calculer_liste($p->altern, + $newdescr, $boucles, $id_boucle); + if (($avant === false) OR ($apres === false) OR ($altern === false)) { + $err_e_c = true; + $code = "''"; + } else { + $code = 'BOUCLE' . + str_replace("-", "_", $nom) . $descr['nom'] . + '($Cache, $Pile, $doublons, $Numrows, $SP)'; + $commentaire = "?$nom"; + if (!$boucles[$nom]->milieu + AND $boucles[$nom]->type_requete <> TYPE_RECURSIF + ) { + if ($altern != "''") { + $code .= "\n. $altern"; + } + if ($avant <> "''" OR $apres <> "''") { + spip_log("boucle $nom toujours vide, code superflu dans $descr[sourcefile]"); + } + $avant = $apres = $altern = "''"; + } else { + if ($altern != "''") { + $altern = "($altern)"; + } } - $avant = $apres = $altern = "''"; - } else if ($altern != "''") $altern = "($altern)"; - } - break; - - case 'idiome': - $l = array(); - $code = ''; - foreach ($p->arg as $k => $v) { - $_v = calculer_liste($v, $descr, $boucles, $id_boucle); - if ($k) - $l[] = _q($k) . ' => ' . $_v; - else $code = $_v; - } - // Si le module n'est pas fourni, l'expliciter sauf si calculé - if ($p->module) { - $m = $p->module .':'.$p->nom_champ; - } elseif ($p->nom_champ) { - $m = MODULES_IDIOMES .':'.$p->nom_champ; - } else { - $m = ''; - } + } + break; + + case 'idiome': + $l = array(); + $code = ''; + foreach ($p->arg as $k => $v) { + $_v = calculer_liste($v, $descr, $boucles, $id_boucle); + if ($k) { + $l[] = _q($k) . ' => ' . $_v; + } else { + $code = $_v; + } + } + // Si le module n'est pas fourni, l'expliciter sauf si calculé + if ($p->module) { + $m = $p->module . ':' . $p->nom_champ; + } elseif ($p->nom_champ) { + $m = MODULES_IDIOMES . ':' . $p->nom_champ; + } else { + $m = ''; + } - $code = (!$code ? "'$m'" : + $code = (!$code ? "'$m'" : ($m ? "'$m' . $code" : ("(strpos(\$x=$code, ':') ? \$x : ('" . MODULES_IDIOMES . ":' . \$x))"))) . (!$l ? '' : (", array(" . implode(",\n", $l) . ")")); - $code = "_T($code)"; - if ($p->param) { + $code = "_T($code)"; + if ($p->param) { + $p->id_boucle = $id_boucle; + $p->boucles = &$boucles; + $code = compose_filtres($p, $code); + } + $commentaire = ":"; + $avant = ''; + $apres = ''; + $altern = "''"; + break; + + case 'champ': + + // cette structure pourrait etre completee des le phrase' (a faire) $p->id_boucle = $id_boucle; $p->boucles = &$boucles; - $code = compose_filtres($p, $code); - } - $commentaire = ":"; - $avant=''; - $apres=''; - $altern = "''"; - break; - - case 'champ': - - // cette structure pourrait etre completee des le phrase' (a faire) - $p->id_boucle = $id_boucle; - $p->boucles = &$boucles; - $p->descr = $descr; - #$p->interdire_scripts = true; - $p->type_requete = $type; - - $code = calculer_champ($p); - $commentaire = '#' . $p->nom_champ . $p->etoile; - $avant = calculer_liste($p->avant, - $descr, $boucles, $id_boucle); - $apres = calculer_liste($p->apres, - $descr, $boucles, $id_boucle); - $altern = "''"; - // Si la valeur est destinee a une comparaison a '' - // forcer la conversion en une chaine par strval - // si ca peut etre autre chose qu'une chaine - if (($avant != "''" OR $apres != "''") - AND $code[0]!= "'" + $p->descr = $descr; + #$p->interdire_scripts = true; + $p->type_requete = $type; + + $code = calculer_champ($p); + $commentaire = '#' . $p->nom_champ . $p->etoile; + $avant = calculer_liste($p->avant, + $descr, $boucles, $id_boucle); + $apres = calculer_liste($p->apres, + $descr, $boucles, $id_boucle); + $altern = "''"; + // Si la valeur est destinee a une comparaison a '' + // forcer la conversion en une chaine par strval + // si ca peut etre autre chose qu'une chaine + if (($avant != "''" OR $apres != "''") + AND $code[0] != "'" # AND (strpos($code,'interdire_scripts') !== 0) - AND !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code) - AND !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code) - AND !preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) - $code = "strval($code)"; - break; + AND !preg_match(_REGEXP_COND_VIDE_NONVIDE, $code) + AND !preg_match(_REGEXP_COND_NONVIDE_VIDE, $code) + AND !preg_match(_REGEXP_CONCAT_NON_VIDE, $code) + ) { + $code = "strval($code)"; + } + break; - default: - // Erreur de construction de l'arbre de syntaxe abstraite - $code = "''"; - $p->descr = $descr; - $err_e_c = _T('zbug_erreur_compilation'); - erreur_squelette($err_e_c, $p); + default: + // Erreur de construction de l'arbre de syntaxe abstraite + $code = "''"; + $p->descr = $descr; + $err_e_c = _T('zbug_erreur_compilation'); + erreur_squelette($err_e_c, $p); } // switch if ($code != "''") { $code = compile_retour($code, $avant, $apres, $altern, $tab, $descr['niv']); - $codes[]= (($mode == 'validation') ? + $codes[] = (($mode == 'validation') ? "array($code, '$commentaire', " . $p->ligne . ")" : (($mode == 'code') ? - "\n// $commentaire\n$code" : - $code)); + "\n// $commentaire\n$code" : + $code)); } } // foreach @@ -1016,42 +1113,56 @@ function compile_cas($tableau, $descr, &$boucles, $id_boucle) { // de meme si EXP est de la forme (t ? '' : 'C') // http://code.spip.net/@compile_retour -function compile_retour($code, $avant, $apres, $altern, $tab, $n) -{ - if ($avant == "''") $avant = ''; - if ($apres == "''") $apres = ''; - if (!$avant AND !$apres AND ($altern==="''")) return $code; +function compile_retour($code, $avant, $apres, $altern, $tab, $n) { + if ($avant == "''") { + $avant = ''; + } + if ($apres == "''") { + $apres = ''; + } + if (!$avant AND !$apres AND ($altern === "''")) { + return $code; + } if (preg_match(_REGEXP_CONCAT_NON_VIDE, $code)) { $t = $code; $cond = ''; - } elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE,$code, $r)) { + } elseif (preg_match(_REGEXP_COND_VIDE_NONVIDE, $code, $r)) { $t = $r[2]; - $cond = '!' . $r[1]; - } else if (preg_match(_REGEXP_COND_NONVIDE_VIDE,$code, $r)) { - $t = $r[2]; - $cond = $r[1]; + $cond = '!' . $r[1]; } else { - $t = '$t' . $n; - $cond = "($t = $code)!==''"; + if (preg_match(_REGEXP_COND_NONVIDE_VIDE, $code, $r)) { + $t = $r[2]; + $cond = $r[1]; + } else { + $t = '$t' . $n; + $cond = "($t = $code)!==''"; + } } - $res = (!$avant ? "" : "$avant . ") . + $res = (!$avant ? "" : "$avant . ") . $t . (!$apres ? "" : " . $apres"); - if ($res !== $t) $res = "($res)"; + if ($res !== $t) { + $res = "($res)"; + } + return !$cond ? $res : "($cond ?\n\t$tab$res :\n\t$tab$altern)"; } -function compile_inclure_doublons($lexemes) -{ - foreach($lexemes as $v) - if($v->type === 'include' AND $v->param) - foreach($v->param as $r) - if (trim($r[0]) === 'doublons') - return true; +function compile_inclure_doublons($lexemes) { + foreach ($lexemes as $v) { + if ($v->type === 'include' AND $v->param) { + foreach ($v->param as $r) { + if (trim($r[0]) === 'doublons') { + return true; + } + } + } + } + return false; } @@ -1071,7 +1182,7 @@ function compile_inclure_doublons($lexemes) // En cas d'erreur, elle retournera un tableau des 2 premiers elements seulement // http://code.spip.net/@public_compiler_dist -function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = ''){ +function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = '') { // Pre-traitement : reperer le charset du squelette, et le convertir // Bonus : supprime le BOM include_spip('inc/charsets'); @@ -1079,14 +1190,18 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = ' // rendre inertes les echappements de #[](){}<> $i = 0; - while(false !== strpos($squelette, $inerte = '-INERTE'.$i)) $i++; + while (false !== strpos($squelette, $inerte = '-INERTE' . $i)) { + $i++; + } $squelette = preg_replace_callback(',\\\\([#[()\]{}<>]),', create_function('$a', "return '$inerte-'.ord(\$a[1]).'-';"), $squelette, -1, $esc); - $descr = array('nom' => $nom, - 'gram' => $gram, - 'sourcefile' => $sourcefile, - 'squelette' => $squelette); + $descr = array( + 'nom' => $nom, + 'gram' => $gram, + 'sourcefile' => $sourcefile, + 'squelette' => $squelette + ); // Phraser le squelette, selon sa grammaire @@ -1098,29 +1213,33 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = ' $boucles = compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect); // restituer les echappements - if ($esc) - foreach($boucles as $i=>$boucle) { + if ($esc) { + foreach ($boucles as $i => $boucle) { $boucles[$i]->return = preg_replace_callback(",$inerte-(\d+)-,", create_function('$a', 'return chr($a[1]);'), $boucle->return); - $boucles[$i]->descr['squelette'] = preg_replace_callback(",$inerte-(\d+)-,", create_function('$a', 'return "\\\\".chr($a[1]);'), + $boucles[$i]->descr['squelette'] = preg_replace_callback(",$inerte-(\d+)-,", + create_function('$a', 'return "\\\\".chr($a[1]);'), $boucle->descr['squelette']); } - + } + $debug = ($boucles AND defined('_VAR_MODE') AND _VAR_MODE == 'debug'); if ($debug) { include_spip('public/decompiler'); - foreach($boucles as $id => $boucle) { - if ($id) - $decomp = "\n/* BOUCLE " . - $boucle->type_requete . - " " . - str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) . - " */\n"; - else $decomp = ("\n/*\n" . - str_replace('*/', '* /', public_decompiler($squelette, $gram)) - . "\n*/"); - $boucles[$id]->return = $decomp .$boucle->return; - $GLOBALS['debug_objets']['code'][$nom.$id] = $boucle->return; + foreach ($boucles as $id => $boucle) { + if ($id) { + $decomp = "\n/* BOUCLE " . + $boucle->type_requete . + " " . + str_replace('*/', '* /', public_decompiler($boucle, $gram, 0, 'criteres')) . + " */\n"; + } else { + $decomp = ("\n/*\n" . + str_replace('*/', '* /', public_decompiler($squelette, $gram)) + . "\n*/"); + } + $boucles[$id]->return = $decomp . $boucle->return; + $GLOBALS['debug_objets']['code'][$nom . $id] = $boucle->return; } } @@ -1130,7 +1249,7 @@ function public_compiler_dist($squelette, $nom, $gram, $sourcefile, $connect = ' // Point d'entree pour arbre de syntaxe abstraite fourni en premier argument // Autres specifications comme ci-dessus -function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect = ''){ +function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $connect = '') { static $trouver_table; spip_timer('calcul_skel'); @@ -1138,11 +1257,12 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co $GLOBALS['debug_objets']['squelette'][$nom] = $descr['squelette']; $GLOBALS['debug_objets']['sourcefile'][$nom] = $sourcefile; - if (!isset($GLOBALS['debug_objets']['principal'])) + if (!isset($GLOBALS['debug_objets']['principal'])) { $GLOBALS['debug_objets']['principal'] = $nom; + } } foreach ($boucles as $id => $boucle) { - $GLOBALS['debug_objets']['boucle'][$nom.$id] = $boucle; + $GLOBALS['debug_objets']['boucle'][$nom . $id] = $boucle; } $descr['documents'] = compile_inclure_doublons($squelette); @@ -1154,71 +1274,85 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co // reperer si les doublons sont demandes // pour un inclure ou une boucle document // c'est utile a la fonction champs_traitements - foreach($boucles as $id => $boucle) { - if (!($type = $boucle->type_requete)) continue; + foreach ($boucles as $id => $boucle) { + if (!($type = $boucle->type_requete)) { + continue; + } if (!$descr['documents'] AND ( - (($type == 'documents') AND $boucle->doublons) OR + (($type == 'documents') AND $boucle->doublons) OR compile_inclure_doublons($boucle->avant) OR compile_inclure_doublons($boucle->apres) OR compile_inclure_doublons($boucle->milieu) OR - compile_inclure_doublons($boucle->altern))) - $descr['documents'] = true; + compile_inclure_doublons($boucle->altern)) + ) { + $descr['documents'] = true; + } if ($type != TYPE_RECURSIF) { - if (!$boucles[$id]->sql_serveur AND $connect) + if (!$boucles[$id]->sql_serveur AND $connect) { $boucles[$id]->sql_serveur = $connect; + } // chercher dans les iterateurs du repertoire iterateur/ if ($g = charger_fonction( - preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true)) { + preg_replace('/\W/', '_', $boucle->type_requete), 'iterateur', true) + ) { $boucles[$id] = $g($boucle); - // sinon, en cas de requeteur d'un type predefini, - // utiliser les informations donnees par le requeteur - // cas "php:xx" et "data:xx". - } else if ($boucle->sql_serveur AND $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) { - $requeteur($boucles, $boucle, $id); - - // utiliser la description des champs transmis + // sinon, en cas de requeteur d'un type predefini, + // utiliser les informations donnees par le requeteur + // cas "php:xx" et "data:xx". } else { - $show = $trouver_table($type, $boucles[$id]->sql_serveur); - // si la table n'existe pas avec le connecteur par defaut, - // c'est peut etre une table qui necessite son connecteur dedie fourni - // permet une ecriture allegee (GEO) -> (geo:GEO) - if (!$show - AND $show=$trouver_table($type, strtolower($type))) { - $boucles[$id]->sql_serveur = strtolower($type); - } - if ($show) { - $boucles[$id]->show = $show; - // recopie les infos les plus importantes - $boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : ''; - $boucles[$id]->id_table = $x = preg_replace(",^spip_,","",$show['id_table']); - $boucles[$id]->from[$x] = $nom_table = $show['table']; - $boucles[$id]->iterateur = 'SQL'; - - $boucles[$id]->descr = &$descr; - if ((!$boucles[$id]->jointures) - AND is_array($show['tables_jointures']) - AND count($x = $show['tables_jointures'])) - $boucles[$id]->jointures = $x; - if ($boucles[$id]->jointures_explicites){ - $jointures = preg_split("/\s+/",$boucles[$id]->jointures_explicites); - while ($j=array_pop($jointures)) - array_unshift($boucles[$id]->jointures,$j); - } + if ($boucle->sql_serveur AND $requeteur = charger_fonction($boucle->sql_serveur, 'requeteur', true)) { + $requeteur($boucles, $boucle, $id); + + // utiliser la description des champs transmis } else { - // Pas une erreur si la table est optionnelle - if ($boucles[$id]->table_optionnelle) - $boucles[$id]->type_requete = ''; - else { - $boucles[$id]->type_requete = false; - $boucle = $boucles[$id]; - $x = (!$boucle->sql_serveur ? '' : - ($boucle->sql_serveur . ":")) . - $type; - $msg = array('zbug_table_inconnue', - array('table' => $x)); - erreur_squelette($msg, $boucle); + $show = $trouver_table($type, $boucles[$id]->sql_serveur); + // si la table n'existe pas avec le connecteur par defaut, + // c'est peut etre une table qui necessite son connecteur dedie fourni + // permet une ecriture allegee (GEO) -> (geo:GEO) + if (!$show + AND $show = $trouver_table($type, strtolower($type)) + ) { + $boucles[$id]->sql_serveur = strtolower($type); + } + if ($show) { + $boucles[$id]->show = $show; + // recopie les infos les plus importantes + $boucles[$id]->primary = isset($show['key']["PRIMARY KEY"]) ? $show['key']["PRIMARY KEY"] : ''; + $boucles[$id]->id_table = $x = preg_replace(",^spip_,", "", $show['id_table']); + $boucles[$id]->from[$x] = $nom_table = $show['table']; + $boucles[$id]->iterateur = 'SQL'; + + $boucles[$id]->descr = &$descr; + if ((!$boucles[$id]->jointures) + AND is_array($show['tables_jointures']) + AND count($x = $show['tables_jointures']) + ) { + $boucles[$id]->jointures = $x; + } + if ($boucles[$id]->jointures_explicites) { + $jointures = preg_split("/\s+/", $boucles[$id]->jointures_explicites); + while ($j = array_pop($jointures)) { + array_unshift($boucles[$id]->jointures, $j); + } + } + } else { + // Pas une erreur si la table est optionnelle + if ($boucles[$id]->table_optionnelle) { + $boucles[$id]->type_requete = ''; + } else { + $boucles[$id]->type_requete = false; + $boucle = $boucles[$id]; + $x = (!$boucle->sql_serveur ? '' : + ($boucle->sql_serveur . ":")) . + $type; + $msg = array( + 'zbug_table_inconnue', + array('table' => $x) + ); + erreur_squelette($msg, $boucle); + } } } } @@ -1227,27 +1361,29 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co // Commencer par reperer les boucles appelees explicitement // car elles indexent les arguments de maniere derogatoire - foreach($boucles as $id => $boucle) { + foreach ($boucles as $id => $boucle) { if ($boucle->type_requete == TYPE_RECURSIF AND $boucle->param) { $boucles[$id]->descr = &$descr; $rec = &$boucles[$boucle->param[0]]; if (!$rec) { - $msg = array('zbug_boucle_recursive_undef', - array('nom' => $boucle->param[0])); + $msg = array( + 'zbug_boucle_recursive_undef', + array('nom' => $boucle->param[0]) + ); erreur_squelette($msg, $boucle); $boucles[$id]->type_requete = false; } else { $rec->externe = $id; $descr['id_mere'] = $id; $boucles[$id]->return = - calculer_liste(array($rec), - $descr, - $boucles, - $boucle->param); + calculer_liste(array($rec), + $descr, + $boucles, + $boucle->param); } } } - foreach($boucles as $id => $boucle) { + foreach ($boucles as $id => $boucle) { $id = strval($id); // attention au type dans index_pile $type = $boucle->type_requete; if ($type AND $type != TYPE_RECURSIF) { @@ -1258,10 +1394,10 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co } $descr['id_mere'] = $id; $boucles[$id]->return = - calculer_liste($boucle->milieu, - $descr, - $boucles, - $id); + calculer_liste($boucle->milieu, + $descr, + $boucles, + $id); // Si les criteres se sont mal compiles // ne pas tenter d'assembler le code final // (mais compiler le corps pour detection d'erreurs) @@ -1276,14 +1412,16 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co $corps = calculer_liste($squelette, $descr, $boucles); - // Calcul du corps de toutes les fonctions PHP, // en particulier les requetes SQL et TOTAL_BOUCLE // de'terminables seulement maintenant - foreach($boucles as $id => $boucle) { + foreach ($boucles as $id => $boucle) { $boucle = $boucles[$id] = pipeline('pre_boucle', $boucle); - if ($boucle->return === false) {$corps = false; continue;} + if ($boucle->return === false) { + $corps = false; + continue; + } // appeler la fonction de definition de la boucle if ($req = $boucle->type_requete) { @@ -1293,14 +1431,14 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co if ( // fonction de boucle avec serveur & table (!$serveur OR - ((!function_exists($f = "boucle_".$serveur."_".$table)) - AND (!function_exists($f = $f."_dist")) - ) + ((!function_exists($f = "boucle_" . $serveur . "_" . $table)) + AND (!function_exists($f = $f . "_dist")) + ) ) // fonction de boucle avec table - AND (!function_exists($f = "boucle_".$table)) - AND (!function_exists($f = $f."_dist")) - ){ + AND (!function_exists($f = "boucle_" . $table)) + AND (!function_exists($f = $f . "_dist")) + ) { // fonction de boucle standard if (!function_exists($f = 'boucle_DEFAUT')) { $f = 'boucle_DEFAUT_dist'; @@ -1308,14 +1446,16 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co } $req = "\n\n\tstatic \$command = array();\n\t" . - "static \$connect;\n\t" . - "\$command['connect'] = \$connect = " . + "static \$connect;\n\t" . + "\$command['connect'] = \$connect = " . _q($boucle->sql_serveur) . ";" . $f($id, $boucles); - } else $req = ("\n\treturn '';"); + } else { + $req = ("\n\treturn '';"); + } - $boucles[$id]->return = + $boucles[$id]->return = "\n\nfunction BOUCLE" . strtr($id, "-", "_") . $nom . '(&$Cache, &$Pile, &$doublons, &$Numrows, $SP) {' . $req . @@ -1324,25 +1464,27 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co // Au final, si le corps ou un critere au moins s'est mal compile // retourner False, sinon inserer leur decompilation - if (is_bool($corps)) return false; + if (is_bool($corps)) { + return false; + } $principal = "\nfunction " . $nom . '($Cache, $Pile, $doublons = array(), $Numrows = array(), $SP = 0) { ' - // reporter de maniere securisee les doublons inclus -.' + // reporter de maniere securisee les doublons inclus + . ' if (isset($Pile[0]["doublons"]) AND is_array($Pile[0]["doublons"])) $doublons = nettoyer_env_doublons($Pile[0]["doublons"]); $connect = ' . - _q($connect) . '; + _q($connect) . '; $page = ' . - // ATTENTION, le calcul de l'expression $corps affectera $Cache - // c'est pourquoi on l'affecte a la variable auxiliaire $page. - // avant de referencer $Cache - $corps . "; + // ATTENTION, le calcul de l'expression $corps affectera $Cache + // c'est pourquoi on l'affecte a la variable auxiliaire $page. + // avant de referencer $Cache + $corps . "; - return analyse_resultat_skel(".var_export($nom,true) - .", \$Cache, \$page, ".var_export($sourcefile,true)."); + return analyse_resultat_skel(" . var_export($nom, true) + . ", \$Cache, \$page, " . var_export($sourcefile, true) . "); }"; $secondes = spip_timer('calcul_skel'); @@ -1355,21 +1497,22 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co $code->descr = $descr; $code->return = ' // -// Fonction principale du squelette ' . - $sourcefile . - ($connect ? " pour $connect" : '') . - (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") . - "\n//\n" . - $principal; +// Fonction principale du squelette ' . + $sourcefile . + ($connect ? " pour $connect" : '') . + (!CODE_COMMENTE ? '' : "\n// Temps de compilation total: $secondes") . + "\n//\n" . + $principal; $boucles[''] = $code; + return $boucles; } /** * Requeteur pour les boucles (php:nom_iterateur) - * + * * Analyse si le nom d'iterateur correspond bien a une classe PHP existante * et dans ce cas charge la boucle avec cet iterateur. * Affichera une erreur dans le cas contraire. @@ -1377,8 +1520,8 @@ function compiler_squelette($squelette, $boucles, $nom, $descr, $sourcefile, $co * @param $boucles Liste des boucles * @param $boucle La boucle parcourue * @param $id L'identifiant de la boucle parcourue - * -**/ + * + **/ function requeteur_php_dist(&$boucles, &$boucle, &$id) { if (class_exists($boucle->type_requete)) { $g = charger_fonction('php', 'iterateur'); @@ -1386,8 +1529,10 @@ function requeteur_php_dist(&$boucles, &$boucle, &$id) { } else { $x = $boucle->type_requete; $boucle->type_requete = false; - $msg = array('zbug_iterateur_inconnu', - array('iterateur' => $x)); + $msg = array( + 'zbug_iterateur_inconnu', + array('iterateur' => $x) + ); erreur_squelette($msg, $boucle); } } @@ -1396,7 +1541,7 @@ function requeteur_php_dist(&$boucles, &$boucle, &$id) { /** * Requeteur pour les boucles (data:type de donnee) * note: (DATA) tout court ne passe pas par ici. - * + * * Analyse si le type de donnee peut etre traite * et dans ce cas charge la boucle avec cet iterateur. * Affichera une erreur dans le cas contraire. @@ -1404,24 +1549,26 @@ function requeteur_php_dist(&$boucles, &$boucle, &$id) { * @param $boucles Liste des boucles * @param $boucle La boucle parcourue * @param $id L'identifiant de la boucle parcourue - * -**/ + * + **/ function requeteur_data_dist(&$boucles, &$boucle, &$id) { include_spip('iterateur/data'); - if ($h = charger_fonction($boucle->type_requete . '_to_array' , 'inc', true)) { + if ($h = charger_fonction($boucle->type_requete . '_to_array', 'inc', true)) { $g = charger_fonction('data', 'iterateur'); $boucles[$id] = $g($boucle); // from[0] stocke le type de data (rss, yql, ...) $boucles[$id]->from[] = $boucle->type_requete; - + } else { $x = $boucle->type_requete; $boucle->type_requete = false; - $msg = array('zbug_requeteur_inconnu', - array( + $msg = array( + 'zbug_requeteur_inconnu', + array( 'requeteur' => 'data', 'type' => $x - )); + ) + ); erreur_squelette($msg, $boucle); } } diff --git a/ecrire/public/composer.php b/ecrire/public/composer.php index e026ae91e8..41b019648d 100644 --- a/ecrire/public/composer.php +++ b/ecrire/public/composer.php @@ -13,11 +13,13 @@ /** * Compose un squelette : compile le squelette au besoin et vérifie * la validité du code compilé - * + * * @package SPIP\Core\Compilateur\Composer -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/texte'); include_spip('inc/documents'); @@ -43,15 +45,18 @@ function public_composer_dist($squelette, $mime_type, $gram, $source, $connect = $nom = calculer_nom_fonction_squel($squelette, $mime_type, $connect); // si deja en memoire (INCLURE a repetition) c'est bon. - if (function_exists($nom)) return $nom; + if (function_exists($nom)) { + return $nom; + } - if (defined('_VAR_MODE') AND _VAR_MODE == 'debug') + if (defined('_VAR_MODE') AND _VAR_MODE == 'debug') { $GLOBALS['debug_objets']['courant'] = $nom; + } - $phpfile = sous_repertoire(_DIR_SKELS,'',false,true) . $nom . '.php'; + $phpfile = sous_repertoire(_DIR_SKELS, '', false, true) . $nom . '.php'; // si squelette est deja compile et perenne, le charger - if (!squelette_obsolete($phpfile, $source)){ + if (!squelette_obsolete($phpfile, $source)) { include_once $phpfile; #if (!squelette_obsolete($phpfile, $source) # AND lire_fichier ($phpfile, $skel_code, @@ -61,33 +66,37 @@ function public_composer_dist($squelette, $mime_type, $gram, $source, $connect = #} } - if (file_exists($lib = $squelette . '_fonctions'.'.php')){ + if (file_exists($lib = $squelette . '_fonctions' . '.php')) { include_once $lib; } // tester si le eval ci-dessus a mis le squelette en memoire - if (function_exists($nom)) return $nom; + if (function_exists($nom)) { + return $nom; + } // charger le source, si possible, et compiler - if (lire_fichier ($source, $skel)) { + if (lire_fichier($source, $skel)) { $compiler = charger_fonction('compiler', 'public'); $skel_code = $compiler($skel, $nom, $gram, $source, $connect); } // Ne plus rien faire si le compilateur n'a pas pu operer. - if (!$skel_code) return false; + if (!$skel_code) { + return false; + } - foreach($skel_code as $id => $boucle) { + foreach ($skel_code as $id => $boucle) { $f = $boucle->return; - if (@eval("return true; $f ;") === false) { - // Code syntaxiquement faux (critere etc mal programme') + if (@eval("return true; $f ;") === false) { + // Code syntaxiquement faux (critere etc mal programme') $msg = _T('zbug_erreur_compilation'); erreur_squelette($msg, $boucle); // continuer pour trouver d'autres fautes eventuelles // mais prevenir que c'est mort $nom = ''; - } + } // Contexte de compil inutile a present // (mais la derniere valeur de $boucle est utilisee ci-dessous) $skel_code[$id] = $f; @@ -96,11 +105,11 @@ function public_composer_dist($squelette, $mime_type, $gram, $source, $connect = $code = ''; if ($nom) { // Si le code est bon, concatener et mettre en cache - if (function_exists($nom)) + if (function_exists($nom)) { $code = squelette_traduit($skel, $source, $phpfile, $skel_code); - else { - // code semantiquement faux: bug du compilateur - // $boucle est en fait ici la fct principale du squelette + } else { + // code semantiquement faux: bug du compilateur + // $boucle est en fait ici la fct principale du squelette $msg = _T('zbug_erreur_compilation'); erreur_squelette($msg, $boucle); $nom = ''; @@ -114,30 +123,35 @@ function public_composer_dist($squelette, $mime_type, $gram, $source, $connect = // si c'est ce que demande le debusqueur, lui passer la main if ($GLOBALS['debug_objets']['sourcefile'] - AND (_request('var_mode_objet') == $nom) - AND (_request('var_mode_affiche') == 'code') ) + AND (_request('var_mode_objet') == $nom) + AND (_request('var_mode_affiche') == 'code') + ) { erreur_squelette(); + } } + return $nom ? $nom : false; } -function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) -{ +function squelette_traduit($squelette, $sourcefile, $phpfile, $boucles) { // Le dernier index est '' (fonction principale) - $noms = substr(join (', ', array_keys($boucles)), 0, -2); - if (CODE_COMMENTE) - $code = " + $noms = substr(join(', ', array_keys($boucles)), 0, -2); + if (CODE_COMMENTE) { + $code = " /* * Squelette : $sourcefile - * Date : ".gmdate("D, d M Y H:i:s", @filemtime($sourcefile))." GMT - * Compile : ".gmdate("D, d M Y H:i:s", time())." GMT - * " . (!$boucles ? "Pas de boucle" : ("Boucles : " . $noms)) ." - */ " ; + * Date : " . gmdate("D, d M Y H:i:s", @filemtime($sourcefile)) . " GMT + * Compile : " . gmdate("D, d M Y H:i:s", time()) . " GMT + * " . (!$boucles ? "Pas de boucle" : ("Boucles : " . $noms)) . " + */ "; + } - $code = '<'. "?php\n" . $code . join('', $boucles) . "\n?" .'>'; - if (!defined('_VAR_NOCACHE') OR !_VAR_NOCACHE) + $code = '<' . "?php\n" . $code . join('', $boucles) . "\n?" . '>'; + if (!defined('_VAR_NOCACHE') OR !_VAR_NOCACHE) { ecrire_fichier($phpfile, $code); + } + return $code; } @@ -147,16 +161,19 @@ function squelette_obsolete($skel, $squelette) { static $date_change = null; // ne verifier la date de mes_fonctions et mes_options qu'une seule fois // par hit - if (is_null($date_change)){ - if (@file_exists($fonc = 'mes_fonctions.php')) - $date_change = @filemtime($fonc); # compatibilite - if (defined('_FILE_OPTIONS')) - $date_change = max($date_change,@filemtime(_FILE_OPTIONS)); + if (is_null($date_change)) { + if (@file_exists($fonc = 'mes_fonctions.php')) { + $date_change = @filemtime($fonc); + } # compatibilite + if (defined('_FILE_OPTIONS')) { + $date_change = max($date_change, @filemtime(_FILE_OPTIONS)); + } } + return ( - (defined('_VAR_MODE') AND in_array(_VAR_MODE, array('recalcul','preview','debug'))) + (defined('_VAR_MODE') AND in_array(_VAR_MODE, array('recalcul', 'preview', 'debug'))) OR !@file_exists($skel) - OR ((@file_exists($squelette)?@filemtime($squelette):0) + OR ((@file_exists($squelette) ? @filemtime($squelette) : 0) > ($date = @filemtime($skel))) OR ($date_change > $date) ); @@ -164,8 +181,9 @@ function squelette_obsolete($skel, $squelette) { // Activer l'invalideur de session // http://code.spip.net/@invalideur_session -function invalideur_session(&$Cache, $code = NULL) { - $Cache['session']=spip_session(); +function invalideur_session(&$Cache, $code = null) { + $Cache['session'] = spip_session(); + return $code; } @@ -178,27 +196,29 @@ function analyse_resultat_skel($nom, $cache, $corps, $source = '') { // Recupere les < ?php header('Xx: y'); ? > pour $page['headers'] // note: on essaie d'attrapper aussi certains de ces entetes codes // "a la main" dans les squelettes, mais evidemment sans exhaustivite - if (stripos($corps,'header')!==false + if (stripos($corps, 'header') !== false AND preg_match_all( - '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims', - $corps, $regs, PREG_SET_ORDER)){ + '/(<[?]php\s+)@?header\s*\(\s*.([^:\'"]*):?\s*([^)]*)[^)]\s*\)\s*[;]?\s*[?]>/ims', + $corps, $regs, PREG_SET_ORDER) + ) { foreach ($regs as $r) { $corps = str_replace($r[0], '', $corps); # $j = Content-Type, et pas content-TYPE. $j = join('-', array_map('ucwords', explode('-', strtolower($r[2])))); - if ($j=='X-Spip-Filtre' AND isset($headers[$j])) - $headers[$j].="|".$r[3]; - else + if ($j == 'X-Spip-Filtre' AND isset($headers[$j])) { + $headers[$j] .= "|" . $r[3]; + } else { $headers[$j] = $r[3]; + } } } // S'agit-il d'un resultat constant ou contenant du code php $process_ins = ( - strpos($corps,'<'.'?') === false + strpos($corps, '<' . '?') === false OR - (strpos($corps,'<'.'?xml')!==false AND - strpos(str_replace('<'.'?xml', '', $corps),'<'.'?') === false) + (strpos($corps, '<' . '?xml') !== false AND + strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) ) ? 'html' : 'php'; @@ -213,20 +233,21 @@ function analyse_resultat_skel($nom, $cache, $corps, $source = '') { ); // traiter #FILTRE{} et filtres - if (!isset($filtres[$nom])) { - $filtres[$nom] = pipeline('declarer_filtres_squelettes',array('args'=>$skel,'data'=>array())); - } + if (!isset($filtres[$nom])) { + $filtres[$nom] = pipeline('declarer_filtres_squelettes', array('args' => $skel, 'data' => array())); + } if (count($filtres[$nom]) OR (isset($headers['X-Spip-Filtre']) AND strlen($headers['X-Spip-Filtre']))) { include_spip('public/sandbox'); - $corps = sandbox_filtrer_squelette($skel,$corps,strlen($headers['X-Spip-Filtre'])?explode('|', $headers['X-Spip-Filtre']):array(),$filtres[$nom]); + $corps = sandbox_filtrer_squelette($skel, $corps, + strlen($headers['X-Spip-Filtre']) ? explode('|', $headers['X-Spip-Filtre']) : array(), $filtres[$nom]); unset($headers['X-Spip-Filtre']); - if ($process_ins=='html'){ + if ($process_ins == 'html') { $skel['process_ins'] = ( - strpos($corps,'<'.'?') === false + strpos($corps, '<' . '?') === false OR - (strpos($corps,'<'.'?xml')!==false AND - strpos(str_replace('<'.'?xml', '', $corps),'<'.'?') === false) + (strpos($corps, '<' . '?xml') !== false AND + strpos(str_replace('<' . '?xml', '', $corps), '<' . '?') === false) ) ? 'html' : 'php'; @@ -256,7 +277,7 @@ function analyse_resultat_skel($nom, $cache, $corps, $source = '') { * l'introduction est prise dans le contenu entre les balises * `<intro>` et `</intro>` si présentes, sinon en coupant le * texte à la taille indiquée. - * + * * Cette fonction est utilisée par la balise #INTRODUCTION * * @param string $descriptif @@ -271,20 +292,22 @@ function analyse_resultat_skel($nom, $cache, $corps, $source = '') { * points de suite si on coupe (par defaut _INTRODUCTION_SUITE et sinon (...) * @return string * Introduction calculée -**/ + **/ function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $suite = null) { // Si un descriptif est envoye, on l'utilise directement - if (strlen($descriptif)) - return appliquer_traitement_champ($descriptif,'introduction','',array(),$connect); + if (strlen($descriptif)) { + return appliquer_traitement_champ($descriptif, 'introduction', '', array(), $connect); + } // De preference ce qui est marque <intro>...</intro> $intro = ''; $texte = preg_replace(",(</?)intro>,i", "\\1intro>", $texte); // minuscules while ($fin = strpos($texte, "</intro>")) { $zone = substr($texte, 0, $fin); - $texte = substr($texte, $fin + strlen("</intro>")); - if ($deb = strpos($zone, "<intro>") OR substr($zone, 0, 7) == "<intro>") - $zone = substr($zone, $deb + 7); + $texte = substr($texte, $fin+strlen("</intro>")); + if ($deb = strpos($zone, "<intro>") OR substr($zone, 0, 7) == "<intro>") { + $zone = substr($zone, $deb+7); + } $intro .= $zone; } @@ -299,40 +322,45 @@ function filtre_introduction_dist($descriptif, $texte, $longueur, $connect, $sui // Cependant pour des questions de perfs on coupe quand meme, en prenant // large et en se mefiant des tableaux #1323 - if (strlen($intro)) + if (strlen($intro)) { $texte = $intro; - - else - if (strpos("\n".$texte, "\n|")===false - AND strlen($texte) > 2.5*$longueur){ - if (strpos($texte,"<multi")!==false) - $texte = extraire_multi($texte); - $texte = couper($texte, 2*$longueur); + } else { + if (strpos("\n" . $texte, "\n|") === false + AND strlen($texte) > 2.5*$longueur + ) { + if (strpos($texte, "<multi") !== false) { + $texte = extraire_multi($texte); + } + $texte = couper($texte, 2*$longueur); + } } // ne pas tenir compte des notes - if ($notes = charger_fonction('notes', 'inc', true)) - $notes('','empiler'); + if ($notes = charger_fonction('notes', 'inc', true)) { + $notes('', 'empiler'); + } // Supprimer les modèles avant le propre afin d'éviter qu'ils n'ajoutent du texte indésirable // dans l'introduction. $texte = supprime_img($texte, ''); - $texte = appliquer_traitement_champ($texte,'introduction','',array(),$connect); + $texte = appliquer_traitement_champ($texte, 'introduction', '', array(), $connect); - if ($notes) - $notes('','depiler'); + if ($notes) { + $notes('', 'depiler'); + } if (is_null($suite)) { - $suite = (defined('_INTRODUCTION_SUITE')?_INTRODUCTION_SUITE:' (...)'); + $suite = (defined('_INTRODUCTION_SUITE') ? _INTRODUCTION_SUITE : ' (...)'); } $texte = couper($texte, $longueur, $suite); // comme on a coupe il faut repasser la typo (on a perdu les insecables) - $texte = typo($texte,true,$connect,array()); + $texte = typo($texte, true, $connect, array()); // et reparagrapher si necessaire (coherence avec le cas descriptif) // une introduction a tojours un <p> - if ($GLOBALS['toujours_paragrapher']) - // Fermer les paragraphes + if ($GLOBALS['toujours_paragrapher']) // Fermer les paragraphes + { $texte = paragrapher($texte, $GLOBALS['toujours_paragrapher']); + } return $texte; } @@ -348,14 +376,14 @@ if ($lang_select = "%s") $lang_select = lang_select($lang_select); inserer_balise_dynamique(balise_%s_dyn(%s), array(%s)); if ($lang_select) lang_select(); ?' - .'>'); + . '>'); /** * Synthétise une balise dynamique : crée l'appel à l'inclusion * en transmettant les arguments calculés et le contexte de compilation. * * @uses argumenter_squelette() Pour calculer les arguments de l'inclusion - * + * * @param string $nom * Nom de la balise dynamique * @param array $args @@ -366,17 +394,18 @@ if ($lang_select) lang_select(); * Tableau d'informations sur la compilation * @return string * Code PHP pour inclure le squelette de la balise dynamique -**/ + **/ function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) { - if (strncmp($file,"/",1)!==0){ - $file = './" . _DIR_RACINE . "'.$file; + if (strncmp($file, "/", 1) !== 0) { + $file = './" . _DIR_RACINE . "' . $file; } $r = sprintf(CODE_INCLURE_BALISE, - $file, - $context_compil[4]?$context_compil[4]:'', - $nom, - join(', ', array_map('argumenter_squelette', $args)), - join(', ', array_map('_q', $context_compil))); + $file, + $context_compil[4] ? $context_compil[4] : '', + $nom, + join(', ', array_map('argumenter_squelette', $args)), + join(', ', array_map('_q', $context_compil))); + return $r; } @@ -392,16 +421,18 @@ function synthetiser_balise_dynamique($nom, $args, $file, $context_compil) { * * - Code PHP créant le tableau des arguments à transmettre, * - ou texte entre quote `'` (si `$v` était une chaîne) -**/ + **/ function argumenter_squelette($v) { - if (!is_array($v)) + if (!is_array($v)) { return "'" . texte_script($v) . "'"; - else { + } else { $out = array(); - foreach($v as $k=>$val) + foreach ($v as $k => $val) { $out [] = argumenter_squelette($k) . '=>' . argumenter_squelette($val); - return 'array(' . join(", ", $out) . ')'; + } + + return 'array(' . join(", ", $out) . ')'; } } @@ -431,7 +462,7 @@ function argumenter_squelette($v) { * Tableau d'informations sur la compilation * @return string * Code PHP d'exécutant l'inclusion du squelette (ou texte) de la balise dynamique -**/ + **/ function executer_balise_dynamique($nom, $args, $context_compil) { $nomfonction = $nom; $nomfonction_generique = ""; @@ -450,8 +481,9 @@ function executer_balise_dynamique($nom, $args, $context_compil) { } if (!$fonction_balise) { - $msg = array('zbug_balise_inexistante',array('from'=>'CVT', 'balise'=>$nom)); + $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom)); erreur_squelette($msg, $context_compil); + return ''; } @@ -467,16 +499,19 @@ function executer_balise_dynamique($nom, $args, $context_compil) { // Y a-t-il une fonction de traitement des arguments ? $f = 'balise_' . $nomfonction . '_stat'; - $r = !function_exists($f) ? $args : $f($args, $context_compil); + $r = !function_exists($f) ? $args : $f($args, $context_compil); - if (!is_array($r)) return $r; + if (!is_array($r)) { + return $r; + } // verifier que la fonction dyn est la, // sinon se replier sur la generique si elle existe if (!function_exists('balise_' . $nomfonction . '_dyn')) { if ($nomfonction_generique - AND $file = include_spip("balise/" .strtolower($nomfonction_generique)) - AND function_exists('balise_' . $nomfonction_generique . '_dyn')) { + AND $file = include_spip("balise/" . strtolower($nomfonction_generique)) + AND function_exists('balise_' . $nomfonction_generique . '_dyn') + ) { // et lui injecter en premier arg le nom de la balise array_unshift($r, $nom); $nomfonction = $nomfonction_generique; @@ -484,8 +519,9 @@ function executer_balise_dynamique($nom, $args, $context_compil) { $file = _DIR_RESTREINT_ABS . $file; } } else { - $msg = array('zbug_balise_inexistante',array('from'=>'CVT', 'balise'=>$nom)); + $msg = array('zbug_balise_inexistante', array('from' => 'CVT', 'balise' => $nom)); erreur_squelette($msg, $context_compil); + return ''; } } @@ -498,30 +534,32 @@ function executer_balise_dynamique($nom, $args, $context_compil) { * Retourne pour une clé primaire d'objet donnée les identifiants ayant un logo * * @uses type_du_logo() Pour calculer le nom du logo - * + * * @param string $type * Nom de la clé primaire de l'objet * @return string * Liste des identifiants ayant un logo (séparés par une virgule) -**/ -function lister_objets_avec_logos ($type) { + **/ +function lister_objets_avec_logos($type) { $logos = array(); $chercher_logo = charger_fonction('chercher_logo', 'inc'); $type = '/' - . type_du_logo($type) - . "on(\d+)\.(" - . join('|',$GLOBALS['formats_logos']) - . ")$/"; + . type_du_logo($type) + . "on(\d+)\.(" + . join('|', $GLOBALS['formats_logos']) + . ")$/"; if ($d = @opendir(_DIR_LOGOS)) { - while(($f = readdir($d))!==false) { - if (preg_match($type, $f, $r)) + while (($f = readdir($d)) !== false) { + if (preg_match($type, $f, $r)) { $logos[] = $r[1]; + } } } @closedir($d); - return join(',',$logos); + + return join(',', $logos); } @@ -529,20 +567,21 @@ function lister_objets_avec_logos ($type) { * Renvoie l'état courant des notes, le purge et en prépare un nouveau * * Fonction appelée par la balise `#NOTES` - * - * @see balise_NOTES_dist() + * + * @see balise_NOTES_dist() * @uses inc_notes_dist() * * @return string * Code HTML des notes -**/ + **/ function calculer_notes() { - $r=''; + $r = ''; if ($notes = charger_fonction('notes', 'inc', true)) { $r = $notes(array()); - $notes('','depiler'); - $notes('','empiler'); + $notes('', 'depiler'); + $notes('', 'empiler'); } + return $r; } @@ -551,7 +590,7 @@ function calculer_notes() { * * Applique sur un item de boucle la langue de l'élément qui est parcourru. * Sauf dans les cas ou il ne le faut pas ! - * + * * La langue n'est pas modifiée lorsque : * - la globale 'forcer_lang' est définie à true * - l'objet ne définit pas de langue @@ -564,23 +603,24 @@ function calculer_notes() { * @param null|string $titre * Titre de l'objet * @return null; -**/ + **/ function lang_select_public($lang, $lang_select, $titre = null) { // Cas 1. forcer_lang = true et pas de critere {lang_select} if (isset($GLOBALS['forcer_lang']) AND $GLOBALS['forcer_lang'] - AND $lang_select !== 'oui') + AND $lang_select !== 'oui' + ) { $lang = $GLOBALS['spip_lang']; - - // Cas 2. l'objet n'a pas de langue definie (ou definie a '') - elseif (!strlen($lang)) + } // Cas 2. l'objet n'a pas de langue definie (ou definie a '') + elseif (!strlen($lang)) { $lang = $GLOBALS['spip_lang']; - - // Cas 3. l'objet est multilingue ! + } // Cas 3. l'objet est multilingue ! elseif ($lang_select !== 'oui' - AND strlen($titre) > 10 - AND strpos($titre, '<multi>') !== false - AND strpos(echappe_html($titre), '<multi>') !== false) + AND strlen($titre) > 10 + AND strpos($titre, '<multi>') !== false + AND strpos(echappe_html($titre), '<multi>') !== false + ) { $lang = $GLOBALS['spip_lang']; + } // faire un lang_select() eventuellement sur la langue inchangee lang_select($lang); @@ -595,15 +635,18 @@ function lang_select_public($lang, $lang_select, $titre = null) { function nettoyer_env_doublons($envd) { foreach ($envd as $table => $liste) { $n = ''; - foreach(explode(',',$liste) as $val) { - if ($a = intval($val) AND $val === strval($a)) - $n.= ','.$val; + foreach (explode(',', $liste) as $val) { + if ($a = intval($val) AND $val === strval($a)) { + $n .= ',' . $val; + } } - if (strlen($n)) + if (strlen($n)) { $envd[$table] = $n; - else + } else { unset($envd[$table]); + } } + return $envd; } @@ -621,19 +664,27 @@ function nettoyer_env_doublons($envd) { * Description d'une condition WHERE de boucle (ou une partie de cette description) * @return string|bool * Opérateur trouvé (SELF ou SUBSELECT) sinon false. -**/ -function match_self($w){ - if (is_string($w)) return false; + **/ +function match_self($w) { + if (is_string($w)) { + return false; + } if (is_array($w)) { - if (in_array(reset($w),array("SELF","SUBSELECT"))) return $w; - foreach(array_filter($w,'is_array') as $sw) - if ($m=match_self($sw)) return $m; + if (in_array(reset($w), array("SELF", "SUBSELECT"))) { + return $w; + } + foreach (array_filter($w, 'is_array') as $sw) { + if ($m = match_self($sw)) { + return $m; + } + } } + return false; } /** - * Remplace une condition décrivant une sous requête par son code + * Remplace une condition décrivant une sous requête par son code * * @param array|string $w * Description d'une condition WHERE de boucle (ou une partie de cette description) @@ -643,13 +694,17 @@ function match_self($w){ * @return array|string * Tableau de description du WHERE dont la description de sous-requête * est remplacée par son code. -**/ -function remplace_sous_requete($w, $sousrequete){ + **/ +function remplace_sous_requete($w, $sousrequete) { if (is_array($w)) { - if (in_array(reset($w),array("SELF","SUBSELECT"))) return $sousrequete; - foreach($w as $k=>$sw) - $w[$k] = remplace_sous_requete($sw,$sousrequete); + if (in_array(reset($w), array("SELF", "SUBSELECT"))) { + return $sousrequete; + } + foreach ($w as $k => $sw) { + $w[$k] = remplace_sous_requete($sw, $sousrequete); + } } + return $w; } @@ -662,21 +717,25 @@ function remplace_sous_requete($w, $sousrequete){ * Liste de 2 tableaux : * - Conditions simples (ne possédant pas de sous requêtes) * - Conditions avec des sous requêtes -**/ -function trouver_sous_requetes($where){ + **/ +function trouver_sous_requetes($where) { $where_simples = array(); $where_sous = array(); - foreach($where as $k=>$w){ - if (match_self($w)) $where_sous[$k] = $w; - else $where_simples[$k] = $w; + foreach ($where as $k => $w) { + if (match_self($w)) { + $where_sous[$k] = $w; + } else { + $where_simples[$k] = $w; + } } - return array($where_simples,$where_sous); + + return array($where_simples, $where_sous); } /** * Calcule une requête et l’exécute - * + * * Cette fonction est présente dans les squelettes compilés. * Elle peut permettre de générer des requêtes avec jointure. * @@ -695,42 +754,61 @@ function trouver_sous_requetes($where){ * @param bool $requeter * @return resource */ -function calculer_select ($select = array(), $from = array(), - $from_type = array(), - $where = array(), $join=array(), - $groupby = array(), $orderby = array(), $limit = '', - $having=array(), $table = '', $id = '', $serveur='', $requeter=true) { +function calculer_select( + $select = array(), + $from = array(), + $from_type = array(), + $where = array(), + $join = array(), + $groupby = array(), + $orderby = array(), + $limit = '', + $having = array(), + $table = '', + $id = '', + $serveur = '', + $requeter = true +) { // retirer les criteres vides: // {X ?} avec X absent de l'URL // {par #ENV{X}} avec X absent de l'URL // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil) $menage = false; - foreach($where as $k => $v) { - if (is_array($v)){ - if ((count($v)>=2) && ($v[0]=='REGEXP') && ($v[2]=="'.*'")) $op= false; - elseif ((count($v)>=2) && ($v[0]=='LIKE') && ($v[2]=="'%'")) $op= false; - else $op = $v[0] ? $v[0] : $v; - } else $op = $v; - if ((!$op) OR ($op==1) OR ($op=='0=0')) { + foreach ($where as $k => $v) { + if (is_array($v)) { + if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) { + $op = false; + } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) { + $op = false; + } else { + $op = $v[0] ? $v[0] : $v; + } + } else { + $op = $v; + } + if ((!$op) OR ($op == 1) OR ($op == '0=0')) { unset($where[$k]); $menage = true; } } // evacuer les eventuels groupby vide issus d'un calcul dynamique - $groupby = array_diff($groupby,array('')); + $groupby = array_diff($groupby, array('')); // remplacer les sous requetes recursives au calcul - list($where_simples,$where_sous) = trouver_sous_requetes($where); - foreach($where_sous as $k=>$w) { + list($where_simples, $where_sous) = trouver_sous_requetes($where); + foreach ($where_sous as $k => $w) { $menage = true; // on recupere la sous requete $sous = match_self($w); - if ($sous[0]=='SELF') { + if ($sous[0] == 'SELF') { // c'est une sous requete identique a elle meme sous la forme (SELF,$select,$where) - array_push($where_simples,$sous[2]); - $wheresub = array($sous[2],'0=0'); // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where + array_push($where_simples, $sous[2]); + $wheresub = array( + $sous[2], + '0=0' + ); // pour accepter une string et forcer a faire le menage car on a surement simplifie select et where $jsub = $join; // trouver les jointures utiles a // reinjecter dans le where de la sous requete les conditions supplementaires des jointures qui y sont mentionnees @@ -738,50 +816,51 @@ function calculer_select ($select = array(), $from = array(), // on construit le where une fois, puis on ajoute les where complentaires si besoin, et on reconstruit le where en fonction $i = 0; do { - $where[$k] = remplace_sous_requete($w,"(".calculer_select( - array($sous[1]." AS id"), - $from, - $from_type, - $wheresub, - $jsub, - array(),array(),'', - $having,$table,$id,$serveur,false).")"); - if (!$i){ + $where[$k] = remplace_sous_requete($w, "(" . calculer_select( + array($sous[1] . " AS id"), + $from, + $from_type, + $wheresub, + $jsub, + array(), array(), '', + $having, $table, $id, $serveur, false) . ")"); + if (!$i) { $i = 1; $wherestring = calculer_where_to_string($where[$k]); - foreach ($join as $cle=>$wj){ - if (count($wj)==4 - AND strpos($wherestring,"{$cle}.")!==FALSE - ){ + foreach ($join as $cle => $wj) { + if (count($wj) == 4 + AND strpos($wherestring, "{$cle}.") !== false + ) { $i = 0; $wheresub[] = $wj[3]; unset($jsub[$cle][3]); } } } - } while ($i++<1); + } while ($i++ < 1); } - if ($sous[0]=='SUBSELECT') { + if ($sous[0] == 'SUBSELECT') { // c'est une sous requete explicite sous la forme identique a sql_select : (SUBSELECT,$select,$from,$where,$groupby,$orderby,$limit,$having) - array_push($where_simples,$sous[3]); // est-ce utile dans ce cas ? - $where[$k] = remplace_sous_requete($w,"(".calculer_select( - $sous[1], # select - $sous[2], #from - array(), #from_type - $sous[3]?(is_array($sous[3])?$sous[3]:array($sous[3])):array(), #where, qui peut etre de la forme string comme dans sql_select - array(), #join - $sous[4]?$sous[4]:array(), #groupby - $sous[5]?$sous[5]:array(), #orderby - $sous[6], #limit - $sous[7]?$sous[7]:array(), #having - $table,$id,$serveur,false - ).")"); + array_push($where_simples, $sous[3]); // est-ce utile dans ce cas ? + $where[$k] = remplace_sous_requete($w, "(" . calculer_select( + $sous[1], # select + $sous[2], #from + array(), #from_type + $sous[3] ? (is_array($sous[3]) ? $sous[3] : array($sous[3])) : array(), + #where, qui peut etre de la forme string comme dans sql_select + array(), #join + $sous[4] ? $sous[4] : array(), #groupby + $sous[5] ? $sous[5] : array(), #orderby + $sous[6], #limit + $sous[7] ? $sous[7] : array(), #having + $table, $id, $serveur, false + ) . ")"); } array_pop($where_simples); } - foreach($having as $k => $v) { - if ((!$v) OR ($v==1) OR ($v=='0=0')) { + foreach ($having as $k => $v) { + if ((!$v) OR ($v == 1) OR ($v == '0=0')) { unset($having[$k]); } } @@ -790,37 +869,43 @@ function calculer_select ($select = array(), $from = array(), // Retirer celles seulement utiles aux criteres finalement absents mais // parcourir de la plus recente a la moins recente pour pouvoir eliminer Ln // si elle est seulement utile a Ln+1 elle meme inutile - + $afrom = array(); $equiv = array(); $k = count($join); - foreach(array_reverse($join,true) as $cledef=>$j) { + foreach (array_reverse($join, true) as $cledef => $j) { $cle = $cledef; // le format de join est : // array(table depart, cle depart [,cle arrivee[,condition optionnelle and ...]]) $join[$cle] = array_values($join[$cle]); // recalculer les cles car des unset ont pu perturber - if (count($join[$cle])==2) $join[$cle][] = $join[$cle][1]; - if (count($join[$cle])==3) $join[$cle][] = ''; - list($t,$c,$carr,$and) = $join[$cle]; + if (count($join[$cle]) == 2) { + $join[$cle][] = $join[$cle][1]; + } + if (count($join[$cle]) == 3) { + $join[$cle][] = ''; + } + list($t, $c, $carr, $and) = $join[$cle]; // si le nom de la jointure n'a pas ete specifiee, on prend Lx avec x sont rang dans la liste // pour compat avec ancienne convention - if (is_numeric($cle)) + if (is_numeric($cle)) { $cle = "L$k"; + } if (!$menage - OR isset($afrom[$cle]) - OR calculer_jointnul($cle, $select) - OR calculer_jointnul($cle, array_diff_key($join, array($cle=>$join[$cle]))) - OR calculer_jointnul($cle, $having) - OR calculer_jointnul($cle, $where_simples)) { + OR isset($afrom[$cle]) + OR calculer_jointnul($cle, $select) + OR calculer_jointnul($cle, array_diff_key($join, array($cle => $join[$cle]))) + OR calculer_jointnul($cle, $having) + OR calculer_jointnul($cle, $where_simples) + ) { // corriger les references non explicites dans select // ou groupby - foreach($select as $i=>$s) { + foreach ($select as $i => $s) { if ($s == $c) { $select[$i] = "$cle.$c AS $c"; break; } } - foreach($groupby as $i=>$g) { + foreach ($groupby as $i => $g) { if ($g == $c) { $groupby[$i] = "$cle.$c"; break; @@ -829,22 +914,26 @@ function calculer_select ($select = array(), $from = array(), // on garde une ecriture decomposee pour permettre une simplification ulterieure si besoin // sans recours a preg_match // un implode(' ',..) est fait dans reinjecte_joint un peu plus bas - $afrom[$t][$cle] = array("\n" . - (isset($from_type[$cle])?$from_type[$cle]:"INNER")." JOIN", + $afrom[$t][$cle] = array( + "\n" . + (isset($from_type[$cle]) ? $from_type[$cle] : "INNER") . " JOIN", $from[$cle], "AS $cle", "ON (", "$cle.$c", "=", "$t.$carr", - ($and ? "AND ". $and:"") . - ")"); - if (isset($afrom[$cle])){ - $afrom[$t] = $afrom[$t] + $afrom[$cle]; + ($and ? "AND " . $and : "") . + ")" + ); + if (isset($afrom[$cle])) { + $afrom[$t] = $afrom[$t]+$afrom[$cle]; unset($afrom[$cle]); } - $equiv[]= $carr; - } else { unset($join[$cledef]);} + $equiv[] = $carr; + } else { + unset($join[$cledef]); + } unset($from[$cle]); $k--; } @@ -864,77 +953,82 @@ function calculer_select ($select = array(), $from = array(), // <BOUCLE9(ARTICLES){recherche truc}{par titre}>#ID_ARTICLE</BOUCLE9> // penser a regarder aussi la clause groubpy pour ne pas simplifier abusivement // <BOUCLE10(EVENEMENTS){id_rubrique} />#TOTAL_BOUCLE<//B10> - - list($t,$c) = each($from); - reset($from); - $e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/'; - if (!(strpos($t, ' ') OR // jointure des le depart cf boucle_doc - calculer_jointnul($t, $select, $e) OR - calculer_jointnul($t, $join, $e) OR - calculer_jointnul($t, $where, $e) OR - calculer_jointnul($t, $orderby, $e) OR - calculer_jointnul($t, $groupby, $e) OR - calculer_jointnul($t, $having, $e)) - && count($afrom[$t])) { - reset($afrom[$t]); - list($nt,$nfrom) = each($afrom[$t]); - unset($from[$t]); - $from[$nt] = $nfrom[1]; - unset($afrom[$t][$nt]); - $afrom[$nt] = $afrom[$t]; - unset($afrom[$t]); - $e = '/\b'.preg_quote($nfrom[6]).'\b/'; - $t = $nfrom[4]; - $alias = ""; - // verifier que les deux cles sont homonymes, sinon installer un alias dans le select - $oldcle = explode('.',$nfrom[6]); - $oldcle = end($oldcle); - $newcle = explode('.',$nfrom[4]); - $newcle = end($newcle); - if ($newcle!=$oldcle){ - // si l'ancienne cle etait deja dans le select avec un AS - // reprendre simplement ce AS - $as = '/\b'.preg_quote($nfrom[6]).'\s+(AS\s+\w+)\b/'; - if (preg_match($as,implode(',',$select),$m)){ - $alias = ""; - } - else - $alias = ", ".$nfrom[4]." AS $oldcle"; - } - $select = remplacer_jointnul($t . $alias, $select, $e); - $join = remplacer_jointnul($t, $join, $e); - $where = remplacer_jointnul($t, $where, $e); - $having = remplacer_jointnul($t, $having, $e); - $groupby = remplacer_jointnul($t, $groupby, $e); - $orderby = remplacer_jointnul($t, $orderby, $e); - } - $from = reinjecte_joint($afrom, $from); - } - $GLOBALS['debug']['aucasou'] = array ($table, $id, $serveur, $requeter); + + list($t, $c) = each($from); + reset($from); + $e = '/\b(' . "$t\\." . join("|" . $t . '\.', $equiv) . ')\b/'; + if (!(strpos($t, ' ') OR // jointure des le depart cf boucle_doc + calculer_jointnul($t, $select, $e) OR + calculer_jointnul($t, $join, $e) OR + calculer_jointnul($t, $where, $e) OR + calculer_jointnul($t, $orderby, $e) OR + calculer_jointnul($t, $groupby, $e) OR + calculer_jointnul($t, $having, $e)) + && count($afrom[$t]) + ) { + reset($afrom[$t]); + list($nt, $nfrom) = each($afrom[$t]); + unset($from[$t]); + $from[$nt] = $nfrom[1]; + unset($afrom[$t][$nt]); + $afrom[$nt] = $afrom[$t]; + unset($afrom[$t]); + $e = '/\b' . preg_quote($nfrom[6]) . '\b/'; + $t = $nfrom[4]; + $alias = ""; + // verifier que les deux cles sont homonymes, sinon installer un alias dans le select + $oldcle = explode('.', $nfrom[6]); + $oldcle = end($oldcle); + $newcle = explode('.', $nfrom[4]); + $newcle = end($newcle); + if ($newcle != $oldcle) { + // si l'ancienne cle etait deja dans le select avec un AS + // reprendre simplement ce AS + $as = '/\b' . preg_quote($nfrom[6]) . '\s+(AS\s+\w+)\b/'; + if (preg_match($as, implode(',', $select), $m)) { + $alias = ""; + } else { + $alias = ", " . $nfrom[4] . " AS $oldcle"; + } + } + $select = remplacer_jointnul($t . $alias, $select, $e); + $join = remplacer_jointnul($t, $join, $e); + $where = remplacer_jointnul($t, $where, $e); + $having = remplacer_jointnul($t, $having, $e); + $groupby = remplacer_jointnul($t, $groupby, $e); + $orderby = remplacer_jointnul($t, $orderby, $e); + } + $from = reinjecte_joint($afrom, $from); + } + $GLOBALS['debug']['aucasou'] = array($table, $id, $serveur, $requeter); $r = sql_select($select, $from, $where, $groupby, array_filter($orderby), $limit, $having, $serveur, $requeter); unset($GLOBALS['debug']['aucasou']); + return $r; } /** * Analogue a calculer_mysql_expression et autre (a unifier ?) + * * @param string|array $v * @param string $join * @return string */ -function calculer_where_to_string($v, $join = 'AND'){ - if (empty($v)) +function calculer_where_to_string($v, $join = 'AND') { + if (empty($v)) { return ''; + } if (!is_array($v)) { return $v; } else { $exp = ""; - if (strtoupper($join) === 'AND') + if (strtoupper($join) === 'AND') { return $exp . join(" $join ", array_map('calculer_where_to_string', $v)); - else + } else { return $exp . join($join, $v); + } } } @@ -942,57 +1036,65 @@ function calculer_where_to_string($v, $join = 'AND'){ //condition suffisante (mais non necessaire) pour qu'une table soit utile // http://code.spip.net/@calculer_jointnul -function calculer_jointnul($cle, $exp, $equiv = '') -{ +function calculer_jointnul($cle, $exp, $equiv = '') { if (!is_array($exp)) { - if ($equiv) $exp = preg_replace($equiv, '', $exp); + if ($equiv) { + $exp = preg_replace($equiv, '', $exp); + } + return preg_match("/\\b$cle\\./", $exp); } else { - foreach($exp as $v) { - if (calculer_jointnul($cle, $v, $equiv)) return true; + foreach ($exp as $v) { + if (calculer_jointnul($cle, $v, $equiv)) { + return true; + } } + return false; } } // http://code.spip.net/@reinjecte_joint -function reinjecte_joint($afrom, $from) -{ - $from_synth = array(); - foreach($from as $k=>$v){ - $from_synth[$k]=$from[$k]; - if (isset($afrom[$k])) { - foreach($afrom[$k] as $kk=>$vv) $afrom[$k][$kk] = implode(' ',$afrom[$k][$kk]); - $from_synth["$k@"]= implode(' ',$afrom[$k]); - unset($afrom[$k]); - } - } - return $from_synth; +function reinjecte_joint($afrom, $from) { + $from_synth = array(); + foreach ($from as $k => $v) { + $from_synth[$k] = $from[$k]; + if (isset($afrom[$k])) { + foreach ($afrom[$k] as $kk => $vv) { + $afrom[$k][$kk] = implode(' ', $afrom[$k][$kk]); + } + $from_synth["$k@"] = implode(' ', $afrom[$k]); + unset($afrom[$k]); + } + } + + return $from_synth; } // http://code.spip.net/@remplacer_jointnul -function remplacer_jointnul($cle, $exp, $equiv = '') -{ +function remplacer_jointnul($cle, $exp, $equiv = '') { if (!is_array($exp)) { return preg_replace($equiv, $cle, $exp); } else { - foreach($exp as $k => $v) { - $exp[$k] = remplacer_jointnul($cle, $v, $equiv); + foreach ($exp as $k => $v) { + $exp[$k] = remplacer_jointnul($cle, $v, $equiv); } + return $exp; } } // calcul du nom du squelette // http://code.spip.net/@calculer_nom_fonction_squel -function calculer_nom_fonction_squel($skel, $mime_type = 'html', $connect = '') -{ +function calculer_nom_fonction_squel($skel, $mime_type = 'html', $connect = '') { // ne pas doublonner les squelette selon qu'ils sont calcules depuis ecrire/ ou depuis la racine - if ($l=strlen(_DIR_RACINE) AND strncmp($skel,_DIR_RACINE,$l)==0) - $skel = substr($skel,strlen(_DIR_RACINE)); + if ($l = strlen(_DIR_RACINE) AND strncmp($skel, _DIR_RACINE, $l) == 0) { + $skel = substr($skel, strlen(_DIR_RACINE)); + } + return $mime_type - . (!$connect ? '' : preg_replace('/\W/',"_", $connect)) . '_' - . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel'])?'*'.$GLOBALS['marqueur_skel']:'')); + . (!$connect ? '' : preg_replace('/\W/', "_", $connect)) . '_' + . md5($GLOBALS['spip_version_code'] . ' * ' . $skel . (isset($GLOBALS['marqueur_skel']) ? '*' . $GLOBALS['marqueur_skel'] : '')); } ?> diff --git a/ecrire/public/criteres.php b/ecrire/public/criteres.php index 920c4e1bce..867c701d98 100644 --- a/ecrire/public/criteres.php +++ b/ecrire/public/criteres.php @@ -14,19 +14,20 @@ * Définition des {criteres} d'une boucle * * @package SPIP\Core\Compilateur\Criteres -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Une Regexp repérant une chaine produite par le compilateur, * souvent utilisée pour faire de la concaténation lors de la compilation * plutôt qu'à l'exécution, i.e. pour remplacer 'x'.'y' par 'xy' -**/ + **/ define('_CODE_QUOTE', ",^(\n//[^\n]*\n)? *'(.*)' *$,"); - /** * Compile le critère {racine} * @@ -35,12 +36,12 @@ define('_CODE_QUOTE', ",^(\n//[^\n]*\n)? *'(.*)' *$,"); * * @link http://www.spip.net/@racine * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_racine_dist($idb, &$boucles, $crit){ + **/ +function critere_racine_dist($idb, &$boucles, $crit) { $not = $crit->not; $boucle = &$boucles[$idb]; @@ -48,7 +49,7 @@ function critere_racine_dist($idb, &$boucles, $crit){ $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent'; - $c = array("'='", "'$boucle->id_table."."$id_parent'", 0); + $c = array("'='", "'$boucle->id_table." . "$id_parent'", 0); $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c); } @@ -60,20 +61,21 @@ function critere_racine_dist($idb, &$boucles, $crit){ * * @link http://www.spip.net/@exclus * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_exclus_dist($idb, &$boucles, $crit){ + **/ +function critere_exclus_dist($idb, &$boucles, $crit) { $not = $crit->not; $boucle = &$boucles[$idb]; $id = $boucle->primary; - if ($not OR !$id) - return (array('zbug_critere_inconnu', array('critere' => $not.$crit->op))); + if ($not OR !$id) { + return (array('zbug_critere_inconnu', array('critere' => $not . $crit->op))); + } $arg = kwote(calculer_argument_precedent($idb, $id, $boucles)); - $boucle->where[] = array("'!='", "'$boucle->id_table."."$id'", $arg); + $boucle->where[] = array("'!='", "'$boucle->id_table." . "$id'", $arg); } @@ -87,24 +89,24 @@ function critere_exclus_dist($idb, &$boucles, $crit){ * * @link http://www.spip.net/@doublons * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_doublons_dist($idb, &$boucles, $crit){ + **/ +function critere_doublons_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $primary = $boucle->primary; // la table nécessite une clé primaire, non composée - if (!$primary OR strpos($primary, ',')){ + if (!$primary OR strpos($primary, ',')) { return (array('zbug_doublon_sur_table_sans_cle_primaire')); } $not = ($crit->not ? '' : 'NOT'); // le doublon s'applique sur un type de boucle (article) - $nom = "'" . $boucle->type_requete. "'"; + $nom = "'" . $boucle->type_requete . "'"; // compléter le nom avec un nom précisé {doublons nom} // on obtient $nom = "'article' . 'nom'" @@ -121,10 +123,10 @@ function critere_doublons_dist($idb, &$boucles, $crit){ // $doublons et son index, ici $nom // debut du code "sql_in('articles.id_article', " - $debut_in = "sql_in('".$boucle->id_table.'.'.$primary."', "; + $debut_in = "sql_in('" . $boucle->id_table . '.' . $primary . "', "; // lecture des données du doublon "$doublons[$doublon_index[] = " // Attention : boucle->doublons désigne une variable qu'on affecte - $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons."[]= ")); + $debut_doub = '$doublons[' . (!$not ? '' : ($boucle->doublons . "[]= ")); // le debut complet du code des doublons $debut_doub = $debut_in . $debut_doub; @@ -135,20 +137,21 @@ function critere_doublons_dist($idb, &$boucles, $crit){ // si on trouve un autre critère doublon, // on fusionne pour avoir un seul IN, et on s'en va ! foreach ($boucle->where as $k => $w) { - if (strpos($w[0], $debut_doub)===0) { + if (strpos($w[0], $debut_doub) === 0) { // fusionner le sql_in (du where) - $boucle->where[$k][0] = $debut_doub . $fin_doub.' . '.substr($w[0], strlen($debut_in)); + $boucle->where[$k][0] = $debut_doub . $fin_doub . ' . ' . substr($w[0], strlen($debut_in)); // fusionner l'initialisation (du hash) pour faire plus joli $x = strpos($boucle->hash, $init_comment); $len = strlen($init_comment); $boucle->hash = - substr($boucle->hash, 0, $x + $len) . $init_code . substr($boucle->hash, $x + $len); + substr($boucle->hash, 0, $x+$len) . $init_code . substr($boucle->hash, $x+$len); + return; } } // mettre l'ensemble dans un tableau pour que ce ne soit pas vu comme une constante - $boucle->where[] = array($debut_doub . $fin_doub.", '".$not."')"); + $boucle->where[] = array($debut_doub . $fin_doub . ", '" . $not . "')"); // déclarer le doublon s'il n'existe pas encore $boucle->hash .= $init_comment . $init_code; @@ -173,14 +176,18 @@ function critere_doublons_dist($idb, &$boucles, $crit){ * Sans définir de valeur au critère, celui-ci utilise 'oui' comme * valeur par défaut. * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_lang_select_dist($idb, &$boucles, $crit){ - if (!isset($crit->param[1][0]) OR !($param = $crit->param[1][0]->texte)) $param = 'oui'; - if ($crit->not) $param = ($param=='oui') ? 'non' : 'oui'; + **/ +function critere_lang_select_dist($idb, &$boucles, $crit) { + if (!isset($crit->param[1][0]) OR !($param = $crit->param[1][0]->texte)) { + $param = 'oui'; + } + if ($crit->not) { + $param = ($param == 'oui') ? 'non' : 'oui'; + } $boucle = &$boucles[$idb]; $boucle->lang_select = $param; } @@ -198,22 +205,24 @@ function critere_lang_select_dist($idb, &$boucles, $crit){ * * Note : il est plus simple d'utiliser le critère pagination. * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_debut_dist($idb, &$boucles, $crit){ + **/ +function critere_debut_dist($idb, &$boucles, $crit) { list($un, $deux) = $crit->param; $un = $un[0]->texte; $deux = $deux[0]->texte; - if ($deux){ - $boucles[$idb]->limit = 'intval($Pile[0]["debut'. - $un. - '"]) . ",'. - $deux. - '"'; - } else calculer_critere_DEFAUT_dist($idb, $boucles, $crit); + if ($deux) { + $boucles[$idb]->limit = 'intval($Pile[0]["debut' . + $un . + '"]) . ",' . + $deux . + '"'; + } else { + calculer_critere_DEFAUT_dist($idb, $boucles, $crit); + } } @@ -240,19 +249,19 @@ function critere_debut_dist($idb, &$boucles, $crit){ * {pagination 20 #ENV{truc,chose}} pour utiliser la variable debut_#ENV{truc,chose} * ``` * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_pagination_dist($idb, &$boucles, $crit){ + **/ +function critere_pagination_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; // definition de la taille de la page $pas = !isset($crit->param[0][0]) ? "''" : calculer_liste(array($crit->param[0][0]), array(), $boucles, $boucle->id_parent); - if (!preg_match(_CODE_QUOTE, $pas, $r)){ + if (!preg_match(_CODE_QUOTE, $pas, $r)) { $pas = "((\$a = intval($pas)) ? \$a : 10)"; } else { $r = intval($r[2]); @@ -267,37 +276,37 @@ function critere_pagination_dist($idb, &$boucles, $crit){ // Syntaxe {pagination 20, nom} if (isset($crit->param[0][1])) { $type = calculer_liste(array($crit->param[0][1]), array(), $boucles, $boucle->id_parent); - } - // Ancienne syntaxe {pagination 20 nom} pour compatibilité + } // Ancienne syntaxe {pagination 20 nom} pour compatibilité elseif (isset($crit->param[1][0])) { $type = calculer_liste(array($crit->param[1][0]), array(), $boucles, $boucle->id_parent); } - $debut = ($type[0]!=="'") ? "'debut'.$type" : ("'debut".substr($type, 1)); + $debut = ($type[0] !== "'") ? "'debut'.$type" : ("'debut" . substr($type, 1)); $boucle->modificateur['debut_nom'] = $type; $partie = // tester si le numero de page demande est de la forme '@yyy' - 'isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : _request('.$debut.");\n" - ."\tif(substr(\$debut_boucle,0,1)=='@'){\n" - ."\t\t".'$debut_boucle = $Pile[0]['.$debut.'] = quete_debut_pagination(\''.$boucle->primary.'\',$Pile[0][\'@'.$boucle->primary.'\'] = substr($debut_boucle,1),'.$pas.',$iter);'."\n" - ."\t\t".'$iter->seek(0);'."\n" - ."\t}\n" - ."\t".'$debut_boucle = intval($debut_boucle)'; + 'isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : _request(' . $debut . ");\n" + . "\tif(substr(\$debut_boucle,0,1)=='@'){\n" + . "\t\t" . '$debut_boucle = $Pile[0][' . $debut . '] = quete_debut_pagination(\'' . $boucle->primary . '\',$Pile[0][\'@' . $boucle->primary . '\'] = substr($debut_boucle,1),' . $pas . ',$iter);' . "\n" + . "\t\t" . '$iter->seek(0);' . "\n" + . "\t}\n" + . "\t" . '$debut_boucle = intval($debut_boucle)'; $boucle->hash .= ' - $command[\'pagination\'] = array((isset($Pile[0]['.$debut.']) ? $Pile[0]['.$debut.'] : null), ' . $pas . ');'; + $command[\'pagination\'] = array((isset($Pile[0][' . $debut . ']) ? $Pile[0][' . $debut . '] : null), ' . $pas . ');'; $boucle->total_parties = $pas; calculer_parties($boucles, $idb, $partie, 'p+'); // ajouter la cle primaire dans le select pour pouvoir gerer la pagination referencee par @id // sauf si pas de primaire, ou si primaire composee // dans ce cas, on ne sait pas gerer une pagination indirecte - $t = $boucle->id_table.'.'.$boucle->primary; + $t = $boucle->id_table . '.' . $boucle->primary; if ($boucle->primary - AND !preg_match('/[,\s]/', $boucle->primary) - AND !in_array($t, $boucle->select) - ) + AND !preg_match('/[,\s]/', $boucle->primary) + AND !in_array($t, $boucle->select) + ) { $boucle->select[] = $t; + } } @@ -312,46 +321,49 @@ function critere_pagination_dist($idb, &$boucles, $crit){ * @link http://www.spip.net/3878 * @see inc_prepare_recherche_dist() * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_recherche_dist($idb, &$boucles, $crit){ + **/ +function critere_recherche_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; - if (!$boucle->primary OR strpos($boucle->primary, ',')){ - erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire',array('critere'=>'recherche')), $boucle); + if (!$boucle->primary OR strpos($boucle->primary, ',')) { + erreur_squelette(_T('zbug_critere_sur_table_sans_cle_primaire', array('critere' => 'recherche')), $boucle); + return; } - if (isset($crit->param[0])) + if (isset($crit->param[0])) { $quoi = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); - else + } else { $quoi = '(isset($Pile[0]["recherche"])?$Pile[0]["recherche"]:(isset($GLOBALS["recherche"])?$GLOBALS["recherche"]:""))'; + } $_modificateur = var_export($boucle->modificateur, true); $boucle->hash .= ' // RECHERCHE' - .($crit->cond ? ' - if (!strlen('.$quoi.')){ + . ($crit->cond ? ' + if (!strlen(' . $quoi . ')){ list($rech_select, $rech_where) = array("0 as points",""); - } else' : '').' + } else' : '') . ' { $prepare_recherche = charger_fonction(\'prepare_recherche\', \'inc\'); - list($rech_select, $rech_where) = $prepare_recherche('.$quoi.', "'.$boucle->id_table.'", "'.$crit->cond.'","'.$boucle->sql_serveur.'",'.$_modificateur.',"'.$boucle->primary.'"); + list($rech_select, $rech_where) = $prepare_recherche(' . $quoi . ', "' . $boucle->id_table . '", "' . $crit->cond . '","' . $boucle->sql_serveur . '",' . $_modificateur . ',"' . $boucle->primary . '"); } '; - $t = $boucle->id_table.'.'.$boucle->primary; - if (!in_array($t, $boucles[$idb]->select)) - $boucle->select[] = $t; # pour postgres, neuneu ici + $t = $boucle->id_table . '.' . $boucle->primary; + if (!in_array($t, $boucles[$idb]->select)) { + $boucle->select[] = $t; + } # pour postgres, neuneu ici // jointure uniquement sur le serveur principal // (on ne peut joindre une table d'un serveur distant avec la table des resultats du serveur principal) - if (!$boucle->sql_serveur){ - $boucle->join['resultats'] = array("'".$boucle->id_table."'", "'id'", "'".$boucle->primary."'"); + if (!$boucle->sql_serveur) { + $boucle->join['resultats'] = array("'" . $boucle->id_table . "'", "'id'", "'" . $boucle->primary . "'"); $boucle->from['resultats'] = 'spip_resultats'; } $boucle->select[] = '$rech_select'; @@ -370,32 +382,34 @@ function critere_recherche_dist($idb, &$boucles, $crit){ * Équivalent à * (id_trad>0 AND id_trad=id_trad(precedent)) OR id_xx=id_xx(precedent) * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_traduction_dist($idb, &$boucles, $crit){ + **/ +function critere_traduction_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $prim = $boucle->primary; $table = $boucle->id_table; $arg = kwote(calculer_argument_precedent($idb, 'id_trad', $boucles)); $dprim = kwote(calculer_argument_precedent($idb, $prim, $boucles)); $boucle->where[] = - array("'OR'", - array("'AND'", - array("'='", "'$table.id_trad'", 0), - array("'='", "'$table.$prim'", $dprim) - ), - array("'AND'", - array("'>'", "'$table.id_trad'", 0), - array("'='", "'$table.id_trad'", $arg) - ) + array( + "'OR'", + array( + "'AND'", + array("'='", "'$table.id_trad'", 0), + array("'='", "'$table.$prim'", $dprim) + ), + array( + "'AND'", + array("'>'", "'$table.id_trad'", 0), + array("'='", "'$table.id_trad'", $arg) + ) ); } - /** * Compile le critère {origine_traduction} * @@ -404,20 +418,21 @@ function critere_traduction_dist($idb, &$boucles, $crit){ * * Équivalent à (id_trad>0 AND id_xx=id_trad) OR (id_trad=0) * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_origine_traduction_dist($idb, &$boucles, $crit){ + **/ +function critere_origine_traduction_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $prim = $boucle->primary; $table = $boucle->id_table; $c = - array("'OR'", - array("'='", "'$table."."id_trad'", "'$table.$prim'"), - array("'='", "'$table.id_trad'", "'0'") + array( + "'OR'", + array("'='", "'$table." . "id_trad'", "'$table.$prim'"), + array("'='", "'$table.id_trad'", "'0'") ); $boucle->where[] = ($crit->not ? array("'NOT'", $c) : $c); } @@ -429,27 +444,26 @@ function critere_origine_traduction_dist($idb, &$boucles, $crit){ * Sélectionne les éléments ayant le même parent que la boucle parente, * c'est à dire les frères et sÅ“urs. * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_meme_parent_dist($idb, &$boucles, $crit){ + **/ +function critere_meme_parent_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $arg = kwote(calculer_argument_precedent($idb, 'id_parent', $boucles)); $id_parent = isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent']) ? $GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'] : 'id_parent'; - $mparent = $boucle->id_table.'.'.$id_parent; + $mparent = $boucle->id_table . '.' . $id_parent; - if ($boucle->type_requete=='rubriques' OR isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])){ + if ($boucle->type_requete == 'rubriques' OR isset($GLOBALS['exceptions_des_tables'][$boucle->id_table]['id_parent'])) { $boucle->where[] = array("'='", "'$mparent'", $arg); - } - // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist() + } // le cas FORUMS est gere dans le plugin forum, dans la fonction critere_FORUMS_meme_parent_dist() else { - return (array('zbug_critere_inconnu', array('critere' => $crit->op.' '.$boucle->type_requete))); + return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ' . $boucle->type_requete))); } } @@ -469,19 +483,19 @@ function critere_meme_parent_dist($idb, &$boucles, $crit){ * * @link http://www.spip.net/@branche * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_branche_dist($idb, &$boucles, $crit){ + **/ +function critere_branche_dist($idb, &$boucles, $crit) { $not = $crit->not; $boucle = &$boucles[$idb]; // prendre en priorite un identifiant en parametre {branche XX} if (isset($crit->param[0])) { $arg = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); - // sinon on le prend chez une boucle parente + // sinon on le prend chez une boucle parente } else { $arg = kwote(calculer_argument_precedent($idb, 'id_rubrique', $boucles)); } @@ -490,22 +504,23 @@ function critere_branche_dist($idb, &$boucles, $crit){ $champ = "id_rubrique"; $desc = $boucle->show; //Seulement si necessaire - if (!array_key_exists($champ, $desc['field'])){ + if (!array_key_exists($champ, $desc['field'])) { $cle = trouver_jointure_champ($champ, $boucle); $trouver_table = charger_fonction("trouver_table", "base"); $desc = $trouver_table($boucle->from[$cle]); - if (count(trouver_champs_decomposes($champ, $desc))>1){ + if (count(trouver_champs_decomposes($champ, $desc)) > 1) { $decompose = decompose_champ_id_objet($champ); $champ = array_shift($decompose); - $boucle->where[] = array("'='", _q($cle.".".reset($decompose)), '"'.sql_quote(end($decompose)).'"'); + $boucle->where[] = array("'='", _q($cle . "." . reset($decompose)), '"' . sql_quote(end($decompose)) . '"'); } + } else { + $cle = $boucle->id_table; } - else $cle = $boucle->id_table; - $c = "sql_in('$cle".".$champ', calcul_branche_in($arg)" - .($not ? ", 'NOT'" : '').")"; + $c = "sql_in('$cle" . ".$champ', calcul_branche_in($arg)" + . ($not ? ", 'NOT'" : '') . ")"; $boucle->where[] = !$crit->cond ? $c : - ("($arg ? $c : ".($not ? "'0=1'" : "'1=1'").')'); + ("($arg ? $c : " . ($not ? "'0=1'" : "'1=1'") . ')'); } /** @@ -514,26 +529,29 @@ function critere_branche_dist($idb, &$boucles, $crit){ * @uses lister_objets_avec_logos() * Pour obtenir les éléments qui ont un logo * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_logo_dist($idb, &$boucles, $crit){ + **/ +function critere_logo_dist($idb, &$boucles, $crit) { $not = $crit->not; $boucle = &$boucles[$idb]; - $c = "sql_in('". - $boucle->id_table.'.'.$boucle->primary - ."', lister_objets_avec_logos('".$boucle->primary."'), '')"; + $c = "sql_in('" . + $boucle->id_table . '.' . $boucle->primary + . "', lister_objets_avec_logos('" . $boucle->primary . "'), '')"; - if ($crit->cond) $c = "($arg ? $c : 1)"; + if ($crit->cond) { + $c = "($arg ? $c : 1)"; + } - if ($not) + if ($not) { $boucle->where[] = array("'NOT'", $c); - else + } else { $boucle->where[] = $c; + } } @@ -549,237 +567,270 @@ function critere_logo_dist($idb, &$boucles, $crit){ * <BOUCLE_a(articles){fusion lang}> * ``` * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_fusion_dist($idb, &$boucles, $crit){ - if ($t = isset($crit->param[0])){ + **/ +function critere_fusion_dist($idb, &$boucles, $crit) { + if ($t = isset($crit->param[0])) { $t = $crit->param[0]; - if ($t[0]->type=='texte'){ + if ($t[0]->type == 'texte') { $t = $t[0]->texte; - if (preg_match("/^(.*)\.(.*)$/", $t, $r)){ + if (preg_match("/^(.*)\.(.*)$/", $t, $r)) { $t = table_objet_sql($r[1]); $t = array_search($t, $boucles[$idb]->from); - if ($t) $t .= '.'.$r[2]; + if ($t) { + $t .= '.' . $r[2]; + } } } else { $t = '".' - .calculer_critere_arg_dynamique($idb, $boucles, $t) - .'."'; + . calculer_critere_arg_dynamique($idb, $boucles, $t) + . '."'; } } - if ($t){ + if ($t) { $boucles[$idb]->group[] = $t; - if (!in_array($t, $boucles[$idb]->select)) + if (!in_array($t, $boucles[$idb]->select)) { $boucles[$idb]->select[] = $t; - } else - return (array('zbug_critere_inconnu', array('critere' => $crit->op.' ?'))); + } + } else { + return (array('zbug_critere_inconnu', array('critere' => $crit->op . ' ?'))); + } } // c'est la commande SQL "COLLATE" // qui peut etre appliquee sur les order by, group by, where like ... // http://code.spip.net/@critere_collecte_dist -function critere_collecte_dist($idb, &$boucles, $crit){ - if (isset($crit->param[0])){ +function critere_collecte_dist($idb, &$boucles, $crit) { + if (isset($crit->param[0])) { $_coll = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); $boucle = $boucles[$idb]; $boucle->modificateur['collate'] = "($_coll ?' COLLATE '.$_coll:'')"; $n = count($boucle->order); - if ($n && (strpos($boucle->order[$n-1], 'COLLATE')===false)) - $boucle->order[$n-1] .= " . ".$boucle->modificateur['collate']; - } else - return (array('zbug_critere_inconnu', array('critere' => $crit->op." ".count($boucles[$idb]->order)))); + if ($n && (strpos($boucle->order[$n-1], 'COLLATE') === false)) { + $boucle->order[$n-1] .= " . " . $boucle->modificateur['collate']; + } + } else { + return (array('zbug_critere_inconnu', array('critere' => $crit->op . " " . count($boucles[$idb]->order)))); + } } // http://code.spip.net/@calculer_critere_arg_dynamique -function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = ''){ +function calculer_critere_arg_dynamique($idb, &$boucles, $crit, $suffix = '') { $boucle = $boucles[$idb]; - $alt = "('".$boucle->id_table.'.\' . $x'.$suffix.')'; - $var = '$champs_'.$idb; - $desc = (strpos($boucle->in, "static $var =")!==false); - if (!$desc){ + $alt = "('" . $boucle->id_table . '.\' . $x' . $suffix . ')'; + $var = '$champs_' . $idb; + $desc = (strpos($boucle->in, "static $var =") !== false); + if (!$desc) { $desc = $boucle->show['field']; $desc = implode(',', array_map('_q', array_keys($desc))); - $boucles[$idb]->in .= "\n\tstatic $var = array(".$desc.");"; + $boucles[$idb]->in .= "\n\tstatic $var = array(" . $desc . ");"; + } + if ($desc) { + $alt = "(in_array(\$x, $var) ? $alt :(\$x$suffix))"; } - if ($desc) $alt = "(in_array(\$x, $var) ? $alt :(\$x$suffix))"; $arg = calculer_liste($crit, array(), $boucles, $boucle->id_parent); + return "((\$x = preg_replace(\"/\\W/\",'', $arg)) ? $alt : '')"; } // Tri : {par xxxx} // http://www.spip.net/@par // http://code.spip.net/@critere_par_dist -function critere_par_dist($idb, &$boucles, $crit){ +function critere_par_dist($idb, &$boucles, $crit) { return critere_parinverse($idb, $boucles, $crit); } // http://code.spip.net/@critere_parinverse -function critere_parinverse($idb, &$boucles, $crit, $sens = ''){ +function critere_parinverse($idb, &$boucles, $crit, $sens = '') { $boucle = &$boucles[$idb]; - if ($crit->not) $sens = $sens ? "" : " . ' DESC'"; - $collecte = (isset($boucle->modificateur['collecte'])) ? " . ".$boucle->modificateur['collecte'] : ""; + if ($crit->not) { + $sens = $sens ? "" : " . ' DESC'"; + } + $collecte = (isset($boucle->modificateur['collecte'])) ? " . " . $boucle->modificateur['collecte'] : ""; - foreach ($crit->param as $tri){ + foreach ($crit->param as $tri) { $order = $fct = ""; // en cas de fonction SQL // tris specifies dynamiquement - if ($tri[0]->type!='texte'){ + if ($tri[0]->type != 'texte') { // calculer le order dynamique qui verifie les champs $order = calculer_critere_arg_dynamique($idb, $boucles, $tri, $sens); // et si ce n'est fait, ajouter un champ 'hasard' // pour supporter 'hasard' comme tri dynamique $par = "rand()"; - $parha = $par." AS hasard"; - if (!in_array($parha, $boucle->select)) + $parha = $par . " AS hasard"; + if (!in_array($parha, $boucle->select)) { $boucle->select[] = $parha; + } } else { $par = array_shift($tri); $par = $par->texte; // par multi champ - if (preg_match(",^multi[\s]*(.*)$,", $par, $m)){ + if (preg_match(",^multi[\s]*(.*)$,", $par, $m)) { $champ = trim($m[1]); // par multi L1.champ if (strpos($champ, '.')) { $cle = ''; - // par multi champ (champ sur une autre table) - } elseif (!array_key_exists($champ, $boucle->show['field'])){ + // par multi champ (champ sur une autre table) + } elseif (!array_key_exists($champ, $boucle->show['field'])) { $cle = trouver_jointure_champ($champ, $boucle); - // par multi champ (champ dans la table en cours) + // par multi champ (champ dans la table en cours) } else { $cle = $boucle->id_table; } - if ($cle) { $cle .= '.'; } - $texte = $cle.$champ; - $boucle->select[] = "\".sql_multi('".$texte."', \$GLOBALS['spip_lang']).\""; + if ($cle) { + $cle .= '.'; + } + $texte = $cle . $champ; + $boucle->select[] = "\".sql_multi('" . $texte . "', \$GLOBALS['spip_lang']).\""; $order = "'multi'"; // par num champ(, suite) - } else if (preg_match(",^num (.*)$,m", $par, $m)) { - $champ = trim($m[1]); - // par num L1.champ - if (strpos($champ, '.')) { - $cle = ''; - // par num champ (champ sur une autre table) - } elseif (!array_key_exists($champ, $boucle->show['field'])){ - $cle = trouver_jointure_champ($champ, $boucle); - // par num champ (champ dans la table en cours) - } else { - $cle = $boucle->id_table; - } - if ($cle) { $cle .= '.'; } - $texte = '0+'. $cle . $champ; - $suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent); - if ($suite!=="''") - $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')"." . \""; - $as = 'num'.($boucle->order ? count($boucle->order) : ""); - $boucle->select[] = $texte." AS $as"; - $order = "'$as'"; } else { - if (!preg_match(",^".CHAMP_SQL_PLUS_FONC.'$,is', $par, $match)){ - return (array('zbug_critere_inconnu', array('critere' => $crit->op." $par"))); - } else { - if (count($match)>2){ - $par = substr($match[2], 1, -1); - $fct = $match[1]; - } - // par hasard - if ($par=='hasard'){ - $par = "rand()"; - $boucle->select[] = $par." AS alea"; - $order = "'alea'"; + if (preg_match(",^num (.*)$,m", $par, $m)) { + $champ = trim($m[1]); + // par num L1.champ + if (strpos($champ, '.')) { + $cle = ''; + // par num champ (champ sur une autre table) + } elseif (!array_key_exists($champ, $boucle->show['field'])) { + $cle = trouver_jointure_champ($champ, $boucle); + // par num champ (champ dans la table en cours) + } else { + $cle = $boucle->id_table; } - // par titre_mot ou type_mot voire d'autres - else if (isset($GLOBALS['exceptions_des_jointures'][$par])){ - list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par]; - $order = critere_par_joint($table, $champ, $boucle, $idb); - if (!$order) - return (array('zbug_critere_inconnu', array('critere' => $crit->op." $par"))); + if ($cle) { + $cle .= '.'; } - else if ($par=='date' - AND $desc = $boucle->show - AND $desc['date'] - ){ - $m = $desc['date']; - $order = "'".$boucle->id_table.".".$m."'"; + $texte = '0+' . $cle . $champ; + $suite = calculer_liste($tri, array(), $boucles, $boucle->id_parent); + if ($suite !== "''") { + $texte = "\" . ((\$x = $suite) ? ('$texte' . \$x) : '0')" . " . \""; } - // par champ. Verifier qu'ils sont presents. - elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) { - // cas du tri sur champ de jointure explicite - $t = array_search($r[1], $boucle->from); - if (!$t){ - $t = trouver_jointure_champ($r[2], $boucle, array($r[1])); - } - if (!$t){ - return (array('zbug_critere_inconnu', array('critere' => $crit->op." $par"))); - } else $order = "'".$t.'.'.$r[2]."'"; + $as = 'num' . ($boucle->order ? count($boucle->order) : ""); + $boucle->select[] = $texte . " AS $as"; + $order = "'$as'"; + } else { + if (!preg_match(",^" . CHAMP_SQL_PLUS_FONC . '$,is', $par, $match)) { + return (array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"))); } else { - $desc = $boucle->show; - if (isset($desc['field'][$par])) - $par = $boucle->id_table.".".$par; - // sinon tant pis, ca doit etre un champ synthetise (cf points) - $order = "'$par'"; + if (count($match) > 2) { + $par = substr($match[2], 1, -1); + $fct = $match[1]; + } + // par hasard + if ($par == 'hasard') { + $par = "rand()"; + $boucle->select[] = $par . " AS alea"; + $order = "'alea'"; + } // par titre_mot ou type_mot voire d'autres + else { + if (isset($GLOBALS['exceptions_des_jointures'][$par])) { + list($table, $champ) = $GLOBALS['exceptions_des_jointures'][$par]; + $order = critere_par_joint($table, $champ, $boucle, $idb); + if (!$order) { + return (array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"))); + } + } else { + if ($par == 'date' + AND $desc = $boucle->show + AND $desc['date'] + ) { + $m = $desc['date']; + $order = "'" . $boucle->id_table . "." . $m . "'"; + } // par champ. Verifier qu'ils sont presents. + elseif (preg_match("/^([^,]*)\.(.*)$/", $par, $r)) { + // cas du tri sur champ de jointure explicite + $t = array_search($r[1], $boucle->from); + if (!$t) { + $t = trouver_jointure_champ($r[2], $boucle, array($r[1])); + } + if (!$t) { + return (array('zbug_critere_inconnu', array('critere' => $crit->op . " $par"))); + } else { + $order = "'" . $t . '.' . $r[2] . "'"; + } + } else { + $desc = $boucle->show; + if (isset($desc['field'][$par])) { + $par = $boucle->id_table . "." . $par; + } + // sinon tant pis, ca doit etre un champ synthetise (cf points) + $order = "'$par'"; + } + } + } } } } } - if (preg_match('/^\'([^"]*)\'$/', $order, $m)){ + if (preg_match('/^\'([^"]*)\'$/', $order, $m)) { $t = $m[1]; - if (strpos($t, '.') AND !in_array($t, $boucle->select)){ + if (strpos($t, '.') AND !in_array($t, $boucle->select)) { $boucle->select[] = $t; } - } else $sens = ''; + } else { + $sens = ''; + } - if ($fct){ - if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) - $order = "'$fct(".$r[1].")'"; - else $order = "'$fct(' . $order . ')'"; + if ($fct) { + if (preg_match("/^\s*'(.*)'\s*$/", $order, $r)) { + $order = "'$fct(" . $r[1] . ")'"; + } else { + $order = "'$fct(' . $order . ')'"; + } + } + $t = $order . $collecte . $sens; + if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) { + $t = $r[1] . $r[2]; } - $t = $order.$collecte.$sens; - if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) - $t = $r[1].$r[2]; $boucle->order[] = $t; } } // http://code.spip.net/@critere_par_joint -function critere_par_joint($table, $champ, &$boucle, $idb){ +function critere_par_joint($table, $champ, &$boucle, $idb) { $t = array_search($table, $boucle->from); - if (!$t) $t = trouver_jointure_champ($champ, $boucle); - return !$t ? '' : ("'".$t.'.'.$champ."'"); + if (!$t) { + $t = trouver_jointure_champ($champ, $boucle); + } + + return !$t ? '' : ("'" . $t . '.' . $champ . "'"); } // {inverse} // http://www.spip.net/@inverse // http://code.spip.net/@critere_inverse_dist -function critere_inverse_dist($idb, &$boucles, $crit){ +function critere_inverse_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; // Classement par ordre inverse - if ($crit->not) + if ($crit->not) { critere_parinverse($idb, $boucles, $crit); - else - { + } else { $order = "' DESC'"; // Classement par ordre inverse fonction eventuelle de #ENV{...} - if (isset($crit->param[0])){ + if (isset($crit->param[0])) { $critere = calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent); $order = "(($critere)?' DESC':'')"; } $n = count($boucle->order); - if (!$n){ - if (isset($boucle->default_order[0])) + if (!$n) { + if (isset($boucle->default_order[0])) { $boucle->default_order[0] .= ' . " DESC"'; - else + } else { $boucle->default_order[] = ' DESC'; + } } else { - $t = $boucle->order[$n-1]." . $order"; - if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) - $t = $r[1].$r[2]; + $t = $boucle->order[$n-1] . " . $order"; + if (preg_match("/^(.*)'\s*\.\s*'([^']*')$/", $t, $r)) { + $t = $r[1] . $r[2]; + } $boucle->order[$n-1] = $t; } } @@ -789,8 +840,9 @@ function critere_inverse_dist($idb, &$boucles, $crit){ function critere_agenda_dist($idb, &$boucles, $crit) { $params = $crit->param; - if (count($params) < 1) + if (count($params) < 1) { return array('zbug_critere_inconnu', array('critere' => $crit->op . " ?")); + } $boucle = &$boucles[$idb]; $parent = $boucle->id_parent; @@ -801,19 +853,18 @@ function critere_agenda_dist($idb, &$boucles, $crit) { // la valeur $type doit etre connue a la compilation // donc etre forcement reduite a un litteral unique dans le source - $type = is_object($type[0]) ? $type[0]->texte : NULL; + $type = is_object($type[0]) ? $type[0]->texte : null; // La valeur date doit designer un champ de la table SQL. // Si c'est un litteral unique dans le source, verifier a la compil, // sinon synthetiser le test de verif pour execution ulterieure // On prendra arbitrairement le premier champ si test negatif. - if ((count($date) == 1) AND ($date[0]->type == 'texte')) { + if ((count($date) == 1) AND ($date[0]->type == 'texte')) { $date = $date[0]->texte; if (!isset($fields[$date])) { - return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date)); - } - } - else { + return array('zbug_critere_inconnu', array('critere' => $crit->op . " " . $date)); + } + } else { $a = calculer_liste($date, array(), $boucles, $parent); $noms = array_keys($fields); $defaut = $noms[0]; @@ -823,58 +874,75 @@ function critere_agenda_dist($idb, &$boucles, $crit) { $date = "'.(($cond)\n?\$a:\"$defaut\").'"; } $annee = $params ? array_shift($params) : ""; - $annee = "\n".'sprintf("%04d", ($x = '. - calculer_liste($annee, array(), $boucles, $parent). - ') ? $x : date("Y"))'; + $annee = "\n" . 'sprintf("%04d", ($x = ' . + calculer_liste($annee, array(), $boucles, $parent) . + ') ? $x : date("Y"))'; $mois = $params ? array_shift($params) : ""; - $mois = "\n".'sprintf("%02d", ($x = '. - calculer_liste($mois, array(), $boucles, $parent). - ') ? $x : date("m"))'; + $mois = "\n" . 'sprintf("%02d", ($x = ' . + calculer_liste($mois, array(), $boucles, $parent) . + ') ? $x : date("m"))'; $jour = $params ? array_shift($params) : ""; - $jour = "\n".'sprintf("%02d", ($x = '. - calculer_liste($jour, array(), $boucles, $parent). - ') ? $x : date("d"))'; + $jour = "\n" . 'sprintf("%02d", ($x = ' . + calculer_liste($jour, array(), $boucles, $parent) . + ') ? $x : date("d"))'; $annee2 = $params ? array_shift($params) : ""; - $annee2 = "\n".'sprintf("%04d", ($x = '. - calculer_liste($annee2, array(), $boucles, $parent). - ') ? $x : date("Y"))'; + $annee2 = "\n" . 'sprintf("%04d", ($x = ' . + calculer_liste($annee2, array(), $boucles, $parent) . + ') ? $x : date("Y"))'; $mois2 = $params ? array_shift($params) : ""; - $mois2 = "\n".'sprintf("%02d", ($x = '. - calculer_liste($mois2, array(), $boucles, $parent). - ') ? $x : date("m"))'; + $mois2 = "\n" . 'sprintf("%02d", ($x = ' . + calculer_liste($mois2, array(), $boucles, $parent) . + ') ? $x : date("m"))'; $jour2 = $params ? array_shift($params) : ""; - $jour2 = "\n".'sprintf("%02d", ($x = '. - calculer_liste($jour2, array(), $boucles, $parent). - ') ? $x : date("d"))'; - - $date = $boucle->id_table.".$date"; - - $quote_end = ",'".$boucle->sql_serveur."','text'"; - if ($type == 'jour') - $boucle->where[] = array("'='", "'DATE_FORMAT($date, \'%Y%m%d\')'", - ("sql_quote($annee . $mois . $jour$quote_end)")); - elseif ($type == 'mois') - $boucle->where[] = array("'='", "'DATE_FORMAT($date, \'%Y%m\')'", - ("sql_quote($annee . $mois$quote_end)")); - elseif ($type == 'semaine') - $boucle->where[] = array("'AND'", - array("'>='", - "'DATE_FORMAT($date, \'%Y%m%d\')'", - ("date_debut_semaine($annee, $mois, $jour)")), - array("'<='", - "'DATE_FORMAT($date, \'%Y%m%d\')'", - ("date_fin_semaine($annee, $mois, $jour)"))); - elseif (count($crit->param) > 2) - $boucle->where[] = array("'AND'", - array("'>='", - "'DATE_FORMAT($date, \'%Y%m%d\')'", - ("sql_quote($annee . $mois . $jour$quote_end)")), - array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)"))); + $jour2 = "\n" . 'sprintf("%02d", ($x = ' . + calculer_liste($jour2, array(), $boucles, $parent) . + ') ? $x : date("d"))'; + + $date = $boucle->id_table . ".$date"; + + $quote_end = ",'" . $boucle->sql_serveur . "','text'"; + if ($type == 'jour') { + $boucle->where[] = array( + "'='", + "'DATE_FORMAT($date, \'%Y%m%d\')'", + ("sql_quote($annee . $mois . $jour$quote_end)") + ); + } elseif ($type == 'mois') { + $boucle->where[] = array( + "'='", + "'DATE_FORMAT($date, \'%Y%m\')'", + ("sql_quote($annee . $mois$quote_end)") + ); + } elseif ($type == 'semaine') { + $boucle->where[] = array( + "'AND'", + array( + "'>='", + "'DATE_FORMAT($date, \'%Y%m%d\')'", + ("date_debut_semaine($annee, $mois, $jour)") + ), + array( + "'<='", + "'DATE_FORMAT($date, \'%Y%m%d\')'", + ("date_fin_semaine($annee, $mois, $jour)") + ) + ); + } elseif (count($crit->param) > 2) { + $boucle->where[] = array( + "'AND'", + array( + "'>='", + "'DATE_FORMAT($date, \'%Y%m%d\')'", + ("sql_quote($annee . $mois . $jour$quote_end)") + ), + array("'<='", "'DATE_FORMAT($date, \'%Y%m%d\')'", ("sql_quote($annee2 . $mois2 . $jour2$quote_end)")) + ); + } // sinon on prend tout } @@ -894,12 +962,12 @@ function critere_agenda_dist($idb, &$boucles, $crit) { * Traduit si possible (absence de n dans {i,j}) la demande en une * expression LIMIT du gestionnaire SQL * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function calculer_critere_parties($idb, &$boucles, $crit){ + **/ +function calculer_critere_parties($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $a1 = $crit->param[0]; $a2 = $crit->param[1]; @@ -908,25 +976,24 @@ function calculer_critere_parties($idb, &$boucles, $crit){ list($a11, $a12) = calculer_critere_parties_aux($idb, $boucles, $a1); list($a21, $a22) = calculer_critere_parties_aux($idb, $boucles, $a2); - if (($op==',') && (is_numeric($a11) && (is_numeric($a21)))){ - $boucle->limit = $a11.','.$a21; - } - else { + if (($op == ',') && (is_numeric($a11) && (is_numeric($a21)))) { + $boucle->limit = $a11 . ',' . $a21; + } else { // 3 dans {1/3}, {2,3} ou {1,n-3} - $boucle->total_parties = ($a21!='n') ? $a21 : $a22; + $boucle->total_parties = ($a21 != 'n') ? $a21 : $a22; // 2 dans {2/3}, {2,5}, {n-2,1} - $partie = ($a11!='n') ? $a11 : $a12; - $mode = (($op=='/') ? '/' : - (($a11=='n') ? '-' : '+').(($a21=='n') ? '-' : '+')); + $partie = ($a11 != 'n') ? $a11 : $a12; + $mode = (($op == '/') ? '/' : + (($a11 == 'n') ? '-' : '+') . (($a21 == 'n') ? '-' : '+')); // cas simple {0,#ENV{truc}} compilons le en LIMIT : - if ($a11!=='n' AND $a21!=='n' AND $mode=="++" AND $op==','){ + if ($a11 !== 'n' AND $a21 !== 'n' AND $mode == "++" AND $op == ',') { $boucle->limit = - (is_numeric($a11)?"'$a11'":$a11) - .".','." - .(is_numeric($a21)?"'$a21'":$a21); - } - else + (is_numeric($a11) ? "'$a11'" : $a11) + . ".','." + . (is_numeric($a21) ? "'$a21'" : $a21); + } else { calculer_parties($boucles, $idb, $partie, $mode); + } } } @@ -943,9 +1010,9 @@ function calculer_critere_parties($idb, &$boucles, $crit){ * boucle en cours de lecture appartient bien à la plage autorisée. * Trop tôt, passe à l'élément suivant, trop tard, sort de l'itération de boucle. * - * @param array $boucles AST du squelette - * @param string $id_boucle Identifiant de la boucle - * @param string $debut Valeur ou code pour trouver le début (i dans {i,j}) + * @param array $boucles AST du squelette + * @param string $id_boucle Identifiant de la boucle + * @param string $debut Valeur ou code pour trouver le début (i dans {i,j}) * @param string $mode * Mode (++, p+, +- ...) : 2 signes début & fin * - le signe - indique @@ -953,15 +1020,15 @@ function calculer_critere_parties($idb, &$boucles, $crit){ * -- qu'il faut raccourcir la fin {x,n-3} de 3 elements. 3 étant $total_parties * - le signe p indique une pagination * @return void -**/ -function calculer_parties(&$boucles, $id_boucle, $debut, $mode){ + **/ +function calculer_parties(&$boucles, $id_boucle, $debut, $mode) { $total_parties = $boucles[$id_boucle]->total_parties; preg_match(",([+-/p])([+-/])?,", $mode, $regs); list(, $op1, $op2) = array_pad($regs, 3, null); $nombre_boucle = "\$Numrows['$id_boucle']['total']"; // {1/3} - if ($op1=='/'){ + if ($op1 == '/') { $pmoins1 = is_numeric($debut) ? ($debut-1) : "($debut-1)"; $totpos = is_numeric($total_parties) ? ($total_parties) : "($total_parties ? $total_parties : 1)"; @@ -969,23 +1036,25 @@ function calculer_parties(&$boucles, $id_boucle, $debut, $mode){ $debut = !$pmoins1 ? 0 : "ceil(($nombre_boucle * $pmoins1)/$totpos);"; } else { // cas {n-1,x} - if ($op1=='-') $debut = "$nombre_boucle - $debut;"; + if ($op1 == '-') { + $debut = "$nombre_boucle - $debut;"; + } // cas {x,n-1} - if ($op2=='-'){ - $fin = '$debut_boucle + '.$nombre_boucle.' - ' - .(is_numeric($total_parties) ? ($total_parties+1) : - ($total_parties.' - 1')); + if ($op2 == '-') { + $fin = '$debut_boucle + ' . $nombre_boucle . ' - ' + . (is_numeric($total_parties) ? ($total_parties+1) : + ($total_parties . ' - 1')); } else { // {x,1} ou {pagination} $fin = '$debut_boucle' - .(is_numeric($total_parties) ? - (($total_parties==1) ? "" : (' + '.($total_parties-1))) : - ('+'.$total_parties.' - 1')); + . (is_numeric($total_parties) ? + (($total_parties == 1) ? "" : (' + ' . ($total_parties-1))) : + ('+' . $total_parties . ' - 1')); } // {pagination}, gerer le debut_xx=-1 pour tout voir - if ($op1=='p'){ + if ($op1 == 'p') { $debut .= ";\n \$debut_boucle = ((\$tout=(\$debut_boucle == -1))?0:(\$debut_boucle))"; $debut .= ";\n \$debut_boucle = max(0,min(\$debut_boucle,floor(($nombre_boucle-1)/($total_parties))*($total_parties)))"; $fin = "(\$tout ? $nombre_boucle : $fin)"; @@ -999,15 +1068,15 @@ function calculer_parties(&$boucles, $id_boucle, $debut, $mode){ // Utiliser min pour rabattre $fin_boucle sur total_boucle. $boucles[$id_boucle]->mode_partie = "\n\t" - .'$debut_boucle = '.$debut.";\n " - ."\$debut_boucle = intval(\$debut_boucle);\n " - .'$fin_boucle = min('.$fin.", \$Numrows['$id_boucle']['total'] - 1);\n " - .'$Numrows[\''.$id_boucle."']['grand_total'] = \$Numrows['$id_boucle']['total'];\n " - .'$Numrows[\''.$id_boucle.'\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);' - ."\n\tif (\$debut_boucle>0" - ." AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']" - ." AND \$iter->seek(\$debut_boucle,'continue'))" - ."\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t"; + . '$debut_boucle = ' . $debut . ";\n " + . "\$debut_boucle = intval(\$debut_boucle);\n " + . '$fin_boucle = min(' . $fin . ", \$Numrows['$id_boucle']['total'] - 1);\n " + . '$Numrows[\'' . $id_boucle . "']['grand_total'] = \$Numrows['$id_boucle']['total'];\n " + . '$Numrows[\'' . $id_boucle . '\']["total"] = max(0,$fin_boucle - $debut_boucle + 1);' + . "\n\tif (\$debut_boucle>0" + . " AND \$debut_boucle < \$Numrows['$id_boucle']['grand_total']" + . " AND \$iter->seek(\$debut_boucle,'continue'))" + . "\n\t\t\$Numrows['$id_boucle']['compteur_boucle'] = \$debut_boucle;\n\t"; $boucles[$id_boucle]->partie = " if (\$Numrows['$id_boucle']['compteur_boucle'] <= \$debut_boucle) continue; @@ -1020,16 +1089,17 @@ function calculer_parties(&$boucles, $id_boucle, $debut, $mode){ * Pour l'élément demandé (a ou b) retrouve la valeur de l'élément, * et de combien il est soustrait si c'est le cas comme dans {a-3,b} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param array $param Paramètre à analyser (soit a, soit b dans {a,b} ou {a/b}) + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param array $param Paramètre à analyser (soit a, soit b dans {a,b} ou {a/b}) * @return array Valeur de l'élément (peut être une expression PHP), Nombre soustrait -**/ -function calculer_critere_parties_aux($idb, &$boucles, $param){ - if ($param[0]->type!='texte'){ + **/ +function calculer_critere_parties_aux($idb, &$boucles, $param) { + if ($param[0]->type != 'texte') { $a1 = calculer_liste(array($param[0]), array('id_mere' => $idb), $boucles, $boucles[$idb]->id_parent); if (isset($param[1]->texte)) { preg_match(',^ *(-([0-9]+))? *$,', $param[1]->texte, $m); + return array("intval($a1)", ((isset($m[2]) and $m[2]) ? $m[2] : 0)); } else { return array("intval($a1)", 0); @@ -1069,8 +1139,8 @@ function calculer_critere_parties_aux($idb, &$boucles, $param){ * @return string|array * string : Chaine vide sans erreur * array : Erreur sur un des critères -**/ -function calculer_criteres($idb, &$boucles){ + **/ +function calculer_criteres($idb, &$boucles) { $msg = ''; $boucle = $boucles[$idb]; $table = strtoupper($boucle->type_requete); @@ -1078,24 +1148,26 @@ function calculer_criteres($idb, &$boucles){ $defaut = charger_fonction('DEFAUT', 'calculer_critere'); // s'il y avait une erreur de syntaxe, propager cette info - if (!is_array($boucle->criteres)) return array(); + if (!is_array($boucle->criteres)) { + return array(); + } - foreach ($boucle->criteres as $crit){ + foreach ($boucle->criteres as $crit) { $critere = $crit->op; // critere personnalise ? if ( (!$serveur OR - ((!function_exists($f = "critere_".$serveur."_".$table."_".$critere)) - AND (!function_exists($f = $f."_dist")) - AND (!function_exists($f = "critere_".$serveur."_".$critere)) - AND (!function_exists($f = $f."_dist")) - ) + ((!function_exists($f = "critere_" . $serveur . "_" . $table . "_" . $critere)) + AND (!function_exists($f = $f . "_dist")) + AND (!function_exists($f = "critere_" . $serveur . "_" . $critere)) + AND (!function_exists($f = $f . "_dist")) + ) ) - AND (!function_exists($f = "critere_".$table."_".$critere)) - AND (!function_exists($f = $f."_dist")) - AND (!function_exists($f = "critere_".$critere)) - AND (!function_exists($f = $f."_dist")) - ){ + AND (!function_exists($f = "critere_" . $table . "_" . $critere)) + AND (!function_exists($f = $f . "_dist")) + AND (!function_exists($f = "critere_" . $critere)) + AND (!function_exists($f = $f . "_dist")) + ) { // fonction critere standard $f = $defaut; } @@ -1103,11 +1175,12 @@ function calculer_criteres($idb, &$boucles){ $res = $f($idb, $boucles, $crit); // Gestion centralisee des erreurs pour pouvoir propager - if (is_array($res)){ + if (is_array($res)) { $msg = $res; erreur_squelette($msg, $boucle); } } + return $msg; } @@ -1119,16 +1192,17 @@ function calculer_criteres($idb, &$boucles){ * * http://code.spip.net/@kwote * - * @param string $lisp Code compilé + * @param string $lisp Code compilé * @param string $serveur Connecteur de bdd utilisé - * @param string $type Type d'échappement (char, int...) + * @param string $type Type d'échappement (char, int...) * @return string Code compilé rééchappé */ -function kwote($lisp, $serveur = '', $type = ''){ - if (preg_match(_CODE_QUOTE, $lisp, $r)) - return $r[1]."\"".sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]),$serveur,$type)."\""; - else +function kwote($lisp, $serveur = '', $type = '') { + if (preg_match(_CODE_QUOTE, $lisp, $r)) { + return $r[1] . "\"" . sql_quote(str_replace(array("\\'", "\\\\"), array("'", "\\"), $r[2]), $serveur, $type) . "\""; + } else { return "sql_quote($lisp)"; + } } @@ -1141,15 +1215,15 @@ function kwote($lisp, $serveur = '', $type = ''){ * Si on a une liste de valeurs dans #ENV{x}, utiliser la double etoile * pour faire par exemple {id_article IN #ENV**{liste_articles}} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function critere_IN_dist($idb, &$boucles, $crit){ + **/ +function critere_IN_dist($idb, &$boucles, $crit) { $r = calculer_critere_infixe($idb, $boucles, $crit); - if (!$r){ - return (array('zbug_critere_inconnu', array('critere' => $crit->op." ?"))); + if (!$r) { + return (array('zbug_critere_inconnu', array('critere' => $crit->op . " ?"))); } list($arg, $op, $val, $col, $where_complement) = $r; @@ -1157,46 +1231,61 @@ function critere_IN_dist($idb, &$boucles, $crit){ // inserer la condition; exemple: {id_mot ?IN (66, 62, 64)} $where = $in; - if ($crit->cond){ + if ($crit->cond) { $pred = calculer_argument_precedent($idb, $col, $boucles); $where = array("'?'", $pred, $where, "''"); if ($where_complement) // condition annexe du type "AND (objet='article')" + { $where_complement = array("'?'", $pred, $where_complement, "''"); + } } - if ($crit->exclus) - if (!preg_match(",^L[0-9]+[.],", $arg)) + if ($crit->exclus) { + if (!preg_match(",^L[0-9]+[.],", $arg)) { $where = array("'NOT'", $where); - else + } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent - $where = array("'NOT'", array("'IN'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where))); + { + $where = array( + "'NOT'", + array( + "'IN'", + "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", + array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where) + ) + ); + } + } $boucles[$idb]->where[] = $where; if ($where_complement) // condition annexe du type "AND (objet='article')" + { $boucles[$idb]->where[] = $where_complement; + } } // http://code.spip.net/@critere_IN_cas -function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col){ +function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col) { static $num = array(); $descr = $boucles[$idb]->descr; $cpt = &$num[$descr['nom']][$descr['gram']][$idb]; - $var = '$in'.$cpt++; + $var = '$in' . $cpt++; $x = "\n\t$var = array();"; - foreach ($val as $k => $v){ - if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)){ + foreach ($val as $k => $v) { + if (preg_match(",^(\n//.*\n)?'(.*)'$,", $v, $r)) { // optimiser le traitement des constantes - if (is_numeric($r[2])) - $x .= "\n\t$var"."[]= $r[2];"; - else - $x .= "\n\t$var"."[]= ".sql_quote($r[2]).";"; + if (is_numeric($r[2])) { + $x .= "\n\t$var" . "[]= $r[2];"; + } else { + $x .= "\n\t$var" . "[]= " . sql_quote($r[2]) . ";"; + } } else { // Pour permettre de passer des tableaux de valeurs // on repere l'utilisation brute de #ENV**{X}, // c'est-a-dire sa traduction en ($PILE[0][X]). // et on deballe mais en rajoutant l'anti XSS - $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var"."[]= \$a;\n\telse $var = array_merge($var, \$a);"; + $x .= "\n\tif (!(is_array(\$a = ($v))))\n\t\t$var" . "[]= \$a;\n\telse $var = array_merge($var, \$a);"; } } @@ -1206,11 +1295,11 @@ function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col){ // avec une ecriture de type FIELD qui degrade les performances (du meme ordre qu'un regexp) // et que l'on limite donc strictement aux cas necessaires : // si ce n'est pas un !IN, et si il n'y a pas d'autre order dans la boucle - if (!$crit2){ + if (!$crit2) { $boucles[$idb]->default_order[] = "((!sql_quote($var) OR sql_quote($var)===\"''\") ? 0 : ('FIELD($arg,' . sql_quote($var) . ')'))"; } - return "sql_in('$arg',sql_quote($var)".($crit2=='NOT' ? ",'NOT'" : "").")"; + return "sql_in('$arg',sql_quote($var)" . ($crit2 == 'NOT' ? ",'NOT'" : "") . ")"; } /** @@ -1220,23 +1309,26 @@ function critere_IN_cas($idb, &$boucles, $crit2, $arg, $op, $val, $col){ * entre php et squelettes, en utilisant la syntaxe attendue par * la propriété $where d'une Boucle. * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void */ -function critere_where_dist($idb, &$boucles, $crit){ +function critere_where_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; - if (isset($crit->param[0])) + if (isset($crit->param[0])) { $_where = calculer_liste($crit->param[0], array(), $boucles, $boucle->id_parent); - else + } else { $_where = '@$Pile[0]["where"]'; + } - if ($crit->cond) + if ($crit->cond) { $_where = "(($_where) ? ($_where) : '')"; + } - if ($crit->not) + if ($crit->not) { $_where = "array('NOT',$_where)"; + } $boucle->where[] = $_where; } @@ -1271,7 +1363,7 @@ function critere_where_dist($idb, &$boucles, $crit){ * <p>#TRI{titre,'Trier par titre'} | #TRI{date,'Trier par date'}</p> * <ul> * <BOUCLE_articles(ARTICLES){tri titre}> - * <li>#TITRE - [(#DATE|affdate_jourcourt)]</li> + * <li>#TITRE - [(#DATE|affdate_jourcourt)]</li> * </BOUCLE_articles> * </ul> * </B_articles> @@ -1284,12 +1376,12 @@ function critere_where_dist($idb, &$boucles, $crit){ * {tri num titre}{par titre} permet de faire un tri sur le rang (modifiable dynamiquement) * avec un second critere sur le titre en cas d'egalite des rang * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void */ -function critere_tri_dist($idb, &$boucles, $crit){ +function critere_tri_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; // definition du champ par defaut @@ -1330,23 +1422,26 @@ function critere_tri_dist($idb, &$boucles, $crit){ * Compile les critères non déclarés, ainsi que les parties de boucles * avec les critères {0,1} ou {1/2} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return void -**/ -function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit){ + **/ +function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit) { // double cas particulier {0,1} et {1/2} repere a l'analyse lexicale - if (($crit->op==",") OR ($crit->op=='/')) + if (($crit->op == ",") OR ($crit->op == '/')) { return calculer_critere_parties($idb, $boucles, $crit); + } $r = calculer_critere_infixe($idb, $boucles, $crit); - if (!$r){ - # // on produit une erreur seulement si le critere n'a pas de '?' - # if (!$crit->cond) { - return (array('zbug_critere_inconnu', array('critere' => $crit->op))); - # } - } else calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r); + if (!$r) { + # // on produit une erreur seulement si le critere n'a pas de '?' + # if (!$crit->cond) { + return (array('zbug_critere_inconnu', array('critere' => $crit->op))); + # } + } else { + calculer_critere_DEFAUT_args($idb, $boucles, $crit, $r); + } } @@ -1358,51 +1453,71 @@ function calculer_critere_DEFAUT_dist($idb, &$boucles, $crit){ * * @see calculer_critere_infixe() * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle - * @param array $args Description du critère + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle + * @param array $args Description du critère * Cf. retour de calculer_critere_infixe() * @return void -**/ -function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args){ + **/ +function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args) { list($arg, $op, $val, $col, $where_complement) = $args; $where = array("'$op'", "'$arg'", $val[0]); // inserer la negation (cf !...) - if ($crit->not) $where = array("'NOT'", $where); - if ($crit->exclus) - if (!preg_match(",^L[0-9]+[.],", $arg)) + if ($crit->not) { + $where = array("'NOT'", $where); + } + if ($crit->exclus) { + if (!preg_match(",^L[0-9]+[.],", $arg)) { $where = array("'NOT'", $where); - else + } else // un not sur un critere de jointure se traduit comme un NOT IN avec une sous requete // c'est une sous requete identique a la requete principale sous la forme (SELF,$select,$where) avec $select et $where qui surchargent - $where = array("'NOT'", array("'IN'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", array("'SELF'", "'".$boucles[$idb]->id_table.".".$boucles[$idb]->primary."'", $where))); + { + $where = array( + "'NOT'", + array( + "'IN'", + "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", + array("'SELF'", "'" . $boucles[$idb]->id_table . "." . $boucles[$idb]->primary . "'", $where) + ) + ); + } + } // inserer la condition (cf {lang?}) // traiter a part la date, elle est mise d'office par SPIP, - if ($crit->cond){ + if ($crit->cond) { $pred = calculer_argument_precedent($idb, $col, $boucles); - if ($col=="date" OR $col=="date_redac"){ - if ($pred=="\$Pile[0]['".$col."']"){ + if ($col == "date" OR $col == "date_redac") { + if ($pred == "\$Pile[0]['" . $col . "']") { $pred = "(\$Pile[0]['{$col}_default']?'':$pred)"; } } - if ($op=='=' AND !$crit->not) - $where = array("'?'", "(is_array($pred))", - critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col), - $where); + if ($op == '=' AND !$crit->not) { + $where = array( + "'?'", + "(is_array($pred))", + critere_IN_cas($idb, $boucles, 'COND', $arg, $op, array($pred), $col), + $where + ); + } $where = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where); if ($where_complement) // condition annexe du type "AND (objet='article')" + { $where_complement = array("'?'", "!(is_array($pred)?count($pred):strlen($pred))", "''", $where_complement); + } } $boucles[$idb]->where[] = $where; if ($where_complement) // condition annexe du type "AND (objet='article')" + { $boucles[$idb]->where[] = $where_complement; + } } @@ -1423,9 +1538,9 @@ function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args){ * - des critères sur tables de jointure non explicite (id_mot sur une boucle articles...) * * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return array|string * Liste si on trouve le champ : * - string $arg @@ -1440,8 +1555,8 @@ function calculer_critere_DEFAUT_args($idb, &$boucles, $crit, $args){ * - $where_complement * * Chaîne vide si on ne trouve pas le champ... -**/ -function calculer_critere_infixe($idb, &$boucles, $crit){ + **/ +function calculer_critere_infixe($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $type = $boucle->type_requete; @@ -1456,76 +1571,89 @@ function calculer_critere_infixe($idb, &$boucles, $crit){ $where_complement = false; // Cas particulier : id_enfant => utiliser la colonne id_objet - if ($col=='id_enfant') + if ($col == 'id_enfant') { $col = $boucle->primary; + } // Cas particulier : id_parent => verifier les exceptions de tables - if ( (in_array($col,array('id_parent','id_secteur')) AND isset($GLOBALS['exceptions_des_tables'][$table][$col])) - OR (isset($GLOBALS['exceptions_des_tables'][$table][$col]) AND is_string($GLOBALS['exceptions_des_tables'][$table][$col])) ) + if ((in_array($col, array('id_parent', 'id_secteur')) AND isset($GLOBALS['exceptions_des_tables'][$table][$col])) + OR (isset($GLOBALS['exceptions_des_tables'][$table][$col]) AND is_string($GLOBALS['exceptions_des_tables'][$table][$col])) + ) { $col = $GLOBALS['exceptions_des_tables'][$table][$col]; + } // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums) + else { + if (($col == 'id_secteur') AND ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))) { + $table = $critere_secteur($idb, $boucles, $val, $crit); + } - // et possibilite de gerer un critere secteur sur des tables de plugins (ie forums) - else if (($col=='id_secteur') AND ($critere_secteur = charger_fonction("critere_secteur_$type", "public", true))){ - $table = $critere_secteur($idb, $boucles, $val, $crit); - } - - // cas id_article=xx qui se mappe en id_objet=xx AND objet=article - // sauf si exception declaree : sauter cette etape - else if ( - !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col]) - AND !isset($GLOBALS['exceptions_des_jointures'][$col]) - AND count(trouver_champs_decomposes($col, $desc))>1 - ){ - $e = decompose_champ_id_objet($col); - $col = array_shift($e); - $where_complement = primary_doublee($e, $table); - } - - // Cas particulier : expressions de date - else if ($c = calculer_critere_infixe_date($idb, $boucles, $col)){ - list($col,$col_vraie) = $c; - $table = ''; - } - // table explicitée {mots.titre} - else if (preg_match('/^(.*)\.(.*)$/', $col, $r)){ - list(, $table, $col) = $r; - $col_alias = $col; - - $trouver_table = charger_fonction('trouver_table','base'); - if ($desc = $trouver_table($table, $boucle->sql_serveur) - AND isset($desc['field'][$col]) - AND $cle = array_search($desc['table'],$boucle->from)) - $table = $cle; + // cas id_article=xx qui se mappe en id_objet=xx AND objet=article + // sauf si exception declaree : sauter cette etape else { - $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond OR $op!='=')); + if ( + !isset($GLOBALS['exceptions_des_jointures'][table_objet_sql($table)][$col]) + AND !isset($GLOBALS['exceptions_des_jointures'][$col]) + AND count(trouver_champs_decomposes($col, $desc)) > 1 + ) { + $e = decompose_champ_id_objet($col); + $col = array_shift($e); + $where_complement = primary_doublee($e, $table); + } // Cas particulier : expressions de date + else { + if ($c = calculer_critere_infixe_date($idb, $boucles, $col)) { + list($col, $col_vraie) = $c; + $table = ''; + } // table explicitée {mots.titre} + else { + if (preg_match('/^(.*)\.(.*)$/', $col, $r)) { + list(, $table, $col) = $r; + $col_alias = $col; + + $trouver_table = charger_fonction('trouver_table', 'base'); + if ($desc = $trouver_table($table, $boucle->sql_serveur) + AND isset($desc['field'][$col]) + AND $cle = array_search($desc['table'], $boucle->from) + ) { + $table = $cle; + } else { + $table = trouver_jointure_champ($col, $boucle, array($table), ($crit->cond OR $op != '=')); + } + #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true); + if (!$table) { + return ''; + } + } + // si le champ n'est pas trouvé dans la table, + // on cherche si une jointure peut l'obtenir + elseif (@!array_key_exists($col, $desc['field']) + // Champ joker * des iterateurs DATA qui accepte tout + AND @!array_key_exists('*', $desc['field']) + ) { + $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table); + if (!$r) { + return ''; + } + list($col, $col_alias, $table, $where_complement, $desc) = $r; + } + } + } } - #$table = calculer_critere_externe_init($boucle, array($table), $col, $desc, ($crit->cond OR $op!='='), true); - if (!$table) return ''; - } - // si le champ n'est pas trouvé dans la table, - // on cherche si une jointure peut l'obtenir - elseif (@!array_key_exists($col, $desc['field']) - // Champ joker * des iterateurs DATA qui accepte tout - AND @!array_key_exists('*', $desc['field']) - ) { - $r = calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table); - if (!$r) return ''; - list($col, $col_alias, $table, $where_complement, $desc) = $r; } - $col_vraie = ($col_vraie?$col_vraie:$col); + $col_vraie = ($col_vraie ? $col_vraie : $col); // Dans tous les cas, // virer les guillemets eventuels autour d'un int (qui sont refuses par certains SQL) // et passer dans sql_quote avec le type si connu // et int sinon si la valeur est numerique // sinon introduire le vrai type du champ si connu dans le sql_quote (ou int NOT NULL sinon) // Ne pas utiliser intval, PHP tronquant les Bigint de SQL - if ($op=='=' OR in_array($op, $GLOBALS['table_criteres_infixes'])){ + if ($op == '=' OR in_array($op, $GLOBALS['table_criteres_infixes'])) { // defaire le quote des int et les passer dans sql_quote avec le bon type de champ si on le connait, int sinon // prendre en compte le debug ou la valeur arrive avec un commentaire PHP en debut - if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) - $val[0] = $r[1].'"'.sql_quote($r[2],$boucle->sql_serveur,(isset($desc['field'][$col_vraie])?$desc['field'][$col_vraie]:'int NOT NULL')).'"'; + if (preg_match(",^\\A(\s*//.*?$\s*)?\"'(-?\d+)'\"\\z,ms", $val[0], $r)) { + $val[0] = $r[1] . '"' . sql_quote($r[2], $boucle->sql_serveur, + (isset($desc['field'][$col_vraie]) ? $desc['field'][$col_vraie] : 'int NOT NULL')) . '"'; + } // sinon expliciter les // sql_quote(truc) en sql_quote(truc,'',type) @@ -1535,20 +1663,22 @@ function calculer_critere_infixe($idb, &$boucles, $crit){ // sql_quote(truc,'','varchar') elseif (preg_match('/\Asql_quote[(](.*?)(,[^)]*?)?(,[^)]*(?:\(\d+\)[^)]*)?)?[)]\s*\z/ms', $val[0], $r) // si pas deja un type - AND (!isset($r[3]) OR !$r[3])) { + AND (!isset($r[3]) OR !$r[3]) + ) { $r = $r[1] - .((isset($r[2]) AND $r[2]) ? $r[2] : ",''") - .",'".(isset($desc['field'][$col_vraie])?addslashes($desc['field'][$col_vraie]):'int NOT NULL')."'"; + . ((isset($r[2]) AND $r[2]) ? $r[2] : ",''") + . ",'" . (isset($desc['field'][$col_vraie]) ? addslashes($desc['field'][$col_vraie]) : 'int NOT NULL') . "'"; $val[0] = "sql_quote($r)"; } } // Indicateur pour permettre aux fonctionx boucle_X de modifier // leurs requetes par defaut, notamment le champ statut // Ne pas confondre champs de la table principale et des jointures - if ($table===$boucle->id_table){ + if ($table === $boucle->id_table) { $boucles[$idb]->modificateur['criteres'][$col_vraie] = true; - if ($col_alias!=$col_vraie) + if ($col_alias != $col_vraie) { $boucles[$idb]->modificateur['criteres'][$col_alias] = true; + } } // ajout pour le cas special d'une condition sur le champ statut: @@ -1556,17 +1686,25 @@ function calculer_critere_infixe($idb, &$boucles, $crit){ // de mettre ses propres criteres de statut // http://www.spip.net/@statut (a documenter) // garde pour compatibilite avec code des plugins anterieurs, mais redondant avec la ligne precedente - if ($col=='statut') $boucles[$idb]->statut = true; + if ($col == 'statut') { + $boucles[$idb]->statut = true; + } // inserer le nom de la table SQL devant le nom du champ - if ($table){ - if ($col[0]=="`") - $arg = "$table.".substr($col, 1, -1); - else $arg = "$table.$col"; - } else $arg = $col; + if ($table) { + if ($col[0] == "`") { + $arg = "$table." . substr($col, 1, -1); + } else { + $arg = "$table.$col"; + } + } else { + $arg = $col; + } // inserer la fonction SQL - if ($fct) $arg = "$fct($arg$args_sql)"; + if ($fct) { + $arg = "$fct($arg$args_sql)"; + } return array($arg, $op, $val, $col_alias, $where_complement); } @@ -1578,13 +1716,13 @@ function calculer_critere_infixe($idb, &$boucles, $crit){ * Décrit un critère non déclaré comme {id_article} {id_article>3} qui correspond * à un champ non présent dans la table, et donc à retrouver par jointure si possible. * - * @param Boucle $boucle Description de la boucle - * @param Critere $crit Paramètres du critère dans cette boucle - * @param string $op L'opérateur utilisé, tel que '=' - * @param array $desc Description de la table - * @param string $col Nom de la colonne à trouver (la véritable) + * @param Boucle $boucle Description de la boucle + * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $op L'opérateur utilisé, tel que '=' + * @param array $desc Description de la table + * @param string $col Nom de la colonne à trouver (la véritable) * @param string $col_alias Alias de la colonne éventuel utilisé dans le critère ex: id_enfant - * @param string $table Nom de la table SQL de la boucle + * @param string $table Nom de la table SQL de la boucle * @return array|string * Liste si jointure possible : * - string $col @@ -1594,8 +1732,8 @@ function calculer_critere_infixe($idb, &$boucles, $crit){ * - array $desc * * Chaîne vide si on ne trouve pas le champ par jointure... -**/ -function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table){ + **/ +function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_alias, $table) { $where = ''; @@ -1604,34 +1742,33 @@ function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_ // pas automatiques mais necessaires $table_sql = table_objet_sql($table); if (isset($GLOBALS['exceptions_des_jointures'][$table_sql]) - AND is_array($GLOBALS['exceptions_des_jointures'][$table_sql]) - AND - ( + AND is_array($GLOBALS['exceptions_des_jointures'][$table_sql]) + AND + ( isset($GLOBALS['exceptions_des_jointures'][$table_sql][$col]) OR isset($GLOBALS['exceptions_des_jointures'][$table_sql]['']) - ) - ){ + ) + ) { $t = $GLOBALS['exceptions_des_jointures'][$table_sql]; $index = isset($t[$col]) ? $t[$col] : (isset($t['']) ? $t[''] : array()); - if (count($index)==3) + if (count($index) == 3) { list($t, $col, $calculer_critere_externe) = $index; - elseif (count($index)==2) { + } elseif (count($index) == 2) { list($t, $col) = $t[$col]; - } - elseif (count($index)==1) { + } elseif (count($index) == 1) { list($calculer_critere_externe) = $index; $t = $table; - } - else - $t = ''; // jointure non declaree. La trouver. - } - elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) + } else { + $t = ''; + } // jointure non declaree. La trouver. + } elseif (isset($GLOBALS['exceptions_des_jointures'][$col])) { list($t, $col) = $GLOBALS['exceptions_des_jointures'][$col]; - else - $t = ''; // jointure non declaree. La trouver. + } else { + $t = ''; + } // jointure non declaree. La trouver. // ici on construit le from pour fournir $col en piochant dans les jointures @@ -1640,29 +1777,30 @@ function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_ // <BOUCLE_(DOCUMENTS documents_liens){id_mot}> // alors que <BOUCLE_(DOCUMENTS){id_mot}> produit la meme chose que <BOUCLE_(DOCUMENTS mots_liens){id_mot}> $table = ""; - if ($boucle->jointures_explicites){ + if ($boucle->jointures_explicites) { $jointures_explicites = explode(' ', $boucle->jointures_explicites); - $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond OR $op!='='), $t); + $table = $calculer_critere_externe($boucle, $jointures_explicites, $col, $desc, ($crit->cond OR $op != '='), $t); } // et sinon on cherche parmi toutes les jointures declarees if (!$table) { - $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond OR $op!='='), $t); + $table = $calculer_critere_externe($boucle, $boucle->jointures, $col, $desc, ($crit->cond OR $op != '='), $t); } - if (!$table) return ''; + if (!$table) { + return ''; + } // il ne reste plus qu'a trouver le champ dans les from list($nom, $desc, $cle) = trouver_champ_exterieur($col, $boucle->from, $boucle); - if (count($cle)>1 OR reset($cle)!==$col){ + if (count($cle) > 1 OR reset($cle) !== $col) { $col_alias = $col; // id_article devient juste le nom d'origine - if (count($cle)>1 AND reset($cle)=='id_objet'){ + if (count($cle) > 1 AND reset($cle) == 'id_objet') { $e = decompose_champ_id_objet($col); $col = array_shift($e); $where = primary_doublee($e, $table); - } - else { + } else { $col = reset($cle); } } @@ -1679,18 +1817,19 @@ function calculer_critere_infixe_externe($boucle, $crit, $op, $desc, $col, $col_ * * @todo Ce nom de fonction n'est pas très clair ? * - * @param array $decompose Liste nom du champ, code PHP pour obtenir la valeur - * @param string $table Nom de la table + * @param array $decompose Liste nom du champ, code PHP pour obtenir la valeur + * @param string $table Nom de la table * @return string[] * Liste de 3 éléments pour une description where du compilateur : * - operateur (=), * - table.champ, * - valeur -**/ -function primary_doublee($decompose, $table){ + **/ +function primary_doublee($decompose, $table) { $e1 = reset($decompose); - $e2 = "sql_quote('".end($decompose)."')"; - return array("'='", "'$table.".$e1."'", $e2); + $e2 = "sql_quote('" . end($decompose) . "')"; + + return array("'='", "'$table." . $e1 . "'", $e2); } /** @@ -1720,42 +1859,48 @@ function primary_doublee($decompose, $table){ * Alias de la table de jointure (Lx) * Vide sinon. */ -function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false){ +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) - ){ + 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){ + 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) + if (count($cols) > 2) { array_pop($cols); - if ($t){ + } + 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 { + 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; + $c = "/FIELD.$t" . ".$col,/"; + if (trouver_champ($c, $boucle->select)) { + $joindre = true; + } } } - if (!$joindre) return $t; + if (!$joindre) { + return $t; + } } array_pop($arrivee); if ($res = calculer_jointure($boucle, array($boucle->id_table, $desc), $arrivee, $cols, $cond, 1)) { @@ -1763,6 +1908,7 @@ function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $c } } } + return ''; } @@ -1789,23 +1935,30 @@ function calculer_critere_externe_init(&$boucle, $joints, $col, $desc, $cond, $c * @return string * Alias de la table de jointure (Lx) */ -function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false){ +function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $checkarrivee = false) { $primary_arrivee = id_table_objet($checkarrivee); // [FIXME] $checkarrivee peut-il arriver avec false ???? - $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee."_liens"); + $intermediaire = trouver_champ_exterieur($primary_arrivee, $joints, $boucle, $checkarrivee . "_liens"); $arrivee = trouver_champ_exterieur($col, $joints, $boucle, $checkarrivee); - if (!$intermediaire OR !$arrivee) return ''; + if (!$intermediaire OR !$arrivee) { + return ''; + } array_pop($intermediaire); // enlever la cle en 3eme argument array_pop($arrivee); // enlever la cle en 3eme argument $res = fabrique_jointures($boucle, - array( - array($boucle->id_table, $intermediaire, array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type'])), - array(reset($intermediaire), $arrivee, $primary_arrivee) - ) + array( + array( + $boucle->id_table, + $intermediaire, + array(id_table_objet($desc['table_objet']), 'id_objet', 'objet', $desc['type']) + ), + array(reset($intermediaire), $arrivee, $primary_arrivee) + ) , $cond, $desc, $boucle->id_table, array($col)); + return $res; } @@ -1821,14 +1974,17 @@ function calculer_lien_externe_init(&$boucle, $joints, $col, $desc, $cond, $chec * @return bool * true si le champ est trouvé quelque part dans $where * false sinon. -**/ -function trouver_champ($champ, $where){ - if (!is_array($where)) + **/ +function trouver_champ($champ, $where) { + if (!is_array($where)) { return preg_match($champ, $where); - else { - foreach ($where as $clause){ - if (trouver_champ($champ, $clause)) return true; + } else { + foreach ($where as $clause) { + if (trouver_champ($champ, $clause)) { + return true; + } } + return false; } } @@ -1842,9 +1998,9 @@ function trouver_champ($champ, $where){ * * Traite les cas particuliers id_parent, id_enfant, date, lang * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle * @return array * Liste : * - string $fct Nom d'une fonction SQL sur le champ ou vide (ex: SUM) @@ -1854,35 +2010,35 @@ function trouver_champ($champ, $where){ * Liste de codes PHP obtenant les valeurs des comparaisons (ex: id_article sur la boucle parente) * Souvent un tableau d'un seul élément. * - string $args_sql Suite des arguments du critère. ? -**/ -function calculer_critere_infixe_ops($idb, &$boucles, $crit){ + **/ +function calculer_critere_infixe_ops($idb, &$boucles, $crit) { // cas d'une valeur comparee a elle-meme ou son referent - if (count($crit->param)==0){ + if (count($crit->param) == 0) { $op = '='; $col = $val = $crit->op; - if (preg_match('/^(.*)\.(.*)$/', $col, $r)) $val = $r[2]; + if (preg_match('/^(.*)\.(.*)$/', $col, $r)) { + $val = $r[2]; + } // Cas special {lang} : aller chercher $GLOBALS['spip_lang'] - if ($val=='lang') + if ($val == 'lang') { $val = array(kwote('$GLOBALS[\'spip_lang\']')); - else { + } else { $defaut = null; - if ($val=='id_parent') { + if ($val == 'id_parent') { // Si id_parent, comparer l'id_parent avec l'id_objet // de la boucle superieure.... faudrait verifier qu'il existe // pour eviter l'erreur SQL $val = $boucles[$idb]->primary; // mais si pas de boucle superieure, prendre id_parent dans l'env $defaut = "@\$Pile[0]['id_parent']"; - } - elseif ($val=='id_enfant'){ + } elseif ($val == 'id_enfant') { // Si id_enfant, comparer l'id_objet avec l'id_parent // de la boucle superieure $val = 'id_parent'; - } - elseif ($crit->cond AND ($col=="date" OR $col=="date_redac")){ + } elseif ($crit->cond AND ($col == "date" OR $col == "date_redac")) { // un critere conditionnel sur date est traite a part // car la date est mise d'office par SPIP, - $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['".$col."'])"; + $defaut = "(\$Pile[0]['{$col}_default']?'':\$Pile[0]['" . $col . "'])"; } $val = calculer_argument_precedent($idb, $val, $boucles, $defaut); @@ -1893,7 +2049,9 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit){ // le phraseur impose que le premier param soit du texte $params = $crit->param; $op = $crit->op; - if ($op=='==') $op = 'REGEXP'; + if ($op == '==') { + $op = 'REGEXP'; + } $col = array_shift($params); $col = $col[0]->texte; @@ -1904,31 +2062,35 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit){ // Dans le cas {x=='#DATE'} etc, defaire le travail du phraseur, // celui ne sachant pas ce qu'est un critere infixe // et a fortiori son 2e operande qu'entoure " ou ' - if (count($params)==1 - AND count($params[0])==3 - AND $params[0][0]->type=='texte' - AND $params[0][2]->type=='texte' - AND ($p = $params[0][0]->texte)==$params[0][2]->texte - AND (($p=="'") OR ($p=='"')) - AND $params[0][1]->type=='champ' - ){ - $val[] = "$p\\$p#".$params[0][1]->nom_champ."\\$p$p"; - } else - foreach ((($op!='IN') ? $params : calculer_vieux_in($params)) as $p){ + if (count($params) == 1 + AND count($params[0]) == 3 + AND $params[0][0]->type == 'texte' + AND $params[0][2]->type == 'texte' + AND ($p = $params[0][0]->texte) == $params[0][2]->texte + AND (($p == "'") OR ($p == '"')) + AND $params[0][1]->type == 'champ' + ) { + $val[] = "$p\\$p#" . $params[0][1]->nom_champ . "\\$p$p"; + } else { + foreach ((($op != 'IN') ? $params : calculer_vieux_in($params)) as $p) { $a = calculer_liste($p, $desc, $boucles, $parent); - if (strcasecmp($op,'IN')==0) $val[] = $a; - else $val[] = kwote($a, $boucles[$idb]->sql_serveur, 'char'); // toujours quoter en char ici + if (strcasecmp($op, 'IN') == 0) { + $val[] = $a; + } else { + $val[] = kwote($a, $boucles[$idb]->sql_serveur, 'char'); + } // toujours quoter en char ici } + } } $fct = $args_sql = ''; // fonction SQL ? // chercher FONCTION(champ) tel que CONCAT(titre,descriptif) - if (preg_match('/^(.*)'.SQL_ARGS.'$/', $col, $m)) { + if (preg_match('/^(.*)' . SQL_ARGS . '$/', $col, $m)) { $fct = $m[1]; preg_match('/^\(([^,]*)(.*)\)$/', $m[2], $a); $col = $a[1]; - if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)){ + if (preg_match('/^(\S*)(\s+AS\s+.*)$/i', $col, $m)) { $col = $m[1]; $args_sql = $m[2]; } @@ -1941,7 +2103,7 @@ function calculer_critere_infixe_ops($idb, &$boucles, $crit){ // compatibilite ancienne version // http://code.spip.net/@calculer_vieux_in -function calculer_vieux_in($params){ +function calculer_vieux_in($params) { $deb = $params[0][0]; $k = count($params)-1; $last = $params[$k]; @@ -1949,26 +2111,29 @@ function calculer_vieux_in($params){ $last = $last[$j]; $n = isset($last->texte) ? strlen($last->texte) : 0; - if (!((isset($deb->texte[0]) AND $deb->texte[0]=='(') - && (isset($last->texte[$n-1]) AND $last->texte[$n-1]==')'))) + if (!((isset($deb->texte[0]) AND $deb->texte[0] == '(') + && (isset($last->texte[$n-1]) AND $last->texte[$n-1] == ')')) + ) { return $params; + } $params[0][0]->texte = substr($deb->texte, 1); // attention, on peut avoir k=0,j=0 ==> recalculer $last = $params[$k][$j]; $n = strlen($last->texte); $params[$k][$j]->texte = substr($last->texte, 0, $n-1); $newp = array(); - foreach ($params as $v){ - if ($v[0]->type!='texte') + foreach ($params as $v) { + if ($v[0]->type != 'texte') { $newp[] = $v; - else { - foreach (explode(',', $v[0]->texte) as $x){ + } else { + foreach (explode(',', $v[0]->texte) as $x) { $t = new Texte; $t->texte = $x; $newp[] = array($t); } } } + return $newp; } @@ -1978,47 +2143,56 @@ function calculer_vieux_in($params){ * Lorsque la colonne correspond à un critère de date, tel que * jour, jour_relatif, jour_x, age, age_relatif, age_x... * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param string $col Nom du champ demandé + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param string $col Nom du champ demandé * @return string|array * chaine vide si ne correspond pas à une date, * sinon liste * - expression SQL de calcul de la date, * - nom de la colonne de date (si le calcul n'est pas relatif) -**/ -function calculer_critere_infixe_date($idb, &$boucles, $col){ - if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) return ''; + **/ +function calculer_critere_infixe_date($idb, &$boucles, $col) { + if (!preg_match(",^((age|jour|mois|annee)_relatif|date|mois|annee|jour|heure|age)(_[a-z]+)?$,", $col, $regs)) { + return ''; + } $boucle = $boucles[$idb]; $table = $boucle->show; // si c'est une colonne de la table, ne rien faire - if(isset($table['field'][$col])) return ''; + if (isset($table['field'][$col])) { + return ''; + } - if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) return ''; - $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']])? $GLOBALS['table_date'][$table['id_table']] : $table['date']; + if (!$table['date'] && !isset($GLOBALS['table_date'][$table['id_table']])) { + return ''; + } + $pred = $date_orig = isset($GLOBALS['table_date'][$table['id_table']]) ? $GLOBALS['table_date'][$table['id_table']] : $table['date']; $col = $regs[1]; - if (isset($regs[3]) AND $suite = $regs[3]){ + if (isset($regs[3]) AND $suite = $regs[3]) { # Recherche de l'existence du champ date_xxxx, # si oui choisir ce champ, sinon choisir xxxx - if (isset($table['field']["date$suite"])) - $date_orig = 'date'.$suite; - else + if (isset($table['field']["date$suite"])) { + $date_orig = 'date' . $suite; + } else { $date_orig = substr($suite, 1); + } $pred = $date_orig; + } else { + if (isset($regs[2]) AND $rel = $regs[2]) { + $pred = 'date'; + } } - else - if (isset($regs[2]) AND $rel = $regs[2]) $pred = 'date'; - $date_compare = "\"' . normaliser_date(". - calculer_argument_precedent($idb, $pred, $boucles). - ") . '\""; + $date_compare = "\"' . normaliser_date(" . + calculer_argument_precedent($idb, $pred, $boucles) . + ") . '\""; $col_vraie = $date_orig; - $date_orig = $boucle->id_table.'.'.$date_orig; + $date_orig = $boucle->id_table . '.' . $date_orig; switch ($col) { case 'date': @@ -2045,22 +2219,23 @@ function calculer_critere_infixe_date($idb, &$boucles, $col){ $col_vraie = "";// comparer a un int (par defaut) break; case 'jour_relatif': - $col = "(TO_DAYS(".$date_compare.")-TO_DAYS(".$date_orig."))"; + $col = "(TO_DAYS(" . $date_compare . ")-TO_DAYS(" . $date_orig . "))"; $col_vraie = "";// comparer a un int (par defaut) break; case 'mois_relatif': - $col = "MONTH(".$date_compare.")-MONTH(". - $date_orig.")+12*(YEAR(".$date_compare. - ")-YEAR(".$date_orig."))"; + $col = "MONTH(" . $date_compare . ")-MONTH(" . + $date_orig . ")+12*(YEAR(" . $date_compare . + ")-YEAR(" . $date_orig . "))"; $col_vraie = "";// comparer a un int (par defaut) break; case 'annee_relatif': - $col = "YEAR(".$date_compare.")-YEAR(". - $date_orig.")"; + $col = "YEAR(" . $date_compare . ")-YEAR(" . + $date_orig . ")"; $col_vraie = "";// comparer a un int (par defaut) break; } - return array($col,$col_vraie); + + return array($col, $col_vraie); } /** @@ -2077,14 +2252,14 @@ function calculer_critere_infixe_date($idb, &$boucles, $col){ * @return string * Expression SQL calculant le nombre de jours écoulé entre une valeur * de colonne SQL et une date. -**/ -function calculer_param_date($date_compare, $date_orig){ - if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)){ + **/ +function calculer_param_date($date_compare, $date_orig) { + if (preg_match(",'\" *\.(.*)\. *\"',", $date_compare, $r)) { $init = "'\" . (\$x = $r[1]) . \"'"; $date_compare = '\'$x\''; - } - else + } else { $init = $date_compare; + } return // optimisation : mais prevoir le support SQLite avant @@ -2101,23 +2276,24 @@ function calculer_param_date($date_compare, $date_orig){ * (DATA){source mode, "xxxxxx", arg, arg, arg} * (DATA){source tableau, #LISTE{un,deux,trois}} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_DATA_source_dist($idb, &$boucles, $crit){ +function critere_DATA_source_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $args = array(); - foreach ($crit->param as &$param) + foreach ($crit->param as &$param) { array_push($args, - calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent)); + calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent)); + } $boucle->hash .= ' - $command[\'sourcemode\'] = '.array_shift($args).";\n"; + $command[\'sourcemode\'] = ' . array_shift($args) . ";\n"; $boucle->hash .= ' - $command[\'source\'] = array('.join(', ', $args).");\n"; + $command[\'source\'] = array(' . join(', ', $args) . ");\n"; } @@ -2128,15 +2304,15 @@ function critere_DATA_source_dist($idb, &$boucles, $crit){ * * @deprecated Utiliser directement le critère {source} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_DATA_datasource_dist($idb, &$boucles, $crit){ +function critere_DATA_datasource_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $boucle->hash .= ' - $command[\'source\'] = array('.calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent).'); - $command[\'sourcemode\'] = '.calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent).';'; + $command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . '); + $command[\'sourcemode\'] = ' . calculer_liste($crit->param[1], array(), $boucles, $boucles[$idb]->id_parent) . ';'; } @@ -2149,14 +2325,14 @@ function critere_DATA_datasource_dist($idb, &$boucles, $crit){ * * La durée par défaut est 1 journée. * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_DATA_datacache_dist($idb, &$boucles, $crit){ +function critere_DATA_datacache_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $boucle->hash .= ' - $command[\'datacache\'] = '.calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent).';'; + $command[\'datacache\'] = ' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . ';'; } @@ -2166,16 +2342,16 @@ function critere_DATA_datacache_dist($idb, &$boucles, $crit){ * Permet de passer des arguments à un iterateur non-spip * (PHP:xxxIterator){args argument1, argument2, argument3} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_php_args_dist($idb, &$boucles, $crit){ +function critere_php_args_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $boucle->hash .= '$command[\'args\']=array();'; - foreach ($crit->param as $param){ + foreach ($crit->param as $param) { $boucle->hash .= ' - $command[\'args\'][] = '.calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).';'; + $command[\'args\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';'; } } @@ -2188,15 +2364,16 @@ function critere_php_args_dist($idb, &$boucles, $crit){ * (DATA){liste X1, X2, X3} * équivalent à (DATA){source tableau,#LISTE{X1, X2, X3}} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_DATA_liste_dist($idb, &$boucles, $crit){ +function critere_DATA_liste_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; - $boucle->hash .= "\n\t".'$command[\'liste\'] = array();'."\n"; - foreach ($crit->param as $param){ - $boucle->hash .= "\t".'$command[\'liste\'][] = '.calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).";\n"; + $boucle->hash .= "\n\t" . '$command[\'liste\'] = array();' . "\n"; + foreach ($crit->param as $param) { + $boucle->hash .= "\t" . '$command[\'liste\'][] = ' . calculer_liste($param, array(), $boucles, + $boucles[$idb]->id_parent) . ";\n"; } } @@ -2217,15 +2394,16 @@ function critere_DATA_liste_dist($idb, &$boucles, $crit){ * * @link http://php.net/manual/fr/function.range.php * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_DATA_enum_dist($idb, &$boucles, $crit){ +function critere_DATA_enum_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; - $boucle->hash .= "\n\t".'$command[\'enum\'] = array();'."\n"; - foreach ($crit->param as $param){ - $boucle->hash .= "\t".'$command[\'enum\'][] = '.calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).";\n"; + $boucle->hash .= "\n\t" . '$command[\'enum\'] = array();' . "\n"; + foreach ($crit->param as $param) { + $boucle->hash .= "\t" . '$command[\'enum\'][] = ' . calculer_liste($param, array(), $boucles, + $boucles[$idb]->id_parent) . ";\n"; } } @@ -2236,15 +2414,15 @@ function critere_DATA_enum_dist($idb, &$boucles, $crit){ * * (DATA){datapath query.results} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_DATA_datapath_dist($idb, &$boucles, $crit){ +function critere_DATA_datapath_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; - foreach ($crit->param as $param){ + foreach ($crit->param as $param) { $boucle->hash .= ' - $command[\'datapath\'][] = '.calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent).';'; + $command[\'datapath\'][] = ' . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ';'; } } @@ -2272,20 +2450,20 @@ function critere_DATA_datapath_dist($idb, &$boucles, $crit){ * {si (#_contenu:GRAND_TOTAL|>{10})} * {si #AUTORISER{voir,articles}} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_si_dist($idb, &$boucles, $crit){ +function critere_si_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; // il faut initialiser 1 fois le tableau a chaque appel de la boucle // (par exemple lorsque notre boucle est appelee dans une autre boucle) // mais ne pas l'initialiser n fois si il y a n criteres {si } dans la boucle ! $boucle->hash .= "\n\tif (!isset(\$si_init)) { \$command['si'] = array(); \$si_init = true; }\n"; - if ($crit->param){ - foreach ($crit->param as $param){ + if ($crit->param) { + foreach ($crit->param as $param) { $boucle->hash .= "\t\$command['si'][] = " - . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ";\n"; + . calculer_liste($param, array(), $boucles, $boucles[$idb]->id_parent) . ";\n"; } // interdire {si 0} aussi ! } else { @@ -2301,14 +2479,14 @@ function critere_si_dist($idb, &$boucles, $crit){ * * @deprecated Utiliser une boucle (DATA){source tableau,#XX} * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_POUR_tableau_dist($idb, &$boucles, $crit){ +function critere_POUR_tableau_dist($idb, &$boucles, $crit) { $boucle = &$boucles[$idb]; $boucle->hash .= ' - $command[\'source\'] = array('.calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent).'); + $command[\'source\'] = array(' . calculer_liste($crit->param[0], array(), $boucles, $boucles[$idb]->id_parent) . '); $command[\'sourcemode\'] = \'table\';'; } @@ -2322,18 +2500,19 @@ function critere_POUR_tableau_dist($idb, &$boucles, $crit){ * * @global array $exceptions_des_tables * - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_noeud_dist($idb, &$boucles, $crit){ +function critere_noeud_dist($idb, &$boucles, $crit) { $not = $crit->not; $boucle = &$boucles[$idb]; $primary = $boucle->primary; - if (!$primary OR strpos($primary, ',')){ + if (!$primary OR strpos($primary, ',')) { erreur_squelette(_T('zbug_doublon_sur_table_sans_cle_primaire'), $boucle); + return; } $table = $boucle->type_requete; @@ -2344,9 +2523,10 @@ function critere_noeud_dist($idb, &$boucles, $crit){ 'id_parent'; $in = "IN"; - $where = array("'IN'", "'$boucle->id_table."."$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"); - if ($not) + $where = array("'IN'", "'$boucle->id_table." . "$primary'", "'('.sql_get_select('$id_parent', '$table_sql').')'"); + if ($not) { $where = array("'NOT'", $where); + } $boucle->where[] = $where; } @@ -2359,11 +2539,11 @@ function critere_noeud_dist($idb, &$boucles, $crit){ * {!feuille} retourne les noeuds * * @global array $exceptions_des_tables - * @param string $idb Identifiant de la boucle - * @param array $boucles AST du squelette - * @param Critere $crit Paramètres du critère dans cette boucle + * @param string $idb Identifiant de la boucle + * @param array $boucles AST du squelette + * @param Critere $crit Paramètres du critère dans cette boucle */ -function critere_feuille_dist($idb, &$boucles, $crit){ +function critere_feuille_dist($idb, &$boucles, $crit) { $not = $crit->not; $crit->not = $not ? false : true; critere_noeud_dist($idb, $boucles, $crit); diff --git a/ecrire/public/debusquer.php b/ecrire/public/debusquer.php index 394aa72548..ae3b84b365 100644 --- a/ecrire/public/debusquer.php +++ b/ecrire/public/debusquer.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('public/decompiler'); include_spip('inc/filtres_mini'); @@ -44,12 +46,12 @@ defined('_DEBUG_MAX_SQUELETTE_ERREURS') || define('_DEBUG_MAX_SQUELETTE_ERREURS' * * Point d'entrée pour les appels involontaires ($message non vide => erreur) * et volontaires (var_mode et var_profile) - * + * * Si pas d'autorisation, les erreurs ne sont pas affichées * (mais seront dans les logs) * * Si l'erreur vient de SPIP, en parler sur `spip@rezo.net` - * + * * @param bool|string|array $message * - Message d'erreur (string|array) * - false pour retourner le texte des messages d'erreurs @@ -62,8 +64,8 @@ defined('_DEBUG_MAX_SQUELETTE_ERREURS') || define('_DEBUG_MAX_SQUELETTE_ERREURS' * - 'erreurs' = 'reset' : Efface le tableau des erreurs * @return null|string * - string si $message à false. -**/ -function public_debusquer_dist($message = '', $lieu = '', $opt = array()){ + **/ +function public_debusquer_dist($message = '', $lieu = '', $opt = array()) { static $tableau_des_erreurs = array(); // Pour des tests unitaires, pouvoir récupérer les erreurs générées @@ -73,32 +75,38 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = array()){ } if ($opt['erreurs'] == 'reset') { $tableau_des_erreurs = array(); + return true; } } // Erreur ou appel final ? - if ($message){ + if ($message) { $message = debusquer_compose_message($message); $tableau_des_erreurs[] = array($message, $lieu); set_request('var_mode', 'debug'); $GLOBALS['bouton_admin_debug'] = true; // Permettre a la compil de continuer - if (is_object($lieu) AND (!isset($lieu->code) OR !$lieu->code)) + if (is_object($lieu) AND (!isset($lieu->code) OR !$lieu->code)) { $lieu->code = "''"; + } // forcer l'appel au debusqueur en cas de boucles infernales - $urgence = (_DEBUG_MAX_SQUELETTE_ERREURS AND count($tableau_des_erreurs)>_DEBUG_MAX_SQUELETTE_ERREURS); - if (!$urgence) return; + $urgence = (_DEBUG_MAX_SQUELETTE_ERREURS AND count($tableau_des_erreurs) > _DEBUG_MAX_SQUELETTE_ERREURS); + if (!$urgence) { + return; + } } if (empty($GLOBALS['debug_objets']['principal'])) { // espace public ? if (isset($GLOBALS['fond'])) { $GLOBALS['debug_objets']['principal'] = $GLOBALS['fond']; - } + } } include_spip('inc/autoriser'); - if (!autoriser('debug')) return; + if (!autoriser('debug')) { + return; + } include_spip('inc/headers'); include_spip('inc/filtres'); @@ -110,7 +118,7 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = array()){ if (ob_get_length() AND !in_array('ob_gzhandler', ob_get_status()) - ){ + ) { ob_end_clean(); } @@ -119,37 +127,43 @@ function public_debusquer_dist($message = '', $lieu = '', $opt = array()){ $mode = _request('var_mode_affiche'); $self = str_replace("\\'", ''', self()); $self = parametre_url($self, 'var_mode', 'debug'); - + $res = debusquer_bandeau($tableau_des_erreurs) . '<br />' . debusquer_squelette($fonc, $mode, $self); - if (!_DIR_RESTREINT OR headers_sent()) return $res; - if ($tableau_des_erreurs) http_status(503); + if (!_DIR_RESTREINT OR headers_sent()) { + return $res; + } + if ($tableau_des_erreurs) { + http_status(503); + } http_no_cache(); - if (isset($_GET['var_profile'])){ + if (isset($_GET['var_profile'])) { $titre = parametre_url($GLOBALS['REQUEST_URI'], 'var_profile', ''); $titre = parametre_url($titre, 'var_mode', ''); - } - else { - if (!$fonc) $fonc = $GLOBALS['debug_objets']['principal']; + } else { + if (!$fonc) { + $fonc = $GLOBALS['debug_objets']['principal']; + } $titre = !$mode ? $fonc : ($mode . (isset($GLOBALS['debug_objets']['sourcefile'][$fonc]) ? " " . $GLOBALS['debug_objets']['sourcefile'][$fonc] : "")); } - if ($message===false){ + if ($message === false) { lang_select(); + return debusquer_entete($titre, $res); - } - else + } else { echo debusquer_entete($titre, $res); + } exit; } -function debusquer_compose_message($msg){ - if (is_array($msg)){ +function debusquer_compose_message($msg) { + if (is_array($msg)) { // si c'est un texte, c'est une traduction a faire, mais // sqlite renvoit aussi des erreurs alpha num (mais avec 3 arguments) - if (!is_numeric($msg[0]) AND count($msg)==2) { + if (!is_numeric($msg[0]) AND count($msg) == 2) { // message avec argument: instancier $msg = _T($msg[0], $msg[1], 'spip-debug-arg'); } else { @@ -159,26 +173,28 @@ function debusquer_compose_message($msg){ } // FIXME: le fond n'est pas la si on n'est pas dans un squelette // cela dit, ca serait bien d'indiquer tout de meme d'ou vient l'erreur - $fond = isset($GLOBALS['fond']) ? $GLOBALS['fond'] : ""; + $fond = isset($GLOBALS['fond']) ? $GLOBALS['fond'] : ""; // une erreur critique sort $message en array $debug = is_array($msg) ? $msg[1] : $msg; spip_log("Debug: " . $debug . " (" . $fond . ")"); + return $msg; } -function debusquer_bandeau($erreurs){ +function debusquer_bandeau($erreurs) { - if (!empty($erreurs)){ + if (!empty($erreurs)) { $n = array(count($erreurs) . ' ' . _T('zbug_erreur_squelette')); + return debusquer_navigation($erreurs, $n); - } - elseif (!empty($GLOBALS['tableau_des_temps'])) { + } elseif (!empty($GLOBALS['tableau_des_temps'])) { include_spip('public/tracer'); list($temps, $nav) = chrono_requete($GLOBALS['tableau_des_temps']); + return debusquer_navigation($temps, $nav, 'debug-profile'); - } - else + } else { return ''; + } } /** @@ -186,12 +202,16 @@ function debusquer_bandeau($erreurs){ * * @param array|string $env * @return string Code HTML -**/ -function debusquer_contexte($env){ + **/ +function debusquer_contexte($env) { - if (is_array($env_tab = @unserialize($env))) $env = $env_tab; + if (is_array($env_tab = @unserialize($env))) { + $env = $env_tab; + } - if (!$env) return ''; + if (!$env) { + return ''; + } $res = ""; foreach ($env as $nom => $valeur) { if (is_array($valeur)) { @@ -214,23 +234,25 @@ function debusquer_contexte($env){ function debusquer_navigation($tableau, $caption = array(), $id = 'debug-nav') { - if (_request('exec')=='valider_xml') return ''; + if (_request('exec') == 'valider_xml') { + return ''; + } $GLOBALS['bouton_admin_debug'] = true; $res = ''; $href = quote_amp(parametre_url($GLOBALS['REQUEST_URI'], 'var_mode', 'debug')); - foreach ($tableau as $i => $err){ + foreach ($tableau as $i => $err) { $boucle = $ligne = $skel = ''; list($msg, $lieu) = $err; - if (is_object($lieu)){ + if (is_object($lieu)) { $ligne = $lieu->ligne; $boucle = $lieu->id_boucle ? $lieu->id_boucle : ''; - if (isset($lieu->descr['nom'])){ + if (isset($lieu->descr['nom'])) { $nom_code = $lieu->descr['nom']; $skel = $lieu->descr['sourcefile']; $h2 = parametre_url($href, 'var_mode_objet', $nom_code); $h3 = parametre_url($h2, 'var_mode_affiche', 'squelette') . '#L' . $ligne; $skel = "<a href='$h3'><b>$skel</b></a>"; - if ($boucle){ + if ($boucle) { $h3 = parametre_url($h2 . $boucle, 'var_mode_affiche', 'boucle'); $boucle = "<a href='$h3'><b>$boucle</b></a>"; } @@ -253,60 +275,59 @@ function debusquer_navigation($tableau, $caption = array(), $id = 'debug-nav') { } return "\n<table id='$id'>" - . "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">" - . $caption[0] + . "<caption onclick=\"x = document.getElementById('$id'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\">" + . $caption[0] ## aide locale courte a ecrire, avec lien vers une grosse page de documentation # aide('erreur_compilation'), - . "</caption>" - // fausse caption du chrono (mais vraie nav) - . (!empty($caption[1]) ? $caption[1] : '') - . "<tr><th>" - . _T('numero') - . "</th><th>" - . _T('public:message') - . "</th><th>" - . _T('squelette') - . "</th><th>" - . _T('zbug_boucle') - . "</th><th>" - . _T('ligne') - . "</th></tr>" - . $res - . "</table>"; + . "</caption>" + // fausse caption du chrono (mais vraie nav) + . (!empty($caption[1]) ? $caption[1] : '') + . "<tr><th>" + . _T('numero') + . "</th><th>" + . _T('public:message') + . "</th><th>" + . _T('squelette') + . "</th><th>" + . _T('zbug_boucle') + . "</th><th>" + . _T('ligne') + . "</th></tr>" + . $res + . "</table>"; } /** - * Retourne le texte d'un message d'erreur de requête + * Retourne le texte d'un message d'erreur de requête * * Si une boucle cree des soucis, on peut afficher la requete fautive * avec son code d'erreur * * @param array $message - * Description du message en 3 éléments : - * - numéro d'erreur - * - texte de l'erreur - * - requête en erreur + * Description du message en 3 éléments : + * - numéro d'erreur + * - texte de l'erreur + * - requête en erreur * @return string|array - * Retourne le texte de l'erreur a afficher - * ou un tableau si l'erreur est critique -**/ -function debusquer_requete($message){ + * Retourne le texte de l'erreur a afficher + * ou un tableau si l'erreur est critique + **/ +function debusquer_requete($message) { list($errno, $msg, $query) = $message; // FIXME: ces écritures mélangent divers syntaxe des moteurs SQL // il serait plus prudent certainement d'avoir une fonction d'analyse par moteur - if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $msg, $regs)){ + if (preg_match(',err(no|code):?[[:space:]]*([0-9]+),i', $msg, $regs)) { $errno = $regs[2]; - } - elseif (is_numeric($errno) and ($errno==1030 OR $errno<=1026) + } elseif (is_numeric($errno) and ($errno == 1030 OR $errno <= 1026) AND preg_match(',[^[:alnum:]]([0-9]+)[^[:alnum:]],', $msg, $regs) ) { $errno = $regs[1]; } // Erreur systeme - if (is_numeric($errno) and $errno>0 AND $errno<200){ + if (is_numeric($errno) and $errno > 0 AND $errno < 200) { $retour = "<tt><br /><br /><blink>" . _T('info_erreur_systeme', array('errsys' => $errno)) . "</blink><br />\n<b>" @@ -314,6 +335,7 @@ function debusquer_requete($message){ array('script' => generer_url_ecrire('base_repair'))) . '</b><br />'; spip_log("Erreur systeme $errno"); + return array($retour, ''); } @@ -323,79 +345,89 @@ function debusquer_requete($message){ . "\n<br /><span style='color: red'><b>" . spip_htmlspecialchars($query) . "</b></span></tt><br />"; + //. aide('erreur_mysql'); return $err; } - // http://code.spip.net/@trouve_boucle_debug -function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = ""){ +function trouve_boucle_debug($n, $nom, $debut = 0, $boucle = "") { $id = $nom . $boucle; - if (is_array($GLOBALS['debug_objets']['sequence'][$id])){ - foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v){ + if (is_array($GLOBALS['debug_objets']['sequence'][$id])) { + foreach ($GLOBALS['debug_objets']['sequence'][$id] as $v) { - if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', $v[0], $r)) + if (!preg_match('/^(.*)(<\?.*\?>)(.*)$/s', $v[0], $r)) { $y = substr_count($v[0], "\n"); - else { - if ($v[1][0]=='#') - // balise dynamique + } else { + if ($v[1][0] == '#') // balise dynamique + { $incl = $GLOBALS['debug_objets']['resultat'][$v[2]]; - else - // inclusion + } else // inclusion + { $incl = $GLOBALS['debug_objets']['squelette'][trouve_squelette_inclus($v[0])]; + } $y = substr_count($incl, "\n") +substr_count($r[1], "\n") +substr_count($r[3], "\n"); } - if ($n<=($y+$debut)){ - if ($v[1][0]=='?') + if ($n <= ($y+$debut)) { + if ($v[1][0] == '?') { return trouve_boucle_debug($n, $nom, $debut, substr($v[1], 1)); - elseif ($v[1][0]=='!') { - if ($incl = trouve_squelette_inclus($v[1])) + } elseif ($v[1][0] == '!') { + if ($incl = trouve_squelette_inclus($v[1])) { return trouve_boucle_debug($n, $incl, $debut); + } } + return array($nom, $boucle, $v[2]-1+$n-$debut); } $debut += $y; } } + return array($nom, $boucle, $n-$debut); } // http://code.spip.net/@trouve_squelette_inclus -function trouve_squelette_inclus($script){ +function trouve_squelette_inclus($script) { preg_match('/include\(.(.*).php3?.\);/', $script, $reg); // si le script X.php n'est pas ecrire/public.php // on suppose qu'il prend le squelette X.html (pas sur, mais y a pas mieux) - if ($reg[1]=='ecrire/public') - // si c'est bien ecrire/public on cherche le param 'fond' - if (!preg_match("/'fond' => '([^']*)'/", $script, $reg)) - // a defaut on cherche le param 'page' - if (!preg_match("/'param' => '([^']*)'/", $script, $reg)) + if ($reg[1] == 'ecrire/public') // si c'est bien ecrire/public on cherche le param 'fond' + { + if (!preg_match("/'fond' => '([^']*)'/", $script, $reg)) // a defaut on cherche le param 'page' + { + if (!preg_match("/'param' => '([^']*)'/", $script, $reg)) { $reg[1] = "inconnu"; + } + } + } $incl = ',' . $reg[1] . '[.]\w$,'; - foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v){ - if (preg_match($incl, $v)) return $k; + foreach ($GLOBALS['debug_objets']['sourcefile'] as $k => $v) { + if (preg_match($incl, $v)) { + return $k; + } } + return ""; } // http://code.spip.net/@reference_boucle_debug -function reference_boucle_debug($n, $nom, $self){ +function reference_boucle_debug($n, $nom, $self) { list($skel, $boucle, $ligne) = trouve_boucle_debug($n, $nom); - if (!$boucle) + if (!$boucle) { return !$ligne ? "" : (" (" . - (($nom!=$skel) ? _T('squelette_inclus_ligne') : + (($nom != $skel) ? _T('squelette_inclus_ligne') : _T('squelette_ligne')) . " <a href='$self&var_mode_objet=$skel&var_mode_affiche=squelette&var_mode_ligne=$ligne#L$ligne'>$ligne</a>)"); - else { + } else { $self .= "&var_mode_objet=$skel$boucle&var_mode_affiche=boucle"; return !$ligne ? " (boucle\n<a href='$self#$skel$boucle'>$boucle</a>)" : @@ -409,11 +441,13 @@ function reference_boucle_debug($n, $nom, $self){ function ancre_texte($texte, $fautifs = array(), $nocpt = false) { $var_mode_ligne = _request('var_mode_ligne'); - if ($var_mode_ligne) $fautifs[] = array($var_mode_ligne); + if ($var_mode_ligne) { + $fautifs[] = array($var_mode_ligne); + } $res = ''; $s = highlight_string($texte, true); - if (substr($s, 0, 6)=='<code>'){ + if (substr($s, 0, 6) == '<code>') { $s = substr($s, 6); $res = '<code>'; } @@ -432,15 +466,18 @@ function ancre_texte($texte, $fautifs = array(), $nocpt = false) { $i = 1; $flignes = array(); $loc = array(0, 0); - foreach ($fautifs as $lc) - if (is_array($lc)){ + foreach ($fautifs as $lc) { + if (is_array($lc)) { $l = array_shift($lc); $flignes[$l] = $lc; - } else $flignes[$lc] = $loc; + } else { + $flignes[$lc] = $loc; + } + } $ancre = md5($texte); - foreach ($tableau as $ligne){ - if (isset($flignes[$i])){ + foreach ($tableau as $ligne) { + if (isset($flignes[$i])) { $ligne = str_replace(' ', ' ', $ligne); $indexmesg = $flignes[$i][1]; $err = textebrut($flignes[$i][2]); @@ -459,43 +496,41 @@ function ancre_texte($texte, $fautifs = array(), $nocpt = false) { } return "<div id='T$ancre'>" - . '<div onclick="' - . "jQuery(this).parent().find('a').toggle();" - . '" title="' - . _T('masquer_colonne') - . '" style="cursor: pointer;">' - . ($nocpt ? '' : _T('info_numero_abbreviation')) - . "</div> + . '<div onclick="' + . "jQuery(this).parent().find('a').toggle();" + . '" title="' + . _T('masquer_colonne') + . '" style="cursor: pointer;">' + . ($nocpt ? '' : _T('info_numero_abbreviation')) + . "</div> " . $res . "</div>\n"; } // l'environnement graphique du debuggueur -function debusquer_squelette($fonc, $mode, $self){ +function debusquer_squelette($fonc, $mode, $self) { - if ($mode!=='validation'){ - if (isset($GLOBALS['debug_objets']['sourcefile']) and $GLOBALS['debug_objets']['sourcefile']){ + if ($mode !== 'validation') { + if (isset($GLOBALS['debug_objets']['sourcefile']) and $GLOBALS['debug_objets']['sourcefile']) { $res = "<div id='spip-boucles'>\n" . debusquer_navigation_squelettes($self) . "</div>"; - } - else + } else { $res = ''; - if ($fonc){ + } + if ($fonc) { $id = " id='$fonc'"; - if (!empty($GLOBALS['debug_objets'][$mode][$fonc])){ + if (!empty($GLOBALS['debug_objets'][$mode][$fonc])) { list($legend, $texte, $res2) = debusquer_source($fonc, $mode); $texte .= $res2; - } - elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) { + } elseif (!empty($GLOBALS['debug_objets'][$mode][$fonc . 'tout'])) { $legend = _T('zbug_' . $mode); $texte = $GLOBALS['debug_objets'][$mode][$fonc . 'tout']; $texte = ancre_texte($texte, array('', '')); } - } - else { + } else { if (strlen(trim($res))) { - return "<img src='".chemin_image('compat-16.png')."' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>"; + return "<img src='" . chemin_image('compat-16.png') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res</div>"; } else { // cas de l'appel sur erreur: montre la page return isset($GLOBALS['debug_objets']['resultat']['tout']) @@ -503,45 +538,48 @@ function debusquer_squelette($fonc, $mode, $self){ : ''; } } - } - else { + } else { $valider = charger_fonction('valider', 'xml'); $val = $valider($GLOBALS['debug_objets']['validation'][$fonc . 'tout']); // Si erreur, signaler leur nombre dans le formulaire admin $GLOBALS['debug_objets']['validation'] = $val->err ? count($val->err) : ''; list($texte, $err) = emboite_texte($val, $fonc, $self); - if ($err===false) + if ($err === false) { $err = _T('impossible'); - elseif ($err===true) + } elseif ($err === true) { $err = _T('correcte'); - else + } else { $err = ": $err"; + } $legend = _T('validation') . ' ' . $err; $res = $id = ''; } + return !trim($texte) ? '' : ( - "<img src='".chemin_image('compat-16.png')."' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res" - . "<div id='debug_boucle'><fieldset$id><legend>" - . "<a href='".$self."#f_".substr($fonc, 0, 37)."'> ↑ " - . ($legend ? $legend : $mode) - . "</a></legend>" - . $texte - . "</fieldset></div>" - . "</div>"); + "<img src='" . chemin_image('compat-16.png') . "' alt='afficher-masquer le debug' id='spip-debug-toggle' onclick=\"var x = document.getElementById('spip-debug'); (x.style.display == '' ? x.style.display = 'none' : x.style.display = '');\" /><div id='spip-debug'>$res" + . "<div id='debug_boucle'><fieldset$id><legend>" + . "<a href='" . $self . "#f_" . substr($fonc, 0, 37) . "'> ↑ " + . ($legend ? $legend : $mode) + . "</a></legend>" + . $texte + . "</fieldset></div>" + . "</div>"); } // http://code.spip.net/@emboite_texte -function emboite_texte($res, $fonc = '', $self = ''){ +function emboite_texte($res, $fonc = '', $self = '') { $errs = $res->err; $texte = $res->entete . ($errs ? '' : $res->page); - if (!$texte and !$errs) + if (!$texte and !$errs) { return array(ancre_texte('', array('', '')), false); - if (!$errs) + } + if (!$errs) { return array(ancre_texte($texte, array('', '')), true); + } - if (!isset($GLOBALS['debug_objets'])){ + if (!isset($GLOBALS['debug_objets'])) { $colors = array('#e0e0f0', '#f8f8ff'); $encore = count_occ($errs); @@ -562,13 +600,13 @@ function emboite_texte($res, $fonc = '', $self = ''){ $i = 0; $style = "style='text-align: right; padding-right: 5px'"; - foreach ($errs as $r){ + foreach ($errs as $r) { $i++; list($msg, $ligne, $col) = $r; #spip_log("$r = list($msg, $ligne, $col"); - if (isset($encore2[$msg])) + if (isset($encore2[$msg])) { $ref = ++$encore2[$msg]; - else { + } else { $encore2[$msg] = $ref = 1; } $err .= "<tr style='background-color: " @@ -593,43 +631,47 @@ function emboite_texte($res, $fonc = '', $self = ''){ . "</a></h2><table id='debut_err' style='width: 100%'>" . $err . " </table><a id='fin_err'></a>"; + return array(ancre_texte($texte, $fautifs), $err); - } - else { + } else { list($msg, $fermant, $ouvrant) = $errs[0]; $rf = reference_boucle_debug($fermant, $fonc, $self); $ro = reference_boucle_debug($ouvrant, $fonc, $self); $err = $msg . "<a href='#L" . $fermant . "'>$fermant</a>$rf<br />" . "<a href='#L" . $ouvrant . "'>$ouvrant</a>$ro"; + return array(ancre_texte($texte, array(array($ouvrant), array($fermant))), $err); } } // http://code.spip.net/@count_occ -function count_occ($regs){ +function count_occ($regs) { $encore = array(); - foreach ($regs as $r){ - if (isset($encore[$r[0]])) + foreach ($regs as $r) { + if (isset($encore[$r[0]])) { $encore[$r[0]]++; - else + } else { $encore[$r[0]] = 1; + } } + return $encore; } -function debusquer_navigation_squelettes($self){ +function debusquer_navigation_squelettes($self) { $res = ''; $boucles = !empty($GLOBALS['debug_objets']['boucle']) ? $GLOBALS['debug_objets']['boucle'] : ''; $contexte = $GLOBALS['debug_objets']['contexte']; $t_skel = _T('squelette'); - foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile){ + foreach ($GLOBALS['debug_objets']['sourcefile'] as $nom => $sourcefile) { $self2 = parametre_url($self, 'var_mode_objet', $nom); $nav = !$boucles ? '' : debusquer_navigation_boucles($boucles, $nom, $self, $sourcefile); - $temps = !isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? '' : _T('zbug_profile', array('time' => $GLOBALS['debug_objets']['profile'][$sourcefile])); + $temps = !isset($GLOBALS['debug_objets']['profile'][$sourcefile]) ? '' : _T('zbug_profile', + array('time' => $GLOBALS['debug_objets']['profile'][$sourcefile])); - $res .= "<fieldset id='f_".$nom."'><legend>" + $res .= "<fieldset id='f_" . $nom . "'><legend>" . $t_skel . ' ' . $sourcefile @@ -644,22 +686,23 @@ function debusquer_navigation_squelettes($self){ . "'>" . _T('zbug_calcul') . "</a></legend>" - . (!$temps ? '' : ("\n<span style='display:block;float:$GLOBALS['spip_lang_right']'>$temps</span><br />")) + . (!$temps ? '' : ("\n<span style='display:block;float:" . $GLOBALS['spip_lang_right'] . "'>$temps</span><br />")) . debusquer_contexte($contexte[$sourcefile]) - . (!$nav ? '' : ("<table width='100%'>\n$nav</table>\n")) - . "</fieldset>\n"; + . (!$nav ? '' : ("<table width='100%'>\n$nav</table>\n")) + . "</fieldset>\n"; } + return $res; } -function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source){ +function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source) { $i = 0; $res = ''; $var_mode_objet = _request('var_mode_objet'); $gram = preg_match('/[.](\w+)$/', $nom_source, $r) ? $r[1] : ''; - foreach ($boucles as $objet => $boucle){ - if (substr($objet, 0, strlen($nom_skel))==$nom_skel){ + foreach ($boucles as $objet => $boucle) { + if (substr($objet, 0, strlen($nom_skel)) == $nom_skel) { $i++; $nom = $boucle->id_boucle; $req = $boucle->type_requete; @@ -686,7 +729,7 @@ function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source){ "'>" . _T('zbug_calcul') . "</a></td><td>\n" . - (($var_mode_objet==$objet) ? "<b>$nom</b>" : $nom) . + (($var_mode_objet == $objet) ? "<b>$nom</b>" : $nom) . "</td><td>\n" . $req . "</td><td>\n" . @@ -694,10 +737,11 @@ function debusquer_navigation_boucles($boucles, $nom_skel, $self, $nom_source){ "</td></tr>"; } } + return $res; } -function debusquer_source($objet, $affiche){ +function debusquer_source($objet, $affiche) { $quoi = $GLOBALS['debug_objets'][$affiche][$objet]; if (!empty($GLOBALS['debug_objets']['boucle'][$objet]->id_boucle)) { $nom = $GLOBALS['debug_objets']['boucle'][$objet]->id_boucle; @@ -706,10 +750,10 @@ function debusquer_source($objet, $affiche){ } $res2 = ""; - if ($affiche=='resultat'){ + if ($affiche == 'resultat') { $legend = $nom; $req = $GLOBALS['debug_objets']['requete'][$objet]; - if (function_exists('_mysql_traite_query')){ + if (function_exists('_mysql_traite_query')) { $c = strtolower(_request('connect')); $c = $GLOBALS['connexions'][$c ? $c : 0]['prefixe']; $req = _mysql_traite_query($req, '', $c); @@ -724,11 +768,11 @@ function debusquer_source($objet, $affiche){ // eviter l'affichage de milliers de lignes // personnalisation possible dans mes_options $max_aff = defined('_MAX_DEBUG_AFF') ? _MAX_DEBUG_AFF : 50; - while ($retours_sql = sql_fetch($ress_req)){ - if ($num<=$max_aff){ - $brut_sql .= "<h3>" . ($num==1 ? $num . " sur " . sql_count($ress_req) : $num) . "</h3>"; + while ($retours_sql = sql_fetch($ress_req)) { + if ($num <= $max_aff) { + $brut_sql .= "<h3>" . ($num == 1 ? $num . " sur " . sql_count($ress_req) : $num) . "</h3>"; $brut_sql .= "<p>"; - foreach ($retours_sql as $key => $val){ + foreach ($retours_sql as $key => $val) { $brut_sql .= "<strong>" . $key . "</strong> => " . spip_htmlspecialchars(couper($val, 150)) . "<br />\n"; } $brut_sql .= "</p>"; @@ -736,26 +780,23 @@ function debusquer_source($objet, $affiche){ $num++; } $res2 = interdire_scripts($brut_sql); - foreach ($quoi as $view){ + foreach ($quoi as $view) { // ne pas afficher les $contexte_inclus $view = preg_replace(",<\?php.+\?[>],Uims", "", $view); - if ($view){ + if ($view) { $res2 .= "\n<br /><fieldset>" . interdire_scripts($view) . "</fieldset>"; } } - } - elseif ($affiche=='code'){ + } elseif ($affiche == 'code') { $legend = $nom; $res = ancre_texte("<" . "?php\n" . $quoi . "\n?" . ">"); - } - elseif ($affiche=='boucle'){ + } elseif ($affiche == 'boucle') { $legend = _T('zbug_boucle') . ' ' . $nom; // Le compilateur prefixe le nom des boucles par l'extension du fichier source. $gram = preg_match('/^([^_]+)_/', $objet, $r) ? $r[1] : ''; $res = ancre_texte(public_decompiler($quoi, $gram, 0, 'boucle')); - } - elseif ($affiche=='squelette'){ + } elseif ($affiche == 'squelette') { $legend = $GLOBALS['debug_objets']['sourcefile'][$objet]; $res = ancre_texte($GLOBALS['debug_objets']['squelette'][$objet]); } @@ -764,31 +805,31 @@ function debusquer_source($objet, $affiche){ } // http://code.spip.net/@debusquer_entete -function debusquer_entete($titre, $corps){ +function debusquer_entete($titre, $corps) { include_spip('balise/formulaire_admin'); include_spip('public/assembler'); // pour inclure_balise_dynamique include_spip('inc/texte'); // pour corriger_typo return _DOCTYPE_ECRIRE . - html_lang_attributes() . - "<head>\n<title>" . - ('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' . - _T('admin_debug') . ' ' . $titre . ' (' . - supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) . - ")</title>\n" . - "<meta http-equiv='Content-Type' content='text/html" . - (($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') . - "' />\n" . - http_script('', 'jquery.js') - . "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css')) - . "' type='text/css' />" . - "</head>\n" . - "<body style='margin:0 10px;'>\n" . - "<div id='spip-debug-header'>" . - $corps . - inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) . - '</div></body></html>'; + html_lang_attributes() . + "<head>\n<title>" . + ('SPIP ' . $GLOBALS['spip_version_affichee'] . ' ' . + _T('admin_debug') . ' ' . $titre . ' (' . + supprimer_tags(corriger_typo($GLOBALS['meta']['nom_site']))) . + ")</title>\n" . + "<meta http-equiv='Content-Type' content='text/html" . + (($c = $GLOBALS['meta']['charset']) ? "; charset=$c" : '') . + "' />\n" . + http_script('', 'jquery.js') + . "<link rel='stylesheet' href='" . url_absolue(find_in_path('spip_admin.css')) + . "' type='text/css' />" . + "</head>\n" . + "<body style='margin:0 10px;'>\n" . + "<div id='spip-debug-header'>" . + $corps . + inclure_balise_dynamique(balise_FORMULAIRE_ADMIN_dyn('spip-admin-float', $GLOBALS['debug_objets']), false) . + '</div></body></html>'; } ?> diff --git a/ecrire/public/decompiler.php b/ecrire/public/decompiler.php index 00a8b49fc0..7b2260de2c 100644 --- a/ecrire/public/decompiler.php +++ b/ecrire/public/decompiler.php @@ -10,12 +10,13 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Decompilation de l'arbre de syntaxe abstraite d'un squelette SPIP -function decompiler_boucle($struct, $fmt = '', $prof = 0) -{ +function decompiler_boucle($struct, $fmt = '', $prof = 0) { $nom = $struct->id_boucle; $avant = decompiler_($struct->avant, $fmt, $prof); $apres = decompiler_($struct->apres, $fmt, $prof); @@ -24,98 +25,112 @@ function decompiler_boucle($struct, $fmt = '', $prof = 0) $type = $struct->sql_serveur ? "$struct->sql_serveur:" : ''; $type .= ($struct->type_requete ? $struct->type_requete : - $struct->table_optionnelle); + $struct->table_optionnelle); - if ($struct->jointures_explicites) - $type .= " " . $struct->jointures_explicites; - if ($struct->table_optionnelle) - $type .= "?"; + if ($struct->jointures_explicites) { + $type .= " " . $struct->jointures_explicites; + } + if ($struct->table_optionnelle) { + $type .= "?"; + } // Revoir le cas de la boucle recursive $crit = $struct->param; if ($crit AND !is_array($crit[0])) { $type = strtolower($type) . array_shift($crit); } - $crit = decompiler_criteres($struct, $fmt, $prof) ; + $crit = decompiler_criteres($struct, $fmt, $prof); $f = 'format_boucle_' . $fmt; + return $f($avant, $nom, $type, $crit, $milieu, $apres, $altern, $prof); } - -function decompiler_include($struct, $fmt = '', $prof = 0) -{ + +function decompiler_include($struct, $fmt = '', $prof = 0) { $res = array(); - foreach($struct->param ? $struct->param : array() as $couple) { + foreach ($struct->param ? $struct->param : array() as $couple) { array_shift($couple); - foreach($couple as $v) { - $res[]= decompiler_($v, $fmt, $prof); + foreach ($couple as $v) { + $res[] = decompiler_($v, $fmt, $prof); } } $file = is_string($struct->texte) ? $struct->texte : decompiler_($struct->texte, $fmt, $prof); $f = 'format_inclure_' . $fmt; + return $f($file, $res, $prof); } -function decompiler_texte($struct, $fmt = '', $prof = 0) -{ +function decompiler_texte($struct, $fmt = '', $prof = 0) { $f = 'format_texte_' . $fmt; + return strlen($struct->texte) ? $f($struct->texte, $prof) : ''; } -function decompiler_polyglotte($struct, $fmt = '', $prof = 0) -{ +function decompiler_polyglotte($struct, $fmt = '', $prof = 0) { $f = 'format_polyglotte_' . $fmt; + return $f($struct->traductions, $prof); } -function decompiler_idiome($struct, $fmt = '', $prof = 0) -{ +function decompiler_idiome($struct, $fmt = '', $prof = 0) { $args = array(); foreach ($struct->arg as $k => $v) { - $args[$k]= public_decompiler($v, $fmt, $prof); + $args[$k] = public_decompiler($v, $fmt, $prof); } - $filtres = decompiler_liste($struct->param, $fmt, $prof); + $filtres = decompiler_liste($struct->param, $fmt, $prof); $f = 'format_idiome_' . $fmt; + return $f($struct->nom_champ, $struct->module, $args, $filtres, $prof); } -function decompiler_champ($struct, $fmt = '', $prof = 0) -{ +function decompiler_champ($struct, $fmt = '', $prof = 0) { $avant = decompiler_($struct->avant, $fmt, $prof); $apres = decompiler_($struct->apres, $fmt, $prof); $args = $filtres = ''; if ($p = $struct->param) { - if ($p[0][0]==='') - $args = decompiler_liste(array(array_shift($p)), $fmt, $prof); + if ($p[0][0] === '') { + $args = decompiler_liste(array(array_shift($p)), $fmt, $prof); + } $filtres = decompiler_liste($p, $fmt, $prof); } $f = 'format_champ_' . $fmt; + return $f($struct->nom_champ, $struct->nom_boucle, $struct->etoile, $avant, $apres, $args, $filtres, $prof); } function decompiler_liste($sources, $fmt = '', $prof = 0) { - if (!is_array($sources)) return ''; + if (!is_array($sources)) { + return ''; + } $f = 'format_liste_' . $fmt; $res = ''; - foreach($sources as $arg) { - if (!is_array($arg)) { - continue; // ne devrait pas arriver. - } else {$r = array_shift($arg);} + foreach ($sources as $arg) { + if (!is_array($arg)) { + continue; // ne devrait pas arriver. + } else { + $r = array_shift($arg); + } $args = array(); - foreach($arg as $v) { - // cas des arguments entoures de ' ou " - if ((count($v) == 1) - AND $v[0]->type=='texte' - AND (strlen($v[0]->apres) == 1) - AND $v[0]->apres == $v[0]->avant) - $args[]= $v[0]->avant . $v[0]->texte . $v[0]->apres; - else $args[]= decompiler_($v, $fmt, 0-$prof); + foreach ($arg as $v) { + // cas des arguments entoures de ' ou " + if ((count($v) == 1) + AND $v[0]->type == 'texte' + AND (strlen($v[0]->apres) == 1) + AND $v[0]->apres == $v[0]->avant + ) { + $args[] = $v[0]->avant . $v[0]->texte . $v[0]->apres; + } else { + $args[] = decompiler_($v, $fmt, 0-$prof); + } + } + if (($r !== '') OR $args) { + $res .= $f($r, $args, $prof); } - if (($r!=='') OR $args) $res .= $f($r, $args, $prof); } + return $res; } @@ -125,75 +140,92 @@ function decompiler_liste($sources, $fmt = '', $prof = 0) { // - les champs sont implicitement etendus (crochets implicites mais interdits) function decompiler_criteres($boucle, $fmt = '', $prof = 0) { $sources = $boucle->param; - if (!is_array($sources)) return ''; + if (!is_array($sources)) { + return ''; + } $res = ''; $f = 'format_critere_' . $fmt; - foreach($sources as $crit) { - if (!is_array($crit)) continue; // boucle recursive + foreach ($sources as $crit) { + if (!is_array($crit)) { + continue; + } // boucle recursive array_shift($crit); $args = array(); - foreach($crit as $i => $v) { - if ((count($v) == 1) - AND $v[0]->type=='texte' - AND $v[0]->apres) - $args[]= array(array('texte', ( $v[0]->apres . $v[0]->texte . $v[0]->apres))); - else { - $res2 = array(); - foreach($v as $k => $p) { - if (isset($p->type) - AND function_exists($d = 'decompiler_' . $p->type)) { - $r = $d($p, $fmt, (0-$prof), @$v[$k+1]); - $res2[]= array($p->type, $r); - } else spip_log("critere $i / $k mal forme"); - } - $args[]= $res2; - } + foreach ($crit as $i => $v) { + if ((count($v) == 1) + AND $v[0]->type == 'texte' + AND $v[0]->apres + ) { + $args[] = array(array('texte', ($v[0]->apres . $v[0]->texte . $v[0]->apres))); + } else { + $res2 = array(); + foreach ($v as $k => $p) { + if (isset($p->type) + AND function_exists($d = 'decompiler_' . $p->type) + ) { + $r = $d($p, $fmt, (0-$prof), @$v[$k+1]); + $res2[] = array($p->type, $r); + } else { + spip_log("critere $i / $k mal forme"); + } + } + $args[] = $res2; + } } $res .= $f($args); } + return $res; } -function decompiler_($liste, $fmt = '', $prof = 0) -{ - if (!is_array($liste)) return ''; +function decompiler_($liste, $fmt = '', $prof = 0) { + if (!is_array($liste)) { + return ''; + } $prof2 = ($prof < 0) ? ($prof-1) : ($prof+1); $contenu = array(); - foreach($liste as $k => $p) { - if (!isset($p->type)) continue; #?????? - $d = 'decompiler_' . $p->type; - $next = isset($liste[$k+1]) ? $liste[$k+1] : false; - // Forcer le champ etendu si son source (pas les reecritures) - // contenait des args et s'il est suivi d'espaces, - // le champ simple les eliminant est un bug helas perenne. - - if ($next - AND ($next->type == 'texte') - AND $p->type == 'champ' - AND !$p->apres - AND !$p->avant - AND $p->fonctions) { - $n = strlen($next->texte) - strlen(ltrim($next->texte)); - if ($n) { - $champ = new Texte; - $champ->texte = substr($next->texte, 0, $n); - $champ->ligne = $p->ligne; - $p->apres = array($champ); - $next->texte = substr($next->texte, $n); - } - } - $contenu[] = array($d($p, $fmt, $prof2), $p->type); + foreach ($liste as $k => $p) { + if (!isset($p->type)) { + continue; + } #?????? + $d = 'decompiler_' . $p->type; + $next = isset($liste[$k+1]) ? $liste[$k+1] : false; + // Forcer le champ etendu si son source (pas les reecritures) + // contenait des args et s'il est suivi d'espaces, + // le champ simple les eliminant est un bug helas perenne. + + if ($next + AND ($next->type == 'texte') + AND $p->type == 'champ' + AND !$p->apres + AND !$p->avant + AND $p->fonctions + ) { + $n = strlen($next->texte)-strlen(ltrim($next->texte)); + if ($n) { + $champ = new Texte; + $champ->texte = substr($next->texte, 0, $n); + $champ->ligne = $p->ligne; + $p->apres = array($champ); + $next->texte = substr($next->texte, $n); + } + } + $contenu[] = array($d($p, $fmt, $prof2), $p->type); } $f = 'format_suite_' . $fmt; + return $f($contenu); } -function public_decompiler($liste, $fmt = '', $prof = 0, $quoi = '') -{ - if (!include_spip('public/format_' . $fmt)) return "'$fmt'?"; +function public_decompiler($liste, $fmt = '', $prof = 0, $quoi = '') { + if (!include_spip('public/format_' . $fmt)) { + return "'$fmt'?"; + } $f = 'decompiler_' . $quoi; + return $f($liste, $fmt, $prof); } + ?> diff --git a/ecrire/public/evaluer_page.php b/ecrire/public/evaluer_page.php index 327487dda4..45c73be89e 100644 --- a/ecrire/public/evaluer_page.php +++ b/ecrire/public/evaluer_page.php @@ -10,11 +10,13 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Evaluer la page produite par un squelette - * + * * Évalue une page pour la transformer en texte statique * Elle peut contenir un < ?xml a securiser avant eval * ou du php d'origine inconnue @@ -36,12 +38,13 @@ if (empty($page['process_ins']) OR $page['process_ins'] != 'html') { // restaurer l'etat des notes avant calcul if (isset($page['notes']) AND $page['notes'] - AND $notes = charger_fonction("notes","inc",true)){ - $notes($page['notes'],'restaurer_etat'); + AND $notes = charger_fonction("notes", "inc", true) + ) { + $notes($page['notes'], 'restaurer_etat'); } ob_start(); - if (strpos($page['texte'],'?xml')!==false) { - $page['texte'] = str_replace('<'.'?xml', "<\1?xml", $page['texte']); + if (strpos($page['texte'], '?xml') !== false) { + $page['texte'] = str_replace('<' . '?xml', "<\1?xml", $page['texte']); } $res = eval('?' . '>' . $page['texte']); @@ -53,15 +56,15 @@ if (empty($page['process_ins']) OR $page['process_ins'] != 'html') { if (false === $res) { $page['codephp'] = $page['texte']; $page['texte'] = '<!-- erreur -->'; - } - else { + } else { $page['texte'] = $eval; } $page['process_ins'] = 'html'; - if (strpos($page['texte'],'?xml')!==false) - $page['texte'] = str_replace("<\1?xml", '<'.'?xml', $page['texte']); + if (strpos($page['texte'], '?xml') !== false) { + $page['texte'] = str_replace("<\1?xml", '<' . '?xml', $page['texte']); + } } page_base_href($page['texte']); diff --git a/ecrire/public/format_html.php b/ecrire/public/format_html.php index 082a092396..7586a26333 100644 --- a/ecrire/public/format_html.php +++ b/ecrire/public/format_html.php @@ -10,112 +10,126 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} -function format_boucle_html ($avant, $nom, $type, $crit, $corps, $apres, $altern, $prof) -{ +function format_boucle_html($avant, $nom, $type, $crit, $corps, $apres, $altern, $prof) { $avant = $avant ? "<B$nom>$avant" : ""; $apres = $apres ? "$apres</B$nom>" : ""; $altern = $altern ? "$altern<//B$nom>" : ""; - if (!$corps) $corps = " />"; else $corps = ">$corps</BOUCLE$nom>"; + if (!$corps) { + $corps = " />"; + } else { + $corps = ">$corps</BOUCLE$nom>"; + } + return "$avant<BOUCLE$nom($type)$crit$corps$apres$altern"; } -function format_inclure_html ($file, $args, $prof) -{ - if (strpos($file, '#')===false) - $t = $file ? ("(" . $file . ")") : "" ; - else { +function format_inclure_html($file, $args, $prof) { + if (strpos($file, '#') === false) { + $t = $file ? ("(" . $file . ")") : ""; + } else { $t = "{fond=" . $file . '}'; } - $args = !$args ? '' : ("{" . join(", ",$args) . "}"); - return ("<INCLURE" . $t . $args . ">"); + $args = !$args ? '' : ("{" . join(", ", $args) . "}"); + + return ("<INCLURE" . $t . $args . ">"); } -function format_polyglotte_html ($args, $prof) -{ - $contenu = array(); - foreach($args as $l=>$t) - $contenu[]= ($l ? "[$l]" : '') . $t; +function format_polyglotte_html($args, $prof) { + $contenu = array(); + foreach ($args as $l => $t) { + $contenu[] = ($l ? "[$l]" : '') . $t; + } + return ("<multi>" . join(" ", $contenu) . "</multi>"); } -function format_idiome_html ($nom, $module, $args, $filtres, $prof) -{ - foreach ($args as $k => $v) $args[$k] = "$k=$v"; +function format_idiome_html($nom, $module, $args, $filtres, $prof) { + foreach ($args as $k => $v) { + $args[$k] = "$k=$v"; + } $args = (!$args ? '' : ('{' . join(',', $args) . '}')); + return ("<:" . ($module ? "$module:" : "") . $nom . $args . $filtres . ":>"); } -function format_champ_html ($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) -{ +function format_champ_html($nom, $boucle, $etoile, $avant, $apres, $args, $filtres, $prof) { $nom = "#" - . ($boucle ? ($boucle . ":") : "") - . $nom - . $etoile - . $args - . $filtres; + . ($boucle ? ($boucle . ":") : "") + . $nom + . $etoile + . $args + . $filtres; // Determiner si c'est un champ etendu, $s = ($avant OR $apres OR $filtres - OR (strpos($args, '(#') !==false)); + OR (strpos($args, '(#') !== false)); return ($s ? "[$avant($nom)$apres]" : $nom); } -function format_critere_html ($critere) -{ +function format_critere_html($critere) { foreach ($critere as $k => $crit) { $crit_s = ''; foreach ($crit as $operande) { list($type, $valeur) = $operande; - if ($type == 'champ' AND $valeur[0]=='[') { - $valeur = substr($valeur,1,-1); - if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) - $valeur = substr($valeur,1,-1); + if ($type == 'champ' AND $valeur[0] == '[') { + $valeur = substr($valeur, 1, -1); + if (preg_match(',^[(](#[^|]*)[)]$,sS', $valeur)) { + $valeur = substr($valeur, 1, -1); + } } $crit_s .= $valeur; } $critere[$k] = $crit_s; } + return (!$critere ? "" : ("{" . join(",", $critere) . "}")); } -function format_liste_html ($fonc, $args, $prof) -{ - return ((($fonc!=='') ? "|$fonc" : $fonc) - . (!$args ? "" : ("{" . join(",", $args) . "}"))); +function format_liste_html($fonc, $args, $prof) { + return ((($fonc !== '') ? "|$fonc" : $fonc) + . (!$args ? "" : ("{" . join(",", $args) . "}"))); } // Concatenation sans separateur: verifier qu'on ne cree pas de faux lexemes -function format_suite_html ($args) -{ - for($i=0; $i < count($args)-1; $i++) { +function format_suite_html($args) { + for ($i = 0; $i < count($args)-1; $i++) { list($texte, $type) = $args[$i]; list($texte2, $type2) = $args[$i+1]; - if (!$texte OR !$texte2) continue; - $c1 = substr($texte,-1); + if (!$texte OR !$texte2) { + continue; + } + $c1 = substr($texte, -1); if ($type2 !== 'texte') { - // si un texte se termine par ( et est suivi d'un champ - // ou assimiles, forcer la notation pleine - if ($c1 == '(' AND substr($texte2,0,1) == '#') + // si un texte se termine par ( et est suivi d'un champ + // ou assimiles, forcer la notation pleine + if ($c1 == '(' AND substr($texte2, 0, 1) == '#') { $args[$i+1][0] = '[(' . $texte2 . ')]'; + } } else { - if ($type == 'texte') continue; + if ($type == 'texte') { + continue; + } // si un champ ou assimiles est suivi d'un texte // et si celui-ci commence par un caractere de champ // forcer la notation pleine - if (($c1 == '}' AND substr(ltrim($texte2),0,1) == '|') - OR (preg_match('/[\w\d_*]/', $c1) AND preg_match('/^[\w\d_*{|]/', $texte2))) + if (($c1 == '}' AND substr(ltrim($texte2), 0, 1) == '|') + OR (preg_match('/[\w\d_*]/', $c1) AND preg_match('/^[\w\d_*{|]/', $texte2)) + ) { $args[$i][0] = '[(' . $texte . ')]'; + } } } + return join("", array_map('array_shift', $args)); } -function format_texte_html ($texte) -{ +function format_texte_html($texte) { return $texte; } diff --git a/ecrire/public/interfaces.php b/ecrire/public/interfaces.php index a685ea0608..df124ace74 100644 --- a/ecrire/public/interfaces.php +++ b/ecrire/public/interfaces.php @@ -14,9 +14,11 @@ * Définition des noeuds de l'arbre de syntaxe abstraite * * @package SPIP\Core\Compilateur\AST -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** @@ -25,7 +27,7 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * Objet simple pour stocker le nom du fichier, la ligne, la boucle * permettant entre autre de localiser le lieu d'une erreur de compilation. * Cette structure est nécessaire au traitement d'erreur à l'exécution. - * + * * Le champ code est inutilisé dans cette classe seule, mais harmonise * le traitement d'erreurs. * @@ -38,7 +40,7 @@ class Contexte { * Sert pour la gestion d'erreur et la production de code dependant du contexte * * Peut contenir les index : - * + * * - nom : Nom du fichier de cache * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) * - sourcefile : Chemin du squelette @@ -48,27 +50,36 @@ class Contexte { * - session : Pour un cache sessionné par auteur * - niv : Niveau de tabulation * - * @var array */ + * @var array + */ public $descr = array(); /** * Identifiant de la boucle - * @var string */ + * + * @var string + */ public $id_boucle = ''; /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; /** * Langue d'exécution - * @var string */ + * + * @var string + */ public $lang = ''; /** * Résultat de la compilation: toujours une expression PHP - * @var string */ + * + * @var string + */ public $code = ''; } @@ -77,35 +88,45 @@ class Contexte { * Description d'un texte * * @package SPIP\Core\Compilateur\AST -**/ + **/ class Texte { /** - * Type de noeud - * @var string */ + * Type de noeud + * + * @var string + */ public $type = 'texte'; /** * Le texte - * @var string */ + * + * @var string + */ public $texte; /** * Contenu avant le texte. * * Vide ou apostrophe simple ou double si le texte en était entouré - * @var string|array */ + * + * @var string|array + */ public $avant = ""; /** * Contenu après le texte. * * Vide ou apostrophe simple ou double si le texte en était entouré - * @var string|array */ + * + * @var string|array + */ public $apres = ""; /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; } @@ -113,39 +134,51 @@ class Texte { * Description d'une inclusion de squelette * * @package SPIP\Core\Compilateur\AST -**/ + **/ class Inclure { /** - * Type de noeud - * @var string */ + * Type de noeud + * + * @var string + */ public $type = 'include'; /** * Nom d'un fichier inclu - * + * * - Objet Texte si inclusion d'un autre squelette * - chaîne si inclusion d'un fichier PHP directement - * @var string|Texte */ + * + * @var string|Texte + */ public $texte; /** * Inutilisé, propriété générique de l'AST - * @var string|array */ + * + * @var string|array + */ public $avant = ''; /** * Inutilisé, propriété générique de l'AST - * @var string|array */ + * + * @var string|array + */ public $apres = ''; /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; /** * Valeurs des paramètres - * @var array */ + * + * @var array + */ public $param = array(); } @@ -154,82 +187,109 @@ class Inclure { * Description d'une boucle * * @package SPIP\Core\Compilateur\AST -**/ + **/ class Boucle { /** - * Type de noeud - * @var string */ + * Type de noeud + * + * @var string + */ public $type = 'boucle'; /** * Identifiant de la boucle - * @var string */ + * + * @var string + */ public $id_boucle; /** * Identifiant de la boucle parente - * @var string */ - public $id_parent =''; + * + * @var string + */ + public $id_parent = ''; /** * Partie optionnelle avant - * @var string|array */ + * + * @var string|array + */ public $avant = ''; /** * Pour chaque élément - * @var string|array */ + * + * @var string|array + */ public $milieu = ''; /** * Partie optionnelle après - * @var string|array */ + * + * @var string|array + */ public $apres = ''; /** * Partie alternative, si pas de résultat dans la boucle - * @var string|array */ + * + * @var string|array + */ public $altern = ''; /** * La boucle doit-elle sélectionner la langue ? - * @var string|null */ + * + * @var string|null + */ public $lang_select; /** * Alias de table d'application de la requête ou nom complet de la table SQL - * @var string|null */ + * + * @var string|null + */ public $type_requete; /** * La table est elle optionnelle ? - * + * * Si oui, aucune erreur ne sera générée si la table demandée n'est pas présente - * @var bool */ + * + * @var bool + */ public $table_optionnelle = false; /** * Nom du fichier de connexion - * @var string */ + * + * @var string + */ public $sql_serveur = ''; /** * Paramètres de la boucle - * + * * Description des paramètres passés à la boucle, qui servent ensuite * au calcul des critères * - * @var array */ + * @var array + */ public $param = array(); /** * Critères de la boucle - * @var Critere[] */ + * + * @var Critere[] + */ public $criteres = array(); /** * Textes insérés entre 2 éléments de boucle (critère inter) - * @var string[] */ + * + * @var string[] + */ public $separateur = array(); /** @@ -237,8 +297,10 @@ class Boucle { * * Les jointures par défaut de la table sont complétées en priorité * des jointures déclarées explicitement sur la boucle + * * @see base_trouver_table_dist() - * @var array */ + * @var array + */ public $jointures = array(); /** @@ -247,20 +309,26 @@ class Boucle { * Ces jointures sont utilisées en priorité par rapport aux jointures * normales possibles pour retrouver les colonnes demandées extérieures * à la boucle. - * @var string|bool */ + * + * @var string|bool + */ public $jointures_explicites = false; /** * Nom de la variable PHP stockant le noms de doublons utilisés "$doublons_index" - * @var string|null */ + * + * @var string|null + */ public $doublons; /** * Code PHP ajouté au début de chaque itération de boucle. * * Utilisé entre autre par les critères {pagination}, {n-a,b}, {a/b}... - * @var string */ - public $partie=""; + * + * @var string + */ + public $partie = ""; /** * Nombre de divisions de la boucle, d'éléments à afficher, @@ -268,8 +336,9 @@ class Boucle { * * Dans les critères limitant le nombre d'éléments affichés * {a,b}, {a,n-b}, {a/b}, {pagination b}, b est affecté à total_parties. - * - * @var string */ + * + * @var string + */ public $total_parties = ""; /** @@ -277,9 +346,10 @@ class Boucle { * * Utilisé entre autre par les critères {pagination}, {a,b}, {a/b} * pour initialiser les variables de début et de fin d'itération. - * - * @var string */ - public $mode_partie=''; + * + * @var string + */ + public $mode_partie = ''; /** * Identifiant d'une boucle qui appelle celle-ci de manière récursive @@ -289,7 +359,8 @@ class Boucle { * boucle (identifiant) reçoit dans cette propriété l'identifiant * de l'appelant (rec) * - * @var string */ + * @var string + */ public $externe = ''; // champs pour la construction de la requete SQL @@ -298,8 +369,9 @@ class Boucle { * Liste des champs à récupérer par la boucle * * Expression 'table.nom_champ' ou calculée 'nom_champ AS x' - * - * @var string[] */ + * + * @var string[] + */ public $select = array(); /** @@ -309,20 +381,22 @@ class Boucle { * d'alias au nom de la table ; la valeur est le nom de la table SQL désirée. * * L'index 0 peut définir le type de sources de données de l'itérateur DATA - * - * @var string[] */ + * + * @var string[] + */ public $from = array(); /** * Liste des alias / type de jointures utilisées dans la boucle - * + * * L'index est le nom d'alias (comme pour la propriété $from), et la valeur * un type de jointure parmi 'INNER', 'LEFT', 'RIGHT', 'OUTER'. - * + * * Lorsque le type n'est pas déclaré pour un alias, c'est 'INNER' * qui sera utilisé par défaut (créant donc un INNER JOIN). * - * @var string[] */ + * @var string[] + */ public $from_type = array(); /** @@ -332,19 +406,19 @@ class Boucle { * en fonctions des conditions transmises dans ce tableau. * * Ce tableau peut avoir plusieurs niveaux de profondeur. - * + * * Les éléments du premier niveau sont reliés par des AND, donc * chaque élément ajouté directement au where par * $boucle->where[] = array(...) ou $boucle->where[] = "'expression'" * est une condition AND en plus. - * + * * Par contre, lorsqu'on indique un tableau, il peut décrire des relations * internes différentes. Soit $expr un tableau d'expressions quelconques de 3 valeurs : * $expr = array(operateur, val1, val2) - * + * * Ces 3 valeurs sont des expressions PHP. L'index 0 désigne l'opérateur * à réaliser tel que : - * + * * - "'='" , "'>='", "'<'", "'IN'", "'REGEXP'", "'LIKE'", ... : * val1 et val2 sont des champs et valeurs à utiliser dans la comparaison * suivant cet ordre : "val1 operateur val2". @@ -359,8 +433,9 @@ class Boucle { * D'autres noms sont possibles pour l'opérateur (le nombre de valeurs diffère) : * - "'SELF'", "'SUBSELECT'" : indiquent des sous requêtes * - "'?'" : indique une condition à faire évaluer (val1 ? val2 : val3) - * - * @var array */ + * + * @var array + */ public $where = array(); var $join = array(); @@ -369,9 +444,9 @@ class Boucle { var $group = array(); var $order = array(); var $default_order = array(); - var $date = 'date' ; - var $hash = "" ; - var $in = "" ; + var $date = 'date'; + var $hash = ""; + var $in = ""; var $sous_requete = false; /** @@ -379,14 +454,16 @@ class Boucle { * * Il sert à insérer le code calculant une hierarchie * - * @var string */ + * @var string + */ public $hierarchie = ''; /** * Indique la présence d'un critère sur le statut - * + * * @deprecated Remplacé par $boucle->modificateur['criteres']['statut'] - * @var bool */ + * @var bool + */ public $statut = false; // champs pour la construction du corps PHP @@ -396,27 +473,31 @@ class Boucle { * * Description des données de la boucle issu de trouver_table * dans le cadre de l'itérateur SQL et contenant au moins l'index 'field'. - * + * * @see base_trouver_table_dist() - * @var array */ + * @var array + */ public $show = array(); /** * Nom de la table SQL principale de la boucle, sans son préfixe * - * @var string */ + * @var string + */ public $id_table; /** * Nom de la clé primaire de la table SQL principale de la boucle * - * @var string */ + * @var string + */ public $primary; /** * Code PHP compilé de la boucle * - * @var string */ + * @var string + */ public $return; var $numrows = false; @@ -428,7 +509,7 @@ class Boucle { * Sert pour la gestion d'erreur et la production de code dependant du contexte * * Peut contenir les index : - * + * * - nom : Nom du fichier de cache * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) * - sourcefile : Chemin du squelette @@ -438,12 +519,15 @@ class Boucle { * - session : Pour un cache sessionné par auteur * - niv : Niveau de tabulation * - * @var array */ + * @var array + */ public $descr = array(); /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; @@ -455,7 +539,8 @@ class Boucle { * - 'SQL' dans le cadre d'une boucle sur une table SQL * - 'DATA' pour l'itérateur DATA, ... * - * @var string */ + * @var string + */ public $iterateur = ''; // type d'iterateur // obsoletes, conserves provisoirement pour compatibilite @@ -470,43 +555,57 @@ class Boucle { * Sous-noeud de Boucle * * @package SPIP\Core\Compilateur\AST -**/ + **/ class Critere { /** - * Type de noeud - * @var string */ + * Type de noeud + * + * @var string + */ public $type = 'critere'; /** - * Opérateur (>, <, >=, IN, ...) - * @var null|string */ + * Opérateur (>, <, >=, IN, ...) + * + * @var null|string + */ public $op; /** * Présence d'une négation (truc !op valeur) - * @var null|string */ + * + * @var null|string + */ public $not; /** * Présence d'une exclusion (!truc op valeur) - * @var null|string */ + * + * @var null|string + */ public $exclus; /** * Présence d'une condition dans le critère (truc ?) - * @var bool */ + * + * @var bool + */ public $cond = false; /** * Paramètres du critère * - $param[0] : élément avant l'opérateur * - $param[1..n] : éléments après l'opérateur - * @var array */ + * + * @var array + */ var $param = array(); /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; } @@ -514,31 +613,41 @@ class Critere { * Description d'un champ (balise SPIP) * * @package SPIP\Core\Compilateur\AST -**/ + **/ class Champ { /** - * Type de noeud - * @var string */ + * Type de noeud + * + * @var string + */ public $type = 'champ'; /** - * Nom du champ demandé. Exemple 'ID_ARTICLE' - * @var string|null */ + * Nom du champ demandé. Exemple 'ID_ARTICLE' + * + * @var string|null + */ public $nom_champ; /** * Identifiant de la boucle parente si explicité - * @var string|null */ - public $nom_boucle= ''; + * + * @var string|null + */ + public $nom_boucle = ''; /** * Partie optionnelle avant - * @var null|string|array */ + * + * @var null|string|array + */ public $avant; /** * Partie optionnelle après - * @var null|string|array */ + * + * @var null|string|array + */ public $apres; /** @@ -546,48 +655,64 @@ class Champ { * * - '*' annule les filtres automatiques * - '**' annule en plus les protections de scripts - * @var null|string */ + * + * @var null|string + */ public $etoile; /** * Arguments et filtres explicites sur la balise - * + * * - $param[0] contient les arguments de la balise * - $param[1..n] contient les filtres à appliquer à la balise - * @var array */ - public $param = array(); + * + * @var array + */ + public $param = array(); /** * Source des filtres (compatibilité) (?) - * @var array|null */ + * + * @var array|null + */ public $fonctions = array(); /** * Identifiant de la boucle - * @var string */ + * + * @var string + */ public $id_boucle = ''; /** * AST du squelette, liste de toutes les boucles - * @var Boucles[] */ + * + * @var Boucles[] + */ public $boucles; /** * Alias de table d'application de la requête ou nom complet de la table SQL - * @var string|null */ + * + * @var string|null + */ public $type_requete; /** * Résultat de la compilation: toujours une expression PHP - * @var string */ + * + * @var string + */ public $code = ''; /** * Interdire les scripts - * + * * false si on est sûr de cette balise + * * @see interdire_scripts() - * @var bool */ + * @var bool + */ public $interdire_scripts = true; /** @@ -596,7 +721,7 @@ class Champ { * Sert pour la gestion d'erreur et la production de code dependant du contexte * * Peut contenir les index : - * + * * - nom : Nom du fichier de cache * - gram : Nom de la grammaire du squelette (détermine le phraseur à utiliser) * - sourcefile : Chemin du squelette @@ -606,89 +731,120 @@ class Champ { * - session : Pour un cache sessionné par auteur * - niv : Niveau de tabulation * - * @var array */ + * @var array + */ public $descr = array(); /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; /** * Drapeau pour reperer les balises calculées par une fonction explicite - * @var bool */ + * + * @var bool + */ public $balise_calculee = false; } /** * Description d'une chaîne de langue -**/ + **/ class Idiome { /** - * Type de noeud - * @var string */ + * Type de noeud + * + * @var string + */ public $type = 'idiome'; /** * Clé de traduction demandée. Exemple 'item_oui' - * @var string */ + * + * @var string + */ public $nom_champ = ""; /** * Module de langue où chercher la clé de traduction. Exemple 'medias' - * @var string */ + * + * @var string + */ public $module = ""; /** * Arguments à passer à la chaîne - * @var array */ + * + * @var array + */ public $arg = array(); /** * Filtres à appliquer au résultat - * @var array */ + * + * @var array + */ public $param = array(); /** * Source des filtres (compatibilité) (?) - * @var array|null */ + * + * @var array|null + */ public $fonctions = array(); /** * Inutilisé, propriété générique de l'AST - * @var string|array */ + * + * @var string|array + */ public $avant = ''; /** * Inutilisé, propriété générique de l'AST - * @var string|array */ + * + * @var string|array + */ public $apres = ''; /** * Identifiant de la boucle - * @var string */ + * + * @var string + */ public $id_boucle = ''; /** * AST du squelette, liste de toutes les boucles - * @var Boucles[] */ + * + * @var Boucles[] + */ public $boucles; /** * Alias de table d'application de la requête ou nom complet de la table SQL - * @var string|null */ + * + * @var string|null + */ public $type_requete; /** * Résultat de la compilation: toujours une expression PHP - * @var string */ + * + * @var string + */ public $code = ''; /** * Interdire les scripts + * * @see interdire_scripts() - * @var bool */ + * @var bool + */ public $interdire_scripts = false; /** @@ -706,12 +862,15 @@ class Idiome { * - session : Pour un cache sessionné par auteur * - niv : Niveau de tabulation * - * @var array */ + * @var array + */ public $descr = array(); /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; } @@ -719,39 +878,43 @@ class Idiome { * Description d'un texte polyglotte (<multi>) * * @package SPIP\Core\Compilateur\AST -**/ + **/ class Polyglotte { /** - * Type de noeud - * @var string */ + * Type de noeud + * + * @var string + */ public $type = 'polyglotte'; /** * Tableau des traductions possibles classées par langue * * Tableau code de langue => texte - * @var array */ + * + * @var array + */ var $traductions = array(); /** * Numéro de ligne dans le code source du squelette - * @var int */ + * + * @var int + */ public $ligne = 0; } - global $table_criteres_infixes; -$table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==', '<>', '?'); +$table_criteres_infixes = array('<', '>', '<=', '>=', '==', '===', '!=', '!==', '<>', '?'); global $exception_des_connect; $exception_des_connect[] = ''; // ne pas transmettre le connect='' par les inclure - /** * Déclarer les interfaces de la base pour le compilateur - * + * * On utilise une fonction qui initialise les valeurs, * sans écraser d'eventuelles prédéfinition dans mes_options * et les envoie dans un pipeline @@ -761,12 +924,12 @@ $exception_des_connect[] = ''; // ne pas transmettre le connect='' par les inclu * * @return void */ -function declarer_interfaces(){ +function declarer_interfaces() { - $GLOBALS['table_des_tables']['articles']='articles'; - $GLOBALS['table_des_tables']['auteurs']='auteurs'; - $GLOBALS['table_des_tables']['rubriques']='rubriques'; - $GLOBALS['table_des_tables']['hierarchie']='rubriques'; + $GLOBALS['table_des_tables']['articles'] = 'articles'; + $GLOBALS['table_des_tables']['auteurs'] = 'auteurs'; + $GLOBALS['table_des_tables']['rubriques'] = 'rubriques'; + $GLOBALS['table_des_tables']['hierarchie'] = 'rubriques'; // definition des statuts de publication $GLOBALS['table_statut'] = array(); @@ -784,58 +947,58 @@ function declarer_interfaces(){ define('_TRAITEMENT_RACCOURCIS', 'propre(%s, $connect, $Pile[0])'); define('_TRAITEMENT_TYPO_SANS_NUMERO', 'typo(supprimer_numero(%s), "TYPO", $connect, $Pile[0])'); - $GLOBALS['table_des_traitements']['BIO'][]= _TRAITEMENT_RACCOURCIS; - $GLOBALS['table_des_traitements']['CHAPO'][]= _TRAITEMENT_RACCOURCIS; - $GLOBALS['table_des_traitements']['DATE'][]= 'normaliser_date(%s)'; - $GLOBALS['table_des_traitements']['DATE_REDAC'][]= 'normaliser_date(%s)'; - $GLOBALS['table_des_traitements']['DATE_MODIF'][]= 'normaliser_date(%s)'; - $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][]= 'normaliser_date(%s)'; - $GLOBALS['table_des_traitements']['DESCRIPTIF'][]= _TRAITEMENT_RACCOURCIS; - $GLOBALS['table_des_traitements']['INTRODUCTION'][]= _TRAITEMENT_RACCOURCIS; - $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][]= _TRAITEMENT_TYPO; - $GLOBALS['table_des_traitements']['NOM'][]= _TRAITEMENT_TYPO_SANS_NUMERO; - $GLOBALS['table_des_traitements']['AUTEUR'][]= _TRAITEMENT_TYPO; - $GLOBALS['table_des_traitements']['PS'][]= _TRAITEMENT_RACCOURCIS; - $GLOBALS['table_des_traitements']['SOURCE'][]= _TRAITEMENT_TYPO; - $GLOBALS['table_des_traitements']['SOUSTITRE'][]= _TRAITEMENT_TYPO; - $GLOBALS['table_des_traitements']['SURTITRE'][]= _TRAITEMENT_TYPO; - $GLOBALS['table_des_traitements']['TAGS'][]= '%s'; - $GLOBALS['table_des_traitements']['TEXTE'][]= _TRAITEMENT_RACCOURCIS; - $GLOBALS['table_des_traitements']['TITRE'][]= _TRAITEMENT_TYPO_SANS_NUMERO; - $GLOBALS['table_des_traitements']['TYPE'][]= _TRAITEMENT_TYPO; - $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][]= _TRAITEMENT_RACCOURCIS; - $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][]= _TRAITEMENT_TYPO; - $GLOBALS['table_des_traitements']['ENV'][]= 'entites_html(%s,true)'; + $GLOBALS['table_des_traitements']['BIO'][] = _TRAITEMENT_RACCOURCIS; + $GLOBALS['table_des_traitements']['CHAPO'][] = _TRAITEMENT_RACCOURCIS; + $GLOBALS['table_des_traitements']['DATE'][] = 'normaliser_date(%s)'; + $GLOBALS['table_des_traitements']['DATE_REDAC'][] = 'normaliser_date(%s)'; + $GLOBALS['table_des_traitements']['DATE_MODIF'][] = 'normaliser_date(%s)'; + $GLOBALS['table_des_traitements']['DATE_NOUVEAUTES'][] = 'normaliser_date(%s)'; + $GLOBALS['table_des_traitements']['DESCRIPTIF'][] = _TRAITEMENT_RACCOURCIS; + $GLOBALS['table_des_traitements']['INTRODUCTION'][] = _TRAITEMENT_RACCOURCIS; + $GLOBALS['table_des_traitements']['NOM_SITE_SPIP'][] = _TRAITEMENT_TYPO; + $GLOBALS['table_des_traitements']['NOM'][] = _TRAITEMENT_TYPO_SANS_NUMERO; + $GLOBALS['table_des_traitements']['AUTEUR'][] = _TRAITEMENT_TYPO; + $GLOBALS['table_des_traitements']['PS'][] = _TRAITEMENT_RACCOURCIS; + $GLOBALS['table_des_traitements']['SOURCE'][] = _TRAITEMENT_TYPO; + $GLOBALS['table_des_traitements']['SOUSTITRE'][] = _TRAITEMENT_TYPO; + $GLOBALS['table_des_traitements']['SURTITRE'][] = _TRAITEMENT_TYPO; + $GLOBALS['table_des_traitements']['TAGS'][] = '%s'; + $GLOBALS['table_des_traitements']['TEXTE'][] = _TRAITEMENT_RACCOURCIS; + $GLOBALS['table_des_traitements']['TITRE'][] = _TRAITEMENT_TYPO_SANS_NUMERO; + $GLOBALS['table_des_traitements']['TYPE'][] = _TRAITEMENT_TYPO; + $GLOBALS['table_des_traitements']['DESCRIPTIF_SITE_SPIP'][] = _TRAITEMENT_RACCOURCIS; + $GLOBALS['table_des_traitements']['SLOGAN_SITE_SPIP'][] = _TRAITEMENT_TYPO; + $GLOBALS['table_des_traitements']['ENV'][] = 'entites_html(%s,true)'; // valeur par defaut pour les balises non listees ci-dessus - $GLOBALS['table_des_traitements']['*'][]= false; // pas de traitement, mais permet au compilo de trouver la declaration suivante + $GLOBALS['table_des_traitements']['*'][] = false; // pas de traitement, mais permet au compilo de trouver la declaration suivante // toujours securiser les DATA - $GLOBALS['table_des_traitements']['*']['DATA']= 'safehtml(%s)'; + $GLOBALS['table_des_traitements']['*']['DATA'] = 'safehtml(%s)'; // expliciter pour VALEUR qui est un champ calcule et ne sera pas protege par le catch-all * - $GLOBALS['table_des_traitements']['VALEUR']['DATA']= 'safehtml(%s)'; + $GLOBALS['table_des_traitements']['VALEUR']['DATA'] = 'safehtml(%s)'; // gerer l'affectation en 2 temps car si le pipe n'est pas encore declare, on ecrase les globales $interfaces = pipeline('declarer_tables_interfaces', - array( - 'table_des_tables'=>$GLOBALS['table_des_tables'], - 'exceptions_des_tables'=>$GLOBALS['exceptions_des_tables'], - 'table_date'=>$GLOBALS['table_date'], - 'table_titre'=>$GLOBALS['table_titre'], - 'tables_jointures'=>$GLOBALS['tables_jointures'], - 'exceptions_des_jointures'=>$GLOBALS['exceptions_des_jointures'], - 'table_des_traitements'=>$GLOBALS['table_des_traitements'], - 'table_statut'=>$GLOBALS['table_statut'], - )); - if ($interfaces){ - $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; - $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; - $GLOBALS['table_date'] = $interfaces['table_date']; - $GLOBALS['table_titre'] = $interfaces['table_titre']; - $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; - $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; - $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; - $GLOBALS['table_statut'] = $interfaces['table_statut']; + array( + 'table_des_tables' => $GLOBALS['table_des_tables'], + 'exceptions_des_tables' => $GLOBALS['exceptions_des_tables'], + 'table_date' => $GLOBALS['table_date'], + 'table_titre' => $GLOBALS['table_titre'], + 'tables_jointures' => $GLOBALS['tables_jointures'], + 'exceptions_des_jointures' => $GLOBALS['exceptions_des_jointures'], + 'table_des_traitements' => $GLOBALS['table_des_traitements'], + 'table_statut' => $GLOBALS['table_statut'], + )); + if ($interfaces) { + $GLOBALS['table_des_tables'] = $interfaces['table_des_tables']; + $GLOBALS['exceptions_des_tables'] = $interfaces['exceptions_des_tables']; + $GLOBALS['table_date'] = $interfaces['table_date']; + $GLOBALS['table_titre'] = $interfaces['table_titre']; + $GLOBALS['tables_jointures'] = $interfaces['tables_jointures']; + $GLOBALS['exceptions_des_jointures'] = $interfaces['exceptions_des_jointures']; + $GLOBALS['table_des_traitements'] = $interfaces['table_des_traitements']; + $GLOBALS['table_statut'] = $interfaces['table_statut']; } } diff --git a/ecrire/public/iterateur.php b/ecrire/public/iterateur.php index 9aa974d9fa..2f0d8240fe 100644 --- a/ecrire/public/iterateur.php +++ b/ecrire/public/iterateur.php @@ -11,16 +11,18 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Fabrique d'iterateur * permet de charger n'importe quel iterateur IterateurXXX * fourni dans le fichier iterateurs/xxx.php - * + * */ -class IterFactory{ - public static function create($iterateur, $command, $info = null){ +class IterFactory { + public static function create($iterateur, $command, $info = null) { // cas des SI {si expression} analises tres tot // pour eviter le chargement de tout iterateur @@ -38,24 +40,34 @@ class IterFactory{ // (il faudrait passer l'argument ->sql_serveur // pour etre certain qu'on est sur un "php:") if (class_exists($iterateur)) { - $a = isset($command['args']) ? $command['args'] : array() ; + $a = isset($command['args']) ? $command['args'] : array(); // permettre de passer un Iterateur directement {args #ITERATEUR} : // si on recoit deja un iterateur en argument, on l'utilise - if (count($a)==1 and is_object($a[0]) and is_subclass_of($a[0], 'Iterator')) { + if (count($a) == 1 and is_object($a[0]) and is_subclass_of($a[0], 'Iterator')) { $iter = $a[0]; - // sinon, on cree un iterateur du type donne + // sinon, on cree un iterateur du type donne } else { // arguments de creation de l'iterateur... // (pas glop) try { switch (count($a)) { - case 0: $iter = new $iterateur(); break; - case 1: $iter = new $iterateur($a[0]); break; - case 2: $iter = new $iterateur($a[0], $a[1]); break; - case 3: $iter = new $iterateur($a[0], $a[1], $a[2]); break; - case 4: $iter = new $iterateur($a[0], $a[1], $a[2], $a[3]); break; + case 0: + $iter = new $iterateur(); + break; + case 1: + $iter = new $iterateur($a[0]); + break; + case 2: + $iter = new $iterateur($a[0], $a[1]); + break; + case 3: + $iter = new $iterateur($a[0], $a[1], $a[2]); + break; + case 4: + $iter = new $iterateur($a[0], $a[1], $a[2], $a[3]); + break; } } catch (Exception $e) { spip_log("Erreur de chargement de l'iterateur $iterateur"); @@ -67,10 +79,11 @@ class IterFactory{ // chercher la classe d'iterateur // IterateurXXX // definie dans le fichier iterateurs/xxx.php - $class = "Iterateur".$iterateur; - if (!class_exists($class)){ + $class = "Iterateur" . $iterateur; + if (!class_exists($class)) { if (!include_spip("iterateur/" . strtolower($iterateur)) - OR !class_exists($class)) { + OR !class_exists($class) + ) { die("Iterateur $iterateur non trouvé"); // si l'iterateur n'existe pas, on se rabat sur le generique # $iter = new EmptyIterator(); @@ -78,31 +91,33 @@ class IterFactory{ } $iter = new $class($command, $info); } + return new IterDecorator($iter, $command, $info); } } - - class IterDecorator extends FilterIterator { private $iter; /** * Conditions de filtrage * ie criteres de selection + * * @var array */ protected $filtre = array(); /** * Fonction de filtrage compilee a partir des criteres de filtre + * * @var string */ protected $func_filtre = null; /** * Critere {offset, limit} + * * @var int * @var int */ @@ -112,15 +127,16 @@ class IterDecorator extends FilterIterator { /** * nombre d'elements recuperes depuis la position 0, * en tenant compte des filtres + * * @var int */ - protected $fetched=0; + protected $fetched = 0; /** * Y a t'il une erreur ? - * + * * @var bool - **/ + **/ protected $err = false; /** @@ -128,17 +144,20 @@ class IterDecorator extends FilterIterator { * (select SQL errone, non chargement des DATA, etc) */ public function err() { - if (method_exists($this->iter, 'err')) + if (method_exists($this->iter, 'err')) { return $this->iter->err(); - if (property_exists($this->iter, 'err')) + } + if (property_exists($this->iter, 'err')) { return $this->iter->err; + } + return false; } - public function __construct(Iterator $iter, $command, $info){ + public function __construct(Iterator $iter, $command, $info) { parent::__construct($iter); parent::rewind(); // remettre a la premiere position (bug? connu de FilterIterator) - + // recuperer l'iterateur transmis $this->iter = $this->getInnerIterator(); $this->command = $command; @@ -168,7 +187,7 @@ class IterDecorator extends FilterIterator { // private function calculer_select() { if ($select = &$this->command['select']) { - foreach($select as $s) { + foreach ($select as $s) { // /!\ $s = '.nom' if ($s[0] == '.') { $s = substr($s, 1); @@ -183,13 +202,15 @@ class IterDecorator extends FilterIterator { // et proprietes disponibles public function get_select($nom) { if (is_object($this->iter) - AND method_exists($this->iter, $nom)) { + AND method_exists($this->iter, $nom) + ) { try { return $this->iter->$nom(); - } catch(Exception $e) { + } catch (Exception $e) { // #GETCHILDREN sur un fichier de DirectoryIterator ... spip_log("Methode $nom en echec sur " . get_class($this->iter)); spip_log("Cela peut être normal : retour d'une ligne de resultat ne pouvant pas calculer cette methode"); + return ''; } } @@ -200,7 +221,8 @@ class IterDecorator extends FilterIterator { // cle et valeur par defaut // ICI PLANTAGE SI ON NE CONTROLE PAS $nom if (in_array($nom, array('cle', 'valeur')) - AND method_exists($this, $nom)) { + AND method_exists($this, $nom) + ) { return $this->$nom(); } @@ -208,9 +230,9 @@ class IterDecorator extends FilterIterator { return table_valeur($this->valeur(), $nom, null); } - + private function calculer_filtres() { - + // Issu de calculer_select() de public/composer L.519 // TODO: externaliser... // @@ -220,13 +242,19 @@ class IterDecorator extends FilterIterator { // IN sur collection vide (ce dernier devrait pouvoir etre fait a la compil) if ($where = &$this->command['where']) { $menage = false; - foreach($where as $k => $v) { - if (is_array($v)){ - if ((count($v)>=2) && ($v[0]=='REGEXP') && ($v[2]=="'.*'")) $op= false; - elseif ((count($v)>=2) && ($v[0]=='LIKE') && ($v[2]=="'%'")) $op= false; - else $op = $v[0] ? $v[0] : $v; - } else $op = $v; - if ((!$op) OR ($op==1) OR ($op=='0=0')) { + foreach ($where as $k => $v) { + if (is_array($v)) { + if ((count($v) >= 2) && ($v[0] == 'REGEXP') && ($v[2] == "'.*'")) { + $op = false; + } elseif ((count($v) >= 2) && ($v[0] == 'LIKE') && ($v[2] == "'%'")) { + $op = false; + } else { + $op = $v[0] ? $v[0] : $v; + } + } else { + $op = $v; + } + if ((!$op) OR ($op == 1) OR ($op == '0=0')) { unset($where[$k]); $menage = true; } @@ -235,17 +263,18 @@ class IterDecorator extends FilterIterator { // produites par sql_in quand plus de 255 valeurs passees a IN if (preg_match_all(',\s+IN\s+(\(.*\)),', $op, $s_req)) { $req = ''; - foreach($s_req[1] as $key => $val) { + foreach ($s_req[1] as $key => $val) { $req .= trim($val, '(,)') . ','; } $req = '(' . rtrim($req, ',') . ')'; } - if (preg_match(',^\(\(([\w/]+)(\s+NOT)?\s+IN\s+(\(.*\))\)(?:\s+(AND|OR)\s+\(([\w/]+)(\s+NOT)?\s+IN\s+(\(.*\))\))*\)$,', $op, $regs)) { + if (preg_match(',^\(\(([\w/]+)(\s+NOT)?\s+IN\s+(\(.*\))\)(?:\s+(AND|OR)\s+\(([\w/]+)(\s+NOT)?\s+IN\s+(\(.*\))\))*\)$,', + $op, $regs)) { $this->ajouter_filtre($regs[1], 'IN', strlen($req) ? $req : $regs[3], $regs[2]); unset($op); } } - foreach($where as $k => $v) { + foreach ($where as $k => $v) { // 3 possibilites : count($v) = // * 1 : {x y} ; on recoit $v[0] = y // * 2 : {x !op y} ; on recoit $v[0] = 'NOT', $v[1] = array() // array du type {x op y} @@ -266,19 +295,18 @@ class IterDecorator extends FilterIterator { // critere {2,7} if (isset($this->command['limit']) AND $this->command['limit']) { - $limit = explode(',',$this->command['limit']); + $limit = explode(',', $this->command['limit']); $this->offset = $limit[0]; $this->limit = $limit[1]; } // Creer la fonction de filtrage sur $this if ($this->filtre) { - $this->func_filtre = create_function('$me', $b = 'return ('.join(') AND (', $this->filtre).');'); + $this->func_filtre = create_function('$me', $b = 'return (' . join(') AND (', $this->filtre) . ');'); } } - protected function ajouter_filtre($cle, $op, $valeur, $not = false) { if (method_exists($this->iter, 'exception_des_criteres')) { if (in_array($cle, $this->iter->exception_des_criteres())) { @@ -290,50 +318,61 @@ class IterDecorator extends FilterIterator { # qui regarde la description 'desc' (en casse reelle d'ailleurs : {isDir=1} # ne sera pas vu si l'on a defini desc['field']['isdir'] pour que #ISDIR soit present. # il faudrait peut etre definir les 2 champs isDir et isdir... a reflechir... - + # if (!in_array($cle, array('cle', 'valeur'))) # return; - $a = '$me->get_select(\''.$cle.'\')'; + $a = '$me->get_select(\'' . $cle . '\')'; $filtre = ''; - + if ($op == 'REGEXP') { - $filtre = 'match('.$a.', '.str_replace('\"', '"', $valeur).')'; - $op = ''; - } else if ($op == 'LIKE') { - $valeur = str_replace(array('\"', '_', '%'), array('"', '.', '.*'), preg_quote($valeur)); - $filtre = 'match('.$a.', '.$valeur.')'; - $op = ''; - } else if ($op == '=') { - $op = '=='; - } else if ($op == 'IN') { - $filtre = 'in_array('.$a.', array'.$valeur.')'; - $op = ''; - } else if (!in_array($op, array('<','<=', '>', '>='))) { - spip_log('operateur non reconnu ' . $op); // [todo] mettre une erreur de squelette + $filtre = 'match(' . $a . ', ' . str_replace('\"', '"', $valeur) . ')'; $op = ''; + } else { + if ($op == 'LIKE') { + $valeur = str_replace(array('\"', '_', '%'), array('"', '.', '.*'), preg_quote($valeur)); + $filtre = 'match(' . $a . ', ' . $valeur . ')'; + $op = ''; + } else { + if ($op == '=') { + $op = '=='; + } else { + if ($op == 'IN') { + $filtre = 'in_array(' . $a . ', array' . $valeur . ')'; + $op = ''; + } else { + if (!in_array($op, array('<', '<=', '>', '>='))) { + spip_log('operateur non reconnu ' . $op); // [todo] mettre une erreur de squelette + $op = ''; + } + } + } + } + } + + if ($op) { + $filtre = $a . $op . str_replace('\"', '"', $valeur); } - - if ($op) - $filtre = $a.$op.str_replace('\"', '"', $valeur); - if ($not) + if ($not) { $filtre = "!($filtre)"; - + } + if ($filtre) { $this->filtre[] = $filtre; } } - - public function next(){ + + public function next() { $this->pos++; parent::next(); } /** * revient au depart + * * @return void */ public function rewind() { @@ -346,48 +385,53 @@ class IterDecorator extends FilterIterator { # Extension SPIP des iterateurs PHP /** * type de l'iterateur + * * @var string */ protected $type; /** * parametres de l'iterateur + * * @var array */ protected $command; /** * infos de compilateur + * * @var array */ protected $info; /** * position courante de l'iterateur + * * @var int */ - protected $pos=null; + protected $pos = null; /** * nombre total resultats dans l'iterateur + * * @var int */ - protected $total=null; + protected $total = null; /** * nombre maximal de recherche pour $total * si l'iterateur n'implemente pas de fonction specifique */ - protected $max=100000; + protected $max = 100000; /** * Liste des champs a inserer dans les $row * retournes par ->fetch() */ - protected $select=array(); + protected $select = array(); + - /** * aller a la position absolue n, * comptee depuis le debut @@ -405,6 +449,7 @@ class IterDecorator extends FilterIterator { } $this->pos = $n; $this->fetched = $n; + return true; } @@ -413,8 +458,9 @@ class IterDecorator extends FilterIterator { * un par un tous les elements */ private function seek_loop($n) { - if ($this->pos > $n) + if ($this->pos > $n) { $this->rewind(); + } while ($this->pos < $n AND $this->valid()) { $this->next(); @@ -425,27 +471,33 @@ class IterDecorator extends FilterIterator { /** * Avancer de $saut pas + * * @param $saut * @param $max * @return int */ - public function skip($saut, $max = null){ + public function skip($saut, $max = null) { // pas de saut en arriere autorise pour cette fonction - if (($saut=intval($saut))<=0) return $this->pos; - $seek = $this->pos + $saut; + if (($saut = intval($saut)) <= 0) { + return $this->pos; + } + $seek = $this->pos+$saut; // si le saut fait depasser le maxi, on libere la resource // et on sort - if (is_null($max)) + if (is_null($max)) { $max = $this->count(); + } - if ($seek>=$max OR $seek>=$this->count()) { + if ($seek >= $max OR $seek >= $this->count()) { // sortie plus rapide que de faire next() jusqu'a la fin ! $this->free(); - return $max; + + return $max; } - $this->seek($seek); - return $this->pos; + $this->seek($seek); + + return $this->pos; } /** @@ -462,24 +514,29 @@ class IterDecorator extends FilterIterator { } else { while ($this->valid() - AND ( - !$this->accept() - OR (isset($this->offset) AND $this->fetched++ < $this->offset) - )) + AND ( + !$this->accept() + OR (isset($this->offset) AND $this->fetched++ < $this->offset) + )) { $this->next(); + } - if (!$this->valid()) + if (!$this->valid()) { return false; + } if (isset($this->limit) - AND $this->fetched > $this->offset + $this->limit) + AND $this->fetched > $this->offset+$this->limit + ) { return false; + } $r = array(); foreach ($this->select as $nom) { $r[$nom] = $this->get_select($nom); } $this->next(); + return $r; } } @@ -488,34 +545,38 @@ class IterDecorator extends FilterIterator { public function cle() { return $this->key(); } - + // retourner la valeur pour #VALEUR public function valeur() { # attention PHP est mechant avec les objets, parfois il ne les # clone pas proprement (directoryiterator sous php 5.2.2) # on se rabat sur la version __toString() if (is_object($v = $this->current())) { - if (method_exists($v, '__toString')) + if (method_exists($v, '__toString')) { $v = $v->__toString(); - else - $v = (array) $v; + } else { + $v = (array)$v; + } } + return $v; } /** * Accepte-t-on l'entree courante lue ? - * On execute les filtres pour le savoir. - **/ + * On execute les filtres pour le savoir. + **/ public function accept() { if ($f = $this->func_filtre) { return $f($this); } + return true; } /** * liberer la ressource + * * @return bool */ public function free() { @@ -523,18 +584,21 @@ class IterDecorator extends FilterIterator { $this->iter->free(); } $this->pos = $this->total = 0; + return true; } /** * Compter le nombre total de resultats * pour #TOTAL_BOUCLE + * * @return int */ public function count() { if (is_null($this->total)) { if (method_exists($this->iter, 'count') - AND !$this->func_filtre) { + AND !$this->func_filtre + ) { return $this->total = $this->iter->count(); } else { // compter les lignes et rembobiner @@ -551,7 +615,7 @@ class IterDecorator extends FilterIterator { return $this->total; } - + } diff --git a/ecrire/public/jointures.php b/ecrire/public/jointures.php index 309ad58185..c7e06adcbc 100644 --- a/ecrire/public/jointures.php +++ b/ecrire/public/jointures.php @@ -14,26 +14,29 @@ * Déduction automatique d'une chaîne de jointures * * @package SPIP\Core\Compilateur\Jointures -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Décomposer un champ id_truc en (id_objet,objet,truc) - * + * * Exemple : décompose id_article en (id_objet,objet,article) - * + * * @param string $champ * Nom du champ à décomposer * @return array|string * Tableau si décomposable : 'id_objet', 'objet', Type de l'objet * Chaine sinon : le nom du champ (non décomposable donc) */ -function decompose_champ_id_objet($champ){ - if (($champ!=='id_objet') AND preg_match(',^id_([a-z_]+)$,', $champ, $regs)){ +function decompose_champ_id_objet($champ) { + if (($champ !== 'id_objet') AND preg_match(',^id_([a-z_]+)$,', $champ, $regs)) { return array('id_objet', 'objet', objet_type($regs[1])); } + return $champ; } @@ -43,33 +46,35 @@ function decompose_champ_id_objet($champ){ * Si le champ demandé existe dans la table, on l'utilise, sinon on * regarde si le champ se décompose en objet/id_objet et si la table * possède ces champs, et dans ce cas, on les retourne. - * - * @param string $champ Nom du champ à tester (ex. id_article) - * @param array $desc Description de la table + * + * @param string $champ Nom du champ à tester (ex. id_article) + * @param array $desc Description de la table * @return array * Liste du/des champs. Soit * - array($champ), si le champ existe dans la table ou si on ne peut décomposer. * - array(id_objet, objet), si le champ n'existe pas mais qu'on peut décomposer */ -function trouver_champs_decomposes($champ, $desc){ +function trouver_champs_decomposes($champ, $desc) { if (!is_array($desc) // on ne se risque pas en conjectures si on ne connait pas la table - OR array_key_exists($champ, $desc['field']) + OR array_key_exists($champ, $desc['field']) ) { return array($champ); } // si le champ se décompose, tester que les colonnes décomposées sont présentes - if (is_array($decompose = decompose_champ_id_objet($champ))){ + if (is_array($decompose = decompose_champ_id_objet($champ))) { array_pop($decompose); - if (count(array_intersect($decompose, array_keys($desc['field'])))==count($decompose)) + if (count(array_intersect($decompose, array_keys($desc['field']))) == count($decompose)) { return $decompose; + } } + return array($champ); } /** * Calculer et construite une jointure entre $depart et $arrivee - * + * * L'objet boucle est modifié pour compléter la requête. * La fonction retourne l'alias d'arrivée une fois la jointure construire, * en general un "Lx" @@ -89,18 +94,20 @@ function trouver_champs_decomposes($champ, $desc){ * @return string * Alias de la table de jointure (Lx) */ -function calculer_jointure(&$boucle, $depart, $arrivee, $col = '', $cond = false, $max_liens = 5){ +function calculer_jointure(&$boucle, $depart, $arrivee, $col = '', $cond = false, $max_liens = 5) { // les jointures minimales sont optimales : // on contraint le nombre d'etapes en l'augmentant // jusqu'a ce qu'on trouve une jointure ou qu'on atteigne la limite maxi $max = 1; $res = false; - $milieu_exclus = ($col?$col:array()); - while ($max<=$max_liens AND !$res){ + $milieu_exclus = ($col ? $col : array()); + while ($max <= $max_liens AND !$res) { $res = calculer_chaine_jointures($boucle, $depart, $arrivee, array(), $milieu_exclus, $max); $max++; } - if (!$res) return ""; + if (!$res) { + return ""; + } list($nom, $desc) = $depart; @@ -139,21 +146,24 @@ function calculer_jointure(&$boucle, $depart, $arrivee, $col = '', $cond = false * @return string * Alias de la table de jointure (Lx) */ -function fabrique_jointures(&$boucle, $res, $cond = false, $desc = array(), $nom = '', $col = '', $echap = true){ +function fabrique_jointures(&$boucle, $res, $cond = false, $desc = array(), $nom = '', $col = '', $echap = true) { static $num = array(); $id_table = ""; $cpt = &$num[$boucle->descr['nom']][$boucle->descr['gram']][$boucle->id_boucle]; foreach ($res as $cle => $r) { list($d, $a, $j) = $r; - if (!$id_table) $id_table = $d; + if (!$id_table) { + $id_table = $d; + } $n = ++$cpt; if (is_array($j)) { // c'est un lien sur un champ du type id_objet,objet,'article' list($j1, $j2, $obj, $type) = $j; // trouver de quel cote est (id_objet,objet) - if ($j1=="id_$obj") + if ($j1 == "id_$obj") { $obj = "$id_table.$obj"; - else + } else { $obj = "L$n.$obj"; + } // le where complementaire est envoye dans la jointure pour pouvoir etre elimine avec la jointure // en cas d'optimisation //$boucle->where[] = array("'='","'$obj'","sql_quote('$type')"); @@ -161,9 +171,8 @@ function fabrique_jointures(&$boucle, $res, $cond = false, $desc = array(), $nom $echap ? array("'$id_table'", "'$j2'", "'$j1'", "'$obj='.sql_quote('$type')") : - array($id_table, $j2, $j1, "$obj=".sql_quote($type)); - } - else { + array($id_table, $j2, $j1, "$obj=" . sql_quote($type)); + } else { $boucle->join["L$n"] = $echap ? array("'$id_table'", "'$j'") : array($id_table, $j); } $boucle->from[$id_table = "L$n"] = $a[0]; @@ -176,7 +185,7 @@ function fabrique_jointures(&$boucle, $res, $cond = false, $desc = array(), $nom // de l'index principal et de l'index de jointure (non conditionnel! [6031]) // et operateur d'egalite (http://trac.rezo.net/trac/spip/ticket/477) - if ($pk = (isset($a[1]) && (count($boucle->from)==2) && !$cond)){ + if ($pk = (isset($a[1]) && (count($boucle->from) == 2) && !$cond)) { $pk = nogroupby_if($desc, $a[1], $col); } @@ -184,28 +193,32 @@ function fabrique_jointures(&$boucle, $res, $cond = false, $desc = array(), $nom // si une seule jointure // et si l'index de jointure est une primary key a l'arrivee ! if (!$pk - AND (count($boucle->from)==2) - AND isset($a[1]['key']['PRIMARY KEY']) - AND ($j==$a[1]['key']['PRIMARY KEY']) - ) + AND (count($boucle->from) == 2) + AND isset($a[1]['key']['PRIMARY KEY']) + AND ($j == $a[1]['key']['PRIMARY KEY']) + ) { $pk = true; + } // la clause Group by est en conflit avec ORDER BY, a completer $groups = liste_champs_jointures($nom, $desc, true); - if (!$pk) foreach ($groups as $id_prim){ - $id_field = $nom.'.'.$id_prim; - if (!in_array($id_field, $boucle->group)){ - $boucle->group[] = $id_field; + if (!$pk) { + foreach ($groups as $id_prim) { + $id_field = $nom . '.' . $id_prim; + if (!in_array($id_field, $boucle->group)) { + $boucle->group[] = $id_field; + } } } $boucle->modificateur['lien'] = true; + return "L$n"; } /** * Condition suffisante pour qu'un Group-By ne soit pas nécéssaire - * + * * À améliorer, notamment voir si calculer_select ne pourrait pas la réutiliser * lorsqu'on sait si le critere conditionnel est finalement present * @@ -214,13 +227,17 @@ function fabrique_jointures(&$boucle, $res, $cond = false, $desc = array(), $nom * @param string|array $col * @return bool */ -function nogroupby_if($depart, $arrivee, $col){ +function nogroupby_if($depart, $arrivee, $col) { $pk = $arrivee['key']['PRIMARY KEY']; - if (!$pk) return false; + if (!$pk) { + return false; + } $id_primary = $depart['key']['PRIMARY KEY']; - if (is_array($col)) $col = implode(', *', $col); // cas id_objet, objet + if (is_array($col)) { + $col = implode(', *', $col); + } // cas id_objet, objet return (preg_match("/^$id_primary, *$col$/", $pk) OR - preg_match("/^$col, *$id_primary$/", $pk)); + preg_match("/^$col, *$id_primary$/", $pk)); } /** @@ -229,7 +246,7 @@ function nogroupby_if($depart, $arrivee, $col){ * sauf si cle primaire explicitement demandee par $primary * * sinon on construit une liste des champs a partir de la liste des cles de la table - * + * * http://code.spip.net/@liste_champs_jointures * * @param string $nom @@ -237,25 +254,31 @@ function nogroupby_if($depart, $arrivee, $col){ * @param bool $primary * @return array */ -function liste_champs_jointures($nom, $desc, $primary = false){ +function liste_champs_jointures($nom, $desc, $primary = false) { static $nojoin = array('idx', 'maj', 'date', 'statut'); // si cle primaire demandee, la privilegier - if ($primary && isset($desc['key']['PRIMARY KEY'])) + if ($primary && isset($desc['key']['PRIMARY KEY'])) { return split_key($desc['key']['PRIMARY KEY']); + } // les champs declares explicitement pour les jointures - if (isset($desc['join'])) return $desc['join']; + if (isset($desc['join'])) { + return $desc['join']; + } /*elseif (isset($GLOBALS['tables_principales'][$nom]['join'])) return $GLOBALS['tables_principales'][$nom]['join']; elseif (isset($GLOBALS['tables_auxiliaires'][$nom]['join'])) return $GLOBALS['tables_auxiliaires'][$nom]['join'];*/ // si pas de cle, c'est fichu - if (!isset($desc['key'])) return array(); + if (!isset($desc['key'])) { + return array(); + } // si cle primaire - if (isset($desc['key']['PRIMARY KEY'])) + if (isset($desc['key']['PRIMARY KEY'])) { return split_key($desc['key']['PRIMARY KEY']); + } // ici on se rabat sur les cles secondaires, // en eliminant celles qui sont pas pertinentes (idx, maj) @@ -263,8 +286,15 @@ function liste_champs_jointures($nom, $desc, $primary = false){ // il faut declarer explicitement le champ 'join' de sa description $join = array(); - foreach ($desc['key'] as $v) $join = split_key($v, $join); - foreach ($join as $k) if (in_array($k, $nojoin)) unset($join[$k]); + foreach ($desc['key'] as $v) { + $join = split_key($v, $join); + } + foreach ($join as $k) { + if (in_array($k, $nojoin)) { + unset($join[$k]); + } + } + return $join; } @@ -277,8 +307,11 @@ function liste_champs_jointures($nom, $desc, $primary = false){ * @param array $join * @return array */ -function split_key($v, $join = array()){ - foreach (preg_split('/,\s*/', $v) as $k) $join[$k] = $k; +function split_key($v, $join = array()) { + foreach (preg_split('/,\s*/', $v) as $k) { + $join[$k] = $k; + } + return $join; } @@ -300,21 +333,31 @@ function split_key($v, $join = array()){ * nombre maxi d'etapes * @return array */ -function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu = array(), $milieu_exclus = array(), $max_liens = 5){ +function calculer_chaine_jointures( + &$boucle, + $depart, + $arrivee, + $vu = array(), + $milieu_exclus = array(), + $max_liens = 5 +) { static $trouver_table; - if (!$trouver_table) + if (!$trouver_table) { $trouver_table = charger_fonction('trouver_table', 'base'); + } - if (is_string($milieu_exclus)) + if (is_string($milieu_exclus)) { $milieu_exclus = array($milieu_exclus); + } // quand on a exclus id_objet comme cle de jointure, il faut aussi exclure objet // faire une jointure sur objet tout seul n'a pas de sens - if (in_array('id_objet',$milieu_exclus) AND !in_array('objet',$milieu_exclus)) + if (in_array('id_objet', $milieu_exclus) AND !in_array('objet', $milieu_exclus)) { $milieu_exclus[] = 'objet'; + } list($dnom, $ddesc) = $depart; list($anom, $adesc) = $arrivee; - if (!count($vu)){ + if (!count($vu)) { $vu[] = $dnom; // ne pas oublier la table de depart $vu[] = $anom; // ne pas oublier la table d'arrivee } @@ -335,31 +378,31 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu = array(), $ $v = !$keys ? false : array_intersect(array_values($keys), $akeys); - if ($v) + if ($v) { return array(array($dnom, array($adesc['table'], $adesc), array_shift($v))); + } // regarder si l'on a (id_objet,objet) au depart et si on peut le mapper sur un id_xx - if (count(array_intersect(array('id_objet', 'objet'), $keys))==2){ + if (count(array_intersect(array('id_objet', 'objet'), $keys)) == 2) { // regarder si l'une des cles d'arrivee peut se decomposer en // id_objet,objet // si oui on la prend - foreach ($akeys as $key){ + foreach ($akeys as $key) { $v = decompose_champ_id_objet($key); - if (is_array($v)){ + if (is_array($v)) { $objet = array_shift($v); // objet,'article' array_unshift($v, $key); // id_article,objet,'article' array_unshift($v, $objet); // id_objet,id_article,objet,'article' return array(array($dnom, array($adesc['table'], $adesc), $v)); } } - } - else { + } else { // regarder si l'une des cles de depart peut se decomposer en // id_objet,objet a l'arrivee // si oui on la prend - foreach ($keys as $key){ - if (count($v = trouver_champs_decomposes($key, $adesc))>1){ - if (count($v)==count(array_intersect($v, $akeys))){ + foreach ($keys as $key) { + if (count($v = trouver_champs_decomposes($key, $adesc)) > 1) { + if (count($v) == count(array_intersect($v, $akeys))) { $v = decompose_champ_id_objet($key); // id_objet,objet,'article' array_unshift($v, $key); // id_article,id_objet,objet,'article' return array(array($dnom, array($adesc['table'], $adesc), $v)); @@ -368,44 +411,48 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu = array(), $ } } // si l'on voulait une jointure direct, c'est rate ! - if ($max_liens<=1) return array(); + if ($max_liens <= 1) { + return array(); + } // sinon essayer de passer par une autre table $new = $vu; - foreach ($boucle->jointures as $v){ + foreach ($boucle->jointures as $v) { if ($v - AND !in_array($v, $vu) - AND $def = $trouver_table($v, $boucle->sql_serveur) - AND !in_array($def['table_sql'], $vu) - ){ + AND !in_array($v, $vu) + AND $def = $trouver_table($v, $boucle->sql_serveur) + AND !in_array($def['table_sql'], $vu) + ) { // ne pas tester les cles qui sont exclues a l'appel // ie la cle de la jointure precedente $test_cles = $milieu_exclus; $new[] = $v; $max_iter = 50; // securite - while (count($jointure_directe_possible = calculer_chaine_jointures($boucle, $depart, array($v, $def), $vu, $test_cles, 1)) - AND $max_iter--){ + while (count($jointure_directe_possible = calculer_chaine_jointures($boucle, $depart, array($v, $def), $vu, + $test_cles, 1)) + AND $max_iter--) { $jointure_directe_possible = reset($jointure_directe_possible); $milieu = end($jointure_directe_possible); $exclure_fin = $milieu_exclus; - if (is_string($milieu)){ + if (is_string($milieu)) { $exclure_fin[] = $milieu; $test_cles[] = $milieu; - } - else{ + } else { $exclure_fin = array_merge($exclure_fin, $milieu); $test_cles = array_merge($test_cles, $milieu); } // essayer de rejoindre l'arrivee a partir de cette etape intermediaire // sans repasser par la meme cle milieu, ni une cle deja vue ! $r = calculer_chaine_jointures($boucle, array($v, $def), $arrivee, $new, $exclure_fin, $max_liens-1); - if ($r){ + if ($r) { array_unshift($r, $jointure_directe_possible); + return $r; } } } } + return array(); } @@ -418,17 +465,18 @@ function calculer_chaine_jointures(&$boucle, $depart, $arrivee, $vu = array(), $ * @param $keys * @return array */ -function trouver_cles_table($keys){ +function trouver_cles_table($keys) { $res = array(); - foreach ($keys as $v){ - if (!strpos($v, ",")) + foreach ($keys as $v) { + if (!strpos($v, ",")) { $res[$v] = 1; - else { - foreach (preg_split("/\s*,\s*/", $v) as $k){ + } else { + foreach (preg_split("/\s*,\s*/", $v) as $k) { $res[$k] = 1; } } } + return array_keys($res); } @@ -444,66 +492,71 @@ function trouver_cles_table($keys){ * Description de la boucle * @param bool|string $checkarrivee * false : peu importe la table, si on trouve le/les champs, c'est bon. - * string : nom de la table jointe où on veut trouver le champ. + * string : nom de la table jointe où on veut trouver le champ. * @return array|string * chaîne vide : on n'a pas trouvé * liste si trouvé : nom de la table, description de la table */ -function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false){ +function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false) { static $trouver_table = ''; - if (!$trouver_table) + if (!$trouver_table) { $trouver_table = charger_fonction('trouver_table', 'base'); + } // support de la recherche multi champ : // si en seconde etape on a decompose le champ id_xx en id_objet,objet // on reentre ici soit en cherchant une table les 2 champs id_objet,objet // soit une table avec les 3 champs id_xx, id_objet, objet - if (!is_array($cle)) + if (!is_array($cle)) { $cle = array($cle); + } - foreach ($joints as $k => $join){ - if ($join && $table = $trouver_table($join, $boucle->sql_serveur)){ + foreach ($joints as $k => $join) { + if ($join && $table = $trouver_table($join, $boucle->sql_serveur)) { if (isset($table['field']) - // verifier que toutes les cles cherchees sont la - AND (count(array_intersect($cle, array_keys($table['field'])))==count($cle)) - // si on sait ou on veut arriver, il faut que ca colle - AND ($checkarrivee==false || $checkarrivee==$table['table']) - ) + // verifier que toutes les cles cherchees sont la + AND (count(array_intersect($cle, array_keys($table['field']))) == count($cle)) + // si on sait ou on veut arriver, il faut que ca colle + AND ($checkarrivee == false || $checkarrivee == $table['table']) + ) { return array($table['table'], $table, $cle); + } } } // au premier coup, on essaye de decomposer, si possible - if (count($cle)==1 - AND $c = reset($cle) - AND is_array($decompose = decompose_champ_id_objet($c)) - ){ + if (count($cle) == 1 + AND $c = reset($cle) + AND is_array($decompose = decompose_champ_id_objet($c)) + ) { $desc = $boucle->show; - + // cas 1 : la cle id_xx est dans la table de depart // -> on cherche uniquement id_objet,objet a l'arrivee - if (isset($desc['field'][$c])){ + if (isset($desc['field'][$c])) { $cle = array(); $cle[] = array_shift($decompose); // id_objet $cle[] = array_shift($decompose); // objet return trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee); } - // cas 2 : la cle id_xx n'est pas dans la table de depart - // -> il faut trouver une cle de depart zzz telle que - // id_objet,objet,zzz soit a l'arrivee + // cas 2 : la cle id_xx n'est pas dans la table de depart + // -> il faut trouver une cle de depart zzz telle que + // id_objet,objet,zzz soit a l'arrivee else { $depart = liste_champs_jointures((isset($desc['table']) ? $desc['table'] : ''), $desc); - foreach ($depart as $d){ + foreach ($depart as $d) { $cle = array(); $cle[] = array_shift($decompose); // id_objet $cle[] = array_shift($decompose); // objet $cle[] = $d; - if ($ext = trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee)) + if ($ext = trouver_champ_exterieur($cle, $joints, $boucle, $checkarrivee)) { return $ext; + } } } } + return ""; } @@ -514,19 +567,19 @@ function trouver_champ_exterieur($cle, $joints, &$boucle, $checkarrivee = false) * l'alias de la table contenant ce champ * (L2 par exemple pour 'spip_mots AS L2' dans le FROM), * - * + * * @param string $champ - * Nom du champ cherche (exemple id_article) + * Nom du champ cherche (exemple id_article) * @param object $boucle - * Informations connues de la boucle + * Informations connues de la boucle * @param array $jointures - * Liste des tables parcourues (articles, mots) pour retrouver le champ sql - * et calculer la jointure correspondante. - * En son absence et par defaut, on utilise la liste des jointures connues - * par SPIP pour la table en question ($boucle->jointures) + * Liste des tables parcourues (articles, mots) pour retrouver le champ sql + * et calculer la jointure correspondante. + * En son absence et par defaut, on utilise la liste des jointures connues + * par SPIP pour la table en question ($boucle->jointures) * @param bool $cond * flag pour savoir si le critere est conditionnel ou non - * + * * @return string */ function trouver_jointure_champ($champ, &$boucle, $jointures = false, $cond = false) { @@ -536,13 +589,16 @@ function trouver_jointure_champ($champ, &$boucle, $jointures = false, $cond = fa // TODO : aberration, on utilise $jointures pour trouver le champ // mais pas poour construire la jointure ensuite $arrivee = trouver_champ_exterieur($champ, $jointures, $boucle); - if ($arrivee){ + if ($arrivee) { $desc = $boucle->show; array_pop($arrivee); // enlever la cle en 3eme argument $cle = calculer_jointure($boucle, array($desc['id_table'], $desc), $arrivee, '', $cond); - if ($cle) return $cle; + if ($cle) { + return $cle; + } } spip_log("trouver_jointure_champ: $champ inconnu"); + return ''; } diff --git a/ecrire/public/normaliser.php b/ecrire/public/normaliser.php index 969cfe9688..512ad5f14e 100644 --- a/ecrire/public/normaliser.php +++ b/ecrire/public/normaliser.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Les fonctions de ce fichier sont appelees en certains points // de l'analyseur syntaxique afin de normaliser de vieilles syntaxes, @@ -22,17 +24,19 @@ if (!defined('_ECRIRE_INC_VERSION')) return; // qui passent en arguments de la balise: #LOGO{left,#URL...} // -> http://www.spip.net/fr_article901.html -function phraser_vieux_logos(&$p) -{ - if ($p->param[0][0]) +function phraser_vieux_logos(&$p) { + if ($p->param[0][0]) { $args = array(''); - else { + } else { $args = array_shift($p->param); } - foreach($p->param as $couple) { + foreach ($p->param as $couple) { $nom = trim($couple[0]); - if ($nom == '') {array_shift($p->param); break;} + if ($nom == '') { + array_shift($p->param); + break; + } $r = phraser_logo_faux_filtres($nom); if ($r === 0) { $c = new Texte; @@ -41,28 +45,28 @@ function phraser_vieux_logos(&$p) array_shift($p->param); spip_log("filtre de logo obsolete $nom", 'vieilles_defs'); } elseif ($r === 2) { - $p->etoile = '**'; - array_shift($p->param); - spip_log("filtre de logo obsolete $nom", 'vieilles_defs'); + $p->etoile = '**'; + array_shift($p->param); + spip_log("filtre de logo obsolete $nom", 'vieilles_defs'); } elseif ($r === 1) { - array_shift($p->param); - $p->etoile = '*'; - spip_log("filtre de logo obsolete $nom", 'vieilles_defs'); - - } elseif (preg_match("/^".NOM_DE_CHAMP.'(.*)$/sS', $nom, $m)) { - $champ = new Champ(); - $champ->nom_boucle = $m[2]; - $champ->nom_champ = $m[3]; - $champ->etoile = $m[5]; - $champ = array($champ); - if ($m[6]) { - $r = new Texte; - $r->texte = $m[6]; - $champ[]= $r; - } - $args[]= $champ; - array_shift($p->param); - spip_log("filtre de logo obsolete $nom", 'vieilles_defs'); + array_shift($p->param); + $p->etoile = '*'; + spip_log("filtre de logo obsolete $nom", 'vieilles_defs'); + + } elseif (preg_match("/^" . NOM_DE_CHAMP . '(.*)$/sS', $nom, $m)) { + $champ = new Champ(); + $champ->nom_boucle = $m[2]; + $champ->nom_champ = $m[3]; + $champ->etoile = $m[5]; + $champ = array($champ); + if ($m[6]) { + $r = new Texte; + $r->texte = $m[6]; + $champ[] = $r; + } + $args[] = $champ; + array_shift($p->param); + spip_log("filtre de logo obsolete $nom", 'vieilles_defs'); } // le cas else est la seule incompatibilite @@ -71,53 +75,56 @@ function phraser_vieux_logos(&$p) } -function phraser_logo_faux_filtres($nom) -{ - switch($nom) { - case 'top': - case 'left': - case 'right': - case 'center': - case 'bottom': return 0; - case 'lien': return 1; - case 'fichier': return 2; - default: return $nom; +function phraser_logo_faux_filtres($nom) { + switch ($nom) { + case 'top': + case 'left': + case 'right': + case 'center': + case 'bottom': + return 0; + case 'lien': + return 1; + case 'fichier': + return 2; + default: + return $nom; } } // La balise embed_document est a present le modele emb -function phraser_vieux_emb(&$p) -{ - if (!is_array($p->param)) - $p->param=array(); +function phraser_vieux_emb(&$p) { + if (!is_array($p->param)) { + $p->param = array(); + } // Produire le premier argument {emb} $texte = new Texte; - $texte->texte='emb'; + $texte->texte = 'emb'; $param = array('', array($texte)); // Transformer les filtres en arguments - for ($i=0; $i<count($p->param); $i++) { + for ($i = 0; $i < count($p->param); $i++) { if ($p->param[$i][0]) { - if (!strstr($p->param[$i][0], '=')) - break;# on a rencontre un vrai filtre, c'est fini + if (!strstr($p->param[$i][0], '=')) { + break; + }# on a rencontre un vrai filtre, c'est fini $texte = new Texte; - $texte->texte=$p->param[$i][0]; + $texte->texte = $p->param[$i][0]; $param[] = array($texte); } array_shift($p->param); } - array_unshift($p->param, $param); + array_unshift($p->param, $param); spip_log('balise EMBED_DOCUMENT obsolete', 'vieilles_defs'); $p->nom_champ = 'MODELE'; } // Vieux formulaire de recherch -function phraser_vieux_recherche($p) -{ +function phraser_vieux_recherche($p) { if ($p->param[0][0]) { $c = new Texte; $c->texte = $p->param[0][0]; @@ -129,8 +136,7 @@ function phraser_vieux_recherche($p) } // Gerer la notation [(#EXPOSER|on,off)] -function phraser_vieux_exposer($p) -{ +function phraser_vieux_exposer($p) { if ($a = $p->fonctions) { preg_match("#([^,]*)(,(.*))?#", $a[0][0], $regs); $args = array(); @@ -150,49 +156,60 @@ function phraser_vieux_exposer($p) } } -function phraser_vieux_modele($p) {normaliser_args_inclumodel($p);} -function phraser_vieux_inclu($p) {normaliser_args_inclumodel($p);} +function phraser_vieux_modele($p) { normaliser_args_inclumodel($p); } -function normaliser_args_inclumodel($p) -{ +function phraser_vieux_inclu($p) { normaliser_args_inclumodel($p); } + +function normaliser_args_inclumodel($p) { $params = $p->param; - if (!$params) return; + if (!$params) { + return; + } $args = $params[0]; - if ($args[0]) return; // filtre immediat + if ($args[0]) { + return; + } // filtre immediat array_shift($p->param); foreach ($p->param as $l) { - if (!array_shift($l)) { + if (!array_shift($l)) { $args = array_merge($args, $l); array_shift($p->param); - } else break; // filtre + } else { + break; + } // filtre } array_unshift($p->param, $args); } -function normaliser_inclure($champ) -{ +function normaliser_inclure($champ) { normaliser_args_inclumodel($champ); $l = $champ->param[0]; if (is_array($l) AND !$l[0]) { - foreach ($l as $k => $p) { - if ($p AND $p[0]->type == 'texte' AND !strpos($p[0]->texte,'=')) { - $p[0]->texte = trim($p[0]->texte); - } - } - foreach ($l as $k => $p) { - if (!$p OR $p[0]->type != 'texte' OR - !preg_match('/^fond\s*=\s*(.*)$/',$p[0]->texte, $r)) - continue; - - if ($r[1]) - $p[0]->texte = $r[1]; - else unset($p[0]); - $champ->texte = $p; - unset($champ->param[0][$k]); - if (count($champ->param[0]) ==1) - array_shift($champ->param); - return; - } + foreach ($l as $k => $p) { + if ($p AND $p[0]->type == 'texte' AND !strpos($p[0]->texte, '=')) { + $p[0]->texte = trim($p[0]->texte); + } + } + foreach ($l as $k => $p) { + if (!$p OR $p[0]->type != 'texte' OR + !preg_match('/^fond\s*=\s*(.*)$/', $p[0]->texte, $r) + ) { + continue; + } + + if ($r[1]) { + $p[0]->texte = $r[1]; + } else { + unset($p[0]); + } + $champ->texte = $p; + unset($champ->param[0][$k]); + if (count($champ->param[0]) == 1) { + array_shift($champ->param); + } + + return; + } } spip_log("inclure sans fond ni fichier"); } diff --git a/ecrire/public/parametrer.php b/ecrire/public/parametrer.php index edf2bda18b..57602edd54 100644 --- a/ecrire/public/parametrer.php +++ b/ecrire/public/parametrer.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/lang'); @@ -25,8 +27,9 @@ if (@is_readable(_CACHE_PLUGINS_FCT)) { // chargement optimise precompile include_once(_CACHE_PLUGINS_FCT); } -if (test_espace_prive ()) +if (test_espace_prive()) { include_spip('inc/filtres_ecrire'); +} # Determine le squelette associe a une requete # et l'applique sur le contexte, le nom du cache et le serveur @@ -42,24 +45,30 @@ if (test_espace_prive ()) # En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines // http://code.spip.net/@public_parametrer_dist -function public_parametrer_dist($fond, $contexte = '', $cache = '', $connect = '') { - static $composer,$styliser,$notes=null; +function public_parametrer_dist($fond, $contexte = '', $cache = '', $connect = '') { + static $composer, $styliser, $notes = null; $page = tester_redirection($fond, $contexte, $connect); - if ($page) return $page; + if ($page) { + return $page; + } - if (isset($contexte['lang'])) + if (isset($contexte['lang'])) { $lang = $contexte['lang']; - elseif (!isset($lang)) + } elseif (!isset($lang)) { $lang = $GLOBALS['meta']['langue_site']; + } $select = ((!isset($GLOBALS['forcer_lang']) OR !$GLOBALS['forcer_lang']) AND $lang <> $GLOBALS['spip_lang']); - if ($select) $select = lang_select($lang); + if ($select) { + $select = lang_select($lang); + } $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug'); - if (!$styliser) + if (!$styliser) { $styliser = charger_fonction('styliser', 'public'); - list($skel,$mime_type, $gram, $sourcefile) = + } + list($skel, $mime_type, $gram, $sourcefile) = $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect); if ($skel) { @@ -74,27 +83,29 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', $connect = ' // charger le squelette en specifiant les langages cibles et source // au cas il faudrait le compiler (source posterieure au resultat) - if (!$composer) + if (!$composer) { $composer = charger_fonction('composer', 'public'); + } $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect); - } - else + } else { $fonc = ''; + } if (!$fonc) { // squelette inconnu (==='') ou faux (===false) $page = $fonc; - } - else { + } else { // Preparer l'appel de la fonction principale du squelette - spip_timer($a = 'calcul page '.rand(0,1000)); + spip_timer($a = 'calcul page ' . rand(0, 1000)); // On cree un marqueur de notes unique lie a cette composition // et on enregistre l'etat courant des globales de notes... - if (is_null($notes)) + if (is_null($notes)) { $notes = charger_fonction('notes', 'inc', true); - if ($notes) - $notes('','empiler'); + } + if ($notes) { + $notes('', 'empiler'); + } // Rajouter d'office ces deux parametres // (mais vaudrait mieux que le compilateur sache le simuler @@ -102,80 +113,92 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', $connect = ' if (!isset($contexte['date'])) { $contexte['date'] = date("Y-m-d H:i:s"); $contexte['date_default'] = true; - } else $contexte['date'] = normaliser_date($contexte['date'], true); + } else { + $contexte['date'] = normaliser_date($contexte['date'], true); + } if (!isset($contexte['date_redac'])) { $contexte['date_redac'] = date("Y-m-d H:i:s"); $contexte['date_redac_default'] = true; - } else $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true); + } else { + $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true); + } - // Passer le nom du cache pour produire sa destruction automatique + // Passer le nom du cache pour produire sa destruction automatique $page = $fonc(array('cache' => $cache), array($contexte)); - // Restituer les globales de notes telles qu'elles etaient avant l'appel - // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent* - // etre dans son resultat, autrement elles ne seraient pas prises en - // compte a chaque calcul d'un texte contenant un modele, mais seulement - // quand le modele serait calcule, et on aurait des resultats incoherents) - if ($notes) - $notes('','depiler'); + // Restituer les globales de notes telles qu'elles etaient avant l'appel + // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent* + // etre dans son resultat, autrement elles ne seraient pas prises en + // compte a chaque calcul d'un texte contenant un modele, mais seulement + // quand le modele serait calcule, et on aurait des resultats incoherents) + if ($notes) { + $notes('', 'depiler'); + } // reinjecter en dynamique la pile des notes // si il y a des inclure dynamiques // si la pile n'est pas vide // la generalisation de cette injection permettrait de corriger le point juste au dessus // en faisant remonter les notes a l'incluant (A tester et valider avant application) - if ($notes) - $page['notes'] = $notes('','sauver_etat'); + if ($notes) { + $page['notes'] = $notes('', 'sauver_etat'); + } // spip_log: un joli contexte $infos = array(); foreach (array_filter($contexte) as $var => $val) { - if (is_array($val)) $val = serialize($val); - if (strlen("$val") > 30) - $val = substr("$val", 0,27).'..'; - if (strstr($val,' ')) + if (is_array($val)) { + $val = serialize($val); + } + if (strlen("$val") > 30) { + $val = substr("$val", 0, 27) . '..'; + } + if (strstr($val, ' ')) { $val = "'$val'"; - $infos[] = $var.'='.$val; + } + $infos[] = $var . '=' . $val; } $profile = spip_timer($a); spip_log("calcul ($profile) [$skel] " . join(', ', $infos) - .' ('.strlen($page['texte']).' octets)'); + . ' (' . strlen($page['texte']) . ' octets)'); if ($debug) { - // si c'est ce que demande le debusqueur, lui passer la main + // si c'est ce que demande le debusqueur, lui passer la main $t = strlen($page['texte']) ? $page['texte'] : " "; $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t; $GLOBALS['debug_objets']['courant'] = $courant; $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile; if ($GLOBALS['debug_objets']['sourcefile'] - AND (_request('var_mode_objet') == $fonc) - AND (_request('var_mode_affiche') == 'resultat')) { + AND (_request('var_mode_objet') == $fonc) + AND (_request('var_mode_affiche') == 'resultat') + ) { erreur_squelette(); } } // Si #CACHE{} n'etait pas la, le mettre a $delais - if (!isset($page['entetes']['X-Spip-Cache'])){ + if (!isset($page['entetes']['X-Spip-Cache'])) { // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut // si aucun #CACHE{} spécifié // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme // entre public et prive - if (test_espace_prive() OR strncmp($fond,'modeles/',8)==0) + if (test_espace_prive() OR strncmp($fond, 'modeles/', 8) == 0) { $page['entetes']['X-Spip-Cache'] = 0; - else - $page['entetes']['X-Spip-Cache'] = isset($GLOBALS['delais'])?$GLOBALS['delais']:36000; + } else { + $page['entetes']['X-Spip-Cache'] = isset($GLOBALS['delais']) ? $GLOBALS['delais'] : 36000; + } } $page['contexte'] = $contexte; - + // faire remonter le fichier source static $js_inclus = false; - if (defined('_VAR_INCLURE') AND _VAR_INCLURE){ + if (defined('_VAR_INCLURE') AND _VAR_INCLURE) { $page['sourcefile'] = $sourcefile; $page['texte'] = - "<div class='inclure_blocs'><h6>".$page['sourcefile']."</h6>".$page['texte']."</div>" - . ($js_inclus?"":"<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>"); + "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . "</h6>" . $page['texte'] . "</div>" + . ($js_inclus ? "" : "<script type='text/javascript'>jQuery(function(){jQuery('.inclure_blocs > h6:first-child').hover(function(){jQuery(this).parent().addClass('hover')},function(){jQuery(this).parent().removeClass('hover')})});</script>"); $js_inclus = true; } @@ -186,7 +209,9 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', $connect = ' } } - if ($select) lang_select(); + if ($select) { + lang_select(); + } return $page; } @@ -204,37 +229,42 @@ function public_parametrer_dist($fond, $contexte = '', $cache = '', $connect = ' * @param string $connect * @return array|bool */ -function tester_redirection($fond, $contexte, $connect) -{ +function tester_redirection($fond, $contexte, $connect) { if ($fond == 'article' - AND $id_article = intval($contexte['id_article'])) { + AND $id_article = intval($contexte['id_article']) + ) { include_spip('public/quete'); // pour quete_virtuel et ses dependances $m = quete_virtuel($id_article, $connect); if (strlen($m)) { include_spip('inc/texte'); // les navigateurs pataugent si l'URL est vide - if ($url = virtuel_redirige($m, true)){ + if ($url = virtuel_redirige($m, true)) { // passer en url absolue car cette redirection pourra // etre utilisee dans un contexte d'url qui change // y compris url arbo $status = 302; - if (defined('_STATUS_REDIRECTION_VIRTUEL')) - $status=_STATUS_REDIRECTION_VIRTUEL; + if (defined('_STATUS_REDIRECTION_VIRTUEL')) { + $status = _STATUS_REDIRECTION_VIRTUEL; + } if (!preg_match(',^\w+:,', $url)) { include_spip('inc/filtres_mini'); $url = url_absolue($url); } $url = str_replace('&', '&', $url); - return array('texte' => "<" - . "?php include_spip('inc/headers');redirige_par_entete('" - . texte_script($url) - . "','',$status);" - . "?" . ">", + + return array( + 'texte' => "<" + . "?php include_spip('inc/headers');redirige_par_entete('" + . texte_script($url) + . "','',$status);" + . "?" . ">", 'process_ins' => 'php', - 'status' => $status); + 'status' => $status + ); } } } + return false; } diff --git a/ecrire/public/quete.php b/ecrire/public/quete.php index f29dbadfc9..6d86ccf68b 100644 --- a/ecrire/public/quete.php +++ b/ecrire/public/quete.php @@ -14,11 +14,13 @@ * Fonctions d'appel aux serveurs SQL presentes dans le code compile * * NB : à l'exception des fonctions pour les balises dynamiques - * + * * @package SPIP\Core\Compilateur\Quetes -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('base/abstract_sql'); @@ -31,12 +33,13 @@ include_spip('base/abstract_sql'); * @return array|bool|null */ function quete_virtuel($id_article, $connect) { - return sql_getfetsel('virtuel', 'spip_articles', array("id_article=".intval($id_article), "statut='publie'"), '','','','',$connect); + return sql_getfetsel('virtuel', 'spip_articles', array("id_article=" . intval($id_article), "statut='publie'"), '', + '', '', '', $connect); } /** * Retourne le couple `parent,lang` pour toute table - * + * * En pratique `id_rubrique` si présent (ou `id_parent` pour table rubriques) * et champ `lang` si présent * @@ -45,32 +48,37 @@ function quete_virtuel($id_article, $connect) { * @param string $connect * @return array */ -function quete_parent_lang($table, $id, $connect = ''){ +function quete_parent_lang($table, $id, $connect = '') { static $cache_quete = array(); if (!isset($cache_quete[$connect][$table][$id])) { - if (!isset($cache_quete[$connect][$table]['_select'])){ - $trouver_table = charger_fonction('trouver_table','base'); - if (!$desc=$trouver_table($table,$connect) OR !isset($desc['field']['id_rubrique'])) - // pas de parent rubrique, on passe - $cache_quete[$connect][$table]['_select'] = false; - else { - $select = ($table=='spip_rubriques'?'id_parent':'id_rubrique'); - $select .= isset($desc['field']['lang'])?", lang":""; + if (!isset($cache_quete[$connect][$table]['_select'])) { + $trouver_table = charger_fonction('trouver_table', 'base'); + if (!$desc = $trouver_table($table, + $connect) OR !isset($desc['field']['id_rubrique']) + ) // pas de parent rubrique, on passe + { + $cache_quete[$connect][$table]['_select'] = false; + } else { + $select = ($table == 'spip_rubriques' ? 'id_parent' : 'id_rubrique'); + $select .= isset($desc['field']['lang']) ? ", lang" : ""; $cache_quete[$connect][$table]['_select'] = $select; $cache_quete[$connect][$table]['_id'] = id_table_objet(objet_type($table)); } } - if ($cache_quete[$connect][$table]['_select']) - $cache_quete[$connect][$table][$id] = sql_fetsel($cache_quete[$connect][$table]['_select'], $table,$cache_quete[$connect][$table]['_id']."=".intval($id),'','','','',$connect); + if ($cache_quete[$connect][$table]['_select']) { + $cache_quete[$connect][$table][$id] = sql_fetsel($cache_quete[$connect][$table]['_select'], $table, + $cache_quete[$connect][$table]['_id'] . "=" . intval($id), '', '', '', '', $connect); + } } + return isset($cache_quete[$connect][$table][$id]) ? $cache_quete[$connect][$table][$id] : null; } /** * Retourne le parent d'une rubrique - * + * * Repose sur la fonction quete_parent_lang pour la mutualisation * +mise en cache SQL des requêtes * @@ -81,15 +89,17 @@ function quete_parent_lang($table, $id, $connect = ''){ * @return int */ function quete_parent($id_rubrique, $connect = '') { - if (!$id_rubrique = intval($id_rubrique)) + if (!$id_rubrique = intval($id_rubrique)) { return 0; - $id_parent = quete_parent_lang('spip_rubriques',$id_rubrique,$connect); + } + $id_parent = quete_parent_lang('spip_rubriques', $id_rubrique, $connect); + return $id_parent['id_parent']; } /** * Retourne la rubrique d'un article - * + * * Repose sur la fonction quete_parent_lang pour la mutualisation * +mise en cache SQL des requêtes * @@ -100,7 +110,8 @@ function quete_parent($id_rubrique, $connect = '') { * @return int */ function quete_rubrique($id_article, $serveur) { - $id_parent = quete_parent_lang('spip_articles',$id_article,$serveur); + $id_parent = quete_parent_lang('spip_articles', $id_article, $serveur); + return $id_parent['id_rubrique']; } @@ -109,7 +120,7 @@ function quete_rubrique($id_article, $serveur) { * Retourne la profondeur d'une rubrique * * @uses quete_parent() - * + * * @param int $id * @param string $connect * @return int @@ -120,13 +131,14 @@ function quete_profondeur($id, $connect = '') { $n++; $id = quete_parent($id, $connect); } + return $n; } /** * Retourne la condition sur la date lorsqu'il y a des post-dates - * + * * @param string $champ_date * Nom de la colonne de date dans la table SQL * @param string $serveur @@ -136,13 +148,15 @@ function quete_profondeur($id, $connect = '') { * Morceau de la requête SQL testant la date */ function quete_condition_postdates($champ_date, $serveur = '', $ignore_previsu = false) { - if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW AND !$ignore_previsu) + if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW AND !$ignore_previsu) { return "1=1"; + } + return - (isset($GLOBALS['meta']['date_prochain_postdate']) - AND $GLOBALS['meta']['date_prochain_postdate'] > time()) - ? "$champ_date<".sql_quote(date('Y-m-d H:i:s',$GLOBALS['meta']['date_prochain_postdate']),$serveur) - : "1=1" ; + (isset($GLOBALS['meta']['date_prochain_postdate']) + AND $GLOBALS['meta']['date_prochain_postdate'] > time()) + ? "$champ_date<" . sql_quote(date('Y-m-d H:i:s', $GLOBALS['meta']['date_prochain_postdate']), $serveur) + : "1=1"; } @@ -161,66 +175,74 @@ function quete_condition_postdates($champ_date, $serveur = '', $ignore_previsu = * true pour forcer le test même en prévisu * @return array */ -function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ignore_previsu = false){ +function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ignore_previsu = false) { static $cond = array(); $key = func_get_args(); - $key = implode("-",$key); - if (isset($cond[$key])) return $cond[$key]; + $key = implode("-", $key); + if (isset($cond[$key])) { + return $cond[$key]; + } $liste = $publie; - if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW AND !$ignore_previsu) + if (defined('_VAR_PREVIEW') AND _VAR_PREVIEW AND !$ignore_previsu) { $liste = $previsu; + } $not = false; - if (strncmp($liste,'!',1)==0){ + if (strncmp($liste, '!', 1) == 0) { $not = true; - $liste = substr($liste,1); + $liste = substr($liste, 1); } // '' => ne rien afficher, '!'=> ne rien filtrer - if (!strlen($liste)) - return $cond[$key]=($not?"1=1":"'0=1'"); + if (!strlen($liste)) { + return $cond[$key] = ($not ? "1=1" : "'0=1'"); + } - $liste = explode(',',$liste); + $liste = explode(',', $liste); $where = array(); - foreach($liste as $k=>$v) { + foreach ($liste as $k => $v) { // filtrage /auteur pour limiter les objets d'un statut (prepa en general) // a ceux de l'auteur identifie - if (strpos($v,"/")!==false){ - $v = explode("/",$v); + if (strpos($v, "/") !== false) { + $v = explode("/", $v); $filtre = end($v); $v = reset($v); - $v = preg_replace(",\W,","",$v); - if ($filtre=="auteur" + $v = preg_replace(",\W,", "", $v); + if ($filtre == "auteur" AND isset($GLOBALS['visiteur_session']['id_auteur']) AND intval($GLOBALS['visiteur_session']['id_auteur']) - AND (strpos($mstatut,".")!==false) - AND $objet = explode(".",$mstatut) + AND (strpos($mstatut, ".") !== false) + AND $objet = explode(".", $mstatut) AND $id_table = reset($objet) - AND $objet = objet_type($id_table)){ + AND $objet = objet_type($id_table) + ) { $primary = id_table_objet($objet); - $where[] = "($mstatut<>".sql_quote($v)." OR $id_table.$primary IN (".sql_get_select("ssss.id_objet","spip_auteurs_liens AS ssss","ssss.objet=".sql_quote($objet)." AND ssss.id_auteur=".intval($GLOBALS['visiteur_session']['id_auteur']),'','','','',$serveur)."))"; - } - // ignorer ce statut si on ne sait pas comment le filtrer - else + $where[] = "($mstatut<>" . sql_quote($v) . " OR $id_table.$primary IN (" . sql_get_select("ssss.id_objet", + "spip_auteurs_liens AS ssss", + "ssss.objet=" . sql_quote($objet) . " AND ssss.id_auteur=" . intval($GLOBALS['visiteur_session']['id_auteur']), + '', '', '', '', $serveur) . "))"; + } // ignorer ce statut si on ne sait pas comment le filtrer + else { $v = ""; + } } // securite - $liste[$k] = preg_replace(",\W,","",$v); + $liste[$k] = preg_replace(",\W,", "", $v); } $liste = array_filter($liste); - if (count($liste)==1){ - $where[] = array('=', $mstatut, sql_quote(reset($liste),$serveur)); - } - else { - $where[] = sql_in($mstatut,$liste,$not,$serveur); - } - - while (count($where)>1){ - $and = array('AND',array_pop($where),array_pop($where)); + if (count($liste) == 1) { + $where[] = array('=', $mstatut, sql_quote(reset($liste), $serveur)); + } else { + $where[] = sql_in($mstatut, $liste, $not, $serveur); + } + + while (count($where) > 1) { + $and = array('AND', array_pop($where), array_pop($where)); $where[] = $and; } $cond[$key] = reset($where); - if ($not) - $cond[$key] = array('NOT',$cond[$key]); + if ($not) { + $cond[$key] = array('NOT', $cond[$key]); + } return $cond[$key]; } @@ -235,7 +257,8 @@ function quete_condition_statut($mstatut, $previsu, $publie, $serveur = '', $ign * @return array|bool|null */ function quete_fichier($id_document, $serveur = '') { - return sql_getfetsel('fichier', 'spip_documents', ("id_document=" . intval($id_document)), '',array(), '', '', $serveur); + return sql_getfetsel('fichier', 'spip_documents', ("id_document=" . intval($id_document)), '', array(), '', '', + $serveur); } /** @@ -246,7 +269,7 @@ function quete_fichier($id_document, $serveur = '') { * @return array|bool */ function quete_document($id_document, $serveur = '') { - return sql_fetsel('*', 'spip_documents', ("id_document=" . intval($id_document)), '',array(), '', '', $serveur); + return sql_fetsel('*', 'spip_documents', ("id_document=" . intval($id_document)), '', array(), '', '', $serveur); } /** @@ -260,13 +283,13 @@ function quete_document($id_document, $serveur = '') { */ function quete_meta($nom, $serveur) { return sql_getfetsel("valeur", "spip_meta", "nom=" . sql_quote($nom), - '','','','',$serveur); + '', '', '', '', $serveur); } /** * Retourne le logo d'un objet, éventuellement par héritage * - * Si flag != false, retourne le chemin du fichier, sinon retourne un tableau + * Si flag != false, retourne le chemin du fichier, sinon retourne un tableau * de 3 elements : * le chemin du fichier, celui du logo de survol, l'attribut style=w/h. * @@ -277,52 +300,63 @@ function quete_meta($nom, $serveur) { * @param int $id * Identifiant de l'objet dont on veut chercher le logo. * @param int $id_rubrique - * Identifiant de la rubrique parente si l'on veut aller chercher son logo + * Identifiant de la rubrique parente si l'on veut aller chercher son logo * dans le cas où l'objet demandé n'en a pas. * @param bool $flag - * Lorsque le drapeau est évalué comme "true", la fonction ne renvoie + * Lorsque le drapeau est évalué comme "true", la fonction ne renvoie * que le chemin du fichier, sinon elle renvoie le tableau plus complet. * @return array|string * Retourne soit un tableau, soit le chemin du fichier. */ function quete_logo($type, $onoff, $id, $id_rubrique, $flag) { static $chercher_logo; - if (is_null($chercher_logo)) + if (is_null($chercher_logo)) { $chercher_logo = charger_fonction('chercher_logo', 'inc'); + } $nom = strtolower($onoff); while (1) { $on = $chercher_logo($id, $type, $nom); if ($on) { - if ($flag) + if ($flag) { return "$on[2].$on[3]"; - else { + } else { $taille = @getimagesize($on[0]); $off = ($onoff != 'ON') ? '' : $chercher_logo($id, $type, 'off'); // on retourne une url du type IMG/artonXX?timestamp // qui permet de distinguer le changement de logo // et placer un expire sur le dossier IMG/ - $res = array ($on[0].($on[4]?"?$on[4]":""), - ($off ? $off[0] . ($off[4]?"?$off[4]":"") : ''), - (!$taille ? '' : (" ".$taille[3]))); + $res = array( + $on[0] . ($on[4] ? "?$on[4]" : ""), + ($off ? $off[0] . ($off[4] ? "?$off[4]" : "") : ''), + (!$taille ? '' : (" " . $taille[3])) + ); $res['src'] = $res[0]; $res['logo_on'] = $res[0]; $res['logo_off'] = $res[1]; - $res['width'] = ($taille?$taille[0]:''); - $res['height'] = ($taille?$taille[1]:''); + $res['width'] = ($taille ? $taille[0] : ''); + $res['height'] = ($taille ? $taille[1] : ''); + return $res; } + } else { + if (defined('_LOGO_RUBRIQUE_DESACTIVER_HERITAGE')) { + return ''; + } else { + if ($id_rubrique) { + $type = 'id_rubrique'; + $id = $id_rubrique; + $id_rubrique = 0; + } else { + if ($id AND $type == 'id_rubrique') { + $id = quete_parent($id); + } else { + return ''; + } + } + } } - else if (defined('_LOGO_RUBRIQUE_DESACTIVER_HERITAGE')) - return ''; - else if ($id_rubrique) { - $type = 'id_rubrique'; - $id = $id_rubrique; - $id_rubrique = 0; - } else if ($id AND $type == 'id_rubrique') - $id = quete_parent($id); - else return ''; } } @@ -335,19 +369,24 @@ function quete_logo($type, $onoff, $id, $id_rubrique, $flag) { * @param string $connect * @return bool|string */ -function quete_logo_file($row, $connect = NULL) { +function quete_logo_file($row, $connect = null) { include_spip('inc/documents'); $logo = vignette_logo_document($row, $connect); - if (!$logo) $logo = image_du_document($row); - if (!$logo){ - $f = charger_fonction('vignette','inc'); + if (!$logo) { + $logo = image_du_document($row); + } + if (!$logo) { + $f = charger_fonction('vignette', 'inc'); $logo = $f($row['extension'], false); } // si c'est une vignette type doc, la renvoyer direct - if (strcmp($logo,_DIR_PLUGINS)==0 - OR strcmp($logo,_DIR_PLUGINS_DIST)==0 - OR strcmp($logo,_DIR_RACINE.'prive/')==0) + if (strcmp($logo, _DIR_PLUGINS) == 0 + OR strcmp($logo, _DIR_PLUGINS_DIST) == 0 + OR strcmp($logo, _DIR_RACINE . 'prive/') == 0 + ) { return $logo; + } + return get_spip_doc($logo); } @@ -374,16 +413,20 @@ function quete_logo_file($row, $connect = NULL) { * serveur * @return string */ -function quete_logo_document($row, $lien, $align, $mode_logo, $x, $y, $connect = NULL) { +function quete_logo_document($row, $lien, $align, $mode_logo, $x, $y, $connect = null) { include_spip('inc/documents'); $logo = ''; - if (!in_array($mode_logo,array('icone','apercu'))) + if (!in_array($mode_logo, array('icone', 'apercu'))) { $logo = vignette_logo_document($row, $connect); + } // si on veut explicitement la vignette, ne rien renvoyer si il n'y en a pas - if ($mode_logo == 'vignette' AND !$logo) + if ($mode_logo == 'vignette' AND !$logo) { return ''; - if ($mode_logo == 'icone') + } + if ($mode_logo == 'icone') { $row['fichier'] = ''; + } + return vignette_automatique($logo, $row, $lien, $x, $y, $align); } @@ -396,25 +439,32 @@ function quete_logo_document($row, $lien, $align, $mode_logo, $x, $y, $connect = * @param string $connect * @return string */ -function vignette_logo_document($row, $connect = '') -{ - if (!$row['id_vignette']) return ''; +function vignette_logo_document($row, $connect = '') { + if (!$row['id_vignette']) { + return ''; + } $fichier = quete_fichier($row['id_vignette'], $connect); if ($connect) { $site = quete_meta('adresse_site', $connect); $dir = quete_meta('dir_img', $connect); + return "$site/$dir$fichier"; } $f = get_spip_doc($fichier); - if ($f AND @file_exists($f)) return $f; - if ($row['mode'] !== 'vignette') return ''; - return generer_url_entite($row['id_document'], 'document','','', $connect); + if ($f AND @file_exists($f)) { + return $f; + } + if ($row['mode'] !== 'vignette') { + return ''; + } + + return generer_url_entite($row['id_document'], 'document', '', '', $connect); } /** * Calcul pour savoir si un objet est expose dans le contexte * fournit par $reference - * + * * http://code.spip.net/@calcul_exposer * * @param int $id @@ -425,59 +475,67 @@ function vignette_logo_document($row, $connect = '') * @param string $connect * @return bool|string */ -function calcul_exposer ($id, $prim, $reference, $parent, $type, $connect = '') { +function calcul_exposer($id, $prim, $reference, $parent, $type, $connect = '') { static $exposer = array(); // Que faut-il exposer ? Tous les elements de $reference // ainsi que leur hierarchie ; on ne fait donc ce calcul // qu'une fois (par squelette) et on conserve le resultat // en static. - if (!isset($exposer[$m=md5(serialize($reference))][$prim])) { - $principal = isset($reference[$type])?$reference[$type]: + if (!isset($exposer[$m = md5(serialize($reference))][$prim])) { + $principal = isset($reference[$type]) ? $reference[$type] : // cas de la pagination indecte @xx qui positionne la page avec l'id xx // et donne la reference dynamique @type=xx dans le contexte - (isset($reference["@$type"])?$reference["@$type"]:''); + (isset($reference["@$type"]) ? $reference["@$type"] : ''); // le parent fournit en argument est le parent de $id, pas celui de $principal // il n'est donc pas utile $parent = 0; if (!$principal) { // regarder si un enfant est dans le contexte, auquel cas il expose peut etre le parent courant - $enfants = array('id_rubrique'=>array('id_article'),'id_groupe'=>array('id_mot')); - if (isset($enfants[$type])) - foreach($enfants[$type] as $t) + $enfants = array('id_rubrique' => array('id_article'), 'id_groupe' => array('id_mot')); + if (isset($enfants[$type])) { + foreach ($enfants[$type] as $t) { if (isset($reference[$t]) // cas de la reference donnee dynamiquement par la pagination - OR isset($reference["@$t"])) { + OR isset($reference["@$t"]) + ) { $type = $t; - $principal = isset($reference[$type])?$reference[$type]:$reference["@$type"]; + $principal = isset($reference[$type]) ? $reference[$type] : $reference["@$type"]; continue; } + } + } } $exposer[$m][$type] = array(); if ($principal) { - $principaux = is_array($principal)?$principal:array($principal); - foreach($principaux as $principal){ + $principaux = is_array($principal) ? $principal : array($principal); + foreach ($principaux as $principal) { $exposer[$m][$type][$principal] = true; - if ($type == 'id_mot'){ + if ($type == 'id_mot') { if (!$parent) { - $parent = sql_getfetsel('id_groupe','spip_mots',"id_mot=" . intval($principal), '','','','',$connect); + $parent = sql_getfetsel('id_groupe', 'spip_mots', "id_mot=" . intval($principal), '', '', '', '', $connect); } - if ($parent) + if ($parent) { $exposer[$m]['id_groupe'][$parent] = true; - } - else if ($type != 'id_groupe') { - if (!$parent) { - if ($type == 'id_rubrique') - $parent = $principal; - if ($type == 'id_article') { - $parent = quete_rubrique($principal,$connect); - } - } - do { $exposer[$m]['id_rubrique'][$parent] = true; } - while ($parent = quete_parent($parent, $connect)); + } + } else { + if ($type != 'id_groupe') { + if (!$parent) { + if ($type == 'id_rubrique') { + $parent = $principal; + } + if ($type == 'id_article') { + $parent = quete_rubrique($principal, $connect); + } + } + do { + $exposer[$m]['id_rubrique'][$parent] = true; + } while ($parent = quete_parent($parent, $connect)); + } } } } } + // And the winner is... return isset($exposer[$m][$prim]) ? isset($exposer[$m][$prim][$id]) : ''; } @@ -493,21 +551,24 @@ function calcul_exposer ($id, $prim, $reference, $parent, $type, $connect = '') * @param objetc $iter * @return int */ -function quete_debut_pagination($primary, $valeur, $pas, $iter){ +function quete_debut_pagination($primary, $valeur, $pas, $iter) { // on ne devrait pas arriver ici si la cle primaire est inexistante // ou composee, mais verifions - if (!$primary OR preg_match('/[,\s]/',$primary)) + if (!$primary OR preg_match('/[,\s]/', $primary)) { return 0; + } $pos = 0; - while ($row = $iter->fetch() AND $row[$primary]!=$valeur){ + while ($row = $iter->fetch() AND $row[$primary] != $valeur) { $pos++; } // si on a pas trouve - if ($row[$primary]!=$valeur) + if ($row[$primary] != $valeur) { return 0; + } // sinon, calculer le bon numero de page return floor($pos/$pas)*$pas; } + ?> diff --git a/ecrire/public/references.php b/ecrire/public/references.php index eec26ccf58..787796b717 100644 --- a/ecrire/public/references.php +++ b/ecrire/public/references.php @@ -14,15 +14,17 @@ * Fonctions de recherche et de reservation dans l'arborescence des boucles * * @package SPIP\Core\Compilateur\References -**/ -if (!defined('_ECRIRE_INC_VERSION')) return; + **/ +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Retrouver l'index de la boucle d'une balise * * Retrouve à quelle boucle appartient une balise, utile dans le cas * où une référence explicite est demandée - * + * * - `#MABALISE` : l'index est celui de la première boucle englobante * - `#_autreboucle:MABALISE` : l'index est celui de la boucle _autreboucle si elle est bien englobante * @@ -32,20 +34,20 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * $idb = index_boucle($p); * ``` * - * @param Champ $p AST au niveau de la balise + * @param Champ $p AST au niveau de la balise * @return string * * - Identifiant de la boucle possédant ce champ. * - '' si une référence explicite incorrecte est envoyée */ -function index_boucle($p){ +function index_boucle($p) { $idb = $p->id_boucle; $explicite = $p->nom_boucle; if (strlen($explicite)) { // Recherche d'un champ dans un etage superieur - while (($idb !== $explicite) && ($idb !=='')) { + while (($idb !== $explicite) && ($idb !== '')) { $idb = $p->boucles[$idb]->id_parent; } } @@ -55,11 +57,11 @@ function index_boucle($p){ /** * Retourne la position dans la pile d'un champ SQL - * + * * Retourne le code PHP permettant de récupérer un champ SQL dans * une boucle parente, en prenant la boucle la plus proche du sommet de pile * (indiqué par $idb). - * + * * Si on ne trouve rien, on considère que ça doit provenir du contexte * (par l'URL ou l'include) qui a été recopié dans Pile[0] * (un essai d'affinage a débouché sur un bug vicieux) @@ -67,9 +69,9 @@ function index_boucle($p){ * Si ca référence un champ SQL, on le mémorise dans la structure $boucles * afin de construire un requête SQL minimale (plutôt qu'un brutal 'SELECT *') * - * @param string $idb Identifiant de la boucle - * @param string $nom_champ Nom du champ SQL cherché - * @param array $boucles AST du squelette + * @param string $idb Identifiant de la boucle + * @param string $nom_champ Nom du champ SQL cherché + * @param array $boucles AST du squelette * @param string $explicite * Indique que le nom de la boucle est explicite dans la balise #_nomboucletruc:CHAMP * @param null|string $defaut @@ -83,14 +85,23 @@ function index_boucle($p){ * @return string * Code PHP pour obtenir le champ SQL */ -function index_pile($idb, $nom_champ, &$boucles, $explicite = '', $defaut = null, $remonte_pile = true, $select = true) { - if (!is_string($defaut)) - $defaut = '@$Pile[0][\''. strtolower($nom_champ) . '\']'; +function index_pile( + $idb, + $nom_champ, + &$boucles, + $explicite = '', + $defaut = null, + $remonte_pile = true, + $select = true +) { + if (!is_string($defaut)) { + $defaut = '@$Pile[0][\'' . strtolower($nom_champ) . '\']'; + } $i = 0; if (strlen($explicite)) { // Recherche d'un champ dans un etage superieur - while (($idb !== $explicite) && ($idb !=='')) { + while (($idb !== $explicite) && ($idb !== '')) { # spip_log("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'"); $i++; $idb = $boucles[$idb]->id_parent; @@ -114,7 +125,7 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite = '', $defaut = null } $champ = '$Pile[$SP' . ($i ? "-$i" : "") . '][\'' . $c . '\']'; if (!$joker) { - return index_compose($conditionnel,$champ); + return index_compose($conditionnel, $champ); } // tant que l'on trouve des tables avec joker, on continue @@ -124,20 +135,20 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite = '', $defaut = null $conditionnel[] = "isset($champ)?$champ"; } - if ($remonte_pile){ + if ($remonte_pile) { # spip_log("On remonte vers $i"); // Sinon on remonte d'un cran $idb = $boucles[$idb]->id_parent; $i++; - } - else + } else { $idb = null; + } } # spip_log("Pas vu $nom_champ"); // esperons qu'il y sera // ou qu'on a fourni une valeur par "defaut" plus pertinent - return index_compose($conditionnel,$defaut); + return index_compose($conditionnel, $defaut); } /** @@ -145,16 +156,17 @@ function index_pile($idb, $nom_champ, &$boucles, $explicite = '', $defaut = null * * On ajoute la valeur finale par défaut pour les balises dont on ne saura * qu'à l'exécution si elles sont definies ou non (boucle DATA) - * - * @param array $conditionnel Liste de codes PHP pour retrouver un champ - * @param string $defaut Valeur par défaut si aucun des moyens ne l'a trouvé + * + * @param array $conditionnel Liste de codes PHP pour retrouver un champ + * @param string $defaut Valeur par défaut si aucun des moyens ne l'a trouvé * @return string Code PHP complet de recherche d'un champ */ function index_compose($conditionnel, $defaut) { while ($c = array_pop($conditionnel)) { // si on passe defaut = '', ne pas générer d'erreur de compilation. - $defaut = "($c:(".($defaut?$defaut:"''")."))"; + $defaut = "($c:(" . ($defaut ? $defaut : "''") . "))"; } + return $defaut; } @@ -162,7 +174,7 @@ function index_compose($conditionnel, $defaut) { * Cherche un champ dans une boucle * * Le champ peut être : - * + * * - un alias d'un autre : il faut alors le calculer, éventuellement en * construisant une jointure. * - présent dans la table : on l'utilise @@ -175,12 +187,12 @@ function index_compose($conditionnel, $defaut) { * une jointure que si des jointures explicites sont demandées, * et non comme à d'autres endroits sur toutes les jointures possibles. * Il faut homogénéiser cela. - * * - * @param string $idb Identifiant de la boucle - * @param string $nom_champ Nom du champ SQL cherché - * @param Boucle $boucles AST du squelette - * @param bool $joker + * + * @param string $idb Identifiant de la boucle + * @param string $nom_champ Nom du champ SQL cherché + * @param Boucle $boucles AST du squelette + * @param bool $joker * Le champ peut-il être inconnu à la compilation ? * Ce drapeau sera levé si c'est le cas. * @return array @@ -188,16 +200,18 @@ function index_compose($conditionnel, $defaut) { * Le nom du champ véritable est une expression pour le SELECT de * la boucle tel que "rubriques.titre" ou "mots.titre AS titre_mot". * Les éléments de la liste sont vides si on ne trouve rien. -**/ + **/ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { $r = $boucles[$idb]->type_requete; // boucle recursive, c'est foutu... - if ($r == TYPE_RECURSIF) return array(); + if ($r == TYPE_RECURSIF) { + return array(); + } if (!$r) { $joker = false; // indiquer a l'appelant # continuer pour chercher l'erreur suivante - return array("'#" . $r . ':' . $nom_champ . "'",''); + return array("'#" . $r . ':' . $nom_champ . "'", ''); } $desc = $boucles[$idb]->show; @@ -209,8 +223,7 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { if ($excep) { $joker = false; // indiquer a l'appelant return index_exception($boucles[$idb], $desc, $nom_champ, $excep); - } - // pas d'alias. Le champ existe t'il ? + } // pas d'alias. Le champ existe t'il ? else { // le champ est réellement présent, on le prend. if (isset($desc['field'][$nom_champ])) { @@ -223,7 +236,9 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { // C'est le cas des itérateurs DATA qui acceptent tout // et testent la présence du champ à l'exécution et non à la compilation // car ils ne connaissent pas ici leurs contenus. - elseif (/*$joker AND */isset($desc['field']['*'])) { + elseif (/*$joker AND */ + isset($desc['field']['*']) + ) { $joker = true; // indiquer a l'appelant return array($nom_champ, $nom_champ); } @@ -233,14 +248,14 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { $joker = false; // indiquer a l'appelant // regarder si le champ est deja dans une jointure existante // sinon, si il y a des joitures explicites, la construire - if (!$t = trouver_champ_exterieur($nom_champ,$boucles[$idb]->from,$boucles[$idb])){ + if (!$t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) { if ($boucles[$idb]->jointures_explicites) { // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites // mais est-ce ce qu'on veut ? - $jointures = preg_split("/\s+/",$boucles[$idb]->jointures_explicites); - if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)){ - $t = trouver_champ_exterieur($nom_champ,$boucles[$idb]->from,$boucles[$idb]); + $jointures = preg_split("/\s+/", $boucles[$idb]->jointures_explicites); + if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { + $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); } } } @@ -252,7 +267,8 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { $nom_champ, array($t[1]['id_table'], reset($t[2]))); } - return array('',''); + + return array('', ''); } } } @@ -265,12 +281,12 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { * Ça peut même être d'un champ dans une jointure qu'il faut provoquer * si ce n'est fait * - * @param Boucle $boucle Boucle dont on prend un alias de champ - * @param array $desc Description de la table SQL de la boucle - * @param string $nom_champ Nom du champ original demandé - * @param array $excep + * @param Boucle $boucle Boucle dont on prend un alias de champ + * @param array $desc Description de la table SQL de la boucle + * @param string $nom_champ Nom du champ original demandé + * @param array $excep * Description de l'exception pour ce champ. Peut être : - * + * * - string : nom du champ véritable dans la table * - array : * - liste (table, champ) indique que le véritable champ @@ -280,34 +296,37 @@ function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { * @return array * Liste (nom du champ alias, nom du champ). Le nom du champ alias * est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot" -**/ -function index_exception(&$boucle, $desc, $nom_champ, $excep) -{ + **/ +function index_exception(&$boucle, $desc, $nom_champ, $excep) { static $trouver_table; - if (!$trouver_table) + if (!$trouver_table) { $trouver_table = charger_fonction('trouver_table', 'base'); + } if (is_array($excep)) { // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables - $t = NULL; - if (count($excep)==3){ + $t = null; + if (count($excep) == 3) { $index_exception_derogatoire = array_pop($excep); $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); } - if ($t == NULL) { - list($e, $x) = $excep; #PHP4 affecte de gauche a droite - $excep = $x; #PHP5 de droite a gauche ! + if ($t == null) { + list($e, $x) = $excep; #PHP4 affecte de gauche a droite + $excep = $x; #PHP5 de droite a gauche ! $j = $trouver_table($e, $boucle->sql_serveur); - if (!$j) return array('',''); + if (!$j) { + return array('', ''); + } $e = $j['table']; if (!$t = array_search($e, $boucle->from)) { $k = $j['key']['PRIMARY KEY']; - if (strpos($k,',')) { + if (strpos($k, ',')) { $l = (preg_split('/\s*,\s*/', $k)); $k = $desc['key']['PRIMARY KEY']; if (!in_array($k, $l)) { spip_log("jointure impossible $e " . join(',', $l)); - return array('',''); + + return array('', ''); } } $k = array($boucle->id_table, array($e), $k); @@ -315,11 +334,15 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep) $t = array_search($e, $boucle->from); } } + } else { + $t = $boucle->id_table; } - else $t = $boucle->id_table; // demander a SQL de gerer le synonyme // ca permet que excep soit dynamique (Cedric, 2/3/06) - if ($excep != $nom_champ) $excep .= ' AS '. $nom_champ; + if ($excep != $nom_champ) { + $excep .= ' AS ' . $nom_champ; + } + return array("$t.$excep", $nom_champ); } @@ -328,7 +351,7 @@ function index_exception(&$boucle, $desc, $nom_champ, $excep) * * Le champ est cherché dans l'empilement de boucles, sinon dans la valeur * par défaut (qui est l'environnement du squelette si on ne la précise pas). - * + * * @api * @param string $champ * Champ recherché @@ -358,14 +381,15 @@ function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) { * * @uses calculer_balise() * @uses applique_filtres() - * + * * @param Champ $p * AST au niveau de la balise * @return string * Code PHP pour d'exécution de la balise et de ses filtres -**/ + **/ function calculer_champ($p) { $p = calculer_balise($p->nom_champ, $p); + return applique_filtres($p); } @@ -391,32 +415,35 @@ function calculer_champ($p) { * * @uses calculer_balise_DEFAUT_dist() * Lorsqu'aucune fonction spécifique n'est trouvée. - * @see charger_fonction() + * @see charger_fonction() * Pour la recherche des fonctions de balises - * + * * @param string $nom * Nom de la balise * @param Champ $p * AST au niveau de la balise * @return Champ * Pile complétée par le code PHP pour l'exécution de la balise et de ses filtres -**/ + **/ function calculer_balise($nom, $p) { // S'agit-t-il d'une balise_XXXX[_dist]() ? if ($f = charger_fonction($nom, 'balise', true)) { $p->balise_calculee = true; $res = $f($p); - if ($res !== NULL AND is_object($res)) + if ($res !== null AND is_object($res)) { return $res; + } } // Certaines des balises comportant un _ sont generiques if ($f = strpos($nom, '_') - AND $f = charger_fonction(substr($nom,0,$f+1), 'balise', true)) { + AND $f = charger_fonction(substr($nom, 0, $f+1), 'balise', true) + ) { $res = $f($p); - if ($res !== NULL AND is_object($res)) + if ($res !== null AND is_object($res)) { return $res; + } } $f = charger_fonction('DEFAUT', 'calculer_balise'); @@ -430,23 +457,23 @@ function calculer_balise($nom, $p) { * * Cette fonction demande à calculer le code PHP d'une balise qui * n'a pas de fonction spécifique. - * + * * On considère la balise comme une référence à une colonne de table SQL * connue, sinon à l'environnement. - + * * @uses index_pile() * Pour la recherche de la balise comme colonne SQL ou comme environnement * @note * Le texte de la balise est retourné si il ressemble à une couleur * et qu'aucun champ correspondant n'a été trouvé, comme `#CCAABB` - * + * * @param string $nom * Nom de la balise * @param Champ $p * AST au niveau de la balise * @return string * Code PHP pour d'exécution de la balise et de ses filtres -**/ + **/ function calculer_balise_DEFAUT_dist($nom, $p) { // ca pourrait etre un champ SQL homonyme, @@ -460,8 +487,9 @@ function calculer_balise_DEFAUT_dist($nom, $p) { } // ne pas passer le filtre securite sur les id_xxx - if (strpos($nom, 'ID_') === 0) + if (strpos($nom, 'ID_') === 0) { $p->interdire_scripts = false; + } // Compatibilite ascendante avec les couleurs html (#FEFEFE) : // SI le champ SQL n'est pas trouve @@ -470,8 +498,9 @@ function calculer_balise_DEFAUT_dist($nom, $p) { // ALORS retourner la couleur. // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)] if (preg_match("/^[A-F]{1,6}$/i", $nom) - AND !$p->etoile - AND !$p->fonctions) { + AND !$p->etoile + AND !$p->fonctions + ) { $p->code = "'#$nom'"; $p->interdire_scripts = false; } @@ -480,7 +509,6 @@ function calculer_balise_DEFAUT_dist($nom, $p) { } - /** Code PHP d'exécution d'une balise dynamique */ define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s', array(%s%s), @@ -491,20 +519,20 @@ define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s', * Calcule le code PHP d'exécution d'une balise SPIP dynamique * * Calcule les balises dynamiques, notamment les `formulaire_*`. - * + * * Inclut le fichier associé à son nom, qui contient la fonction homonyme * donnant les arguments à chercher dans la pile, et qui sont donc compilés. * * On leur adjoint les arguments explicites de la balise (cf `#LOGIN{url}`) * et d'éventuelles valeurs transmises d'autorité par la balise. * (cf http://core.spip.net/issues/1728) - * + * * La fonction `executer_balise_dynamique()` définie par la * constante `CODE_EXECUTER_BALISE` recevra à l'exécution la valeur de tout ca. * * @uses collecter_balise_dynamique() * Qui calcule le code d'exécution de chaque argument de la balise - * @see executer_balise_dynamique() + * @see executer_balise_dynamique() * Code PHP produit qui chargera les fonctions de la balise dynamique à l'exécution, * appelée avec les arguments calculés. * @param Champ $p @@ -517,11 +545,12 @@ define('CODE_EXECUTER_BALISE', "executer_balise_dynamique('%s', * Liste de données supplémentaires à transmettre au code d'exécution. * @return Champ * Balise complétée de son code d'exécution -**/ + **/ function calculer_balise_dynamique($p, $nom, $l, $supp = array()) { if (!balise_distante_interdite($p)) { $p->code = "''"; + return $p; } // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour @@ -535,16 +564,19 @@ function calculer_balise_dynamique($p, $nom, $l, $supp = array()) { array_shift($c); // construire la liste d'arguments comme pour un filtre $param = compose_filtres_args($p, $c, ','); - } else $param = ""; + } else { + $param = ""; + } $collecte = collecter_balise_dynamique($l, $p, $nom); $p->code = sprintf(CODE_EXECUTER_BALISE, $nom, join(',', $collecte), - ($collecte ? $param : substr($param,1)), # virer la virgule + ($collecte ? $param : substr($param, 1)), # virer la virgule memoriser_contexte_compil($p), (!$supp ? '' : (', ' . join(',', $supp)))); $p->interdire_scripts = false; + return $p; } @@ -553,17 +585,17 @@ function calculer_balise_dynamique($p, $nom, $l, $supp = array()) { * Construction du tableau des arguments d'une balise dynamique. * * Pour chaque argument (un nom de balise), crée le code PHP qui le calculera. - * + * * @note * Ces arguments peuvent être eux-même des balises (cf FORMULAIRE_SIGNATURE) * mais gare au bouclage (on peut s'aider de `$nom` pour le réperer au besoin) - * + * * En revanche ils n'ont pas de filtres, donc on appelle `calculer_balise()` qui * ne s'occupe pas de ce qu'il y a dans `$p` (mais qui va y ecrire le code) * * @uses calculer_balise() * Pour obtenir le code d'éxécution de chaque argument. - * + * * @param array $l * Liste des noms d'arguments (balises) à collecter (chaque argument * de la balise dynamique est considéré comme étant un nom de balise) @@ -573,37 +605,42 @@ function calculer_balise_dynamique($p, $nom, $l, $supp = array()) { * Nom de la balise * @return array * Liste des codes PHP d'éxecution des balises collectées -**/ + **/ function collecter_balise_dynamique($l, &$p, $nom) { $args = array(); - foreach($l as $c) { $x = calculer_balise($c, $p); $args[] = $x->code;} + foreach ($l as $c) { + $x = calculer_balise($c, $p); + $args[] = $x->code; + } + return $args; } - - /** * Récuperer le nom du serveur - * + * * Mais pas si c'est un serveur spécifique dérogatoire - * + * * @param Champ $p * AST positionné sur la balise * @return string * Nom de la connexion -**/ + **/ function trouver_nom_serveur_distant($p) { $nom = $p->id_boucle; if ($nom - AND isset($p->boucles[$nom])) { + AND isset($p->boucles[$nom]) + ) { $s = $p->boucles[$nom]->sql_serveur; if (strlen($s) AND strlen($serveur = strtolower($s)) - AND !in_array($serveur,$GLOBALS['exception_des_connect'])) { - return $serveur; + AND !in_array($serveur, $GLOBALS['exception_des_connect']) + ) { + return $serveur; } } + return ""; } @@ -613,27 +650,29 @@ function trouver_nom_serveur_distant($p) { * * La fonction loge une erreur si la balise est utilisée sur une * base distante et retourne false dans ce cas. - * + * * @note * Il faudrait savoir traiter les formulaires en local * tout en appelant le serveur SQL distant. * En attendant, cette fonction permet de refuser une authentification * sur quelque-chose qui n'a rien a voir. - * + * * @param Champ $p * AST positionné sur la balise * @return bool - * + * * - true : La balise est autorisée * - false : La balise est interdite car le serveur est distant -**/ + **/ function balise_distante_interdite($p) { $nom = $p->id_boucle; if ($nom AND trouver_nom_serveur_distant($p)) { - spip_log( $nom .':' . $p->nom_champ .' '._T('zbug_distant_interdit')); + spip_log($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); + return false; } + return true; } @@ -643,7 +682,7 @@ function balise_distante_interdite($p) { // definis par $table_des_traitements, cf. ecrire/public/interfaces // // http://code.spip.net/@champs_traitements -function champs_traitements ($p) { +function champs_traitements($p) { if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) { $ps = $GLOBALS['table_des_traitements'][$p->nom_champ]; @@ -651,10 +690,11 @@ function champs_traitements ($p) { // quand on utilise un traitement catch-all * // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer // leur propre securite - if (!$p->balise_calculee) + if (!$p->balise_calculee) { $ps = $GLOBALS['table_des_traitements']['*']; - else + } else { $ps = false; + } } if (is_array($ps)) { @@ -662,22 +702,25 @@ function champs_traitements ($p) { $idb = index_boucle($p); // mais on peut aussi etre hors boucle. Se mefier. $type_requete = isset($p->boucles[$idb]->type_requete) ? $p->boucles[$idb]->type_requete : false; - $table_sql = isset($p->boucles[$idb]->show['table_sql'])?$p->boucles[$idb]->show['table_sql']:false; + $table_sql = isset($p->boucles[$idb]->show['table_sql']) ? $p->boucles[$idb]->show['table_sql'] : false; // le traitement peut n'etre defini que pour une table en particulier "spip_articles" - if ($table_sql AND isset($ps[$table_sql])) + if ($table_sql AND isset($ps[$table_sql])) { $ps = $ps[$table_sql]; - // ou pour une boucle en particulier "DATA","articles" - elseif ($type_requete AND isset($ps[$type_requete])) + } // ou pour une boucle en particulier "DATA","articles" + elseif ($type_requete AND isset($ps[$type_requete])) { $ps = $ps[$type_requete]; - // ou pour indiferrement quelle que soit la boucle - elseif(isset($ps[0])) + } // ou pour indiferrement quelle que soit la boucle + elseif (isset($ps[0])) { $ps = $ps[0]; - else - $ps=false; + } else { + $ps = false; + } } - if (!$ps) return $p->code; + if (!$ps) { + return $p->code; + } // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, // ou si in INCLURE contient {doublons} @@ -685,15 +728,16 @@ function champs_traitements ($p) { // dans les filtres propre() ou typo() // (qui traitent les raccourcis <docXX> referencant les docs) - if (isset($p->descr['documents']) - AND - $p->descr['documents'] - AND ( - (strpos($ps,'propre') !== false) - OR - (strpos($ps,'typo') !== false) - )) { - $ps = 'traiter_doublons_documents($doublons, '.$ps.')'; + if (isset($p->descr['documents']) + AND + $p->descr['documents'] + AND ( + (strpos($ps, 'propre') !== false) + OR + (strpos($ps, 'typo') !== false) + ) + ) { + $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; } // La protection des champs par |safehtml est assuree par les extensions @@ -714,21 +758,25 @@ function champs_traitements ($p) { function applique_filtres($p) { // Traitements standards (cf. supra) - if ($p->etoile == '') + if ($p->etoile == '') { $code = champs_traitements($p); - else + } else { $code = $p->code; + } // Appliquer les filtres perso - if ($p->param) + if ($p->param) { $code = compose_filtres($p, $code); + } // S'il y a un lien avec la session, ajouter un code qui levera // un drapeau dans la structure d'invalidation $Cache - if (isset($p->descr['session'])) + if (isset($p->descr['session'])) { $code = "invalideur_session(\$Cache, $code)"; + } $code = sandbox_composer_interdire_scripts($code, $p); + return $code; } @@ -737,13 +785,15 @@ function applique_filtres($p) { function compose_filtres(&$p, $code) { $image_miette = false; - foreach($p->param as $filtre) { + foreach ($p->param as $filtre) { $fonc = array_shift($filtre); - if (!$fonc) continue; // normalement qu'au premier tour. - $is_filtre_image = ((substr($fonc,0,6)=='image_') AND $fonc!='image_graver'); - if ($image_miette AND !$is_filtre_image){ - // il faut graver maintenant car apres le filtre en cours - // on est pas sur d'avoir encore le nom du fichier dans le pipe + if (!$fonc) { + continue; + } // normalement qu'au premier tour. + $is_filtre_image = ((substr($fonc, 0, 6) == 'image_') AND $fonc != 'image_graver'); + if ($image_miette AND !$is_filtre_image) { + // il faut graver maintenant car apres le filtre en cours + // on est pas sur d'avoir encore le nom du fichier dans le pipe $code = "filtrer('image_graver', $code)"; $image_miette = false; } @@ -751,31 +801,35 @@ function compose_filtres(&$p, $code) { // a separer par "," ou ":" dans le cas du filtre "?{a,b}" if ($fonc !== '?') { $sep = ','; - } else {$sep = ':'; + } else { + $sep = ':'; // |?{a,b} *doit* avoir exactement 2 arguments ; on les force - if (count($filtre) != 2) - $filtre = array(isset($filtre[0])?$filtre[0]:"", isset($filtre[1])?$filtre[1]:""); + if (count($filtre) != 2) { + $filtre = array(isset($filtre[0]) ? $filtre[0] : "", isset($filtre[1]) ? $filtre[1] : ""); + } } $arglist = compose_filtres_args($p, $filtre, $sep); - $logique = filtre_logique($fonc, $code, substr($arglist,1)); - if ($logique) + $logique = filtre_logique($fonc, $code, substr($arglist, 1)); + if ($logique) { $code = $logique; - else { - $code = sandbox_composer_filtre($fonc,$code,$arglist,$p); - if ($is_filtre_image) $image_miette = true; + } else { + $code = sandbox_composer_filtre($fonc, $code, $arglist, $p); + if ($is_filtre_image) { + $image_miette = true; + } } } // ramasser les images intermediaires inutiles et graver l'image finale - if ($image_miette) + if ($image_miette) { $code = "filtrer('image_graver',$code)"; + } return $code; } // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes // et comparateurs -function filtre_logique($fonc, $code, $arg) -{ +function filtre_logique($fonc, $code, $arg) { switch (true) { case in_array($fonc, $GLOBALS['table_criteres_infixes']): @@ -793,17 +847,18 @@ function filtre_logique($fonc, $code, $arg) case ($fonc == 'yes') OR ($fonc == 'oui'): return "(($code) ?' ' :'')"; } + return ''; } // http://code.spip.net/@compose_filtres_args -function compose_filtres_args($p, $args, $sep) -{ +function compose_filtres_args($p, $args, $sep) { $arglist = ""; foreach ($args as $arg) { - $arglist .= $sep . - calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); + $arglist .= $sep . + calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); } + return $arglist; } @@ -814,23 +869,23 @@ function compose_filtres_args($p, $args, $sep) * * Attention en recursif il faut les réserver chez soi-même ET chez sa maman * - * @param string $idb Identifiant de la boucle - * @param string $nom_champ - * @param array $boucles AST du squelette - * @param null|string $defaut - * @return -**/ + * @param string $idb Identifiant de la boucle + * @param string $nom_champ + * @param array $boucles AST du squelette + * @param null|string $defaut + * @return + **/ function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) { // si recursif, forcer l'extraction du champ SQL mais ignorer le code if ($boucles[$idb]->externe) { - index_pile ($idb, $nom_champ, $boucles,'', $defaut); + index_pile($idb, $nom_champ, $boucles, '', $defaut); // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle // on ignore le defaut fourni dans ce cas $defaut = "@\$Pile[\$SP]['$nom_champ']"; } - return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles,'', $defaut); + return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut); } // @@ -844,15 +899,14 @@ function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null // // http://code.spip.net/@rindex_pile -function rindex_pile($p, $champ, $motif) -{ +function rindex_pile($p, $champ, $motif) { $n = 0; $b = $p->id_boucle; $p->code = ''; while ($b != '') { - foreach($p->boucles[$b]->criteres as $critere) { + foreach ($p->boucles[$b]->criteres as $critere) { if ($critere->op == $motif) { - $p->code = '$Pile[$SP' . (($n==0) ? "" : "-$n") . + $p->code = '$Pile[$SP' . (($n == 0) ? "" : "-$n") . "]['$champ']"; $b = ''; break 2; @@ -863,10 +917,12 @@ function rindex_pile($p, $champ, $motif) } // si on est hors d'une boucle de {recherche}, cette balise est vide - if (!$p->code) + if (!$p->code) { $p->code = "''"; + } $p->interdire_scripts = false; + return $p; } diff --git a/ecrire/public/sandbox.php b/ecrire/public/sandbox.php index 618cb0bda0..9e6202eb1c 100644 --- a/ecrire/public/sandbox.php +++ b/ecrire/public/sandbox.php @@ -14,19 +14,21 @@ * Gestion d'une sécurisation des squelettes * * Une surcharge de ce fichier pourrait permettre : - * + * * - de limiter l'utilisation des filtres à l'aide d'une liste blanche ou liste noire, * - de rendre inactif le PHP écrit dans les squelettes * - de refuser l'inclusion de fichier PHP dans les squelettes * * @package SPIP\Core\Compilateur\Sandbox -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Composer le code d'exécution d'un texte - * + * * En principe juste un echappement de guillemets * sauf si on veut aussi echapper et interdire les scripts serveurs * dans les squelettes @@ -36,10 +38,11 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @param Champ $p * Balise qui appelle ce texte * @return string - * Texte + * Texte */ -function sandbox_composer_texte($texte, &$p){ - $code = "'".str_replace(array("\\","'"),array("\\\\","\\'"), $texte)."'"; +function sandbox_composer_texte($texte, &$p) { + $code = "'" . str_replace(array("\\", "'"), array("\\\\", "\\'"), $texte) . "'"; + return $code; } @@ -54,7 +57,7 @@ function sandbox_composer_texte($texte, &$p){ * Balise qui appelle ce filtre * @return string */ -function sandbox_composer_filtre($fonc, $code, $arglist, &$p){ +function sandbox_composer_filtre($fonc, $code, $arglist, &$p) { if (isset($GLOBALS['spip_matrice'][$fonc])) { $code = "filtrer('$fonc',$code$arglist)"; } @@ -73,14 +76,15 @@ function sandbox_composer_filtre($fonc, $code, $arglist, &$p){ $refs = $refl->getParameters(); if (isset($refs[0]) AND $refs[0]->name == 'Pile') { $code = "$f(\$Pile,$code$arglist)"; - } - else { + } else { $code = "$f($code$arglist)"; } } // le filtre n'existe pas, // on le notifie - else erreur_squelette(array('zbug_erreur_filtre', array('filtre'=> texte_script($fonc))), $p); + else { + erreur_squelette(array('zbug_erreur_filtre', array('filtre' => texte_script($fonc))), $p); + } return $code; } @@ -105,12 +109,14 @@ else { * @param array $_contexte * @return string */ -function sandbox_composer_inclure_php($fichier, &$p, $_contexte){ +function sandbox_composer_inclure_php($fichier, &$p, $_contexte) { $compil = texte_script(memoriser_contexte_compil($p)); // si inexistant, on essaiera a l'execution - if ($path = find_in_path($fichier)) + if ($path = find_in_path($fichier)) { $path = "\"$path\""; - else $path = "find_in_path(\"$fichier\")"; + } else { + $path = "find_in_path(\"$fichier\")"; + } return sprintf(CODE_INCLURE_SCRIPT, $path, $fichier, $compil, $_contexte); } @@ -123,57 +129,62 @@ function sandbox_composer_inclure_php($fichier, &$p, $_contexte){ * Balise sur laquelle s'applique le filtre * @return string */ -function sandbox_composer_interdire_scripts($code, &$p){ +function sandbox_composer_interdire_scripts($code, &$p) { // Securite if ($p->interdire_scripts - AND $p->etoile != '**') { - if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) + AND $p->etoile != '**' + ) { + if (!preg_match("/^sinon[(](.*),'([^']*)'[)]$/", $code, $r)) { $code = "interdire_scripts($code)"; - else { + } else { $code = interdire_scripts($r[2]); $code = "sinon(interdire_scripts($r[1]),'$code')"; } } + return $code; } /** * Appliquer des filtres sur un squelette complet - * + * * La fonction accèpte plusieurs tableaux de filtres à partir du 3ème argument * qui seront appliqués dans l'ordre * * @uses echapper_php_callback() - * + * * @param array $skel * @param string $corps * @param array $filtres * Tableau de filtres à appliquer. * @return mixed|string */ -function sandbox_filtrer_squelette($skel, $corps, $filtres){ +function sandbox_filtrer_squelette($skel, $corps, $filtres) { $series_filtres = func_get_args(); array_shift($series_filtres);// skel array_shift($series_filtres);// corps // proteger les <INCLUDE> et tous les morceaux de php licites - if ($skel['process_ins'] == 'php') - $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS','echapper_php_callback', $corps); + if ($skel['process_ins'] == 'php') { + $corps = preg_replace_callback(',<[?](\s|php|=).*[?]>,UimsS', 'echapper_php_callback', $corps); + } // recuperer les couples de remplacement $replace = echapper_php_callback(); - foreach($series_filtres as $filtres){ - if (count($filtres)) + foreach ($series_filtres as $filtres) { + if (count($filtres)) { foreach ($filtres as $filtre) { - if ($filtre AND $f = chercher_filtre($filtre)) + if ($filtre AND $f = chercher_filtre($filtre)) { $corps = $f($corps); + } } + } } // restaurer les echappements - return str_replace($replace[0],$replace[1],$corps); + return str_replace($replace[0], $replace[1], $corps); } @@ -183,14 +194,14 @@ function sandbox_filtrer_squelette($skel, $corps, $filtres){ * Rappeler la fonction sans paramètre pour obtenir les substitutions réalisées. * * @see sandbox_filtrer_squelette() - * + * * @param array|null $r * - array : ce sont les captures de la regex à échapper * - NULL : demande à dépiler tous les échappements réalisés * @return string|array * - string : hash de substitution du code php lorsque `$r` est un array * - array : Liste( liste des codes PHP, liste des substitutions ) -**/ + **/ function echapper_php_callback($r = null) { static $src = array(); static $dst = array(); @@ -199,12 +210,14 @@ function echapper_php_callback($r = null) { // on enregistre le code a echapper dans dst, et le code echappe dans src if (is_array($r)) { $dst[] = $r[0]; - return $src[] = '___'.md5($r[0]).'___'; + + return $src[] = '___' . md5($r[0]) . '___'; } // si on recoit pas un tableau, on renvoit les couples de substitution // et on RAZ les remplacements - $r = array($src,$dst); + $r = array($src, $dst); $src = $dst = array(); + return $r; } diff --git a/ecrire/public/styliser.php b/ecrire/public/styliser.php index 465a21da9d..f0f109d360 100644 --- a/ecrire/public/styliser.php +++ b/ecrire/public/styliser.php @@ -17,16 +17,18 @@ * Recherche par exemple `contenu\xx` et en absence utilisera `contenu\dist` * * @package SPIP\Core\Public\Styliser -**/ + **/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Ce fichier doit imperativement definir la fonction ci-dessous: /** * Déterminer le squelette qui sera utilisé pour rendre la page ou le bloc * à partir de `$fond` et du `$contetxe` - * + * * Actuellement tous les squelettes se terminent par `.html` * pour des raisons historiques, ce qui est trompeur * @@ -41,20 +43,22 @@ function public_styliser_dist($fond, $contexte, $lang = '', $connect = '') { // s'assurer que le fond est licite // car il peut etre construit a partir d'une variable d'environnement - if (strpos($fond,"../")!==false OR strncmp($fond,'/',1)==0) + if (strpos($fond, "../") !== false OR strncmp($fond, '/', 1) == 0) { $fond = "404"; - + } + // Choisir entre $fond-dist.html, $fond=7.html, etc? $id_rubrique = 0; // Chercher le fond qui va servir de squelette - if ($r = quete_rubrique_fond($contexte)) + if ($r = quete_rubrique_fond($contexte)) { list($id_rubrique, $lang) = $r; + } // trouver un squelette du nom demande // ne rien dire si on ne trouve pas, // c'est l'appelant qui sait comment gerer la situation // ou les plugins qui feront mieux dans le pipeline - $squelette = trouver_fond($fond,"",true); + $squelette = trouver_fond($fond, "", true); $ext = $squelette['extension']; $flux = array( @@ -70,8 +74,9 @@ function public_styliser_dist($fond, $contexte, $lang = '', $connect = '') { ); if (test_espace_prive() OR defined('_ZPIP')) { - if (!$styliser_par_z) - $styliser_par_z = charger_fonction('styliser_par_z','public'); + if (!$styliser_par_z) { + $styliser_par_z = charger_fonction('styliser_par_z', 'public'); + } $flux = $styliser_par_z($flux); } @@ -92,33 +97,37 @@ function public_styliser_dist($fond, $contexte, $lang = '', $connect = '') { * et uniquement si l'on est dans l'espace privé. * * @see prive_echafauder_dist() - * + * * @param array $flux * Données du pipeline styliser * @return array * Données du pipeline styliser -**/ -function styliser_par_objets($flux){ + **/ +function styliser_par_objets($flux) { if (test_espace_prive() AND !$squelette = $flux['data'] - AND strncmp($flux['args']['fond'],'prive/objets/',13)==0 - AND $echafauder = charger_fonction('echafauder','prive',true)) { - if (strncmp($flux['args']['fond'],'prive/objets/liste/',19)==0){ - $table = table_objet(substr($flux['args']['fond'],19)); + AND strncmp($flux['args']['fond'], 'prive/objets/', 13) == 0 + AND $echafauder = charger_fonction('echafauder', 'prive', true) + ) { + if (strncmp($flux['args']['fond'], 'prive/objets/liste/', 19) == 0) { + $table = table_objet(substr($flux['args']['fond'], 19)); $table_sql = table_objet_sql($table); $objets = lister_tables_objets_sql(); - if (isset($objets[$table_sql])) - $flux['data'] = $echafauder($table,$table,$table_sql,"prive/objets/liste/objets",$flux['args']['ext']); + if (isset($objets[$table_sql])) { + $flux['data'] = $echafauder($table, $table, $table_sql, "prive/objets/liste/objets", $flux['args']['ext']); + } } - if (strncmp($flux['args']['fond'],'prive/objets/contenu/',21)==0){ - $type = substr($flux['args']['fond'],21); + if (strncmp($flux['args']['fond'], 'prive/objets/contenu/', 21) == 0) { + $type = substr($flux['args']['fond'], 21); $table = table_objet($type); $table_sql = table_objet_sql($table); $objets = lister_tables_objets_sql(); - if (isset($objets[$table_sql])) - $flux['data'] = $echafauder($type,$table,$table_sql,"prive/objets/contenu/objet",$flux['args']['ext']); + if (isset($objets[$table_sql])) { + $flux['data'] = $echafauder($type, $table, $table_sql, "prive/objets/contenu/objet", $flux['args']['ext']); + } } } + return $flux; } @@ -129,7 +138,7 @@ function styliser_par_objets($flux){ * Êttention, on repète cela à chaque inclusion, * on optimise donc pour ne faire la recherche qu'une fois * par contexte semblable du point de vue des id_xx - * + * * @staticvar array $liste_objets * @param array $contexte * @return array @@ -143,35 +152,43 @@ function quete_rubrique_fond($contexte) { include_spip('public/quete'); $l = urls_liste_objets(false); // placer la rubrique en tete des objets - $l = array_diff($l,array('rubrique')); + $l = array_diff($l, array('rubrique')); array_unshift($l, 'rubrique'); - foreach($l as $objet){ + foreach ($l as $objet) { $id = id_table_objet($objet); - if (!isset($liste_objets[$id])) - $liste_objets[$id] = objet_type($objet,false); + if (!isset($liste_objets[$id])) { + $liste_objets[$id] = objet_type($objet, false); + } } } - $c = array_intersect_key($contexte,$liste_objets); - if (!count($c)) return false; + $c = array_intersect_key($contexte, $liste_objets); + if (!count($c)) { + return false; + } - $c = array_map('intval',$c); + $c = array_map('intval', $c); $s = serialize($c); - if (isset($quete[$s])) + if (isset($quete[$s])) { return $quete[$s]; + } - if (isset($c['id_rubrique']) AND $r = $c['id_rubrique']){ + if (isset($c['id_rubrique']) AND $r = $c['id_rubrique']) { unset($c['id_rubrique']); - $c = array('id_rubrique'=>$r) + $c; + $c = array('id_rubrique' => $r)+$c; } - foreach($c as $_id=>$id) { + foreach ($c as $_id => $id) { if ($id - AND $row = quete_parent_lang(table_objet_sql($liste_objets[$_id]),$id)) { + AND $row = quete_parent_lang(table_objet_sql($liste_objets[$_id]), $id) + ) { $lang = isset($row['lang']) ? $row['lang'] : ''; - if ($_id=='id_rubrique' OR (isset($row['id_rubrique']) AND $id=$row['id_rubrique'])) - return $quete[$s] = array ($id, $lang); + if ($_id == 'id_rubrique' OR (isset($row['id_rubrique']) AND $id = $row['id_rubrique'])) { + return $quete[$s] = array($id, $lang); + } } } + return $quete[$s] = false; } + ?> diff --git a/ecrire/public/styliser_par_z.php b/ecrire/public/styliser_par_z.php index b8e536fc5d..dc1b983c75 100644 --- a/ecrire/public/styliser_par_z.php +++ b/ecrire/public/styliser_par_z.php @@ -17,8 +17,10 @@ * Recherche par exemple `contenu\xx` et en absence utilisera `contenu\dist` * * @package SPIP\Core\Public\Styliser -**/ -if (!defined("_ECRIRE_INC_VERSION")) return; + **/ +if (!defined("_ECRIRE_INC_VERSION")) { + return; +} /** * Recherche automatique d'un squelette Page à partir de `contenu/xx` @@ -26,8 +28,8 @@ if (!defined("_ECRIRE_INC_VERSION")) return; * @param array $flux Données du pipeline * @return array Données modifiées du pipeline */ -function public_styliser_par_z_dist($flux){ - static $prefix_path=null; +function public_styliser_par_z_dist($flux) { + static $prefix_path = null; static $prefix_length; static $z_blocs; static $apl_constant; @@ -38,120 +40,131 @@ function public_styliser_par_z_dist($flux){ if (!isset($prefix_path)) { $z_blocs = z_blocs(test_espace_prive()); - if (test_espace_prive ()){ + if (test_espace_prive()) { $prefix_path = "prive/squelettes/"; $prefix_length = strlen($prefix_path); $apl_constant = '_ECRIRE_AJAX_PARALLEL_LOAD'; $page = 'exec'; - $echafauder = charger_fonction('echafauder','prive',true); - define('_ZCORE_EXCLURE_PATH',''); - } - else { + $echafauder = charger_fonction('echafauder', 'prive', true); + define('_ZCORE_EXCLURE_PATH', ''); + } else { $prefix_path = ""; $prefix_length = 0; $apl_constant = '_Z_AJAX_PARALLEL_LOAD'; $page = _SPIP_PAGE; - $echafauder = charger_fonction('echafauder','public',true); - define('_ZCORE_EXCLURE_PATH','\bprive|\bsquelettes-dist'.(defined('_DIR_PLUGIN_DIST')?'|\b'.rtrim(_DIR_PLUGIN_DIST,'/'):'')); + $echafauder = charger_fonction('echafauder', 'public', true); + define('_ZCORE_EXCLURE_PATH', '\bprive|\bsquelettes-dist' . (defined('_DIR_PLUGIN_DIST') ? '|\b' . rtrim(_DIR_PLUGIN_DIST, + '/') : '')); } - $prepend = (defined('_Z_PREPEND_PATH')?_Z_PREPEND_PATH:""); + $prepend = (defined('_Z_PREPEND_PATH') ? _Z_PREPEND_PATH : ""); } $z_contenu = reset($z_blocs); // contenu par defaut $fond = $flux['args']['fond']; - if ($prepend OR strncmp($fond,$prefix_path,$prefix_length)==0) { + if ($prepend OR strncmp($fond, $prefix_path, $prefix_length) == 0) { $fond = substr($fond, $prefix_length); $squelette = $flux['data']; $ext = $flux['args']['ext']; // Ajax Parallel loading : ne pas calculer le bloc, mais renvoyer un js qui le loadera en ajax if (defined('_Z_AJAX_PARALLEL_LOAD_OK') - AND $dir = explode('/',$fond) - AND count($dir)==2 // pas un sous repertoire + AND $dir = explode('/', $fond) + AND count($dir) == 2 // pas un sous repertoire AND $dir = reset($dir) - AND in_array($dir,$z_blocs) // verifier deja qu'on est dans un bloc Z + AND in_array($dir, $z_blocs) // verifier deja qu'on est dans un bloc Z AND defined($apl_constant) - AND in_array($dir,explode(',',constant($apl_constant))) // et dans un demande en APL - AND $pipe = z_trouver_bloc($prefix_path.$prepend,$dir,'z_apl',$ext) // et qui contient le squelette APL - ){ + AND in_array($dir, explode(',', constant($apl_constant))) // et dans un demande en APL + AND $pipe = z_trouver_bloc($prefix_path . $prepend, $dir, 'z_apl', $ext) // et qui contient le squelette APL + ) { $flux['data'] = $pipe; + return $flux; } // surcharger aussi les squelettes venant de squelettes-dist/ - if ($squelette AND !z_fond_valide($squelette)){ + if ($squelette AND !z_fond_valide($squelette)) { $squelette = ""; - $echafauder = ""; + $echafauder = ""; + } + if ($prepend) { + $squelette = substr(find_in_path($prefix_path . $prepend . "$fond.$ext"), 0, -strlen(".$ext")); + if ($squelette) { + $flux['data'] = $squelette; + } } - if ($prepend){ - $squelette = substr(find_in_path($prefix_path.$prepend."$fond.$ext"), 0, - strlen(".$ext")); - if ($squelette) - $flux['data'] = $squelette; - } // gerer les squelettes non trouves // -> router vers les /dist.html // ou scaffolding ou page automatique les contenus - if (!$squelette){ + if (!$squelette) { // si on est sur un ?page=XX non trouve if ((isset($flux['args']['contexte'][$page]) AND $flux['args']['contexte'][$page] == $fond) OR (isset($flux['args']['contexte']['type-page']) AND $flux['args']['contexte']['type-page'] == $fond) - OR ($fond=='sommaire' - AND (!isset($flux['args']['contexte'][$page]) OR !$flux['args']['contexte'][$page]))) { + OR ($fond == 'sommaire' + AND (!isset($flux['args']['contexte'][$page]) OR !$flux['args']['contexte'][$page])) + ) { // si on est sur un ?page=XX non trouve // se brancher sur contenu/xx si il existe // ou si c'est un objet spip, associe a une table, utiliser le fond homonyme - if (!isset($disponible[$fond])) - $disponible[$fond] = z_contenu_disponible($prefix_path.$prepend,$z_contenu,$fond,$ext,$echafauder); + if (!isset($disponible[$fond])) { + $disponible[$fond] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $fond, $ext, $echafauder); + } - if ($disponible[$fond]) - $flux['data'] = substr(find_in_path($prefix_path."page.$ext"), 0, - strlen(".$ext")); + if ($disponible[$fond]) { + $flux['data'] = substr(find_in_path($prefix_path . "page.$ext"), 0, -strlen(".$ext")); + } } // echafaudage : // si c'est un fond de contenu d'un objet en base // generer un fond automatique a la volee pour les webmestres - elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu)+1)==0){ - $type = substr($fond,strlen($z_contenu)+1); - if (($type=='page') AND isset($flux['args']['contexte'][$page])) + elseif (strncmp($fond, "$z_contenu/", strlen($z_contenu)+1) == 0) { + $type = substr($fond, strlen($z_contenu)+1); + if (($type == 'page') AND isset($flux['args']['contexte'][$page])) { $type = $flux['args']['contexte'][$page]; - if (!isset($disponible[$type])) - $disponible[$type] = z_contenu_disponible($prefix_path.$prepend,$z_contenu,$type,$ext,$echafauder); + } + if (!isset($disponible[$type])) { + $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); + } if (is_string($disponible[$type])) { $flux['data'] = $disponible[$type]; - } - elseif ($echafauder + } elseif ($echafauder AND include_spip('inc/autoriser') AND isset($GLOBALS['visiteur_session']['statut']) // performance - AND autoriser('echafauder',$type) + AND autoriser('echafauder', $type) AND $is = $disponible[$type] - AND is_array($is)) { - $flux['data'] = $echafauder($type,$is[0],$is[1],$is[2],$ext); - } - else{ - $flux['data'] = ($disponible['404'] = z_contenu_disponible($prefix_path.$prepend,$z_contenu,'404',$ext,$echafauder)); + AND is_array($is) + ) { + $flux['data'] = $echafauder($type, $is[0], $is[1], $is[2], $ext); + } else { + $flux['data'] = ($disponible['404'] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, '404', $ext, + $echafauder)); } } // sinon, si on demande un fond non trouve dans un des autres blocs // et si il y a bien un contenu correspondant ou echafaudable // se rabbatre sur le dist.html du bloc concerne - else{ - if ( $dir = explode('/',$fond) + else { + if ($dir = explode('/', $fond) AND $dir = reset($dir) AND $dir !== $z_contenu - AND in_array($dir,$z_blocs)){ - $type = substr($fond,strlen("$dir/")); - if (($type=='page') AND isset($flux['args']['contexte'][$page])) + AND in_array($dir, $z_blocs) + ) { + $type = substr($fond, strlen("$dir/")); + if (($type == 'page') AND isset($flux['args']['contexte'][$page])) { $type = $flux['args']['contexte'][$page]; - if ($type!=='page' AND !isset($disponible[$type])) - $disponible[$type] = z_contenu_disponible($prefix_path.$prepend,$z_contenu,$type,$ext,$echafauder); - if ($type=='page' OR $disponible[$type]) - $flux['data'] = z_trouver_bloc($prefix_path.$prepend,$dir,'dist',$ext); + } + if ($type !== 'page' AND !isset($disponible[$type])) { + $disponible[$type] = z_contenu_disponible($prefix_path . $prepend, $z_contenu, $type, $ext, $echafauder); + } + if ($type == 'page' OR $disponible[$type]) { + $flux['data'] = z_trouver_bloc($prefix_path . $prepend, $dir, 'dist', $ext); + } } } $squelette = $flux['data']; @@ -161,32 +174,35 @@ function public_styliser_par_z_dist($flux){ // body-sommaire.html // pour des raisons de perfo, les declinaisons doivent etre dans le // meme dossier que body.html - if ($fond=='body' AND substr($squelette,-strlen($fond))==$fond){ + if ($fond == 'body' AND substr($squelette, -strlen($fond)) == $fond) { if (isset($flux['args']['contexte']['type-page']) AND ( (isset($flux['args']['contexte']['composition']) - AND file_exists(($f=$squelette."-".$flux['args']['contexte']['type-page']."-".$flux['args']['contexte']['composition']).".$ext")) + AND file_exists(($f = $squelette . "-" . $flux['args']['contexte']['type-page'] . "-" . $flux['args']['contexte']['composition']) . ".$ext")) OR - file_exists(($f=$squelette."-".$flux['args']['contexte']['type-page']).".$ext") - )) + file_exists(($f = $squelette . "-" . $flux['args']['contexte']['type-page']) . ".$ext") + ) + ) { $flux['data'] = $f; - } - elseif ($fond=='structure' + } + } elseif ($fond == 'structure' AND z_sanitize_var_zajax() - AND $f = find_in_path($prefix_path.$prepend.'ajax'.".$ext")) { - $flux['data'] = substr($f,0,-strlen(".$ext")); - } - // chercher le fond correspondant a la composition + AND $f = find_in_path($prefix_path . $prepend . 'ajax' . ".$ext") + ) { + $flux['data'] = substr($f, 0, -strlen(".$ext")); + } // chercher le fond correspondant a la composition elseif (isset($flux['args']['contexte']['composition']) - AND (basename($fond)=='page' OR ($squelette AND substr($squelette,-strlen($fond))==$fond)) - AND $dir = substr($fond,$prefix_length) - AND $dir = explode('/',$dir) + AND (basename($fond) == 'page' OR ($squelette AND substr($squelette, -strlen($fond)) == $fond)) + AND $dir = substr($fond, $prefix_length) + AND $dir = explode('/', $dir) AND $dir = reset($dir) - AND in_array($dir,$z_blocs) - AND $f=find_in_path($prefix_path.$prepend.$fond."-".$flux['args']['contexte']['composition'].".$ext")){ - $flux['data'] = substr($f,0,-strlen(".$ext")); + AND in_array($dir, $z_blocs) + AND $f = find_in_path($prefix_path . $prepend . $fond . "-" . $flux['args']['contexte']['composition'] . ".$ext") + ) { + $flux['data'] = substr($f, 0, -strlen(".$ext")); } } + return $flux; } @@ -197,9 +213,18 @@ function public_styliser_par_z_dist($flux){ * @return array */ function z_blocs($espace_prive = false) { - if ($espace_prive) - return (isset($GLOBALS['z_blocs_ecrire'])?$GLOBALS['z_blocs_ecrire']:array('contenu','navigation','extra','head','hierarchie','top')); - return (isset($GLOBALS['z_blocs'])?$GLOBALS['z_blocs']:array('contenu')); + if ($espace_prive) { + return (isset($GLOBALS['z_blocs_ecrire']) ? $GLOBALS['z_blocs_ecrire'] : array( + 'contenu', + 'navigation', + 'extra', + 'head', + 'hierarchie', + 'top' + )); + } + + return (isset($GLOBALS['z_blocs']) ? $GLOBALS['z_blocs'] : array('contenu')); } /** @@ -213,27 +238,32 @@ function z_blocs($espace_prive = false) { * @param bool $echafauder * @return mixed */ -function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true){ - if ($d = z_trouver_bloc($prefix_path,$z_contenu,$type,$ext)) +function z_contenu_disponible($prefix_path, $z_contenu, $type, $ext, $echafauder = true) { + if ($d = z_trouver_bloc($prefix_path, $z_contenu, $type, $ext)) { return $d; - return $echafauder?z_echafaudable($type):false; + } + + return $echafauder ? z_echafaudable($type) : false; } /** * Teste si le fond de squelette trouvé est autorisé * * Compare le chemin du squelette trouvé avec les chemins exclus connus. - * + * * @param string $squelette * Un chemin de squelette * @return bool * `true` si on peut l'utiliser, `false` sinon. -**/ -function z_fond_valide($squelette){ + **/ +function z_fond_valide($squelette) { if (!_ZCORE_EXCLURE_PATH - OR !preg_match(',('._ZCORE_EXCLURE_PATH.')/,',$squelette)) + OR !preg_match(',(' . _ZCORE_EXCLURE_PATH . ')/,', $squelette) + ) { return true; - return false; + } + + return false; } /** @@ -241,22 +271,23 @@ function z_fond_valide($squelette){ * `contenu/article.html` ou `contenu/contenu.article.html` * * @param string $prefix_path - * chemin de base qui prefixe la recherche + * chemin de base qui prefixe la recherche * @param string $bloc - * nom du bloc cherche + * nom du bloc cherche * @param string $fond - * nom de la page (ou 'dist' pour le bloc par defaut) + * nom de la page (ou 'dist' pour le bloc par defaut) * @param string $ext - * extension du squelette + * extension du squelette * @return string */ -function z_trouver_bloc($prefix_path, $bloc, $fond, $ext){ +function z_trouver_bloc($prefix_path, $bloc, $fond, $ext) { if ( (defined('_ZCORE_BLOC_PREFIX_SKEL') AND $f = find_in_path("$prefix_path$bloc/$bloc.$fond.$ext") AND z_fond_valide($f)) OR ($f = find_in_path("$prefix_path$bloc/$fond.$ext") AND z_fond_valide($f)) - ){ - return substr($f, 0, - strlen(".$ext")); + ) { + return substr($f, 0, -strlen(".$ext")); } + return ""; } @@ -268,43 +299,51 @@ function z_trouver_bloc($prefix_path, $bloc, $fond, $ext){ * @param string $type * @return bool */ -function z_echafaudable($type){ +function z_echafaudable($type) { static $pages = null; static $echafaudable = array(); - if (isset($echafaudable[$type])) + if (isset($echafaudable[$type])) { return $echafaudable[$type]; - if (preg_match(',[^\w],',$type)) + } + if (preg_match(',[^\w],', $type)) { return $echafaudable[$type] = false; + } - if (test_espace_prive()){ - if (!function_exists('trouver_objet_exec')) + if (test_espace_prive()) { + if (!function_exists('trouver_objet_exec')) { include_spip('inc/pipelines_ecrire'); - if ($e=trouver_objet_exec($type)){ - return $echafaudable[$type] = array($e['table'],$e['table_objet_sql'],$e); } - else { + if ($e = trouver_objet_exec($type)) { + return $echafaudable[$type] = array($e['table'], $e['table_objet_sql'], $e); + } else { // peut etre c'est un exec=types qui liste tous les objets "type" - if (($t=objet_type($type,false))!==$type - AND $e=trouver_objet_exec($t)){ - return $echafaudable[$type] = array($e['table'],$e['table_objet_sql'],$t); + if (($t = objet_type($type, false)) !== $type + AND $e = trouver_objet_exec($t) + ) { + return $echafaudable[$type] = array($e['table'], $e['table_objet_sql'], $t); } } - } - else { + } else { if (is_null($pages)) { $pages = array(); $liste = lister_tables_objets_sql(); - foreach($liste as $t=>$d) - if ($d['page']) $pages[$d['page']] = array($d['table_objet'],$t); + foreach ($liste as $t => $d) { + if ($d['page']) { + $pages[$d['page']] = array($d['table_objet'], $t); + } + } } - if (!isset($pages[$type])) + if (!isset($pages[$type])) { return $echafaudable[$type] = false; - if (count($pages[$type])==2){ - $trouver_table = charger_fonction('trouver_table','base'); + } + if (count($pages[$type]) == 2) { + $trouver_table = charger_fonction('trouver_table', 'base'); $pages[$type][] = $trouver_table(reset($pages[$type])); } + return $echafaudable[$type] = $pages[$type]; } + return $echafaudable[$type] = false; } @@ -321,7 +360,7 @@ function z_echafaudable($type){ * @param string $ext * @return string */ -function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext){ +function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext) { $scaffold = ""; // page objet ou objet_edit @@ -329,52 +368,59 @@ function prive_echafauder_dist($exec, $table, $table_sql, $desc_exec, $ext){ $type = $desc_exec['type']; $primary = $desc_exec['id_table_objet']; - if ($desc_exec['edition']===false) + if ($desc_exec['edition'] === false) { $fond = "objet"; - else { - $trouver_table = charger_fonction('trouver_table','base'); + } else { + $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table_sql); - if (isset($desc['field']['id_rubrique'])) + if (isset($desc['field']['id_rubrique'])) { $fond = 'objet_edit'; - else + } else { $fond = 'objet_edit.sans_rubrique'; + } } $dir = z_blocs(test_espace_prive()); $dir = reset($dir); - $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/".$fond.",objet=".$type.",id_objet=#".strtoupper($primary).",env}>"; - } - // page objets - elseif($type = $desc_exec AND strpos($type,"/")===false){ + $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/" . $fond . ",objet=" . $type . ",id_objet=#" . strtoupper($primary) . ",env}>"; + } // page objets + elseif ($type = $desc_exec AND strpos($type, "/") === false) { $dir = z_blocs(test_espace_prive()); $dir = reset($dir); - $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=".$type.",env} />"; + $scaffold = "<INCLURE{fond=prive/echafaudage/$dir/objets,objet=" . $type . ",env} />"; } // morceau d'objet : on fournit le fond de sibstitution dans $desc_exec // et objet et tire de $table - elseif($fond = $desc_exec){ + elseif ($fond = $desc_exec) { $dir = md5(dirname($fond)); - $scaffold = "<INCLURE{fond=$fond,objet=".objet_type($table).",env} />"; + $scaffold = "<INCLURE{fond=$fond,objet=" . objet_type($table) . ",env} />"; } - $base_dir = sous_repertoire(_DIR_CACHE,"scaffold",false); - $base_dir = sous_repertoire($base_dir,$dir,false); - $f = $base_dir."$exec"; - ecrire_fichier("$f.$ext",$scaffold); + $base_dir = sous_repertoire(_DIR_CACHE, "scaffold", false); + $base_dir = sous_repertoire($base_dir, $dir, false); + $f = $base_dir . "$exec"; + ecrire_fichier("$f.$ext", $scaffold); + return $f; } /** * Recuperer et verifier var_zajax si demande dans l'url + * * @return bool|string */ -function z_sanitize_var_zajax(){ +function z_sanitize_var_zajax() { $z_ajax = _request('var_zajax'); - if (!$z_ajax) return false; + if (!$z_ajax) { + return false; + } if (!$z_blocs = z_blocs(test_espace_prive()) - OR !in_array($z_ajax,$z_blocs)) { + OR !in_array($z_ajax, $z_blocs) + ) { set_request('var_zajax'); // enlever cette demande incongrue $z_ajax = false; } + return $z_ajax; } + ?> diff --git a/ecrire/public/tracer.php b/ecrire/public/tracer.php index fb2912d6b1..56b8fa79a7 100644 --- a/ecrire/public/tracer.php +++ b/ecrire/public/tracer.php @@ -10,11 +10,12 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // http://code.spip.net/@trace_query_start -function trace_query_start() -{ +function trace_query_start() { static $trace = '?'; if ($trace === '?') { include_spip('inc/autoriser'); @@ -22,52 +23,59 @@ function trace_query_start() // A fortiori quand on demande une trace $trace = isset($_GET['var_profile']) AND (autoriser('debug')); } - return $trace ? microtime() : 0; + + return $trace ? microtime() : 0; } // http://code.spip.net/@trace_query_end -function trace_query_end($query, $start, $result, $erreur, $serveur = ''){ - if ($start) +function trace_query_end($query, $start, $result, $erreur, $serveur = '') { + if ($start) { trace_query_chrono($start, microtime(), $query, $result, $serveur); + } // tracer les erreurs, sauf pour select, c'est fait dans abstract_sql - if ($erreur AND !preg_match('/^select\b/i', $query)) + if ($erreur AND !preg_match('/^select\b/i', $query)) { erreur_squelette(array(sql_errno($serveur), $erreur, $query)); + } + return $result; } // http://code.spip.net/@trace_query_chrono -function trace_query_chrono($m1, $m2, $query, $result, $serveur = '') -{ +function trace_query_chrono($m1, $m2, $query, $result, $serveur = '') { include_spip('inc/filtres_mini'); - static $tt = 0, $nb=0; + static $tt = 0, $nb = 0; $x = _request('var_mode_objet'); if (isset($GLOBALS['debug']['aucasou'])) { list(, $boucle, $serveur, $contexte) = $GLOBALS['debug']['aucasou']; - if ($x AND !preg_match("/$boucle\$/", $x)) + if ($x AND !preg_match("/$boucle\$/", $x)) { return; - if ($serveur) $boucle .= " ($serveur)"; + } + if ($serveur) { + $boucle .= " ($serveur)"; + } $boucle = "<b>$boucle</b>"; } else { - if ($x) return; + if ($x) { + return; + } $boucle = $contexte = ''; } list($usec, $sec) = explode(" ", $m1); list($usec2, $sec2) = explode(" ", $m2); - $dt = $sec2 + $usec2 - $sec - $usec; + $dt = $sec2+$usec2-$sec-$usec; $tt += $dt; $nb++; - $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2",spip_htmlentities($query)); - $e = sql_explain($query, $serveur); - $r = str_replace('Resource id ','',(is_object($result)?get_class($result):$result)); + $q = preg_replace('/([a-z)`])\s+([A-Z])/', "$1\n<br />$2", spip_htmlentities($query)); + $e = sql_explain($query, $serveur); + $r = str_replace('Resource id ', '', (is_object($result) ? get_class($result) : $result)); $GLOBALS['tableau_des_temps'][] = array($dt, $nb, $boucle, $q, $e, $r, $contexte); } -function chrono_requete($temps) -{ +function chrono_requete($temps) { $total = 0; $hors = "<i>" . _T('zbug_hors_compilation') . "</i>"; $t = $q = $n = $d = array(); @@ -78,7 +86,9 @@ function chrono_requete($temps) $k = ($contexte[0] . " $boucle"); include_spip('public/compiler'); $env = reconstruire_contexte_compil($contexte); - } else $k = $env = $boucle; + } else { + $k = $env = $boucle; + } $total += $dt; $t[$key] = $dt; @@ -87,24 +97,27 @@ function chrono_requete($temps) $d[$k] = 0; } $d[$k] += $dt; - if ($k) @++$n[$k]; + if ($k) { + @++$n[$k]; + } - if (!is_array($explain)) + if (!is_array($explain)) { $explain = array(); - foreach($explain as $j => $v) { + } + foreach ($explain as $j => $v) { $explain[$j] = "<tr><th>$j</th><td>" - . str_replace(';','<br />',$v) - . "</td></tr>"; + . str_replace(';', '<br />', $v) + . "</td></tr>"; } $e = "<table class='explain'>" - . "<caption>" - . $query - . "</caption>" - . "<tr><th>Time</th><td>$dt</td></tr>" - . "<tr><th>Order</th><td>$nb</td></tr>" - . "<tr><th>Res</th><td>$res</td></tr>" - . join('', $explain) - . "</table>"; + . "<caption>" + . $query + . "</caption>" + . "<tr><th>Time</th><td>$dt</td></tr>" + . "<tr><th>Order</th><td>$nb</td></tr>" + . "<tr><th>Res</th><td>$res</td></tr>" + . join('', $explain) + . "</table>"; $temps[$key] = array($e, $env, $k); } @@ -114,17 +127,17 @@ function chrono_requete($temps) $i = 1; $t = array(); // Fabriquer les liens de navigations dans le tableau des temps - foreach($temps as $k => $v) { + foreach ($temps as $k => $v) { $titre = strip_tags($v[2]); - $href = quote_amp($GLOBALS['REQUEST_URI'])."#req$i"; + $href = quote_amp($GLOBALS['REQUEST_URI']) . "#req$i"; if (!isset($t[$v[2]])) { $t[$v[2]] = array(); } - $t[$v[2]][]= "<span class='spip-debug-arg'> " - . "<a title='$titre' href='$href'>$i</a>" - . '</span>' - . ((count($t[$v[2]]) % 10 == 9) ? "<br />" : ''); + $t[$v[2]][] = "<span class='spip-debug-arg'> " + . "<a title='$titre' href='$href'>$i</a>" + . '</span>' + . ((count($t[$v[2]])%10 == 9) ? "<br />" : ''); $i++; } @@ -136,16 +149,18 @@ function chrono_requete($temps) unset($d['']); // Fabriquer le tableau des liens de navigation dans le grand tableau foreach ($d as $k => $v) { - $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>" - . join('',$t[$k]); + $d[$k] = $n[$k] . "</td><td>$k</td><td class='time'>$v</td><td class='liste-reqs'>" + . join('', $t[$k]); } - $navigation = array(_T('zbug_statistiques'), + $navigation = array( + _T('zbug_statistiques'), "<tr><td>" . join("</td></tr>\n<tr><td>", $d) . "</td></tr>\n" - . (# _request('var_mode_objet') ? '' : - ("<tr><td>" . count($temps) . "</td><td>" . _T('info_total') . '</td><td class="time">' . $total . "</td><td></td></tr>"))); + . (# _request('var_mode_objet') ? '' : + ("<tr><td>" . count($temps) . "</td><td>" . _T('info_total') . '</td><td class="time">' . $total . "</td><td></td></tr>")) + ); return array($temps, $navigation); } diff --git a/ecrire/req/mysql.php b/ecrire/req/mysql.php index 6c1976ab85..5a7c48ac68 100644 --- a/ecrire/req/mysql.php +++ b/ecrire/req/mysql.php @@ -18,26 +18,32 @@ * * @package SPIP\Core\SQL\MySQL */ - -if (!defined('_ECRIRE_INC_VERSION')) return; -if (!defined('_MYSQL_NOPLANES')) define('_MYSQL_NOPLANES', true); +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} + +if (!defined('_MYSQL_NOPLANES')) { + define('_MYSQL_NOPLANES', true); +} /** * Crée la première connexion à un serveur MySQL via MySQLi - * - * @param string $host Chemin du serveur - * @param int $port Port de connexion - * @param string $login Nom d'utilisateur - * @param string $pass Mot de passe - * @param string $db Nom de la base - * @param string $prefixe Préfixe des tables SPIP + * + * @param string $host Chemin du serveur + * @param int $port Port de connexion + * @param string $login Nom d'utilisateur + * @param string $pass Mot de passe + * @param string $db Nom de la base + * @param string $prefixe Préfixe des tables SPIP * @return array|bool * - false si la connexion a échoué * - tableau décrivant la connexion sinon */ function req_mysql_dist($host, $port, $login, $pass, $db = '', $prefixe = '') { - if (!charger_php_extension('mysqli')) return false; + if (!charger_php_extension('mysqli')) { + return false; + } if ($port) { $link = @mysqli_connect($host, $login, $pass, '', $port); } else { @@ -45,7 +51,8 @@ function req_mysql_dist($host, $port, $login, $pass, $db = '', $prefixe = '') { } if (!$link) { - spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(),'mysql.'._LOG_HS); + spip_log('Echec mysqli_connect. Erreur : ' . mysqli_connect_error(), 'mysql.' . _LOG_HS); + return false; } $last = ''; @@ -54,13 +61,15 @@ function req_mysql_dist($host, $port, $login, $pass, $db = '', $prefixe = '') { $db = 'spip'; } else { $ok = mysqli_select_db($link, $db); - if (defined('_MYSQL_SET_SQL_MODE') - OR defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite - ) + if (defined('_MYSQL_SET_SQL_MODE') + OR defined('_MYSQL_SQL_MODE_TEXT_NOT_NULL') // compatibilite + ) { mysqli_query($link, $last = "set sql_mode=''"); + } } - spip_log("Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? "operationnelle" : 'impossible'), _LOG_DEBUG); + spip_log("Connexion MySQLi vers $host, base $db, prefixe $prefixe " . ($ok ? "operationnelle" : 'impossible'), + _LOG_DEBUG); return !$ok ? false : array( 'db' => $db, @@ -68,117 +77,119 @@ function req_mysql_dist($host, $port, $login, $pass, $db = '', $prefixe = '') { 'prefixe' => $prefixe ? $prefixe : $db, 'link' => $link, 'total_requetes' => 0, - ); + ); } $GLOBALS['spip_mysql_functions_1'] = array( - 'alter' => 'spip_mysql_alter', - 'count' => 'spip_mysql_count', - 'countsel' => 'spip_mysql_countsel', - 'create' => 'spip_mysql_create', - 'create_base' => 'spip_mysql_create_base', - 'create_view' => 'spip_mysql_create_view', - 'date_proche' => 'spip_mysql_date_proche', - 'delete' => 'spip_mysql_delete', - 'drop_table' => 'spip_mysql_drop_table', - 'drop_view' => 'spip_mysql_drop_view', - 'errno' => 'spip_mysql_errno', - 'error' => 'spip_mysql_error', - 'explain' => 'spip_mysql_explain', - 'fetch' => 'spip_mysql_fetch', - 'seek' => 'spip_mysql_seek', - 'free' => 'spip_mysql_free', - 'hex' => 'spip_mysql_hex', - 'in' => 'spip_mysql_in', - 'insert' => 'spip_mysql_insert', - 'insertq' => 'spip_mysql_insertq', - 'insertq_multi' => 'spip_mysql_insertq_multi', - 'listdbs' => 'spip_mysql_listdbs', - 'multi' => 'spip_mysql_multi', - 'optimize' => 'spip_mysql_optimize', - 'query' => 'spip_mysql_query', - 'quote' => 'spip_mysql_quote', - 'replace' => 'spip_mysql_replace', - 'replace_multi' => 'spip_mysql_replace_multi', - 'repair' => 'spip_mysql_repair', - 'select' => 'spip_mysql_select', - 'selectdb' => 'spip_mysql_selectdb', - 'set_charset' => 'spip_mysql_set_charset', - 'get_charset' => 'spip_mysql_get_charset', - 'showbase' => 'spip_mysql_showbase', - 'showtable' => 'spip_mysql_showtable', - 'update' => 'spip_mysql_update', - 'updateq' => 'spip_mysql_updateq', - - // association de chaque nom http d'un charset aux couples MySQL - 'charsets' => array( -'cp1250'=>array('charset'=>'cp1250','collation'=>'cp1250_general_ci'), -'cp1251'=>array('charset'=>'cp1251','collation'=>'cp1251_general_ci'), -'cp1256'=>array('charset'=>'cp1256','collation'=>'cp1256_general_ci'), -'iso-8859-1'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'), + 'alter' => 'spip_mysql_alter', + 'count' => 'spip_mysql_count', + 'countsel' => 'spip_mysql_countsel', + 'create' => 'spip_mysql_create', + 'create_base' => 'spip_mysql_create_base', + 'create_view' => 'spip_mysql_create_view', + 'date_proche' => 'spip_mysql_date_proche', + 'delete' => 'spip_mysql_delete', + 'drop_table' => 'spip_mysql_drop_table', + 'drop_view' => 'spip_mysql_drop_view', + 'errno' => 'spip_mysql_errno', + 'error' => 'spip_mysql_error', + 'explain' => 'spip_mysql_explain', + 'fetch' => 'spip_mysql_fetch', + 'seek' => 'spip_mysql_seek', + 'free' => 'spip_mysql_free', + 'hex' => 'spip_mysql_hex', + 'in' => 'spip_mysql_in', + 'insert' => 'spip_mysql_insert', + 'insertq' => 'spip_mysql_insertq', + 'insertq_multi' => 'spip_mysql_insertq_multi', + 'listdbs' => 'spip_mysql_listdbs', + 'multi' => 'spip_mysql_multi', + 'optimize' => 'spip_mysql_optimize', + 'query' => 'spip_mysql_query', + 'quote' => 'spip_mysql_quote', + 'replace' => 'spip_mysql_replace', + 'replace_multi' => 'spip_mysql_replace_multi', + 'repair' => 'spip_mysql_repair', + 'select' => 'spip_mysql_select', + 'selectdb' => 'spip_mysql_selectdb', + 'set_charset' => 'spip_mysql_set_charset', + 'get_charset' => 'spip_mysql_get_charset', + 'showbase' => 'spip_mysql_showbase', + 'showtable' => 'spip_mysql_showtable', + 'update' => 'spip_mysql_update', + 'updateq' => 'spip_mysql_updateq', + + // association de chaque nom http d'un charset aux couples MySQL + 'charsets' => array( + 'cp1250' => array('charset' => 'cp1250', 'collation' => 'cp1250_general_ci'), + 'cp1251' => array('charset' => 'cp1251', 'collation' => 'cp1251_general_ci'), + 'cp1256' => array('charset' => 'cp1256', 'collation' => 'cp1256_general_ci'), + 'iso-8859-1' => array('charset' => 'latin1', 'collation' => 'latin1_swedish_ci'), //'iso-8859-6'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'), -'iso-8859-9'=>array('charset'=>'latin5','collation'=>'latin5_turkish_ci'), + 'iso-8859-9' => array('charset' => 'latin5', 'collation' => 'latin5_turkish_ci'), //'iso-8859-15'=>array('charset'=>'latin1','collation'=>'latin1_swedish_ci'), -'utf-8'=>array('charset'=>'utf8','collation'=>'utf8_general_ci') - ) - ); + 'utf-8' => array('charset' => 'utf8', 'collation' => 'utf8_general_ci') + ) +); /** * Retrouver un link d'une connexion MySQL via MySQLi - * + * * @param string $serveur Nom du serveur * @return Object Information de connexion pour mysqli */ -function _mysql_link($serveur = ''){ +function _mysql_link($serveur = '') { $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link']; + return $link; } /** * Définit un charset pour la connexion avec Mysql - * + * * @param string $charset Charset à appliquer * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * @param bool $requeter inutilisé * @return resource Ressource de résultats pour fetch() */ -function spip_mysql_set_charset($charset, $serveur = '', $requeter = true){ +function spip_mysql_set_charset($charset, $serveur = '', $requeter = true) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; - spip_log("changement de charset sql : "."SET NAMES "._q($charset), _LOG_DEBUG); - return mysqli_query($connexion['link'], $connexion['last'] = "SET NAMES "._q($charset)); + spip_log("changement de charset sql : " . "SET NAMES " . _q($charset), _LOG_DEBUG); + + return mysqli_query($connexion['link'], $connexion['last'] = "SET NAMES " . _q($charset)); } /** * Teste si le charset indiqué est disponible sur le serveur SQL - * + * * @param array|string $charset Nom du charset à tester. - * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * @param string $serveur Nom de la connexion + * @param bool $requeter inutilisé * @return array Description du charset (son nom est dans 'charset') */ -function spip_mysql_get_charset($charset = array(), $serveur = '', $requeter = true){ +function spip_mysql_get_charset($charset = array(), $serveur = '', $requeter = true) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $connexion['last'] = $c = "SHOW CHARACTER SET" - . (!$charset ? '' : (" LIKE "._q($charset['charset']))); + . (!$charset ? '' : (" LIKE " . _q($charset['charset']))); - return spip_mysql_fetch(mysqli_query($connexion['link'], $c), NULL, $serveur); + return spip_mysql_fetch(mysqli_query($connexion['link'], $c), null, $serveur); } /** * Exécute une requête Mysql (obsolète, ne plus utiliser) - * + * * @deprecated Utiliser sql_query() ou autres - * - * @param string $query Requête - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $query Requête + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return Resource Ressource pour fetch() -**/ + **/ function spip_query_db($query, $serveur = '', $requeter = true) { return spip_mysql_query($query, $serveur, $requeter); } @@ -186,10 +197,10 @@ function spip_query_db($query, $serveur = '', $requeter = true) { /** * Exécute une requête MySQL, munie d'une trace à la demande - * - * @param string $query Requête - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $query Requête + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|resource|string|bool * - string : Texte de la requête si on ne l'exécute pas * - ressource|bool : Si requête exécutée @@ -205,31 +216,35 @@ function spip_mysql_query($query, $serveur = '', $requeter = true) { $query = _mysql_traite_query($query, $db, $prefixe); // renvoyer la requete inerte si demandee - if (!$requeter) return $query; + if (!$requeter) { + return $query; + } if (isset($_GET['var_profile'])) { include_spip('public/tracer'); $t = trace_query_start(); - } else $t = 0 ; + } else { + $t = 0; + } $connexion['last'] = $query; $connexion['total_requetes']++; // ajouter un debug utile dans log/mysql-slow.log ? $debug = ''; - if (defined('_DEBUG_SLOW_QUERIES') AND _DEBUG_SLOW_QUERIES){ - if(isset($GLOBALS['debug']['aucasou'])){ - list(,$id,, $infos) = $GLOBALS['debug']['aucasou']; - $debug .= " BOUCLE$id @ ".$infos[0] ." | "; + if (defined('_DEBUG_SLOW_QUERIES') AND _DEBUG_SLOW_QUERIES) { + if (isset($GLOBALS['debug']['aucasou'])) { + list(, $id, , $infos) = $GLOBALS['debug']['aucasou']; + $debug .= " BOUCLE$id @ " . $infos[0] . " | "; } - $debug .= " " . $_SERVER['REQUEST_URI'].' + '.$GLOBALS['ip']; - $debug = ' /*'.str_replace('*/','@/',$debug).' */'; + $debug .= " " . $_SERVER['REQUEST_URI'] . ' + ' . $GLOBALS['ip']; + $debug = ' /*' . str_replace('*/', '@/', $debug) . ' */'; } - $r = mysqli_query($link, $query.$debug); + $r = mysqli_query($link, $query . $debug); //Eviter de propager le GoneAway sur les autres requetes d'un même processus PHP - if ($e = spip_mysql_errno($serveur)) { // Log d'un Gone Away + if ($e = spip_mysql_errno($serveur)) { // Log d'un Gone Away if ($e == 2006) { //Si Gone Away on relance une connexion vierge //Fermer la connexion defaillante mysqli_close($connexion['link']); @@ -239,59 +254,65 @@ function spip_mysql_query($query, $serveur = '', $requeter = true) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $link = $connexion['link']; //On retente au cas où - $r = mysqli_query($link, $query.$debug); + $r = mysqli_query($link, $query . $debug); } } - if ($e = spip_mysql_errno($serveur)) // Log de l'erreur eventuelle - $e .= spip_mysql_error($query, $serveur); // et du fautif + if ($e = spip_mysql_errno($serveur)) // Log de l'erreur eventuelle + { + $e .= spip_mysql_error($query, $serveur); + } // et du fautif return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r; } /** * Modifie une structure de table MySQL - * - * @param string $query Requête SQL (sans 'ALTER ') - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $query Requête SQL (sans 'ALTER ') + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|bool|string * - string : Texte de la requête si on ne l'exécute pas * - bool : Si requête exécutée * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. */ -function spip_mysql_alter($query, $serveur = '', $requeter = true){ +function spip_mysql_alter($query, $serveur = '', $requeter = true) { // ici on supprime les ` entourant le nom de table pour permettre // la transposition du prefixe, compte tenu que les plugins ont la mauvaise habitude // d'utiliser ceux-ci, copie-colle de phpmyadmin - $query = preg_replace(",^TABLE\s*`([^`]*)`,i","TABLE \\1",$query); - return spip_mysql_query("ALTER ".$query, $serveur, $requeter); # i.e. que PG se debrouille + $query = preg_replace(",^TABLE\s*`([^`]*)`,i", "TABLE \\1", $query); + + return spip_mysql_query("ALTER " . $query, $serveur, $requeter); # i.e. que PG se debrouille } /** * Optimise une table MySQL - * - * @param string $table Nom de la table - * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * + * @param string $table Nom de la table + * @param string $serveur Nom de la connexion + * @param bool $requeter inutilisé * @return bool Toujours true */ -function spip_mysql_optimize($table, $serveur = '', $requeter = true){ - spip_mysql_query("OPTIMIZE TABLE ". $table); +function spip_mysql_optimize($table, $serveur = '', $requeter = true) { + spip_mysql_query("OPTIMIZE TABLE " . $table); + return true; } /** * Retourne une explication de requête (Explain) MySQL - * - * @param string $query Texte de la requête - * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * + * @param string $query Texte de la requête + * @param string $serveur Nom de la connexion + * @param bool $requeter inutilisé * @return array Tableau de l'explication */ -function spip_mysql_explain($query, $serveur = '', $requeter = true){ - if (strpos(ltrim($query), 'SELECT') !== 0) return array(); +function spip_mysql_explain($query, $serveur = '', $requeter = true) { + if (strpos(ltrim($query), 'SELECT') !== 0) { + return array(); + } $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; @@ -299,7 +320,8 @@ function spip_mysql_explain($query, $serveur = '', $requeter = true){ $query = 'EXPLAIN ' . _mysql_traite_query($query, $db, $prefixe); $r = mysqli_query($link, $query); - return spip_mysql_fetch($r, NULL, $serveur); + + return spip_mysql_fetch($r, null, $serveur); } @@ -311,40 +333,51 @@ function spip_mysql_explain($query, $serveur = '', $requeter = true){ * @see sql_select() * @note * Les `\n` et `\t` sont utiles au debusqueur. - * - * @param string|array $select Champs sélectionnés - * @param string|array $from Tables sélectionnées - * @param string|array $where Contraintes - * @param string|array $groupby Regroupements - * @param string|array $orderby Tris - * @param string $limit Limites de résultats - * @param string|array $having Contraintes posts sélections - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string|array $select Champs sélectionnés + * @param string|array $from Tables sélectionnées + * @param string|array $where Contraintes + * @param string|array $groupby Regroupements + * @param string|array $orderby Tris + * @param string $limit Limites de résultats + * @param string|array $having Contraintes posts sélections + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|bool|resource|string * - string : Texte de la requête si on ne l'exécute pas * - ressource si requête exécutée, ressource pour fetch() * - false si la requête exécutée a ratée * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. */ -function spip_mysql_select($select, $from, $where = '', - $groupby='', $orderby='', $limit='', $having='', - $serveur='',$requeter=true) { +function spip_mysql_select( + $select, + $from, + $where = '', + $groupby = '', + $orderby = '', + $limit = '', + $having = '', + $serveur = '', + $requeter = true +) { $from = (!is_array($from) ? $from : spip_mysql_select_as($from)); - $query = - calculer_mysql_expression('SELECT', $select, ', ') + $query = + calculer_mysql_expression('SELECT', $select, ', ') . calculer_mysql_expression('FROM', $from, ', ') . calculer_mysql_expression('WHERE', $where) . calculer_mysql_expression('GROUP BY', $groupby, ',') . calculer_mysql_expression('HAVING', $having) - . ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) :'') + . ($orderby ? ("\nORDER BY " . spip_mysql_order($orderby)) : '') . ($limit ? "\nLIMIT $limit" : ''); // renvoyer la requete inerte si demandee - if ($requeter === false) return $query; + if ($requeter === false) { + return $query; + } $r = spip_mysql_query($query, $serveur, $requeter); + return $r ? $r : $query; } @@ -357,22 +390,21 @@ function spip_mysql_select($select, $from, $where = '', * @note * 0+x avec un champ x commencant par des chiffres est converti par MySQL * en le nombre qui commence x. Pas portable malheureusement, on laisse pour le moment. - * + * * @param string|array $orderby Texte du orderby à préparer * @return string Texte du orderby préparé */ -function spip_mysql_order($orderby) -{ - return (is_array($orderby)) ? join(", ", $orderby) : $orderby; +function spip_mysql_order($orderby) { + return (is_array($orderby)) ? join(", ", $orderby) : $orderby; } /** * Prépare une clause WHERE pour MySQL * - * Retourne une chaîne avec les bonnes parenthèses pour la + * Retourne une chaîne avec les bonnes parenthèses pour la * contrainte indiquée, au format donnée par le compilateur - * + * * @param array|string $v * Description des contraintes * - string : Texte du where @@ -385,23 +417,25 @@ function spip_mysql_order($orderby) * @return string * Contrainte pour clause WHERE */ -function calculer_mysql_where($v) -{ - if (!is_array($v)) - return $v ; +function calculer_mysql_where($v) { + if (!is_array($v)) { + return $v; + } $op = array_shift($v); - if (!($n=count($v))) + if (!($n = count($v))) { return $op; - else { + } else { $arg = calculer_mysql_where(array_shift($v)); - if ($n==1) { - return "$op($arg)"; + if ($n == 1) { + return "$op($arg)"; } else { $arg2 = calculer_mysql_where(array_shift($v)); - if ($n==2) { + if ($n == 2) { return "($arg $op $arg2)"; - } else return "($arg $op ($arg2) : $v[0])"; + } else { + return "($arg $op ($arg2) : $v[0])"; + } } } } @@ -409,63 +443,66 @@ function calculer_mysql_where($v) /** * Calcule un expression pour une requête, en cumulant chaque élément * avec l'opérateur de liaison ($join) indiqué - * + * * Renvoie grosso modo "$expression join($join, $v)" - * + * * @param string $expression Mot clé de l'expression, tel que "WHERE" ou "ORDER BY" - * @param array|string $v Données de l'expression - * @param string $join Si les données sont un tableau, elles seront groupées par cette jointure + * @param array|string $v Données de l'expression + * @param string $join Si les données sont un tableau, elles seront groupées par cette jointure * @return string Texte de l'expression, une partie donc, du texte la requête. */ -function calculer_mysql_expression($expression, $v, $join = 'AND'){ - if (empty($v)) +function calculer_mysql_expression($expression, $v, $join = 'AND') { + if (empty($v)) { return ''; - + } + $exp = "\n$expression "; - + if (!is_array($v)) { return $exp . $v; } else { - if (strtoupper($join) === 'AND') + if (strtoupper($join) === 'AND') { return $exp . join("\n\t$join ", array_map('calculer_mysql_where', $v)); - else + } else { return $exp . join($join, $v); + } } } /** * Renvoie des `nom AS alias` - * + * * @param array $args * @return string Sélection de colonnes pour une clause SELECT */ -function spip_mysql_select_as($args) -{ +function spip_mysql_select_as($args) { $res = ''; - foreach($args as $k => $v) { - if (substr($k,-1)=='@') { + foreach ($args as $k => $v) { + if (substr($k, -1) == '@') { // c'est une jointure qui se refere au from precedent // pas de virgule - $res .= ' ' . $v ; - } - else { + $res .= ' ' . $v; + } else { if (!is_numeric($k)) { $p = strpos($v, " "); - if ($p) - $v = substr($v,0,$p) . " AS `$k`" . substr($v,$p); - else $v .= " AS `$k`"; + if ($p) { + $v = substr($v, 0, $p) . " AS `$k`" . substr($v, $p); + } else { + $v .= " AS `$k`"; + } } - $res .= ', ' . $v ; + $res .= ', ' . $v; } } - return substr($res,2); + + return substr($res, 2); } /** * Changer les noms des tables ($table_prefix) - * + * * TODO: Quand tous les appels SQL seront abstraits on pourra l'améliorer */ define('_SQL_PREFIXE_TABLE_MYSQL', '/([,\s])spip_/S'); @@ -475,37 +512,41 @@ define('_SQL_PREFIXE_TABLE_MYSQL', '/([,\s])spip_/S'); * Prépare le texte d'une requête avant son exécution * * Change les préfixes de tables SPIP par ceux véritables - * - * @param string $query Requête à préparer - * @param string $db Nom de la base de donnée - * @param string $prefixe Préfixe de tables à appliquer + * + * @param string $query Requête à préparer + * @param string $db Nom de la base de donnée + * @param string $prefixe Préfixe de tables à appliquer * @return string Requête préparée */ function _mysql_traite_query($query, $db = '', $prefixe = '') { - if ($GLOBALS['mysql_rappel_nom_base'] AND $db) - $pref = '`'. $db.'`.'; - else $pref = ''; + if ($GLOBALS['mysql_rappel_nom_base'] AND $db) { + $pref = '`' . $db . '`.'; + } else { + $pref = ''; + } - if ($prefixe) + if ($prefixe) { $pref .= $prefixe . "_"; + } if (!preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) { - $suite =''; + $suite = ''; } else { $suite = strstr($query, $regs[0]); $query = substr($query, 0, -strlen($suite)); // propager le prefixe en cas de requete imbriquee // il faut alors echapper les chaine avant de le faire, pour ne pas risquer de // modifier une requete qui est en fait juste du texte dans un champ - if (stripos($suite,"SELECT")!==false) { - list($suite,$textes) = query_echappe_textes($suite); - if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite, $r)) - $suite = $r[1] . _mysql_traite_query($r[2], $db, $prefixe); + if (stripos($suite, "SELECT") !== false) { + list($suite, $textes) = query_echappe_textes($suite); + if (preg_match('/^(.*?)([(]\s*SELECT\b.*)$/si', $suite, $r)) { + $suite = $r[1] . _mysql_traite_query($r[2], $db, $prefixe); + } $suite = query_reinjecte_textes($suite, $textes); } } - $r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1'.$pref, $query) . $suite; + $r = preg_replace(_SQL_PREFIXE_TABLE_MYSQL, '\1' . $pref, $query) . $suite; // en option, remplacer les emoji (que mysql ne sait pas gérer) en 💩 if (defined('_MYSQL_NOPLANES') AND _MYSQL_NOPLANES AND lire_meta('charset_sql_connexion') == 'utf8') { @@ -526,42 +567,46 @@ function _mysql_traite_query($query, $db = '', $prefixe = '') { * Nom du connecteur * @param bool $requeter * Inutilisé - * + * * @return bool * - True cas de succès. * - False en cas d'erreur. -**/ + **/ function spip_mysql_selectdb($db, $serveur = '', $requeter = true) { $link = _mysql_link($serveur); $ok = mysqli_select_db($link, $db); - if (!$ok) - spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.'._LOG_CRITIQUE); + if (!$ok) { + spip_log('Echec mysqli_selectdb. Erreur : ' . mysqli_error($link), 'mysql.' . _LOG_CRITIQUE); + } + return $ok; } /** - * Retourne les bases de données accessibles + * Retourne les bases de données accessibles * * Retourne un tableau du nom de toutes les bases de données * accessibles avec les permissions de l'utilisateur SQL * de cette connexion. - * + * * Attention on n'a pas toujours les droits ! - * + * * @param string $serveur * Nom du connecteur * @param bool $requeter * Inutilisé * @return array * Liste de noms de bases de données -**/ + **/ function spip_mysql_listdbs($serveur = '', $requeter = true) { $dbs = array(); - if ($res = spip_mysql_query("SHOW DATABASES", $serveur)){ - while($row = mysqli_fetch_assoc($res)) + if ($res = spip_mysql_query("SHOW DATABASES", $serveur)) { + while ($row = mysqli_fetch_assoc($res)) { $dbs[] = $row['Database']; + } } + return $dbs; } @@ -572,52 +617,68 @@ function spip_mysql_listdbs($serveur = '', $requeter = true) { * Crée une table SQL nommee `$nom` à partir des 2 tableaux `$champs` et `$cles` * * @note Le nom des caches doit être inferieur à 64 caractères - * - * @param string $nom Nom de la table SQL - * @param array $champs Couples (champ => description SQL) - * @param array $cles Couples (type de clé => champ(s) de la clé) - * @param bool $autoinc True pour ajouter un auto-incrément sur la Primary Key - * @param bool $temporary True pour créer une table temporaire - * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * + * @param string $nom Nom de la table SQL + * @param array $champs Couples (champ => description SQL) + * @param array $cles Couples (type de clé => champ(s) de la clé) + * @param bool $autoinc True pour ajouter un auto-incrément sur la Primary Key + * @param bool $temporary True pour créer une table temporaire + * @param string $serveur Nom de la connexion + * @param bool $requeter inutilisé * @return array|null|resource|string * - null si champs ou cles n'est pas un tableau * - true si la requête réussie, false sinon. */ -function spip_mysql_create($nom, $champs, $cles, $autoinc = false, $temporary = false, $serveur = '', $requeter = true) { - - $query = ''; $keys = ''; $s = ''; $p=''; +function spip_mysql_create( + $nom, + $champs, + $cles, + $autoinc = false, + $temporary = false, + $serveur = '', + $requeter = true +) { + + $query = ''; + $keys = ''; + $s = ''; + $p = ''; // certains plugins declarent les tables (permet leur inclusion dans le dump) // sans les renseigner (laisse le compilo recuperer la description) - if (!is_array($champs) || !is_array($cles)) + if (!is_array($champs) || !is_array($cles)) { return; + } $res = spip_mysql_query("SELECT version() as v", $serveur); - if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'],'5.0','>='))) { + if (($row = mysqli_fetch_array($res)) && (version_compare($row['v'], '5.0', '>='))) { spip_mysql_query("SET sql_mode=''", $serveur); } - foreach($cles as $k => $v) { + foreach ($cles as $k => $v) { $keys .= "$s\n\t\t$k ($v)"; - if ($k == "PRIMARY KEY") + if ($k == "PRIMARY KEY") { $p = $v; + } $s = ","; } $s = ''; - + $character_set = ""; - if (@$GLOBALS['meta']['charset_sql_base']) - $character_set .= " CHARACTER SET ".$GLOBALS['meta']['charset_sql_base']; - if (@$GLOBALS['meta']['charset_collation_sql_base']) - $character_set .= " COLLATE ".$GLOBALS['meta']['charset_collation_sql_base']; + if (@$GLOBALS['meta']['charset_sql_base']) { + $character_set .= " CHARACTER SET " . $GLOBALS['meta']['charset_sql_base']; + } + if (@$GLOBALS['meta']['charset_collation_sql_base']) { + $character_set .= " COLLATE " . $GLOBALS['meta']['charset_collation_sql_base']; + } - foreach($champs as $k => $v) { + foreach ($champs as $k => $v) { $v = _mysql_remplacements_definitions_table($v); - if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i',$v,$defs)){ - if (preg_match(',(char|text),i',$defs[1]) - AND !preg_match(',(binary|CHARACTER|COLLATE),i',$v) ){ - $v = $defs[1] . $character_set . ' ' . substr($v,strlen($defs[1])); + if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) { + if (preg_match(',(char|text),i', $defs[1]) + AND !preg_match(',(binary|CHARACTER|COLLATE),i', $v) + ) { + $v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1])); } } @@ -628,11 +689,12 @@ function spip_mysql_create($nom, $champs, $cles, $autoinc = false, $temporary = ); $s = ","; } - $temporary = $temporary ? 'TEMPORARY':''; + $temporary = $temporary ? 'TEMPORARY' : ''; $q = "CREATE $temporary TABLE IF NOT EXISTS $nom ($query" . ($keys ? ",$keys" : '') . ")" . " ENGINE=MyISAM" - . ($character_set?" DEFAULT $character_set":"") - . "\n"; + . ($character_set ? " DEFAULT $character_set" : "") + . "\n"; + return spip_mysql_query($q, $serveur); } @@ -645,7 +707,7 @@ function spip_mysql_create($nom, $champs, $cles, $autoinc = false, $temporary = * @return string * Définition SQL adaptée pour MySQL d'un champ de table */ -function _mysql_remplacements_definitions_table($query){ +function _mysql_remplacements_definitions_table($query) { // quelques remplacements $num = "(\s*\([0-9]*\))?"; $enum = "(\s*\([^\)]*\))?"; @@ -655,6 +717,7 @@ function _mysql_remplacements_definitions_table($query){ ); $query = preg_replace(array_keys($remplace), $remplace, $query); + return $query; } @@ -662,19 +725,19 @@ function _mysql_remplacements_definitions_table($query){ /** * Crée une base de données MySQL * - * @param string $nom Nom de la base - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * @param string $nom Nom de la base + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool true si la base est créee. **/ function spip_mysql_create_base($nom, $serveur = '', $requeter = true) { - return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter); + return spip_mysql_query("CREATE DATABASE `$nom`", $serveur, $requeter); } /** * Crée une vue SQL nommée `$nom` - * + * * @param string $nom * Nom de la vue à creer * @param string $query_select @@ -689,53 +752,62 @@ function spip_mysql_create_base($nom, $serveur = '', $requeter = true) { * - string texte de la requête si $requeter vaut false */ function spip_mysql_create_view($nom, $query_select, $serveur = '', $requeter = true) { - if (!$query_select) return false; + if (!$query_select) { + return false; + } // vue deja presente if (sql_showtable($nom, false, $serveur)) { spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", _LOG_ERREUR); + return false; } - - $query = "CREATE VIEW $nom AS ". $query_select; + + $query = "CREATE VIEW $nom AS " . $query_select; + return spip_mysql_query($query, $serveur, $requeter); } /** * Supprime une table SQL - * - * @param string $table Nom de la table SQL - * @param string $exist True pour ajouter un test d'existence avant de supprimer - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $table Nom de la table SQL + * @param string $exist True pour ajouter un test d'existence avant de supprimer + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool|string * - string Texte de la requête si demandé * - true si la requête a réussie, false sinon */ -function spip_mysql_drop_table($table, $exist = '', $serveur = '', $requeter = true) -{ - if ($exist) $exist =" IF EXISTS"; +function spip_mysql_drop_table($table, $exist = '', $serveur = '', $requeter = true) { + if ($exist) { + $exist = " IF EXISTS"; + } + return spip_mysql_query("DROP TABLE$exist $table", $serveur, $requeter); } /** * Supprime une vue SQL - * - * @param string $view Nom de la vue SQL - * @param string $exist True pour ajouter un test d'existence avant de supprimer - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $view Nom de la vue SQL + * @param string $exist True pour ajouter un test d'existence avant de supprimer + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool|string * - string Texte de la requête si demandé * - true si la requête a réussie, false sinon */ function spip_mysql_drop_view($view, $exist = '', $serveur = '', $requeter = true) { - if ($exist) $exist =" IF EXISTS"; + if ($exist) { + $exist = " IF EXISTS"; + } + return spip_mysql_query("DROP VIEW$exist $view", $serveur, $requeter); } /** - * Retourne une ressource de la liste des tables de la base de données + * Retourne une ressource de la liste des tables de la base de données * * @param string $match * Filtre sur tables à récupérer @@ -746,9 +818,8 @@ function spip_mysql_drop_view($view, $exist = '', $serveur = '', $requeter = tru * false pour retourner le texte de la requête. * @return ressource * Ressource à utiliser avec sql_fetch() -**/ -function spip_mysql_showbase($match, $serveur = '', $requeter = true) -{ + **/ +function spip_mysql_showbase($match, $serveur = '', $requeter = true) { return spip_mysql_query("SHOW TABLES LIKE " . _q($match), $serveur, $requeter); } @@ -756,16 +827,15 @@ function spip_mysql_showbase($match, $serveur = '', $requeter = true) * Répare une table SQL * * Utilise `REPAIR TABLE ...` de MySQL - * - * @param string $table Nom de la table SQL - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $table Nom de la table SQL + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool|string * - string Texte de la requête si demandée, * - true si la requête a réussie, false sinon */ -function spip_mysql_repair($table, $serveur = '', $requeter = true) -{ +function spip_mysql_repair($table, $serveur = '', $requeter = true) { return spip_mysql_query("REPAIR TABLE `$table`", $serveur, $requeter); } @@ -780,80 +850,95 @@ define('_MYSQL_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^() * * - `field` (tableau colonne => description SQL) et * - `key` (tableau type de clé => colonnes) - * - * @param string $nom_table Nom de la table SQL - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $nom_table Nom de la table SQL + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|string * - chaîne vide si pas de description obtenue * - string Texte de la requête si demandé * - array description de la table sinon */ -function spip_mysql_showtable($nom_table, $serveur = '', $requeter = true) -{ +function spip_mysql_showtable($nom_table, $serveur = '', $requeter = true) { $s = spip_mysql_query("SHOW CREATE TABLE `$nom_table`", $serveur, $requeter); - if (!$s) return ''; - if (!$requeter) return $s; + if (!$s) { + return ''; + } + if (!$requeter) { + return $s; + } - list(,$a) = mysqli_fetch_array($s ,MYSQLI_NUM); - if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)){ + list(, $a) = mysqli_fetch_array($s, MYSQLI_NUM); + if (preg_match(_MYSQL_RE_SHOW_TABLE, $a, $r)) { $desc = $r[1]; // extraction d'une KEY éventuelle en prenant garde de ne pas // relever un champ dont le nom contient KEY (ex. ID_WHISKEY) if (preg_match("/^(.*?),([^,]*\sKEY[ (].*)$/s", $desc, $r)) { - $namedkeys = $r[2]; - $desc = $r[1]; + $namedkeys = $r[2]; + $desc = $r[1]; + } else { + $namedkeys = ""; } - else - $namedkeys = ""; $fields = array(); - foreach(preg_split("/,\s*`/",$desc) as $v) { - preg_match("/^\s*`?([^`]*)`\s*(.*)/",$v,$r); - $fields[strtolower($r[1])] = $r[2]; + foreach (preg_split("/,\s*`/", $desc) as $v) { + preg_match("/^\s*`?([^`]*)`\s*(.*)/", $v, $r); + $fields[strtolower($r[1])] = $r[2]; } $keys = array(); - foreach(preg_split('/\)\s*(,|$)/',$namedkeys) as $v) { - if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/",$v,$r)) { + foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) { + if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/", $v, $r)) { $k = str_replace("`", '', trim($r[1])); $t = strtolower(str_replace("`", '', $r[2])); - if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t; - } + if ($k && !isset($keys[$k])) { + $keys[$k] = $t; + } else { + $keys[] = $t; + } + } } spip_mysql_free($s); + return array('field' => $fields, 'key' => $keys); } $res = spip_mysql_query("SHOW COLUMNS FROM `$nom_table`", $serveur); - if($res) { - $nfields = array(); - $nkeys = array(); - while($val = spip_mysql_fetch($res)) { - $nfields[$val["Field"]] = $val['Type']; - if($val['Null']=='NO') { - $nfields[$val["Field"]] .= ' NOT NULL'; - } - if($val['Default'] === '0' || $val['Default']) { - if(preg_match('/[A-Z_]/',$val['Default'])) { - $nfields[$val["Field"]] .= ' DEFAULT '.$val['Default']; - } else { - $nfields[$val["Field"]] .= " DEFAULT '".$val['Default']."'"; - } - } - if($val['Extra']) - $nfields[$val["Field"]] .= ' '.$val['Extra']; - if($val['Key'] == 'PRI') { - $nkeys['PRIMARY KEY'] = $val["Field"]; - } else if($val['Key'] == 'MUL') { - $nkeys['KEY '.$val["Field"]] = $val["Field"]; - } else if($val['Key'] == 'UNI') { - $nkeys['UNIQUE KEY '.$val["Field"]] = $val["Field"]; + if ($res) { + $nfields = array(); + $nkeys = array(); + while ($val = spip_mysql_fetch($res)) { + $nfields[$val["Field"]] = $val['Type']; + if ($val['Null'] == 'NO') { + $nfields[$val["Field"]] .= ' NOT NULL'; + } + if ($val['Default'] === '0' || $val['Default']) { + if (preg_match('/[A-Z_]/', $val['Default'])) { + $nfields[$val["Field"]] .= ' DEFAULT ' . $val['Default']; + } else { + $nfields[$val["Field"]] .= " DEFAULT '" . $val['Default'] . "'"; + } + } + if ($val['Extra']) { + $nfields[$val["Field"]] .= ' ' . $val['Extra']; + } + if ($val['Key'] == 'PRI') { + $nkeys['PRIMARY KEY'] = $val["Field"]; + } else { + if ($val['Key'] == 'MUL') { + $nkeys['KEY ' . $val["Field"]] = $val["Field"]; + } else { + if ($val['Key'] == 'UNI') { + $nkeys['UNIQUE KEY ' . $val["Field"]] = $val["Field"]; + } + } + } } - } - spip_mysql_free($res); - return array('field' => $nfields, 'key' => $nkeys); + spip_mysql_free($res); + + return array('field' => $nfields, 'key' => $nkeys); } + return ""; } @@ -862,61 +947,75 @@ function spip_mysql_showtable($nom_table, $serveur = '', $requeter = true) * Rècupère une ligne de résultat * * Récupère la ligne suivante d'une ressource de résultat - * - * @param Ressource $r Ressource de résultat (issu de sql_select) - * @param string $t Structure de résultat attendu (défaut MYSQLI_ASSOC) - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * + * @param Ressource $r Ressource de résultat (issu de sql_select) + * @param string $t Structure de résultat attendu (défaut MYSQLI_ASSOC) + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return array Ligne de résultat */ function spip_mysql_fetch($r, $t = '', $serveur = '', $requeter = true) { - if (!$t) $t = MYSQLI_ASSOC; - if ($r) return mysqli_fetch_array($r, $t); + if (!$t) { + $t = MYSQLI_ASSOC; + } + if ($r) { + return mysqli_fetch_array($r, $t); + } } /** * Place le pointeur de résultat sur la position indiquée * - * @param Ressource $r Ressource de résultat - * @param int $row_number Position. Déplacer le pointeur à cette ligne - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * @param Ressource $r Ressource de résultat + * @param int $row_number Position. Déplacer le pointeur à cette ligne + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return bool True si déplacement réussi, false sinon. -**/ + **/ function spip_mysql_seek($r, $row_number, $serveur = '', $requeter = true) { - if ($r and mysqli_num_rows($r)) return mysqli_data_seek($r,$row_number); + if ($r and mysqli_num_rows($r)) { + return mysqli_data_seek($r, $row_number); + } } - /** * Retourne le nombre de lignes d'une sélection * - * @param array|string $from Tables à consulter (From) - * @param array|string $where Conditions a remplir (Where) - * @param array|string $groupby Critère de regroupement (Group by) - * @param array $having Tableau des des post-conditions à remplir (Having) - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * @param array|string $from Tables à consulter (From) + * @param array|string $where Conditions a remplir (Where) + * @param array|string $groupby Critère de regroupement (Group by) + * @param array $having Tableau des des post-conditions à remplir (Having) + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return int|string * - String Texte de la requête si demandé * - int Nombre de lignes (0 si la requête n'a pas réussie) -**/ -function spip_mysql_countsel($from = array(), $where = array(), - $groupby = '', $having = array(), $serveur='',$requeter=true) -{ + **/ +function spip_mysql_countsel( + $from = array(), + $where = array(), + $groupby = '', + $having = array(), + $serveur = '', + $requeter = true +) { $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby))); - $r = spip_mysql_select("COUNT($c)", $from, $where,'', '', '', $having, $serveur, $requeter); - if (!$requeter) return $r; - if (!$r instanceof mysqli_result) return 0; + $r = spip_mysql_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter); + if (!$requeter) { + return $r; + } + if (!$r instanceof mysqli_result) { + return 0; + } list($c) = mysqli_fetch_array($r, MYSQLI_NUM); mysqli_free_result($r); + return $c; } - /** * Retourne la dernière erreur generée * @@ -925,7 +1024,7 @@ function spip_mysql_countsel($from = array(), $where = array(), * mais à l'install la globale n'est pas encore complètement définie. * * @uses sql_error_backtrace() - * + * * @param string $query * Requête qui était exécutée * @param string $serveur @@ -940,10 +1039,11 @@ function spip_mysql_error($query = '', $serveur = '', $requeter = true) { $s = mysqli_error($link); if ($s) { $trace = debug_backtrace(); - if ($trace[0]['function']!="spip_mysql_error"){ - spip_log("$s - $query - ".sql_error_backtrace(), 'mysql.'._LOG_ERREUR); + if ($trace[0]['function'] != "spip_mysql_error") { + spip_log("$s - $query - " . sql_error_backtrace(), 'mysql.' . _LOG_ERREUR); } } + return $s; } @@ -963,9 +1063,13 @@ function spip_mysql_errno($serveur = '', $requeter = true) { $s = mysqli_errno($link); // 2006 MySQL server has gone away // 2013 Lost connection to MySQL server during query - if (in_array($s, array(2006,2013))) + if (in_array($s, array(2006, 2013))) { define('spip_interdire_cache', true); - if ($s) spip_log("Erreur mysql $s", _LOG_ERREUR); + } + if ($s) { + spip_log("Erreur mysql $s", _LOG_ERREUR); + } + return $s; } @@ -973,36 +1077,37 @@ function spip_mysql_errno($serveur = '', $requeter = true) { /** * Retourne le nombre de lignes d’une ressource de sélection obtenue * avec `sql_select()` - * - * @param Ressource $r Ressource de résultat - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * + * @param Ressource $r Ressource de résultat + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return int Nombre de lignes */ function spip_mysql_count($r, $serveur = '', $requeter = true) { - if ($r) return mysqli_num_rows($r); + if ($r) { + return mysqli_num_rows($r); + } } - /** * Libère une ressource de résultat * * Indique à MySQL de libérer de sa mémoire la ressoucre de résultat indiquée * car on n'a plus besoin de l'utiliser. - * - * @param Ressource $r Ressource de résultat - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * + * @param Ressource $r Ressource de résultat + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return bool True si réussi */ function spip_mysql_free($r, $serveur = '', $requeter = true) { - return (($r instanceof mysqli_result)?mysqli_free_result($r):false); + return (($r instanceof mysqli_result) ? mysqli_free_result($r) : false); } /** - * Insère une ligne dans une table + * Insère une ligne dans une table * * @param string $table * Nom de la table SQL @@ -1022,7 +1127,7 @@ function spip_mysql_free($r, $serveur = '', $requeter = true) { * - Texte de la requête si demandé, * - False en cas d'erreur, * - Tableau de description de la requête et du temps d'exécution, si var_profile activé -**/ + **/ function spip_mysql_insert($table, $champs, $valeurs, $desc = array(), $serveur = '', $requeter = true) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; @@ -1030,25 +1135,34 @@ function spip_mysql_insert($table, $champs, $valeurs, $desc = array(), $serveur $link = $connexion['link']; $db = $connexion['db']; - if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table); - - $query ="INSERT INTO $table $champs VALUES $valeurs"; - if (!$requeter) return $query; - + if ($prefixe) { + $table = preg_replace('/^spip/', $prefixe, $table); + } + + $query = "INSERT INTO $table $champs VALUES $valeurs"; + if (!$requeter) { + return $query; + } + if (isset($_GET['var_profile'])) { include_spip('public/tracer'); $t = trace_query_start(); - } else $t = 0 ; + } else { + $t = 0; + } $connexion['last'] = $query; #spip_log($query, 'mysql.'._LOG_DEBUG); $r = false; - if (mysqli_query($link, $query)) + if (mysqli_query($link, $query)) { $r = mysqli_insert_id($link); - else { - if ($e = spip_mysql_errno($serveur)) // Log de l'erreur eventuelle - $e .= spip_mysql_error($query, $serveur); // et du fautif + } else { + if ($e = spip_mysql_errno($serveur)) // Log de l'erreur eventuelle + { + $e .= spip_mysql_error($query, $serveur); + } // et du fautif } + return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r; // return $r ? $r : (($r===0) ? -1 : 0); pb avec le multi-base. @@ -1073,18 +1187,23 @@ function spip_mysql_insert($table, $champs, $valeurs, $desc = array(), $serveur * - Texte de la requête si demandé, * - False en cas d'erreur, * - Tableau de description de la requête et du temps d'exécution, si var_profile activé -**/ + **/ function spip_mysql_insertq($table, $couples = array(), $desc = array(), $serveur = '', $requeter = true) { - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) $couples = array(); - $fields = isset($desc['field'])?$desc['field']:array(); + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + $couples = array(); + } + $fields = isset($desc['field']) ? $desc['field'] : array(); foreach ($couples as $champ => $val) { - $couples[$champ]= spip_mysql_cite($val, $fields[$champ]); + $couples[$champ] = spip_mysql_cite($val, $fields[$champ]); } - return spip_mysql_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter); + return spip_mysql_insert($table, "(" . join(',', array_keys($couples)) . ")", "(" . join(',', $couples) . ")", $desc, + $serveur, $requeter); } @@ -1106,37 +1225,42 @@ function spip_mysql_insertq($table, $couples = array(), $desc = array(), $serveu * - True en cas de succès, * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ + **/ function spip_mysql_insertq_multi($table, $tab_couples = array(), $desc = array(), $serveur = '', $requeter = true) { - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) $tab_couples = array(); - $fields = isset($desc['field'])?$desc['field']:array(); - - $cles = "(" . join(',',array_keys(reset($tab_couples))) . ')'; + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + $tab_couples = array(); + } + $fields = isset($desc['field']) ? $desc['field'] : array(); + + $cles = "(" . join(',', array_keys(reset($tab_couples))) . ')'; $valeurs = array(); $r = false; // Quoter et Inserer par groupes de 100 max pour eviter un debordement de pile foreach ($tab_couples as $couples) { - foreach ($couples as $champ => $val){ - $couples[$champ]= spip_mysql_cite($val, $fields[$champ]); + foreach ($couples as $champ => $val) { + $couples[$champ] = spip_mysql_cite($val, $fields[$champ]); } - $valeurs[] = '(' .join(',', $couples) . ')'; - if (count($valeurs)>=100){ + $valeurs[] = '(' . join(',', $couples) . ')'; + if (count($valeurs) >= 100) { $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter); $valeurs = array(); } } - if (count($valeurs)) + if (count($valeurs)) { $r = spip_mysql_insert($table, $cles, join(', ', $valeurs), $desc, $serveur, $requeter); + } return $r; // dans le cas d'une table auto_increment, le dernier insert_id } /** * Met à jour des enregistrements d'une table SQL - * + * * @param string $table * Nom de la table * @param array $champs @@ -1157,14 +1281,16 @@ function spip_mysql_insertq_multi($table, $tab_couples = array(), $desc = array( */ function spip_mysql_update($table, $champs, $where = '', $desc = array(), $serveur = '', $requeter = true) { $set = array(); - foreach ($champs as $champ => $val) + foreach ($champs as $champ => $val) { $set[] = $champ . "=$val"; - if (!empty($set)) + } + if (!empty($set)) { return spip_mysql_query( - calculer_mysql_expression('UPDATE', $table, ',') + calculer_mysql_expression('UPDATE', $table, ',') . calculer_mysql_expression('SET', $set, ',') - . calculer_mysql_expression('WHERE', $where), + . calculer_mysql_expression('WHERE', $where), $serveur, $requeter); + } } /** @@ -1176,7 +1302,7 @@ function spip_mysql_update($table, $champs, $where = '', $desc = array(), $serve * @note * Les valeurs sont des constantes à mettre entre apostrophes * sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc) - * + * * @param string $table * Nom de la table * @param array $champs @@ -1197,44 +1323,56 @@ function spip_mysql_update($table, $champs, $where = '', $desc = array(), $serve */ function spip_mysql_updateq($table, $champs, $where = '', $desc = array(), $serveur = '', $requeter = true) { - if (!$champs) return; - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) $champs = array(); else $fields = $desc['field']; + if (!$champs) { + return; + } + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + $champs = array(); + } else { + $fields = $desc['field']; + } $set = array(); foreach ($champs as $champ => $val) { $set[] = $champ . '=' . spip_mysql_cite($val, @$fields[$champ]); } + return spip_mysql_query( - calculer_mysql_expression('UPDATE', $table, ',') - . calculer_mysql_expression('SET', $set, ',') - . calculer_mysql_expression('WHERE', $where), - $serveur, $requeter); + calculer_mysql_expression('UPDATE', $table, ',') + . calculer_mysql_expression('SET', $set, ',') + . calculer_mysql_expression('WHERE', $where), + $serveur, $requeter); } /** * Supprime des enregistrements d'une table * - * @param string $table Nom de la table SQL - * @param string|array $where Conditions à vérifier - * @param string $serveur Nom du connecteur - * @param bool $requeter Exécuter la requête, sinon la retourner + * @param string $table Nom de la table SQL + * @param string|array $where Conditions à vérifier + * @param string $serveur Nom du connecteur + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool|string * - int : nombre de suppressions réalisées, * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ + **/ function spip_mysql_delete($table, $where = '', $serveur = '', $requeter = true) { $res = spip_mysql_query( - calculer_mysql_expression('DELETE FROM', $table, ',') - . calculer_mysql_expression('WHERE', $where), - $serveur, $requeter); - if (!$requeter) return $res; - if ($res){ + calculer_mysql_expression('DELETE FROM', $table, ',') + . calculer_mysql_expression('WHERE', $where), + $serveur, $requeter); + if (!$requeter) { + return $res; + } + if ($res) { $link = _mysql_link($serveur); + return mysqli_affected_rows($link); - } - else + } else { return false; + } } @@ -1245,7 +1383,7 @@ function spip_mysql_delete($table, $where = '', $serveur = '', $requeter = true) * La fonction effectue une protection automatique des données. * * Préférez updateq ou insertq. - * + * * @param string $table * Nom de la table SQL * @param array $couples @@ -1261,9 +1399,10 @@ function spip_mysql_delete($table, $where = '', $serveur = '', $requeter = true) * - true si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ + **/ function spip_mysql_replace($table, $couples, $desc = array(), $serveur = '', $requeter = true) { - return spip_mysql_query("REPLACE $table (" . join(',',array_keys($couples)) . ') VALUES (' .join(',',array_map('_q', $couples)) . ')', $serveur, $requeter); + return spip_mysql_query("REPLACE $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(',', + array_map('_q', $couples)) . ')', $serveur, $requeter); } @@ -1272,9 +1411,9 @@ function spip_mysql_replace($table, $couples, $desc = array(), $serveur = '', $r * * La clé ou les cles primaires doivent être présentes dans les données insérés. * La fonction effectue une protection automatique des données. - * + * * Préférez insertq_multi et sql_updateq - * + * * @param string $table * Nom de la table SQL * @param array $tab_couples @@ -1290,19 +1429,19 @@ function spip_mysql_replace($table, $couples, $desc = array(), $serveur = '', $r * - true si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ + **/ function spip_mysql_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $requeter = true) { - $cles = "(" . join(',',array_keys($tab_couples[0])). ')'; + $cles = "(" . join(',', array_keys($tab_couples[0])) . ')'; $valeurs = array(); foreach ($tab_couples as $couples) { - $valeurs[] = '(' .join(',',array_map('_q', $couples)) . ')'; + $valeurs[] = '(' . join(',', array_map('_q', $couples)) . ')'; } - $valeurs = implode(', ',$valeurs); + $valeurs = implode(', ', $valeurs); + return spip_mysql_query("REPLACE $table $cles VALUES $valeurs", $serveur, $requeter); } - /** * Retourne l'instruction SQL pour obtenir le texte d'un champ contenant * une balise `<multi>` dans la langue indiquée @@ -1310,33 +1449,33 @@ function spip_mysql_replace_multi($table, $tab_couples, $desc = array(), $serveu * Cette sélection est mise dans l'alias `multi` (instruction AS multi). * * @param string $objet Colonne ayant le texte - * @param string $lang Langue à extraire + * @param string $lang Langue à extraire * @return string Texte de sélection pour la requête */ function spip_mysql_multi($objet, $lang) { $lengthlang = strlen("[$lang]"); - $posmulti = "INSTR(".$objet.", '<multi>')"; - $posfinmulti = "INSTR(".$objet.", '</multi>')"; - $debutchaine = "LEFT(".$objet.", $posmulti-1)"; - $finchaine = "RIGHT(".$objet.", CHAR_LENGTH(".$objet.") -(7+$posfinmulti))"; - $chainemulti = "TRIM(SUBSTRING(".$objet.", $posmulti+7, $posfinmulti -(7+$posmulti)))"; - $poslang = "INSTR($chainemulti,'[".$lang."]')"; + $posmulti = "INSTR(" . $objet . ", '<multi>')"; + $posfinmulti = "INSTR(" . $objet . ", '</multi>')"; + $debutchaine = "LEFT(" . $objet . ", $posmulti-1)"; + $finchaine = "RIGHT(" . $objet . ", CHAR_LENGTH(" . $objet . ") -(7+$posfinmulti))"; + $chainemulti = "TRIM(SUBSTRING(" . $objet . ", $posmulti+7, $posfinmulti -(7+$posmulti)))"; + $poslang = "INSTR($chainemulti,'[" . $lang . "]')"; $poslang = "IF($poslang=0,INSTR($chainemulti,']')+1,$poslang+$lengthlang)"; - $chainelang = "TRIM(SUBSTRING(".$objet.", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))"; - $posfinlang = "INSTR(".$chainelang.", '[')"; + $chainelang = "TRIM(SUBSTRING(" . $objet . ", $posmulti+7+$poslang-1,$posfinmulti -($posmulti+7+$poslang-1) ))"; + $posfinlang = "INSTR(" . $chainelang . ", '[')"; $chainelang = "IF($posfinlang>0,LEFT($chainelang,$posfinlang-1),$chainelang)"; //$chainelang = "LEFT($chainelang,$posfinlang-1)"; - $retour = "(TRIM(IF($posmulti = 0 , ". - " TRIM(".$objet."), ". - " CONCAT( ". - " $debutchaine, ". - " IF( ". - " $poslang = 0, ". - " $chainemulti, ". - " $chainelang". - " ), ". - " $finchaine". - " ) ". + $retour = "(TRIM(IF($posmulti = 0 , " . + " TRIM(" . $objet . "), " . + " CONCAT( " . + " $debutchaine, " . + " IF( " . + " $poslang = 0, " . + " $chainemulti, " . + " $chainelang" . + " ), " . + " $finchaine" . + " ) " . "))) AS multi"; return $retour; @@ -1344,16 +1483,15 @@ function spip_mysql_multi($objet, $lang) { /** * Prépare une chaîne hexadécimale - * + * * Par exemple : FF ==> 0xFF en MySQL - * + * * @param string $v * Chaine hexadecimale * @return string * Valeur hexadécimale pour MySQL -**/ -function spip_mysql_hex($v) -{ + **/ +function spip_mysql_hex($v) { return "0x" . $v; } @@ -1371,17 +1509,21 @@ function spip_mysql_hex($v) */ function spip_mysql_quote($v, $type = '') { if ($type) { - if (!is_array($v)) - return spip_mysql_cite($v,$type); + if (!is_array($v)) { + return spip_mysql_cite($v, $type); + } // si c'est un tableau, le parcourir en propageant le type - foreach($v as $k=>$r) + foreach ($v as $k => $r) { $v[$k] = spip_mysql_quote($r, $type); + } + return $v; } // si on ne connait pas le type, s'en remettre a _q : // on ne fera pas mieux - else + else { return _q($v); + } } /** @@ -1396,12 +1538,11 @@ function spip_mysql_quote($v, $type = '') { * @return string * Expression SQL **/ -function spip_mysql_date_proche($champ, $interval, $unite) -{ +function spip_mysql_date_proche($champ, $interval, $unite) { return '(' . $champ - . (($interval <= 0) ? '>' : '<') - . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD') + . (($interval <= 0) ? '>' : '<') + . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD') . '(' . sql_quote(date('Y-m-d H:i:s')) . ', INTERVAL ' @@ -1430,16 +1571,16 @@ function spip_mysql_date_proche($champ, $interval, $unite) * Inutilisé * @return string * Expression de requête SQL -**/ + **/ function spip_mysql_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) { $n = $i = 0; - $in_sql =""; + $in_sql = ""; while ($n = strpos($valeurs, ',', $n+1)) { - if ((++$i) >= 255) { + if ((++$i) >= 255) { $in_sql .= "($val $not IN (" . - substr($valeurs, 0, $n) . - "))\n" . - ($not ? "AND\t" : "OR\t"); + substr($valeurs, 0, $n) . + "))\n" . + ($not ? "AND\t" : "OR\t"); $valeurs = substr($valeurs, $n+1); $i = $n = 0; } @@ -1454,60 +1595,70 @@ function spip_mysql_in($val, $valeurs, $not = '', $serveur = '', $requeter = tru * Retourne une expression IN pour le gestionnaire de base de données * * Pour compatibilité. Ne plus utiliser. - * + * * @deprecated Utiliser sql_in() - * - * @param string $val Nom de la colonne + * + * @param string $val Nom de la colonne * @param string|array $valeurs Valeurs - * @param string $not NOT pour inverser + * @param string $not NOT pour inverser * @return string Expression de requête SQL */ function calcul_mysql_in($val, $valeurs, $not = '') { - if (is_array($valeurs)) + if (is_array($valeurs)) { $valeurs = join(',', array_map('_q', $valeurs)); - elseif ($valeurs[0]===',') $valeurs = substr($valeurs,1); - if (!strlen(trim($valeurs))) return ($not ? "0=0" : '0=1'); + } elseif ($valeurs[0] === ',') { + $valeurs = substr($valeurs, 1); + } + if (!strlen(trim($valeurs))) { + return ($not ? "0=0" : '0=1'); + } + return spip_mysql_in($val, $valeurs, $not); } - /** * Renvoie les bons echappements (mais pas sur les fonctions comme NOW()) * - * @param string|number $v Texte ou nombre à échapper - * @param string $type Type de donnée attendue, description SQL de la colonne de destination + * @param string|number $v Texte ou nombre à échapper + * @param string $type Type de donnée attendue, description SQL de la colonne de destination * @return string|number Texte ou nombre échappé */ function spip_mysql_cite($v, $type) { - if(is_null($v) - AND stripos($type,"NOT NULL")===false) return 'NULL'; // null php se traduit en NULL SQL - if (sql_test_date($type) AND preg_match('/^\w+\(/', $v)) + if (is_null($v) + AND stripos($type, "NOT NULL") === false + ) { + return 'NULL'; + } // null php se traduit en NULL SQL + if (sql_test_date($type) AND preg_match('/^\w+\(/', $v)) { return $v; + } if (sql_test_int($type)) { - if (is_numeric($v) OR (ctype_xdigit(substr($v,2)) - AND $v[0]=='0' AND $v[1]=='x')) + if (is_numeric($v) OR (ctype_xdigit(substr($v, 2)) + AND $v[0] == '0' AND $v[1] == 'x') + ) { return $v; - // si pas numerique, forcer le intval - else + } // si pas numerique, forcer le intval + else { return intval($v); + } } - return ("'" . addslashes($v) . "'"); -} + return ("'" . addslashes($v) . "'"); +} // Ces deux fonctions n'ont pas d'equivalent exact PostGres // et ne sont la que pour compatibilite avec les extensions de SPIP < 1.9.3 /** - * Poser un verrou SQL local + * Poser un verrou SQL local * * Changer de nom toutes les heures en cas de blocage MySQL (ca arrive) * * @deprecated Pas d'équivalence actuellement en dehors de MySQL * @see spip_release_lock() - * + * * @param string $nom * Inutilisé. Le nom est calculé en fonction de la connexion principale * @param int $timeout @@ -1522,21 +1673,24 @@ function spip_get_lock($nom, $timeout = 0) { $connexion = &$GLOBALS['connexions'][0]; $bd = $connexion['db']; $prefixe = $connexion['prefixe']; - $nom = "$bd:$prefixe:$nom" . _LOCK_TIME; + $nom = "$bd:$prefixe:$nom" . _LOCK_TIME; $connexion['last'] = $q = "SELECT GET_LOCK(" . _q($nom) . ", $timeout) AS n"; $q = @sql_fetch(mysql_query($q)); - if (!$q) spip_log("pas de lock sql pour $nom", _LOG_ERREUR); + if (!$q) { + spip_log("pas de lock sql pour $nom", _LOG_ERREUR); + } + return $q['n']; } /** - * Relâcher un verrou SQL local - * + * Relâcher un verrou SQL local + * * @deprecated Pas d'équivalence actuellement en dehors de MySQL * @see spip_get_lock() - * + * * @param string $nom * Inutilisé. Le nom est calculé en fonction de la connexion principale * @return string|bool @@ -1556,36 +1710,38 @@ function spip_release_lock($nom) { /** * Teste si on a les fonctions MySQLi (pour l'install) - * + * * @return bool * True si on a les fonctions, false sinon */ function spip_versions_mysql() { charger_php_extension('mysqli'); + return function_exists('mysqli_query'); } /** * Tester si mysql ne veut pas du nom de la base dans les requêtes - * + * * @param string $server_db * @return string * - chaîne vide si nom de la base utile * - chaîne : code compilé pour le faire désactiver par SPIP sinon */ -function test_rappel_nom_base_mysql($server_db) -{ +function test_rappel_nom_base_mysql($server_db) { $GLOBALS['mysql_rappel_nom_base'] = true; sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db); $ok = spip_query("INSERT INTO spip_meta (nom,valeur) VALUES ('mysql_rappel_nom_base', 'test')", $server_db); if ($ok) { sql_delete('spip_meta', "nom='mysql_rappel_nom_base'", $server_db); + return ''; } else { $GLOBALS['mysql_rappel_nom_base'] = false; - return "\$GLOBALS['mysql_rappel_nom_base'] = false; ". + + return "\$GLOBALS['mysql_rappel_nom_base'] = false; " . "/* echec de test_rappel_nom_base_mysql a l'installation. */\n"; } } @@ -1594,19 +1750,21 @@ function test_rappel_nom_base_mysql($server_db) * Teste si on peut changer les modes de MySQL * * @link http://dev.mysql.com/doc/refman/5.0/fr/server-sql-mode.html - * - * @param string $server_db Nom de la connexion + * + * @param string $server_db Nom de la connexion * @return string * - chaîne vide si on ne peut pas appliquer de mode * - chaîne : code compilé pour l'indiquer le résultat du test à SPIP */ -function test_sql_mode_mysql($server_db){ - $res = sql_select("version() as v",'','','','','','',$server_db); - $row = sql_fetch($res,$server_db); - if (version_compare($row['v'],'5.0.0','>=')){ +function test_sql_mode_mysql($server_db) { + $res = sql_select("version() as v", '', '', '', '', '', '', $server_db); + $row = sql_fetch($res, $server_db); + if (version_compare($row['v'], '5.0.0', '>=')) { defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE', true); + return "defined('_MYSQL_SET_SQL_MODE') || define('_MYSQL_SET_SQL_MODE',true);\n"; } + return ''; } diff --git a/ecrire/req/pg.exp.php b/ecrire/req/pg.exp.php index c288956d20..71bc4357a5 100644 --- a/ecrire/req/pg.exp.php +++ b/ecrire/req/pg.exp.php @@ -16,8 +16,10 @@ * * @package SPIP\Core\SQL\PostgreSQL */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} define('_DEFAULT_DB', 'spip'); @@ -31,38 +33,46 @@ define('_DEFAULT_DB', 'spip'); // http://code.spip.net/@req_pg_dist function req_pg_dist($addr, $port, $login, $pass, $db = '', $prefixe = '') { static $last_connect = array(); - if (!charger_php_extension('pgsql')) return false; - + if (!charger_php_extension('pgsql')) { + return false; + } + // si provient de selectdb - if (empty($addr) && empty($port) && empty($login) && empty($pass)){ - foreach (array('addr','port','login','pass','prefixe') as $a){ + if (empty($addr) && empty($port) && empty($login) && empty($pass)) { + foreach (array('addr', 'port', 'login', 'pass', 'prefixe') as $a) { $$a = $last_connect[$a]; } } @list($host, $p) = explode(';', $addr); - if ($p >0) $port = " port=$p" ; else $port = ''; + if ($p > 0) { + $port = " port=$p"; + } else { + $port = ''; + } $erreurs = array(); if ($db) { @$link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW); } elseif (!@$link = pg_connect("host=$host$port user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) { + $erreurs[] = pg_last_error(); + if (@$link = pg_connect("host=$host$port dbname=$login user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) { + $db = $login; + } else { $erreurs[] = pg_last_error(); - if (@$link = pg_connect("host=$host$port dbname=$login user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW)) { - $db = $login; - } else { - $erreurs[] = pg_last_error(); - $db = _DEFAULT_DB; - $link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW); - } + $db = _DEFAULT_DB; + $link = pg_connect("host=$host$port dbname=$db user=$login password='$pass'", PGSQL_CONNECT_FORCE_NEW); + } } if (!$link) { $erreurs[] = pg_last_error(); - foreach($erreurs as $e) - spip_log('Echec pg_connect. Erreur : ' . $e,'pg.'._LOG_HS); + foreach ($erreurs as $e) { + spip_log('Echec pg_connect. Erreur : ' . $e, 'pg.' . _LOG_HS); + } + return false; } - if ($link) - $last_connect = array ( + if ($link) { + $last_connect = array( 'addr' => $addr, 'port' => $port, 'login' => $login, @@ -70,58 +80,59 @@ function req_pg_dist($addr, $port, $login, $pass, $db = '', $prefixe = '') { 'db' => $db, 'prefixe' => $prefixe, ); - - spip_log("Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'),'pg.'._LOG_DEBUG); + } + + spip_log("Connexion vers $host, base $db, prefixe $prefixe " . ($link ? 'operationnelle' : 'impossible'), + 'pg.' . _LOG_DEBUG); return !$link ? false : array( 'db' => $db, 'prefixe' => $prefixe ? $prefixe : $db, 'link' => $link, - ); + ); } $GLOBALS['spip_pg_functions_1'] = array( - 'alter' => 'spip_pg_alter', - 'count' => 'spip_pg_count', - 'countsel' => 'spip_pg_countsel', - 'create' => 'spip_pg_create', - 'create_base' => 'spip_pg_create_base', - 'create_view' => 'spip_pg_create_view', - 'date_proche' => 'spip_pg_date_proche', - 'delete' => 'spip_pg_delete', - 'drop_table' => 'spip_pg_drop_table', - 'drop_view' => 'spip_pg_drop_view', - 'errno' => 'spip_pg_errno', - 'error' => 'spip_pg_error', - 'explain' => 'spip_pg_explain', - 'fetch' => 'spip_pg_fetch', - 'seek' => 'spip_pg_seek', - 'free' => 'spip_pg_free', - 'hex' => 'spip_pg_hex', - 'in' => 'spip_pg_in', - 'insert' => 'spip_pg_insert', - 'insertq' => 'spip_pg_insertq', - 'insertq_multi' => 'spip_pg_insertq_multi', - 'listdbs' => 'spip_pg_listdbs', - 'multi' => 'spip_pg_multi', - 'optimize' => 'spip_pg_optimize', - 'query' => 'spip_pg_query', - 'quote' => 'spip_pg_quote', - 'replace' => 'spip_pg_replace', - 'replace_multi' => 'spip_pg_replace_multi', - 'select' => 'spip_pg_select', - 'selectdb' => 'spip_pg_selectdb', - 'set_connect_charset' => 'spip_pg_set_connect_charset', - 'showbase' => 'spip_pg_showbase', - 'showtable' => 'spip_pg_showtable', - 'update' => 'spip_pg_update', - 'updateq' => 'spip_pg_updateq', - ); + 'alter' => 'spip_pg_alter', + 'count' => 'spip_pg_count', + 'countsel' => 'spip_pg_countsel', + 'create' => 'spip_pg_create', + 'create_base' => 'spip_pg_create_base', + 'create_view' => 'spip_pg_create_view', + 'date_proche' => 'spip_pg_date_proche', + 'delete' => 'spip_pg_delete', + 'drop_table' => 'spip_pg_drop_table', + 'drop_view' => 'spip_pg_drop_view', + 'errno' => 'spip_pg_errno', + 'error' => 'spip_pg_error', + 'explain' => 'spip_pg_explain', + 'fetch' => 'spip_pg_fetch', + 'seek' => 'spip_pg_seek', + 'free' => 'spip_pg_free', + 'hex' => 'spip_pg_hex', + 'in' => 'spip_pg_in', + 'insert' => 'spip_pg_insert', + 'insertq' => 'spip_pg_insertq', + 'insertq_multi' => 'spip_pg_insertq_multi', + 'listdbs' => 'spip_pg_listdbs', + 'multi' => 'spip_pg_multi', + 'optimize' => 'spip_pg_optimize', + 'query' => 'spip_pg_query', + 'quote' => 'spip_pg_quote', + 'replace' => 'spip_pg_replace', + 'replace_multi' => 'spip_pg_replace_multi', + 'select' => 'spip_pg_select', + 'selectdb' => 'spip_pg_selectdb', + 'set_connect_charset' => 'spip_pg_set_connect_charset', + 'showbase' => 'spip_pg_showbase', + 'showtable' => 'spip_pg_showtable', + 'update' => 'spip_pg_update', + 'updateq' => 'spip_pg_updateq', +); // Par ou ca passe une fois les traductions faites // http://code.spip.net/@spip_pg_trace_query -function spip_pg_trace_query($query, $serveur = '') -{ +function spip_pg_trace_query($query, $serveur = '') { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; @@ -130,13 +141,17 @@ function spip_pg_trace_query($query, $serveur = '') if (isset($_GET['var_profile'])) { include_spip('public/tracer'); $t = trace_query_start(); - } else $t = 0 ; - + } else { + $t = 0; + } + $connexion['last'] = $query; $r = spip_pg_query_simple($link, $query); - if ($e = spip_pg_errno($serveur)) // Log de l'erreur eventuelle - $e .= spip_pg_error($query, $serveur); // et du fautif + if ($e = spip_pg_errno($serveur)) // Log de l'erreur eventuelle + { + $e .= spip_pg_error($query, $serveur); + } // et du fautif return $t ? trace_query_end($query, $t, $r, $e, $serveur) : $r; } @@ -144,8 +159,7 @@ function spip_pg_trace_query($query, $serveur = '') // Elle change juste le noms des tables ($table_prefix) dans le FROM etc // http://code.spip.net/@spip_pg_query -function spip_pg_query($query, $serveur = '', $requeter = true) -{ +function spip_pg_query($query, $serveur = '', $requeter = true) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; @@ -154,16 +168,20 @@ function spip_pg_query($query, $serveur = '', $requeter = true) if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/i', $query, $regs)) { $suite = strstr($query, $regs[0]); $query = substr($query, 0, -strlen($suite)); - } else $suite =''; - $query = preg_replace('/([,\s])spip_/', '\1'.$prefixe.'_', $query) . $suite; + } else { + $suite = ''; + } + $query = preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite; // renvoyer la requete inerte si demandee - if (!$requeter) return $query; + if (!$requeter) { + return $query; + } return spip_pg_trace_query($query, $serveur); } -function spip_pg_query_simple($link, $query){ +function spip_pg_query_simple($link, $query) { #spip_log(var_export($query,true), 'pg.'._LOG_DEBUG); return pg_query($link, $query); } @@ -176,40 +194,45 @@ function spip_pg_query_simple($link, $query){ * stocke le resultat pour ne pas faire * de requetes showtable intempestives */ -function spip_pg_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = ''){ +function spip_pg_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') { static $tables = array(); - - if (!isset($tables[$table])){ - - if (!$desc){ + + if (!isset($tables[$table])) { + + if (!$desc) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table, $serveur); // si pas de description, on ne fait rien, ou on die() ? - if (!$desc) return $couples; + if (!$desc) { + return $couples; + } } - + // recherche des champs avec simplement 'TIMESTAMP' // cependant, il faudra peut etre etendre // avec la gestion de DEFAULT et ON UPDATE // mais ceux-ci ne sont pas utilises dans le core $tables[$table] = array(); - foreach ($desc['field'] as $k=>$v){ + foreach ($desc['field'] as $k => $v) { $v = strtolower(ltrim($v)); // ne pas ajouter de timestamp now() si un default est specifie - if (strpos($v, 'timestamp')===0 AND strpos($v, 'default')===false) + if (strpos($v, 'timestamp') === 0 AND strpos($v, 'default') === false) { $tables[$table][] = $k; + } } } - + // ajout des champs type 'timestamp' absents - foreach ($tables[$table] as $maj){ - if (!array_key_exists($maj, $couples)) - $couples[$maj] = "NOW()"; + foreach ($tables[$table] as $maj) { + if (!array_key_exists($maj, $couples)) { + $couples[$maj] = "NOW()"; + } } + return $couples; } - - + + // Alter en PG ne traite pas les index // http://code.spip.net/@spip_pg_alter function spip_pg_alter($query, $serveur = '', $requeter = true) { @@ -217,8 +240,9 @@ function spip_pg_alter($query, $serveur = '', $requeter = true) { // tout en cassant en deux alter distincts "ADD PRIMARY KEY (colA, colB), ADD INDEX (chose)"... // ou revoir l'api de sql_alter en creant un // sql_alter_table($table,array($actions)); - if (!preg_match("/\s*((\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)){ - spip_log("$query mal comprise", 'pg.'._LOG_ERREUR); + if (!preg_match("/\s*((\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)) { + spip_log("$query mal comprise", 'pg.' . _LOG_ERREUR); + return false; } $debut = $regs[1]; @@ -226,126 +250,142 @@ function spip_pg_alter($query, $serveur = '', $requeter = true) { $suite = $regs[4]; $todo = explode(',', $suite); // on remet les morceaux dechires ensembles... que c'est laid ! - $todo2 = array(); $i=0; + $todo2 = array(); + $i = 0; $ouverte = false; while ($do = array_shift($todo)) { $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do; - $o=(false!==strpos($do,"(")); - $f=(false!==strpos($do,")")); - if ($o AND !$f) $ouverte=true; - elseif ($f) $ouverte=false; - if (!$ouverte) $i++; + $o = (false !== strpos($do, "(")); + $f = (false !== strpos($do, ")")); + if ($o AND !$f) { + $ouverte = true; + } elseif ($f) { + $ouverte = false; + } + if (!$ouverte) { + $i++; + } } - $todo=$todo2; - $query = $debut.' '.array_shift($todo); + $todo = $todo2; + $query = $debut . ' ' . array_shift($todo); if (!preg_match('/^\s*(IGNORE\s*)?TABLE\s+(\w+)\s+(ADD|DROP|CHANGE|MODIFY|RENAME)\s*(.*)$/is', $query, $r)) { - spip_log("$query incompris", 'pg.'._LOG_ERREUR); + spip_log("$query incompris", 'pg.' . _LOG_ERREUR); } else { - if ($r[1]) spip_log("j'ignore IGNORE dans $query", 'pg.'._LOG_AVERTISSEMENT); - $f = 'spip_pg_alter_' . strtolower($r[3]); - if (function_exists($f)) - $f($r[2], $r[4], $serveur, $requeter); - else spip_log("$query non prevu", 'pg.'._LOG_ERREUR); + if ($r[1]) { + spip_log("j'ignore IGNORE dans $query", 'pg.' . _LOG_AVERTISSEMENT); + } + $f = 'spip_pg_alter_' . strtolower($r[3]); + if (function_exists($f)) { + $f($r[2], $r[4], $serveur, $requeter); + } else { + spip_log("$query non prevu", 'pg.' . _LOG_ERREUR); + } } // Alter a plusieurs args. Faudrait optimiser. - if ($todo) - spip_pg_alter("TABLE $table " . join(',',$todo)); + if ($todo) { + spip_pg_alter("TABLE $table " . join(',', $todo)); + } } - + // http://code.spip.net/@spip_pg_alter_change -function spip_pg_alter_change($table, $arg, $serveur = '', $requeter = true) -{ - if (!preg_match('/^`?(\w+)`?\s+`?(\w+)`?\s+(.*?)\s*(DEFAULT .*?)?(NOT\s+NULL)?\s*(DEFAULT .*?)?$/i',$arg, $r)) { - spip_log("alter change: $arg incompris", 'pg.'._LOG_ERREUR); +function spip_pg_alter_change($table, $arg, $serveur = '', $requeter = true) { + if (!preg_match('/^`?(\w+)`?\s+`?(\w+)`?\s+(.*?)\s*(DEFAULT .*?)?(NOT\s+NULL)?\s*(DEFAULT .*?)?$/i', $arg, $r)) { + spip_log("alter change: $arg incompris", 'pg.' . _LOG_ERREUR); } else { - list(,$old, $new, $type, $default, $null, $def2) = $r; - $actions = array("ALTER $old TYPE " . mysql2pg_type($type)); - if ($null) - $actions[]= "ALTER $old SET NOT NULL"; - else - $actions[]= "ALTER $old DROP NOT NULL"; + list(, $old, $new, $type, $default, $null, $def2) = $r; + $actions = array("ALTER $old TYPE " . mysql2pg_type($type)); + if ($null) { + $actions[] = "ALTER $old SET NOT NULL"; + } else { + $actions[] = "ALTER $old DROP NOT NULL"; + } - if ($d = ($default ? $default : $def2)) - $actions[]= "ALTER $old SET $d"; - else - $actions[]= "ALTER $old DROP DEFAULT"; + if ($d = ($default ? $default : $def2)) { + $actions[] = "ALTER $old SET $d"; + } else { + $actions[] = "ALTER $old DROP DEFAULT"; + } - spip_pg_query("ALTER TABLE $table " . join(', ', $actions)); + spip_pg_query("ALTER TABLE $table " . join(', ', $actions)); - if ($old != $new) - spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur); + if ($old != $new) { + spip_pg_query("ALTER TABLE $table RENAME $old TO $new", $serveur); + } } } // http://code.spip.net/@spip_pg_alter_add function spip_pg_alter_add($table, $arg, $serveur = '', $requeter = true) { if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*(.*)$/', $arg, $r)) { - spip_log("alter add $arg incompris", 'pg.'._LOG_ERREUR); - return NULL; + spip_log("alter add $arg incompris", 'pg.' . _LOG_ERREUR); + + return null; } - if (!$r[1] OR $r[1]=='COLUMN') { - preg_match('/`?(\w+)`?(.*)/',$r[2], $m); + if (!$r[1] OR $r[1] == 'COLUMN') { + preg_match('/`?(\w+)`?(.*)/', $r[2], $m); if (preg_match('/^(.*)(BEFORE|AFTER|FIRST)(.*)$/is', $m[2], $n)) { - $m[2]=$n[1]; + $m[2] = $n[1]; } - return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter); + + return spip_pg_query("ALTER TABLE $table ADD " . $m[1] . ' ' . mysql2pg_type($m[2]), $serveur, $requeter); } elseif ($r[1][0] == 'P') { // la primary peut etre sur plusieurs champs - $r[2] = trim(str_replace('`','',$r[2])); - $m = ($r[2][0]=='(') ? substr($r[2],1,-1) : $r[2]; - return spip_pg_query("ALTER TABLE $table ADD CONSTRAINT $table" .'_pkey PRIMARY KEY (' . $m . ')', $serveur, $requeter); + $r[2] = trim(str_replace('`', '', $r[2])); + $m = ($r[2][0] == '(') ? substr($r[2], 1, -1) : $r[2]; + + return spip_pg_query("ALTER TABLE $table ADD CONSTRAINT $table" . '_pkey PRIMARY KEY (' . $m . ')', $serveur, + $requeter); } else { - preg_match('/([^\s,]*)\s*(.*)?/',$r[2], $m); + preg_match('/([^\s,]*)\s*(.*)?/', $r[2], $m); // peut etre "(colonne)" ou "nom_index (colonnes)" // bug potentiel si qqn met "(colonne, colonne)" // // nom_index (colonnes) if ($m[2]) { - $colonnes = substr($m[2],1,-1); + $colonnes = substr($m[2], 1, -1); $nom_index = $m[1]; - } - else { + } else { // (colonne) if ($m[1][0] == "(") { - $colonnes = substr($m[1],1,-1); - if (false!==strpos(",",$colonnes)) { - spip_log(_LOG_GRAVITE_ERREUR,"PG : Erreur, impossible de creer un index sur plusieurs colonnes" - ." sans qu'il ait de nom ($table, ($colonnes))", 'pg'); + $colonnes = substr($m[1], 1, -1); + if (false !== strpos(",", $colonnes)) { + spip_log(_LOG_GRAVITE_ERREUR, "PG : Erreur, impossible de creer un index sur plusieurs colonnes" + . " sans qu'il ait de nom ($table, ($colonnes))", 'pg'); } else { $nom_index = $colonnes; } - } - // nom_index + } // nom_index else { $nom_index = $colonnes = $m[1]; } } + return spip_pg_create_index($nom_index, $table, $colonnes, $serveur, $requeter); } } // http://code.spip.net/@spip_pg_alter_drop function spip_pg_alter_drop($table, $arg, $serveur = '', $requeter = true) { - if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*`?(\w*)`?/', $arg, $r)) - spip_log("alter drop: $arg incompris", 'pg.'._LOG_ERREUR); - else { - if (!$r[1] OR $r[1]=='COLUMN') - return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur); - elseif ($r[1][0] == 'P') - return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur); - else { - return spip_pg_query("DROP INDEX " . $table . '_' . $r[2], $serveur); - } + if (!preg_match('/^(COLUMN|INDEX|KEY|PRIMARY\s+KEY|)\s*`?(\w*)`?/', $arg, $r)) { + spip_log("alter drop: $arg incompris", 'pg.' . _LOG_ERREUR); + } else { + if (!$r[1] OR $r[1] == 'COLUMN') { + return spip_pg_query("ALTER TABLE $table DROP " . $r[2], $serveur); + } elseif ($r[1][0] == 'P') { + return spip_pg_query("ALTER TABLE $table DROP CONSTRAINT $table" . '_pkey', $serveur); + } else { + return spip_pg_query("DROP INDEX " . $table . '_' . $r[2], $serveur); + } } } function spip_pg_alter_modify($table, $arg, $serveur = '', $requeter = true) { - if (!preg_match('/^`?(\w+)`?\s+(.*)$/',$arg, $r)) { - spip_log("alter modify: $arg incompris", 'pg.'._LOG_ERREUR); + if (!preg_match('/^`?(\w+)`?\s+(.*)$/', $arg, $r)) { + spip_log("alter modify: $arg incompris", 'pg.' . _LOG_ERREUR); } else { - return spip_pg_alter_change($table, $r[1].' '.$arg, $serveur='',$requeter=true); + return spip_pg_alter_change($table, $r[1] . ' ' . $arg, $serveur = '', $requeter = true); } } @@ -354,70 +394,84 @@ function spip_pg_alter_modify($table, $arg, $serveur = '', $requeter = true) { // - alter table A rename X to Y = changer le nom de la colonne X en Y // pour l'instant, traiter simplement RENAME TO X function spip_pg_alter_rename($table, $arg, $serveur = '', $requeter = true) { - $rename=""; + $rename = ""; // si TO, mais pas au debut - if (!stripos($arg,'TO ')){ - $rename=$arg; - } - elseif (preg_match('/^(TO)\s*`?(\w*)`?/', $arg, $r)) { - $rename=$r[2]; + if (!stripos($arg, 'TO ')) { + $rename = $arg; + } elseif (preg_match('/^(TO)\s*`?(\w*)`?/', $arg, $r)) { + $rename = $r[2]; } else { - spip_log("alter rename: $arg incompris", 'pg.'._LOG_ERREUR); + spip_log("alter rename: $arg incompris", 'pg.' . _LOG_ERREUR); } - return $rename?spip_pg_query("ALTER TABLE $table RENAME TO $rename"):false; + + return $rename ? spip_pg_query("ALTER TABLE $table RENAME TO $rename") : false; } /** * Fonction de creation d'un INDEX - * + * * @param string $nom : nom de l'index * @param string $table : table sql de l'index - * @param string/array $champs : liste de champs sur lesquels s'applique l'index + * @param string /array $champs : liste de champs sur lesquels s'applique l'index * @param string $serveur : nom de la connexion sql utilisee * @param bool $requeter : true pour executer la requete ou false pour retourner le texte de la requete - * + * * @return bool ou requete */ function spip_pg_create_index($nom, $table, $champs, $serveur = '', $requeter = true) { if (!($nom OR $table OR $champs)) { - spip_log("Champ manquant pour creer un index pg ($nom, $table, (".@join(',',$champs)."))",'pg.'._LOG_ERREUR); + spip_log("Champ manquant pour creer un index pg ($nom, $table, (" . @join(',', $champs) . "))", + 'pg.' . _LOG_ERREUR); + return false; } - - $nom = str_replace("`","",$nom); - $champs = str_replace("`","",$champs); - + + $nom = str_replace("`", "", $nom); + $champs = str_replace("`", "", $champs); + // PG ne differentie pas noms des index en fonction des tables // il faut donc creer des noms uniques d'index pour une base pg - $nom = $table.'_'.$nom; + $nom = $table . '_' . $nom; // enlever d'eventuelles parentheses deja presentes sur champs - if (!is_array($champs)){ - if ($champs[0]=="(") $champs = substr($champs,1,-1); - $champs = array($champs); + if (!is_array($champs)) { + if ($champs[0] == "(") { + $champs = substr($champs, 1, -1); + } + $champs = array($champs); + } + $query = "CREATE INDEX $nom ON $table (" . join(',', $champs) . ")"; + if (!$requeter) { + return $query; } - $query = "CREATE INDEX $nom ON $table (" . join(',',$champs) . ")"; - if (!$requeter) return $query; $res = spip_pg_query($query, $serveur, $requeter); + return $res; } // http://code.spip.net/@spip_pg_explain -function spip_pg_explain($query, $serveur = '', $requeter = true){ - if (strpos(ltrim($query), 'SELECT') !== 0) return array(); +function spip_pg_explain($query, $serveur = '', $requeter = true) { + if (strpos(ltrim($query), 'SELECT') !== 0) { + return array(); + } $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; if (preg_match('/\s(SET|VALUES|WHERE)\s/i', $query, $regs)) { $suite = strstr($query, $regs[0]); $query = substr($query, 0, -strlen($suite)); - } else $suite =''; - $query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1'.$prefixe.'_', $query) . $suite; + } else { + $suite = ''; + } + $query = 'EXPLAIN ' . preg_replace('/([,\s])spip_/', '\1' . $prefixe . '_', $query) . $suite; - if (!$requeter) return $query; - $r = spip_pg_query_simple($link,$query); - return spip_pg_fetch($r, NULL, $serveur); + if (!$requeter) { + return $query; + } + $r = spip_pg_query_simple($link, $query); + + return spip_pg_fetch($r, null, $serveur); } @@ -430,21 +484,23 @@ function spip_pg_explain($query, $serveur = '', $requeter = true){ * Nom du connecteur * @param bool $requeter * Inutilisé - * + * * @return bool|string * - Nom de la base en cas de succès. * - False en cas d'erreur. -**/ + **/ function spip_pg_selectdb($db, $serveur = '', $requeter = true) { // se connecter a la base indiquee // avec les identifiants connus $index = $serveur ? strtolower($serveur) : 0; - if ($link = spip_connect_db('', '', '', '', $db, 'pg', '', '')){ - if (($db==$link['db']) && $GLOBALS['connexions'][$index] = $link) + if ($link = spip_connect_db('', '', '', '', $db, 'pg', '', '')) { + if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) { return $db; - } else + } + } else { return false; + } } // Qu'une seule base pour le moment @@ -455,23 +511,32 @@ function spip_pg_listdbs($serveur) { $link = $connexion['link']; $dbs = array(); $res = spip_pg_query_simple($link, "select * From pg_database"); - while ($row = pg_fetch_array($res, NULL, PGSQL_NUM)) + while ($row = pg_fetch_array($res, null, PGSQL_NUM)) { $dbs[] = reset($row); + } return $dbs; } // http://code.spip.net/@spip_pg_select -function spip_pg_select($select, $from, $where = '', - $groupby=array(), $orderby='', $limit='', - $having='', $serveur='',$requeter=true){ +function spip_pg_select( + $select, + $from, + $where = '', + $groupby = array(), + $orderby = '', + $limit = '', + $having = '', + $serveur = '', + $requeter = true +) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; - $limit = preg_match("/^\s*(([0-9]+),)?\s*([0-9]+)\s*$/", $limit,$limatch); + $limit = preg_match("/^\s*(([0-9]+),)?\s*([0-9]+)\s*$/", $limit, $limatch); if ($limit) { $offset = $limatch[2]; $count = $limatch[3]; @@ -489,22 +554,27 @@ function spip_pg_select($select, $from, $where = '', $orderby = spip_pg_orderby($orderby, $select); if ($having) { - if (is_array($having)) - $having = join("\n\tAND ", array_map('calculer_pg_where', $having)); - } - $from = spip_pg_from($from, $prefixe); - $query = "SELECT ". $select - . (!$from ? '' : "\nFROM $from") - . (!$where ? '' : ("\nWHERE " . (!is_array($where) ? calculer_pg_where($where) : (join("\n\tAND ", array_map('calculer_pg_where', $where)))))) - . spip_pg_groupby($groupby, $from, $select) - . (!$having ? '' : "\nHAVING $having") - . ($orderby ? ("\nORDER BY $orderby") :'') - . (!$limit ? '' : (" LIMIT $count" . (!$offset ? '' : " OFFSET $offset"))); + if (is_array($having)) { + $having = join("\n\tAND ", array_map('calculer_pg_where', $having)); + } + } + $from = spip_pg_from($from, $prefixe); + $query = "SELECT " . $select + . (!$from ? '' : "\nFROM $from") + . (!$where ? '' : ("\nWHERE " . (!is_array($where) ? calculer_pg_where($where) : (join("\n\tAND ", + array_map('calculer_pg_where', $where)))))) + . spip_pg_groupby($groupby, $from, $select) + . (!$having ? '' : "\nHAVING $having") + . ($orderby ? ("\nORDER BY $orderby") : '') + . (!$limit ? '' : (" LIMIT $count" . (!$offset ? '' : " OFFSET $offset"))); // renvoyer la requete inerte si demandee - if ($requeter === false) return $query; - + if ($requeter === false) { + return $query; + } + $r = spip_pg_trace_query($query, $serveur); + return $r ? $r : $query;; } @@ -512,25 +582,29 @@ function spip_pg_select($select, $from, $where = '', // car le reste de la requete utilise les alias (AS) systematiquement // http://code.spip.net/@spip_pg_from -function spip_pg_from($from, $prefixe) -{ - if (is_array($from)) $from = spip_pg_select_as($from); - return !$prefixe ? $from : preg_replace('/(\b)spip_/','\1'.$prefixe.'_', $from); +function spip_pg_from($from, $prefixe) { + if (is_array($from)) { + $from = spip_pg_select_as($from); + } + + return !$prefixe ? $from : preg_replace('/(\b)spip_/', '\1' . $prefixe . '_', $from); } // http://code.spip.net/@spip_pg_orderby -function spip_pg_orderby($order, $select) -{ +function spip_pg_orderby($order, $select) { $res = array(); - $arg = (is_array($order) ? $order : preg_split('/\s*,\s*/',$order)); + $arg = (is_array($order) ? $order : preg_split('/\s*,\s*/', $order)); - foreach($arg as $v) { - if (preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v .'/', $select, $m)) { + foreach ($arg as $v) { + if (preg_match('/(case\s+.*?else\s+0\s+end)\s*AS\s+' . $v . '/', $select, $m)) { - $res[] = $m[1]; - } else $res[]=$v; + $res[] = $m[1]; + } else { + $res[] = $v; + } } - return spip_pg_frommysql(join(',',$res)); + + return spip_pg_frommysql(join(',', $res)); } // Conversion a l'arrach' des jointures MySQL en jointures PG @@ -538,49 +612,58 @@ function spip_pg_orderby($order, $select) // et pour enlever les repetitions (sans incidence de perf, mais ca fait sale) // http://code.spip.net/@spip_pg_groupby -function spip_pg_groupby($groupby, $from, $select) -{ +function spip_pg_groupby($groupby, $from, $select) { $join = strpos($from, ","); // ismplifier avant de decouper - if (is_string($select)) - // fct SQL sur colonne et constante apostrophee ==> la colonne - $select = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/','\\1', $select); + if (is_string($select)) // fct SQL sur colonne et constante apostrophee ==> la colonne + { + $select = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $select); + } - if ($join OR $groupby) $join = is_array($select) ? $select : explode(", ", $select); + if ($join OR $groupby) { + $join = is_array($select) ? $select : explode(", ", $select); + } if ($join) { // enlever les 0 as points, '', ... - foreach($join as $k=>$v){ - $v = str_replace('DISTINCT ','',$v); + foreach ($join as $k => $v) { + $v = str_replace('DISTINCT ', '', $v); // fct SQL sur colonne et constante apostrophee ==> la colonne - $v = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/','\\1', $v); - $v = preg_replace('/CAST\(\s*([^(),\' ]*\s+)as\s*\w+\)/','\\1', $v); + $v = preg_replace('/\w+\(\s*([^(),\']*),\s*\'[^\']*\'[^)]*\)/', '\\1', $v); + $v = preg_replace('/CAST\(\s*([^(),\' ]*\s+)as\s*\w+\)/', '\\1', $v); // resultat d'agregat ne sont pas a mettre dans le groupby - $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)(\s*AS\s+\w+)\s*,?/i','', $v); + $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)(\s*AS\s+\w+)\s*,?/i', '', $v); // idem sans AS (fetch numerique) - $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)\s*,?/i','', $v); + $v = preg_replace('/(SUM|COUNT|MAX|MIN|UPPER)\([^)]+\)\s*,?/i', '', $v); // des AS simples : on garde le cote droit du AS - $v = preg_replace('/^.*\sAS\s+(\w+)\s*$/i','\\1', $v); + $v = preg_replace('/^.*\sAS\s+(\w+)\s*$/i', '\\1', $v); // ne reste plus que les vrais colonnes, ou des constantes a virer - if (preg_match(',^[\'"],',$v) OR is_numeric($v)) + if (preg_match(',^[\'"],', $v) OR is_numeric($v)) { unset($join[$k]); - else + } else { $join[$k] = trim($v); + } } - $join = array_diff($join,array('')); - $join = implode(',',$join); + $join = array_diff($join, array('')); + $join = implode(',', $join); + } + if (is_array($groupby)) { + $groupby = join(',', $groupby); + } + if ($join) { + $groupby = $groupby ? "$groupby, $join" : $join; + } + if (!$groupby) { + return ''; } - if (is_array($groupby)) $groupby = join(',',$groupby); - if ($join) $groupby = $groupby ? "$groupby, $join" : $join; - if (!$groupby) return ''; $groupby = spip_pg_frommysql($groupby); // Ne pas mettre dans le Group-By des valeurs numeriques // issue de prepare_recherche - $groupby = preg_replace('/^\s*\d+\s+AS\s+\w+\s*,?\s*/i','', $groupby); - $groupby = preg_replace('/,\s*\d+\s+AS\s+\w+\s*/i','', $groupby); - $groupby = preg_replace('/\s+AS\s+\w+\s*/i','', $groupby); + $groupby = preg_replace('/^\s*\d+\s+AS\s+\w+\s*,?\s*/i', '', $groupby); + $groupby = preg_replace('/,\s*\d+\s+AS\s+\w+\s*/i', '', $groupby); + $groupby = preg_replace('/\s+AS\s+\w+\s*/i', '', $groupby); - return "\nGROUP BY $groupby"; + return "\nGROUP BY $groupby"; } // Conversion des operateurs MySQL en PG @@ -591,50 +674,51 @@ function spip_pg_groupby($groupby, $from, $select) // A ameliorer. // http://code.spip.net/@spip_pg_frommysql -function spip_pg_frommysql($arg) -{ - if (is_array($arg)) $arg = join(", ", $arg); +function spip_pg_frommysql($arg) { + if (is_array($arg)) { + $arg = join(", ", $arg); + } $res = spip_pg_fromfield($arg); - $res = preg_replace('/\brand[(][)]/i','random()', $res); + $res = preg_replace('/\brand[(][)]/i', 'random()', $res); $res = preg_replace('/\b0\.0[+]([a-zA-Z0-9_.]+)\s*/', - 'CAST(substring(\1, \'^ *[0-9.]+\') as float)', - $res); + 'CAST(substring(\1, \'^ *[0-9.]+\') as float)', + $res); $res = preg_replace('/\b0[+]([a-zA-Z0-9_.]+)\s*/', - 'CAST(substring(\1, \'^ *[0-9]+\') as int)', - $res); + 'CAST(substring(\1, \'^ *[0-9]+\') as int)', + $res); $res = preg_replace('/\bconv[(]([^,]*)[^)]*[)]/i', - 'CAST(substring(\1, \'^ *[0-9]+\') as int)', - $res); + 'CAST(substring(\1, \'^ *[0-9]+\') as int)', + $res); $res = preg_replace('/UNIX_TIMESTAMP\s*[(]\s*[)]/', - ' EXTRACT(epoch FROM NOW())', $res); - + ' EXTRACT(epoch FROM NOW())', $res); + // la fonction md5(integer) n'est pas connu en pg // il faut donc forcer les types en text (cas de md5(id_article)) $res = preg_replace('/md5\s*[(]([^)]*)[)]/i', - 'MD5(CAST(\1 AS text))', $res); + 'MD5(CAST(\1 AS text))', $res); $res = preg_replace('/UNIX_TIMESTAMP\s*[(]([^)]*)[)]/', - ' EXTRACT(epoch FROM \1)', $res); + ' EXTRACT(epoch FROM \1)', $res); $res = preg_replace('/\bDAYOFMONTH\s*[(]([^()]*([(][^()]*[)][^()]*)*[^)]*)[)]/', - ' EXTRACT(day FROM \1)', - $res); + ' EXTRACT(day FROM \1)', + $res); $res = preg_replace('/\bMONTH\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/', - ' EXTRACT(month FROM \1)', - $res); + ' EXTRACT(month FROM \1)', + $res); $res = preg_replace('/\bYEAR\s*[(]([^()]*([(][^)]*[)][^()]*)*[^)]*)[)]/', - ' EXTRACT(year FROM \1)', - $res); + ' EXTRACT(year FROM \1)', + $res); $res = preg_replace('/TO_DAYS\s*[(]([^()]*([(][^)]*[)][()]*)*)[)]/', - ' EXTRACT(day FROM \1 - \'0001-01-01\')', - $res); + ' EXTRACT(day FROM \1 - \'0001-01-01\')', + $res); $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)\"([^\"]*)\"/", '\1\'\2\'', $res); @@ -651,124 +735,147 @@ function spip_pg_frommysql($arg) $res = preg_replace('/([+<>-]=?)\s*(\'\d+-\d+-\d+\')/', '\1 timestamp \2', $res); $res = preg_replace('/(\'\d+-\d+-\d+\')\s*([+<>-]=?)/', 'timestamp \1 \2', $res); - $res = preg_replace('/(timestamp .\d+)-00-/','\1-01-', $res); - $res = preg_replace('/(timestamp .\d+-\d+)-00/','\1-01',$res); + $res = preg_replace('/(timestamp .\d+)-00-/', '\1-01-', $res); + $res = preg_replace('/(timestamp .\d+-\d+)-00/', '\1-01', $res); # correct en theorie mais produit des debordements arithmetiques # $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)(timestamp *'[^']*' *[+-] *timestamp *'[^']*') *[)]/", '\2', $res); $res = preg_replace("/(EXTRACT[(][^ ]* FROM *)('[^']*')/", '\1 timestamp \2', $res); $res = preg_replace("/\sLIKE\s+/", ' ILIKE ', $res); + return str_replace('REGEXP', '~', $res); } // http://code.spip.net/@spip_pg_fromfield -function spip_pg_fromfield($arg) -{ - while(preg_match('/^(.*?)FIELD\s*\(([^,]*)((,[^,)]*)*)\)/', $arg, $m)) { +function spip_pg_fromfield($arg) { + while (preg_match('/^(.*?)FIELD\s*\(([^,]*)((,[^,)]*)*)\)/', $arg, $m)) { preg_match_all('/,([^,]*)/', $m[3], $r, PREG_PATTERN_ORDER); $res = ''; - $n=0; + $n = 0; $index = $m[2]; - foreach($r[1] as $v) { + foreach ($r[1] as $v) { $n++; $res .= "\nwhen $index=$v then $n"; } $arg = $m[1] . "case $res else 0 end " - . substr($arg,strlen($m[0])); + . substr($arg, strlen($m[0])); } + return $arg; } // http://code.spip.net/@calculer_pg_where -function calculer_pg_where($v) -{ - if (!is_array($v)) +function calculer_pg_where($v) { + if (!is_array($v)) { return spip_pg_frommysql($v); + } $op = str_replace('REGEXP', '~', array_shift($v)); - if (!($n=count($v))) + if (!($n = count($v))) { return $op; - else { + } else { $arg = calculer_pg_where(array_shift($v)); - if ($n==1) { - return "$op($arg)"; + if ($n == 1) { + return "$op($arg)"; } else { $arg2 = calculer_pg_where(array_shift($v)); - if ($n==2) { + if ($n == 2) { return "($arg $op $arg2)"; - } else return "($arg $op ($arg2) : $v[0])"; + } else { + return "($arg $op ($arg2) : $v[0])"; + } } } } // http://code.spip.net/@calculer_pg_expression -function calculer_pg_expression($expression, $v, $join = 'AND'){ - if (empty($v)) +function calculer_pg_expression($expression, $v, $join = 'AND') { + if (empty($v)) { return ''; - + } + $exp = "\n$expression "; - - if (!is_array($v)) $v = array($v); - - if (strtoupper($join) === 'AND') - return $exp . join("\n\t$join ", array_map('calculer_pg_where', $v)); - else - return $exp . join($join, $v); + + if (!is_array($v)) { + $v = array($v); + } + + if (strtoupper($join) === 'AND') { + return $exp . join("\n\t$join ", array_map('calculer_pg_where', $v)); + } else { + return $exp . join($join, $v); + } } // http://code.spip.net/@spip_pg_select_as -function spip_pg_select_as($args) -{ +function spip_pg_select_as($args) { $argsas = ""; - foreach($args as $k => $v) { - if (substr($k,-1)=='@') { + foreach ($args as $k => $v) { + if (substr($k, -1) == '@') { // c'est une jointure qui se refere au from precedent // pas de virgule - $argsas .= ' ' . $v ; - } - else { + $argsas .= ' ' . $v; + } else { $as = ''; // spip_log("$k : $v", _LOG_DEBUG); if (!is_numeric($k)) { - if (preg_match('/\.(.*)$/', $k, $r)) + if (preg_match('/\.(.*)$/', $k, $r)) { $v = $k; - elseif ($v != $k) { + } elseif ($v != $k) { $p = strpos($v, " "); - if ($p) - $v = substr($v,0,$p) . " AS $k" . substr($v,$p); - else $as = " AS $k"; + if ($p) { + $v = substr($v, 0, $p) . " AS $k" . substr($v, $p); + } else { + $as = " AS $k"; + } } } // spip_log("subs $k : $v avec $as", _LOG_DEBUG); // if (strpos($v, 'JOIN') === false) $argsas .= ', '; - $argsas .= ', '. $v . $as; + $argsas .= ', ' . $v . $as; } } - return substr($argsas,2); + + return substr($argsas, 2); } // http://code.spip.net/@spip_pg_fetch function spip_pg_fetch($res, $t = '', $serveur = '', $requeter = true) { - if ($res) $res = pg_fetch_array($res, NULL, PGSQL_ASSOC); + if ($res) { + $res = pg_fetch_array($res, null, PGSQL_ASSOC); + } + return $res; } function spip_pg_seek($r, $row_number, $serveur = '', $requeter = true) { - if ($r) return pg_result_seek($r,$row_number); + if ($r) { + return pg_result_seek($r, $row_number); + } } // http://code.spip.net/@spip_pg_countsel -function spip_pg_countsel($from = array(), $where = array(), $groupby = array(), - $having = array(), $serveur='',$requeter=true) -{ +function spip_pg_countsel( + $from = array(), + $where = array(), + $groupby = array(), + $having = array(), + $serveur = '', + $requeter = true +) { $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby))); - $r = spip_pg_select("COUNT($c)", $from, $where,'', '', '', $having, $serveur, $requeter); - if (!$requeter) return $r; - if (!is_resource($r)) return 0; - list($c) = pg_fetch_array($r, NULL, PGSQL_NUM); + $r = spip_pg_select("COUNT($c)", $from, $where, '', '', '', $having, $serveur, $requeter); + if (!$requeter) { + return $r; + } + if (!is_resource($r)) { + return 0; + } + list($c) = pg_fetch_array($r, null, PGSQL_NUM); + return $c; } @@ -776,10 +883,10 @@ function spip_pg_countsel($from = array(), $where = array(), $groupby = array(), function spip_pg_count($res, $serveur = '', $requeter = true) { return !$res ? 0 : pg_numrows($res); } - + // http://code.spip.net/@spip_pg_free function spip_pg_free($res, $serveur = '', $requeter = true) { - // rien a faire en postgres + // rien a faire en postgres } // http://code.spip.net/@spip_pg_delete @@ -789,19 +896,24 @@ function spip_pg_delete($table, $where = '', $serveur = '', $requeter = true) { $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; - if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table); - + if ($prefixe) { + $table = preg_replace('/^spip/', $prefixe, $table); + } + $query = calculer_pg_expression('DELETE FROM', $table, ',') - . calculer_pg_expression('WHERE', $where, 'AND'); - + . calculer_pg_expression('WHERE', $where, 'AND'); + // renvoyer la requete inerte si demandee - if (!$requeter) return $query; - + if (!$requeter) { + return $query; + } + $res = spip_pg_trace_query($query, $serveur); - if ($res) + if ($res) { return pg_affected_rows($res); - else + } else { return false; + } } // http://code.spip.net/@spip_pg_insert @@ -811,13 +923,16 @@ function spip_pg_insert($table, $champs, $valeurs, $desc = array(), $serveur = ' $link = $connexion['link']; $db = $connexion['db']; - if (!$desc) $desc = description_table($table, $serveur); - $seq = spip_pg_sequence($table,true); + if (!$desc) { + $desc = description_table($table, $serveur); + } + $seq = spip_pg_sequence($table, true); // si pas de cle primaire dans l'insertion, renvoyer curval - if (!preg_match(",\b$seq\b,",$champs)){ + if (!preg_match(",\b$seq\b,", $champs)) { $seq = spip_pg_sequence($table); - if ($prefixe) + if ($prefixe) { $seq = preg_replace('/^spip/', $prefixe, $seq); + } $seq = "currval('$seq')"; } @@ -826,95 +941,115 @@ function spip_pg_insert($table, $champs, $valeurs, $desc = array(), $serveur = ' $table = preg_replace('/^spip/', $prefixe, $table); } $ret = !$seq ? '' : (" RETURNING $seq"); - $ins = (strlen($champs)<3) - ? " DEFAULT VALUES" - : "$champs VALUES $valeurs"; - $q ="INSERT INTO $table $ins $ret"; - if (!$requeter) return $q; + $ins = (strlen($champs) < 3) + ? " DEFAULT VALUES" + : "$champs VALUES $valeurs"; + $q = "INSERT INTO $table $ins $ret"; + if (!$requeter) { + return $q; + } $connexion['last'] = $q; $r = spip_pg_query_simple($link, $q); # spip_log($q,'pg.'._LOG_DEBUG); if ($r) { - if (!$ret) return 0; - if ($r2 = pg_fetch_array($r, NULL, PGSQL_NUM)) + if (!$ret) { + return 0; + } + if ($r2 = pg_fetch_array($r, null, PGSQL_NUM)) { return $r2[0]; + } } + return false; } // http://code.spip.net/@spip_pg_insertq function spip_pg_insertq($table, $couples = array(), $desc = array(), $serveur = '', $requeter = true) { - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) die("$table insertion sans description"); - $fields = $desc['field']; - + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + die("$table insertion sans description"); + } + $fields = $desc['field']; + foreach ($couples as $champ => $val) { - $couples[$champ]= spip_pg_cite($val, $fields[$champ]); + $couples[$champ] = spip_pg_cite($val, $fields[$champ]); } // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur); - - return spip_pg_insert($table, "(".join(',',array_keys($couples)).")", "(".join(',', $couples).")", $desc, $serveur, $requeter); -} + return spip_pg_insert($table, "(" . join(',', array_keys($couples)) . ")", "(" . join(',', $couples) . ")", $desc, + $serveur, $requeter); +} // http://code.spip.net/@spip_pg_insertq_multi function spip_pg_insertq_multi($table, $tab_couples = array(), $desc = array(), $serveur = '', $requeter = true) { - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) die("$table insertion sans description"); - $fields = isset($desc['field'])?$desc['field']:array(); - + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + die("$table insertion sans description"); + } + $fields = isset($desc['field']) ? $desc['field'] : array(); + // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci // une premiere fois pour ajouter maj dans les cles $c = isset($tab_couples[0]) ? $tab_couples[0] : array(); $les_cles = spip_pg_ajouter_champs_timestamp($table, $c, $desc, $serveur); - - $cles = "(" . join(',',array_keys($les_cles)). ')'; + + $cles = "(" . join(',', array_keys($les_cles)) . ')'; $valeurs = array(); foreach ($tab_couples as $couples) { - foreach ($couples as $champ => $val){ - $couples[$champ]= spip_pg_cite($val, $fields[$champ]); + foreach ($couples as $champ => $val) { + $couples[$champ] = spip_pg_cite($val, $fields[$champ]); } // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur); - - $valeurs[] = '(' .join(',', $couples) . ')'; + + $valeurs[] = '(' . join(',', $couples) . ')'; } - $valeurs = implode(', ',$valeurs); - - return spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter); + $valeurs = implode(', ', $valeurs); + + return spip_pg_insert($table, $cles, $valeurs, $desc, $serveur, $requeter); } // http://code.spip.net/@spip_pg_update function spip_pg_update($table, $couples, $where = '', $desc = '', $serveur = '', $requeter = true) { - if (!$couples) return; + if (!$couples) { + return; + } $connexion = $GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; - if ($prefixe) $table = preg_replace('/^spip/', $prefixe, $table); + if ($prefixe) { + $table = preg_replace('/^spip/', $prefixe, $table); + } // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $couples = spip_pg_ajouter_champs_timestamp($table, $couples, $desc, $serveur); $set = array(); foreach ($couples as $champ => $val) { - $set[] = $champ . '=' . $val; + $set[] = $champ . '=' . $val; } $query = calculer_pg_expression('UPDATE', $table, ',') . calculer_pg_expression('SET', $set, ',') . calculer_pg_expression('WHERE', $where, 'AND'); - + // renvoyer la requete inerte si demandee - if (!$requeter) return $query; - + if (!$requeter) { + return $query; + } + return spip_pg_trace_query($query, $serveur); } @@ -922,8 +1057,12 @@ function spip_pg_update($table, $couples, $where = '', $desc = '', $serveur = '' // sauf les expressions de date lorsqu'il s'agit de fonctions SQL (NOW etc) // http://code.spip.net/@spip_pg_updateq function spip_pg_updateq($table, $couples, $where = '', $desc = array(), $serveur = '', $requeter = true) { - if (!$couples) return; - if (!$desc) $desc = description_table($table, $serveur); + if (!$couples) { + return; + } + if (!$desc) { + $desc = description_table($table, $serveur); + } $fields = $desc['field']; foreach ($couples as $k => $val) { $couples[$k] = spip_pg_cite($val, $fields[$k]); @@ -935,31 +1074,42 @@ function spip_pg_updateq($table, $couples, $where = '', $desc = array(), $serveu // http://code.spip.net/@spip_pg_replace function spip_pg_replace($table, $values, $desc, $serveur = '', $requeter = true) { - if (!$values) {spip_log("replace vide $table",'pg.'._LOG_AVERTISSEMENT); return 0;} + if (!$values) { + spip_log("replace vide $table", 'pg.' . _LOG_AVERTISSEMENT); + + return 0; + } $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) die("$table insertion sans description"); + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + die("$table insertion sans description"); + } $prim = $desc['key']['PRIMARY KEY']; $ids = preg_split('/,\s*/', $prim); $noprims = $prims = array(); - foreach($values as $k=>$v) { + foreach ($values as $k => $v) { $values[$k] = $v = spip_pg_cite($v, $desc['field'][$k]); - if (!in_array($k, $ids)) - $noprims[$k]= "$k=$v"; - else $prims[$k]= "$k=$v"; + if (!in_array($k, $ids)) { + $noprims[$k] = "$k=$v"; + } else { + $prims[$k] = "$k=$v"; + } } // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $values = spip_pg_ajouter_champs_timestamp($table, $values, $desc, $serveur); - + $where = join(' AND ', $prims); if (!$where) { - return spip_pg_insert($table, "(".join(',',array_keys($values)).")", "(".join(',', $values).")", $desc, $serveur); + return spip_pg_insert($table, "(" . join(',', array_keys($values)) . ")", "(" . join(',', $values) . ")", $desc, + $serveur); } $couples = join(',', $noprims); @@ -971,27 +1121,30 @@ function spip_pg_replace($table, $values, $desc, $serveur = '', $requeter = true $connexion['last'] = $q = "UPDATE $table SET $couples WHERE $where"; if ($couples) { - $couples = spip_pg_query_simple($link, $q); + $couples = spip_pg_query_simple($link, $q); # spip_log($q,'pg.'._LOG_DEBUG); - if (!$couples) return false; - $couples = pg_affected_rows($couples); + if (!$couples) { + return false; + } + $couples = pg_affected_rows($couples); } if (!$couples) { $ret = !$seq ? '' : - (" RETURNING nextval('$seq') < $prim"); - $connexion['last'] = $q = "INSERT INTO $table (" . join(',',array_keys($values)) . ') VALUES (' .join(',', $values) . ")$ret"; + (" RETURNING nextval('$seq') < $prim"); + $connexion['last'] = $q = "INSERT INTO $table (" . join(',', array_keys($values)) . ') VALUES (' . join(',', + $values) . ")$ret"; $couples = spip_pg_query_simple($link, $q); - if (!$couples) { - return false; - } elseif ($ret) { - $r = pg_fetch_array($couples, NULL, PGSQL_NUM); - if ($r[0]) { - $connexion['last'] = $q = "SELECT setval('$seq', $prim) from $table"; - // Le code de SPIP met parfois la sequence a 0 (dans l'import) - // MySQL n'en dit rien, on fait pareil pour PG - $r = @pg_query($link, $q); - } - } + if (!$couples) { + return false; + } elseif ($ret) { + $r = pg_fetch_array($couples, null, PGSQL_NUM); + if ($r[0]) { + $connexion['last'] = $q = "SELECT setval('$seq', $prim) from $table"; + // Le code de SPIP met parfois la sequence a 0 (dans l'import) + // MySQL n'en dit rien, on fait pareil pour PG + $r = @pg_query($link, $q); + } + } } return $couples; @@ -1001,84 +1154,93 @@ function spip_pg_replace($table, $values, $desc, $serveur = '', $requeter = true // http://code.spip.net/@spip_pg_replace_multi function spip_pg_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $requeter = true) { // boucler pour traiter chaque requete independemment - foreach ($tab_couples as $couples){ - $retour = spip_pg_replace($table, $couples, $desc, $serveur,$requeter); + foreach ($tab_couples as $couples) { + $retour = spip_pg_replace($table, $couples, $desc, $serveur, $requeter); } - // renvoie le dernier id - return $retour; -} + // renvoie le dernier id + return $retour; +} -// Donne la sequence eventuelle associee a une table +// Donne la sequence eventuelle associee a une table // Pas extensible pour le moment, // http://code.spip.net/@spip_pg_sequence -function spip_pg_sequence($table, $raw = false) -{ +function spip_pg_sequence($table, $raw = false) { include_spip('base/serial'); - if (!isset($GLOBALS['tables_principales'][$table])) return false; + if (!isset($GLOBALS['tables_principales'][$table])) { + return false; + } $desc = $GLOBALS['tables_principales'][$table]; $prim = @$desc['key']['PRIMARY KEY']; if (!preg_match('/^\w+$/', $prim) - OR strpos($desc['field'][$prim], 'int') === false) + OR strpos($desc['field'][$prim], 'int') === false + ) { return ''; - else { return $raw?$prim:$table . '_' . $prim . "_seq";} + } else { + return $raw ? $prim : $table . '_' . $prim . "_seq"; + } } // Explicite les conversions de Mysql d'une valeur $v de type $t // Dans le cas d'un champ date, pas d'apostrophe, c'est une syntaxe ad hoc // http://code.spip.net/@spip_pg_cite -function spip_pg_cite($v, $t){ - if(is_null($v)) return 'NULL'; // null php se traduit en NULL SQL +function spip_pg_cite($v, $t) { + if (is_null($v)) { + return 'NULL'; + } // null php se traduit en NULL SQL if (sql_test_date($t)) { - if ($v AND (strpos("0123456789", $v[0]) === false)) + if ($v AND (strpos("0123456789", $v[0]) === false)) { return spip_pg_frommysql($v); - else { - if (strncmp($v,'0000',4)==0) - $v = "0001" . substr($v,4); - if (strpos($v, "-00-00") === 4) - $v = substr($v,0,4)."-01-01".substr($v,10); + } else { + if (strncmp($v, '0000', 4) == 0) { + $v = "0001" . substr($v, 4); + } + if (strpos($v, "-00-00") === 4) { + $v = substr($v, 0, 4) . "-01-01" . substr($v, 10); + } + return "timestamp '$v'"; } - } - elseif (!sql_test_int($t)) - return ("'" . pg_escape_string($v) . "'"); - elseif (is_numeric($v) OR (strpos($v, 'CAST(') === 0)) + } elseif (!sql_test_int($t)) { + return ("'" . pg_escape_string($v) . "'"); + } elseif (is_numeric($v) OR (strpos($v, 'CAST(') === 0)) { return $v; - elseif ($v[0]== '0' AND $v[1]!=='x' AND ctype_xdigit(substr($v,1))) - return substr($v,1); - else { - spip_log("Warning: '$v' n'est pas de type $t", 'pg.'._LOG_AVERTISSEMENT); + } elseif ($v[0] == '0' AND $v[1] !== 'x' AND ctype_xdigit(substr($v, 1))) { + return substr($v, 1); + } else { + spip_log("Warning: '$v' n'est pas de type $t", 'pg.' . _LOG_AVERTISSEMENT); + return intval($v); } } // http://code.spip.net/@spip_pg_hex -function spip_pg_hex($v) -{ +function spip_pg_hex($v) { return "CAST(x'" . $v . "' as bigint)"; } -function spip_pg_quote($v, $type = '') -{ - if (!is_array($v)) - return spip_pg_cite($v,$type); +function spip_pg_quote($v, $type = '') { + if (!is_array($v)) { + return spip_pg_cite($v, $type); + } // si c'est un tableau, le parcourir en propageant le type - foreach($v as $k=>$r) + foreach ($v as $k => $r) { $v[$k] = spip_pg_quote($r, $type); + } + return join(",", $v); } -function spip_pg_date_proche($champ, $interval, $unite) -{ +function spip_pg_date_proche($champ, $interval, $unite) { return '(' . $champ - . (($interval <= 0) ? '>' : '<') - . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD') + . (($interval <= 0) ? '>' : '<') + . (($interval <= 0) ? 'DATE_SUB' : 'DATE_ADD') . '(' . sql_quote(date('Y-m-d H:i:s')) . ', INTERVAL ' @@ -1094,17 +1256,20 @@ function spip_pg_in($val, $valeurs, $not = '', $serveur) { // IN (...) souvent limite a 255 elements, d'ou cette fonction assistante // // s'il n'y a pas de valeur, eviter de produire un IN vide: PG rale. - if (!$valeurs) return $not ? '0=0' : '0=1'; - if (strpos($valeurs, "CAST(x'") !== false) - return "($val=" . join("OR $val=", explode(',',$valeurs)).')'; + if (!$valeurs) { + return $not ? '0=0' : '0=1'; + } + if (strpos($valeurs, "CAST(x'") !== false) { + return "($val=" . join("OR $val=", explode(',', $valeurs)) . ')'; + } $n = $i = 0; - $in_sql =""; + $in_sql = ""; while ($n = strpos($valeurs, ',', $n+1)) { - if ((++$i) >= 255) { + if ((++$i) >= 255) { $in_sql .= "($val $not IN (" . - substr($valeurs, 0, $n) . - "))\n" . - ($not ? "AND\t" : "OR\t"); + substr($valeurs, 0, $n) . + "))\n" . + ($not ? "AND\t" : "OR\t"); $valeurs = substr($valeurs, $n+1); $i = $n = 0; } @@ -1120,36 +1285,43 @@ function spip_pg_error($query = '', $serveur, $requeter = true) { $s = $link ? pg_last_error($link) : pg_last_error(); if ($s) { $s = str_replace('ERROR', 'errcode: 1000 ', $s); - spip_log("$s - $query", 'pg.'._LOG_ERREUR); + spip_log("$s - $query", 'pg.' . _LOG_ERREUR); } + return $s; } // http://code.spip.net/@spip_pg_errno function spip_pg_errno($serveur = '') { - // il faudrait avoir la derniere ressource retournee et utiliser - // http://fr2.php.net/manual/fr/function.pg-result-error.php + // il faudrait avoir la derniere ressource retournee et utiliser + // http://fr2.php.net/manual/fr/function.pg-result-error.php return 0; } // http://code.spip.net/@spip_pg_drop_table -function spip_pg_drop_table($table, $exist = '', $serveur = '', $requeter = true) -{ - if ($exist) $exist =" IF EXISTS"; - if (spip_pg_query("DROP TABLE$exist $table", $serveur, $requeter)) +function spip_pg_drop_table($table, $exist = '', $serveur = '', $requeter = true) { + if ($exist) { + $exist = " IF EXISTS"; + } + if (spip_pg_query("DROP TABLE$exist $table", $serveur, $requeter)) { return true; - else return false; + } else { + return false; + } } // supprime une vue // http://code.spip.net/@spip_pg_drop_view function spip_pg_drop_view($view, $exist = '', $serveur = '', $requeter = true) { - if ($exist) $exist =" IF EXISTS"; + if ($exist) { + $exist = " IF EXISTS"; + } + return spip_pg_query("DROP VIEW$exist $view", $serveur, $requeter); } /** - * Retourne une ressource de la liste des tables de la base de données + * Retourne une ressource de la liste des tables de la base de données * * @param string $match * Filtre sur tables à récupérer @@ -1160,37 +1332,38 @@ function spip_pg_drop_view($view, $exist = '', $serveur = '', $requeter = true) * false pour retourner le texte de la requête. * @return ressource * Ressource à utiliser avec sql_fetch() -**/ -function spip_pg_showbase($match, $serveur = '', $requeter = true) -{ + **/ +function spip_pg_showbase($match, $serveur = '', $requeter = true) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $link = $connexion['link']; - $connexion['last'] = $q = "SELECT tablename FROM pg_tables WHERE tablename ILIKE "._q($match); + $connexion['last'] = $q = "SELECT tablename FROM pg_tables WHERE tablename ILIKE " . _q($match); + return spip_pg_query_simple($link, $q); } // http://code.spip.net/@spip_pg_showtable -function spip_pg_showtable($nom_table, $serveur = '', $requeter = true) -{ +function spip_pg_showtable($nom_table, $serveur = '', $requeter = true) { $connexion = &$GLOBALS['connexions'][$serveur ? strtolower($serveur) : 0]; $link = $connexion['link']; $connexion['last'] = $q = "SELECT column_name, column_default, data_type FROM information_schema.columns WHERE table_name ILIKE " . _q($nom_table); $res = spip_pg_query_simple($link, $q); - if (!$res) return false; - + if (!$res) { + return false; + } + // etrangement, $res peut ne rien contenir, mais arriver ici... // il faut en tenir compte dans le return $fields = array(); - while($field = pg_fetch_array($res, NULL, PGSQL_NUM)) { + while ($field = pg_fetch_array($res, null, PGSQL_NUM)) { $fields[$field[0]] = $field[2] . (!$field[1] ? '' : (" DEFAULT " . $field[1])); } $connexion['last'] = $q = "SELECT indexdef FROM pg_indexes WHERE tablename ILIKE " . _q($nom_table); $res = spip_pg_query_simple($link, $q); $keys = array(); - while($index = pg_fetch_array($res, NULL, PGSQL_NUM)) { - if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0],$r)) { - $nom = str_replace($nom_table.'_','',$r[2]); + while ($index = pg_fetch_array($res, null, PGSQL_NUM)) { + if (preg_match('/CREATE\s+(UNIQUE\s+)?INDEX\s([^\s]+).*\((.*)\)$/', $index[0], $r)) { + $nom = str_replace($nom_table . '_', '', $r[2]); $keys[($r[1] ? "PRIMARY KEY" : ("KEY " . $nom))] = $r[3]; } } @@ -1211,100 +1384,117 @@ function spip_pg_create($nom, $champs, $cles, $autoinc = false, $temporary = fal $prefixe = $connexion['prefixe']; $link = $connexion['link']; $db = $connexion['db']; - if ($prefixe) $nom = preg_replace('/^spip/', $prefixe, $nom); - $query = $prim = $prim_name = $v = $s = $p=''; + if ($prefixe) { + $nom = preg_replace('/^spip/', $prefixe, $nom); + } + $query = $prim = $prim_name = $v = $s = $p = ''; $keys = array(); // certains plugins declarent les tables (permet leur inclusion dans le dump) // sans les renseigner (laisse le compilo recuperer la description) - if (!is_array($champs) || !is_array($cles)) + if (!is_array($champs) || !is_array($cles)) { return; + } - foreach($cles as $k => $v) { + foreach ($cles as $k => $v) { if (strpos($k, "KEY ") === 0) { - $n = str_replace('`','',$k); - $v = str_replace('`','"',$v); - $i = $nom . preg_replace("/KEY +/", '_',$n); - if ($k != $n) $i = "\"$i\""; - $keys[] = "CREATE INDEX $i ON $nom ($v);"; - } - elseif (strpos($k, "UNIQUE ") === 0) { - $k = preg_replace("/^UNIQUE +/", '',$k); - $prim .= "$s\n\t\tCONSTRAINT " . str_replace('`','"',$k) ." UNIQUE ($v)"; - } - else { - $prim .= "$s\n\t\t" . str_replace('`','"',$k) ." ($v)"; + $n = str_replace('`', '', $k); + $v = str_replace('`', '"', $v); + $i = $nom . preg_replace("/KEY +/", '_', $n); + if ($k != $n) { + $i = "\"$i\""; + } + $keys[] = "CREATE INDEX $i ON $nom ($v);"; + } elseif (strpos($k, "UNIQUE ") === 0) { + $k = preg_replace("/^UNIQUE +/", '', $k); + $prim .= "$s\n\t\tCONSTRAINT " . str_replace('`', '"', $k) . " UNIQUE ($v)"; + } else { + $prim .= "$s\n\t\t" . str_replace('`', '"', $k) . " ($v)"; } - if ($k == "PRIMARY KEY") + if ($k == "PRIMARY KEY") { $prim_name = $v; + } $s = ","; } $s = ''; - + $character_set = ""; - if (@$GLOBALS['meta']['charset_sql_base']) - $character_set .= " CHARACTER SET ".$GLOBALS['meta']['charset_sql_base']; - if (@$GLOBALS['meta']['charset_collation_sql_base']) - $character_set .= " COLLATE ".$GLOBALS['meta']['charset_collation_sql_base']; - - foreach($champs as $k => $v) { - $k = str_replace('`','"',$k); - if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i',$v,$defs)){ - if (preg_match(',(char|text),i',$defs[1]) AND !preg_match(',binary,i',$defs[1]) ){ - $v = $defs[1] . $character_set . ' ' . substr($v,strlen($defs[1])); + if (@$GLOBALS['meta']['charset_sql_base']) { + $character_set .= " CHARACTER SET " . $GLOBALS['meta']['charset_sql_base']; + } + if (@$GLOBALS['meta']['charset_collation_sql_base']) { + $character_set .= " COLLATE " . $GLOBALS['meta']['charset_collation_sql_base']; + } + + foreach ($champs as $k => $v) { + $k = str_replace('`', '"', $k); + if (preg_match(',([a-z]*\s*(\(\s*[0-9]*\s*\))?(\s*binary)?),i', $v, $defs)) { + if (preg_match(',(char|text),i', $defs[1]) AND !preg_match(',binary,i', $defs[1])) { + $v = $defs[1] . $character_set . ' ' . substr($v, strlen($defs[1])); } } $query .= "$s\n\t\t$k " . (($autoinc && ($prim_name == $k) && preg_match(',\b(big|small|medium|tiny)?int\b,i', $v)) ? " bigserial" - : mysql2pg_type($v) + : mysql2pg_type($v) ); $s = ","; } - $temporary = $temporary ? 'TEMPORARY':''; + $temporary = $temporary ? 'TEMPORARY' : ''; // En l'absence de "if not exists" en PG, on neutralise les erreurs - $q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ")". - ($character_set?" DEFAULT $character_set":"") - ."\n"; + $q = "CREATE $temporary TABLE $nom ($query" . ($prim ? ",$prim" : '') . ")" . + ($character_set ? " DEFAULT $character_set" : "") + . "\n"; - if (!$requeter) return $q; + if (!$requeter) { + return $q; + } $connexion['last'] = $q; $r = @pg_query($link, $q); - if (!$r) - spip_log("Impossible de creer cette table: $q",'pg.'._LOG_ERREUR); - else { - foreach($keys as $index) {pg_query($link, $index);} - } + if (!$r) { + spip_log("Impossible de creer cette table: $q", 'pg.' . _LOG_ERREUR); + } else { + foreach ($keys as $index) { + pg_query($link, $index); + } + } + return $r; } function spip_pg_create_base($nom, $serveur = '', $requeter = true) { - return spip_pg_query("CREATE DATABASE $nom", $serveur, $requeter); + return spip_pg_query("CREATE DATABASE $nom", $serveur, $requeter); } // Fonction de creation d'une vue SQL nommee $nom // http://code.spip.net/@spip_pg_create_view function spip_pg_create_view($nom, $query_select, $serveur = '', $requeter = true) { - if (!$query_select) return false; + if (!$query_select) { + return false; + } // vue deja presente if (sql_showtable($nom, false, $serveur)) { - if ($requeter) spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)",'pg.'._LOG_ERREUR); + if ($requeter) { + spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", 'pg.' . _LOG_ERREUR); + } + return false; } - - $query = "CREATE VIEW $nom AS ". $query_select; + + $query = "CREATE VIEW $nom AS " . $query_select; + return spip_pg_query($query, $serveur, $requeter); } // http://code.spip.net/@spip_pg_set_connect_charset -function spip_pg_set_connect_charset($charset, $serveur = '', $requeter = true){ - spip_log("changement de charset sql a ecrire en PG",'pg.'._LOG_ERREUR); +function spip_pg_set_connect_charset($charset, $serveur = '', $requeter = true) { + spip_log("changement de charset sql a ecrire en PG", 'pg.' . _LOG_ERREUR); } @@ -1315,22 +1505,23 @@ function spip_pg_set_connect_charset($charset, $serveur = '', $requeter = true){ * @param $serveur nom de la connexion * @param $requeter effectuer la requete ? sinon retourner son code * @return bool|string true / false / requete -**/ + **/ // http://code.spip.net/@spip_sqlite_optimize -function spip_pg_optimize($table, $serveur = '', $requeter = true){ - return spip_pg_query("VACUUM ". $table, $serveur, $requeter); +function spip_pg_optimize($table, $serveur = '', $requeter = true) { + return spip_pg_query("VACUUM " . $table, $serveur, $requeter); } // Selectionner la sous-chaine dans $objet // correspondant a $lang. Cf balise Multi de Spip // http://code.spip.net/@spip_pg_multi -function spip_pg_multi ($objet, $lang) { +function spip_pg_multi($objet, $lang) { $r = "regexp_replace(" - . $objet - . ",'<multi>.*[[]" - . $lang - . "[]]([^[]*).*</multi>', E'\\\\1') AS multi"; + . $objet + . ",'<multi>.*[[]" + . $lang + . "[]]([^[]*).*</multi>', E'\\\\1') AS multi"; + return $r; } @@ -1338,19 +1529,19 @@ function spip_pg_multi ($objet, $lang) { // A completer par les autres, mais essayer de reduire en amont. // http://code.spip.net/@mysql2pg_type -function mysql2pg_type($v){ +function mysql2pg_type($v) { $remplace = array( '/auto_increment/i' => '', // non reconnu '/bigint/i' => 'bigint', '/mediumint/i' => 'mediumint', - '/smallint/i'=> 'smallint', + '/smallint/i' => 'smallint', "/tinyint/i" => 'int', '/int\s*[(]\s*\d+\s*[)]/i' => 'int', "/longtext/i" => 'text', "/mediumtext/i" => 'text', "/tinytext/i" => 'text', "/longblob/i" => 'text', - "/0000-00-00/" =>'0001-01-01', + "/0000-00-00/" => '0001-01-01', "/datetime/i" => 'timestamp', "/unsigned/i" => '', "/double/i" => 'double precision', @@ -1358,15 +1549,16 @@ function mysql2pg_type($v){ "/ENUM *[(][^)]*[)]/i" => "varchar(255)", '/(timestamp .* )ON .*$/is' => '\\1', ); - - return preg_replace(array_keys($remplace),array_values($remplace),$v); + + return preg_replace(array_keys($remplace), array_values($remplace), $v); } // Renvoie false si on n'a pas les fonctions pg (pour l'install) // http://code.spip.net/@spip_versions_pg -function spip_versions_pg(){ +function spip_versions_pg() { charger_php_extension('pgsql'); - return function_exists('pg_connect'); + + return function_exists('pg_connect'); } ?> diff --git a/ecrire/req/sqlite2.php b/ecrire/req/sqlite2.php index 95bf1965f7..b402313974 100644 --- a/ecrire/req/sqlite2.php +++ b/ecrire/req/sqlite2.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('req/sqlite_generique'); @@ -18,21 +20,21 @@ $GLOBALS['spip_sqlite2_functions_1'] = _sqlite_ref_fonctions(); // http://code.spip.net/@req_sqlite2_dist -function req_sqlite2_dist($addr, $port, $login, $pass, $db = '', $prefixe = '') { - return req_sqlite_dist($addr, $port, $login, $pass, $db, $prefixe, $sqlite_version=2); +function req_sqlite2_dist($addr, $port, $login, $pass, $db = '', $prefixe = '') { + return req_sqlite_dist($addr, $port, $login, $pass, $db, $prefixe, $sqlite_version = 2); } // http://code.spip.net/@spip_sqlite2_constantes -function spip_sqlite2_constantes(){ +function spip_sqlite2_constantes() { if (!defined('SPIP_SQLITE2_ASSOC')) { define('SPIP_SQLITE2_ASSOC', SQLITE_ASSOC); - define('SPIP_SQLITE2_NUM', SQLITE_NUM); - define('SPIP_SQLITE2_BOTH', SQLITE_BOTH); + define('SPIP_SQLITE2_NUM', SQLITE_NUM); + define('SPIP_SQLITE2_BOTH', SQLITE_BOTH); } } -function spip_versions_sqlite2() -{ +function spip_versions_sqlite2() { return _sqlite_charger_version(2) ? 2 : false; } + ?> diff --git a/ecrire/req/sqlite3.php b/ecrire/req/sqlite3.php index 6480e86a5f..519c9a4b3b 100644 --- a/ecrire/req/sqlite3.php +++ b/ecrire/req/sqlite3.php @@ -10,8 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; - +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('req/sqlite_generique'); @@ -21,21 +22,20 @@ $GLOBALS['spip_sqlite3_functions_1'] = _sqlite_ref_fonctions(); // http://code.spip.net/@req_sqlite3_dist function req_sqlite3_dist($addr, $port, $login, $pass, $db = '', $prefixe = '') { - return req_sqlite_dist($addr, $port, $login, $pass, $db, $prefixe, $sqlite_version=3); + return req_sqlite_dist($addr, $port, $login, $pass, $db, $prefixe, $sqlite_version = 3); } // http://code.spip.net/@spip_sqlite3_constantes -function spip_sqlite3_constantes(){ +function spip_sqlite3_constantes() { if (!defined('SPIP_SQLITE3_ASSOC')) { define('SPIP_SQLITE3_ASSOC', PDO::FETCH_ASSOC); - define('SPIP_SQLITE3_NUM', PDO::FETCH_NUM); - define('SPIP_SQLITE3_BOTH', PDO::FETCH_BOTH); + define('SPIP_SQLITE3_NUM', PDO::FETCH_NUM); + define('SPIP_SQLITE3_BOTH', PDO::FETCH_BOTH); } } -function spip_versions_sqlite3() -{ +function spip_versions_sqlite3() { return _sqlite_charger_version(3) ? 3 : false; } diff --git a/ecrire/req/sqlite_fonctions.php b/ecrire/req/sqlite_fonctions.php index 1280b9bfd2..46101be087 100644 --- a/ecrire/req/sqlite_fonctions.php +++ b/ecrire/req/sqlite_fonctions.php @@ -11,7 +11,9 @@ \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /* * Des fonctions pour les requetes SQL @@ -21,66 +23,77 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * */ // http://code.spip.net/@_sqlite_init_functions -function _sqlite_init_functions(&$sqlite){ - - if (!$sqlite) return false; +function _sqlite_init_functions(&$sqlite) { + + if (!$sqlite) { + return false; + } + - $fonctions = array( - 'CONCAT' => array( '_sqlite_func_concat' ,-1), - 'CEIL' => array( '_sqlite_func_ceil', 1), // absent de sqlite2 - - 'DATE_FORMAT' => array( '_sqlite_func_strftime' ,2), - 'DAYOFMONTH' => array( '_sqlite_func_dayofmonth' ,1), - - 'EXTRAIRE_MULTI' => array( '_sqlite_func_extraire_multi', 2), // specifique a SPIP/sql_multi() - 'EXP' => array( 'exp' ,1),//exponentielle - 'FIND_IN_SET' => array( '_sqlite_func_find_in_set' ,2), - 'FLOOR' => array( '_sqlite_func_floor', 1), // absent de sqlite2 - - 'IF' => array( '_sqlite_func_if' ,3), - 'INSERT' => array( '_sqlite_func_insert' ,4), - 'INSTR' => array( '_sqlite_func_instr' ,2), - - 'LEAST' => array( '_sqlite_func_least' ,3), - '_LEFT' => array( '_sqlite_func_left' ,2), + 'CONCAT' => array('_sqlite_func_concat', -1), + 'CEIL' => array('_sqlite_func_ceil', 1), + // absent de sqlite2 + + 'DATE_FORMAT' => array('_sqlite_func_strftime', 2), + 'DAYOFMONTH' => array('_sqlite_func_dayofmonth', 1), + + 'EXTRAIRE_MULTI' => array('_sqlite_func_extraire_multi', 2), + // specifique a SPIP/sql_multi() + 'EXP' => array('exp', 1), + //exponentielle + 'FIND_IN_SET' => array('_sqlite_func_find_in_set', 2), + 'FLOOR' => array('_sqlite_func_floor', 1), + // absent de sqlite2 + + 'IF' => array('_sqlite_func_if', 3), + 'INSERT' => array('_sqlite_func_insert', 4), + 'INSTR' => array('_sqlite_func_instr', 2), + + 'LEAST' => array('_sqlite_func_least', 3), + '_LEFT' => array('_sqlite_func_left', 2), # 'LENGTH' => array( 'strlen' ,1), // present v1.0.4 # 'LOWER' => array( 'strtolower' ,1), // present v2.4 # 'LTRIM' => array( 'ltrim' ,1), // present en theorie - 'NOW' => array( '_sqlite_func_now' ,0), - - 'MD5' => array( 'md5' ,1), - 'MONTH' => array( '_sqlite_func_month' ,1), - - 'PREG_REPLACE' => array( '_sqlite_func_preg_replace' ,3), - - 'RAND' => array( '_sqlite_func_rand' ,0), // sinon random() v2.4 - 'REGEXP' => array( '_sqlite_func_regexp_match' ,2), // critere REGEXP supporte a partir de v3.3.2 + 'NOW' => array('_sqlite_func_now', 0), + + 'MD5' => array('md5', 1), + 'MONTH' => array('_sqlite_func_month', 1), + + 'PREG_REPLACE' => array('_sqlite_func_preg_replace', 3), + + 'RAND' => array('_sqlite_func_rand', 0), + // sinon random() v2.4 + 'REGEXP' => array('_sqlite_func_regexp_match', 2), + // critere REGEXP supporte a partir de v3.3.2 //'REGEXP_MATCH' => array( '_sqlite_func_regexp_match' ,2), // critere REGEXP supporte a partir de v3.3.2 - 'RIGHT' => array( '_sqlite_func_right' ,2), + 'RIGHT' => array('_sqlite_func_right', 2), # 'RTRIM' => array( 'rtrim' ,1), // present en theorie - 'SETTYPE' => array( 'settype' ,2), // CAST present en v3.2.3 - 'SQRT' => array( 'sqrt' ,1), - 'SUBSTRING' => array( '_sqlite_func_substring' /*,3*/), // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0 - - 'TO_DAYS' => array( '_sqlite_func_to_days' ,1), + 'SETTYPE' => array('settype', 2), + // CAST present en v3.2.3 + 'SQRT' => array('sqrt', 1), + 'SUBSTRING' => array('_sqlite_func_substring' /*,3*/), + // peut etre appelee avec 2 ou 3 arguments, index base 1 et non 0 + + 'TO_DAYS' => array('_sqlite_func_to_days', 1), # 'TRIM' => array( 'trim' ,1), // present en theorie - 'TIMESTAMPDIFF' => array('_sqlite_timestampdiff' /*,3*/), + 'TIMESTAMPDIFF' => array('_sqlite_timestampdiff' /*,3*/), - 'UNIX_TIMESTAMP'=> array( '_sqlite_func_unix_timestamp' ,1), + 'UNIX_TIMESTAMP' => array('_sqlite_func_unix_timestamp', 1), # 'UPPER' => array( 'strtoupper' ,1), // present v2.4 - 'VIDE' => array( '_sqlite_func_vide' ,0), // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide() - - 'YEAR' => array( '_sqlite_func_year' ,1) + 'VIDE' => array('_sqlite_func_vide', 0), + // du vide pour SELECT 0 as x ... ORDER BY x -> ORDER BY vide() + + 'YEAR' => array('_sqlite_func_year', 1) ); - - foreach ($fonctions as $f=>$r){ + + foreach ($fonctions as $f => $r) { _sqlite_add_function($sqlite, $f, $r); } @@ -89,15 +102,15 @@ function _sqlite_init_functions(&$sqlite){ // permet au besoin de charger des fonctions ailleurs par _sqlite_init_functions(); // http://code.spip.net/@_sqlite_add_function -function _sqlite_add_function(&$sqlite, &$f, &$r){ - if (_sqlite_is_version(3, $sqlite)){ +function _sqlite_add_function(&$sqlite, &$f, &$r) { + if (_sqlite_is_version(3, $sqlite)) { isset($r[1]) - ?$sqlite->sqliteCreateFunction($f, $r[0], $r[1]) - :$sqlite->sqliteCreateFunction($f, $r[0]); + ? $sqlite->sqliteCreateFunction($f, $r[0], $r[1]) + : $sqlite->sqliteCreateFunction($f, $r[0]); } else { isset($r[1]) - ?sqlite_create_function($sqlite, $f, $r[0], $r[1]) - :sqlite_create_function($sqlite, $f, $r[0]); + ? sqlite_create_function($sqlite, $f, $r[0], $r[1]) + : sqlite_create_function($sqlite, $f, $r[0]); } } @@ -111,26 +124,30 @@ function _sqlite_func_ceil($a) { } // http://code.spip.net/@_sqlite_func_concat -function _sqlite_func_concat () { +function _sqlite_func_concat() { $args = func_get_args(); - return join('',$args); + + return join('', $args); } // http://code.spip.net/@_sqlite_func_dayofmonth -function _sqlite_func_dayofmonth ($d) { - return _sqlite_func_date("d",$d); +function _sqlite_func_dayofmonth($d) { + return _sqlite_func_date("d", $d); } // http://code.spip.net/@_sqlite_func_find_in_set function _sqlite_func_find_in_set($num, $set) { - $rank=0; - foreach (explode(",",$set) as $v) { - if ($v == $num) return (++$rank); - $rank++; - } - return 0; + $rank = 0; + foreach (explode(",", $set) as $v) { + if ($v == $num) { + return (++$rank); + } + $rank++; + } + + return 0; } function _sqlite_func_floor($a) { @@ -138,8 +155,8 @@ function _sqlite_func_floor($a) { } // http://code.spip.net/@_sqlite_func_if -function _sqlite_func_if ($bool, $oui, $non) { - return ($bool)?$oui:$non; +function _sqlite_func_if($bool, $oui, $non) { + return ($bool) ? $oui : $non; } @@ -147,73 +164,78 @@ function _sqlite_func_if ($bool, $oui, $non) { * INSERT(chaine, index, longueur, chaine) MySQL * Retourne une chaine de caracteres a partir d'une chaine dans laquelle "sschaine" * a ete inseree a la position "index" en remplacant "longueur" caracteres. - */ + */ // http://code.spip.net/@_sqlite_func_insert -function _sqlite_func_insert ($s, $index, $longueur, $chaine) { +function _sqlite_func_insert($s, $index, $longueur, $chaine) { return - substr($s,0, $index) + substr($s, 0, $index) . $chaine . substr(substr($s, $index), $longueur); } // http://code.spip.net/@_sqlite_func_instr -function _sqlite_func_instr ($s, $search) { - return strpos($s,$search); +function _sqlite_func_instr($s, $search) { + return strpos($s, $search); } // http://code.spip.net/@_sqlite_func_least -function _sqlite_func_least () { +function _sqlite_func_least() { $arg_list = func_get_args(); - $least = min($arg_list); + $least = min($arg_list); + #spip_log("Passage avec LEAST : $least",'sqlite.'._LOG_DEBUG); return $least; } // http://code.spip.net/@_sqlite_func_left -function _sqlite_func_left ($s, $lenght) { - return substr($s,$lenght); +function _sqlite_func_left($s, $lenght) { + return substr($s, $lenght); } // http://code.spip.net/@_sqlite_func_now -function _sqlite_func_now(){ +function _sqlite_func_now() { static $now = null; - if (is_null($now)) + if (is_null($now)) { $now = date("Y-m-d H:i:s"); + } + #spip_log("Passage avec NOW : $now",'sqlite.'._LOG_DEBUG); return $now; } // http://code.spip.net/@_sqlite_func_month -function _sqlite_func_month ($d) { - return _sqlite_func_date("m",$d); +function _sqlite_func_month($d) { + return _sqlite_func_date("m", $d); } - // http://code.spip.net/@_sqlite_func_preg_replace function _sqlite_func_preg_replace($quoi, $cherche, $remplace) { - $return = preg_replace('%'.$cherche.'%', $remplace, $quoi); + $return = preg_replace('%' . $cherche . '%', $remplace, $quoi); + #spip_log("preg_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG); return $return; } /** * Extrait une langue d'un texte <multi>[fr] xxx [en] yyy</multi> - * + * * @param string $quoi le texte contenant ou non un multi * @param string $lang la langue a extraire * @return string, l'extrait trouve. -**/ + **/ function _sqlite_func_extraire_multi($quoi, $lang) { - if (!defined('_EXTRAIRE_MULTI')) + if (!defined('_EXTRAIRE_MULTI')) { include_spip('inc/filtres'); - if (!function_exists('approcher_langue')) + } + if (!function_exists('approcher_langue')) { include_spip('inc/lang'); + } if (preg_match_all(_EXTRAIRE_MULTI, $quoi, $regs, PREG_SET_ORDER)) { foreach ($regs as $reg) { // chercher la version de la langue courante @@ -226,6 +248,7 @@ function _sqlite_func_extraire_multi($quoi, $lang) { $quoi = str_replace($reg[0], $trad, $quoi); } } + return $quoi; } @@ -237,65 +260,72 @@ function _sqlite_func_rand() { // http://code.spip.net/@_sqlite_func_right -function _sqlite_func_right ($s, $length) { - return substr($s,0 - $length); +function _sqlite_func_right($s, $length) { + return substr($s, 0-$length); } // http://code.spip.net/@_sqlite_func_regexp_match function _sqlite_func_regexp_match($cherche, $quoi) { // optimiser un cas tres courant avec les requetes en base - if (!$quoi AND !strlen($quoi)) return false; + if (!$quoi AND !strlen($quoi)) { + return false; + } $u = isset($GLOBALS['meta']['pcre_u']) ? $GLOBALS['meta']['pcre_u'] : 'u'; - $return = preg_match('%'.$cherche.'%imsS'.$u, $quoi); + $return = preg_match('%' . $cherche . '%imsS' . $u, $quoi); + #spip_log("regexp_replace : $quoi, $cherche, $remplace, $return",'sqlite.'._LOG_DEBUG); return $return; } // http://code.spip.net/@_sqlite_func_strftime -function _sqlite_func_strftime($date, $conv){ - return strftime($conv, is_int($date)?$date:strtotime($date)); +function _sqlite_func_strftime($date, $conv) { + return strftime($conv, is_int($date) ? $date : strtotime($date)); } /** * Nombre de jour entre 0000-00-00 et $d * http://code.spip.net/@_sqlite_func_to_days * cf http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_to-days + * * @param string $d * @return int */ -function _sqlite_func_to_days ($d) { +function _sqlite_func_to_days($d) { static $offset = 719528; // nb de jour entre 0000-00-00 et timestamp 0=1970-01-01 $result = $offset+(int)ceil(_sqlite_func_unix_timestamp($d)/(24*3600)); + #spip_log("Passage avec TO_DAYS : $d, $result",'sqlite.'._LOG_DEBUG); return $result; } -function _sqlite_func_substring($string, $start, $len = null){ +function _sqlite_func_substring($string, $start, $len = null) { // SQL compte a partir de 1, php a partir de 0 - $start = ($start>0)?$start-1:$start; - if (is_null($len)) - return substr($string,$start); - else - return substr($string,$start,$len); + $start = ($start > 0) ? $start-1 : $start; + if (is_null($len)) { + return substr($string, $start); + } else { + return substr($string, $start, $len); + } } /** * Calcul de la difference entre 2 timestamp, exprimes dans l'unite fournie en premier argument * emule https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timestampdiff + * * @param string $unit * @param string $date1 * @param string $date2 * @return int */ -function _sqlite_timestampdiff($unit, $date1, $date2){ +function _sqlite_timestampdiff($unit, $date1, $date2) { // PHP >= 5.3 - if (function_exists("date_diff")){ + if (function_exists("date_diff")) { $d1 = date_create($date1); $d2 = date_create($date2); - $diff = date_diff($d1,$d2); - $inv = $diff->invert?-1:1; - switch($unit){ + $diff = date_diff($d1, $d2); + $inv = $diff->invert ? -1 : 1; + switch ($unit) { case "YEAR": return $inv*$diff->y; case "QUARTER": @@ -316,23 +346,24 @@ function _sqlite_timestampdiff($unit, $date1, $date2){ case "MICROSECOND": return $inv*(((24*$diff->days+$diff->h)*60+$diff->i)*60+$diff->s)*1000000; } + return 0; - } - // PHP < 5.3 + } // PHP < 5.3 else { $d1 = strtotime($date1); $d2 = strtotime($date2); - $diff = $d2 - $d1; - $sign = ($diff<0?-1:1); - $diff = $sign * $diff; - switch($unit){ + $diff = $d2-$d1; + $sign = ($diff < 0 ? -1 : 1); + $diff = $sign*$diff; + switch ($unit) { case "YEAR": $diff = $d2-$d1; - return $sign*(date('Y',abs($diff))-date('Y',0)); + + return $sign*(date('Y', abs($diff))-date('Y', 0)); case "QUARTER": - return $sign*(4*(date('Y',abs($diff))-date('Y',0))+intval(floor((date('m',$diff)-1)/3))); + return $sign*(4*(date('Y', abs($diff))-date('Y', 0))+intval(floor((date('m', $diff)-1)/3))); case "MONTH": - return $sign*((date('Y',$diff)-date('Y',0))*12+date('m',$diff)-1); + return $sign*((date('Y', $diff)-date('Y', 0))*12+date('m', $diff)-1); case "WEEK": return intval(floor(($d2-$d1)/3600/7)); case "DAY": @@ -353,25 +384,34 @@ function _sqlite_timestampdiff($unit, $date1, $date2){ function _sqlite_func_unix_timestamp($d) { static $mem = array(); static $n = 0; - if (isset($mem[$d])) return $mem[$d]; - if ($n++>100) {$mem = array();$n=0;} + if (isset($mem[$d])) { + return $mem[$d]; + } + if ($n++ > 100) { + $mem = array(); + $n = 0; + } //2005-12-02 20:53:53 #spip_log("Passage avec UNIX_TIMESTAMP : $d",'sqlite.'._LOG_DEBUG); - if (!$d) return $mem[$d] = mktime(); + if (!$d) { + return $mem[$d] = mktime(); + } + // une pile plus grosse n'accelere pas le calcul return $mem[$d] = strtotime($d); } // http://code.spip.net/@_sqlite_func_year -function _sqlite_func_year ($d) { - return _sqlite_func_date("Y",$d); +function _sqlite_func_year($d) { + return _sqlite_func_date("Y", $d); } /** * version optimisee et memoizee de date() utilisee par * _sqlite_func_year, _sqlite_func_month, _sqlite_func_dayofmonth + * * @param string $quoi * format : Y, m, ou d * @param int $d @@ -381,19 +421,24 @@ function _sqlite_func_year ($d) { function _sqlite_func_date($quoi, $d) { static $mem = array(); static $n = 0; - if (isset($mem[$d])) return $mem[$d][$quoi]; - if ($n++>100) {$mem = array();$n=0;} + if (isset($mem[$d])) { + return $mem[$d][$quoi]; + } + if ($n++ > 100) { + $mem = array(); + $n = 0; + } + + $dec = date("Y-m-d", _sqlite_func_unix_timestamp($d)); + $mem[$d] = array("Y" => substr($dec, 0, 4), "m" => substr($dec, 5, 2), "d" => substr($dec, 8, 2)); - $dec = date("Y-m-d",_sqlite_func_unix_timestamp($d)); - $mem[$d] = array("Y"=>substr($dec,0,4),"m"=>substr($dec,5,2),"d"=>substr($dec,8,2)); return $mem[$d][$quoi]; } // http://code.spip.net/@_sqlite_func_vide -function _sqlite_func_vide(){ +function _sqlite_func_vide() { return; } - ?> diff --git a/ecrire/req/sqlite_generique.php b/ecrire/req/sqlite_generique.php index 06ecc8623b..51b892cf62 100644 --- a/ecrire/req/sqlite_generique.php +++ b/ecrire/req/sqlite_generique.php @@ -16,8 +16,10 @@ * * @package SPIP\Core\SQL\SQLite */ - -if (!defined('_ECRIRE_INC_VERSION')) return; + +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // TODO: get/set_caracteres ? @@ -29,13 +31,13 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * */ // http://code.spip.net/@req_sqlite_dist -function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = ''){ +function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $sqlite_version = '') { static $last_connect = array(); // si provient de selectdb // un code pour etre sur que l'on vient de select_db() - if (strpos($db, $code = '@selectdb@')!==false){ - foreach (array('addr', 'port', 'login', 'pass', 'prefixe') as $a){ + if (strpos($db, $code = '@selectdb@') !== false) { + foreach (array('addr', 'port', 'login', 'pass', 'prefixe') as $a) { $$a = $last_connect[$a]; } $db = str_replace($code, '', $db); @@ -51,35 +53,38 @@ function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $ // determiner le dossier de la base : $addr ou _DIR_DB $f = _DIR_DB; - if ($addr AND strpos($addr, '/')!==false) - $f = rtrim($addr, '/').'/'; + if ($addr AND strpos($addr, '/') !== false) { + $f = rtrim($addr, '/') . '/'; + } // un nom de base demande et impossible d'obtenir la base, on s'en va : // il faut que la base existe ou que le repertoire parent soit writable - if ($db AND !is_file($f .= $db.'.sqlite') AND !is_writable(dirname($f))){ - spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.'._LOG_HS); + if ($db AND !is_file($f .= $db . '.sqlite') AND !is_writable(dirname($f))) { + spip_log("base $f non trouvee ou droits en ecriture manquants", 'sqlite.' . _LOG_HS); + return false; } // charger les modules sqlite au besoin - if (!_sqlite_charger_version($sqlite_version)){ - spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.'._LOG_HS); + if (!_sqlite_charger_version($sqlite_version)) { + spip_log("Impossible de trouver/charger le module SQLite ($sqlite_version)!", 'sqlite.' . _LOG_HS); + return false; } // chargement des constantes // il ne faut pas definir les constantes avant d'avoir charge les modules sqlite - $define = "spip_sqlite".$sqlite_version."_constantes"; + $define = "spip_sqlite" . $sqlite_version . "_constantes"; $define(); $ok = false; - if (!$db){ + if (!$db) { // si pas de db -> // base temporaire tant qu'on ne connait pas son vrai nom // pour tester la connexion - $db = "_sqlite".$sqlite_version."_install"; - $tmp = _DIR_DB.$db.".sqlite"; - if ($sqlite_version==3){ + $db = "_sqlite" . $sqlite_version . "_install"; + $tmp = _DIR_DB . $db . ".sqlite"; + if ($sqlite_version == 3) { $ok = $link = new PDO("sqlite:$tmp"); } else { $ok = $link = sqlite_open($tmp, _SQLITE_CHMOD, $err); @@ -87,20 +92,21 @@ function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $ } else { // Ouvrir (eventuellement creer la base) // si pas de version fourni, on essaie la 3, sinon la 2 - if ($sqlite_version==3){ + if ($sqlite_version == 3) { $ok = $link = new PDO("sqlite:$f"); } else { $ok = $link = sqlite_open($f, _SQLITE_CHMOD, $err); } } - if (!$ok){ + if (!$ok) { $e = sqlite_last_error($db); - spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.'._LOG_HS); + spip_log("Impossible d'ouvrir la base SQLite($sqlite_version) $f : $e", 'sqlite.' . _LOG_HS); + return false; } - if ($link){ + if ($link) { $last_connect = array( 'addr' => $addr, 'port' => $port, @@ -127,21 +133,24 @@ function req_sqlite_dist($addr, $port, $login, $pass, $db = '', $prefixe = '', $ * Fonction de requete generale, munie d'une trace a la demande * * @param string $query - * Requete a executer + * Requete a executer * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @param bool $requeter - * Effectuer la requete ? - * - true pour executer - * - false pour retourner le texte de la requete + * Effectuer la requete ? + * - true pour executer + * - false pour retourner le texte de la requete * @return bool|SQLiteResult|string - * Resultat de la requete + * Resultat de la requete */ -function spip_sqlite_query($query, $serveur = '', $requeter = true){ +function spip_sqlite_query($query, $serveur = '', $requeter = true) { #spip_log("spip_sqlite_query() > $query",'sqlite.'._LOG_DEBUG); #_sqlite_init(); // fait la premiere fois dans spip_sqlite $query = spip_sqlite::traduire_requete($query, $serveur); - if (!$requeter) return $query; + if (!$requeter) { + return $query; + } + return spip_sqlite::executer_requete($query, $serveur); } @@ -150,14 +159,14 @@ function spip_sqlite_query($query, $serveur = '', $requeter = true){ /** * Modifie une structure de table SQLite - * - * @param string $query Requête SQL (sans 'ALTER ') - * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * + * @param string $query Requête SQL (sans 'ALTER ') + * @param string $serveur Nom de la connexion + * @param bool $requeter inutilisé * @return bool * False si erreur dans l'exécution, true sinon */ -function spip_sqlite_alter($query, $serveur = '', $requeter = true){ +function spip_sqlite_alter($query, $serveur = '', $requeter = true) { $query = spip_sqlite_query("ALTER $query", $serveur, false); // traduire la requete pour recuperer les bons noms de table @@ -173,12 +182,13 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ */ // 1 - if (preg_match("/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)){ + if (preg_match("/\s*(ALTER(\s*IGNORE)?\s*TABLE\s*([^\s]*))\s*(.*)?/is", $query, $regs)) { $debut = $regs[1]; $table = $regs[3]; $suite = $regs[4]; } else { - spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.'._LOG_ERREUR); + spip_log("SQLite : Probleme de ALTER TABLE mal forme dans $query", 'sqlite.' . _LOG_ERREUR); + return false; } @@ -193,25 +203,33 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ $todo2 = array(); $i = 0; $ouverte = false; - while ($do = array_shift($todo)){ - $todo2[$i] = isset($todo2[$i]) ? $todo2[$i].",".$do : $do; - $o = (false!==strpos($do, "(")); - $f = (false!==strpos($do, ")")); - if ($o AND !$f) $ouverte = true; - elseif ($f) $ouverte = false; - if (!$ouverte) $i++; + while ($do = array_shift($todo)) { + $todo2[$i] = isset($todo2[$i]) ? $todo2[$i] . "," . $do : $do; + $o = (false !== strpos($do, "(")); + $f = (false !== strpos($do, ")")); + if ($o AND !$f) { + $ouverte = true; + } elseif ($f) { + $ouverte = false; + } + if (!$ouverte) { + $i++; + } } // 3 $resultats = array(); - foreach ($todo2 as $do){ + foreach ($todo2 as $do) { $do = trim($do); if (!preg_match('/(DROP PRIMARY KEY|DROP KEY|DROP INDEX|DROP COLUMN|DROP' - .'|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME' - .'|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE' - .'|ADD COLUMN|ADD' - .')\s*([^\s]*)\s*(.*)?/i', $do, $matches)){ - spip_log("SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)", 'sqlite.'._LOG_ERREUR); + . '|CHANGE COLUMN|CHANGE|MODIFY|RENAME TO|RENAME' + . '|ADD PRIMARY KEY|ADD KEY|ADD INDEX|ADD UNIQUE KEY|ADD UNIQUE' + . '|ADD COLUMN|ADD' + . ')\s*([^\s]*)\s*(.*)?/i', $do, $matches) + ) { + spip_log("SQLite : Probleme de ALTER TABLE, utilisation non reconnue dans : $do \n(requete d'origine : $query)", + 'sqlite.' . _LOG_ERREUR); + return false; } @@ -245,7 +263,8 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ $table, $colonne_origine, array('key' => array('PRIMARY KEY' => '')), - $serveur)){ + $serveur) + ) { return false; } break; @@ -256,7 +275,8 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ $table, array($colonne_origine => ""), '', - $serveur)){ + $serveur) + ) { return false; } break; @@ -264,8 +284,8 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ case 'CHANGE COLUMN': case 'CHANGE': // recuperer le nom de la future colonne - // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation - // en tenant compte de la cle primaire (ce qui est mieux) + // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation + // en tenant compte de la cle primaire (ce qui est mieux) $def = trim($defo); $colonne_destination = substr($def, 0, strpos($def, ' ')); $def = substr($def, strlen($colonne_destination)+1); @@ -274,37 +294,41 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ $table, array($colonne_origine => $colonne_destination), array('field' => array($colonne_destination => $def)), - $serveur)){ + $serveur) + ) { return false; } break; case 'MODIFY': - // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation - // en tenant compte de la cle primaire (ce qui est mieux) + // on reprend la def d'origine car _sqlite_modifier_table va refaire la translation + // en tenant compte de la cle primaire (ce qui est mieux) if (!_sqlite_modifier_table( $table, $colonne_origine, array('field' => array($colonne_origine => $defo)), - $serveur)){ + $serveur) + ) { return false; } break; // pas geres en sqlite2 case 'RENAME': - $do = "RENAME TO".substr($do, 6); + $do = "RENAME TO" . substr($do, 6); case 'RENAME TO': - if (_sqlite_is_version(3, '', $serveur)){ - if (!spip_sqlite::executer_requete("$debut $do", $serveur)){ - spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.'._LOG_ERREUR); + if (_sqlite_is_version(3, '', $serveur)) { + if (!spip_sqlite::executer_requete("$debut $do", $serveur)) { + spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR); + return false; } // artillerie lourde pour sqlite2 ! } else { $table_dest = trim(substr($do, 9)); - if (!_sqlite_modifier_table(array($table => $table_dest), '', '', $serveur)){ - spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.'._LOG_ERREUR); + if (!_sqlite_modifier_table(array($table => $table_dest), '', '', $serveur)) { + spip_log("SQLite : Erreur ALTER TABLE / RENAME : $query", 'sqlite.' . _LOG_ERREUR); + return false; } } @@ -313,43 +337,44 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ // ajout d'une pk case 'ADD PRIMARY KEY': $pk = trim(substr($do, 16)); - $pk = ($pk[0]=='(') ? substr($pk, 1, -1) : $pk; + $pk = ($pk[0] == '(') ? substr($pk, 1, -1) : $pk; if (!_sqlite_modifier_table( $table, $colonne_origine, array('key' => array('PRIMARY KEY' => $pk)), - $serveur)){ + $serveur) + ) { return false; } break; // ajout d'un index case 'ADD UNIQUE KEY': case 'ADD UNIQUE': - $unique=true; + $unique = true; case 'ADD INDEX': case 'ADD KEY': - if (!isset($unique)) $unique = false; + if (!isset($unique)) { + $unique = false; + } // peut etre "(colonne)" ou "nom_index (colonnes)" // bug potentiel si qqn met "(colonne, colonne)" // // nom_index (colonnes) - if ($def){ + if ($def) { $colonnes = substr($def, 1, -1); $nom_index = $colonne_origine; - } - else { + } else { // (colonne) - if ($colonne_origine[0]=="("){ + if ($colonne_origine[0] == "(") { $colonnes = substr($colonne_origine, 1, -1); - if (false!==strpos(",", $colonnes)){ + if (false !== strpos(",", $colonnes)) { spip_log(_LOG_GRAVITE_ERREUR, "SQLite : Erreur, impossible de creer un index sur plusieurs colonnes" - ." sans qu'il ait de nom ($table, ($colonnes))", 'sqlite'); + . " sans qu'il ait de nom ($table, ($colonnes))", 'sqlite'); break; } else { $nom_index = $colonnes; } - } - // nom_index + } // nom_index else { $nom_index = $colonnes = $colonne_origine; } @@ -359,12 +384,13 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ // pas geres en sqlite2 case 'ADD COLUMN': - $do = "ADD".substr($do, 10); + $do = "ADD" . substr($do, 10); case 'ADD': default: - if (_sqlite_is_version(3, '', $serveur) AND !preg_match(',primary\s+key,i',$do)){ - if (!spip_sqlite::executer_requete("$debut $do", $serveur)){ - spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.'._LOG_ERREUR); + if (_sqlite_is_version(3, '', $serveur) AND !preg_match(',primary\s+key,i', $do)) { + if (!spip_sqlite::executer_requete("$debut $do", $serveur)) { + spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR); + return false; } break; @@ -379,23 +405,25 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ $colonne_ajoutee = substr($def, 0, strpos($def, ' ')); $def = substr($def, strlen($colonne_ajoutee)+1); $opts = array(); - if (preg_match(',primary\s+key,i',$def)){ + if (preg_match(',primary\s+key,i', $def)) { $opts['key'] = array('PRIMARY KEY' => $colonne_ajoutee); - $def = preg_replace(',primary\s+key,i','',$def); + $def = preg_replace(',primary\s+key,i', '', $def); } $opts['field'] = array($colonne_ajoutee => $def); - if (!_sqlite_modifier_table($table, array($colonne_ajoutee), $opts, $serveur)){ - spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.'._LOG_ERREUR); + if (!_sqlite_modifier_table($table, array($colonne_ajoutee), $opts, $serveur)) { + spip_log("SQLite : Erreur ALTER TABLE / ADD : $query", 'sqlite.' . _LOG_ERREUR); + return false; } } break; } // tout est bon, ouf ! - spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.'._LOG_INFO); + spip_log("SQLite ($serveur) : Changements OK : $debut $do", 'sqlite.' . _LOG_INFO); } - spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.'._LOG_INFO); + spip_log("SQLite ($serveur) : fin ALTER TABLE OK !", 'sqlite.' . _LOG_INFO); + return true; } @@ -406,70 +434,86 @@ function spip_sqlite_alter($query, $serveur = '', $requeter = true){ * Crée une table SQL nommee `$nom` à partir des 2 tableaux `$champs` et `$cles` * * @note Le nom des caches doit être inferieur à 64 caractères - * - * @param string $nom Nom de la table SQL - * @param array $champs Couples (champ => description SQL) - * @param array $cles Couples (type de clé => champ(s) de la clé) - * @param bool $autoinc True pour ajouter un auto-incrément sur la Primary Key - * @param bool $temporary True pour créer une table temporaire - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $nom Nom de la table SQL + * @param array $champs Couples (champ => description SQL) + * @param array $cles Couples (type de clé => champ(s) de la clé) + * @param bool $autoinc True pour ajouter un auto-incrément sur la Primary Key + * @param bool $temporary True pour créer une table temporaire + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|null|resource|string * - string Texte de la requête si demandée * - true si la requête réussie, false sinon. */ -function spip_sqlite_create($nom, $champs, $cles, $autoinc = false, $temporary = false, $serveur = '', $requeter = true){ +function spip_sqlite_create( + $nom, + $champs, + $cles, + $autoinc = false, + $temporary = false, + $serveur = '', + $requeter = true +) { $query = _sqlite_requete_create($nom, $champs, $cles, $autoinc, $temporary, $ifnotexists = true, $serveur, $requeter); - if (!$query) return false; + if (!$query) { + return false; + } $res = spip_sqlite_query($query, $serveur, $requeter); // SQLite ne cree pas les KEY sur les requetes CREATE TABLE // il faut donc les faire creer ensuite - if (!$requeter) return $res; + if (!$requeter) { + return $res; + } $ok = $res ? true : false; - if ($ok){ - foreach ($cles as $k => $v){ - if (preg_match(',^(KEY|UNIQUE)\s,i',$k,$m)){ - $index = trim(substr($k,strlen($m[1]))); - $unique = (strlen($m[1])>3); + if ($ok) { + foreach ($cles as $k => $v) { + if (preg_match(',^(KEY|UNIQUE)\s,i', $k, $m)) { + $index = trim(substr($k, strlen($m[1]))); + $unique = (strlen($m[1]) > 3); $ok &= spip_sqlite_create_index($index, $nom, $v, $unique, $serveur); } } } + return $ok ? true : false; } /** * Crée une base de données SQLite * - * @param string $nom Nom de la base (sans l'extension de fichier) + * @param string $nom Nom de la base (sans l'extension de fichier) * @param string $serveur Nom de la connexion - * @param string $option Options + * @param string $option Options * * @return bool true si la base est créee. **/ -function spip_sqlite_create_base($nom, $serveur = '', $option = true){ - $f = $nom.'.sqlite'; - if (strpos($nom, "/")===false) - $f = _DIR_DB.$f; - if (_sqlite_is_version(2, '', $serveur)){ +function spip_sqlite_create_base($nom, $serveur = '', $option = true) { + $f = $nom . '.sqlite'; + if (strpos($nom, "/") === false) { + $f = _DIR_DB . $f; + } + if (_sqlite_is_version(2, '', $serveur)) { $ok = sqlite_open($f, _SQLITE_CHMOD, $err); } else { $ok = new PDO("sqlite:$f"); } - if ($ok){ + if ($ok) { unset($ok); + return true; } unset($ok); + return false; } /** * Crée une vue SQL nommée `$nom` - * + * * @param string $nom * Nom de la vue a creer * @param string $query_select @@ -483,15 +527,20 @@ function spip_sqlite_create_base($nom, $serveur = '', $option = true){ * - false si erreur ou si la vue existe déja * - string texte de la requête si $requeter vaut false */ -function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true){ - if (!$query_select) return false; +function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = true) { + if (!$query_select) { + return false; + } // vue deja presente - if (sql_showtable($nom, false, $serveur)){ - spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", 'sqlite.'._LOG_ERREUR); + if (sql_showtable($nom, false, $serveur)) { + spip_log("Echec creation d'une vue sql ($nom) car celle-ci existe deja (serveur:$serveur)", + 'sqlite.' . _LOG_ERREUR); + return false; } - $query = "CREATE VIEW $nom AS ".$query_select; + $query = "CREATE VIEW $nom AS " . $query_select; + return spip_sqlite_query($query, $serveur, $requeter); } @@ -513,76 +562,90 @@ function spip_sqlite_create_view($nom, $query_select, $serveur = '', $requeter = * @return bool|string * string : requête, false si erreur, true sinon. */ -function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true){ - if (!($nom OR $table OR $champs)){ - spip_log("Champ manquant pour creer un index sqlite ($nom, $table, (".join(',', $champs)."))", 'sqlite.'._LOG_ERREUR); +function spip_sqlite_create_index($nom, $table, $champs, $unique = '', $serveur = '', $requeter = true) { + if (!($nom OR $table OR $champs)) { + spip_log("Champ manquant pour creer un index sqlite ($nom, $table, (" . join(',', $champs) . "))", + 'sqlite.' . _LOG_ERREUR); + return false; } // SQLite ne differentie pas noms des index en fonction des tables // il faut donc creer des noms uniques d'index pour une base sqlite - $nom = $table.'_'.$nom; + $nom = $table . '_' . $nom; // enlever d'eventuelles parentheses deja presentes sur champs - if (!is_array($champs)){ - if ($champs[0]=="(") $champs = substr($champs, 1, -1); + if (!is_array($champs)) { + if ($champs[0] == "(") { + $champs = substr($champs, 1, -1); + } $champs = array($champs); // supprimer l'info de longueur d'index mysql en fin de champ - $champs = preg_replace(",\(\d+\)$,","",$champs); + $champs = preg_replace(",\(\d+\)$,", "", $champs); } $ifnotexists = ""; - $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version",$serveur),'',$serveur); - if (!function_exists('spip_version_compare')) include_spip('plugins/installer'); + $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version", $serveur), '', $serveur); + if (!function_exists('spip_version_compare')) { + include_spip('plugins/installer'); + } - if ($version AND spip_version_compare($version['sqlite_version'],'3.3.0','>=')) { + if ($version AND spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) { $ifnotexists = ' IF NOT EXISTS'; } else { /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */ $a = spip_sqlite_showtable($table, $serveur); - if (isset($a['key']['KEY '.$nom])) return true; + if (isset($a['key']['KEY ' . $nom])) { + return true; + } } - $query = "CREATE ".($unique?"UNIQUE ":"")."INDEX$ifnotexists $nom ON $table (".join(',', $champs).")"; + $query = "CREATE " . ($unique ? "UNIQUE " : "") . "INDEX$ifnotexists $nom ON $table (" . join(',', $champs) . ")"; $res = spip_sqlite_query($query, $serveur, $requeter); - if (!$requeter) return $res; - if ($res) + if (!$requeter) { + return $res; + } + if ($res) { return true; - else + } else { return false; + } } /** * Retourne le nombre de lignes d’une ressource de sélection obtenue * avec `sql_select()` - * + * * En PDO/sqlite3, il faut calculer le count par une requete count(*) * pour les resultats de SELECT * cela est fait sans spip_sqlite_query() * - * @param Ressource|Object $r Ressource de résultat - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * @param Ressource|Object $r Ressource de résultat + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return int Nombre de lignes */ -function spip_sqlite_count($r, $serveur = '', $requeter = true){ - if (!$r) return 0; +function spip_sqlite_count($r, $serveur = '', $requeter = true) { + if (!$r) { + return 0; + } - if (_sqlite_is_version(3, '', $serveur)){ + if (_sqlite_is_version(3, '', $serveur)) { // select ou autre (insert, update,...) ? // (link,requete) a compter - if (is_array($r->spipSqliteRowCount)){ - list($link,$query) = $r->spipSqliteRowCount; + if (is_array($r->spipSqliteRowCount)) { + list($link, $query) = $r->spipSqliteRowCount; // amelioration possible a tester intensivement : pas de order by pour compter ! // $query = preg_replace(",ORDER BY .+(LIMIT\s|HAVING\s|GROUP BY\s|$),Uims","\\1",$query); $query = "SELECT count(*) as zzzzsqlitecount FROM ($query)"; $l = $link->query($query); $i = 0; - if ($l AND $z = $l->fetch()) + if ($l AND $z = $l->fetch()) { $i = $z['zzzzsqlitecount']; + } $r->spipSqliteRowCount = $i; } - if (isset($r->spipSqliteRowCount)){ + if (isset($r->spipSqliteRowCount)) { // Ce compte est faux s'il y a des limit dans la requete :( // il retourne le nombre d'enregistrements sans le limit return $r->spipSqliteRowCount; @@ -598,29 +661,37 @@ function spip_sqlite_count($r, $serveur = '', $requeter = true){ /** * Retourne le nombre de lignes d'une sélection * - * @param array|string $from Tables à consulter (From) - * @param array|string $where Conditions a remplir (Where) - * @param array|string $groupby Critère de regroupement (Group by) - * @param array $having Tableau des des post-conditions à remplir (Having) - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * @param array|string $from Tables à consulter (From) + * @param array|string $where Conditions a remplir (Where) + * @param array|string $groupby Critère de regroupement (Group by) + * @param array $having Tableau des des post-conditions à remplir (Having) + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return int|bool|string * - String Texte de la requête si demandé * - int Nombre de lignes * - false si la requête a échouée -**/ -function spip_sqlite_countsel($from = array(), $where = array(), $groupby = '', $having = array(), $serveur = '', $requeter = true){ - $c = !$groupby ? '*' : ('DISTINCT '.(is_string($groupby) ? $groupby : join(',', $groupby))); + **/ +function spip_sqlite_countsel( + $from = array(), + $where = array(), + $groupby = '', + $having = array(), + $serveur = '', + $requeter = true +) { + $c = !$groupby ? '*' : ('DISTINCT ' . (is_string($groupby) ? $groupby : join(',', $groupby))); $r = spip_sqlite_select("COUNT($c)", $from, $where, '', '', '', - $having, $serveur, $requeter); - if ((is_resource($r) or is_object($r)) && $requeter){ // ressource : sqlite2, object : sqlite3 - if (_sqlite_is_version(3, '', $serveur)){ + $having, $serveur, $requeter); + if ((is_resource($r) or is_object($r)) && $requeter) { // ressource : sqlite2, object : sqlite3 + if (_sqlite_is_version(3, '', $serveur)) { list($r) = spip_sqlite_fetch($r, SPIP_SQLITE3_NUM, $serveur); } else { list($r) = spip_sqlite_fetch($r, SPIP_SQLITE2_NUM, $serveur); } } + return $r; } @@ -628,82 +699,93 @@ function spip_sqlite_countsel($from = array(), $where = array(), $groupby = '', /** * Supprime des enregistrements d'une table * - * @param string $table Nom de la table SQL - * @param string|array $where Conditions à vérifier - * @param string $serveur Nom du connecteur - * @param bool $requeter Exécuter la requête, sinon la retourner + * @param string $table Nom de la table SQL + * @param string|array $where Conditions à vérifier + * @param string $serveur Nom du connecteur + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool|string * - int : nombre de suppressions réalisées, * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true){ + **/ +function spip_sqlite_delete($table, $where = '', $serveur = '', $requeter = true) { $res = spip_sqlite_query( _sqlite_calculer_expression('DELETE FROM', $table, ',') - ._sqlite_calculer_expression('WHERE', $where), + . _sqlite_calculer_expression('WHERE', $where), $serveur, $requeter); // renvoyer la requete inerte si demandee - if (!$requeter) return $res; + if (!$requeter) { + return $res; + } - if ($res){ + if ($res) { $link = _sqlite_link($serveur); - if (_sqlite_is_version(3, $link)){ + if (_sqlite_is_version(3, $link)) { return $res->rowCount(); } else { return sqlite_changes($link); } - } - else + } else { return false; + } } /** * Supprime une table SQL - * - * @param string $table Nom de la table SQL - * @param string $exist True pour ajouter un test d'existence avant de supprimer - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $table Nom de la table SQL + * @param string $exist True pour ajouter un test d'existence avant de supprimer + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool|string * - string Texte de la requête si demandé * - true si la requête a réussie, false sinon */ -function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true){ - if ($exist) $exist = " IF EXISTS"; +function spip_sqlite_drop_table($table, $exist = '', $serveur = '', $requeter = true) { + if ($exist) { + $exist = " IF EXISTS"; + } /* simuler le IF EXISTS - version 2 */ - if ($exist && _sqlite_is_version(2, '', $serveur)){ + if ($exist && _sqlite_is_version(2, '', $serveur)) { $a = spip_sqlite_showtable($table, $serveur); - if (!$a) return true; + if (!$a) { + return true; + } $exist = ''; } - if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) + if (spip_sqlite_query("DROP TABLE$exist $table", $serveur, $requeter)) { return true; - else + } else { return false; + } } /** * Supprime une vue SQL - * - * @param string $view Nom de la vue SQL - * @param string $exist True pour ajouter un test d'existence avant de supprimer - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $view Nom de la vue SQL + * @param string $exist True pour ajouter un test d'existence avant de supprimer + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return bool|string * - string Texte de la requête si demandé * - true si la requête a réussie, false sinon */ -function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true){ - if ($exist) $exist = " IF EXISTS"; +function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = true) { + if ($exist) { + $exist = " IF EXISTS"; + } /* simuler le IF EXISTS - version 2 */ - if ($exist && _sqlite_is_version(2, '', $serveur)){ + if ($exist && _sqlite_is_version(2, '', $serveur)) { $a = spip_sqlite_showtable($view, $serveur); - if (!$a) return true; + if (!$a) { + return true; + } $exist = ''; } @@ -720,25 +802,29 @@ function spip_sqlite_drop_view($view, $exist = '', $serveur = '', $requeter = tr * * @return bool ou requete */ -function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true){ - if (!($nom OR $table)){ - spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.'._LOG_ERREUR); +function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true) { + if (!($nom OR $table)) { + spip_log("Champ manquant pour supprimer un index sqlite ($nom, $table)", 'sqlite.' . _LOG_ERREUR); + return false; } // SQLite ne differentie pas noms des index en fonction des tables // il faut donc creer des noms uniques d'index pour une base sqlite - $index = $table.'_'.$nom; + $index = $table . '_' . $nom; $exist = " IF EXISTS"; /* simuler le IF EXISTS - version 2 */ - if (_sqlite_is_version(2, '', $serveur)){ + if (_sqlite_is_version(2, '', $serveur)) { $a = spip_sqlite_showtable($table, $serveur); - if (!isset($a['key']['KEY '.$nom])) return true; + if (!isset($a['key']['KEY ' . $nom])) { + return true; + } $exist = ''; } $query = "DROP INDEX$exist $index"; + return spip_sqlite_query($query, $serveur, $requeter); } @@ -746,7 +832,7 @@ function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true){ * Retourne la dernière erreur generée * * @uses sql_error_backtrace() - * + * * @param string $query * Requête qui était exécutée * @param string $serveur @@ -754,10 +840,10 @@ function spip_sqlite_drop_index($nom, $table, $serveur = '', $requeter = true){ * @return string * Erreur eventuelle **/ -function spip_sqlite_error($query = '', $serveur = ''){ +function spip_sqlite_error($query = '', $serveur = '') { $link = _sqlite_link($serveur); - if (_sqlite_is_version(3, $link)){ + if (_sqlite_is_version(3, $link)) { $errs = $link->errorInfo(); /* $errs[0] @@ -770,7 +856,7 @@ function spip_sqlite_error($query = '', $serveur = ''){ Le texte du message d'erreur */ $s = ''; - if (ltrim($errs[0],'0')) { // 00000 si pas d'erreur + if (ltrim($errs[0], '0')) { // 00000 si pas d'erreur $s = "$errs[2]"; } } elseif ($link) { @@ -780,10 +866,11 @@ function spip_sqlite_error($query = '', $serveur = ''){ } if ($s) { $trace = debug_backtrace(); - if ($trace[0]['function']!="spip_mysql_error"){ - spip_log("$s - $query - ".sql_error_backtrace(), 'sqlite.'._LOG_ERREUR); + if ($trace[0]['function'] != "spip_mysql_error") { + spip_log("$s - $query - " . sql_error_backtrace(), 'sqlite.' . _LOG_ERREUR); } } + return $s; } @@ -792,28 +879,32 @@ function spip_sqlite_error($query = '', $serveur = ''){ * * Le numéro (en sqlite3/pdo) est un retour ODBC tel que (très souvent) HY000 * http://www.easysoft.com/developer/interfaces/odbc/sqlstate_status_return_codes.html - * + * * @param string $serveur - * nom de la connexion + * nom de la connexion * @return int|string - * 0 pas d'erreur - * 1 ou autre erreur (en sqlite 2) - * 'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3) + * 0 pas d'erreur + * 1 ou autre erreur (en sqlite 2) + * 'HY000/1' : numéro de l'erreur SQLState / numéro d'erreur interne SQLite (en sqlite 3) **/ -function spip_sqlite_errno($serveur = ''){ +function spip_sqlite_errno($serveur = '') { $link = _sqlite_link($serveur); - if (_sqlite_is_version(3, $link)){ + if (_sqlite_is_version(3, $link)) { $t = $link->errorInfo(); - $s = ltrim($t[0],'0'); // 00000 si pas d'erreur - if ($s) $s .= ' / ' . $t[1]; // ajoute l'erreur du moteur SQLite + $s = ltrim($t[0], '0'); // 00000 si pas d'erreur + if ($s) { + $s .= ' / ' . $t[1]; + } // ajoute l'erreur du moteur SQLite } elseif ($link) { $s = sqlite_last_error($link); } else { $s = ": aucune ressource sqlite (link)"; } - if ($s) spip_log("Erreur sqlite $s", 'sqlite.'._LOG_ERREUR); + if ($s) { + spip_log("Erreur sqlite $s", 'sqlite.' . _LOG_ERREUR); + } return $s ? $s : 0; } @@ -821,21 +912,25 @@ function spip_sqlite_errno($serveur = ''){ /** * Retourne une explication de requête (Explain) SQLite - * - * @param string $query Texte de la requête - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $query Texte de la requête + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|string|bool * - array : Tableau de l'explication * - string si on retourne le texte de la requête * - false si on a pas pu avoir d'explication */ -function spip_sqlite_explain($query, $serveur = '', $requeter = true){ - if (strpos(ltrim($query), 'SELECT')!==0) return array(); +function spip_sqlite_explain($query, $serveur = '', $requeter = true) { + if (strpos(ltrim($query), 'SELECT') !== 0) { + return array(); + } $query = spip_sqlite::traduire_requete($query, $serveur); - $query = 'EXPLAIN '.$query; - if (!$requeter) return $query; + $query = 'EXPLAIN ' . $query; + if (!$requeter) { + return $query; + } // on ne trace pas ces requetes, sinon on obtient un tracage sans fin... $r = spip_sqlite::executer_requete($query, $serveur, false); @@ -847,31 +942,34 @@ function spip_sqlite_explain($query, $serveur = '', $requeter = true){ * Rècupère une ligne de résultat * * Récupère la ligne suivante d'une ressource de résultat - * - * @param Ressource $r Ressource de résultat (issu de sql_select) - * @param string $t Structure de résultat attendu (défaut ASSOC) - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * + * @param Ressource $r Ressource de résultat (issu de sql_select) + * @param string $t Structure de résultat attendu (défaut ASSOC) + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return array Ligne de résultat */ -function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true){ +function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true) { $link = _sqlite_link($serveur); $is_v3 = _sqlite_is_version(3, $link); - if (!$t) + if (!$t) { $t = ($is_v3 ? SPIP_SQLITE3_ASSOC : SPIP_SQLITE2_ASSOC); + } $retour = false; - if ($r) + if ($r) { $retour = ($is_v3 ? $r->fetch($t) : sqlite_fetch_array($r, $t)); + } // les version 2 et 3 parfois renvoie des 'table.titre' au lieu de 'titre' tout court ! pff ! // suppression de 'table.' pour toutes les cles (c'est un peu violent !) // c'est couteux : on ne verifie que la premiere ligne pour voir si on le fait ou non if ($retour - AND strpos(implode('',array_keys($retour)),'.')!==false){ - foreach ($retour as $cle => $val){ - if (($pos = strpos($cle, '.'))!==false){ + AND strpos(implode('', array_keys($retour)), '.') !== false + ) { + foreach ($retour as $cle => $val) { + if (($pos = strpos($cle, '.')) !== false) { $retour[substr($cle, $pos+1)] = &$retour[$cle]; unset($retour[$cle]); } @@ -884,22 +982,21 @@ function spip_sqlite_fetch($r, $t = '', $serveur = '', $requeter = true){ /** * Place le pointeur de résultat sur la position indiquée * - * @param Ressource $r Ressource de résultat - * @param int $row_number Position. Déplacer le pointeur à cette ligne - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * @param Ressource $r Ressource de résultat + * @param int $row_number Position. Déplacer le pointeur à cette ligne + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return bool True si déplacement réussi, false sinon. -**/ -function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true){ - if ($r){ + **/ +function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true) { + if ($r) { $link = _sqlite_link($serveur); - if (_sqlite_is_version(3, $link)){ + if (_sqlite_is_version(3, $link)) { // encore un truc de bien fichu : PDO ne PEUT PAS faire de seek ou de rewind... // je me demande si pour sqlite 3 il ne faudrait pas mieux utiliser // les nouvelles fonctions sqlite3_xx (mais encore moins presentes...) return false; - } - else { + } else { return sqlite_seek($r, $row_number); } } @@ -911,14 +1008,15 @@ function spip_sqlite_seek($r, $row_number, $serveur = '', $requeter = true){ * * Indique à SQLite de libérer de sa mémoire la ressoucre de résultat indiquée * car on n'a plus besoin de l'utiliser. - * - * @param Ressource|Object $r Ressource de résultat - * @param string $serveur Nom de la connexion - * @param bool $requeter Inutilisé + * + * @param Ressource|Object $r Ressource de résultat + * @param string $serveur Nom de la connexion + * @param bool $requeter Inutilisé * @return bool True si réussi */ -function spip_sqlite_free(&$r, $serveur = '', $requeter = true){ +function spip_sqlite_free(&$r, $serveur = '', $requeter = true) { unset($r); + return true; //return sqlite_free_result($r); } @@ -928,13 +1026,13 @@ function spip_sqlite_free(&$r, $serveur = '', $requeter = true){ * Teste si le charset indiqué est disponible sur le serveur SQL (aucune action ici) * * Cette fonction n'a aucune action actuellement - * + * * @param array|string $charset Nom du charset à tester. - * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * @param string $serveur Nom de la connexion + * @param bool $requeter inutilisé * @return void */ -function spip_sqlite_get_charset($charset = array(), $serveur = '', $requeter = true){ +function spip_sqlite_get_charset($charset = array(), $serveur = '', $requeter = true) { //$c = !$charset ? '' : (" LIKE "._q($charset['charset'])); //return spip_sqlite_fetch(sqlite_query(_sqlite_link($serveur), "SHOW CHARACTER SET$c"), NULL, $serveur); } @@ -942,15 +1040,15 @@ function spip_sqlite_get_charset($charset = array(), $serveur = '', $requeter = /** * Prépare une chaîne hexadécimale - * + * * Par exemple : FF ==> 255 en SQLite - * + * * @param string $v * Chaine hexadecimale * @return string * Valeur hexadécimale pour SQLite -**/ -function spip_sqlite_hex($v){ + **/ +function spip_sqlite_hex($v) { return hexdec($v); } @@ -973,16 +1071,16 @@ function spip_sqlite_hex($v){ * Inutilisé * @return string * Expression de requête SQL -**/ -function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true){ + **/ +function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = true) { $n = $i = 0; $in_sql = ""; - while ($n = strpos($valeurs, ',', $n+1)){ - if ((++$i)>=255){ - $in_sql .= "($val $not IN (". - substr($valeurs, 0, $n). - "))\n". - ($not ? "AND\t" : "OR\t"); + while ($n = strpos($valeurs, ',', $n+1)) { + if ((++$i) >= 255) { + $in_sql .= "($val $not IN (" . + substr($valeurs, 0, $n) . + "))\n" . + ($not ? "AND\t" : "OR\t"); $valeurs = substr($valeurs, $n+1); $i = $n = 0; } @@ -994,7 +1092,7 @@ function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = tr /** - * Insère une ligne dans une table + * Insère une ligne dans une table * * @param string $table * Nom de la table SQL @@ -1014,18 +1112,21 @@ function spip_sqlite_in($val, $valeurs, $not = '', $serveur = '', $requeter = tr * - Texte de la requête si demandé, * - False en cas d'erreur, * - Tableau de description de la requête et du temps d'exécution, si var_profile activé -**/ -function spip_sqlite_insert($table, $champs, $valeurs, $desc = array(), $serveur = '', $requeter = true){ + **/ +function spip_sqlite_insert($table, $champs, $valeurs, $desc = array(), $serveur = '', $requeter = true) { - $query = "INSERT INTO $table ".($champs ? "$champs VALUES $valeurs" : "DEFAULT VALUES"); - if ($r = spip_sqlite_query($query, $serveur, $requeter)){ - if (!$requeter) return $r; + $query = "INSERT INTO $table " . ($champs ? "$champs VALUES $valeurs" : "DEFAULT VALUES"); + if ($r = spip_sqlite_query($query, $serveur, $requeter)) { + if (!$requeter) { + return $r; + } $nb = spip_sqlite::last_insert_id($serveur); - } - else + } else { $nb = false; + } $err = spip_sqlite_error($query, $serveur); + // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage return isset($_GET['var_profile']) ? $r : $nb; @@ -1051,13 +1152,17 @@ function spip_sqlite_insert($table, $champs, $valeurs, $desc = array(), $serveur * - Texte de la requête si demandé, * - False en cas d'erreur, * - Tableau de description de la requête et du temps d'exécution, si var_profile activé -**/ -function spip_sqlite_insertq($table, $couples = array(), $desc = array(), $serveur = '', $requeter = true){ - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) die("$table insertion sans description"); + **/ +function spip_sqlite_insertq($table, $couples = array(), $desc = array(), $serveur = '', $requeter = true) { + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + die("$table insertion sans description"); + } $fields = isset($desc['field']) ? $desc['field'] : array(); - foreach ($couples as $champ => $val){ + foreach ($couples as $champ => $val) { $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]); } @@ -1065,9 +1170,9 @@ function spip_sqlite_insertq($table, $couples = array(), $desc = array(), $serve $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur); $cles = $valeurs = ""; - if (count($couples)){ - $cles = "(".join(',', array_keys($couples)).")"; - $valeurs = "(".join(',', $couples).")"; + if (count($couples)) { + $cles = "(" . join(',', array_keys($couples)) . ")"; + $valeurs = "(" . join(',', $couples) . ")"; } return spip_sqlite_insert($table, $cles, $valeurs, $desc, $serveur, $requeter); @@ -1092,12 +1197,17 @@ function spip_sqlite_insertq($table, $couples = array(), $desc = array(), $serve * - True en cas de succès, * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function spip_sqlite_insertq_multi($table, $tab_couples = array(), $desc = array(), $serveur = '', $requeter = true){ - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) die("$table insertion sans description"); - if (!isset($desc['field'])) + **/ +function spip_sqlite_insertq_multi($table, $tab_couples = array(), $desc = array(), $serveur = '', $requeter = true) { + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + die("$table insertion sans description"); + } + if (!isset($desc['field'])) { $desc['field'] = array(); + } // recuperer les champs 'timestamp' pour mise a jour auto de ceux-ci $maj = _sqlite_ajouter_champs_timestamp($table, array(), $desc, $serveur); @@ -1105,46 +1215,50 @@ function spip_sqlite_insertq_multi($table, $tab_couples = array(), $desc = array // seul le nom de la table est a traduire ici : // le faire une seule fois au debut $query_start = "INSERT INTO $table "; - $query_start = spip_sqlite::traduire_requete($query_start,$serveur); + $query_start = spip_sqlite::traduire_requete($query_start, $serveur); // ouvrir une transaction - if ($requeter) + if ($requeter) { spip_sqlite::demarrer_transaction($serveur); + } - while ($couples = array_shift($tab_couples)){ - foreach ($couples as $champ => $val){ + while ($couples = array_shift($tab_couples)) { + foreach ($couples as $champ => $val) { $couples[$champ] = _sqlite_calculer_cite($val, $desc['field'][$champ]); } // inserer les champs timestamp par defaut - $couples = array_merge($maj,$couples); + $couples = array_merge($maj, $couples); $champs = $valeurs = ""; - if (count($couples)){ - $champs = "(".join(',', array_keys($couples)).")"; - $valeurs = "(".join(',', $couples).")"; - $query = $query_start."$champs VALUES $valeurs"; + if (count($couples)) { + $champs = "(" . join(',', array_keys($couples)) . ")"; + $valeurs = "(" . join(',', $couples) . ")"; + $query = $query_start . "$champs VALUES $valeurs"; + } else { + $query = $query_start . "DEFAULT VALUES"; + } + + if ($requeter) { + $retour = spip_sqlite::executer_requete($query, $serveur); } - else - $query = $query_start."DEFAULT VALUES"; - - if ($requeter) - $retour = spip_sqlite::executer_requete($query,$serveur); // sur le dernier couple uniquement - if (!count($tab_couples)){ + if (!count($tab_couples)) { $nb = 0; - if ($requeter) + if ($requeter) { $nb = spip_sqlite::last_insert_id($serveur); - else + } else { return $query; + } } $err = spip_sqlite_error($query, $serveur); } - if ($requeter) + if ($requeter) { spip_sqlite::finir_transaction($serveur); + } // renvoie le dernier id d'autoincrement ajoute // cas particulier : ne pas substituer la reponse spip_sqlite_query si on est en profilage @@ -1161,16 +1275,16 @@ function spip_sqlite_insertq_multi($table, $tab_couples = array(), $desc = array * Inutilisé * @return bool * Toujours true. -**/ + **/ function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) { return true; } /** * Démarre une transaction - * + * * Pratique pour des sql_updateq() dans un foreach, - * parfois 100* plus rapide s'ils sont nombreux en sqlite ! + * parfois 100* plus rapide s'ils sont nombreux en sqlite ! * * @param string $serveur * Nom du connecteur @@ -1178,26 +1292,32 @@ function spip_sqlite_preferer_transaction($serveur = '', $requeter = true) { * true pour exécuter la requête ou false pour retourner le texte de la requête * @return bool|string * string si texte de la requête demandé, true sinon -**/ + **/ function spip_sqlite_demarrer_transaction($serveur = '', $requeter = true) { - if (!$requeter) return "BEGIN TRANSACTION"; + if (!$requeter) { + return "BEGIN TRANSACTION"; + } spip_sqlite::demarrer_transaction($serveur); + return true; } /** * Clôture une transaction - * + * * @param string $serveur * Nom du connecteur * @param bool $requeter * true pour exécuter la requête ou false pour retourner le texte de la requête * @return bool|string * string si texte de la requête demandé, true sinon -**/ + **/ function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) { - if (!$requeter) return "COMMIT"; + if (!$requeter) { + return "COMMIT"; + } spip_sqlite::finir_transaction($serveur); + return true; } @@ -1211,11 +1331,11 @@ function spip_sqlite_terminer_transaction($serveur = '', $requeter = true) { * Inutilisé * @return array * Liste des noms de bases -**/ -function spip_sqlite_listdbs($serveur = '', $requeter = true){ + **/ +function spip_sqlite_listdbs($serveur = '', $requeter = true) { _sqlite_init(); - if (!is_dir($d = substr(_DIR_DB, 0, -1))){ + if (!is_dir($d = substr(_DIR_DB, 0, -1))) { return array(); } @@ -1223,11 +1343,13 @@ function spip_sqlite_listdbs($serveur = '', $requeter = true){ $bases = preg_files($d, $pattern = '(.*)\.sqlite$'); $bds = array(); - foreach ($bases as $b){ + foreach ($bases as $b) { // pas de bases commencant pas sqlite // (on s'en sert pour l'installation pour simuler la presence d'un serveur) // les bases sont de la forme _sqliteX_tmp_spip_install.sqlite - if (strpos($b, '_sqlite')) continue; + if (strpos($b, '_sqlite')) { + continue; + } $bds[] = preg_replace(";.*/$pattern;iS", '$1', $b); } @@ -1242,18 +1364,19 @@ function spip_sqlite_listdbs($serveur = '', $requeter = true){ * Cette sélection est mise dans l'alias `multi` (instruction AS multi). * * @param string $objet Colonne ayant le texte - * @param string $lang Langue à extraire + * @param string $lang Langue à extraire * @return string Texte de sélection pour la requête */ -function spip_sqlite_multi($objet, $lang){ +function spip_sqlite_multi($objet, $lang) { $r = "EXTRAIRE_MULTI(" . $objet . ", '" . $lang . "') AS multi"; + return $r; } /** * Optimise une table SQL - * + * * @note * Sqlite optimise TOUT un fichier sinon rien. * On évite donc 2 traitements sur la même base dans un hit. @@ -1263,19 +1386,19 @@ function spip_sqlite_multi($objet, $lang){ * @param $requeter effectuer la requete ? sinon retourner son code * @return bool|string true / false / requete **/ -function spip_sqlite_optimize($table, $serveur = '', $requeter = true){ +function spip_sqlite_optimize($table, $serveur = '', $requeter = true) { static $do = false; - if ($requeter and $do){ + if ($requeter and $do) { return true; } - if ($requeter){ + if ($requeter) { $do = true; } + return spip_sqlite_query("VACUUM", $serveur, $requeter); } - /** * Échapper une valeur selon son type * mais pour SQLite avec ses spécificités @@ -1288,13 +1411,16 @@ function spip_sqlite_optimize($table, $serveur = '', $requeter = true){ * @return string|number * Donnée prête à être utilisée par le gestionnaire SQL */ -function spip_sqlite_quote($v, $type = ''){ - if (!is_array($v)) - return _sqlite_calculer_cite($v,$type); - // si c'est un tableau, le parcourir en propageant le type - foreach($v as $k=>$r) - $v[$k] = spip_sqlite_quote($r, $type); - return join(",", $v); +function spip_sqlite_quote($v, $type = '') { + if (!is_array($v)) { + return _sqlite_calculer_cite($v, $type); + } + // si c'est un tableau, le parcourir en propageant le type + foreach ($v as $k => $r) { + $v[$k] = spip_sqlite_quote($r, $type); + } + + return join(",", $v); } @@ -1310,9 +1436,10 @@ function spip_sqlite_quote($v, $type = ''){ * @return string * Expression SQL **/ -function spip_sqlite_date_proche($champ, $interval, $unite){ +function spip_sqlite_date_proche($champ, $interval, $unite) { $op = (($interval <= 0) ? '>' : '<'); - return "($champ $op datetime('".date("Y-m-d H:i:s")."', '$interval $unite'))"; + + return "($champ $op datetime('" . date("Y-m-d H:i:s") . "', '$interval $unite'))"; } @@ -1321,55 +1448,56 @@ function spip_sqlite_date_proche($champ, $interval, $unite){ * * Il n'y a pas de fonction native repair dans sqlite, mais on profite * pour vérifier que tous les champs (text|char) ont bien une clause DEFAULT - * - * @param string $table Nom de la table SQL - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $table Nom de la table SQL + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return string[] * Tableau avec clé 0 pouvant avoir " OK " ou " ERROR " indiquant * l'état de la table après la réparation */ -function spip_sqlite_repair($table, $serveur = '', $requeter = true) -{ +function spip_sqlite_repair($table, $serveur = '', $requeter = true) { if ($desc = spip_sqlite_showtable($table, $serveur) - AND isset($desc['field']) - AND is_array($desc['field'])){ - foreach ($desc['field'] as $c => $d){ - if (preg_match(",^(tinytext|mediumtext|text|longtext|varchar|char),i",$d) - AND stripos($d,"NOT NULL")!==false - AND stripos($d,"DEFAULT")===false + AND isset($desc['field']) + AND is_array($desc['field']) + ) { + foreach ($desc['field'] as $c => $d) { + if (preg_match(",^(tinytext|mediumtext|text|longtext|varchar|char),i", $d) + AND stripos($d, "NOT NULL") !== false + AND stripos($d, "DEFAULT") === false /* pas touche aux cles primaires */ - AND (!isset($desc['key']['PRIMARY KEY']) OR $desc['key']['PRIMARY KEY']!==$c) - ){ - spip_sqlite_alter($q="TABLE $table CHANGE $c $c $d DEFAULT ''",$serveur); - spip_log("ALTER $q","repair"._LOG_INFO_IMPORTANTE); + AND (!isset($desc['key']['PRIMARY KEY']) OR $desc['key']['PRIMARY KEY'] !== $c) + ) { + spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT ''", $serveur); + spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE); } - if (preg_match(",^(INTEGER),i",$d) - AND stripos($d,"NOT NULL")!==false - AND stripos($d,"DEFAULT")===false + if (preg_match(",^(INTEGER),i", $d) + AND stripos($d, "NOT NULL") !== false + AND stripos($d, "DEFAULT") === false /* pas touche aux cles primaires */ - AND (!isset($desc['key']['PRIMARY KEY']) OR $desc['key']['PRIMARY KEY']!==$c) - ){ - spip_sqlite_alter($q="TABLE $table CHANGE $c $c $d DEFAULT '0'",$serveur); - spip_log("ALTER $q","repair"._LOG_INFO_IMPORTANTE); + AND (!isset($desc['key']['PRIMARY KEY']) OR $desc['key']['PRIMARY KEY'] !== $c) + ) { + spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0'", $serveur); + spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE); } - if (preg_match(",^(datetime),i",$d) - AND stripos($d,"NOT NULL")!==false - AND stripos($d,"DEFAULT")===false + if (preg_match(",^(datetime),i", $d) + AND stripos($d, "NOT NULL") !== false + AND stripos($d, "DEFAULT") === false /* pas touche aux cles primaires */ - AND (!isset($desc['key']['PRIMARY KEY']) OR $desc['key']['PRIMARY KEY']!==$c) - ){ - spip_sqlite_alter($q="TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'",$serveur); - spip_log("ALTER $q","repair"._LOG_INFO_IMPORTANTE); + AND (!isset($desc['key']['PRIMARY KEY']) OR $desc['key']['PRIMARY KEY'] !== $c) + ) { + spip_sqlite_alter($q = "TABLE $table CHANGE $c $c $d DEFAULT '0000-00-00 00:00:00'", $serveur); + spip_log("ALTER $q", "repair" . _LOG_INFO_IMPORTANTE); } } + return array(" OK "); } + return array(" ERROR "); } - /** * Insère où met à jour une entrée d’une table SQL * @@ -1377,7 +1505,7 @@ function spip_sqlite_repair($table, $serveur = '', $requeter = true) * La fonction effectue une protection automatique des données. * * Préférer à cette fonction updateq ou insertq. - * + * * @param string $table * Nom de la table SQL * @param array $couples @@ -1393,20 +1521,25 @@ function spip_sqlite_repair($table, $serveur = '', $requeter = true) * - true si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function spip_sqlite_replace($table, $couples, $desc = array(), $serveur = '', $requeter = true){ - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) die("$table insertion sans description"); + **/ +function spip_sqlite_replace($table, $couples, $desc = array(), $serveur = '', $requeter = true) { + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + die("$table insertion sans description"); + } $fields = isset($desc['field']) ? $desc['field'] : array(); - foreach ($couples as $champ => $val){ + foreach ($couples as $champ => $val) { $couples[$champ] = _sqlite_calculer_cite($val, $fields[$champ]); } // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $couples = _sqlite_ajouter_champs_timestamp($table, $couples, $desc, $serveur); - return spip_sqlite_query("REPLACE INTO $table (".join(',', array_keys($couples)).') VALUES ('.join(',', $couples).')', $serveur); + return spip_sqlite_query("REPLACE INTO $table (" . join(',', array_keys($couples)) . ') VALUES (' . join(',', + $couples) . ')', $serveur); } @@ -1415,9 +1548,9 @@ function spip_sqlite_replace($table, $couples, $desc = array(), $serveur = '', $ * * La clé ou les cles primaires doivent être présentes dans les données insérés. * La fonction effectue une protection automatique des données. - * + * * Préférez insertq_multi et sql_updateq - * + * * @param string $table * Nom de la table SQL * @param array $tab_couples @@ -1433,14 +1566,15 @@ function spip_sqlite_replace($table, $couples, $desc = array(), $serveur = '', $ * - true si réussite * - Texte de la requête si demandé, * - False en cas d'erreur. -**/ -function spip_sqlite_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $requeter = true){ + **/ +function spip_sqlite_replace_multi($table, $tab_couples, $desc = array(), $serveur = '', $requeter = true) { // boucler pour trainter chaque requete independemment - foreach ($tab_couples as $couples){ + foreach ($tab_couples as $couples) { $retour = spip_sqlite_replace($table, $couples, $desc, $serveur, $requeter); } - // renvoie le dernier id + + // renvoie le dernier id return $retour; } @@ -1451,23 +1585,33 @@ function spip_sqlite_replace_multi($table, $tab_couples, $desc = array(), $serve * Instance de sql_select (voir ses specs). * * @see sql_select() - * - * @param string|array $select Champs sélectionnés - * @param string|array $from Tables sélectionnées - * @param string|array $where Contraintes - * @param string|array $groupby Regroupements - * @param string|array $orderby Tris - * @param string $limit Limites de résultats - * @param string|array $having Contraintes posts sélections - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string|array $select Champs sélectionnés + * @param string|array $from Tables sélectionnées + * @param string|array $where Contraintes + * @param string|array $groupby Regroupements + * @param string|array $orderby Tris + * @param string $limit Limites de résultats + * @param string|array $having Contraintes posts sélections + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|bool|resource|string * - string : Texte de la requête si on ne l'exécute pas * - ressource si requête exécutée, ressource pour fetch() * - false si la requête exécutée a ratée * - array : Tableau décrivant requête et temps d'exécution si var_profile actif pour tracer. */ -function spip_sqlite_select($select, $from, $where = '', $groupby = '', $orderby = '', $limit = '', $having = '', $serveur = '', $requeter = true){ +function spip_sqlite_select( + $select, + $from, + $where = '', + $groupby = '', + $orderby = '', + $limit = '', + $having = '', + $serveur = '', + $requeter = true +) { // version() n'est pas connu de sqlite $select = str_replace('version()', 'sqlite_version()', $select); @@ -1477,21 +1621,24 @@ function spip_sqlite_select($select, $from, $where = '', $groupby = '', $orderby $query = _sqlite_calculer_expression('SELECT', $select, ', ') - ._sqlite_calculer_expression('FROM', $from, ', ') - ._sqlite_calculer_expression('WHERE', $where) - ._sqlite_calculer_expression('GROUP BY', $groupby, ',') - ._sqlite_calculer_expression('HAVING', $having) - .($orderby ? ("\nORDER BY "._sqlite_calculer_order($orderby)) : '') - .($limit ? "\nLIMIT $limit" : ''); + . _sqlite_calculer_expression('FROM', $from, ', ') + . _sqlite_calculer_expression('WHERE', $where) + . _sqlite_calculer_expression('GROUP BY', $groupby, ',') + . _sqlite_calculer_expression('HAVING', $having) + . ($orderby ? ("\nORDER BY " . _sqlite_calculer_order($orderby)) : '') + . ($limit ? "\nLIMIT $limit" : ''); // dans un select, on doit renvoyer la requête en cas d'erreur $res = spip_sqlite_query($query, $serveur, $requeter); // texte de la requete demande ? - if (!$requeter) return $res; + if (!$requeter) { + return $res; + } // erreur survenue ? if ($res === false) { return spip_sqlite::traduire_requete($query, $serveur); } + return $res; } @@ -1505,19 +1652,21 @@ function spip_sqlite_select($select, $from, $where = '', $groupby = '', $orderby * Nom du connecteur * @param bool $requeter * Inutilisé - * + * * @return bool|string * - Nom de la base en cas de success. * - False en cas d'erreur. -**/ -function spip_sqlite_selectdb($db, $serveur = '', $requeter = true){ + **/ +function spip_sqlite_selectdb($db, $serveur = '', $requeter = true) { _sqlite_init(); // interdire la creation d'une nouvelle base, // sauf si on est dans l'installation - if (!is_file($f = _DIR_DB.$db.'.sqlite') - && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)){ - spip_log("Il est interdit de creer la base $db", 'sqlite.'._LOG_HS); + if (!is_file($f = _DIR_DB . $db . '.sqlite') + && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL) + ) { + spip_log("Il est interdit de creer la base $db", 'sqlite.' . _LOG_HS); + return false; } @@ -1525,11 +1674,13 @@ function spip_sqlite_selectdb($db, $serveur = '', $requeter = true){ // avec les identifiants connus $index = $serveur ? $serveur : 0; - if ($link = spip_connect_db('', '', '', '', '@selectdb@'.$db, $serveur, '', '')){ - if (($db==$link['db']) && $GLOBALS['connexions'][$index] = $link) + if ($link = spip_connect_db('', '', '', '', '@selectdb@' . $db, $serveur, '', '')) { + if (($db == $link['db']) && $GLOBALS['connexions'][$index] = $link) { return $db; + } } else { - spip_log("Impossible de selectionner la base $db", 'sqlite.'._LOG_HS); + spip_log("Impossible de selectionner la base $db", 'sqlite.' . _LOG_HS); + return false; } @@ -1540,20 +1691,20 @@ function spip_sqlite_selectdb($db, $serveur = '', $requeter = true){ * Définit un charset pour la connexion avec SQLite (aucune action ici) * * Cette fonction n'a aucune action actuellement. - * + * * @param string $charset Charset à appliquer * @param string $serveur Nom de la connexion - * @param bool $requeter inutilisé + * @param bool $requeter inutilisé * @return void */ -function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true){ +function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true) { # spip_log("Gestion charset sql a ecrire : "."SET NAMES "._q($charset), 'sqlite.'._LOG_ERREUR); # return spip_sqlite_query("SET NAMES ". spip_sqlite_quote($charset), $serveur); //<-- Passe pas ! } /** - * Retourne une ressource de la liste des tables de la base de données + * Retourne une ressource de la liste des tables de la base de données * * @param string $match * Filtre sur tables à récupérer @@ -1564,8 +1715,8 @@ function spip_sqlite_set_charset($charset, $serveur = '', $requeter = true){ * false pour retourner le texte de la requête. * @return ressource * Ressource à utiliser avec sql_fetch() -**/ -function spip_sqlite_showbase($match, $serveur = '', $requeter = true){ + **/ +function spip_sqlite_showbase($match, $serveur = '', $requeter = true) { // type est le type d'entrée : table / index / view // on ne retourne que les tables (?) et non les vues... # ESCAPE non supporte par les versions sqlite <3 @@ -1578,7 +1729,9 @@ function spip_sqlite_showbase($match, $serveur = '', $requeter = true){ $match = str_replace("[[TIRETBAS]]", "_", $match); $match = str_replace("[[POURCENT]]", "%", $match); $match = "^$match$"; - return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP "._q($match), $serveur, $requeter); + + return spip_sqlite_query("SELECT name FROM sqlite_master WHERE type='table' AND tbl_name REGEXP " . _q($match), + $serveur, $requeter); } define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^()]*\)[^()]*)*[^()]*)\)[^()]*$/'); @@ -1591,49 +1744,54 @@ define('_SQLITE_RE_SHOW_TABLE', '/^[^(),]*\(((?:[^()]*\((?:[^()]*\([^()]*\))?[^( * * - `field` (tableau colonne => description SQL) et * - `key` (tableau type de clé => colonnes) - * - * @param string $nom_table Nom de la table SQL - * @param string $serveur Nom de la connexion - * @param bool $requeter Exécuter la requête, sinon la retourner + * + * @param string $nom_table Nom de la table SQL + * @param string $serveur Nom de la connexion + * @param bool $requeter Exécuter la requête, sinon la retourner * @return array|string * - chaîne vide si pas de description obtenue * - string Texte de la requête si demandé * - array description de la table sinon */ -function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){ +function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true) { $query = 'SELECT sql, type FROM' - .' (SELECT * FROM sqlite_master UNION ALL' - .' SELECT * FROM sqlite_temp_master)' - ." WHERE tbl_name LIKE '$nom_table'" - ." AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'" - .' ORDER BY substr(type,2,1), name'; + . ' (SELECT * FROM sqlite_master UNION ALL' + . ' SELECT * FROM sqlite_temp_master)' + . " WHERE tbl_name LIKE '$nom_table'" + . " AND type!='meta' AND sql NOT NULL AND name NOT LIKE 'sqlite_%'" + . ' ORDER BY substr(type,2,1), name'; $a = spip_sqlite_query($query, $serveur, $requeter); - if (!$a) return ""; - if (!$requeter) return $a; - if (!($a = spip_sqlite_fetch($a, null, $serveur))) return ""; - $vue = ($a['type']=='view'); // table | vue + if (!$a) { + return ""; + } + if (!$requeter) { + return $a; + } + if (!($a = spip_sqlite_fetch($a, null, $serveur))) { + return ""; + } + $vue = ($a['type'] == 'view'); // table | vue // c'est une table // il faut parser le create - if (!$vue){ - if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)){ + if (!$vue) { + if (!preg_match(_SQLITE_RE_SHOW_TABLE, array_shift($a), $r)) { return ""; - } - else { + } else { $desc = $r[1]; // extraction d'une KEY éventuelle en prenant garde de ne pas // relever un champ dont le nom contient KEY (ex. ID_WHISKEY) if (preg_match("/^(.*?),([^,]*\sKEY[ (].*)$/s", $desc, $r)) { $namedkeys = $r[2]; $desc = $r[1]; - } - else + } else { $namedkeys = ""; + } $fields = array(); - $keys = array(); + $keys = array(); // enlever les contenus des valeurs DEFAULT 'xxx' qui pourraient perturber // par exemple s'il contiennent une virgule. @@ -1643,7 +1801,7 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){ // separer toutes les descriptions de champs, separes par des virgules # /!\ explode peut exploser aussi DECIMAL(10,2) ! $k_precedent = null; - foreach (explode(",", $desc) as $v){ + foreach (explode(",", $desc) as $v) { preg_match("/^\s*([^\s]+)\s+(.*)/", $v, $r); // Les cles de champs peuvent etre entourees @@ -1652,7 +1810,9 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){ $k = strtolower(query_reinjecte_textes($r[1], $echaps)); // champ, "champ", [champ]... if ($char = strpbrk($k[0], '\'"[`')) { $k = trim($k, $char); - if ($char == '[') $k = rtrim($k, ']'); + if ($char == '[') { + $k = rtrim($k, ']'); + } } $def = query_reinjecte_textes($r[2], $echaps); // valeur du champ @@ -1661,10 +1821,10 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){ $fields[$k_precedent] .= ',' . $k . ' ' . $def; continue; } - + $fields[$k] = $def; $k_precedent = $k; - + // la primary key peut etre dans une des descriptions de champs // et non en fin de table, cas encore decouvert avec Sqlite Manager if (stripos($r[2], 'PRIMARY KEY') !== false) { @@ -1672,44 +1832,50 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){ } } // key inclues dans la requete - foreach(preg_split('/\)\s*(,|$)/',$namedkeys) as $v) { - if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/",$v,$r)) { + foreach (preg_split('/\)\s*(,|$)/', $namedkeys) as $v) { + if (preg_match("/^\s*([^(]*)\(([^(]*(\(\d+\))?)$/", $v, $r)) { $k = str_replace("`", '', trim($r[1])); $t = trim(strtolower(str_replace("`", '', $r[2])), '"'); - if ($k && !isset($keys[$k])) $keys[$k] = $t; else $keys[] = $t; + if ($k && !isset($keys[$k])) { + $keys[$k] = $t; + } else { + $keys[] = $t; + } } } // sinon ajouter les key index $query = 'SELECT name,sql FROM' - .' (SELECT * FROM sqlite_master UNION ALL' - .' SELECT * FROM sqlite_temp_master)' - ." WHERE tbl_name LIKE '$nom_table'" - ." AND type='index' AND name NOT LIKE 'sqlite_%'" - .'ORDER BY substr(type,2,1), name'; + . ' (SELECT * FROM sqlite_master UNION ALL' + . ' SELECT * FROM sqlite_temp_master)' + . " WHERE tbl_name LIKE '$nom_table'" + . " AND type='index' AND name NOT LIKE 'sqlite_%'" + . 'ORDER BY substr(type,2,1), name'; $a = spip_sqlite_query($query, $serveur, $requeter); - while ($r = spip_sqlite_fetch($a, null, $serveur)){ - $key = str_replace($nom_table.'_', '', $r['name']); // enlever le nom de la table ajoute a l'index + while ($r = spip_sqlite_fetch($a, null, $serveur)) { + $key = str_replace($nom_table . '_', '', $r['name']); // enlever le nom de la table ajoute a l'index $keytype = "KEY"; - if (strpos($r['sql'],"UNIQUE INDEX")!==false){ + if (strpos($r['sql'], "UNIQUE INDEX") !== false) { $keytype = "UNIQUE KEY"; } $colonnes = preg_replace(',.*\((.*)\).*,', '$1', $r['sql']); - $keys[$keytype.' '.$key] = $colonnes; + $keys[$keytype . ' ' . $key] = $colonnes; } } - } - // c'est une vue, on liste les champs disponibles simplement + } // c'est une vue, on liste les champs disponibles simplement else { - if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)){ // limit 1 + if ($res = sql_fetsel('*', $nom_table, '', '', '', '1', '', $serveur)) { // limit 1 $fields = array(); - foreach ($res as $c => $v) $fields[$c] = ''; + foreach ($res as $c => $v) { + $fields[$c] = ''; + } $keys = array(); } else { return ""; } } + return array('field' => $fields, 'key' => $keys); } @@ -1717,7 +1883,7 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){ /** * Met à jour des enregistrements d'une table SQL - * + * * @param string $table * Nom de la table * @param array $champs @@ -1736,19 +1902,21 @@ function spip_sqlite_showtable($nom_table, $serveur = '', $requeter = true){ * - true si la requête a réussie, false sinon * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif */ -function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true){ +function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = '', $requeter = true) { // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur); $set = array(); - foreach ($champs as $champ => $val) - $set[] = $champ."=$val"; - if (!empty($set)) + foreach ($champs as $champ => $val) { + $set[] = $champ . "=$val"; + } + if (!empty($set)) { return spip_sqlite_query( _sqlite_calculer_expression('UPDATE', $table, ',') - ._sqlite_calculer_expression('SET', $set, ',') - ._sqlite_calculer_expression('WHERE', $where), + . _sqlite_calculer_expression('SET', $set, ',') + . _sqlite_calculer_expression('WHERE', $where), $serveur, $requeter); + } } @@ -1776,24 +1944,31 @@ function spip_sqlite_update($table, $champs, $where = '', $desc = '', $serveur = * - true si la requête a réussie, false sinon * - array Tableau décrivant la requête et son temps d'exécution si var_profile est actif */ -function spip_sqlite_updateq($table, $champs, $where = '', $desc = array(), $serveur = '', $requeter = true){ +function spip_sqlite_updateq($table, $champs, $where = '', $desc = array(), $serveur = '', $requeter = true) { - if (!$champs) return; - if (!$desc) $desc = description_table($table, $serveur); - if (!$desc) die("$table insertion sans description"); + if (!$champs) { + return; + } + if (!$desc) { + $desc = description_table($table, $serveur); + } + if (!$desc) { + die("$table insertion sans description"); + } $fields = $desc['field']; // recherche de champs 'timestamp' pour mise a jour auto de ceux-ci $champs = _sqlite_ajouter_champs_timestamp($table, $champs, $desc, $serveur); $set = array(); - foreach ($champs as $champ => $val){ - $set[] = $champ.'='._sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : ''); + foreach ($champs as $champ => $val) { + $set[] = $champ . '=' . _sqlite_calculer_cite($val, isset($fields[$champ]) ? $fields[$champ] : ''); } + return spip_sqlite_query( _sqlite_calculer_expression('UPDATE', $table, ',') - ._sqlite_calculer_expression('SET', $set, ',') - ._sqlite_calculer_expression('WHERE', $where), + . _sqlite_calculer_expression('SET', $set, ',') + . _sqlite_calculer_expression('WHERE', $where), $serveur, $requeter); } @@ -1812,11 +1987,15 @@ function spip_sqlite_updateq($table, $champs, $where = '', $desc = array(), $ser * * @return void */ -function _sqlite_init(){ - if (!defined('_DIR_DB')) define('_DIR_DB', _DIR_ETC.'bases/'); - if (!defined('_SQLITE_CHMOD')) define('_SQLITE_CHMOD', _SPIP_CHMOD); +function _sqlite_init() { + if (!defined('_DIR_DB')) { + define('_DIR_DB', _DIR_ETC . 'bases/'); + } + if (!defined('_SQLITE_CHMOD')) { + define('_SQLITE_CHMOD', _SPIP_CHMOD); + } - if (!is_dir($d = _DIR_DB)){ + if (!is_dir($d = _DIR_DB)) { include_spip('inc/flock'); sous_repertoire($d); } @@ -1833,28 +2012,36 @@ function _sqlite_init(){ * @param bool $requeter * @return bool|int */ -function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true){ - if ($link==='') $link = _sqlite_link($serveur); - if (!$link) return false; - if ($link instanceof PDO){ +function _sqlite_is_version($version = '', $link = '', $serveur = '', $requeter = true) { + if ($link === '') { + $link = _sqlite_link($serveur); + } + if (!$link) { + return false; + } + if ($link instanceof PDO) { $v = 3; } else { $v = 2; } - if (!$version) return $v; - return ($version==$v); + if (!$version) { + return $v; + } + + return ($version == $v); } /** * Retrouver un link d'une connexion SQLite - * + * * @param string $serveur Nom du serveur * @return Object Information de connexion pour SQLite */ -function _sqlite_link($serveur = ''){ +function _sqlite_link($serveur = '') { $link = &$GLOBALS['connexions'][$serveur ? $serveur : 0]['link']; + return $link; } @@ -1865,73 +2052,81 @@ function _sqlite_link($serveur = ''){ /** * Renvoie les bons echappements (mais pas sur les fonctions comme NOW()) * - * @param string|number $v Texte ou nombre à échapper - * @param string $type Type de donnée attendue, description SQL de la colonne de destination + * @param string|number $v Texte ou nombre à échapper + * @param string $type Type de donnée attendue, description SQL de la colonne de destination * @return string|number Texte ou nombre échappé */ -function _sqlite_calculer_cite($v, $type){ - if ($type){ - if(is_null($v) - AND stripos($type,"NOT NULL")===false) return 'NULL'; // null php se traduit en NULL SQL - - if (sql_test_date($type) AND preg_match('/^\w+\(/', $v)) +function _sqlite_calculer_cite($v, $type) { + if ($type) { + if (is_null($v) + AND stripos($type, "NOT NULL") === false + ) { + return 'NULL'; + } // null php se traduit en NULL SQL + + if (sql_test_date($type) AND preg_match('/^\w+\(/', $v)) { return $v; - if (sql_test_int($type)){ - if (is_numeric($v)) + } + if (sql_test_int($type)) { + if (is_numeric($v)) { return $v; - elseif (ctype_xdigit(substr($v, 2)) AND strncmp($v, '0x', 2)==0) + } elseif (ctype_xdigit(substr($v, 2)) AND strncmp($v, '0x', 2) == 0) { return hexdec(substr($v, 2)); - else + } else { return intval($v); + } } - } - else { + } else { // si on ne connait pas le type on le deduit de $v autant que possible - if (is_numeric($v)) + if (is_numeric($v)) { return strval($v); + } } - if (function_exists('sqlite_escape_string')){ - return "'".sqlite_escape_string($v)."'"; + if (function_exists('sqlite_escape_string')) { + return "'" . sqlite_escape_string($v) . "'"; } // trouver un link sqlite3 pour faire l'echappement - foreach ($GLOBALS['connexions'] as $s){ - if (_sqlite_is_version(3, $l = $s['link'])){ + foreach ($GLOBALS['connexions'] as $s) { + if (_sqlite_is_version(3, $l = $s['link'])) { return $l->quote($v); } } // echapper les ' en '' - spip_log("Pas de methode sqlite_escape_string ni ->quote pour echapper","sqlite."._LOG_INFO_IMPORTANTE); - return ("'" . str_replace("'","''",$v) . "'"); + spip_log("Pas de methode sqlite_escape_string ni ->quote pour echapper", "sqlite." . _LOG_INFO_IMPORTANTE); + + return ("'" . str_replace("'", "''", $v) . "'"); } /** * Calcule un expression pour une requête, en cumulant chaque élément * avec l'opérateur de liaison ($join) indiqué - * + * * Renvoie grosso modo "$expression join($join, $v)" - * + * * @param string $expression Mot clé de l'expression, tel que "WHERE" ou "ORDER BY" - * @param array|string $v Données de l'expression - * @param string $join Si les données sont un tableau, elles seront groupées par cette jointure + * @param array|string $v Données de l'expression + * @param string $join Si les données sont un tableau, elles seront groupées par cette jointure * @return string Texte de l'expression, une partie donc, du texte la requête. */ -function _sqlite_calculer_expression($expression, $v, $join = 'AND'){ - if (empty($v)) +function _sqlite_calculer_expression($expression, $v, $join = 'AND') { + if (empty($v)) { return ''; + } $exp = "\n$expression "; - if (!is_array($v)){ - return $exp.$v; + if (!is_array($v)) { + return $exp . $v; } else { - if (strtoupper($join)==='AND') - return $exp.join("\n\t$join ", array_map('_sqlite_calculer_where', $v)); - else - return $exp.join($join, $v); + if (strtoupper($join) === 'AND') { + return $exp . join("\n\t$join ", array_map('_sqlite_calculer_where', $v)); + } else { + return $exp . join($join, $v); + } } } @@ -1947,35 +2142,37 @@ function _sqlite_calculer_expression($expression, $v, $join = 'AND'){ * @param string|array $orderby Texte du orderby à préparer * @return string Texte du orderby préparé */ -function _sqlite_calculer_order($orderby){ +function _sqlite_calculer_order($orderby) { return (is_array($orderby)) ? join(", ", $orderby) : $orderby; } /** * Renvoie des `nom AS alias` - * + * * @param array $args * @return string Sélection de colonnes pour une clause SELECT */ -function _sqlite_calculer_select_as($args){ +function _sqlite_calculer_select_as($args) { $res = ''; - foreach ($args as $k => $v){ - if (substr($k, -1)=='@'){ + foreach ($args as $k => $v) { + if (substr($k, -1) == '@') { // c'est une jointure qui se refere au from precedent // pas de virgule - $res .= ' '.$v; - } - else { - if (!is_numeric($k)){ + $res .= ' ' . $v; + } else { + if (!is_numeric($k)) { $p = strpos($v, " "); - if ($p) - $v = substr($v, 0, $p)." AS '$k'".substr($v, $p); - else $v .= " AS '$k'"; + if ($p) { + $v = substr($v, 0, $p) . " AS '$k'" . substr($v, $p); + } else { + $v .= " AS '$k'"; + } } - $res .= ', '.$v; + $res .= ', ' . $v; } } + return substr($res, 2); } @@ -1983,9 +2180,9 @@ function _sqlite_calculer_select_as($args){ /** * Prépare une clause WHERE pour SQLite * - * Retourne une chaîne avec les bonnes parenthèses pour la + * Retourne une chaîne avec les bonnes parenthèses pour la * contrainte indiquée, au format donnée par le compilateur - * + * * @param array|string $v * Description des contraintes * - string : Texte du where @@ -1998,22 +2195,25 @@ function _sqlite_calculer_select_as($args){ * @return string * Contrainte pour clause WHERE */ -function _sqlite_calculer_where($v){ - if (!is_array($v)) +function _sqlite_calculer_where($v) { + if (!is_array($v)) { return $v; + } $op = array_shift($v); - if (!($n = count($v))) + if (!($n = count($v))) { return $op; - else { + } else { $arg = _sqlite_calculer_where(array_shift($v)); - if ($n==1){ + if ($n == 1) { return "$op($arg)"; } else { $arg2 = _sqlite_calculer_where(array_shift($v)); - if ($n==2){ + if ($n == 2) { return "($arg $op $arg2)"; - } else return "($arg $op ($arg2) : $v[0])"; + } else { + return "($arg $op ($arg2) : $v[0])"; + } } } } @@ -2029,23 +2229,26 @@ function _sqlite_calculer_where($v){ * @param string $version * @return array|bool */ -function _sqlite_charger_version($version = ''){ +function _sqlite_charger_version($version = '') { $versions = array(); // version 2 - if (!$version || $version==2){ - if (charger_php_extension('sqlite')){ + if (!$version || $version == 2) { + if (charger_php_extension('sqlite')) { $versions[] = 2; } } // version 3 - if (!$version || $version==3){ - if (charger_php_extension('pdo') && charger_php_extension('pdo_sqlite')){ + if (!$version || $version == 3) { + if (charger_php_extension('pdo') && charger_php_extension('pdo_sqlite')) { $versions[] = 3; } } - if ($version) return in_array($version, $versions); + if ($version) { + return in_array($version, $versions); + } + return $versions; } @@ -2082,37 +2285,42 @@ function _sqlite_charger_version($version = ''){ * @return bool * true si OK, false sinon. */ -function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = ''){ +function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') { - if (is_array($table)){ + if (is_array($table)) { reset($table); - list($table_origine,$table_destination) = each($table); + list($table_origine, $table_destination) = each($table); } else { $table_origine = $table_destination = $table; } // ne prend actuellement qu'un changement // mais pourra etre adapte pour changer plus qu'une colonne a la fois - if (is_array($colonne)){ + if (is_array($colonne)) { reset($colonne); - list($colonne_origine,$colonne_destination) = each($colonne); + list($colonne_origine, $colonne_destination) = each($colonne); } else { $colonne_origine = $colonne_destination = $colonne; } - if (!isset($opt['field'])) $opt['field'] = array(); - if (!isset($opt['key'])) $opt['key'] = array(); + if (!isset($opt['field'])) { + $opt['field'] = array(); + } + if (!isset($opt['key'])) { + $opt['key'] = array(); + } // si les noms de tables sont differents, pas besoin de table temporaire // on prendra directement le nom de la future table - $meme_table = ($table_origine==$table_destination); + $meme_table = ($table_origine == $table_destination); $def_origine = sql_showtable($table_origine, false, $serveur); - if (!$def_origine OR !isset($def_origine['field'])){ - spip_log("Alter table impossible sur $table_origine : table non trouvee",'sqlite'._LOG_ERREUR); + if (!$def_origine OR !isset($def_origine['field'])) { + spip_log("Alter table impossible sur $table_origine : table non trouvee", 'sqlite' . _LOG_ERREUR); + return false; } - $table_tmp = $table_origine.'_tmp'; + $table_tmp = $table_origine . '_tmp'; // 1) creer une table temporaire avec les modifications // - DROP : suppression de la colonne @@ -2124,11 +2332,11 @@ function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') // pour le INSERT INTO plus loin // stocker la correspondance nouvelles->anciennes colonnes $fields_correspondances = array(); - foreach ($def_origine['field'] as $c => $d){ + foreach ($def_origine['field'] as $c => $d) { - if ($colonne_origine && ($c==$colonne_origine)){ + if ($colonne_origine && ($c == $colonne_origine)) { // si pas DROP - if ($colonne_destination){ + if ($colonne_destination) { $fields[$colonne_destination] = $opt['field'][$colonne_destination]; $fields_correspondances[$colonne_destination] = $c; } @@ -2138,18 +2346,19 @@ function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') } } // cas de ADD sqlite2 (ajout du champ en fin de table): - if (!$colonne_origine && $colonne_destination){ + if (!$colonne_origine && $colonne_destination) { $fields[$colonne_destination] = $opt['field'][$colonne_destination]; } // key... $keys = array(); - foreach ($def_origine['key'] as $c => $d){ + foreach ($def_origine['key'] as $c => $d) { $c = str_replace($colonne_origine, $colonne_destination, $c); $d = str_replace($colonne_origine, $colonne_destination, $d); // seulement si on ne supprime pas la colonne ! - if ($d) + if ($d) { $keys[$c] = $d; + } } // autres keys, on merge @@ -2159,9 +2368,9 @@ function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') // copier dans destination (si differente de origine), sinon tmp $table_copie = ($meme_table) ? $table_tmp : $table_destination; $autoinc = (isset($keys['PRIMARY KEY']) - AND $keys['PRIMARY KEY'] - AND stripos($keys['PRIMARY KEY'],',')===false - AND stripos($fields[$keys['PRIMARY KEY']],'default')===false); + AND $keys['PRIMARY KEY'] + AND stripos($keys['PRIMARY KEY'], ',') === false + AND stripos($fields[$keys['PRIMARY KEY']], 'default') === false); if ($q = _sqlite_requete_create( $table_copie, @@ -2170,7 +2379,8 @@ function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') $autoinc, $temporary = false, $ifnotexists = true, - $serveur)){ + $serveur) + ) { $queries[] = $q; } @@ -2186,8 +2396,8 @@ function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') // 4) renommer la table temporaire // avec le nom de la table destination // si necessaire - if ($meme_table){ - if (_sqlite_is_version(3, '', $serveur)){ + if ($meme_table) { + if (_sqlite_is_version(3, '', $serveur)) { $queries[] = "ALTER TABLE $table_copie RENAME TO $table_destination"; } else { $queries[] = _sqlite_requete_create( @@ -2204,25 +2414,25 @@ function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') } // 5) remettre les index ! - foreach ($keys as $k => $v){ - if ($k=='PRIMARY KEY'){ - } - else { + foreach ($keys as $k => $v) { + if ($k == 'PRIMARY KEY') { + } else { // enlever KEY $k = substr($k, 4); - $queries[] = "CREATE INDEX $table_destination"."_$k ON $table_destination ($v)"; + $queries[] = "CREATE INDEX $table_destination" . "_$k ON $table_destination ($v)"; } } - if (count($queries)){ + if (count($queries)) { spip_sqlite::demarrer_transaction($serveur); // il faut les faire une par une car $query = join('; ', $queries).";"; ne fonctionne pas - foreach ($queries as $q){ - if (!spip_sqlite::executer_requete($q, $serveur)){ + foreach ($queries as $q) { + if (!spip_sqlite::executer_requete($q, $serveur)) { spip_log(_LOG_GRAVITE_ERREUR, "SQLite : ALTER TABLE table :" - ." Erreur a l'execution de la requete : $q", 'sqlite'); + . " Erreur a l'execution de la requete : $q", 'sqlite'); spip_sqlite::annuler_transaction($serveur); + return false; } } @@ -2239,7 +2449,7 @@ function _sqlite_modifier_table($table, $colonne, $opt = array(), $serveur = '') * * @return array */ -function _sqlite_ref_fonctions(){ +function _sqlite_ref_fonctions() { $fonctions = array( 'alter' => 'spip_sqlite_alter', 'count' => 'spip_sqlite_count', @@ -2305,71 +2515,75 @@ function _sqlite_ref_fonctions(){ * @param bool $autoinc * @return mixed */ -function _sqlite_remplacements_definitions_table($query, $autoinc = false){ +function _sqlite_remplacements_definitions_table($query, $autoinc = false) { // quelques remplacements $num = "(\s*\([0-9]*\))?"; $enum = "(\s*\([^\)]*\))?"; $remplace = array( - '/enum'.$enum.'/is' => 'VARCHAR(255)', + '/enum' . $enum . '/is' => 'VARCHAR(255)', '/COLLATE \w+_bin/is' => 'COLLATE BINARY', '/COLLATE \w+_ci/is' => 'COLLATE NOCASE', '/auto_increment/is' => '', '/(timestamp .* )ON .*$/is' => '\\1', '/character set \w+/is' => '', - '/((big|small|medium|tiny)?int(eger)?)'.$num.'\s*unsigned/is' => '\\1 UNSIGNED', + '/((big|small|medium|tiny)?int(eger)?)' . $num . '\s*unsigned/is' => '\\1 UNSIGNED', '/(text\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''", - '/((char|varchar)'.$num.'\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''", + '/((char|varchar)' . $num . '\s+not\s+null(\s+collate\s+\w+)?)\s*$/is' => "\\1 DEFAULT ''", '/(datetime\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00 00:00:00'", '/(date\s+not\s+null)\s*$/is' => "\\1 DEFAULT '0000-00-00'", ); // pour l'autoincrement, il faut des INTEGER NOT NULL PRIMARY KEY $remplace_autocinc = array( - '/(big|small|medium|tiny)?int(eger)?'.$num.'/is' => 'INTEGER' + '/(big|small|medium|tiny)?int(eger)?' . $num . '/is' => 'INTEGER' ); // pour les int non autoincrement, il faut un DEFAULT $remplace_nonautocinc = array( - '/((big|small|medium|tiny)?int(eger)?'.$num.'\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0", + '/((big|small|medium|tiny)?int(eger)?' . $num . '\s+not\s+null)\s*$/is' => "\\1 DEFAULT 0", ); - if (is_string($query)){ + if (is_string($query)) { $query = preg_replace(array_keys($remplace), $remplace, $query); - if ($autoinc OR preg_match(',AUTO_INCREMENT,is',$query)) + if ($autoinc OR preg_match(',AUTO_INCREMENT,is', $query)) { $query = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query); - else{ + } else { $query = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query); $query = _sqlite_collate_ci($query); } - } - elseif(is_array($query)){ - foreach($query as $k=>$q) { - $ai = ($autoinc?$k==$autoinc:preg_match(',AUTO_INCREMENT,is',$q)); + } elseif (is_array($query)) { + foreach ($query as $k => $q) { + $ai = ($autoinc ? $k == $autoinc : preg_match(',AUTO_INCREMENT,is', $q)); $query[$k] = preg_replace(array_keys($remplace), $remplace, $query[$k]); - if ($ai) + if ($ai) { $query[$k] = preg_replace(array_keys($remplace_autocinc), $remplace_autocinc, $query[$k]); - else{ + } else { $query[$k] = preg_replace(array_keys($remplace_nonautocinc), $remplace_nonautocinc, $query[$k]); $query[$k] = _sqlite_collate_ci($query[$k]); } } } + return $query; } /** * Definir la collation d'un champ en fonction de si une collation est deja explicite * et du par defaut que l'on veut NOCASE + * * @param string $champ * @return string */ -function _sqlite_collate_ci($champ){ - if (stripos($champ,"COLLATE")!==false) +function _sqlite_collate_ci($champ) { + if (stripos($champ, "COLLATE") !== false) { return $champ; - if (stripos($champ,"BINARY")!==false) - return str_ireplace("BINARY","COLLATE BINARY",$champ); - if (preg_match(",^(char|varchar|(long|small|medium|tiny)?text),i",$champ)) + } + if (stripos($champ, "BINARY") !== false) { + return str_ireplace("BINARY", "COLLATE BINARY", $champ); + } + if (preg_match(",^(char|varchar|(long|small|medium|tiny)?text),i", $champ)) { return $champ . " COLLATE NOCASE"; + } return $champ; } @@ -2391,22 +2605,32 @@ function _sqlite_collate_ci($champ){ * @param bool $requeter * @return bool|string */ -function _sqlite_requete_create($nom, $champs, $cles, $autoinc = false, $temporary = false, $_ifnotexists = true, $serveur = '', $requeter = true){ +function _sqlite_requete_create( + $nom, + $champs, + $cles, + $autoinc = false, + $temporary = false, + $_ifnotexists = true, + $serveur = '', + $requeter = true +) { $query = $keys = $s = $p = ''; // certains plugins declarent les tables (permet leur inclusion dans le dump) // sans les renseigner (laisse le compilo recuperer la description) - if (!is_array($champs) || !is_array($cles)) + if (!is_array($champs) || !is_array($cles)) { return; + } // sqlite ne gere pas KEY tout court dans une requete CREATE TABLE // il faut passer par des create index // Il gere par contre primary key ! // Soit la PK est definie dans les cles, soit dans un champs $c = ""; // le champ de cle primaire - if (!isset($cles[$pk = "PRIMARY KEY"]) OR !$c = $cles[$pk]){ - foreach ($champs as $k => $v){ - if (false!==stripos($v, $pk)){ + if (!isset($cles[$pk = "PRIMARY KEY"]) OR !$c = $cles[$pk]) { + foreach ($champs as $k => $v) { + if (false !== stripos($v, $pk)) { $c = $k; // on n'en a plus besoin dans field, vu que defini dans key $champs[$k] = preg_replace("/$pk/is", '', $champs[$k]); @@ -2414,37 +2638,45 @@ function _sqlite_requete_create($nom, $champs, $cles, $autoinc = false, $tempora } } } - if ($c) $keys = "\n\t\t$pk ($c)"; + if ($c) { + $keys = "\n\t\t$pk ($c)"; + } // Pas de DEFAULT 0 sur les cles primaires en auto-increment if (isset($champs[$c]) - AND stripos($champs[$c],"default 0")!==false){ - $champs[$c] = trim(str_ireplace("default 0","",$champs[$c])); + AND stripos($champs[$c], "default 0") !== false + ) { + $champs[$c] = trim(str_ireplace("default 0", "", $champs[$c])); } - $champs = _sqlite_remplacements_definitions_table($champs, $autoinc?$c:false); - foreach ($champs as $k => $v){ + $champs = _sqlite_remplacements_definitions_table($champs, $autoinc ? $c : false); + foreach ($champs as $k => $v) { $query .= "$s\n\t\t$k $v"; $s = ","; } $ifnotexists = ""; - if ($_ifnotexists){ + if ($_ifnotexists) { - $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version",$serveur),'',$serveur); - if (!function_exists('spip_version_compare')) include_spip('plugins/installer'); + $version = spip_sqlite_fetch(spip_sqlite_query("select sqlite_version() AS sqlite_version", $serveur), '', + $serveur); + if (!function_exists('spip_version_compare')) { + include_spip('plugins/installer'); + } - if ($version AND spip_version_compare($version['sqlite_version'],'3.3.0','>=')) { + if ($version AND spip_version_compare($version['sqlite_version'], '3.3.0', '>=')) { $ifnotexists = ' IF NOT EXISTS'; } else { /* simuler le IF EXISTS - version 2 et sqlite < 3.3a */ $a = spip_sqlite_showtable($table, $serveur); - if (isset($a['key']['KEY '.$nom])) return true; + if (isset($a['key']['KEY ' . $nom])) { + return true; + } } } $temporary = $temporary ? ' TEMPORARY' : ''; - $q = "CREATE$temporary TABLE$ifnotexists $nom ($query".($keys ? ",$keys" : '').")\n"; + $q = "CREATE$temporary TABLE$ifnotexists $nom ($query" . ($keys ? ",$keys" : '') . ")\n"; return $q; } @@ -2466,16 +2698,18 @@ function _sqlite_requete_create($nom, $champs, $cles, $autoinc = false, $tempora * @param string $serveur * @return */ -function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = ''){ +function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur = '') { static $tables = array(); - if (!isset($tables[$table])){ + if (!isset($tables[$table])) { - if (!$desc){ + if (!$desc) { $trouver_table = charger_fonction('trouver_table', 'base'); $desc = $trouver_table($table, $serveur); // si pas de description, on ne fait rien, ou on die() ? - if (!$desc) return $couples; + if (!$desc) { + return $couples; + } } // recherche des champs avec simplement 'TIMESTAMP' @@ -2484,31 +2718,32 @@ function _sqlite_ajouter_champs_timestamp($table, $couples, $desc = '', $serveur // mais ceux-ci ne sont pas utilises dans le core $tables[$table] = array(); - foreach ($desc['field'] as $k => $v){ - if (strpos(strtolower(ltrim($v)), 'timestamp')===0) + foreach ($desc['field'] as $k => $v) { + if (strpos(strtolower(ltrim($v)), 'timestamp') === 0) { $tables[$table][$k] = "datetime('now')"; + } } } // ajout des champs type 'timestamp' absents - return array_merge($tables[$table],$couples); + return array_merge($tables[$table], $couples); } /** * Renvoyer la liste des versions sqlite disponibles * sur le serveur - * + * * @return array|bool */ -function spip_versions_sqlite(){ +function spip_versions_sqlite() { return _sqlite_charger_version(); } /** * Gère l'envoi et la réception de requêtes à SQLite, qui peuvent être * encadrées de transactions. -**/ + **/ class spip_sqlite { /** @var sqlite_requeteur[] Liste des instances de requêteurs créés */ static $requeteurs = array(); @@ -2523,13 +2758,15 @@ class spip_sqlite { * donnée * * @param string $serveur - * Nom du connecteur + * Nom du connecteur * @return sqlite_requeteur - * Instance unique du requêteur - **/ - static function requeteur($serveur){ - if (!isset(spip_sqlite::$requeteurs[$serveur])) + * Instance unique du requêteur + **/ + static function requeteur($serveur) { + if (!isset(spip_sqlite::$requeteurs[$serveur])) { spip_sqlite::$requeteurs[$serveur] = new sqlite_requeteur($serveur); + } + return spip_sqlite::$requeteurs[$serveur]; } @@ -2538,75 +2775,81 @@ class spip_sqlite { * * Adapte la requête au format plus ou moins MySQL par un format * compris de SQLite. - * + * * Change les préfixes de tables SPIP par ceux véritables - * - * @param string $query Requête à préparer - * @param string $serveur Nom de la connexion + * + * @param string $query Requête à préparer + * @param string $serveur Nom de la connexion * @return string Requête préparée */ - static function traduire_requete($query, $serveur){ + static function traduire_requete($query, $serveur) { $requeteur = spip_sqlite::requeteur($serveur); - $traducteur = new sqlite_traducteur($query, $requeteur->prefixe,$requeteur->sqlite_version); + $traducteur = new sqlite_traducteur($query, $requeteur->prefixe, $requeteur->sqlite_version); + return $traducteur->traduire_requete(); } /** * Démarre une transaction - * - * @param string $serveur Nom de la connexion - **/ - static function demarrer_transaction($serveur){ - spip_sqlite::executer_requete("BEGIN TRANSACTION",$serveur); + * + * @param string $serveur Nom de la connexion + **/ + static function demarrer_transaction($serveur) { + spip_sqlite::executer_requete("BEGIN TRANSACTION", $serveur); spip_sqlite::$transaction_en_cours[$serveur] = true; } /** * Exécute la requête donnée - * - * @param string $query Requête - * @param string $serveur Nom de la connexion - * @param null|bool $tracer Demander des statistiques (temps) ? - **/ - static function executer_requete($query, $serveur, $tracer = null){ + * + * @param string $query Requête + * @param string $serveur Nom de la connexion + * @param null|bool $tracer Demander des statistiques (temps) ? + **/ + static function executer_requete($query, $serveur, $tracer = null) { $requeteur = spip_sqlite::requeteur($serveur); + return $requeteur->executer_requete($query, $tracer); } /** * Obtient l'identifiant de la dernière ligne insérée ou modifiée - * - * @param string $serveur Nom de la connexion + * + * @param string $serveur Nom de la connexion * return int Identifiant - **/ - static function last_insert_id($serveur){ + **/ + static function last_insert_id($serveur) { $requeteur = spip_sqlite::requeteur($serveur); + return $requeteur->last_insert_id($serveur); } /** * Annule une transaction - * - * @param string $serveur Nom de la connexion - **/ - static function annuler_transaction($serveur){ - spip_sqlite::executer_requete("ROLLBACK",$serveur); + * + * @param string $serveur Nom de la connexion + **/ + static function annuler_transaction($serveur) { + spip_sqlite::executer_requete("ROLLBACK", $serveur); spip_sqlite::$transaction_en_cours[$serveur] = false; } /** * Termine une transaction - * - * @param string $serveur Nom de la connexion - **/ - static function finir_transaction($serveur){ + * + * @param string $serveur Nom de la connexion + **/ + static function finir_transaction($serveur) { // si pas de transaction en cours, ne rien faire et le dire if (!isset (spip_sqlite::$transaction_en_cours[$serveur]) - OR spip_sqlite::$transaction_en_cours[$serveur]==false) + OR spip_sqlite::$transaction_en_cours[$serveur] == false + ) { return false; + } // sinon fermer la transaction et retourner true - spip_sqlite::executer_requete("COMMIT",$serveur); + spip_sqlite::executer_requete("COMMIT", $serveur); spip_sqlite::$transaction_en_cours[$serveur] = false; + return true; } } @@ -2619,17 +2862,18 @@ class spip_sqlite { * - peut corriger la syntaxe des requêtes pour la conformité à SQLite * - peut tracer les requêtes */ + class sqlite_requeteur { /** @var string Texte de la requête */ var $query = ''; // la requete /** @var string Nom de la connexion */ - var $serveur = ''; + var $serveur = ''; /** @var Ressource Identifiant de la connexion SQLite */ var $link = ''; /** @var string Prefixe des tables SPIP */ var $prefixe = ''; /** @var string Nom de la base de donnée */ - var $db = ''; + var $db = ''; /** @var bool Doit-on tracer les requetes (var_profile) ? */ var $tracer = false; // doit-on tracer les requetes (var_profile) @@ -2642,12 +2886,13 @@ class sqlite_requeteur { * @param string $serveur * @return bool */ - function __construct($serveur = ''){ + function __construct($serveur = '') { _sqlite_init(); $this->serveur = strtolower($serveur); - if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)){ - spip_log("Aucune connexion sqlite (link)", 'sqlite.'._LOG_ERREUR); + if (!($this->link = _sqlite_link($this->serveur)) && (!defined('_ECRIRE_INSTALL') || !_ECRIRE_INSTALL)) { + spip_log("Aucune connexion sqlite (link)", 'sqlite.' . _LOG_ERREUR); + return false; } @@ -2669,25 +2914,26 @@ class sqlite_requeteur { * true pour tracer la requête * @return bool|SQLiteResult */ - function executer_requete($query, $tracer = null){ - if (is_null($tracer)) + function executer_requete($query, $tracer = null) { + if (is_null($tracer)) { $tracer = $this->tracer; + } $err = ""; $t = 0; - if ($tracer){ + if ($tracer) { include_spip('public/tracer'); $t = trace_query_start(); } - + # spip_log("requete: $this->serveur >> $query",'sqlite.'._LOG_DEBUG); // boum ? pourquoi ? - if ($this->link){ + if ($this->link) { // memoriser la derniere erreur PHP vue - $e = (function_exists('error_get_last')?error_get_last():""); + $e = (function_exists('error_get_last') ? error_get_last() : ""); // sauver la derniere requete $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['last'] = $query; $GLOBALS['connexions'][$this->serveur ? $this->serveur : 0]['total_requetes']++; - if ($this->sqlite_version==3){ + if ($this->sqlite_version == 3) { $r = $this->link->query($query); // sauvegarde de la requete (elle y est deja dans $r->queryString) # $r->spipQueryString = $query; @@ -2696,47 +2942,48 @@ class sqlite_requeteur { // par une requete SELECT // aucune autre solution ne donne le nombre attendu :( ! // particulierement s'il y a des LIMIT dans la requete. - if (strtoupper(substr(ltrim($query), 0, 6))=='SELECT'){ - if ($r){ + if (strtoupper(substr(ltrim($query), 0, 6)) == 'SELECT') { + if ($r) { // noter le link et la query pour faire le comptage *si* on en a besoin - $r->spipSqliteRowCount = array($this->link,$query); - } - elseif ($r instanceof PDOStatement) { + $r->spipSqliteRowCount = array($this->link, $query); + } elseif ($r instanceof PDOStatement) { $r->spipSqliteRowCount = 0; } } - } - else { + } else { $r = sqlite_query($this->link, $query); } // loger les warnings/erreurs eventuels de sqlite remontant dans PHP - if ($err = (function_exists('error_get_last')?error_get_last():"") AND $err!=$e){ - $err = strip_tags($err['message'])." in ".$err['file']." line ".$err['line']; - spip_log("$err - ".$query, 'sqlite.'._LOG_ERREUR); + if ($err = (function_exists('error_get_last') ? error_get_last() : "") AND $err != $e) { + $err = strip_tags($err['message']) . " in " . $err['file'] . " line " . $err['line']; + spip_log("$err - " . $query, 'sqlite.' . _LOG_ERREUR); + } else { + $err = ""; } - else $err = ""; - } - else { + } else { $r = false; } - if (spip_sqlite_errno($this->serveur)) + if (spip_sqlite_errno($this->serveur)) { $err .= spip_sqlite_error($query, $this->serveur); + } + return $t ? trace_query_end($query, $t, $r, $err, $this->serveur) : $r; } /** * Obtient l'identifiant de la dernière ligne insérée ou modifiée - * + * * @return int - **/ - function last_insert_id(){ - if ($this->sqlite_version==3) + **/ + function last_insert_id() { + if ($this->sqlite_version == 3) { return $this->link->lastInsertId(); - else + } else { return sqlite_last_insert_rowid($this->link); + } } } @@ -2750,22 +2997,24 @@ class sqlite_traducteur { /** @var string $query Texte de la requête */ var $query = ''; /** @var string $prefixe Préfixe des tables */ - var $prefixe = ''; + var $prefixe = ''; /** @var string $sqlite_version Version de sqlite (2 ou 3) */ var $sqlite_version = ''; - + /** Pour les corrections à effectuer sur les requêtes : array(code=>'texte') trouvé - * @var array */ + * + * @var array + */ var $textes = array(); /** * Constructeur * - * @param string $query Requête à préparer - * @param string $prefixe Prefixe des tables à utiliser + * @param string $query Requête à préparer + * @param string $prefixe Prefixe des tables à utiliser * @param string $sqlite_version Version SQLite (2 ou 3) */ - function __construct($query, $prefixe, $sqlite_version){ + function __construct($query, $prefixe, $sqlite_version) { $this->query = $query; $this->prefixe = $prefixe; $this->sqlite_version = $sqlite_version; @@ -2773,12 +3022,12 @@ class sqlite_traducteur { /** * Transformer la requete pour SQLite - * + * * Enlève les textes, transforme la requête pour quelle soit * bien interprétée par SQLite, puis remet les textes * la fonction affecte `$this->query` */ - function traduire_requete(){ + function traduire_requete() { // // 1) Protection des textes en les remplacant par des codes // @@ -2790,61 +3039,62 @@ class sqlite_traducteur { // // Correction Create Database // Create Database -> requete ignoree - if (strpos($this->query, 'CREATE DATABASE')===0){ - spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.'._LOG_AVERTISSEMENT); + if (strpos($this->query, 'CREATE DATABASE') === 0) { + spip_log("Sqlite : requete non executee -> $this->query", 'sqlite.' . _LOG_AVERTISSEMENT); $this->query = "SELECT 1"; } // Correction Insert Ignore // INSERT IGNORE -> insert (tout court et pas 'insert or replace') - if (strpos($this->query, 'INSERT IGNORE')===0){ - spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.'._LOG_DEBUG); - $this->query = 'INSERT '.substr($this->query, '13'); + if (strpos($this->query, 'INSERT IGNORE') === 0) { + spip_log("Sqlite : requete transformee -> $this->query", 'sqlite.' . _LOG_DEBUG); + $this->query = 'INSERT ' . substr($this->query, '13'); } // Correction des dates avec INTERVAL // utiliser sql_date_proche() de preference - if (strpos($this->query, 'INTERVAL')!==false){ + if (strpos($this->query, 'INTERVAL') !== false) { $this->query = preg_replace_callback("/DATE_(ADD|SUB)(.*)INTERVAL\s+(\d+)\s+([a-zA-Z]+)\)/U", - array(&$this, '_remplacerDateParTime'), - $this->query); + array(&$this, '_remplacerDateParTime'), + $this->query); } - if (strpos($this->query, 'LEFT(')!==false){ - $this->query = str_replace('LEFT(','_LEFT(',$this->query); + if (strpos($this->query, 'LEFT(') !== false) { + $this->query = str_replace('LEFT(', '_LEFT(', $this->query); } - if (strpos($this->query, 'TIMESTAMPDIFF(')!==false){ - $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims',"TIMESTAMPDIFF('\\1',",$this->query); + if (strpos($this->query, 'TIMESTAMPDIFF(') !== false) { + $this->query = preg_replace('/TIMESTAMPDIFF\(\s*([^,]*)\s*,/Uims', "TIMESTAMPDIFF('\\1',", $this->query); } // Correction Using // USING (non reconnu en sqlite2) // problematique car la jointure ne se fait pas du coup. - if (($this->sqlite_version==2) && (strpos($this->query, "USING")!==false)){ - spip_log("'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'", 'sqlite.'._LOG_ERREUR); + if (($this->sqlite_version == 2) && (strpos($this->query, "USING") !== false)) { + spip_log("'USING (champ)' n'est pas reconnu en SQLite 2. Utilisez 'ON table1.champ = table2.champ'", + 'sqlite.' . _LOG_ERREUR); $this->query = preg_replace('/USING\s*\([^\)]*\)/', '', $this->query); } // Correction Field // remplace FIELD(table,i,j,k...) par CASE WHEN table=i THEN n ... ELSE 0 END - if (strpos($this->query, 'FIELD')!==false){ + if (strpos($this->query, 'FIELD') !== false) { $this->query = preg_replace_callback('/FIELD\s*\(([^\)]*)\)/', - array(&$this, '_remplacerFieldParCase'), - $this->query); + array(&$this, '_remplacerFieldParCase'), + $this->query); } // Correction des noms de tables FROM // mettre les bons noms de table dans from, update, insert, replace... - if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)){ + if (preg_match('/\s(SET|VALUES|WHERE|DATABASE)\s/iS', $this->query, $regs)) { $suite = strstr($this->query, $regs[0]); $this->query = substr($this->query, 0, -strlen($suite)); - } - else + } else { $suite = ''; - $pref = ($this->prefixe) ? $this->prefixe."_" : ""; - $this->query = preg_replace('/([,\s])spip_/S', '\1'.$pref, $this->query).$suite; + } + $pref = ($this->prefixe) ? $this->prefixe . "_" : ""; + $this->query = preg_replace('/([,\s])spip_/S', '\1' . $pref, $this->query) . $suite; // Correction zero AS x // pg n'aime pas 0+x AS alias, sqlite, dans le meme style, @@ -2853,16 +3103,16 @@ class sqlite_traducteur { // on remplace du coup x par vide() dans ce cas uniquement // // rien que pour public/vertebrer.php ? - if ((strpos($this->query, "0 AS")!==false)){ + if ((strpos($this->query, "0 AS") !== false)) { // on ne remplace que dans ORDER BY ou GROUP BY - if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)){ + if (preg_match('/\s(ORDER|GROUP) BY\s/i', $this->query, $regs)) { $suite = strstr($this->query, $regs[0]); $this->query = substr($this->query, 0, -strlen($suite)); // on cherche les noms des x dans 0 AS x // on remplace dans $suite le nom par vide() preg_match_all('/\b0 AS\s*([^\s,]+)/', $this->query, $matches, PREG_PATTERN_ORDER); - foreach ($matches[1] as $m){ + foreach ($matches[1] as $m) { $suite = str_replace($m, 'VIDE()', $suite); } $this->query .= $suite; @@ -2884,7 +3134,7 @@ class sqlite_traducteur { // Correction critere REGEXP, non reconnu en sqlite2 - if (($this->sqlite_version==2) && (strpos($this->query, 'REGEXP')!==false)){ + if (($this->sqlite_version == 2) && (strpos($this->query, 'REGEXP') !== false)) { $this->query = preg_replace('/([^\s\(]*)(\s*)REGEXP(\s*)([^\s\)]*)/', 'REGEXP($4, $1)', $this->query); } @@ -2893,8 +3143,9 @@ class sqlite_traducteur { // // Correction Antiquotes et echappements // ` => rien - if (strpos($this->query,'`')!==false) - $this->query = str_replace('`','', $this->query); + if (strpos($this->query, '`') !== false) { + $this->query = str_replace('`', '', $this->query); + } $this->query = query_reinjecte_textes($this->query, $textes); @@ -2905,33 +3156,35 @@ class sqlite_traducteur { /** * Callback pour remplacer `DATE_` / `INTERVAL` * par `DATE ... strtotime` - * + * * @param array $matches Captures * @return string Texte de date compris par SQLite */ - function _remplacerDateParTime($matches){ - $op = strtoupper($matches[1]=='ADD') ? '+' : '-'; + function _remplacerDateParTime($matches) { + $op = strtoupper($matches[1] == 'ADD') ? '+' : '-'; + return "datetime$matches[2] '$op$matches[3] $matches[4]')"; } /** * Callback pour remplacer `FIELD(table,i,j,k...)` * par `CASE WHEN table=i THEN n ... ELSE 0 END` - * + * * @param array $matches Captures * @return string Texte de liste ordonnée compris par SQLite */ - function _remplacerFieldParCase($matches){ + function _remplacerFieldParCase($matches) { $fields = substr($matches[0], 6, -1); // ne recuperer que l'interieur X de field(X) $t = explode(',', $fields); $index = array_shift($t); $res = ''; $n = 0; - foreach ($t as $v){ + foreach ($t as $v) { $n++; $res .= "\nWHEN $index=$v THEN $n"; } + return "CASE $res ELSE 0 END "; } diff --git a/ecrire/typographie/en.php b/ecrire/typographie/en.php index 3c078632e5..780d308d27 100644 --- a/ecrire/typographie/en.php +++ b/ecrire/typographie/en.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // rien sauf les "~" et "-," @@ -43,4 +45,5 @@ function typographie_en_dist($letexte) { return $letexte; } + ?> diff --git a/ecrire/typographie/fr.php b/ecrire/typographie/fr.php index 8f2fce03df..05bbbf84e4 100644 --- a/ecrire/typographie/fr.php +++ b/ecrire/typographie/fr.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} // Correction typographique francaise @@ -33,33 +35,42 @@ function typographie_fr_dist($letexte) { $chars = array(160 => '~', 187 => '»', 171 => '«', 148 => '”', 147 => '“', 176 => '°'); $chars_trans = array_keys($chars); $chars = array_values($chars); - $chars_trans = implode(' ',array_map('chr',$chars_trans)); + $chars_trans = implode(' ', array_map('chr', $chars_trans)); $chars_trans = unicode2charset(charset2unicode($chars_trans, 'iso-8859-1', 'forcer')); - $chars_trans = explode(" ",$chars_trans); - foreach($chars as $k=>$r) + $chars_trans = explode(" ", $chars_trans); + foreach ($chars as $k => $r) { $trans[$chars_trans[$k]] = $r; + } } $letexte = strtr($letexte, $trans); $cherche1 = array( - /* 1 */ '/((?:^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/S', - /* 2 */ '/»| --?,|(?::(?!:)| %)(?:\W|$)/S', - /* 3 */ '/([^[<(!?.])([!?][!?\.]*)/iS', - /* 4 */ '/«|(?:M(?:M?\.|mes?|r\.?)|[MnN]°) /S' + /* 1 */ + '/((?:^|[^\#0-9a-zA-Z\&])[\#0-9a-zA-Z]*)\;/S', + /* 2 */ + '/»| --?,|(?::(?!:)| %)(?:\W|$)/S', + /* 3 */ + '/([^[<(!?.])([!?][!?\.]*)/iS', + /* 4 */ + '/«|(?:M(?:M?\.|mes?|r\.?)|[MnN]°) /S' ); $remplace1 = array( - /* 1 */ '\1~;', - /* 2 */ '~\0', - /* 3 */ '\1~\2', - /* 4 */ '\0~' + /* 1 */ + '\1~;', + /* 2 */ + '~\0', + /* 3 */ + '\1~\2', + /* 4 */ + '\0~' ); $letexte = preg_replace($cherche1, $remplace1, $letexte); $letexte = preg_replace("/ *~+ */S", "~", $letexte); $cherche2 = array( '/([^-\n]|^)--([^-]|$)/S', - ',(' ._PROTOCOLES_STD . ')~((://[^"\'\s\[\]\}\)<>]+)~([?]))?,S', + ',(' . _PROTOCOLES_STD . ')~((://[^"\'\s\[\]\}\)<>]+)~([?]))?,S', '/~/' ); $remplace2 = array( diff --git a/ecrire/urls/page.php b/ecrire/urls/page.php index 80d982bfb3..45928a1e4a 100644 --- a/ecrire/urls/page.php +++ b/ecrire/urls/page.php @@ -10,54 +10,62 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} define('URLS_PAGE_EXEMPLE', 'spip.php?article12'); ####### modifications possibles dans ecrire/mes_options # on peut indiquer '.html' pour faire joli -define ('_terminaison_urls_page', ''); +define('_terminaison_urls_page', ''); # ci-dessous, ce qu'on veut ou presque (de preference pas de '/') # attention toutefois seuls '' et '=' figurent dans les modes de compatibilite -define ('_separateur_urls_page', ''); +define('_separateur_urls_page', ''); # on peut indiquer '' si on a installe le .htaccess -define ('_debut_urls_page', get_spip_script('./').'?'); +define('_debut_urls_page', get_spip_script('./') . '?'); ####### // http://code.spip.net/@_generer_url_page function _generer_url_page($type, $id, $args = '', $ancre = '') { - if ($generer_url_externe = charger_fonction("generer_url_$type",'urls',true)) { + if ($generer_url_externe = charger_fonction("generer_url_$type", 'urls', true)) { $url = $generer_url_externe($id, $args, $ancre); - if (NULL != $url) return $url; + if (null != $url) { + return $url; + } } $url = _debut_urls_page . $type . _separateur_urls_page - . $id . _terminaison_urls_page; + . $id . _terminaison_urls_page; + + if ($args) { + $args = strpos($url, '?') ? "&$args" : "?$args"; + } - if ($args) $args = strpos($url,'?') ? "&$args" : "?$args"; return _DIR_RACINE . $url . $args . ($ancre ? "#$ancre" : ''); } // retrouve le fond et les parametres d'une URL abregee // le contexte deja existant est fourni dans args sous forme de tableau ou query string // http://code.spip.net/@urls_page_dist -function urls_page_dist($i, &$entite, $args = '', $ancre = '') -{ - if (is_numeric($i)) +function urls_page_dist($i, &$entite, $args = '', $ancre = '') { + if (is_numeric($i)) { return _generer_url_page($entite, $i, $args, $ancre); + } // traiter les injections du type domaine.org/spip.php/cestnimportequoi/ou/encore/plus/rubrique23 - if ($GLOBALS['profondeur_url']>0 AND $entite=='sommaire'){ - return array(array(),'404'); + if ($GLOBALS['profondeur_url'] > 0 AND $entite == 'sommaire') { + return array(array(), '404'); } // voir s'il faut recuperer le id_* implicite et les &debut_xx; - if (is_array($args)) + if (is_array($args)) { $contexte = $args; - else - parse_str($args,$contexte); + } else { + parse_str($args, $contexte); + } include_spip('inc/urls'); $r = nettoyer_url_page($i, $contexte); if ($r) { @@ -81,13 +89,15 @@ function urls_page_dist($i, &$entite, $args = '', $ancre = '') : (isset($_ENV['url_propre']) ? $_ENV['url_propre'] : '' - )); + )); if ($url_propre) { - if ($GLOBALS['profondeur_url']<=0) - $urls_anciennes = charger_fonction('propres','urls',true); - else - $urls_anciennes = charger_fonction('arbo','urls',true); - return $urls_anciennes?$urls_anciennes($url_propre, $entite, $contexte):''; + if ($GLOBALS['profondeur_url'] <= 0) { + $urls_anciennes = charger_fonction('propres', 'urls', true); + } else { + $urls_anciennes = charger_fonction('arbo', 'urls', true); + } + + return $urls_anciennes ? $urls_anciennes($url_propre, $entite, $contexte) : ''; } /* Fin du bloc compatibilite url-propres */ } diff --git a/ecrire/xml/analyser_dtd.php b/ecrire/xml/analyser_dtd.php index 848a6214b7..0a72ff19b4 100644 --- a/ecrire/xml/analyser_dtd.php +++ b/ecrire/xml/analyser_dtd.php @@ -10,26 +10,33 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('xml/interfaces'); // http://code.spip.net/@charger_dtd -function charger_dtd($grammaire, $avail, $rotlvl) -{ +function charger_dtd($grammaire, $avail, $rotlvl) { static $dtd = array(); # cache bien utile pour le validateur en boucle - if (isset($dtd[$grammaire])) + if (isset($dtd[$grammaire])) { return $dtd[$grammaire]; + } - if ($avail == 'SYSTEM') $grammaire = find_in_path($grammaire); + if ($avail == 'SYSTEM') { + $grammaire = find_in_path($grammaire); + } - $file = _DIR_CACHE_XML . preg_replace('/[^\w.]/','_', $rotlvl) . '.gz'; + $file = _DIR_CACHE_XML . preg_replace('/[^\w.]/', '_', $rotlvl) . '.gz'; if (lire_fichier($file, $r)) { - if (!$grammaire) return array(); - if (($avail == 'SYSTEM') AND filemtime($file) < filemtime($grammaire)) - $r = false; + if (!$grammaire) { + return array(); + } + if (($avail == 'SYSTEM') AND filemtime($file) < filemtime($grammaire)) { + $r = false; + } } if ($r) { @@ -39,22 +46,23 @@ function charger_dtd($grammaire, $avail, $rotlvl) $dtc = new DTC; // L'analyseur retourne un booleen de reussite et modifie $dtc. // Retourner vide en cas d'echec - if (!analyser_dtd($grammaire, $avail, $dtc)) + if (!analyser_dtd($grammaire, $avail, $dtc)) { $dtc = array(); - else { - // tri final pour presenter les suggestions de corrections + } else { + // tri final pour presenter les suggestions de corrections foreach ($dtc->peres as $k => $v) { asort($v); $dtc->peres[$k] = $v; - } + } - spip_log("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ") " . count($dtc->macros) . ' macros, ' . count($dtc->elements) . ' elements, ' . count($dtc->attributs) . " listes d'attributs, " . count($dtc->entites) . " entites"); + spip_log("Analyser DTD $avail $grammaire (" . spip_timer('dtd') . ") " . count($dtc->macros) . ' macros, ' . count($dtc->elements) . ' elements, ' . count($dtc->attributs) . " listes d'attributs, " . count($dtc->entites) . " entites"); # $r = $dtc->regles; ksort($r);foreach($r as $l => $v) {$t=array_keys($dtc->attributs[$l]);echo "<b>$l</b> '$v' ", count($t), " attributs: ", join (', ',$t);$t=$dtc->peres[$l];echo "<br />",count($t), " peres: ", @join (', ',$t), "<br />\n";}exit; ecrire_fichier($file, serialize($dtc), true); } - + } $dtd[$grammaire] = $dtc; + return $dtc; } @@ -67,33 +75,32 @@ function charger_dtd($grammaire, $avail, $rotlvl) // et parentheser le tout pour que | + * ? s'applique dessus. // http://code.spip.net/@compilerRegle -function compilerRegle($val) -{ - $x = str_replace('()','', - preg_replace('/\s*,\s*/','', - preg_replace('/(\w+)\s*/','(?:\1 )', - preg_replace('/\s*\)/',')', - preg_replace('/\s*([(+*|?])\s*/','\1', - preg_replace('/\s*#\w+\s*[,|]?\s*/','', $val)))))); +function compilerRegle($val) { + $x = str_replace('()', '', + preg_replace('/\s*,\s*/', '', + preg_replace('/(\w+)\s*/', '(?:\1 )', + preg_replace('/\s*\)/', ')', + preg_replace('/\s*([(+*|?])\s*/', '\1', + preg_replace('/\s*#\w+\s*[,|]?\s*/', '', $val)))))); + return $x; } // http://code.spip.net/@analyser_dtd -function analyser_dtd($loc, $avail, &$dtc) -{ +function analyser_dtd($loc, $avail, &$dtc) { // creer le repertoire de cache si ce n'est fait // (utile aussi pour le resultat de la compil) $file = sous_repertoire(_DIR_CACHE_XML); // si DTD locale, ignorer ce repertoire pour le moment - if ($avail == 'SYSTEM'){ + if ($avail == 'SYSTEM') { $file = $loc; - if (_DIR_RACINE AND strncmp($file,_DIR_RACINE,strlen(_DIR_RACINE))==0) - $file = substr($file,strlen(_DIR_RACINE)); - $file = find_in_path($file); - } - else { - $file .= preg_replace('/[^\w.]/','_', $loc); + if (_DIR_RACINE AND strncmp($file, _DIR_RACINE, strlen(_DIR_RACINE)) == 0) { + $file = substr($file, strlen(_DIR_RACINE)); + } + $file = find_in_path($file); + } else { + $file .= preg_replace('/[^\w.]/', '_', $loc); } $dtd = ''; @@ -102,145 +109,186 @@ function analyser_dtd($loc, $avail, &$dtc) } else { if ($avail == 'PUBLIC') { include_spip('inc/distant'); - if ($dtd = trim(recuperer_page($loc))) - ecrire_fichier($file, $dtd, true); + if ($dtd = trim(recuperer_page($loc))) { + ecrire_fichier($file, $dtd, true); + } } } $dtd = ltrim($dtd); if (!$dtd) { spip_log("DTD '$loc' ($file) inaccessible"); + return false; - } else spip_log("analyse de la DTD $loc "); + } else { + spip_log("analyse de la DTD $loc "); + } while ($dtd) { - if ($dtd[0] != '<') + if ($dtd[0] != '<') { $r = analyser_dtd_lexeme($dtd, $dtc, $loc); - elseif ($dtd[1] != '!') + } elseif ($dtd[1] != '!') { $r = analyser_dtd_pi($dtd, $dtc, $loc); - elseif ($dtd[2] == '[') + } elseif ($dtd[2] == '[') { $r = analyser_dtd_data($dtd, $dtc, $loc); - else { + } else { switch ($dtd[3]) { - case '%' : $r = analyser_dtd_data($dtd, $dtc, $loc); break; - case 'T' : $r = analyser_dtd_attlist($dtd, $dtc, $loc);break; - case 'L' : $r = analyser_dtd_element($dtd, $dtc, $loc);break; - case 'N' : $r = analyser_dtd_entity($dtd, $dtc, $loc);break; - case 'O' : $r = analyser_dtd_notation($dtd, $dtc, $loc);break; - case '-' : $r = analyser_dtd_comment($dtd, $dtc, $loc); break; - default: $r = -1; + case '%' : + $r = analyser_dtd_data($dtd, $dtc, $loc); + break; + case 'T' : + $r = analyser_dtd_attlist($dtd, $dtc, $loc); + break; + case 'L' : + $r = analyser_dtd_element($dtd, $dtc, $loc); + break; + case 'N' : + $r = analyser_dtd_entity($dtd, $dtc, $loc); + break; + case 'O' : + $r = analyser_dtd_notation($dtd, $dtc, $loc); + break; + case '-' : + $r = analyser_dtd_comment($dtd, $dtc, $loc); + break; + default: + $r = -1; } - } + } if (!is_string($r)) { - spip_log("erreur $r dans la DTD " . substr($dtd,0,80) . "....."); + spip_log("erreur $r dans la DTD " . substr($dtd, 0, 80) . "....."); + return false; } $dtd = $r; - } + } + return true; } // http://code.spip.net/@analyser_dtd_comment -function analyser_dtd_comment($dtd, &$dtc, $grammaire){ +function analyser_dtd_comment($dtd, &$dtc, $grammaire) { // ejecter les commentaires, surtout quand ils contiennent du code. // Option /s car sur plusieurs lignes parfois - if (!preg_match('/^<!--.*?-->\s*(.*)$/s',$dtd, $m)) + if (!preg_match('/^<!--.*?-->\s*(.*)$/s', $dtd, $m)) { return -6; + } + return $m[1]; } // http://code.spip.net/@analyser_dtd_pi -function analyser_dtd_pi($dtd, &$dtc, $grammaire){ - if (!preg_match('/^<\?.*?>\s*(.*)$/s', $dtd, $m)) +function analyser_dtd_pi($dtd, &$dtc, $grammaire) { + if (!preg_match('/^<\?.*?>\s*(.*)$/s', $dtd, $m)) { return -10; + } + return $m[1]; } // http://code.spip.net/@analyser_dtd_lexeme -function analyser_dtd_lexeme($dtd, &$dtc, $grammaire){ +function analyser_dtd_lexeme($dtd, &$dtc, $grammaire) { - if (!preg_match(_REGEXP_ENTITY_DEF,$dtd, $m)) + if (!preg_match(_REGEXP_ENTITY_DEF, $dtd, $m)) { return -9; + } - list(,$s) = $m; + list(, $s) = $m; $n = $dtc->macros[$s]; if (is_array($n)) { - // en cas d'inclusion, l'espace de nom est le meme - // mais gaffe aux DTD dont l'URL est relative a l'engloblante + // en cas d'inclusion, l'espace de nom est le meme + // mais gaffe aux DTD dont l'URL est relative a l'engloblante if (($n[0] == 'PUBLIC') - AND !tester_url_absolue($n[1])) { - $n[1] = substr($grammaire,0, strrpos($grammaire,'/')+1) . $n[1]; + AND !tester_url_absolue($n[1]) + ) { + $n[1] = substr($grammaire, 0, strrpos($grammaire, '/')+1) . $n[1]; } analyser_dtd($n[1], $n[0], $dtc); } - - return ltrim(substr($dtd,strlen($m[0]))); + + return ltrim(substr($dtd, strlen($m[0]))); } // il faudrait gerer plus proprement les niveaux d'inclusion: // ca ne depasse pas 3 ici. // http://code.spip.net/@analyser_dtd_data -function analyser_dtd_data($dtd, &$dtc, $grammaire){ +function analyser_dtd_data($dtd, &$dtc, $grammaire) { - if (!preg_match(_REGEXP_INCLUDE_USE,$dtd,$m)) + if (!preg_match(_REGEXP_INCLUDE_USE, $dtd, $m)) { return -11; - if (!preg_match('/^((\s*<!(\[\s*%\s*[^;]*;\s*\[([^]<]*<[^>]*>)*[^]<]*\]\]>)|([^]>]*>))*[^]<]*)\]\]>\s*/s',$m[2], $r)) - return -12; + } + if (!preg_match('/^((\s*<!(\[\s*%\s*[^;]*;\s*\[([^]<]*<[^>]*>)*[^]<]*\]\]>)|([^]>]*>))*[^]<]*)\]\]>\s*/s', $m[2], + $r) + ) { + return -12; + } - if ($dtc->macros[$m[1]] == 'INCLUDE') - $retour = $r[1] . substr($m[2], strlen($r[0])); - else $retour = substr($m[2], strlen($r[0])); + if ($dtc->macros[$m[1]] == 'INCLUDE') { + $retour = $r[1] . substr($m[2], strlen($r[0])); + } else { + $retour = substr($m[2], strlen($r[0])); + } return $retour; } // http://code.spip.net/@analyser_dtd_notation -function analyser_dtd_notation($dtd, &$dtc, $grammaire){ - if (!preg_match('/^<!NOTATION.*?>\s*(.*)$/s',$dtd, $m)) +function analyser_dtd_notation($dtd, &$dtc, $grammaire) { + if (!preg_match('/^<!NOTATION.*?>\s*(.*)$/s', $dtd, $m)) { return -8; + } spip_log("analyser_dtd_notation a ecrire"); + return $m[1]; } // http://code.spip.net/@analyser_dtd_entity -function analyser_dtd_entity($dtd, &$dtc, $grammaire) -{ - if (!preg_match(_REGEXP_ENTITY_DECL, $dtd, $m)) +function analyser_dtd_entity($dtd, &$dtc, $grammaire) { + if (!preg_match(_REGEXP_ENTITY_DECL, $dtd, $m)) { return -2; + } - list($t, $term, $nom, $type, $k1,$k2,$k3,$k4,$k5,$k6, $c, $q, $alt, $dtd) = $m; + list($t, $term, $nom, $type, $k1, $k2, $k3, $k4, $k5, $k6, $c, $q, $alt, $dtd) = $m; - if (isset($dtc->macros[$nom]) AND $dtc->macros[$nom]) + if (isset($dtc->macros[$nom]) AND $dtc->macros[$nom]) { return $dtd; - if (isset($dtc->entites[$nom])) + } + if (isset($dtc->entites[$nom])) { spip_log("redefinition de l'entite $nom"); - if ($k6) return $k6 . $dtd; // cas du synonyme complet + } + if ($k6) { + return $k6 . $dtd; + } // cas du synonyme complet $val = expanserEntite(($k2 ? $k3 : ($k4 ? $k5 : $k6)), $dtc->macros); // cas particulier double evaluation: 'PUBLIC "..." "...."' - if (preg_match('/(PUBLIC|SYSTEM)\s+"([^"]*)"\s*("([^"]*)")?\s*$/s',$val,$r)) { + if (preg_match('/(PUBLIC|SYSTEM)\s+"([^"]*)"\s*("([^"]*)")?\s*$/s', $val, $r)) { list($t, $type, $val, $q, $alt) = $r; } - if (!$term) - $dtc->entites[$nom] = $val; - elseif (!$type) - $dtc->macros[$nom] = $val; - else { - if (($type == 'SYSTEM') AND !$alt) $alt = $val; - if (!$alt) + if (!$term) { + $dtc->entites[$nom] = $val; + } elseif (!$type) { + $dtc->macros[$nom] = $val; + } else { + if (($type == 'SYSTEM') AND !$alt) { + $alt = $val; + } + if (!$alt) { $dtc->macros[$nom] = $val; - else { + } else { if (($type == 'PUBLIC') - AND (strpos($alt, '/') === false)) + AND (strpos($alt, '/') === false) + ) { $alt = preg_replace(',/[^/]+$,', '/', $grammaire) - . $alt ; + . $alt; + } $dtc->macros[$nom] = array($type, $alt); } - } + } return $dtd; } @@ -255,63 +303,70 @@ function analyser_dtd_entity($dtd, &$dtc, $grammaire) // Fin du controle en finElement // http://code.spip.net/@analyser_dtd_element -function analyser_dtd_element($dtd, &$dtc, $grammaire) -{ - if (!preg_match('/^<!ELEMENT\s+([^>\s]+)([^>]*)>\s*(.*)$/s', $dtd, $m)) +function analyser_dtd_element($dtd, &$dtc, $grammaire) { + if (!preg_match('/^<!ELEMENT\s+([^>\s]+)([^>]*)>\s*(.*)$/s', $dtd, $m)) { return -3; + } - list(,$nom, $contenu, $dtd) = $m; + list(, $nom, $contenu, $dtd) = $m; $nom = expanserEntite($nom, $dtc->macros); if (isset($dtc->elements[$nom])) { spip_log("redefinition de l'element $nom dans la DTD"); + return -4; } $filles = array(); $contenu = expanserEntite($contenu, $dtc->macros); $val = $contenu ? compilerRegle($contenu) : '(?:EMPTY )'; - if ($val == '(?:EMPTY )') + if ($val == '(?:EMPTY )') { $dtc->regles[$nom] = 'EMPTY'; - elseif ($val == '(?:ANY )') + } elseif ($val == '(?:ANY )') { $dtc->regles[$nom] = 'ANY'; - else { - $last = substr($val,-1); + } else { + $last = substr($val, -1); if (preg_match('/ \w/', $val) - OR (!empty($last) AND strpos('*+', $last) === false)) + OR (!empty($last) AND strpos('*+', $last) === false) + ) { $dtc->regles[$nom] = "/^$val$/"; - else + } else { $dtc->regles[$nom] = $last; - $filles = array_values(preg_split('/\W+/', $val,-1, PREG_SPLIT_NO_EMPTY)); + } + $filles = array_values(preg_split('/\W+/', $val, -1, PREG_SPLIT_NO_EMPTY)); - foreach ($filles as $k) { - if (!isset($dtc->peres[$k])) - $dtc->peres[$k] = array(); - if (!in_array($nom, $dtc->peres[$k])) - $dtc->peres[$k][]= $nom; + foreach ($filles as $k) { + if (!isset($dtc->peres[$k])) { + $dtc->peres[$k] = array(); + } + if (!in_array($nom, $dtc->peres[$k])) { + $dtc->peres[$k][] = $nom; } + } } - $dtc->pcdata[$nom]= (strpos($contenu, '#PCDATA')===false); - $dtc->elements[$nom]= $filles; + $dtc->pcdata[$nom] = (strpos($contenu, '#PCDATA') === false); + $dtc->elements[$nom] = $filles; + return $dtd; } // http://code.spip.net/@analyser_dtd_attlist -function analyser_dtd_attlist($dtd, &$dtc, $grammaire) -{ - if (!preg_match('/^<!ATTLIST\s+(\S+)\s+([^>]*)>\s*(.*)/s', $dtd, $m)) +function analyser_dtd_attlist($dtd, &$dtc, $grammaire) { + if (!preg_match('/^<!ATTLIST\s+(\S+)\s+([^>]*)>\s*(.*)/s', $dtd, $m)) { return -5; + } - list(,$nom, $val, $dtd) = $m; + list(, $nom, $val, $dtd) = $m; $nom = expanserEntite($nom, $dtc->macros); $val = expanserEntite($val, $dtc->macros); - if (!isset($dtc->attributs[$nom])) + if (!isset($dtc->attributs[$nom])) { $dtc->attributs[$nom] = array(); + } if (preg_match_all("/\s*(\S+)\s+(([(][^)]*[)])|(\S+))\s+([^\s']*)(\s*'[^']*')?/", $val, $r2, PREG_SET_ORDER)) { - foreach($r2 as $m2) { + foreach ($r2 as $m2) { $v = preg_match('/^\w+$/', $m2[2]) ? $m2[2] - : ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/'); + : ('/^' . preg_replace('/\s+/', '', $m2[2]) . '$/'); $m21 = expanserEntite($m2[1], $dtc->macros); $m25 = expanserEntite($m2[5], $dtc->macros); $dtc->attributs[$nom][$m21] = array($v, $m25); @@ -328,24 +383,27 @@ function analyser_dtd_attlist($dtd, &$dtc, $grammaire) * * Si le premier argument n'est pas une chaîne, * retourne les statistiques (pour debug de DTD, inutilise en mode normal) - * + * * @param string $val * @param array $macros * @return string|array -**/ -function expanserEntite($val, $macros = array()) -{ + **/ +function expanserEntite($val, $macros = array()) { static $vu = array(); - if (!is_string($val)) return $vu; + if (!is_string($val)) { + return $vu; + } - if (preg_match_all(_REGEXP_ENTITY_USE, $val, $r, PREG_SET_ORDER)){ - foreach($r as $m) { + if (preg_match_all(_REGEXP_ENTITY_USE, $val, $r, PREG_SET_ORDER)) { + foreach ($r as $m) { $ent = $m[1]; // il peut valoir "" if (!isset($macros[$ent])) { spip_log("Entite $ent inconnu"); } else { - if (!isset($vu[$ent])) { $vu[$ent] = 0; } + if (!isset($vu[$ent])) { + $vu[$ent] = 0; + } ++$vu[$ent]; $val = str_replace($m[0], $macros[$ent], $val); } @@ -354,4 +412,5 @@ function expanserEntite($val, $macros = array()) return trim(preg_replace('/\s+/', ' ', $val)); } + ?> diff --git a/ecrire/xml/indenter.php b/ecrire/xml/indenter.php index 353c925299..feeb3f5c99 100644 --- a/ecrire/xml/indenter.php +++ b/ecrire/xml/indenter.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} class IndenteurXML { @@ -39,8 +41,7 @@ class IndenteurXML { } // http://code.spip.net/@phraserTout - function phraserTout($phraseur, $data) - { + function phraserTout($phraseur, $data) { xml_parsestring($this, $data); } @@ -52,18 +53,20 @@ class IndenteurXML { var $reperes = array(); var $entete = ''; var $page = ''; - var $dtc = NULL; - var $sax = NULL; + var $dtc = null; + var $sax = null; } // http://code.spip.net/@xml_indenter_dist -function xml_indenter_dist($page, $apply = false) -{ +function xml_indenter_dist($page, $apply = false) { $sax = charger_fonction('sax', 'xml'); $f = new IndenteurXML(); $sax($page, $apply, $f); - if (!$f->err) return $f->entete . $f->res; + if (!$f->err) { + return $f->entete . $f->res; + } spip_log("indentation impossible " . count($f->err) . " erreurs de validation"); + return $f->entete . $f->page; } diff --git a/ecrire/xml/interfaces.php b/ecrire/xml/interfaces.php index 891484627b..81a07de418 100644 --- a/ecrire/xml/interfaces.php +++ b/ecrire/xml/interfaces.php @@ -10,10 +10,12 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} define('_REGEXP_DOCTYPE', - '/^((?:<\001?[?][^>]*>\s*)*(?:<!--.*?-->\s*)*)*<!DOCTYPE\s+(\w+)\s+(\w+)\s*([^>]*)>\s*/s'); +'/^((?:<\001?[?][^>]*>\s*)*(?:<!--.*?-->\s*)*)*<!DOCTYPE\s+(\w+)\s+(\w+)\s*([^>]*)>\s*/s'); define('_REGEXP_XML', '/^(\s*(?:<[?][^x>][^>]*>\s*)?(?:<[?]xml[^>]*>)?\s*(?:<!--.*?-->\s*)*)<(\w+)/s'); @@ -21,24 +23,24 @@ define('_MESSAGE_DOCTYPE', '<!-- SPIP CORRIGE -->'); define('_SUB_REGEXP_SYMBOL', '[\w_:.-]'); -define('_REGEXP_NMTOKEN', '/^' . _SUB_REGEXP_SYMBOL . '+$/'); +define('_REGEXP_NMTOKEN', '/^' . _SUB_REGEXP_SYMBOL . '+$/'); -define('_REGEXP_NMTOKENS', '/^(' . _SUB_REGEXP_SYMBOL . '+\s*)*$/'); +define('_REGEXP_NMTOKENS', '/^(' . _SUB_REGEXP_SYMBOL . '+\s*)*$/'); define('_REGEXP_ID', '/^[A-Za-z_:]' . _SUB_REGEXP_SYMBOL . '*$/'); -define('_REGEXP_ENTITY_USE', '/%(' . _SUB_REGEXP_SYMBOL . '+);/'); -define('_REGEXP_ENTITY_DEF', '/^%(' . _SUB_REGEXP_SYMBOL . '+);/'); +define('_REGEXP_ENTITY_USE', '/%(' . _SUB_REGEXP_SYMBOL . '+);/'); +define('_REGEXP_ENTITY_DEF', '/^%(' . _SUB_REGEXP_SYMBOL . '+);/'); define('_REGEXP_TYPE_XML', 'PUBLIC|SYSTEM|INCLUDE|IGNORE|CDATA'); define('_REGEXP_ENTITY_DECL', '/^<!ENTITY\s+(%?)\s*(' . - _SUB_REGEXP_SYMBOL . - '+;?)\s+(' . - _REGEXP_TYPE_XML . - ')?\s*(' . - "('([^']*)')" . - '|("([^"]*)")' . - '|\s*(%' . _SUB_REGEXP_SYMBOL . '+;)\s*' . - ')\s*(--.*?--)?("([^"]*)")?\s*>\s*(.*)$/s'); + _SUB_REGEXP_SYMBOL . + '+;?)\s+(' . + _REGEXP_TYPE_XML . + ')?\s*(' . + "('([^']*)')" . + '|("([^"]*)")' . + '|\s*(%' . _SUB_REGEXP_SYMBOL . '+;)\s*' . + ')\s*(--.*?--)?("([^"]*)")?\s*>\s*(.*)$/s'); define('_REGEXP_INCLUDE_USE', '/^<!\[\s*%\s*([^;]*);\s*\[\s*(.*)$/s'); @@ -46,7 +48,7 @@ define('_DOCTYPE_RSS', 'http://www.rssboard.org/rss-0.91.dtd'); /** * Document Type Compilation -**/ + **/ class DTC { var $macros = array(); var $elements = array(); @@ -56,4 +58,5 @@ class DTC { var $regles = array(); var $pcdata = array(); } + ?> diff --git a/ecrire/xml/sax.php b/ecrire/xml/sax.php index d98bbbdcd7..4b3d837da3 100644 --- a/ecrire/xml/sax.php +++ b/ecrire/xml/sax.php @@ -10,52 +10,57 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} include_spip('inc/charsets'); include_spip('xml/interfaces'); /** * Encoder les entites + * * @param string $texte * @return string */ -function xml_entites_html($texte){ +function xml_entites_html($texte) { if (!is_string($texte) OR !$texte - OR strpbrk($texte, "&\"'<>")==false - ) return $texte; + OR strpbrk($texte, "&\"'<>") == false + ) { + return $texte; + } - if (!function_exists('spip_htmlspecialchars')) + if (!function_exists('spip_htmlspecialchars')) { include_spip("inc/filtres_mini"); - $texte = spip_htmlspecialchars($texte,ENT_QUOTES); + } + $texte = spip_htmlspecialchars($texte, ENT_QUOTES); + return $texte; } // http://code.spip.net/@xml_debutElement -function xml_debutElement($phraseur, $name, $attrs) -{ +function xml_debutElement($phraseur, $name, $attrs) { $depth = $phraseur->depth; $t = isset($phraseur->ouvrant[$depth]) ? $phraseur->ouvrant[$depth] : ' '; // espace initial signifie: deja integree au resultat - if ($t[0] != ' ') - { - $phraseur->res .= '<' . $t . '>'; - $phraseur->ouvrant[$depth] = ' ' . $t; - } + if ($t[0] != ' ') { + $phraseur->res .= '<' . $t . '>'; + $phraseur->ouvrant[$depth] = ' ' . $t; + } $t = $phraseur->contenu[$depth]; // n'indenter que s'il y a un separateur avant - $phraseur->res .= preg_replace("/[\n\t ]+$/", "\n$depth", $t); + $phraseur->res .= preg_replace("/[\n\t ]+$/", "\n$depth", $t); $phraseur->contenu[$depth] = ""; $att = ''; $sep = ' '; foreach ($attrs as $k => $v) { - $delim = strpos($v, "'") === false ? "'" : '"'; - $val = xml_entites_html($v); - $att .= $sep . $k . "=" . $delim - . ($delim !== '"' ? str_replace('"', '"', $val) : $val) - . $delim; - $sep = "\n $depth"; + $delim = strpos($v, "'") === false ? "'" : '"'; + $val = xml_entites_html($v); + $att .= $sep . $k . "=" . $delim + . ($delim !== '"' ? str_replace('"', '"', $val) : $val) + . $delim; + $sep = "\n $depth"; } $phraseur->depth .= ' '; $phraseur->contenu[$phraseur->depth] = ""; @@ -64,45 +69,45 @@ function xml_debutElement($phraseur, $name, $attrs) } // http://code.spip.net/@xml_finElement -function xml_finElement($phraseur, $name, $fusion_bal = false) -{ +function xml_finElement($phraseur, $name, $fusion_bal = false) { $ouv = $phraseur->ouvrant[$phraseur->depth]; - if ($ouv[0] != ' ') + if ($ouv[0] != ' ') { $phraseur->ouvrant[$phraseur->depth] = ' ' . $ouv; - else $ouv= ""; + } else { + $ouv = ""; + } $t = $phraseur->contenu[$phraseur->depth]; $phraseur->depth = substr($phraseur->depth, 2); $t = preg_replace("/[\n\t ]+$/", "\n" . $phraseur->depth, $t); - // fusion <balise></balise> en <balise />. - // ATTENTION, certains clients http croient que fusion ==> pas d'atttributs - // en particulier pour les balises Script et A. - // en presence d'attributs ne le faire que si la DTD est dispo et d'accord - // (param fusion_bal) + // fusion <balise></balise> en <balise />. + // ATTENTION, certains clients http croient que fusion ==> pas d'atttributs + // en particulier pour les balises Script et A. + // en presence d'attributs ne le faire que si la DTD est dispo et d'accord + // (param fusion_bal) - if ($t || (($ouv != $name) AND !$fusion_bal)) - $phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . "</" . $name . ">"; - else - $phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ("</" . $name . ">")); + if ($t || (($ouv != $name) AND !$fusion_bal)) { + $phraseur->res .= ($ouv ? ('<' . $ouv . '>') : '') . $t . "</" . $name . ">"; + } else { + $phraseur->res .= ($ouv ? ('<' . $ouv . ' />') : ("</" . $name . ">")); + } } // http://code.spip.net/@xml_textElement -function xml_textElement($phraseur, $data) -{ +function xml_textElement($phraseur, $data) { $depth = $phraseur->depth; - $phraseur->contenu[$depth] .= preg_match('/^script/',$phraseur->ouvrant[$depth]) - ? $data - : xml_entites_html($data); + $phraseur->contenu[$depth] .= preg_match('/^script/', $phraseur->ouvrant[$depth]) + ? $data + : xml_entites_html($data); } -function xml_piElement($phraseur, $target, $data) -{ +function xml_piElement($phraseur, $target, $data) { $depth = $phraseur->depth; - if (strtolower($target) != "php") - $phraseur->contenu[$depth] .= $data; - else { + if (strtolower($target) != "php") { + $phraseur->contenu[$depth] .= $data; + } else { ob_start(); eval($data); $data = ob_get_contents(); @@ -113,72 +118,79 @@ function xml_piElement($phraseur, $target, $data) // http://code.spip.net/@xml_defautElement -function xml_defaultElement($phraseur, $data) -{ +function xml_defaultElement($phraseur, $data) { $depth = $phraseur->depth; - if (!isset($phraseur->contenu[$depth])) $phraseur->contenu[$depth]=''; + if (!isset($phraseur->contenu[$depth])) { + $phraseur->contenu[$depth] = ''; + } $phraseur->contenu[$depth] .= $data; } // http://code.spip.net/@xml_parsestring -function xml_parsestring($phraseur, $data) -{ - $phraseur->contenu[$phraseur->depth] =''; +function xml_parsestring($phraseur, $data) { + $phraseur->contenu[$phraseur->depth] = ''; if (!xml_parse($phraseur->sax, $data, true)) { coordonnees_erreur($phraseur, xml_error_string(xml_get_error_code($phraseur->sax)) . "<br />\n" . (!$phraseur->depth ? '' : - ('(' . - _T('erreur_balise_non_fermee') . - " <tt>" . - $phraseur->ouvrant[$phraseur->depth] . - "</tt> " . - _T('ligne') . - " " . - $phraseur->reperes[$phraseur->depth] . - ") <br />\n" ))); + ('(' . + _T('erreur_balise_non_fermee') . + " <tt>" . + $phraseur->ouvrant[$phraseur->depth] . + "</tt> " . + _T('ligne') . + " " . + $phraseur->reperes[$phraseur->depth] . + ") <br />\n"))); } } // http://code.spip.net/@coordonnees_erreur -function coordonnees_erreur($phraseur, $msg) -{ - $entete_length = substr_count($phraseur->entete,"\n"); - $phraseur->err[] = array($msg, - xml_get_current_line_number($phraseur->sax) + $entete_length, - xml_get_current_column_number($phraseur->sax)); +function coordonnees_erreur($phraseur, $msg) { + $entete_length = substr_count($phraseur->entete, "\n"); + $phraseur->err[] = array( + $msg, + xml_get_current_line_number($phraseur->sax)+$entete_length, + xml_get_current_column_number($phraseur->sax) + ); } // http://code.spip.net/@xml_sax_dist -function xml_sax_dist($page, $apply = false, $phraseur = NULL, $doctype = '', $charset = null) -{ - if (is_null($charset)) +function xml_sax_dist($page, $apply = false, $phraseur = null, $doctype = '', $charset = null) { + if (is_null($charset)) { $charset = $GLOBALS['meta']['charset']; + } if ($apply) { ob_start(); - if (is_array($apply)) - $r = call_user_func_array($page, $apply); - else $r = $page(); + if (is_array($apply)) { + $r = call_user_func_array($page, $apply); + } else { + $r = $page(); + } $page = ob_get_contents(); ob_end_clean(); // fonction sans aucun "echo", ca doit etre le resultat - if (!$page) $page = $r; + if (!$page) { + $page = $r; + } } - if (!$page) return ''; + if (!$page) { + return ''; + } // charger la DTD et transcoder les entites, // et escamoter le doctype que sax mange en php5 mais pas en php4 if (!$doctype) { if (!$r = analyser_doctype($page)) { $page = _MESSAGE_DOCTYPE . _DOCTYPE_ECRIRE - . preg_replace(_REGEXP_DOCTYPE, '', $page); - $r = analyser_doctype($page); + . preg_replace(_REGEXP_DOCTYPE, '', $page); + $r = analyser_doctype($page); } list($entete, $avail, $grammaire, $rotlvl) = array_pad($r, 4, null); - $page = substr($page,strlen($entete)); + $page = substr($page, strlen($entete)); } else { $avail = 'SYSTEM'; $grammaire = $doctype; @@ -192,23 +204,24 @@ function xml_sax_dist($page, $apply = false, $phraseur = NULL, $doctype = '', $c // compatibilite Tidy espace public if (!$phraseur) { $indenter_xml = charger_fonction('indenter', 'xml'); + return $indenter_xml($page, $apply); } $xml_parser = xml_parser_create($charset); xml_set_element_handler($xml_parser, - array($phraseur, "debutElement"), - array($phraseur, "finElement")); + array($phraseur, "debutElement"), + array($phraseur, "finElement")); xml_set_character_data_handler($xml_parser, - array($phraseur, "textElement")); + array($phraseur, "textElement")); xml_set_processing_instruction_handler($xml_parser, - array($phraseur, 'piElement')); + array($phraseur, 'piElement')); xml_set_default_handler($xml_parser, - array($phraseur, "defaultElement")); + array($phraseur, "defaultElement")); xml_parser_set_option($xml_parser, XML_OPTION_CASE_FOLDING, false); @@ -221,6 +234,7 @@ function xml_sax_dist($page, $apply = false, $phraseur = NULL, $doctype = '', $c $phraseur->phraserTout($xml_parser, $page); xml_parser_free($xml_parser); $phraseur->sax = ''; + return $phraseur; } @@ -232,22 +246,24 @@ function xml_sax_dist($page, $apply = false, $phraseur = NULL, $doctype = '', $c // sinon on se rabat sur ce qu'en connait SPIP en standard. // http://code.spip.net/@sax_bug -function sax_bug($data, $dtc, $charset = null) -{ - if (is_null($charset)) +function sax_bug($data, $dtc, $charset = null) { + if (is_null($charset)) { $charset = $GLOBALS['meta']['charset']; + } if ($dtc) { $trans = array(); - - foreach($dtc->entites as $k => $v) { - if (!strpos(" amp lt gt quot ", $k)) - $trans["&$k;"] = $v; + + foreach ($dtc->entites as $k => $v) { + if (!strpos(" amp lt gt quot ", $k)) { + $trans["&$k;"] = $v; + } } $data = strtr($data, $trans); } else { $data = html2unicode($data, true); } + return unicode2charset($data, $charset); } @@ -258,44 +274,55 @@ function sax_bug($data, $dtc, $charset = null) // les autres formats RSS n'ont pas de DTD, // mais un XML Schema que SPIP ne fait pas encore lire. // http://code.spip.net/@analyser_doctype -function analyser_doctype($data) -{ +function analyser_doctype($data) { if (!preg_match(_REGEXP_DOCTYPE, $data, $page)) { if (preg_match(_REGEXP_XML, $data, $page)) { - list(,$entete, $topelement) = $page; - if ($topelement == 'rss') - return array($entete, 'PUBLIC', - _DOCTYPE_RSS, - 'rss-0.91.dtd'); - else { + list(, $entete, $topelement) = $page; + if ($topelement == 'rss') { + return array( + $entete, + 'PUBLIC', + _DOCTYPE_RSS, + 'rss-0.91.dtd' + ); + } else { $dtd = $topelement . '.dtd'; $f = find_in_path($dtd); - if (file_exists($f)) - return array($entete, 'SYSTEM', $f, $dtd); + if (file_exists($f)) { + return array($entete, 'SYSTEM', $f, $dtd); + } } } spip_log("Dtd pas vu pour " . substr($data, 0, 100)); + return array(); } - list($entete,, $topelement, $avail,$suite) = $page; + list($entete, , $topelement, $avail, $suite) = $page; - if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r)) - if (!preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) - return array(); - list(,$rotlvl, $suite) = $r; + if (!preg_match('/^"([^"]*)"\s*(.*)$/', $suite, $r)) { + if (!preg_match("/^'([^']*)'\s*(.*)$/", $suite, $r)) { + return array(); + } + } + list(, $rotlvl, $suite) = $r; if (!$suite) { - if ($avail != 'SYSTEM') return array(); + if ($avail != 'SYSTEM') { + return array(); + } $grammaire = $rotlvl; $rotlvl = ''; } else { - if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r)) - if (!preg_match("/^'([^']*)'\s*$/", $suite, $r)) + if (!preg_match('/^"([^"]*)"\s*$/', $suite, $r)) { + if (!preg_match("/^'([^']*)'\s*$/", $suite, $r)) { return array(); + } + } $grammaire = $r[1]; } return array($entete, $avail, $grammaire, $rotlvl); } + ?> diff --git a/ecrire/xml/valider.php b/ecrire/xml/valider.php index 4bb468d9ce..4844cc1414 100644 --- a/ecrire/xml/valider.php +++ b/ecrire/xml/valider.php @@ -10,7 +10,9 @@ * Pour plus de details voir le fichier COPYING.txt ou l'aide en ligne. * \***************************************************************************/ -if (!defined('_ECRIRE_INC_VERSION')) return; +if (!defined('_ECRIRE_INC_VERSION')) { + return; +} /** * Validateur XML en deux passes, fondé sur SAX pour la première @@ -18,21 +20,21 @@ if (!defined('_ECRIRE_INC_VERSION')) return; * @note * Faudrait faire deux classes car pour la première passe * on a les memes methodes et variables que l'indenteur -**/ + **/ class ValidateurXML { // http://code.spip.net/@validerElement - function validerElement($phraseur, $name, $attrs) - { + function validerElement($phraseur, $name, $attrs) { if (!($p = isset($this->dtc->elements[$name]))) { if ($p = strpos($name, ':')) { $name = substr($name, $p+1); $p = isset($this->dtc->elements[$name]); } if (!$p) { - coordonnees_erreur($this," <b>$name</b> : " + coordonnees_erreur($this, " <b>$name</b> : " . _T('zxml_inconnu_balise')); - return; + + return; } } // controler les filles illegitimes, ca suffit @@ -53,16 +55,16 @@ class ValidateurXML { } } if (!$p) { - $bons_peres = @join ('</b>, <b>', $this->dtc->peres[$name]); + $bons_peres = @join('</b>, <b>', $this->dtc->peres[$name]); coordonnees_erreur($this, " <b>$name</b> " . _T('zxml_non_fils') . ' <b>' - . $pere + . $pere . '</b>' . (!$bons_peres ? '' - : ('<p style="font-size: 80%"> '._T('zxml_mais_de').' <b>'. $bons_peres . '</b></p>'))); - } elseif ($this->dtc->regles[$pere][0]=='/') { - $frat = substr($depth,2); + : ('<p style="font-size: 80%"> ' . _T('zxml_mais_de') . ' <b>' . $bons_peres . '</b></p>'))); + } elseif ($this->dtc->regles[$pere][0] == '/') { + $frat = substr($depth, 2); if (!isset($this->fratrie[$frat])) { $this->fratrie[$frat] = ''; } @@ -72,7 +74,7 @@ class ValidateurXML { } } // Init de la suite des balises a memoriser si regle difficile - if ($this->dtc->regles[$name] and $this->dtc->regles[$name][0]=='/') { + if ($this->dtc->regles[$name] and $this->dtc->regles[$name][0] == '/') { $this->fratrie[$depth] = ''; } if (isset($this->dtc->attributs[$name])) { @@ -88,52 +90,53 @@ class ValidateurXML { } // http://code.spip.net/@validerAttribut - function validerAttribut($phraseur, $name, $val, $bal) - { + function validerAttribut($phraseur, $name, $val, $bal) { // Si la balise est inconnue, eviter d'insister - if (!isset($this->dtc->attributs[$bal])) - return ; - + if (!isset($this->dtc->attributs[$bal])) { + return; + } + $a = $this->dtc->attributs[$bal]; if (!isset($a[$name])) { - $bons = join(', ',array_keys($a)); - if ($bons) - $bons = " title=' " . - _T('zxml_connus_attributs') . - ' : ' . - $bons . - "'"; + $bons = join(', ', array_keys($a)); + if ($bons) { + $bons = " title=' " . + _T('zxml_connus_attributs') . + ' : ' . + $bons . + "'"; + } $bons .= " style='font-weight: bold'"; coordonnees_erreur($this, " <b>$name</b> " - . _T('zxml_inconnu_attribut').' '._T('zxml_de') + . _T('zxml_inconnu_attribut') . ' ' . _T('zxml_de') . " <a$bons>$bal</a> (" . _T('zxml_survoler') . ")"); } else { - $type = $a[$name][0]; - if (!preg_match('/^\w+$/', $type)) + $type = $a[$name][0]; + if (!preg_match('/^\w+$/', $type)) { $this->valider_motif($phraseur, $name, $val, $bal, $type); - else if (method_exists($this, $f = 'validerAttribut_' . $type)) - $this->$f($phraseur, $name, $val, $bal); - # else spip_log("$type type d'attribut inconnu"); + } else { + if (method_exists($this, $f = 'validerAttribut_' . $type)) { + $this->$f($phraseur, $name, $val, $bal); + } + } + # else spip_log("$type type d'attribut inconnu"); } } - function validerAttribut_NMTOKEN($phraseur, $name, $val, $bal) - { + function validerAttribut_NMTOKEN($phraseur, $name, $val, $bal) { $this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_NMTOKEN); } - function validerAttribut_NMTOKENS($phraseur, $name, $val, $bal) - { + function validerAttribut_NMTOKENS($phraseur, $name, $val, $bal) { $this->valider_motif($phraseur, $name, $val, $bal, _REGEXP_NMTOKENS); } // http://code.spip.net/@validerAttribut_ID - function validerAttribut_ID($phraseur, $name, $val, $bal) - { + function validerAttribut_ID($phraseur, $name, $val, $bal) { if (isset($this->ids[$val])) { - list($l,$c) = $this->ids[$val]; + list($l, $c) = $this->ids[$val]; coordonnees_erreur($this, " <p><b>$val</b> " . _T('zxml_valeur_attribut') . " <b>$name</b> " @@ -148,42 +151,38 @@ class ValidateurXML { } // http://code.spip.net/@validerAttribut_IDREF - function validerAttribut_IDREF($phraseur, $name, $val, $bal) - { + function validerAttribut_IDREF($phraseur, $name, $val, $bal) { $this->idrefs[] = array($val, xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)); } // http://code.spip.net/@validerAttribut_IDREFS - function validerAttribut_IDREFS($phraseur, $name, $val, $bal) - { + function validerAttribut_IDREFS($phraseur, $name, $val, $bal) { $this->idrefss[] = array($val, xml_get_current_line_number($phraseur), xml_get_current_column_number($phraseur)); } // http://code.spip.net/@valider_motif - function valider_motif($phraseur, $name, $val, $bal, $motif) - { + function valider_motif($phraseur, $name, $val, $bal, $motif) { if (!preg_match($motif, $val)) { coordonnees_erreur($this, "<b>$val</b> " - . _T('zxml_valeur_attribut') - . " <b>$name</b> " - . _T('zxml_de') - . " <b>$bal</b> " - . _T('zxml_non_conforme') - . "</p><p>" - . "<b>" . $motif . "</b>"); + . _T('zxml_valeur_attribut') + . " <b>$name</b> " + . _T('zxml_de') + . " <b>$bal</b> " + . _T('zxml_non_conforme') + . "</p><p>" + . "<b>" . $motif . "</b>"); } } // http://code.spip.net/@valider_idref - function valider_idref($nom, $ligne, $col) - { - if (!isset($this->ids[$nom])) - $this->err[]= array(" <p><b>$nom</b> " . _T('zxml_inconnu_id'), $ligne, $col); + function valider_idref($nom, $ligne, $col) { + if (!isset($this->ids[$nom])) { + $this->err[] = array(" <p><b>$nom</b> " . _T('zxml_inconnu_id'), $ligne, $col); + } } // http://code.spip.net/@valider_passe2 - function valider_passe2() - { + function valider_passe2() { if (!$this->err) { foreach ($this->idrefs as $idref) { list($nom, $ligne, $col) = $idref; @@ -191,7 +190,7 @@ class ValidateurXML { } foreach ($this->idrefss as $idref) { list($noms, $ligne, $col) = $idref; - foreach(preg_split('/\s+/', $noms) as $nom) { + foreach (preg_split('/\s+/', $noms) as $nom) { $this->valider_idref($nom, $ligne, $col); } } @@ -199,22 +198,23 @@ class ValidateurXML { } // http://code.spip.net/@debutElement - function debutElement($phraseur, $name, $attrs) - { - if ($this->dtc->elements) + function debutElement($phraseur, $name, $attrs) { + if ($this->dtc->elements) { $this->validerElement($phraseur, $name, $attrs); + } - if ($f = $this->process['debut']) $f($this, $name, $attrs); + if ($f = $this->process['debut']) { + $f($this, $name, $attrs); + } $depth = $this->depth; - $this->debuts[$depth] = strlen($this->res); + $this->debuts[$depth] = strlen($this->res); foreach ($attrs as $k => $v) { $this->validerAttribut($phraseur, $k, $v, $name); } } // http://code.spip.net/@finElement - function finElement($phraseur, $name) - { + function finElement($phraseur, $name) { $depth = $this->depth; $contenu = $this->contenu; @@ -223,55 +223,59 @@ class ValidateurXML { $k = $this->debuts[$depth]; $regle = $this->dtc->regles[$name]; - $vide = ($regle == 'EMPTY'); + $vide = ($regle == 'EMPTY'); // controler que les balises devant etre vides le sont if ($vide) { - if ($n <> ($k + $c)) { + if ($n <> ($k+$c)) { coordonnees_erreur($this, " <p><b>$name</b> " . _T('zxml_nonvide_balise')); } - // pour les regles PCDATA ou iteration de disjonction, tout est fait + // pour les regles PCDATA ou iteration de disjonction, tout est fait } elseif ($regle AND ($regle != '*')) { if ($regle == '+') { // iteration de disjonction non vide: 1 balise au - if ($n == $k) { coordonnees_erreur($this, "<p>\n<b>$name</b> " - . _T('zxml_vide_balise')); + . _T('zxml_vide_balise')); } } else { - $f = $this->fratrie[substr($depth,2)]; + $f = $this->fratrie[substr($depth, 2)]; if (!preg_match($regle, $f)) { coordonnees_erreur($this, - " <p>\n<b>$name</b> " - . _T('zxml_succession_fils_incorrecte') - . ' : <b>' - . $f - . '</b>'); + " <p>\n<b>$name</b> " + . _T('zxml_succession_fils_incorrecte') + . ' : <b>' + . $f + . '</b>'); } } } - if ($f = $this->process['fin']) $f($this, $name, $vide); + if ($f = $this->process['fin']) { + $f($this, $name, $vide); + } } // http://code.spip.net/@textElement - function textElement($phraseur, $data) - { + function textElement($phraseur, $data) { if (trim($data)) { $d = $this->depth; $d = $this->ouvrant[$d]; preg_match('/^\s*(\S+)/', $d, $m); if ($this->dtc->pcdata[$m[1]]) { - coordonnees_erreur($this, " <p><b>". $m[1] . "</b> " - . _T('zxml_nonvide_balise') // message a affiner + coordonnees_erreur($this, " <p><b>" . $m[1] . "</b> " + . _T('zxml_nonvide_balise') // message a affiner ); } } - if ($f = $this->process['text']) $f($this, $data); + if ($f = $this->process['text']) { + $f($this, $data); + } } - function piElement($phraseur, $target, $data) - { - if ($f = $this->process['pi']) $f($this, $target, $data); + function piElement($phraseur, $target, $data) { + if ($f = $this->process['pi']) { + $f($this, $target, $data); + } } // Denonciation des entitees XML inconnues @@ -282,30 +286,31 @@ class ValidateurXML { // le source de la page laisse legitimement supposer. // http://code.spip.net/@defautElement - function defaultElement($phraseur, $data) - { + function defaultElement($phraseur, $data) { if (!preg_match('/^<!--/', $data) - AND (preg_match_all('/&([^;]*)?/', $data, $r, PREG_SET_ORDER))) + AND (preg_match_all('/&([^;]*)?/', $data, $r, PREG_SET_ORDER)) + ) { foreach ($r as $m) { - list($t,$e) = $m; - if (!isset($this->dtc->entites[$e])) + list($t, $e) = $m; + if (!isset($this->dtc->entites[$e])) { coordonnees_erreur($this, " <b>$e</b> " - . _T('zxml_inconnu_entite') - . ' ' - ); + . _T('zxml_inconnu_entite') + . ' ' + ); + } } + } if (isset($this->process['default']) AND ($f = $this->process['default'])) { $f($this, $data); } } // http://code.spip.net/@phraserTout - function phraserTout($phraseur, $data) - { + function phraserTout($phraseur, $data) { xml_parsestring($this, $data); if (!$this->dtc OR preg_match(',^' . _MESSAGE_DOCTYPE . ',', $data)) { - $this->err[]= array('DOCTYPE ?', 0, 0); + $this->err[] = array('DOCTYPE ?', 0, 0); } else { $this->valider_passe2($this); } @@ -315,32 +320,34 @@ class ValidateurXML { * Constructeur * * @param array $process ? - **/ + **/ function __construct($process = array()) { - if (is_array($process)) $this->process = $process; + if (is_array($process)) { + $this->process = $process; + } } - var $ids = array(); - var $idrefs = array(); - var $idrefss = array(); - var $debuts = array(); - var $fratrie = array(); - - var $dtc = NULL; - var $sax = NULL; - var $depth = ""; - var $entete = ''; - var $page = ''; - var $res = ""; - var $err = array(); - var $contenu = array(); - var $ouvrant = array(); - var $reperes = array(); - var $process = array( - 'debut' => 'xml_debutElement', - 'fin' => 'xml_finElement', - 'text' => 'xml_textElement', - 'pi' => 'xml_piElement', + var $ids = array(); + var $idrefs = array(); + var $idrefss = array(); + var $debuts = array(); + var $fratrie = array(); + + var $dtc = null; + var $sax = null; + var $depth = ""; + var $entete = ''; + var $page = ''; + var $res = ""; + var $err = array(); + var $contenu = array(); + var $ouvrant = array(); + var $reperes = array(); + var $process = array( + 'debut' => 'xml_debutElement', + 'fin' => 'xml_finElement', + 'text' => 'xml_textElement', + 'pi' => 'xml_piElement', 'default' => 'xml_defaultElement' ); } @@ -349,12 +356,13 @@ class ValidateurXML { /** * Retourne une structure ValidateurXML, dont le champ "err" est un tableau * ayant comme entrees des sous-tableaux [message, ligne, colonne] - * -**/ -function xml_valider_dist($page, $apply = false, $process = false, $doctype = '', $charset = null) -{ + * + **/ +function xml_valider_dist($page, $apply = false, $process = false, $doctype = '', $charset = null) { $f = new ValidateurXML($process); $sax = charger_fonction('sax', 'xml'); + return $sax($page, $apply, $f, $doctype, $charset); } + ?> -- GitLab