@@ -5,118 +5,118 @@ |
||
| 5 | 5 | |
| 6 | 6 | return [ |
| 7 | 7 | |
| 8 | - // A |
|
| 9 | - 'accueil_site' => 'Home', |
|
| 10 | - 'article' => 'Article', |
|
| 11 | - 'articles' => 'Articles', |
|
| 12 | - 'articles_auteur' => 'Articles by this author', |
|
| 13 | - 'articles_populaires' => 'Most popular articles', |
|
| 14 | - 'articles_rubrique' => 'Articles in this section', |
|
| 15 | - 'aucun_article' => 'No articles here', |
|
| 16 | - 'aucun_auteur' => 'No authors here', |
|
| 17 | - 'aucun_site' => 'No links here', |
|
| 18 | - 'aucune_breve' => 'No news items here', |
|
| 19 | - 'aucune_rubrique' => 'No sections here', |
|
| 20 | - 'auteur' => 'Author', |
|
| 21 | - 'autres' => 'Others', |
|
| 22 | - 'autres_breves' => 'Other news', |
|
| 23 | - 'autres_groupes_mots_clefs' => 'Other groups of keywords', |
|
| 24 | - 'autres_sites' => 'Other websites', |
|
| 25 | - |
|
| 26 | - // B |
|
| 27 | - 'bonjour' => 'Hello', |
|
| 28 | - |
|
| 29 | - // C |
|
| 30 | - 'commenter_site' => 'Comment on this site', |
|
| 31 | - 'contact' => 'Contact', |
|
| 32 | - 'copie_document_impossible' => 'Impossible to copy this document', |
|
| 33 | - |
|
| 34 | - // D |
|
| 35 | - 'date' => 'Date', |
|
| 36 | - 'dernier_ajout' => 'Latest update', |
|
| 37 | - 'dernieres_breves' => 'Latest news', |
|
| 38 | - 'derniers_articles' => 'Latest articles', |
|
| 39 | - 'derniers_commentaires' => 'Latest comments', |
|
| 40 | - 'derniers_messages_forum' => 'Latest forum posts', |
|
| 41 | - |
|
| 42 | - // E |
|
| 43 | - 'edition_mode_texte' => 'Text mode only', |
|
| 44 | - 'en_reponse' => 'Replying to:', |
|
| 45 | - 'en_resume' => 'Summary', |
|
| 46 | - 'envoyer_message' => 'Send a message', |
|
| 47 | - 'espace_prive' => 'Back-office', |
|
| 48 | - |
|
| 49 | - // F |
|
| 50 | - 'formats_acceptes' => 'Valid formats: @formats@.', |
|
| 51 | - |
|
| 52 | - // H |
|
| 53 | - 'hierarchie_site' => 'Site map', |
|
| 54 | - |
|
| 55 | - // J |
|
| 56 | - 'jours' => 'days', |
|
| 57 | - |
|
| 58 | - // L |
|
| 59 | - 'lien_connecter' => 'Log in', |
|
| 60 | - |
|
| 61 | - // M |
|
| 62 | - 'meme_auteur' => 'By the same author', |
|
| 63 | - 'meme_rubrique' => 'Also in this section', |
|
| 64 | - 'memes_auteurs' => 'By the same authors', |
|
| 65 | - 'message' => 'Message', |
|
| 66 | - 'messages_forum' => 'Forum posts', |
|
| 67 | - 'messages_recents' => 'Most recent forum posts', |
|
| 68 | - 'mots_clef' => 'Keyword', |
|
| 69 | - 'mots_clefs' => 'Keywords', |
|
| 70 | - 'mots_clefs_meme_groupe' => 'Other keywords in this group', |
|
| 71 | - |
|
| 72 | - // N |
|
| 73 | - 'navigation' => 'Browsing', |
|
| 74 | - 'nom' => 'Name', |
|
| 75 | - 'nouveautes' => 'What’s new', |
|
| 76 | - 'nouveautes_web' => 'What’s new on the Web', |
|
| 77 | - 'nouveaux_articles' => 'New articles', |
|
| 78 | - 'nouvelles_breves' => 'Latest news items', |
|
| 79 | - |
|
| 80 | - // P |
|
| 81 | - 'page_precedente' => 'previous page', |
|
| 82 | - 'page_suivante' => 'next page', |
|
| 83 | - 'par_auteur' => 'by ', |
|
| 84 | - 'participer_site' => 'You can take active part in this website and write your own articles by signing up here. You will receive an email with your account information for the back-office of the site.', |
|
| 85 | - 'plan_site' => 'Site Map', |
|
| 86 | - 'popularite' => 'Popularity', |
|
| 87 | - 'poster_message' => 'Post a message', |
|
| 88 | - 'proposer_site' => 'You can suggest a website for inclusion in this section:', |
|
| 89 | - |
|
| 90 | - // R |
|
| 91 | - 'repondre_article' => 'Comment on this article', |
|
| 92 | - 'repondre_breve' => 'Comment on this news item', |
|
| 93 | - 'resultats_recherche' => 'Search results', |
|
| 94 | - 'retour_debut_forums' => 'Back to forum top', |
|
| 95 | - 'rss_abonnement' => 'Simply copy the following URL into your aggregator:', |
|
| 96 | - 'rss_abonnement_titre' => 'Subscribe', |
|
| 97 | - 'rss_abonnement_titre_page' => 'Subscribe to', |
|
| 98 | - 'rss_explication' => 'An RSS thread collects information about a site’s update. It delivers the content of the tickets or the comments or an extract of them, as well as a link to the full versions et some other information. This thread is to be read by an RSS aggregator.', |
|
| 99 | - 'rss_explication_titre' => 'What is an RSS feed?', |
|
| 100 | - 'rubrique' => 'Section', |
|
| 101 | - 'rubriques' => 'Sections', |
|
| 102 | - |
|
| 103 | - // S |
|
| 104 | - 'signatures_petition' => 'Signatures', |
|
| 105 | - 'site_realise_avec_spip' => 'Site powered by SPIP', |
|
| 106 | - 'sites_web' => 'Websites', |
|
| 107 | - 'sous_rubriques' => 'Subsections', |
|
| 108 | - 'spam' => 'Spam', |
|
| 109 | - 'suite' => 'continue', |
|
| 110 | - 'sur_web' => 'Around the Web', |
|
| 111 | - 'syndiquer_rubrique' => 'Subscribe to this section', |
|
| 112 | - 'syndiquer_site' => 'Subscribe to the whole site', |
|
| 113 | - |
|
| 114 | - // T |
|
| 115 | - 'texte_lettre_information' => 'Here is the site newsletter', |
|
| 116 | - 'texte_lettre_information_2' => 'This site contains news items published since', |
|
| 117 | - |
|
| 118 | - // V |
|
| 119 | - 'ver_imprimer' => 'Printable version', |
|
| 120 | - 'voir_en_ligne' => 'View online', |
|
| 121 | - 'voir_squelette' => 'show the template of this page', |
|
| 8 | + // A |
|
| 9 | + 'accueil_site' => 'Home', |
|
| 10 | + 'article' => 'Article', |
|
| 11 | + 'articles' => 'Articles', |
|
| 12 | + 'articles_auteur' => 'Articles by this author', |
|
| 13 | + 'articles_populaires' => 'Most popular articles', |
|
| 14 | + 'articles_rubrique' => 'Articles in this section', |
|
| 15 | + 'aucun_article' => 'No articles here', |
|
| 16 | + 'aucun_auteur' => 'No authors here', |
|
| 17 | + 'aucun_site' => 'No links here', |
|
| 18 | + 'aucune_breve' => 'No news items here', |
|
| 19 | + 'aucune_rubrique' => 'No sections here', |
|
| 20 | + 'auteur' => 'Author', |
|
| 21 | + 'autres' => 'Others', |
|
| 22 | + 'autres_breves' => 'Other news', |
|
| 23 | + 'autres_groupes_mots_clefs' => 'Other groups of keywords', |
|
| 24 | + 'autres_sites' => 'Other websites', |
|
| 25 | + |
|
| 26 | + // B |
|
| 27 | + 'bonjour' => 'Hello', |
|
| 28 | + |
|
| 29 | + // C |
|
| 30 | + 'commenter_site' => 'Comment on this site', |
|
| 31 | + 'contact' => 'Contact', |
|
| 32 | + 'copie_document_impossible' => 'Impossible to copy this document', |
|
| 33 | + |
|
| 34 | + // D |
|
| 35 | + 'date' => 'Date', |
|
| 36 | + 'dernier_ajout' => 'Latest update', |
|
| 37 | + 'dernieres_breves' => 'Latest news', |
|
| 38 | + 'derniers_articles' => 'Latest articles', |
|
| 39 | + 'derniers_commentaires' => 'Latest comments', |
|
| 40 | + 'derniers_messages_forum' => 'Latest forum posts', |
|
| 41 | + |
|
| 42 | + // E |
|
| 43 | + 'edition_mode_texte' => 'Text mode only', |
|
| 44 | + 'en_reponse' => 'Replying to:', |
|
| 45 | + 'en_resume' => 'Summary', |
|
| 46 | + 'envoyer_message' => 'Send a message', |
|
| 47 | + 'espace_prive' => 'Back-office', |
|
| 48 | + |
|
| 49 | + // F |
|
| 50 | + 'formats_acceptes' => 'Valid formats: @formats@.', |
|
| 51 | + |
|
| 52 | + // H |
|
| 53 | + 'hierarchie_site' => 'Site map', |
|
| 54 | + |
|
| 55 | + // J |
|
| 56 | + 'jours' => 'days', |
|
| 57 | + |
|
| 58 | + // L |
|
| 59 | + 'lien_connecter' => 'Log in', |
|
| 60 | + |
|
| 61 | + // M |
|
| 62 | + 'meme_auteur' => 'By the same author', |
|
| 63 | + 'meme_rubrique' => 'Also in this section', |
|
| 64 | + 'memes_auteurs' => 'By the same authors', |
|
| 65 | + 'message' => 'Message', |
|
| 66 | + 'messages_forum' => 'Forum posts', |
|
| 67 | + 'messages_recents' => 'Most recent forum posts', |
|
| 68 | + 'mots_clef' => 'Keyword', |
|
| 69 | + 'mots_clefs' => 'Keywords', |
|
| 70 | + 'mots_clefs_meme_groupe' => 'Other keywords in this group', |
|
| 71 | + |
|
| 72 | + // N |
|
| 73 | + 'navigation' => 'Browsing', |
|
| 74 | + 'nom' => 'Name', |
|
| 75 | + 'nouveautes' => 'What’s new', |
|
| 76 | + 'nouveautes_web' => 'What’s new on the Web', |
|
| 77 | + 'nouveaux_articles' => 'New articles', |
|
| 78 | + 'nouvelles_breves' => 'Latest news items', |
|
| 79 | + |
|
| 80 | + // P |
|
| 81 | + 'page_precedente' => 'previous page', |
|
| 82 | + 'page_suivante' => 'next page', |
|
| 83 | + 'par_auteur' => 'by ', |
|
| 84 | + 'participer_site' => 'You can take active part in this website and write your own articles by signing up here. You will receive an email with your account information for the back-office of the site.', |
|
| 85 | + 'plan_site' => 'Site Map', |
|
| 86 | + 'popularite' => 'Popularity', |
|
| 87 | + 'poster_message' => 'Post a message', |
|
| 88 | + 'proposer_site' => 'You can suggest a website for inclusion in this section:', |
|
| 89 | + |
|
| 90 | + // R |
|
| 91 | + 'repondre_article' => 'Comment on this article', |
|
| 92 | + 'repondre_breve' => 'Comment on this news item', |
|
| 93 | + 'resultats_recherche' => 'Search results', |
|
| 94 | + 'retour_debut_forums' => 'Back to forum top', |
|
| 95 | + 'rss_abonnement' => 'Simply copy the following URL into your aggregator:', |
|
| 96 | + 'rss_abonnement_titre' => 'Subscribe', |
|
| 97 | + 'rss_abonnement_titre_page' => 'Subscribe to', |
|
| 98 | + 'rss_explication' => 'An RSS thread collects information about a site’s update. It delivers the content of the tickets or the comments or an extract of them, as well as a link to the full versions et some other information. This thread is to be read by an RSS aggregator.', |
|
| 99 | + 'rss_explication_titre' => 'What is an RSS feed?', |
|
| 100 | + 'rubrique' => 'Section', |
|
| 101 | + 'rubriques' => 'Sections', |
|
| 102 | + |
|
| 103 | + // S |
|
| 104 | + 'signatures_petition' => 'Signatures', |
|
| 105 | + 'site_realise_avec_spip' => 'Site powered by SPIP', |
|
| 106 | + 'sites_web' => 'Websites', |
|
| 107 | + 'sous_rubriques' => 'Subsections', |
|
| 108 | + 'spam' => 'Spam', |
|
| 109 | + 'suite' => 'continue', |
|
| 110 | + 'sur_web' => 'Around the Web', |
|
| 111 | + 'syndiquer_rubrique' => 'Subscribe to this section', |
|
| 112 | + 'syndiquer_site' => 'Subscribe to the whole site', |
|
| 113 | + |
|
| 114 | + // T |
|
| 115 | + 'texte_lettre_information' => 'Here is the site newsletter', |
|
| 116 | + 'texte_lettre_information_2' => 'This site contains news items published since', |
|
| 117 | + |
|
| 118 | + // V |
|
| 119 | + 'ver_imprimer' => 'Printable version', |
|
| 120 | + 'voir_en_ligne' => 'View online', |
|
| 121 | + 'voir_squelette' => 'show the template of this page', |
|
| 122 | 122 | ]; |
@@ -10,7 +10,7 @@ discard block |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | /** |
@@ -39,26 +39,26 @@ discard block |
||
| 39 | 39 | */ |
| 40 | 40 | function formulaires_inscription_charger_dist($mode = '', $options = [], $retour = '') { |
| 41 | 41 | |
| 42 | - $id = ($options['id'] ?? 0); |
|
| 43 | - |
|
| 44 | - // fournir le mode de la config ou tester si l'argument du formulaire est un mode accepte par celle-ci |
|
| 45 | - // pas de formulaire si le mode est interdit |
|
| 46 | - include_spip('inc/autoriser'); |
|
| 47 | - if (!autoriser('inscrireauteur', $mode, $id)) { |
|
| 48 | - return false; |
|
| 49 | - } |
|
| 50 | - |
|
| 51 | - // pas de formulaire si on a déjà une session avec un statut égal ou meilleur au mode |
|
| 52 | - if (isset($GLOBALS['visiteur_session']['statut']) && $GLOBALS['visiteur_session']['statut'] <= $mode) { |
|
| 53 | - return false; |
|
| 54 | - } |
|
| 55 | - |
|
| 56 | - return [ |
|
| 57 | - 'nom_inscription' => '', |
|
| 58 | - 'mail_inscription' => '', |
|
| 59 | - 'id' => $id, |
|
| 60 | - '_mode' => $mode |
|
| 61 | - ]; |
|
| 42 | + $id = ($options['id'] ?? 0); |
|
| 43 | + |
|
| 44 | + // fournir le mode de la config ou tester si l'argument du formulaire est un mode accepte par celle-ci |
|
| 45 | + // pas de formulaire si le mode est interdit |
|
| 46 | + include_spip('inc/autoriser'); |
|
| 47 | + if (!autoriser('inscrireauteur', $mode, $id)) { |
|
| 48 | + return false; |
|
| 49 | + } |
|
| 50 | + |
|
| 51 | + // pas de formulaire si on a déjà une session avec un statut égal ou meilleur au mode |
|
| 52 | + if (isset($GLOBALS['visiteur_session']['statut']) && $GLOBALS['visiteur_session']['statut'] <= $mode) { |
|
| 53 | + return false; |
|
| 54 | + } |
|
| 55 | + |
|
| 56 | + return [ |
|
| 57 | + 'nom_inscription' => '', |
|
| 58 | + 'mail_inscription' => '', |
|
| 59 | + 'id' => $id, |
|
| 60 | + '_mode' => $mode |
|
| 61 | + ]; |
|
| 62 | 62 | } |
| 63 | 63 | |
| 64 | 64 | |
@@ -71,65 +71,65 @@ discard block |
||
| 71 | 71 | * @return array |
| 72 | 72 | */ |
| 73 | 73 | function formulaires_inscription_verifier_dist($mode = '', $options = [], $retour = '') { |
| 74 | - set_request('_upgrade_auteur'); // securite |
|
| 75 | - include_spip('inc/filtres'); |
|
| 76 | - $erreurs = []; |
|
| 77 | - |
|
| 78 | - $id = ($options['id'] ?? 0); |
|
| 79 | - |
|
| 80 | - include_spip('inc/autoriser'); |
|
| 81 | - if (!autoriser('inscrireauteur', $mode, $id) || strlen((string) _request('nobot')) > 0) { |
|
| 82 | - $erreurs['message_erreur'] = _T('pass_rien_a_faire_ici'); |
|
| 83 | - } |
|
| 84 | - |
|
| 85 | - if (!$nom = _request('nom_inscription')) { |
|
| 86 | - $erreurs['nom_inscription'] = _T('info_obligatoire'); |
|
| 87 | - } elseif (!nom_acceptable(_request('nom_inscription'))) { |
|
| 88 | - $erreurs['nom_inscription'] = _T('ecrire:info_nom_pas_conforme'); |
|
| 89 | - } |
|
| 90 | - if (!$mail = (string) _request('mail_inscription')) { |
|
| 91 | - $erreurs['mail_inscription'] = _T('info_obligatoire'); |
|
| 92 | - } |
|
| 93 | - |
|
| 94 | - // compatibilite avec anciennes fonction surchargeables |
|
| 95 | - // plus de definition par defaut |
|
| 96 | - if ($erreurs === []) { |
|
| 97 | - include_spip('action/inscrire_auteur'); |
|
| 98 | - $f = function_exists('test_inscription') ? 'test_inscription' : 'test_inscription_dist'; |
|
| 99 | - $declaration = $f($mode, $mail, $nom, $options); |
|
| 100 | - if (is_string($declaration)) { |
|
| 101 | - $k = (str_contains($declaration, 'mail')) ? |
|
| 102 | - 'mail_inscription' : 'nom_inscription'; |
|
| 103 | - $erreurs[$k] = _T($declaration); |
|
| 104 | - } else { |
|
| 105 | - include_spip('base/abstract_sql'); |
|
| 106 | - |
|
| 107 | - if ( |
|
| 108 | - $row = sql_fetsel( |
|
| 109 | - 'statut, id_auteur, login, email', |
|
| 110 | - 'spip_auteurs', |
|
| 111 | - 'email=' . sql_quote($declaration['email']) |
|
| 112 | - ) |
|
| 113 | - ) { |
|
| 114 | - if ($row['statut'] == '5poubelle' && empty($declaration['pass'])) { |
|
| 115 | - // irrecuperable |
|
| 116 | - $erreurs['message_erreur'] = _T('form_forum_access_refuse'); |
|
| 117 | - } else { |
|
| 118 | - if ($row['statut'] != 'nouveau' && empty($declaration['pass'])) { |
|
| 119 | - if ((int) $row['statut'] > (int) $mode) { |
|
| 120 | - set_request('_upgrade_auteur', $row['id_auteur']); |
|
| 121 | - } else { |
|
| 122 | - // deja inscrit |
|
| 123 | - $erreurs['message_erreur'] = _T('form_forum_email_deja_enregistre'); |
|
| 124 | - } |
|
| 125 | - } |
|
| 126 | - } |
|
| 127 | - spip_logger()->info($row['id_auteur'] . ' veut se resinscrire'); |
|
| 128 | - } |
|
| 129 | - } |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - return $erreurs; |
|
| 74 | + set_request('_upgrade_auteur'); // securite |
|
| 75 | + include_spip('inc/filtres'); |
|
| 76 | + $erreurs = []; |
|
| 77 | + |
|
| 78 | + $id = ($options['id'] ?? 0); |
|
| 79 | + |
|
| 80 | + include_spip('inc/autoriser'); |
|
| 81 | + if (!autoriser('inscrireauteur', $mode, $id) || strlen((string) _request('nobot')) > 0) { |
|
| 82 | + $erreurs['message_erreur'] = _T('pass_rien_a_faire_ici'); |
|
| 83 | + } |
|
| 84 | + |
|
| 85 | + if (!$nom = _request('nom_inscription')) { |
|
| 86 | + $erreurs['nom_inscription'] = _T('info_obligatoire'); |
|
| 87 | + } elseif (!nom_acceptable(_request('nom_inscription'))) { |
|
| 88 | + $erreurs['nom_inscription'] = _T('ecrire:info_nom_pas_conforme'); |
|
| 89 | + } |
|
| 90 | + if (!$mail = (string) _request('mail_inscription')) { |
|
| 91 | + $erreurs['mail_inscription'] = _T('info_obligatoire'); |
|
| 92 | + } |
|
| 93 | + |
|
| 94 | + // compatibilite avec anciennes fonction surchargeables |
|
| 95 | + // plus de definition par defaut |
|
| 96 | + if ($erreurs === []) { |
|
| 97 | + include_spip('action/inscrire_auteur'); |
|
| 98 | + $f = function_exists('test_inscription') ? 'test_inscription' : 'test_inscription_dist'; |
|
| 99 | + $declaration = $f($mode, $mail, $nom, $options); |
|
| 100 | + if (is_string($declaration)) { |
|
| 101 | + $k = (str_contains($declaration, 'mail')) ? |
|
| 102 | + 'mail_inscription' : 'nom_inscription'; |
|
| 103 | + $erreurs[$k] = _T($declaration); |
|
| 104 | + } else { |
|
| 105 | + include_spip('base/abstract_sql'); |
|
| 106 | + |
|
| 107 | + if ( |
|
| 108 | + $row = sql_fetsel( |
|
| 109 | + 'statut, id_auteur, login, email', |
|
| 110 | + 'spip_auteurs', |
|
| 111 | + 'email=' . sql_quote($declaration['email']) |
|
| 112 | + ) |
|
| 113 | + ) { |
|
| 114 | + if ($row['statut'] == '5poubelle' && empty($declaration['pass'])) { |
|
| 115 | + // irrecuperable |
|
| 116 | + $erreurs['message_erreur'] = _T('form_forum_access_refuse'); |
|
| 117 | + } else { |
|
| 118 | + if ($row['statut'] != 'nouveau' && empty($declaration['pass'])) { |
|
| 119 | + if ((int) $row['statut'] > (int) $mode) { |
|
| 120 | + set_request('_upgrade_auteur', $row['id_auteur']); |
|
| 121 | + } else { |
|
| 122 | + // deja inscrit |
|
| 123 | + $erreurs['message_erreur'] = _T('form_forum_email_deja_enregistre'); |
|
| 124 | + } |
|
| 125 | + } |
|
| 126 | + } |
|
| 127 | + spip_logger()->info($row['id_auteur'] . ' veut se resinscrire'); |
|
| 128 | + } |
|
| 129 | + } |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + return $erreurs; |
|
| 133 | 133 | } |
| 134 | 134 | |
| 135 | 135 | /** |
@@ -140,51 +140,51 @@ discard block |
||
| 140 | 140 | * @return array |
| 141 | 141 | */ |
| 142 | 142 | function formulaires_inscription_traiter_dist($mode = '', array $options = [], $retour = '') { |
| 143 | - if ($retour) { |
|
| 144 | - refuser_traiter_formulaire_ajax(); |
|
| 145 | - } |
|
| 146 | - |
|
| 147 | - include_spip('inc/filtres'); |
|
| 148 | - include_spip('inc/autoriser'); |
|
| 149 | - |
|
| 150 | - $id = ($options['id'] ?? 0); |
|
| 151 | - |
|
| 152 | - if (!autoriser('inscrireauteur', $mode, $id)) { |
|
| 153 | - $desc = 'rien a faire ici'; |
|
| 154 | - } else { |
|
| 155 | - if ($id_auteur = _request('_upgrade_auteur')) { |
|
| 156 | - include_spip('action/editer_auteur'); |
|
| 157 | - autoriser_exception('modifier', 'auteur', $id_auteur); |
|
| 158 | - autoriser_exception('instituer', 'auteur', $id_auteur); |
|
| 159 | - auteur_modifier($id_auteur, ['statut' => $mode]); |
|
| 160 | - autoriser_exception('modifier', 'auteur', $id_auteur, false); |
|
| 161 | - autoriser_exception('instituer', 'auteur', $id_auteur, false); |
|
| 162 | - |
|
| 163 | - return ['message_ok' => _T('form_forum_email_deja_enregistre'), 'id_auteur' => $id_auteur]; |
|
| 164 | - } |
|
| 165 | - |
|
| 166 | - $nom = _request('nom_inscription'); |
|
| 167 | - $mail_complet = _request('mail_inscription'); |
|
| 168 | - |
|
| 169 | - $inscrire_auteur = charger_fonction('inscrire_auteur', 'action'); |
|
| 170 | - $desc = $inscrire_auteur($mode, $mail_complet, $nom, $options); |
|
| 171 | - } |
|
| 172 | - |
|
| 173 | - // erreur ? |
|
| 174 | - if (is_string($desc)) { |
|
| 175 | - return ['message_erreur' => $desc]; |
|
| 176 | - } // OK |
|
| 177 | - else { |
|
| 178 | - $retours = [ |
|
| 179 | - 'message_ok' => _T('form_forum_identifiant_mail'), |
|
| 180 | - 'id_auteur' => $desc['id_auteur'] |
|
| 181 | - ]; |
|
| 182 | - |
|
| 183 | - // Si on demande à rediriger juste après validation du formulaire |
|
| 184 | - if ($retour) { |
|
| 185 | - $retours['redirect'] = $retour; |
|
| 186 | - } |
|
| 187 | - |
|
| 188 | - return $retours; |
|
| 189 | - } |
|
| 143 | + if ($retour) { |
|
| 144 | + refuser_traiter_formulaire_ajax(); |
|
| 145 | + } |
|
| 146 | + |
|
| 147 | + include_spip('inc/filtres'); |
|
| 148 | + include_spip('inc/autoriser'); |
|
| 149 | + |
|
| 150 | + $id = ($options['id'] ?? 0); |
|
| 151 | + |
|
| 152 | + if (!autoriser('inscrireauteur', $mode, $id)) { |
|
| 153 | + $desc = 'rien a faire ici'; |
|
| 154 | + } else { |
|
| 155 | + if ($id_auteur = _request('_upgrade_auteur')) { |
|
| 156 | + include_spip('action/editer_auteur'); |
|
| 157 | + autoriser_exception('modifier', 'auteur', $id_auteur); |
|
| 158 | + autoriser_exception('instituer', 'auteur', $id_auteur); |
|
| 159 | + auteur_modifier($id_auteur, ['statut' => $mode]); |
|
| 160 | + autoriser_exception('modifier', 'auteur', $id_auteur, false); |
|
| 161 | + autoriser_exception('instituer', 'auteur', $id_auteur, false); |
|
| 162 | + |
|
| 163 | + return ['message_ok' => _T('form_forum_email_deja_enregistre'), 'id_auteur' => $id_auteur]; |
|
| 164 | + } |
|
| 165 | + |
|
| 166 | + $nom = _request('nom_inscription'); |
|
| 167 | + $mail_complet = _request('mail_inscription'); |
|
| 168 | + |
|
| 169 | + $inscrire_auteur = charger_fonction('inscrire_auteur', 'action'); |
|
| 170 | + $desc = $inscrire_auteur($mode, $mail_complet, $nom, $options); |
|
| 171 | + } |
|
| 172 | + |
|
| 173 | + // erreur ? |
|
| 174 | + if (is_string($desc)) { |
|
| 175 | + return ['message_erreur' => $desc]; |
|
| 176 | + } // OK |
|
| 177 | + else { |
|
| 178 | + $retours = [ |
|
| 179 | + 'message_ok' => _T('form_forum_identifiant_mail'), |
|
| 180 | + 'id_auteur' => $desc['id_auteur'] |
|
| 181 | + ]; |
|
| 182 | + |
|
| 183 | + // Si on demande à rediriger juste après validation du formulaire |
|
| 184 | + if ($retour) { |
|
| 185 | + $retours['redirect'] = $retour; |
|
| 186 | + } |
|
| 187 | + |
|
| 188 | + return $retours; |
|
| 189 | + } |
|
| 190 | 190 | } |
@@ -108,7 +108,7 @@ discard block |
||
| 108 | 108 | $row = sql_fetsel( |
| 109 | 109 | 'statut, id_auteur, login, email', |
| 110 | 110 | 'spip_auteurs', |
| 111 | - 'email=' . sql_quote($declaration['email']) |
|
| 111 | + 'email='.sql_quote($declaration['email']) |
|
| 112 | 112 | ) |
| 113 | 113 | ) { |
| 114 | 114 | if ($row['statut'] == '5poubelle' && empty($declaration['pass'])) { |
@@ -124,7 +124,7 @@ discard block |
||
| 124 | 124 | } |
| 125 | 125 | } |
| 126 | 126 | } |
| 127 | - spip_logger()->info($row['id_auteur'] . ' veut se resinscrire'); |
|
| 127 | + spip_logger()->info($row['id_auteur'].' veut se resinscrire'); |
|
| 128 | 128 | } |
| 129 | 129 | } |
| 130 | 130 | } |
@@ -10,31 +10,31 @@ discard block |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | include_spip('base/abstract_sql'); |
| 17 | 17 | |
| 18 | 18 | function retrouve_auteur($id_auteur, $jeton = '') { |
| 19 | - if ($id_auteur = (int) $id_auteur) { |
|
| 20 | - return sql_fetsel( |
|
| 21 | - '*', |
|
| 22 | - 'spip_auteurs', |
|
| 23 | - ['id_auteur=' . (int) $id_auteur, "statut<>'5poubelle'", "pass<>''", "login<>''"] |
|
| 24 | - ); |
|
| 25 | - } elseif ($jeton) { |
|
| 26 | - include_spip('action/inscrire_auteur'); |
|
| 27 | - if ( |
|
| 28 | - ($auteur = auteur_verifier_jeton($jeton)) |
|
| 29 | - && $auteur['statut'] != '5poubelle' |
|
| 30 | - && $auteur['pass'] != '' |
|
| 31 | - && $auteur['login'] != '' |
|
| 32 | - ) { |
|
| 33 | - return $auteur; |
|
| 34 | - } |
|
| 35 | - } |
|
| 36 | - |
|
| 37 | - return false; |
|
| 19 | + if ($id_auteur = (int) $id_auteur) { |
|
| 20 | + return sql_fetsel( |
|
| 21 | + '*', |
|
| 22 | + 'spip_auteurs', |
|
| 23 | + ['id_auteur=' . (int) $id_auteur, "statut<>'5poubelle'", "pass<>''", "login<>''"] |
|
| 24 | + ); |
|
| 25 | + } elseif ($jeton) { |
|
| 26 | + include_spip('action/inscrire_auteur'); |
|
| 27 | + if ( |
|
| 28 | + ($auteur = auteur_verifier_jeton($jeton)) |
|
| 29 | + && $auteur['statut'] != '5poubelle' |
|
| 30 | + && $auteur['pass'] != '' |
|
| 31 | + && $auteur['login'] != '' |
|
| 32 | + ) { |
|
| 33 | + return $auteur; |
|
| 34 | + } |
|
| 35 | + } |
|
| 36 | + |
|
| 37 | + return false; |
|
| 38 | 38 | } |
| 39 | 39 | |
| 40 | 40 | // chargement des valeurs par defaut des champs du formulaire |
@@ -49,30 +49,30 @@ discard block |
||
| 49 | 49 | */ |
| 50 | 50 | function formulaires_mot_de_passe_charger_dist($id_auteur = null, $jeton = null) { |
| 51 | 51 | |
| 52 | - $valeurs = []; |
|
| 53 | - // compatibilite anciens appels du formulaire |
|
| 54 | - if (is_null($jeton)) { |
|
| 55 | - $jeton = _request('p'); |
|
| 56 | - } |
|
| 57 | - $auteur = retrouve_auteur($id_auteur, $jeton); |
|
| 58 | - |
|
| 59 | - if ($auteur) { |
|
| 60 | - $valeurs['id_auteur'] = $id_auteur; // a toutes fins utiles pour le formulaire |
|
| 61 | - if ($jeton) { |
|
| 62 | - $valeurs['_hidden'] = '<input type="hidden" name="p" value="' . $jeton . '" />'; |
|
| 63 | - } |
|
| 64 | - } else { |
|
| 65 | - $valeurs['message_erreur'] = _T('pass_erreur_code_inconnu'); |
|
| 66 | - $valeurs['editable'] = false; // pas de saisie |
|
| 67 | - } |
|
| 68 | - $valeurs['oubli'] = ''; |
|
| 69 | - // le champ login n'est pas utilise, mais il est destine aux navigateurs smarts |
|
| 70 | - // qui veulent remplir le formulaire avec login/mot de passe |
|
| 71 | - // et qui sinon remplissent le champ nobot (autocomplete=off n'est pas une option, certains navigateurs l'ignorant) |
|
| 72 | - $valeurs['login'] = ''; |
|
| 73 | - $valeurs['nobot'] = ''; |
|
| 74 | - |
|
| 75 | - return $valeurs; |
|
| 52 | + $valeurs = []; |
|
| 53 | + // compatibilite anciens appels du formulaire |
|
| 54 | + if (is_null($jeton)) { |
|
| 55 | + $jeton = _request('p'); |
|
| 56 | + } |
|
| 57 | + $auteur = retrouve_auteur($id_auteur, $jeton); |
|
| 58 | + |
|
| 59 | + if ($auteur) { |
|
| 60 | + $valeurs['id_auteur'] = $id_auteur; // a toutes fins utiles pour le formulaire |
|
| 61 | + if ($jeton) { |
|
| 62 | + $valeurs['_hidden'] = '<input type="hidden" name="p" value="' . $jeton . '" />'; |
|
| 63 | + } |
|
| 64 | + } else { |
|
| 65 | + $valeurs['message_erreur'] = _T('pass_erreur_code_inconnu'); |
|
| 66 | + $valeurs['editable'] = false; // pas de saisie |
|
| 67 | + } |
|
| 68 | + $valeurs['oubli'] = ''; |
|
| 69 | + // le champ login n'est pas utilise, mais il est destine aux navigateurs smarts |
|
| 70 | + // qui veulent remplir le formulaire avec login/mot de passe |
|
| 71 | + // et qui sinon remplissent le champ nobot (autocomplete=off n'est pas une option, certains navigateurs l'ignorant) |
|
| 72 | + $valeurs['login'] = ''; |
|
| 73 | + $valeurs['nobot'] = ''; |
|
| 74 | + |
|
| 75 | + return $valeurs; |
|
| 76 | 76 | } |
| 77 | 77 | |
| 78 | 78 | /** |
@@ -83,36 +83,36 @@ discard block |
||
| 83 | 83 | * @param int $id_auteur |
| 84 | 84 | */ |
| 85 | 85 | function formulaires_mot_de_passe_verifier_dist($id_auteur = null, $jeton = null) { |
| 86 | - $erreurs = []; |
|
| 87 | - if (!_request('oubli')) { |
|
| 88 | - $erreurs['oubli'] = _T('info_obligatoire'); |
|
| 89 | - } else { |
|
| 90 | - if (strlen((string) ($p = _request('oubli'))) < _PASS_LONGUEUR_MINI) { |
|
| 91 | - $erreurs['oubli'] = _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]); |
|
| 92 | - } else { |
|
| 93 | - if (!is_null($c = _request('oubli_confirm'))) { |
|
| 94 | - if (!$c) { |
|
| 95 | - $erreurs['oubli_confirm'] = _T('info_obligatoire'); |
|
| 96 | - } elseif ($c !== $p) { |
|
| 97 | - $erreurs['oubli'] = _T('info_passes_identiques'); |
|
| 98 | - } |
|
| 99 | - } |
|
| 100 | - } |
|
| 101 | - } |
|
| 102 | - if (isset($erreurs['oubli'])) { |
|
| 103 | - set_request('oubli'); |
|
| 104 | - set_request('oubli_confirm'); |
|
| 105 | - } |
|
| 106 | - |
|
| 107 | - if (_request('nobot')) { |
|
| 108 | - $erreurs['message_erreur'] = _T('pass_rien_a_faire_ici'); |
|
| 109 | - } |
|
| 110 | - // precaution |
|
| 111 | - if (_request('login')) { |
|
| 112 | - set_request('login'); |
|
| 113 | - } |
|
| 114 | - |
|
| 115 | - return $erreurs; |
|
| 86 | + $erreurs = []; |
|
| 87 | + if (!_request('oubli')) { |
|
| 88 | + $erreurs['oubli'] = _T('info_obligatoire'); |
|
| 89 | + } else { |
|
| 90 | + if (strlen((string) ($p = _request('oubli'))) < _PASS_LONGUEUR_MINI) { |
|
| 91 | + $erreurs['oubli'] = _T('info_passe_trop_court_car_pluriel', ['nb' => _PASS_LONGUEUR_MINI]); |
|
| 92 | + } else { |
|
| 93 | + if (!is_null($c = _request('oubli_confirm'))) { |
|
| 94 | + if (!$c) { |
|
| 95 | + $erreurs['oubli_confirm'] = _T('info_obligatoire'); |
|
| 96 | + } elseif ($c !== $p) { |
|
| 97 | + $erreurs['oubli'] = _T('info_passes_identiques'); |
|
| 98 | + } |
|
| 99 | + } |
|
| 100 | + } |
|
| 101 | + } |
|
| 102 | + if (isset($erreurs['oubli'])) { |
|
| 103 | + set_request('oubli'); |
|
| 104 | + set_request('oubli_confirm'); |
|
| 105 | + } |
|
| 106 | + |
|
| 107 | + if (_request('nobot')) { |
|
| 108 | + $erreurs['message_erreur'] = _T('pass_rien_a_faire_ici'); |
|
| 109 | + } |
|
| 110 | + // precaution |
|
| 111 | + if (_request('login')) { |
|
| 112 | + set_request('login'); |
|
| 113 | + } |
|
| 114 | + |
|
| 115 | + return $erreurs; |
|
| 116 | 116 | } |
| 117 | 117 | |
| 118 | 118 | /** |
@@ -122,61 +122,61 @@ discard block |
||
| 122 | 122 | * @param int $id_auteur |
| 123 | 123 | */ |
| 124 | 124 | function formulaires_mot_de_passe_traiter_dist($id_auteur = null, $jeton = null) { |
| 125 | - $res = ['message_ok' => '']; |
|
| 126 | - refuser_traiter_formulaire_ajax(); // puisqu'on va loger l'auteur a la volee (c'est bonus) |
|
| 127 | - |
|
| 128 | - // compatibilite anciens appels du formulaire |
|
| 129 | - if (is_null($jeton)) { |
|
| 130 | - $jeton = _request('p'); |
|
| 131 | - } |
|
| 132 | - $row = retrouve_auteur($id_auteur, $jeton); |
|
| 133 | - |
|
| 134 | - if ( |
|
| 135 | - $row |
|
| 136 | - && ($id_auteur = $row['id_auteur']) |
|
| 137 | - && ($oubli = _request('oubli')) |
|
| 138 | - ) { |
|
| 139 | - include_spip('action/editer_auteur'); |
|
| 140 | - include_spip('action/inscrire_auteur'); |
|
| 141 | - if ($err = auteur_modifier($id_auteur, ['pass' => $oubli])) { |
|
| 142 | - $res = ['message_erreur' => $err]; |
|
| 143 | - } else { |
|
| 144 | - auteur_effacer_jeton($id_auteur); |
|
| 145 | - |
|
| 146 | - // Par défaut, on rappelle de s'identifier avec son email s'il existe |
|
| 147 | - // et qu'il n'est PAS utilisé par quelqu'un d'autre |
|
| 148 | - if ( |
|
| 149 | - $row['email'] && !sql_fetsel( |
|
| 150 | - 'id_auteur', |
|
| 151 | - 'spip_auteurs', |
|
| 152 | - [ |
|
| 153 | - '(email=' . sql_quote($row['email']) . ' or login=' . sql_quote($row['email']) . ')', |
|
| 154 | - 'id_auteur != ' . $id_auteur |
|
| 155 | - ], |
|
| 156 | - '', |
|
| 157 | - '', |
|
| 158 | - '0,1' |
|
| 159 | - ) |
|
| 160 | - ) { |
|
| 161 | - $identifiant = $row['email']; |
|
| 162 | - } |
|
| 163 | - // Sinon on dit d'utiliser le login |
|
| 164 | - else { |
|
| 165 | - $identifiant = $row['login']; |
|
| 166 | - } |
|
| 167 | - $res['message_ok'] = '<b>' . _T('pass_nouveau_enregistre') . '</b>' . |
|
| 168 | - '<br />' . _T('pass_rappel_login', ['login' => $identifiant]); |
|
| 169 | - |
|
| 170 | - include_spip('inc/auth'); |
|
| 171 | - $auth = auth_identifier_login($row['login'], $oubli); |
|
| 172 | - if (!is_array($auth)) { |
|
| 173 | - spip_logger()->error('Erreur identification ' . $row['login'] . " après changement de mot de passe: $auth"); |
|
| 174 | - } |
|
| 175 | - elseif ($auth['id_auteur'] == $id_auteur) { |
|
| 176 | - auth_loger($auth); |
|
| 177 | - } |
|
| 178 | - } |
|
| 179 | - } |
|
| 180 | - |
|
| 181 | - return $res; |
|
| 125 | + $res = ['message_ok' => '']; |
|
| 126 | + refuser_traiter_formulaire_ajax(); // puisqu'on va loger l'auteur a la volee (c'est bonus) |
|
| 127 | + |
|
| 128 | + // compatibilite anciens appels du formulaire |
|
| 129 | + if (is_null($jeton)) { |
|
| 130 | + $jeton = _request('p'); |
|
| 131 | + } |
|
| 132 | + $row = retrouve_auteur($id_auteur, $jeton); |
|
| 133 | + |
|
| 134 | + if ( |
|
| 135 | + $row |
|
| 136 | + && ($id_auteur = $row['id_auteur']) |
|
| 137 | + && ($oubli = _request('oubli')) |
|
| 138 | + ) { |
|
| 139 | + include_spip('action/editer_auteur'); |
|
| 140 | + include_spip('action/inscrire_auteur'); |
|
| 141 | + if ($err = auteur_modifier($id_auteur, ['pass' => $oubli])) { |
|
| 142 | + $res = ['message_erreur' => $err]; |
|
| 143 | + } else { |
|
| 144 | + auteur_effacer_jeton($id_auteur); |
|
| 145 | + |
|
| 146 | + // Par défaut, on rappelle de s'identifier avec son email s'il existe |
|
| 147 | + // et qu'il n'est PAS utilisé par quelqu'un d'autre |
|
| 148 | + if ( |
|
| 149 | + $row['email'] && !sql_fetsel( |
|
| 150 | + 'id_auteur', |
|
| 151 | + 'spip_auteurs', |
|
| 152 | + [ |
|
| 153 | + '(email=' . sql_quote($row['email']) . ' or login=' . sql_quote($row['email']) . ')', |
|
| 154 | + 'id_auteur != ' . $id_auteur |
|
| 155 | + ], |
|
| 156 | + '', |
|
| 157 | + '', |
|
| 158 | + '0,1' |
|
| 159 | + ) |
|
| 160 | + ) { |
|
| 161 | + $identifiant = $row['email']; |
|
| 162 | + } |
|
| 163 | + // Sinon on dit d'utiliser le login |
|
| 164 | + else { |
|
| 165 | + $identifiant = $row['login']; |
|
| 166 | + } |
|
| 167 | + $res['message_ok'] = '<b>' . _T('pass_nouveau_enregistre') . '</b>' . |
|
| 168 | + '<br />' . _T('pass_rappel_login', ['login' => $identifiant]); |
|
| 169 | + |
|
| 170 | + include_spip('inc/auth'); |
|
| 171 | + $auth = auth_identifier_login($row['login'], $oubli); |
|
| 172 | + if (!is_array($auth)) { |
|
| 173 | + spip_logger()->error('Erreur identification ' . $row['login'] . " après changement de mot de passe: $auth"); |
|
| 174 | + } |
|
| 175 | + elseif ($auth['id_auteur'] == $id_auteur) { |
|
| 176 | + auth_loger($auth); |
|
| 177 | + } |
|
| 178 | + } |
|
| 179 | + } |
|
| 180 | + |
|
| 181 | + return $res; |
|
| 182 | 182 | } |
@@ -20,7 +20,7 @@ discard block |
||
| 20 | 20 | return sql_fetsel( |
| 21 | 21 | '*', |
| 22 | 22 | 'spip_auteurs', |
| 23 | - ['id_auteur=' . (int) $id_auteur, "statut<>'5poubelle'", "pass<>''", "login<>''"] |
|
| 23 | + ['id_auteur='.(int) $id_auteur, "statut<>'5poubelle'", "pass<>''", "login<>''"] |
|
| 24 | 24 | ); |
| 25 | 25 | } elseif ($jeton) { |
| 26 | 26 | include_spip('action/inscrire_auteur'); |
@@ -59,7 +59,7 @@ discard block |
||
| 59 | 59 | if ($auteur) { |
| 60 | 60 | $valeurs['id_auteur'] = $id_auteur; // a toutes fins utiles pour le formulaire |
| 61 | 61 | if ($jeton) { |
| 62 | - $valeurs['_hidden'] = '<input type="hidden" name="p" value="' . $jeton . '" />'; |
|
| 62 | + $valeurs['_hidden'] = '<input type="hidden" name="p" value="'.$jeton.'" />'; |
|
| 63 | 63 | } |
| 64 | 64 | } else { |
| 65 | 65 | $valeurs['message_erreur'] = _T('pass_erreur_code_inconnu'); |
@@ -150,8 +150,8 @@ discard block |
||
| 150 | 150 | 'id_auteur', |
| 151 | 151 | 'spip_auteurs', |
| 152 | 152 | [ |
| 153 | - '(email=' . sql_quote($row['email']) . ' or login=' . sql_quote($row['email']) . ')', |
|
| 154 | - 'id_auteur != ' . $id_auteur |
|
| 153 | + '(email='.sql_quote($row['email']).' or login='.sql_quote($row['email']).')', |
|
| 154 | + 'id_auteur != '.$id_auteur |
|
| 155 | 155 | ], |
| 156 | 156 | '', |
| 157 | 157 | '', |
@@ -164,13 +164,13 @@ discard block |
||
| 164 | 164 | else { |
| 165 | 165 | $identifiant = $row['login']; |
| 166 | 166 | } |
| 167 | - $res['message_ok'] = '<b>' . _T('pass_nouveau_enregistre') . '</b>' . |
|
| 168 | - '<br />' . _T('pass_rappel_login', ['login' => $identifiant]); |
|
| 167 | + $res['message_ok'] = '<b>'._T('pass_nouveau_enregistre').'</b>'. |
|
| 168 | + '<br />'._T('pass_rappel_login', ['login' => $identifiant]); |
|
| 169 | 169 | |
| 170 | 170 | include_spip('inc/auth'); |
| 171 | 171 | $auth = auth_identifier_login($row['login'], $oubli); |
| 172 | 172 | if (!is_array($auth)) { |
| 173 | - spip_logger()->error('Erreur identification ' . $row['login'] . " après changement de mot de passe: $auth"); |
|
| 173 | + spip_logger()->error('Erreur identification '.$row['login']." après changement de mot de passe: $auth"); |
|
| 174 | 174 | } |
| 175 | 175 | elseif ($auth['id_auteur'] == $id_auteur) { |
| 176 | 176 | auth_loger($auth); |
@@ -171,8 +171,7 @@ |
||
| 171 | 171 | $auth = auth_identifier_login($row['login'], $oubli); |
| 172 | 172 | if (!is_array($auth)) { |
| 173 | 173 | spip_logger()->error('Erreur identification ' . $row['login'] . " après changement de mot de passe: $auth"); |
| 174 | - } |
|
| 175 | - elseif ($auth['id_auteur'] == $id_auteur) { |
|
| 174 | + } elseif ($auth['id_auteur'] == $id_auteur) { |
|
| 176 | 175 | auth_loger($auth); |
| 177 | 176 | } |
| 178 | 177 | } |
@@ -10,53 +10,53 @@ |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | // Fonction appelee par divers pipelines |
| 17 | 17 | function notifications_instituerarticle_dist($quoi, $id_article, $options) { |
| 18 | 18 | |
| 19 | - // ne devrait jamais se produire |
|
| 20 | - if ($options['statut'] == $options['statut_ancien']) { |
|
| 21 | - spip_logger('notifications')->info('statut inchange'); |
|
| 22 | - |
|
| 23 | - return; |
|
| 24 | - } |
|
| 25 | - |
|
| 26 | - include_spip('inc/texte'); |
|
| 27 | - |
|
| 28 | - $modele = ''; |
|
| 29 | - if ($options['statut'] == 'publie') { |
|
| 30 | - if ( |
|
| 31 | - $GLOBALS['meta']['post_dates'] == 'non' |
|
| 32 | - && strtotime((string) $options['date']) > time() |
|
| 33 | - ) { |
|
| 34 | - $modele = 'notifications/article_valide'; |
|
| 35 | - } else { |
|
| 36 | - $modele = 'notifications/article_publie'; |
|
| 37 | - } |
|
| 38 | - } |
|
| 39 | - |
|
| 40 | - if ($options['statut'] == 'prop' && $options['statut_ancien'] != 'publie') { |
|
| 41 | - $modele = 'notifications/article_propose'; |
|
| 42 | - } |
|
| 43 | - |
|
| 44 | - if ($modele) { |
|
| 45 | - $destinataires = []; |
|
| 46 | - if ($GLOBALS['meta']['suivi_edito'] == 'oui') { |
|
| 47 | - $destinataires = explode(',', (string) $GLOBALS['meta']['adresse_suivi']); |
|
| 48 | - } |
|
| 49 | - |
|
| 50 | - |
|
| 51 | - $destinataires = pipeline( |
|
| 52 | - 'notifications_destinataires', |
|
| 53 | - [ |
|
| 54 | - 'args' => ['quoi' => $quoi, 'id' => $id_article, 'options' => $options], |
|
| 55 | - 'data' => $destinataires |
|
| 56 | - ] |
|
| 57 | - ); |
|
| 58 | - |
|
| 59 | - $texte = email_notification_article($id_article, $modele); |
|
| 60 | - notifications_envoyer_mails($destinataires, $texte); |
|
| 61 | - } |
|
| 19 | + // ne devrait jamais se produire |
|
| 20 | + if ($options['statut'] == $options['statut_ancien']) { |
|
| 21 | + spip_logger('notifications')->info('statut inchange'); |
|
| 22 | + |
|
| 23 | + return; |
|
| 24 | + } |
|
| 25 | + |
|
| 26 | + include_spip('inc/texte'); |
|
| 27 | + |
|
| 28 | + $modele = ''; |
|
| 29 | + if ($options['statut'] == 'publie') { |
|
| 30 | + if ( |
|
| 31 | + $GLOBALS['meta']['post_dates'] == 'non' |
|
| 32 | + && strtotime((string) $options['date']) > time() |
|
| 33 | + ) { |
|
| 34 | + $modele = 'notifications/article_valide'; |
|
| 35 | + } else { |
|
| 36 | + $modele = 'notifications/article_publie'; |
|
| 37 | + } |
|
| 38 | + } |
|
| 39 | + |
|
| 40 | + if ($options['statut'] == 'prop' && $options['statut_ancien'] != 'publie') { |
|
| 41 | + $modele = 'notifications/article_propose'; |
|
| 42 | + } |
|
| 43 | + |
|
| 44 | + if ($modele) { |
|
| 45 | + $destinataires = []; |
|
| 46 | + if ($GLOBALS['meta']['suivi_edito'] == 'oui') { |
|
| 47 | + $destinataires = explode(',', (string) $GLOBALS['meta']['adresse_suivi']); |
|
| 48 | + } |
|
| 49 | + |
|
| 50 | + |
|
| 51 | + $destinataires = pipeline( |
|
| 52 | + 'notifications_destinataires', |
|
| 53 | + [ |
|
| 54 | + 'args' => ['quoi' => $quoi, 'id' => $id_article, 'options' => $options], |
|
| 55 | + 'data' => $destinataires |
|
| 56 | + ] |
|
| 57 | + ); |
|
| 58 | + |
|
| 59 | + $texte = email_notification_article($id_article, $modele); |
|
| 60 | + notifications_envoyer_mails($destinataires, $texte); |
|
| 61 | + } |
|
| 62 | 62 | } |
@@ -12,7 +12,7 @@ discard block |
||
| 12 | 12 | \***************************************************************************/ |
| 13 | 13 | |
| 14 | 14 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 15 | - return; |
|
| 15 | + return; |
|
| 16 | 16 | } |
| 17 | 17 | |
| 18 | 18 | include_spip('inc/headers'); |
@@ -20,201 +20,201 @@ discard block |
||
| 20 | 20 | |
| 21 | 21 | function install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db) { |
| 22 | 22 | |
| 23 | - $logger = spip_logger(); |
|
| 24 | - |
|
| 25 | - // Prefix des tables : |
|
| 26 | - // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer |
|
| 27 | - // a partir de ce qui est envoye a l'installation |
|
| 28 | - if (!defined('_INSTALL_TABLE_PREFIX')) { |
|
| 29 | - $table_prefix = ($GLOBALS['table_prefix'] != 'spip') |
|
| 30 | - ? $GLOBALS['table_prefix'] |
|
| 31 | - : preparer_prefixe_tables(_request('tprefix')); |
|
| 32 | - // S'il est vide on remet spip |
|
| 33 | - if (!$table_prefix) { |
|
| 34 | - $table_prefix = 'spip'; |
|
| 35 | - } |
|
| 36 | - } else { |
|
| 37 | - $table_prefix = _INSTALL_TABLE_PREFIX; |
|
| 38 | - } |
|
| 39 | - |
|
| 40 | - if (preg_match(',(.*):(.*),', (string) $adresse_db, $r)) { |
|
| 41 | - [, $adresse_db, $port] = $r; |
|
| 42 | - } else { |
|
| 43 | - $port = ''; |
|
| 44 | - } |
|
| 45 | - |
|
| 46 | - $GLOBALS['connexions'][$server_db] |
|
| 47 | - = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); |
|
| 48 | - |
|
| 49 | - $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 50 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 51 | - |
|
| 52 | - $fquery = sql_serveur('query', $server_db); |
|
| 53 | - if ($choix_db == 'new_spip') { |
|
| 54 | - $re = ',^[a-z_][a-z_0-9-]*$,i'; |
|
| 55 | - if (preg_match($re, (string) $sel_db)) { |
|
| 56 | - $ok = sql_create_base($sel_db, $server_db); |
|
| 57 | - if (!$ok) { |
|
| 58 | - $re = "Impossible de creer la base $re"; |
|
| 59 | - $logger->info($re); |
|
| 60 | - return '<p>' . _T('avis_connexion_erreur_creer_base') . "</p><!--\n$re\n-->"; |
|
| 61 | - } |
|
| 62 | - } else { |
|
| 63 | - $re = "Le nom de la base doit correspondre a $re"; |
|
| 64 | - $logger->info($re); |
|
| 65 | - |
|
| 66 | - return '<p>' . _T('avis_connexion_erreur_nom_base') . "</p><!--\n$re\n-->"; |
|
| 67 | - } |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - // on rejoue la connexion apres avoir teste si il faut lui indiquer |
|
| 71 | - // un sql_mode |
|
| 72 | - install_mode_appel($server_db, false); |
|
| 73 | - $GLOBALS['connexions'][$server_db] |
|
| 74 | - = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); |
|
| 75 | - |
|
| 76 | - $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 77 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 78 | - |
|
| 79 | - // Completer le tableau decrivant la connexion |
|
| 80 | - |
|
| 81 | - $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; |
|
| 82 | - $GLOBALS['connexions'][$server_db]['db'] = $sel_db; |
|
| 83 | - |
|
| 84 | - $old = sql_showbase($table_prefix . '_meta', $server_db); |
|
| 85 | - if ($old) { |
|
| 86 | - $old = sql_fetch($old, $server_db); |
|
| 87 | - } |
|
| 88 | - if (!$old) { |
|
| 89 | - // Si possible, demander au serveur d'envoyer les textes |
|
| 90 | - // dans le codage std de SPIP, |
|
| 91 | - $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); |
|
| 92 | - |
|
| 93 | - if ($charset) { |
|
| 94 | - sql_set_charset($charset['charset'], $server_db); |
|
| 95 | - $GLOBALS['meta']['charset_sql_base'] = |
|
| 96 | - $charset['charset']; |
|
| 97 | - $GLOBALS['meta']['charset_collation_sql_base'] = |
|
| 98 | - $charset['collation']; |
|
| 99 | - $GLOBALS['meta']['charset_sql_connexion'] = |
|
| 100 | - $charset['charset']; |
|
| 101 | - $charsetbase = $charset['charset']; |
|
| 102 | - } else { |
|
| 103 | - $logger->info(_DEFAULT_CHARSET . ' inconnu du serveur SQL'); |
|
| 104 | - $charsetbase = 'standard'; |
|
| 105 | - } |
|
| 106 | - $logger->info("Creation des tables. Codage $charsetbase"); |
|
| 107 | - creer_base($server_db); // AT LAST |
|
| 108 | - // memoriser avec quel charset on l'a creee |
|
| 109 | - |
|
| 110 | - if ($charset) { |
|
| 111 | - $t = [ |
|
| 112 | - 'nom' => 'charset_sql_base', |
|
| 113 | - 'valeur' => $charset['charset'], |
|
| 114 | - 'impt' => 'non' |
|
| 115 | - ]; |
|
| 116 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 117 | - $t['nom'] = 'charset_collation_sql_base'; |
|
| 118 | - $t['valeur'] = $charset['collation']; |
|
| 119 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 120 | - $t['nom'] = 'charset_sql_connexion'; |
|
| 121 | - $t['valeur'] = $charset['charset']; |
|
| 122 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 123 | - } |
|
| 124 | - $t = [ |
|
| 125 | - 'nom' => 'version_installee', |
|
| 126 | - 'valeur' => $GLOBALS['spip_version_base'], |
|
| 127 | - 'impt' => 'non' |
|
| 128 | - ]; |
|
| 129 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 130 | - $t['nom'] = 'nouvelle_install'; |
|
| 131 | - $t['valeur'] = 1; |
|
| 132 | - @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 133 | - // positionner la langue par defaut du site si un cookie de lang a ete mis |
|
| 134 | - if (isset($_COOKIE['spip_lang_ecrire'])) { |
|
| 135 | - @sql_insertq( |
|
| 136 | - 'spip_meta', |
|
| 137 | - ['nom' => 'langue_site', 'valeur' => $_COOKIE['spip_lang_ecrire']], |
|
| 138 | - [], |
|
| 139 | - $server_db |
|
| 140 | - ); |
|
| 141 | - } |
|
| 142 | - } else { |
|
| 143 | - // pour recreer les tables disparues au besoin |
|
| 144 | - $logger->info('Table des Meta deja la. Verification des autres.'); |
|
| 145 | - creer_base($server_db); |
|
| 146 | - $fupdateq = sql_serveur('updateq', $server_db); |
|
| 147 | - |
|
| 148 | - $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); |
|
| 149 | - |
|
| 150 | - if ($r) { |
|
| 151 | - $r = sql_fetch($r, $server_db); |
|
| 152 | - } |
|
| 153 | - $version_installee = $r ? (double)$r['valeur'] : 0; |
|
| 154 | - if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) { |
|
| 155 | - $fupdateq( |
|
| 156 | - 'spip_meta', |
|
| 157 | - ['valeur' => $GLOBALS['spip_version_base'], 'impt' => 'non'], |
|
| 158 | - "nom='version_installee'", |
|
| 159 | - '', |
|
| 160 | - $server_db |
|
| 161 | - ); |
|
| 162 | - $logger->info('nouvelle version installee: ' . $GLOBALS['spip_version_base']); |
|
| 163 | - } |
|
| 164 | - // eliminer la derniere operation d'admin mal terminee |
|
| 165 | - // notamment la mise a jour |
|
| 166 | - @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); |
|
| 167 | - } |
|
| 168 | - |
|
| 169 | - // recuperer le charset de la connexion dans les meta |
|
| 170 | - $charset = ''; |
|
| 171 | - $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='charset_sql_connexion'", $server_db); |
|
| 172 | - if ($r) { |
|
| 173 | - $r = sql_fetch($r, $server_db); |
|
| 174 | - } |
|
| 175 | - if ($r) { |
|
| 176 | - $charset = $r['valeur']; |
|
| 177 | - } |
|
| 178 | - |
|
| 179 | - $ligne_rappel = install_mode_appel($server_db); |
|
| 180 | - |
|
| 181 | - $result_ok = @$fquery('SELECT COUNT(*) FROM spip_meta', $server_db); |
|
| 182 | - if (!$result_ok) { |
|
| 183 | - return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; |
|
| 184 | - } |
|
| 185 | - |
|
| 186 | - if ($chmod_db) { |
|
| 187 | - install_fichier_connexion( |
|
| 188 | - _FILE_CHMOD_TMP, |
|
| 189 | - "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n" |
|
| 190 | - ); |
|
| 191 | - } |
|
| 192 | - |
|
| 193 | - // si ce fichier existe a cette etape c'est qu'il provient |
|
| 194 | - // d'une installation qui ne l'a pas cree correctement. |
|
| 195 | - // Le supprimer pour que _FILE_CONNECT_TMP prime. |
|
| 196 | - |
|
| 197 | - if (_FILE_CONNECT && file_exists(_FILE_CONNECT)) { |
|
| 198 | - spip_unlink(_FILE_CONNECT); |
|
| 199 | - } |
|
| 200 | - |
|
| 201 | - install_fichier_connexion( |
|
| 202 | - _FILE_CONNECT_TMP, |
|
| 203 | - $ligne_rappel |
|
| 204 | - . install_connexion( |
|
| 205 | - $adresse_db, |
|
| 206 | - $port, |
|
| 207 | - $login_db, |
|
| 208 | - $pass_db, |
|
| 209 | - $sel_db, |
|
| 210 | - $server_db, |
|
| 211 | - $table_prefix, |
|
| 212 | - '', |
|
| 213 | - $charset |
|
| 214 | - ) |
|
| 215 | - ); |
|
| 216 | - |
|
| 217 | - return ''; |
|
| 23 | + $logger = spip_logger(); |
|
| 24 | + |
|
| 25 | + // Prefix des tables : |
|
| 26 | + // S'il n'est pas defini par mes_options/inc/mutualiser, on va le creer |
|
| 27 | + // a partir de ce qui est envoye a l'installation |
|
| 28 | + if (!defined('_INSTALL_TABLE_PREFIX')) { |
|
| 29 | + $table_prefix = ($GLOBALS['table_prefix'] != 'spip') |
|
| 30 | + ? $GLOBALS['table_prefix'] |
|
| 31 | + : preparer_prefixe_tables(_request('tprefix')); |
|
| 32 | + // S'il est vide on remet spip |
|
| 33 | + if (!$table_prefix) { |
|
| 34 | + $table_prefix = 'spip'; |
|
| 35 | + } |
|
| 36 | + } else { |
|
| 37 | + $table_prefix = _INSTALL_TABLE_PREFIX; |
|
| 38 | + } |
|
| 39 | + |
|
| 40 | + if (preg_match(',(.*):(.*),', (string) $adresse_db, $r)) { |
|
| 41 | + [, $adresse_db, $port] = $r; |
|
| 42 | + } else { |
|
| 43 | + $port = ''; |
|
| 44 | + } |
|
| 45 | + |
|
| 46 | + $GLOBALS['connexions'][$server_db] |
|
| 47 | + = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); |
|
| 48 | + |
|
| 49 | + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 50 | + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 51 | + |
|
| 52 | + $fquery = sql_serveur('query', $server_db); |
|
| 53 | + if ($choix_db == 'new_spip') { |
|
| 54 | + $re = ',^[a-z_][a-z_0-9-]*$,i'; |
|
| 55 | + if (preg_match($re, (string) $sel_db)) { |
|
| 56 | + $ok = sql_create_base($sel_db, $server_db); |
|
| 57 | + if (!$ok) { |
|
| 58 | + $re = "Impossible de creer la base $re"; |
|
| 59 | + $logger->info($re); |
|
| 60 | + return '<p>' . _T('avis_connexion_erreur_creer_base') . "</p><!--\n$re\n-->"; |
|
| 61 | + } |
|
| 62 | + } else { |
|
| 63 | + $re = "Le nom de la base doit correspondre a $re"; |
|
| 64 | + $logger->info($re); |
|
| 65 | + |
|
| 66 | + return '<p>' . _T('avis_connexion_erreur_nom_base') . "</p><!--\n$re\n-->"; |
|
| 67 | + } |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + // on rejoue la connexion apres avoir teste si il faut lui indiquer |
|
| 71 | + // un sql_mode |
|
| 72 | + install_mode_appel($server_db, false); |
|
| 73 | + $GLOBALS['connexions'][$server_db] |
|
| 74 | + = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); |
|
| 75 | + |
|
| 76 | + $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
|
| 77 | + = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 78 | + |
|
| 79 | + // Completer le tableau decrivant la connexion |
|
| 80 | + |
|
| 81 | + $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; |
|
| 82 | + $GLOBALS['connexions'][$server_db]['db'] = $sel_db; |
|
| 83 | + |
|
| 84 | + $old = sql_showbase($table_prefix . '_meta', $server_db); |
|
| 85 | + if ($old) { |
|
| 86 | + $old = sql_fetch($old, $server_db); |
|
| 87 | + } |
|
| 88 | + if (!$old) { |
|
| 89 | + // Si possible, demander au serveur d'envoyer les textes |
|
| 90 | + // dans le codage std de SPIP, |
|
| 91 | + $charset = sql_get_charset(_DEFAULT_CHARSET, $server_db); |
|
| 92 | + |
|
| 93 | + if ($charset) { |
|
| 94 | + sql_set_charset($charset['charset'], $server_db); |
|
| 95 | + $GLOBALS['meta']['charset_sql_base'] = |
|
| 96 | + $charset['charset']; |
|
| 97 | + $GLOBALS['meta']['charset_collation_sql_base'] = |
|
| 98 | + $charset['collation']; |
|
| 99 | + $GLOBALS['meta']['charset_sql_connexion'] = |
|
| 100 | + $charset['charset']; |
|
| 101 | + $charsetbase = $charset['charset']; |
|
| 102 | + } else { |
|
| 103 | + $logger->info(_DEFAULT_CHARSET . ' inconnu du serveur SQL'); |
|
| 104 | + $charsetbase = 'standard'; |
|
| 105 | + } |
|
| 106 | + $logger->info("Creation des tables. Codage $charsetbase"); |
|
| 107 | + creer_base($server_db); // AT LAST |
|
| 108 | + // memoriser avec quel charset on l'a creee |
|
| 109 | + |
|
| 110 | + if ($charset) { |
|
| 111 | + $t = [ |
|
| 112 | + 'nom' => 'charset_sql_base', |
|
| 113 | + 'valeur' => $charset['charset'], |
|
| 114 | + 'impt' => 'non' |
|
| 115 | + ]; |
|
| 116 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 117 | + $t['nom'] = 'charset_collation_sql_base'; |
|
| 118 | + $t['valeur'] = $charset['collation']; |
|
| 119 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 120 | + $t['nom'] = 'charset_sql_connexion'; |
|
| 121 | + $t['valeur'] = $charset['charset']; |
|
| 122 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 123 | + } |
|
| 124 | + $t = [ |
|
| 125 | + 'nom' => 'version_installee', |
|
| 126 | + 'valeur' => $GLOBALS['spip_version_base'], |
|
| 127 | + 'impt' => 'non' |
|
| 128 | + ]; |
|
| 129 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 130 | + $t['nom'] = 'nouvelle_install'; |
|
| 131 | + $t['valeur'] = 1; |
|
| 132 | + @sql_insertq('spip_meta', $t, [], $server_db); |
|
| 133 | + // positionner la langue par defaut du site si un cookie de lang a ete mis |
|
| 134 | + if (isset($_COOKIE['spip_lang_ecrire'])) { |
|
| 135 | + @sql_insertq( |
|
| 136 | + 'spip_meta', |
|
| 137 | + ['nom' => 'langue_site', 'valeur' => $_COOKIE['spip_lang_ecrire']], |
|
| 138 | + [], |
|
| 139 | + $server_db |
|
| 140 | + ); |
|
| 141 | + } |
|
| 142 | + } else { |
|
| 143 | + // pour recreer les tables disparues au besoin |
|
| 144 | + $logger->info('Table des Meta deja la. Verification des autres.'); |
|
| 145 | + creer_base($server_db); |
|
| 146 | + $fupdateq = sql_serveur('updateq', $server_db); |
|
| 147 | + |
|
| 148 | + $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='version_installee'", $server_db); |
|
| 149 | + |
|
| 150 | + if ($r) { |
|
| 151 | + $r = sql_fetch($r, $server_db); |
|
| 152 | + } |
|
| 153 | + $version_installee = $r ? (double)$r['valeur'] : 0; |
|
| 154 | + if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) { |
|
| 155 | + $fupdateq( |
|
| 156 | + 'spip_meta', |
|
| 157 | + ['valeur' => $GLOBALS['spip_version_base'], 'impt' => 'non'], |
|
| 158 | + "nom='version_installee'", |
|
| 159 | + '', |
|
| 160 | + $server_db |
|
| 161 | + ); |
|
| 162 | + $logger->info('nouvelle version installee: ' . $GLOBALS['spip_version_base']); |
|
| 163 | + } |
|
| 164 | + // eliminer la derniere operation d'admin mal terminee |
|
| 165 | + // notamment la mise a jour |
|
| 166 | + @$fquery("DELETE FROM spip_meta WHERE nom='import_all' OR nom='admin'", $server_db); |
|
| 167 | + } |
|
| 168 | + |
|
| 169 | + // recuperer le charset de la connexion dans les meta |
|
| 170 | + $charset = ''; |
|
| 171 | + $r = $fquery("SELECT valeur FROM spip_meta WHERE nom='charset_sql_connexion'", $server_db); |
|
| 172 | + if ($r) { |
|
| 173 | + $r = sql_fetch($r, $server_db); |
|
| 174 | + } |
|
| 175 | + if ($r) { |
|
| 176 | + $charset = $r['valeur']; |
|
| 177 | + } |
|
| 178 | + |
|
| 179 | + $ligne_rappel = install_mode_appel($server_db); |
|
| 180 | + |
|
| 181 | + $result_ok = @$fquery('SELECT COUNT(*) FROM spip_meta', $server_db); |
|
| 182 | + if (!$result_ok) { |
|
| 183 | + return "<!--\nvielle = $old rappel= $ligne_rappel\n-->"; |
|
| 184 | + } |
|
| 185 | + |
|
| 186 | + if ($chmod_db) { |
|
| 187 | + install_fichier_connexion( |
|
| 188 | + _FILE_CHMOD_TMP, |
|
| 189 | + "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n" |
|
| 190 | + ); |
|
| 191 | + } |
|
| 192 | + |
|
| 193 | + // si ce fichier existe a cette etape c'est qu'il provient |
|
| 194 | + // d'une installation qui ne l'a pas cree correctement. |
|
| 195 | + // Le supprimer pour que _FILE_CONNECT_TMP prime. |
|
| 196 | + |
|
| 197 | + if (_FILE_CONNECT && file_exists(_FILE_CONNECT)) { |
|
| 198 | + spip_unlink(_FILE_CONNECT); |
|
| 199 | + } |
|
| 200 | + |
|
| 201 | + install_fichier_connexion( |
|
| 202 | + _FILE_CONNECT_TMP, |
|
| 203 | + $ligne_rappel |
|
| 204 | + . install_connexion( |
|
| 205 | + $adresse_db, |
|
| 206 | + $port, |
|
| 207 | + $login_db, |
|
| 208 | + $pass_db, |
|
| 209 | + $sel_db, |
|
| 210 | + $server_db, |
|
| 211 | + $table_prefix, |
|
| 212 | + '', |
|
| 213 | + $charset |
|
| 214 | + ) |
|
| 215 | + ); |
|
| 216 | + |
|
| 217 | + return ''; |
|
| 218 | 218 | } |
| 219 | 219 | |
| 220 | 220 | /** |
@@ -229,166 +229,166 @@ discard block |
||
| 229 | 229 | * @return string Le préfixe corrigé |
| 230 | 230 | */ |
| 231 | 231 | function preparer_prefixe_tables($prefixe) { |
| 232 | - return trim(preg_replace(',^\d+,', '', preg_replace(',[^a-z0-9],', '', strtolower($prefixe)))); |
|
| 232 | + return trim(preg_replace(',^\d+,', '', preg_replace(',[^a-z0-9],', '', strtolower($prefixe)))); |
|
| 233 | 233 | } |
| 234 | 234 | |
| 235 | 235 | function install_propose_ldap() { |
| 236 | - return generer_form_ecrire('install', ( |
|
| 237 | - fieldset( |
|
| 238 | - _T('info_authentification_externe'), |
|
| 239 | - [ |
|
| 240 | - 'etape' => [ |
|
| 241 | - 'label' => _T('texte_annuaire_ldap_1'), |
|
| 242 | - 'valeur' => 'ldap1', |
|
| 243 | - 'hidden' => true |
|
| 244 | - ] |
|
| 245 | - ], |
|
| 246 | - bouton_suivant(_T('bouton_acces_ldap')) |
|
| 247 | - ))); |
|
| 236 | + return generer_form_ecrire('install', ( |
|
| 237 | + fieldset( |
|
| 238 | + _T('info_authentification_externe'), |
|
| 239 | + [ |
|
| 240 | + 'etape' => [ |
|
| 241 | + 'label' => _T('texte_annuaire_ldap_1'), |
|
| 242 | + 'valeur' => 'ldap1', |
|
| 243 | + 'hidden' => true |
|
| 244 | + ] |
|
| 245 | + ], |
|
| 246 | + bouton_suivant(_T('bouton_acces_ldap')) |
|
| 247 | + ))); |
|
| 248 | 248 | } |
| 249 | 249 | |
| 250 | 250 | |
| 251 | 251 | function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pass, $hidden, $auteur_obligatoire) { |
| 252 | - return info_progression_etape(3, 'etape_', 'install/') . |
|
| 253 | - info_etape( |
|
| 254 | - _T('info_informations_personnelles'), |
|
| 255 | - '<b>' . _T('texte_informations_personnelles_1') . '</b>' . |
|
| 256 | - aider('install5', true) . |
|
| 257 | - '<p>' . |
|
| 258 | - ($auteur_obligatoire ? |
|
| 259 | - '' |
|
| 260 | - : |
|
| 261 | - _T('texte_informations_personnelles_2') . ' ' . _T('info_laisser_champs_vides') |
|
| 262 | - ) |
|
| 263 | - ) |
|
| 264 | - . generer_form_ecrire('install', ( |
|
| 265 | - "\n<input type='hidden' name='etape' value='3b' />" |
|
| 266 | - . $hidden |
|
| 267 | - . fieldset( |
|
| 268 | - _T('info_identification_publique'), |
|
| 269 | - [ |
|
| 270 | - 'nom' => [ |
|
| 271 | - 'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n", |
|
| 272 | - 'valeur' => $nom, |
|
| 273 | - 'required' => $auteur_obligatoire, |
|
| 274 | - ], |
|
| 275 | - 'email' => [ |
|
| 276 | - 'label' => '<b>' . _T('entree_adresse_email') . "</b>\n", |
|
| 277 | - 'valeur' => $email, |
|
| 278 | - ] |
|
| 279 | - ] |
|
| 280 | - ) |
|
| 281 | - |
|
| 282 | - . fieldset( |
|
| 283 | - _T('entree_identifiants_connexion'), |
|
| 284 | - [ |
|
| 285 | - 'login' => [ |
|
| 286 | - 'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T( |
|
| 287 | - 'info_login_trop_court_car_pluriel', |
|
| 288 | - ['nb' => _LOGIN_TROP_COURT] |
|
| 289 | - ) . "\n", |
|
| 290 | - 'valeur' => $login, |
|
| 291 | - 'required' => $auteur_obligatoire, |
|
| 292 | - ], |
|
| 293 | - 'pass' => [ |
|
| 294 | - 'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T( |
|
| 295 | - 'info_passe_trop_court_car_pluriel', |
|
| 296 | - ['nb' => _PASS_LONGUEUR_MINI] |
|
| 297 | - ) . "\n", |
|
| 298 | - 'valeur' => $pass, |
|
| 299 | - 'required' => $auteur_obligatoire, |
|
| 300 | - ], |
|
| 301 | - 'pass_verif' => [ |
|
| 302 | - 'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n", |
|
| 303 | - 'valeur' => $pass, |
|
| 304 | - 'required' => $auteur_obligatoire, |
|
| 305 | - ] |
|
| 306 | - ] |
|
| 307 | - ) |
|
| 308 | - . bouton_suivant())); |
|
| 252 | + return info_progression_etape(3, 'etape_', 'install/') . |
|
| 253 | + info_etape( |
|
| 254 | + _T('info_informations_personnelles'), |
|
| 255 | + '<b>' . _T('texte_informations_personnelles_1') . '</b>' . |
|
| 256 | + aider('install5', true) . |
|
| 257 | + '<p>' . |
|
| 258 | + ($auteur_obligatoire ? |
|
| 259 | + '' |
|
| 260 | + : |
|
| 261 | + _T('texte_informations_personnelles_2') . ' ' . _T('info_laisser_champs_vides') |
|
| 262 | + ) |
|
| 263 | + ) |
|
| 264 | + . generer_form_ecrire('install', ( |
|
| 265 | + "\n<input type='hidden' name='etape' value='3b' />" |
|
| 266 | + . $hidden |
|
| 267 | + . fieldset( |
|
| 268 | + _T('info_identification_publique'), |
|
| 269 | + [ |
|
| 270 | + 'nom' => [ |
|
| 271 | + 'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n", |
|
| 272 | + 'valeur' => $nom, |
|
| 273 | + 'required' => $auteur_obligatoire, |
|
| 274 | + ], |
|
| 275 | + 'email' => [ |
|
| 276 | + 'label' => '<b>' . _T('entree_adresse_email') . "</b>\n", |
|
| 277 | + 'valeur' => $email, |
|
| 278 | + ] |
|
| 279 | + ] |
|
| 280 | + ) |
|
| 281 | + |
|
| 282 | + . fieldset( |
|
| 283 | + _T('entree_identifiants_connexion'), |
|
| 284 | + [ |
|
| 285 | + 'login' => [ |
|
| 286 | + 'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T( |
|
| 287 | + 'info_login_trop_court_car_pluriel', |
|
| 288 | + ['nb' => _LOGIN_TROP_COURT] |
|
| 289 | + ) . "\n", |
|
| 290 | + 'valeur' => $login, |
|
| 291 | + 'required' => $auteur_obligatoire, |
|
| 292 | + ], |
|
| 293 | + 'pass' => [ |
|
| 294 | + 'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T( |
|
| 295 | + 'info_passe_trop_court_car_pluriel', |
|
| 296 | + ['nb' => _PASS_LONGUEUR_MINI] |
|
| 297 | + ) . "\n", |
|
| 298 | + 'valeur' => $pass, |
|
| 299 | + 'required' => $auteur_obligatoire, |
|
| 300 | + ], |
|
| 301 | + 'pass_verif' => [ |
|
| 302 | + 'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n", |
|
| 303 | + 'valeur' => $pass, |
|
| 304 | + 'required' => $auteur_obligatoire, |
|
| 305 | + ] |
|
| 306 | + ] |
|
| 307 | + ) |
|
| 308 | + . bouton_suivant())); |
|
| 309 | 309 | } |
| 310 | 310 | |
| 311 | 311 | function install_etape_3_dist() { |
| 312 | - $ldap_present = _request('ldap_present'); |
|
| 313 | - |
|
| 314 | - if (!$ldap_present) { |
|
| 315 | - $adresse_db = defined('_INSTALL_HOST_DB') |
|
| 316 | - ? _INSTALL_HOST_DB |
|
| 317 | - : _request('adresse_db'); |
|
| 318 | - |
|
| 319 | - $login_db = defined('_INSTALL_USER_DB') |
|
| 320 | - ? _INSTALL_USER_DB |
|
| 321 | - : _request('login_db'); |
|
| 322 | - |
|
| 323 | - $pass_db = defined('_INSTALL_PASS_DB') |
|
| 324 | - ? _INSTALL_PASS_DB |
|
| 325 | - : _request('pass_db'); |
|
| 326 | - |
|
| 327 | - $server_db = defined('_INSTALL_SERVER_DB') |
|
| 328 | - ? _INSTALL_SERVER_DB |
|
| 329 | - : _request('server_db'); |
|
| 330 | - |
|
| 331 | - $chmod_db = defined('_SPIP_CHMOD') |
|
| 332 | - ? _SPIP_CHMOD |
|
| 333 | - : _request('chmod'); |
|
| 334 | - |
|
| 335 | - $choix_db = defined('_INSTALL_NAME_DB') |
|
| 336 | - ? _INSTALL_NAME_DB |
|
| 337 | - : _request('choix_db'); |
|
| 338 | - |
|
| 339 | - $sel_db = ($choix_db == 'new_spip') |
|
| 340 | - ? _request('table_new') : $choix_db; |
|
| 341 | - |
|
| 342 | - $res = install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db); |
|
| 343 | - |
|
| 344 | - if ($res) { |
|
| 345 | - $res = info_progression_etape(2, 'etape_', 'install/', true) |
|
| 346 | - . "<div class='error'><h3>" . _T('avis_operation_echec') . '</h3>' |
|
| 347 | - . $res |
|
| 348 | - . '<p>' . _T('texte_operation_echec') . '</p>' |
|
| 349 | - . '</div>'; |
|
| 350 | - } |
|
| 351 | - } else { |
|
| 352 | - $res = ''; |
|
| 353 | - [$adresse_db, $login_db, $pass_db, $sel_db, $server_db] = analyse_fichier_connection(_FILE_CONNECT_TMP); |
|
| 354 | - $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); |
|
| 355 | - } |
|
| 356 | - |
|
| 357 | - if (!$res) { |
|
| 358 | - if (file_exists(_FILE_CONNECT_TMP)) { |
|
| 359 | - include(_FILE_CONNECT_TMP); |
|
| 360 | - } else { |
|
| 361 | - redirige_url_ecrire('install'); |
|
| 362 | - } |
|
| 363 | - |
|
| 364 | - if (file_exists(_FILE_CHMOD_TMP)) { |
|
| 365 | - include(_FILE_CHMOD_TMP); |
|
| 366 | - } else { |
|
| 367 | - redirige_url_ecrire('install'); |
|
| 368 | - } |
|
| 369 | - |
|
| 370 | - $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) |
|
| 371 | - . (defined('_INSTALL_NAME_DB') ? '' |
|
| 372 | - : "\n<input type='hidden' name='sel_db' value=\"" . spip_htmlspecialchars($sel_db) . '" />'); |
|
| 373 | - |
|
| 374 | - $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); |
|
| 375 | - |
|
| 376 | - $res = "<div class='success'><b>" |
|
| 377 | - . _T('info_base_installee') |
|
| 378 | - . '</b></div>' |
|
| 379 | - . install_premier_auteur( |
|
| 380 | - _request('email'), |
|
| 381 | - _request('login'), |
|
| 382 | - _request('nom'), |
|
| 383 | - _request('pass'), |
|
| 384 | - $hidden, |
|
| 385 | - $auteur_obligatoire |
|
| 386 | - ) |
|
| 387 | - . (($ldap_present || !function_exists('ldap_connect')) |
|
| 388 | - ? '' : install_propose_ldap()); |
|
| 389 | - } |
|
| 390 | - |
|
| 391 | - |
|
| 392 | - $minipage = new Installation(); |
|
| 393 | - echo $minipage->page($res); |
|
| 312 | + $ldap_present = _request('ldap_present'); |
|
| 313 | + |
|
| 314 | + if (!$ldap_present) { |
|
| 315 | + $adresse_db = defined('_INSTALL_HOST_DB') |
|
| 316 | + ? _INSTALL_HOST_DB |
|
| 317 | + : _request('adresse_db'); |
|
| 318 | + |
|
| 319 | + $login_db = defined('_INSTALL_USER_DB') |
|
| 320 | + ? _INSTALL_USER_DB |
|
| 321 | + : _request('login_db'); |
|
| 322 | + |
|
| 323 | + $pass_db = defined('_INSTALL_PASS_DB') |
|
| 324 | + ? _INSTALL_PASS_DB |
|
| 325 | + : _request('pass_db'); |
|
| 326 | + |
|
| 327 | + $server_db = defined('_INSTALL_SERVER_DB') |
|
| 328 | + ? _INSTALL_SERVER_DB |
|
| 329 | + : _request('server_db'); |
|
| 330 | + |
|
| 331 | + $chmod_db = defined('_SPIP_CHMOD') |
|
| 332 | + ? _SPIP_CHMOD |
|
| 333 | + : _request('chmod'); |
|
| 334 | + |
|
| 335 | + $choix_db = defined('_INSTALL_NAME_DB') |
|
| 336 | + ? _INSTALL_NAME_DB |
|
| 337 | + : _request('choix_db'); |
|
| 338 | + |
|
| 339 | + $sel_db = ($choix_db == 'new_spip') |
|
| 340 | + ? _request('table_new') : $choix_db; |
|
| 341 | + |
|
| 342 | + $res = install_bases($adresse_db, $login_db, $pass_db, $server_db, $choix_db, $sel_db, $chmod_db); |
|
| 343 | + |
|
| 344 | + if ($res) { |
|
| 345 | + $res = info_progression_etape(2, 'etape_', 'install/', true) |
|
| 346 | + . "<div class='error'><h3>" . _T('avis_operation_echec') . '</h3>' |
|
| 347 | + . $res |
|
| 348 | + . '<p>' . _T('texte_operation_echec') . '</p>' |
|
| 349 | + . '</div>'; |
|
| 350 | + } |
|
| 351 | + } else { |
|
| 352 | + $res = ''; |
|
| 353 | + [$adresse_db, $login_db, $pass_db, $sel_db, $server_db] = analyse_fichier_connection(_FILE_CONNECT_TMP); |
|
| 354 | + $GLOBALS['connexions'][$server_db] = spip_connect_db($adresse_db, $sel_db, $login_db, $pass_db, $sel_db, $server_db); |
|
| 355 | + } |
|
| 356 | + |
|
| 357 | + if (!$res) { |
|
| 358 | + if (file_exists(_FILE_CONNECT_TMP)) { |
|
| 359 | + include(_FILE_CONNECT_TMP); |
|
| 360 | + } else { |
|
| 361 | + redirige_url_ecrire('install'); |
|
| 362 | + } |
|
| 363 | + |
|
| 364 | + if (file_exists(_FILE_CHMOD_TMP)) { |
|
| 365 | + include(_FILE_CHMOD_TMP); |
|
| 366 | + } else { |
|
| 367 | + redirige_url_ecrire('install'); |
|
| 368 | + } |
|
| 369 | + |
|
| 370 | + $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) |
|
| 371 | + . (defined('_INSTALL_NAME_DB') ? '' |
|
| 372 | + : "\n<input type='hidden' name='sel_db' value=\"" . spip_htmlspecialchars($sel_db) . '" />'); |
|
| 373 | + |
|
| 374 | + $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); |
|
| 375 | + |
|
| 376 | + $res = "<div class='success'><b>" |
|
| 377 | + . _T('info_base_installee') |
|
| 378 | + . '</b></div>' |
|
| 379 | + . install_premier_auteur( |
|
| 380 | + _request('email'), |
|
| 381 | + _request('login'), |
|
| 382 | + _request('nom'), |
|
| 383 | + _request('pass'), |
|
| 384 | + $hidden, |
|
| 385 | + $auteur_obligatoire |
|
| 386 | + ) |
|
| 387 | + . (($ldap_present || !function_exists('ldap_connect')) |
|
| 388 | + ? '' : install_propose_ldap()); |
|
| 389 | + } |
|
| 390 | + |
|
| 391 | + |
|
| 392 | + $minipage = new Installation(); |
|
| 393 | + echo $minipage->page($res); |
|
| 394 | 394 | } |
@@ -47,7 +47,7 @@ discard block |
||
| 47 | 47 | = spip_connect_db($adresse_db, $port, $login_db, $pass_db, '', $server_db); |
| 48 | 48 | |
| 49 | 49 | $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
| 50 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 50 | + = $GLOBALS['spip_'.$server_db.'_functions_'.$GLOBALS['spip_sql_version']]; |
|
| 51 | 51 | |
| 52 | 52 | $fquery = sql_serveur('query', $server_db); |
| 53 | 53 | if ($choix_db == 'new_spip') { |
@@ -57,13 +57,13 @@ discard block |
||
| 57 | 57 | if (!$ok) { |
| 58 | 58 | $re = "Impossible de creer la base $re"; |
| 59 | 59 | $logger->info($re); |
| 60 | - return '<p>' . _T('avis_connexion_erreur_creer_base') . "</p><!--\n$re\n-->"; |
|
| 60 | + return '<p>'._T('avis_connexion_erreur_creer_base')."</p><!--\n$re\n-->"; |
|
| 61 | 61 | } |
| 62 | 62 | } else { |
| 63 | 63 | $re = "Le nom de la base doit correspondre a $re"; |
| 64 | 64 | $logger->info($re); |
| 65 | 65 | |
| 66 | - return '<p>' . _T('avis_connexion_erreur_nom_base') . "</p><!--\n$re\n-->"; |
|
| 66 | + return '<p>'._T('avis_connexion_erreur_nom_base')."</p><!--\n$re\n-->"; |
|
| 67 | 67 | } |
| 68 | 68 | } |
| 69 | 69 | |
@@ -74,14 +74,14 @@ discard block |
||
| 74 | 74 | = spip_connect_db($adresse_db, $port, $login_db, $pass_db, $sel_db, $server_db); |
| 75 | 75 | |
| 76 | 76 | $GLOBALS['connexions'][$server_db][$GLOBALS['spip_sql_version']] |
| 77 | - = $GLOBALS['spip_' . $server_db . '_functions_' . $GLOBALS['spip_sql_version']]; |
|
| 77 | + = $GLOBALS['spip_'.$server_db.'_functions_'.$GLOBALS['spip_sql_version']]; |
|
| 78 | 78 | |
| 79 | 79 | // Completer le tableau decrivant la connexion |
| 80 | 80 | |
| 81 | 81 | $GLOBALS['connexions'][$server_db]['prefixe'] = $table_prefix; |
| 82 | 82 | $GLOBALS['connexions'][$server_db]['db'] = $sel_db; |
| 83 | 83 | |
| 84 | - $old = sql_showbase($table_prefix . '_meta', $server_db); |
|
| 84 | + $old = sql_showbase($table_prefix.'_meta', $server_db); |
|
| 85 | 85 | if ($old) { |
| 86 | 86 | $old = sql_fetch($old, $server_db); |
| 87 | 87 | } |
@@ -100,7 +100,7 @@ discard block |
||
| 100 | 100 | $charset['charset']; |
| 101 | 101 | $charsetbase = $charset['charset']; |
| 102 | 102 | } else { |
| 103 | - $logger->info(_DEFAULT_CHARSET . ' inconnu du serveur SQL'); |
|
| 103 | + $logger->info(_DEFAULT_CHARSET.' inconnu du serveur SQL'); |
|
| 104 | 104 | $charsetbase = 'standard'; |
| 105 | 105 | } |
| 106 | 106 | $logger->info("Creation des tables. Codage $charsetbase"); |
@@ -150,7 +150,7 @@ discard block |
||
| 150 | 150 | if ($r) { |
| 151 | 151 | $r = sql_fetch($r, $server_db); |
| 152 | 152 | } |
| 153 | - $version_installee = $r ? (double)$r['valeur'] : 0; |
|
| 153 | + $version_installee = $r ? (double) $r['valeur'] : 0; |
|
| 154 | 154 | if (!$version_installee || $GLOBALS['spip_version_base'] < $version_installee) { |
| 155 | 155 | $fupdateq( |
| 156 | 156 | 'spip_meta', |
@@ -159,7 +159,7 @@ discard block |
||
| 159 | 159 | '', |
| 160 | 160 | $server_db |
| 161 | 161 | ); |
| 162 | - $logger->info('nouvelle version installee: ' . $GLOBALS['spip_version_base']); |
|
| 162 | + $logger->info('nouvelle version installee: '.$GLOBALS['spip_version_base']); |
|
| 163 | 163 | } |
| 164 | 164 | // eliminer la derniere operation d'admin mal terminee |
| 165 | 165 | // notamment la mise a jour |
@@ -186,7 +186,7 @@ discard block |
||
| 186 | 186 | if ($chmod_db) { |
| 187 | 187 | install_fichier_connexion( |
| 188 | 188 | _FILE_CHMOD_TMP, |
| 189 | - "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', " . sprintf('0%3o', $chmod_db) . ");\n" |
|
| 189 | + "if (!defined('_SPIP_CHMOD')) define('_SPIP_CHMOD', ".sprintf('0%3o', $chmod_db).");\n" |
|
| 190 | 190 | ); |
| 191 | 191 | } |
| 192 | 192 | |
@@ -249,16 +249,16 @@ discard block |
||
| 249 | 249 | |
| 250 | 250 | |
| 251 | 251 | function install_premier_auteur($email, $login, $nom, #[\SensitiveParameter] $pass, $hidden, $auteur_obligatoire) { |
| 252 | - return info_progression_etape(3, 'etape_', 'install/') . |
|
| 252 | + return info_progression_etape(3, 'etape_', 'install/'). |
|
| 253 | 253 | info_etape( |
| 254 | 254 | _T('info_informations_personnelles'), |
| 255 | - '<b>' . _T('texte_informations_personnelles_1') . '</b>' . |
|
| 256 | - aider('install5', true) . |
|
| 257 | - '<p>' . |
|
| 255 | + '<b>'._T('texte_informations_personnelles_1').'</b>'. |
|
| 256 | + aider('install5', true). |
|
| 257 | + '<p>'. |
|
| 258 | 258 | ($auteur_obligatoire ? |
| 259 | 259 | '' |
| 260 | 260 | : |
| 261 | - _T('texte_informations_personnelles_2') . ' ' . _T('info_laisser_champs_vides') |
|
| 261 | + _T('texte_informations_personnelles_2').' '._T('info_laisser_champs_vides') |
|
| 262 | 262 | ) |
| 263 | 263 | ) |
| 264 | 264 | . generer_form_ecrire('install', ( |
@@ -268,12 +268,12 @@ discard block |
||
| 268 | 268 | _T('info_identification_publique'), |
| 269 | 269 | [ |
| 270 | 270 | 'nom' => [ |
| 271 | - 'label' => '<b>' . _T('entree_signature') . "</b><br />\n" . _T('entree_nom_pseudo_1') . "\n", |
|
| 271 | + 'label' => '<b>'._T('entree_signature')."</b><br />\n"._T('entree_nom_pseudo_1')."\n", |
|
| 272 | 272 | 'valeur' => $nom, |
| 273 | 273 | 'required' => $auteur_obligatoire, |
| 274 | 274 | ], |
| 275 | 275 | 'email' => [ |
| 276 | - 'label' => '<b>' . _T('entree_adresse_email') . "</b>\n", |
|
| 276 | + 'label' => '<b>'._T('entree_adresse_email')."</b>\n", |
|
| 277 | 277 | 'valeur' => $email, |
| 278 | 278 | ] |
| 279 | 279 | ] |
@@ -283,23 +283,23 @@ discard block |
||
| 283 | 283 | _T('entree_identifiants_connexion'), |
| 284 | 284 | [ |
| 285 | 285 | 'login' => [ |
| 286 | - 'label' => '<b>' . _T('entree_login') . "</b><br />\n" . _T( |
|
| 286 | + 'label' => '<b>'._T('entree_login')."</b><br />\n"._T( |
|
| 287 | 287 | 'info_login_trop_court_car_pluriel', |
| 288 | 288 | ['nb' => _LOGIN_TROP_COURT] |
| 289 | - ) . "\n", |
|
| 289 | + )."\n", |
|
| 290 | 290 | 'valeur' => $login, |
| 291 | 291 | 'required' => $auteur_obligatoire, |
| 292 | 292 | ], |
| 293 | 293 | 'pass' => [ |
| 294 | - 'label' => '<b>' . _T('entree_mot_passe') . "</b><br />\n" . _T( |
|
| 294 | + 'label' => '<b>'._T('entree_mot_passe')."</b><br />\n"._T( |
|
| 295 | 295 | 'info_passe_trop_court_car_pluriel', |
| 296 | 296 | ['nb' => _PASS_LONGUEUR_MINI] |
| 297 | - ) . "\n", |
|
| 297 | + )."\n", |
|
| 298 | 298 | 'valeur' => $pass, |
| 299 | 299 | 'required' => $auteur_obligatoire, |
| 300 | 300 | ], |
| 301 | 301 | 'pass_verif' => [ |
| 302 | - 'label' => '<b>' . _T('info_confirmer_passe') . "</b><br />\n", |
|
| 302 | + 'label' => '<b>'._T('info_confirmer_passe')."</b><br />\n", |
|
| 303 | 303 | 'valeur' => $pass, |
| 304 | 304 | 'required' => $auteur_obligatoire, |
| 305 | 305 | ] |
@@ -343,9 +343,9 @@ discard block |
||
| 343 | 343 | |
| 344 | 344 | if ($res) { |
| 345 | 345 | $res = info_progression_etape(2, 'etape_', 'install/', true) |
| 346 | - . "<div class='error'><h3>" . _T('avis_operation_echec') . '</h3>' |
|
| 346 | + . "<div class='error'><h3>"._T('avis_operation_echec').'</h3>' |
|
| 347 | 347 | . $res |
| 348 | - . '<p>' . _T('texte_operation_echec') . '</p>' |
|
| 348 | + . '<p>'._T('texte_operation_echec').'</p>' |
|
| 349 | 349 | . '</div>'; |
| 350 | 350 | } |
| 351 | 351 | } else { |
@@ -369,7 +369,7 @@ discard block |
||
| 369 | 369 | |
| 370 | 370 | $hidden = predef_ou_cache($adresse_db, $login_db, $pass_db, $server_db) |
| 371 | 371 | . (defined('_INSTALL_NAME_DB') ? '' |
| 372 | - : "\n<input type='hidden' name='sel_db' value=\"" . spip_htmlspecialchars($sel_db) . '" />'); |
|
| 372 | + : "\n<input type='hidden' name='sel_db' value=\"".spip_htmlspecialchars($sel_db).'" />'); |
|
| 373 | 373 | |
| 374 | 374 | $auteur_obligatoire = ($ldap_present ? 0 : !sql_countsel('spip_auteurs', '', '', '', $server_db)); |
| 375 | 375 | |
@@ -10,7 +10,7 @@ discard block |
||
| 10 | 10 | \***************************************************************************/ |
| 11 | 11 | |
| 12 | 12 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 13 | - return; |
|
| 13 | + return; |
|
| 14 | 14 | } |
| 15 | 15 | |
| 16 | 16 | include_fichiers_fonctions(); |
@@ -29,178 +29,178 @@ discard block |
||
| 29 | 29 | # En cas d'erreur process_ins est absent et texte est un tableau de 2 chaines |
| 30 | 30 | |
| 31 | 31 | function public_parametrer_dist($fond, $contexte = '', $cache = '', string $connect = '') { |
| 32 | - static $composer, $styliser, $notes = null; |
|
| 33 | - $courant = null; |
|
| 34 | - $page = tester_redirection($fond, $contexte, $connect); |
|
| 35 | - if ($page) { |
|
| 36 | - return $page; |
|
| 37 | - } |
|
| 38 | - |
|
| 39 | - if (isset($contexte['lang'])) { |
|
| 40 | - $lang = $contexte['lang']; |
|
| 41 | - } elseif (!isset($lang)) { |
|
| 42 | - $lang = $GLOBALS['meta']['langue_site']; |
|
| 43 | - } |
|
| 44 | - |
|
| 45 | - $select = ((!isset($GLOBALS['forcer_lang']) || !$GLOBALS['forcer_lang']) && $lang != $GLOBALS['spip_lang']); |
|
| 46 | - if ($select) { |
|
| 47 | - $select = lang_select($lang); |
|
| 48 | - } |
|
| 49 | - |
|
| 50 | - $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug'); |
|
| 51 | - |
|
| 52 | - if (!$styliser) { |
|
| 53 | - $styliser = charger_fonction('styliser', 'public'); |
|
| 54 | - } |
|
| 55 | - [$skel, $mime_type, $gram, $sourcefile] = |
|
| 56 | - $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect); |
|
| 57 | - |
|
| 58 | - if ($skel) { |
|
| 59 | - // sauver le nom de l'eventuel squelette en cours d'execution |
|
| 60 | - // (recursion possible a cause des modeles) |
|
| 61 | - if ($debug) { |
|
| 62 | - $courant = $GLOBALS['debug_objets']['courant'] ?? null; |
|
| 63 | - $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte; |
|
| 64 | - } |
|
| 65 | - |
|
| 66 | - // charger le squelette en specifiant les langages cibles et source |
|
| 67 | - // au cas il faudrait le compiler (source posterieure au resultat) |
|
| 68 | - |
|
| 69 | - if (!$composer) { |
|
| 70 | - $composer = charger_fonction('composer', 'public'); |
|
| 71 | - } |
|
| 72 | - $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect); |
|
| 73 | - } else { |
|
| 74 | - $fonc = ''; |
|
| 75 | - } |
|
| 76 | - |
|
| 77 | - if (!$fonc) { // squelette inconnu (==='') ou faux (===false) |
|
| 78 | - $page = $fonc; |
|
| 79 | - } else { |
|
| 80 | - // Preparer l'appel de la fonction principale du squelette |
|
| 81 | - |
|
| 82 | - spip_timer($a = 'calcul page ' . random_int(0, 1000)); |
|
| 83 | - |
|
| 84 | - // On cree un marqueur de notes unique lie a cette composition |
|
| 85 | - // et on enregistre l'etat courant des globales de notes... |
|
| 86 | - if (is_null($notes)) { |
|
| 87 | - $notes = charger_fonction('notes', 'inc', true); |
|
| 88 | - } |
|
| 89 | - if ($notes) { |
|
| 90 | - $notes('', 'empiler'); |
|
| 91 | - } |
|
| 92 | - |
|
| 93 | - // Rajouter d'office ces deux parametres |
|
| 94 | - // (mais vaudrait mieux que le compilateur sache le simuler |
|
| 95 | - // car ca interdit l'usage de criteres conditionnels dessus). |
|
| 96 | - if (!isset($contexte['date'])) { |
|
| 97 | - $contexte['date'] = date('Y-m-d H:i:s'); |
|
| 98 | - $contexte['date_default'] = true; |
|
| 99 | - } else { |
|
| 100 | - $contexte['date'] = normaliser_date($contexte['date'], true); |
|
| 101 | - } |
|
| 102 | - |
|
| 103 | - if (!isset($contexte['date_redac'])) { |
|
| 104 | - $contexte['date_redac'] = date('Y-m-d H:i:s'); |
|
| 105 | - $contexte['date_redac_default'] = true; |
|
| 106 | - } else { |
|
| 107 | - $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true); |
|
| 108 | - } |
|
| 109 | - |
|
| 110 | - // Passer le nom du cache pour produire sa destruction automatique |
|
| 111 | - try { |
|
| 112 | - $page = $fonc(['cache' => $cache], [$contexte]); |
|
| 113 | - } catch (Throwable $e) { |
|
| 114 | - $msg = _T('zbug_erreur_execution_page') . " $sourcefile"; |
|
| 115 | - $full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 116 | - $full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg); |
|
| 117 | - $corps = "<pre>$msg</pre>"; |
|
| 118 | - $page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile); |
|
| 119 | - erreur_squelette($full_msg); |
|
| 120 | - unset($msg, $full_msg, $corps); |
|
| 121 | - } |
|
| 122 | - |
|
| 123 | - // Restituer les globales de notes telles qu'elles etaient avant l'appel |
|
| 124 | - // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent* |
|
| 125 | - // etre dans son resultat, autrement elles ne seraient pas prises en |
|
| 126 | - // compte a chaque calcul d'un texte contenant un modele, mais seulement |
|
| 127 | - // quand le modele serait calcule, et on aurait des resultats incoherents) |
|
| 128 | - if ($notes) { |
|
| 129 | - $notes('', 'depiler'); |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - // reinjecter en dynamique la pile des notes |
|
| 133 | - // si il y a des inclure dynamiques |
|
| 134 | - // si la pile n'est pas vide |
|
| 135 | - // la generalisation de cette injection permettrait de corriger le point juste au dessus |
|
| 136 | - // en faisant remonter les notes a l'incluant (A tester et valider avant application) |
|
| 137 | - if ($notes) { |
|
| 138 | - $page['notes'] = $notes('', 'sauver_etat'); |
|
| 139 | - } |
|
| 140 | - |
|
| 141 | - // spip_log: un joli contexte |
|
| 142 | - $infos = presenter_contexte(array_filter($contexte)); |
|
| 143 | - |
|
| 144 | - $profile = spip_timer($a); |
|
| 145 | - spip_logger()->info("calcul ($profile) [$skel] $infos" |
|
| 146 | - . ' (' . strlen((string) $page['texte']) . ' octets)'); |
|
| 147 | - |
|
| 148 | - if (defined('_CALCUL_PROFILER') && (int) $profile > _CALCUL_PROFILER) { |
|
| 149 | - spip_logger('profiler')->notice("calcul ($profile) [$skel] $infos" |
|
| 150 | - . ' (' . strlen((string) $page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI']); |
|
| 151 | - } |
|
| 152 | - |
|
| 153 | - if ($debug) { |
|
| 154 | - // si c'est ce que demande le debusqueur, lui passer la main |
|
| 155 | - $t = strlen((string) $page['texte']) ? $page['texte'] : ' '; |
|
| 156 | - $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t; |
|
| 157 | - $GLOBALS['debug_objets']['courant'] = $courant; |
|
| 158 | - $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile; |
|
| 159 | - if ( |
|
| 160 | - $GLOBALS['debug_objets']['sourcefile'] |
|
| 161 | - && _request('var_mode_objet') == $fonc |
|
| 162 | - && _request('var_mode_affiche') == 'resultat' |
|
| 163 | - ) { |
|
| 164 | - erreur_squelette(); |
|
| 165 | - } |
|
| 166 | - } |
|
| 167 | - // Si #CACHE{} n'etait pas la, le mettre a $delais |
|
| 168 | - if (!isset($page['entetes']['X-Spip-Cache'])) { |
|
| 169 | - // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut |
|
| 170 | - // si aucun #CACHE{} spécifié |
|
| 171 | - // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme |
|
| 172 | - // entre public et prive |
|
| 173 | - if (test_espace_prive() || str_starts_with((string) $fond, 'modeles/')) { |
|
| 174 | - $page['entetes']['X-Spip-Cache'] = 0; |
|
| 175 | - } else { |
|
| 176 | - $page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'] ?? 36000; |
|
| 177 | - } |
|
| 178 | - } |
|
| 179 | - |
|
| 180 | - $page['contexte'] = $contexte; |
|
| 181 | - |
|
| 182 | - // faire remonter le fichier source |
|
| 183 | - static $js_inclus = false; |
|
| 184 | - if (defined('_VAR_INCLURE') && _VAR_INCLURE) { |
|
| 185 | - $page['sourcefile'] = $sourcefile; |
|
| 186 | - $page['texte'] = |
|
| 187 | - "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>' |
|
| 188 | - . ($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>"); |
|
| 189 | - $js_inclus = true; |
|
| 190 | - } |
|
| 191 | - |
|
| 192 | - // Si un modele contenait #SESSION, on note l'info dans $page |
|
| 193 | - if (isset($GLOBALS['cache_utilise_session'])) { |
|
| 194 | - $page['invalideurs']['session'] = $GLOBALS['cache_utilise_session']; |
|
| 195 | - unset($GLOBALS['cache_utilise_session']); |
|
| 196 | - } |
|
| 197 | - } |
|
| 198 | - |
|
| 199 | - if ($select) { |
|
| 200 | - lang_select(); |
|
| 201 | - } |
|
| 202 | - |
|
| 203 | - return $page; |
|
| 32 | + static $composer, $styliser, $notes = null; |
|
| 33 | + $courant = null; |
|
| 34 | + $page = tester_redirection($fond, $contexte, $connect); |
|
| 35 | + if ($page) { |
|
| 36 | + return $page; |
|
| 37 | + } |
|
| 38 | + |
|
| 39 | + if (isset($contexte['lang'])) { |
|
| 40 | + $lang = $contexte['lang']; |
|
| 41 | + } elseif (!isset($lang)) { |
|
| 42 | + $lang = $GLOBALS['meta']['langue_site']; |
|
| 43 | + } |
|
| 44 | + |
|
| 45 | + $select = ((!isset($GLOBALS['forcer_lang']) || !$GLOBALS['forcer_lang']) && $lang != $GLOBALS['spip_lang']); |
|
| 46 | + if ($select) { |
|
| 47 | + $select = lang_select($lang); |
|
| 48 | + } |
|
| 49 | + |
|
| 50 | + $debug = (defined('_VAR_MODE') && _VAR_MODE == 'debug'); |
|
| 51 | + |
|
| 52 | + if (!$styliser) { |
|
| 53 | + $styliser = charger_fonction('styliser', 'public'); |
|
| 54 | + } |
|
| 55 | + [$skel, $mime_type, $gram, $sourcefile] = |
|
| 56 | + $styliser($fond, $contexte, $GLOBALS['spip_lang'], $connect); |
|
| 57 | + |
|
| 58 | + if ($skel) { |
|
| 59 | + // sauver le nom de l'eventuel squelette en cours d'execution |
|
| 60 | + // (recursion possible a cause des modeles) |
|
| 61 | + if ($debug) { |
|
| 62 | + $courant = $GLOBALS['debug_objets']['courant'] ?? null; |
|
| 63 | + $GLOBALS['debug_objets']['contexte'][$sourcefile] = $contexte; |
|
| 64 | + } |
|
| 65 | + |
|
| 66 | + // charger le squelette en specifiant les langages cibles et source |
|
| 67 | + // au cas il faudrait le compiler (source posterieure au resultat) |
|
| 68 | + |
|
| 69 | + if (!$composer) { |
|
| 70 | + $composer = charger_fonction('composer', 'public'); |
|
| 71 | + } |
|
| 72 | + $fonc = $composer($skel, $mime_type, $gram, $sourcefile, $connect); |
|
| 73 | + } else { |
|
| 74 | + $fonc = ''; |
|
| 75 | + } |
|
| 76 | + |
|
| 77 | + if (!$fonc) { // squelette inconnu (==='') ou faux (===false) |
|
| 78 | + $page = $fonc; |
|
| 79 | + } else { |
|
| 80 | + // Preparer l'appel de la fonction principale du squelette |
|
| 81 | + |
|
| 82 | + spip_timer($a = 'calcul page ' . random_int(0, 1000)); |
|
| 83 | + |
|
| 84 | + // On cree un marqueur de notes unique lie a cette composition |
|
| 85 | + // et on enregistre l'etat courant des globales de notes... |
|
| 86 | + if (is_null($notes)) { |
|
| 87 | + $notes = charger_fonction('notes', 'inc', true); |
|
| 88 | + } |
|
| 89 | + if ($notes) { |
|
| 90 | + $notes('', 'empiler'); |
|
| 91 | + } |
|
| 92 | + |
|
| 93 | + // Rajouter d'office ces deux parametres |
|
| 94 | + // (mais vaudrait mieux que le compilateur sache le simuler |
|
| 95 | + // car ca interdit l'usage de criteres conditionnels dessus). |
|
| 96 | + if (!isset($contexte['date'])) { |
|
| 97 | + $contexte['date'] = date('Y-m-d H:i:s'); |
|
| 98 | + $contexte['date_default'] = true; |
|
| 99 | + } else { |
|
| 100 | + $contexte['date'] = normaliser_date($contexte['date'], true); |
|
| 101 | + } |
|
| 102 | + |
|
| 103 | + if (!isset($contexte['date_redac'])) { |
|
| 104 | + $contexte['date_redac'] = date('Y-m-d H:i:s'); |
|
| 105 | + $contexte['date_redac_default'] = true; |
|
| 106 | + } else { |
|
| 107 | + $contexte['date_redac'] = normaliser_date($contexte['date_redac'], true); |
|
| 108 | + } |
|
| 109 | + |
|
| 110 | + // Passer le nom du cache pour produire sa destruction automatique |
|
| 111 | + try { |
|
| 112 | + $page = $fonc(['cache' => $cache], [$contexte]); |
|
| 113 | + } catch (Throwable $e) { |
|
| 114 | + $msg = _T('zbug_erreur_execution_page') . " $sourcefile"; |
|
| 115 | + $full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 116 | + $full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg); |
|
| 117 | + $corps = "<pre>$msg</pre>"; |
|
| 118 | + $page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile); |
|
| 119 | + erreur_squelette($full_msg); |
|
| 120 | + unset($msg, $full_msg, $corps); |
|
| 121 | + } |
|
| 122 | + |
|
| 123 | + // Restituer les globales de notes telles qu'elles etaient avant l'appel |
|
| 124 | + // Si l'inclus n'a pas affiche ses notes, tant pis (elles *doivent* |
|
| 125 | + // etre dans son resultat, autrement elles ne seraient pas prises en |
|
| 126 | + // compte a chaque calcul d'un texte contenant un modele, mais seulement |
|
| 127 | + // quand le modele serait calcule, et on aurait des resultats incoherents) |
|
| 128 | + if ($notes) { |
|
| 129 | + $notes('', 'depiler'); |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + // reinjecter en dynamique la pile des notes |
|
| 133 | + // si il y a des inclure dynamiques |
|
| 134 | + // si la pile n'est pas vide |
|
| 135 | + // la generalisation de cette injection permettrait de corriger le point juste au dessus |
|
| 136 | + // en faisant remonter les notes a l'incluant (A tester et valider avant application) |
|
| 137 | + if ($notes) { |
|
| 138 | + $page['notes'] = $notes('', 'sauver_etat'); |
|
| 139 | + } |
|
| 140 | + |
|
| 141 | + // spip_log: un joli contexte |
|
| 142 | + $infos = presenter_contexte(array_filter($contexte)); |
|
| 143 | + |
|
| 144 | + $profile = spip_timer($a); |
|
| 145 | + spip_logger()->info("calcul ($profile) [$skel] $infos" |
|
| 146 | + . ' (' . strlen((string) $page['texte']) . ' octets)'); |
|
| 147 | + |
|
| 148 | + if (defined('_CALCUL_PROFILER') && (int) $profile > _CALCUL_PROFILER) { |
|
| 149 | + spip_logger('profiler')->notice("calcul ($profile) [$skel] $infos" |
|
| 150 | + . ' (' . strlen((string) $page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI']); |
|
| 151 | + } |
|
| 152 | + |
|
| 153 | + if ($debug) { |
|
| 154 | + // si c'est ce que demande le debusqueur, lui passer la main |
|
| 155 | + $t = strlen((string) $page['texte']) ? $page['texte'] : ' '; |
|
| 156 | + $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t; |
|
| 157 | + $GLOBALS['debug_objets']['courant'] = $courant; |
|
| 158 | + $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile; |
|
| 159 | + if ( |
|
| 160 | + $GLOBALS['debug_objets']['sourcefile'] |
|
| 161 | + && _request('var_mode_objet') == $fonc |
|
| 162 | + && _request('var_mode_affiche') == 'resultat' |
|
| 163 | + ) { |
|
| 164 | + erreur_squelette(); |
|
| 165 | + } |
|
| 166 | + } |
|
| 167 | + // Si #CACHE{} n'etait pas la, le mettre a $delais |
|
| 168 | + if (!isset($page['entetes']['X-Spip-Cache'])) { |
|
| 169 | + // Dans l'espace prive ou dans un modeles/ on pose un cache 0 par defaut |
|
| 170 | + // si aucun #CACHE{} spécifié |
|
| 171 | + // le contexte implicite qui conditionne le cache assure qu'on retombe pas sur le meme |
|
| 172 | + // entre public et prive |
|
| 173 | + if (test_espace_prive() || str_starts_with((string) $fond, 'modeles/')) { |
|
| 174 | + $page['entetes']['X-Spip-Cache'] = 0; |
|
| 175 | + } else { |
|
| 176 | + $page['entetes']['X-Spip-Cache'] = $GLOBALS['delais'] ?? 36000; |
|
| 177 | + } |
|
| 178 | + } |
|
| 179 | + |
|
| 180 | + $page['contexte'] = $contexte; |
|
| 181 | + |
|
| 182 | + // faire remonter le fichier source |
|
| 183 | + static $js_inclus = false; |
|
| 184 | + if (defined('_VAR_INCLURE') && _VAR_INCLURE) { |
|
| 185 | + $page['sourcefile'] = $sourcefile; |
|
| 186 | + $page['texte'] = |
|
| 187 | + "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>' |
|
| 188 | + . ($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>"); |
|
| 189 | + $js_inclus = true; |
|
| 190 | + } |
|
| 191 | + |
|
| 192 | + // Si un modele contenait #SESSION, on note l'info dans $page |
|
| 193 | + if (isset($GLOBALS['cache_utilise_session'])) { |
|
| 194 | + $page['invalideurs']['session'] = $GLOBALS['cache_utilise_session']; |
|
| 195 | + unset($GLOBALS['cache_utilise_session']); |
|
| 196 | + } |
|
| 197 | + } |
|
| 198 | + |
|
| 199 | + if ($select) { |
|
| 200 | + lang_select(); |
|
| 201 | + } |
|
| 202 | + |
|
| 203 | + return $page; |
|
| 204 | 204 | } |
| 205 | 205 | |
| 206 | 206 | /** |
@@ -209,37 +209,37 @@ discard block |
||
| 209 | 209 | * @return string |
| 210 | 210 | */ |
| 211 | 211 | function presenter_contexte($contexte, $profondeur_max = 1, $max_lines = 0) { |
| 212 | - $infos = []; |
|
| 213 | - $line = 0; |
|
| 214 | - foreach ($contexte as $var => $val) { |
|
| 215 | - $line++; |
|
| 216 | - if ($max_lines && $max_lines < $line) { |
|
| 217 | - $infos[] = '…'; |
|
| 218 | - break; |
|
| 219 | - } |
|
| 220 | - if ($val === null) { |
|
| 221 | - $val = ''; |
|
| 222 | - } elseif (is_array($val)) { |
|
| 223 | - if ($profondeur_max > 0) { |
|
| 224 | - $val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')'; |
|
| 225 | - } else { |
|
| 226 | - $val = 'array:' . count($val); |
|
| 227 | - } |
|
| 228 | - } elseif (is_object($val)) { |
|
| 229 | - $val = $val::class; |
|
| 230 | - } elseif (strlen("$val") > 30) { |
|
| 231 | - $val = substr("$val", 0, 29) . '…'; |
|
| 232 | - if (strstr($val, ' ')) { |
|
| 233 | - $val = "'$val'"; |
|
| 234 | - } |
|
| 235 | - } elseif (strstr((string) $val, ' ')) { |
|
| 236 | - $val = "'$val'"; |
|
| 237 | - } elseif (!strlen((string) $val)) { |
|
| 238 | - $val = "''"; |
|
| 239 | - } |
|
| 240 | - $infos[] = $var . '=' . $val; |
|
| 241 | - } |
|
| 242 | - return implode(', ', $infos); |
|
| 212 | + $infos = []; |
|
| 213 | + $line = 0; |
|
| 214 | + foreach ($contexte as $var => $val) { |
|
| 215 | + $line++; |
|
| 216 | + if ($max_lines && $max_lines < $line) { |
|
| 217 | + $infos[] = '…'; |
|
| 218 | + break; |
|
| 219 | + } |
|
| 220 | + if ($val === null) { |
|
| 221 | + $val = ''; |
|
| 222 | + } elseif (is_array($val)) { |
|
| 223 | + if ($profondeur_max > 0) { |
|
| 224 | + $val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')'; |
|
| 225 | + } else { |
|
| 226 | + $val = 'array:' . count($val); |
|
| 227 | + } |
|
| 228 | + } elseif (is_object($val)) { |
|
| 229 | + $val = $val::class; |
|
| 230 | + } elseif (strlen("$val") > 30) { |
|
| 231 | + $val = substr("$val", 0, 29) . '…'; |
|
| 232 | + if (strstr($val, ' ')) { |
|
| 233 | + $val = "'$val'"; |
|
| 234 | + } |
|
| 235 | + } elseif (strstr((string) $val, ' ')) { |
|
| 236 | + $val = "'$val'"; |
|
| 237 | + } elseif (!strlen((string) $val)) { |
|
| 238 | + $val = "''"; |
|
| 239 | + } |
|
| 240 | + $infos[] = $var . '=' . $val; |
|
| 241 | + } |
|
| 242 | + return implode(', ', $infos); |
|
| 243 | 243 | } |
| 244 | 244 | |
| 245 | 245 | |
@@ -256,11 +256,11 @@ discard block |
||
| 256 | 256 | * @return array|bool |
| 257 | 257 | */ |
| 258 | 258 | function tester_redirection($fond, $contexte, $connect) { |
| 259 | - static $tester_redirection = null; |
|
| 260 | - if (is_null($tester_redirection)) { |
|
| 261 | - $tester_redirection = charger_fonction('tester_redirection', 'public'); |
|
| 262 | - } |
|
| 263 | - return $tester_redirection($fond, $contexte, $connect); |
|
| 259 | + static $tester_redirection = null; |
|
| 260 | + if (is_null($tester_redirection)) { |
|
| 261 | + $tester_redirection = charger_fonction('tester_redirection', 'public'); |
|
| 262 | + } |
|
| 263 | + return $tester_redirection($fond, $contexte, $connect); |
|
| 264 | 264 | } |
| 265 | 265 | |
| 266 | 266 | |
@@ -276,42 +276,42 @@ discard block |
||
| 276 | 276 | * @return array|bool |
| 277 | 277 | */ |
| 278 | 278 | function public_tester_redirection_dist($fond, $contexte, $connect) { |
| 279 | - if ( |
|
| 280 | - $fond == 'article' |
|
| 281 | - && !empty($contexte['id_article']) |
|
| 282 | - && ($id_article = (int) $contexte['id_article']) |
|
| 283 | - ) { |
|
| 284 | - include_spip('public/quete'); // pour quete_virtuel et ses dependances |
|
| 285 | - $m = quete_virtuel($id_article, $connect) ?? ''; |
|
| 286 | - if (strlen($m)) { |
|
| 287 | - include_spip('inc/texte'); |
|
| 288 | - // les navigateurs pataugent si l'URL est vide |
|
| 289 | - if ($url = virtuel_redirige($m, true)) { |
|
| 290 | - // passer en url absolue car cette redirection pourra |
|
| 291 | - // etre utilisee dans un contexte d'url qui change |
|
| 292 | - // y compris url arbo |
|
| 293 | - $status = 302; |
|
| 294 | - if (defined('_STATUS_REDIRECTION_VIRTUEL')) { |
|
| 295 | - $status = _STATUS_REDIRECTION_VIRTUEL; |
|
| 296 | - } |
|
| 297 | - if (!preg_match(',^\w+:,', (string) $url)) { |
|
| 298 | - include_spip('inc/filtres_mini'); |
|
| 299 | - $url = url_absolue($url); |
|
| 300 | - } |
|
| 301 | - $url = str_replace('&', '&', (string) $url); |
|
| 302 | - |
|
| 303 | - return [ |
|
| 304 | - 'texte' => '<' |
|
| 305 | - . "?php include_spip('inc/headers');redirige_par_entete('" |
|
| 306 | - . texte_script($url) |
|
| 307 | - . "','',$status);" |
|
| 308 | - . '?' . '>', |
|
| 309 | - 'process_ins' => 'php', |
|
| 310 | - 'status' => $status |
|
| 311 | - ]; |
|
| 312 | - } |
|
| 313 | - } |
|
| 314 | - } |
|
| 315 | - |
|
| 316 | - return false; |
|
| 279 | + if ( |
|
| 280 | + $fond == 'article' |
|
| 281 | + && !empty($contexte['id_article']) |
|
| 282 | + && ($id_article = (int) $contexte['id_article']) |
|
| 283 | + ) { |
|
| 284 | + include_spip('public/quete'); // pour quete_virtuel et ses dependances |
|
| 285 | + $m = quete_virtuel($id_article, $connect) ?? ''; |
|
| 286 | + if (strlen($m)) { |
|
| 287 | + include_spip('inc/texte'); |
|
| 288 | + // les navigateurs pataugent si l'URL est vide |
|
| 289 | + if ($url = virtuel_redirige($m, true)) { |
|
| 290 | + // passer en url absolue car cette redirection pourra |
|
| 291 | + // etre utilisee dans un contexte d'url qui change |
|
| 292 | + // y compris url arbo |
|
| 293 | + $status = 302; |
|
| 294 | + if (defined('_STATUS_REDIRECTION_VIRTUEL')) { |
|
| 295 | + $status = _STATUS_REDIRECTION_VIRTUEL; |
|
| 296 | + } |
|
| 297 | + if (!preg_match(',^\w+:,', (string) $url)) { |
|
| 298 | + include_spip('inc/filtres_mini'); |
|
| 299 | + $url = url_absolue($url); |
|
| 300 | + } |
|
| 301 | + $url = str_replace('&', '&', (string) $url); |
|
| 302 | + |
|
| 303 | + return [ |
|
| 304 | + 'texte' => '<' |
|
| 305 | + . "?php include_spip('inc/headers');redirige_par_entete('" |
|
| 306 | + . texte_script($url) |
|
| 307 | + . "','',$status);" |
|
| 308 | + . '?' . '>', |
|
| 309 | + 'process_ins' => 'php', |
|
| 310 | + 'status' => $status |
|
| 311 | + ]; |
|
| 312 | + } |
|
| 313 | + } |
|
| 314 | + } |
|
| 315 | + |
|
| 316 | + return false; |
|
| 317 | 317 | } |
@@ -79,7 +79,7 @@ discard block |
||
| 79 | 79 | } else { |
| 80 | 80 | // Preparer l'appel de la fonction principale du squelette |
| 81 | 81 | |
| 82 | - spip_timer($a = 'calcul page ' . random_int(0, 1000)); |
|
| 82 | + spip_timer($a = 'calcul page '.random_int(0, 1000)); |
|
| 83 | 83 | |
| 84 | 84 | // On cree un marqueur de notes unique lie a cette composition |
| 85 | 85 | // et on enregistre l'etat courant des globales de notes... |
@@ -111,8 +111,8 @@ discard block |
||
| 111 | 111 | try { |
| 112 | 112 | $page = $fonc(['cache' => $cache], [$contexte]); |
| 113 | 113 | } catch (Throwable $e) { |
| 114 | - $msg = _T('zbug_erreur_execution_page') . " $sourcefile"; |
|
| 115 | - $full_msg = $msg . ' | File ' . $e->getFile() . ' Line ' . $e->getLine() . ' : ' . $e->getMessage(); |
|
| 114 | + $msg = _T('zbug_erreur_execution_page')." $sourcefile"; |
|
| 115 | + $full_msg = $msg.' | File '.$e->getFile().' Line '.$e->getLine().' : '.$e->getMessage(); |
|
| 116 | 116 | $full_msg = str_replace(_ROOT_RACINE, '[…]/', $full_msg); |
| 117 | 117 | $corps = "<pre>$msg</pre>"; |
| 118 | 118 | $page = analyse_resultat_skel($fond, ['cache' => $cache], $corps, $sourcefile); |
@@ -143,17 +143,17 @@ discard block |
||
| 143 | 143 | |
| 144 | 144 | $profile = spip_timer($a); |
| 145 | 145 | spip_logger()->info("calcul ($profile) [$skel] $infos" |
| 146 | - . ' (' . strlen((string) $page['texte']) . ' octets)'); |
|
| 146 | + . ' ('.strlen((string) $page['texte']).' octets)'); |
|
| 147 | 147 | |
| 148 | 148 | if (defined('_CALCUL_PROFILER') && (int) $profile > _CALCUL_PROFILER) { |
| 149 | 149 | spip_logger('profiler')->notice("calcul ($profile) [$skel] $infos" |
| 150 | - . ' (' . strlen((string) $page['texte']) . ' octets) | ' . $_SERVER['REQUEST_URI']); |
|
| 150 | + . ' ('.strlen((string) $page['texte']).' octets) | '.$_SERVER['REQUEST_URI']); |
|
| 151 | 151 | } |
| 152 | 152 | |
| 153 | 153 | if ($debug) { |
| 154 | 154 | // si c'est ce que demande le debusqueur, lui passer la main |
| 155 | 155 | $t = strlen((string) $page['texte']) ? $page['texte'] : ' '; |
| 156 | - $GLOBALS['debug_objets']['resultat'][$fonc . 'tout'] = $t; |
|
| 156 | + $GLOBALS['debug_objets']['resultat'][$fonc.'tout'] = $t; |
|
| 157 | 157 | $GLOBALS['debug_objets']['courant'] = $courant; |
| 158 | 158 | $GLOBALS['debug_objets']['profile'][$sourcefile] = $profile; |
| 159 | 159 | if ( |
@@ -184,7 +184,7 @@ discard block |
||
| 184 | 184 | if (defined('_VAR_INCLURE') && _VAR_INCLURE) { |
| 185 | 185 | $page['sourcefile'] = $sourcefile; |
| 186 | 186 | $page['texte'] = |
| 187 | - "<div class='inclure_blocs'><h6>" . $page['sourcefile'] . '</h6>' . $page['texte'] . '</div>' |
|
| 187 | + "<div class='inclure_blocs'><h6>".$page['sourcefile'].'</h6>'.$page['texte'].'</div>' |
|
| 188 | 188 | . ($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>"); |
| 189 | 189 | $js_inclus = true; |
| 190 | 190 | } |
@@ -221,14 +221,14 @@ discard block |
||
| 221 | 221 | $val = ''; |
| 222 | 222 | } elseif (is_array($val)) { |
| 223 | 223 | if ($profondeur_max > 0) { |
| 224 | - $val = 'array:' . count($val) . '(' . presenter_contexte($val, $profondeur_max - 1, 3) . ')'; |
|
| 224 | + $val = 'array:'.count($val).'('.presenter_contexte($val, $profondeur_max - 1, 3).')'; |
|
| 225 | 225 | } else { |
| 226 | - $val = 'array:' . count($val); |
|
| 226 | + $val = 'array:'.count($val); |
|
| 227 | 227 | } |
| 228 | 228 | } elseif (is_object($val)) { |
| 229 | 229 | $val = $val::class; |
| 230 | 230 | } elseif (strlen("$val") > 30) { |
| 231 | - $val = substr("$val", 0, 29) . '…'; |
|
| 231 | + $val = substr("$val", 0, 29).'…'; |
|
| 232 | 232 | if (strstr($val, ' ')) { |
| 233 | 233 | $val = "'$val'"; |
| 234 | 234 | } |
@@ -237,7 +237,7 @@ discard block |
||
| 237 | 237 | } elseif (!strlen((string) $val)) { |
| 238 | 238 | $val = "''"; |
| 239 | 239 | } |
| 240 | - $infos[] = $var . '=' . $val; |
|
| 240 | + $infos[] = $var.'='.$val; |
|
| 241 | 241 | } |
| 242 | 242 | return implode(', ', $infos); |
| 243 | 243 | } |
@@ -305,7 +305,7 @@ discard block |
||
| 305 | 305 | . "?php include_spip('inc/headers');redirige_par_entete('" |
| 306 | 306 | . texte_script($url) |
| 307 | 307 | . "','',$status);" |
| 308 | - . '?' . '>', |
|
| 308 | + . '?'.'>', |
|
| 309 | 309 | 'process_ins' => 'php', |
| 310 | 310 | 'status' => $status |
| 311 | 311 | ]; |
@@ -18,7 +18,7 @@ discard block |
||
| 18 | 18 | * @package SPIP\Core\Compilateur\References |
| 19 | 19 | **/ |
| 20 | 20 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 21 | - return; |
|
| 21 | + return; |
|
| 22 | 22 | } |
| 23 | 23 | |
| 24 | 24 | /** |
@@ -43,14 +43,14 @@ discard block |
||
| 43 | 43 | * - '' si une référence explicite incorrecte est envoyée |
| 44 | 44 | */ |
| 45 | 45 | function index_boucle($p) { |
| 46 | - if (strlen($p->nom_boucle)) { |
|
| 47 | - // retourne l’index explicite demandé s’il existe |
|
| 48 | - if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 49 | - return $p->nom_boucle; |
|
| 50 | - } |
|
| 51 | - return ''; |
|
| 52 | - } |
|
| 53 | - return $p->id_boucle; |
|
| 46 | + if (strlen($p->nom_boucle)) { |
|
| 47 | + // retourne l’index explicite demandé s’il existe |
|
| 48 | + if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 49 | + return $p->nom_boucle; |
|
| 50 | + } |
|
| 51 | + return ''; |
|
| 52 | + } |
|
| 53 | + return $p->id_boucle; |
|
| 54 | 54 | } |
| 55 | 55 | |
| 56 | 56 | |
@@ -73,17 +73,17 @@ discard block |
||
| 73 | 73 | * - '' si une référence explicite incorrecte est envoyée |
| 74 | 74 | */ |
| 75 | 75 | function index_boucle_mere($p) { |
| 76 | - if (strlen($p->nom_boucle)) { |
|
| 77 | - // retourne l’index explicite demandé s’il existe |
|
| 78 | - if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 79 | - return $p->nom_boucle; |
|
| 80 | - } |
|
| 81 | - return ''; |
|
| 82 | - } |
|
| 83 | - if (!empty($p->descr['id_mere'])) { |
|
| 84 | - return $p->descr['id_mere']; |
|
| 85 | - } |
|
| 86 | - return ''; |
|
| 76 | + if (strlen($p->nom_boucle)) { |
|
| 77 | + // retourne l’index explicite demandé s’il existe |
|
| 78 | + if (!empty($p->boucles[$p->nom_boucle])) { |
|
| 79 | + return $p->nom_boucle; |
|
| 80 | + } |
|
| 81 | + return ''; |
|
| 82 | + } |
|
| 83 | + if (!empty($p->descr['id_mere'])) { |
|
| 84 | + return $p->descr['id_mere']; |
|
| 85 | + } |
|
| 86 | + return ''; |
|
| 87 | 87 | } |
| 88 | 88 | |
| 89 | 89 | /** |
@@ -117,74 +117,74 @@ discard block |
||
| 117 | 117 | * Code PHP pour obtenir le champ SQL |
| 118 | 118 | */ |
| 119 | 119 | function index_pile( |
| 120 | - $idb, |
|
| 121 | - $nom_champ, |
|
| 122 | - &$boucles, |
|
| 123 | - $explicite = '', |
|
| 124 | - $defaut = null, |
|
| 125 | - $remonte_pile = true, |
|
| 126 | - $select = true |
|
| 120 | + $idb, |
|
| 121 | + $nom_champ, |
|
| 122 | + &$boucles, |
|
| 123 | + $explicite = '', |
|
| 124 | + $defaut = null, |
|
| 125 | + $remonte_pile = true, |
|
| 126 | + $select = true |
|
| 127 | 127 | ) { |
| 128 | - if (!is_string($defaut)) { |
|
| 129 | - $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 130 | - } |
|
| 131 | - |
|
| 132 | - $idb_origine = $idb; |
|
| 133 | - $nom_champ_origine = $nom_champ; |
|
| 134 | - |
|
| 135 | - $i = 0; |
|
| 136 | - if (strlen($explicite)) { |
|
| 137 | - // Recherche d'un champ dans un etage superieur |
|
| 138 | - while (($idb !== $explicite) && ($idb !== '')) { |
|
| 139 | - # spip_logger()->info("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'"); |
|
| 140 | - $i++; |
|
| 141 | - $idb = $boucles[$idb]->id_parent; |
|
| 142 | - } |
|
| 143 | - } |
|
| 144 | - |
|
| 145 | - # spip_logger()->info("Cherche: $nom_champ a partir de '$idb'"); |
|
| 146 | - $nom_champ = strtolower($nom_champ); |
|
| 147 | - $conditionnel = []; |
|
| 148 | - // attention: entre la boucle nommee 0, "" et le tableau vide, |
|
| 149 | - // il y a incoherences qu'il vaut mieux eviter |
|
| 150 | - while (isset($boucles[$idb])) { |
|
| 151 | - $joker = true; |
|
| 152 | - // modifie $joker si tous les champs sont autorisés. |
|
| 153 | - // $t = le select pour le champ, si on l'a trouvé (ou si joker) |
|
| 154 | - // $c = le nom du champ demandé |
|
| 155 | - [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker); |
|
| 156 | - if ($t) { |
|
| 157 | - if ($select && !in_array($t, $boucles[$idb]->select)) { |
|
| 158 | - $boucles[$idb]->select[] = $t; |
|
| 159 | - } |
|
| 160 | - // renseigner la boucle source de ce champ pour les traitements |
|
| 161 | - $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
|
| 162 | - $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 163 | - if (!$joker) { |
|
| 164 | - return index_compose($conditionnel, $champ); |
|
| 165 | - } |
|
| 166 | - |
|
| 167 | - // tant que l'on trouve des tables avec joker, on continue |
|
| 168 | - // avec la boucle parente et on conditionne à l'exécution |
|
| 169 | - // la présence du champ. Si le champ existe à l'exécution |
|
| 170 | - // dans une boucle, il est pris, sinon on le cherche dans le parent... |
|
| 171 | - $conditionnel[] = "isset($champ)?$champ"; |
|
| 172 | - } |
|
| 173 | - |
|
| 174 | - if ($remonte_pile) { |
|
| 175 | - # spip_logger()->info("On remonte vers $i"); |
|
| 176 | - // Sinon on remonte d'un cran |
|
| 177 | - $idb = $boucles[$idb]->id_parent; |
|
| 178 | - $i++; |
|
| 179 | - } else { |
|
| 180 | - $idb = null; |
|
| 181 | - } |
|
| 182 | - } |
|
| 183 | - |
|
| 184 | - # spip_logger()->info("Pas vu $nom_champ"); |
|
| 185 | - // esperons qu'il y sera |
|
| 186 | - // ou qu'on a fourni une valeur par "defaut" plus pertinent |
|
| 187 | - return index_compose($conditionnel, $defaut); |
|
| 128 | + if (!is_string($defaut)) { |
|
| 129 | + $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 130 | + } |
|
| 131 | + |
|
| 132 | + $idb_origine = $idb; |
|
| 133 | + $nom_champ_origine = $nom_champ; |
|
| 134 | + |
|
| 135 | + $i = 0; |
|
| 136 | + if (strlen($explicite)) { |
|
| 137 | + // Recherche d'un champ dans un etage superieur |
|
| 138 | + while (($idb !== $explicite) && ($idb !== '')) { |
|
| 139 | + # spip_logger()->info("Cherchexpl: $nom_champ '$explicite' '$idb' '$i'"); |
|
| 140 | + $i++; |
|
| 141 | + $idb = $boucles[$idb]->id_parent; |
|
| 142 | + } |
|
| 143 | + } |
|
| 144 | + |
|
| 145 | + # spip_logger()->info("Cherche: $nom_champ a partir de '$idb'"); |
|
| 146 | + $nom_champ = strtolower($nom_champ); |
|
| 147 | + $conditionnel = []; |
|
| 148 | + // attention: entre la boucle nommee 0, "" et le tableau vide, |
|
| 149 | + // il y a incoherences qu'il vaut mieux eviter |
|
| 150 | + while (isset($boucles[$idb])) { |
|
| 151 | + $joker = true; |
|
| 152 | + // modifie $joker si tous les champs sont autorisés. |
|
| 153 | + // $t = le select pour le champ, si on l'a trouvé (ou si joker) |
|
| 154 | + // $c = le nom du champ demandé |
|
| 155 | + [$t, $c] = index_tables_en_pile($idb, $nom_champ, $boucles, $joker); |
|
| 156 | + if ($t) { |
|
| 157 | + if ($select && !in_array($t, $boucles[$idb]->select)) { |
|
| 158 | + $boucles[$idb]->select[] = $t; |
|
| 159 | + } |
|
| 160 | + // renseigner la boucle source de ce champ pour les traitements |
|
| 161 | + $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
|
| 162 | + $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 163 | + if (!$joker) { |
|
| 164 | + return index_compose($conditionnel, $champ); |
|
| 165 | + } |
|
| 166 | + |
|
| 167 | + // tant que l'on trouve des tables avec joker, on continue |
|
| 168 | + // avec la boucle parente et on conditionne à l'exécution |
|
| 169 | + // la présence du champ. Si le champ existe à l'exécution |
|
| 170 | + // dans une boucle, il est pris, sinon on le cherche dans le parent... |
|
| 171 | + $conditionnel[] = "isset($champ)?$champ"; |
|
| 172 | + } |
|
| 173 | + |
|
| 174 | + if ($remonte_pile) { |
|
| 175 | + # spip_logger()->info("On remonte vers $i"); |
|
| 176 | + // Sinon on remonte d'un cran |
|
| 177 | + $idb = $boucles[$idb]->id_parent; |
|
| 178 | + $i++; |
|
| 179 | + } else { |
|
| 180 | + $idb = null; |
|
| 181 | + } |
|
| 182 | + } |
|
| 183 | + |
|
| 184 | + # spip_logger()->info("Pas vu $nom_champ"); |
|
| 185 | + // esperons qu'il y sera |
|
| 186 | + // ou qu'on a fourni une valeur par "defaut" plus pertinent |
|
| 187 | + return index_compose($conditionnel, $defaut); |
|
| 188 | 188 | } |
| 189 | 189 | |
| 190 | 190 | /** |
@@ -198,12 +198,12 @@ discard block |
||
| 198 | 198 | * @return string Code PHP complet de recherche d'un champ |
| 199 | 199 | */ |
| 200 | 200 | function index_compose($conditionnel, $defaut) { |
| 201 | - while ($c = array_pop($conditionnel)) { |
|
| 202 | - // si on passe defaut = '', ne pas générer d'erreur de compilation. |
|
| 203 | - $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 204 | - } |
|
| 201 | + while ($c = array_pop($conditionnel)) { |
|
| 202 | + // si on passe defaut = '', ne pas générer d'erreur de compilation. |
|
| 203 | + $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 204 | + } |
|
| 205 | 205 | |
| 206 | - return $defaut; |
|
| 206 | + return $defaut; |
|
| 207 | 207 | } |
| 208 | 208 | |
| 209 | 209 | /** |
@@ -239,98 +239,98 @@ discard block |
||
| 239 | 239 | **/ |
| 240 | 240 | function index_tables_en_pile($idb, $nom_champ, &$boucles, &$joker) { |
| 241 | 241 | |
| 242 | - $r = $boucles[$idb]->type_requete; |
|
| 243 | - // boucle recursive, c'est foutu... |
|
| 244 | - if ($r == TYPE_RECURSIF) { |
|
| 245 | - return []; |
|
| 246 | - } |
|
| 247 | - if (!$r) { |
|
| 248 | - $joker = false; // indiquer a l'appelant |
|
| 249 | - # continuer pour chercher l'erreur suivante |
|
| 250 | - return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 251 | - } |
|
| 252 | - |
|
| 253 | - $desc = $boucles[$idb]->show; |
|
| 254 | - // le nom du champ est il une exception de la table ? un alias ? |
|
| 255 | - $excep = $GLOBALS['exceptions_des_tables'][$r] ?? ''; |
|
| 256 | - if ($excep) { |
|
| 257 | - $excep = $excep[$nom_champ] ?? ''; |
|
| 258 | - } |
|
| 259 | - |
|
| 260 | - // il y a un alias connu pour ce champ |
|
| 261 | - if ($excep) { |
|
| 262 | - $joker = false; // indiquer a l'appelant |
|
| 263 | - return index_exception($boucles[$idb], $desc, $nom_champ, $excep); |
|
| 264 | - } |
|
| 265 | - |
|
| 266 | - // le champ existe dans la table, on le prend. |
|
| 267 | - if (isset($desc['field'][$nom_champ])) { |
|
| 268 | - $t = $boucles[$idb]->id_table ?? ''; |
|
| 269 | - $joker = false; // indiquer a l'appelant |
|
| 270 | - // note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] … |
|
| 271 | - return ["$t.$nom_champ", $nom_champ]; |
|
| 272 | - } |
|
| 273 | - |
|
| 274 | - // Tous les champs sont-ils acceptés ? |
|
| 275 | - // Si oui, on retourne le champ, et on lève le flag joker |
|
| 276 | - // C'est le cas des itérateurs DATA qui acceptent tout |
|
| 277 | - // et testent la présence du champ à l'exécution et non à la compilation |
|
| 278 | - // car ils ne connaissent pas ici leurs contenus. |
|
| 279 | - if ( |
|
| 280 | - /*$joker AND */ |
|
| 281 | - isset($desc['field']['*']) |
|
| 282 | - ) { |
|
| 283 | - $joker = true; // indiquer a l'appelant |
|
| 284 | - return [$nom_champ, $nom_champ]; |
|
| 285 | - } |
|
| 286 | - |
|
| 287 | - $joker = false; // indiquer a l'appelant |
|
| 288 | - |
|
| 289 | - // la table de jointure est explicitement indiquée (rubrique.titre) |
|
| 290 | - if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
|
| 291 | - [, $_table, $_nom_champ] = $r; |
|
| 292 | - if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
|
| 293 | - $_alias = $cle . '_' . $_nom_champ; |
|
| 294 | - return index_exception( |
|
| 295 | - $boucles[$idb], |
|
| 296 | - $desc, |
|
| 297 | - $_alias, |
|
| 298 | - [$_table, $_nom_champ] |
|
| 299 | - ); |
|
| 300 | - } |
|
| 301 | - return ['', '']; |
|
| 302 | - } |
|
| 303 | - |
|
| 304 | - // pas d'alias, pas de champ, pas de joker... |
|
| 305 | - // tenter via une jointure... |
|
| 306 | - |
|
| 307 | - // regarder si le champ est deja dans une jointure existante |
|
| 308 | - // sinon, si il y a des joitures explicites, la construire |
|
| 309 | - if ( |
|
| 310 | - !($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) |
|
| 311 | - && $boucles[$idb]->jointures_explicites |
|
| 312 | - ) { |
|
| 313 | - // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! |
|
| 314 | - // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites |
|
| 315 | - // mais est-ce ce qu'on veut ? |
|
| 316 | - $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites); |
|
| 317 | - if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { |
|
| 318 | - $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); |
|
| 319 | - } |
|
| 320 | - } |
|
| 321 | - |
|
| 322 | - if ($t) { |
|
| 323 | - // si on a trouvé une jointure possible, on fait comme |
|
| 324 | - // si c'était une exception pour le champ demandé |
|
| 325 | - return index_exception( |
|
| 326 | - $boucles[$idb], |
|
| 327 | - $desc, |
|
| 328 | - $nom_champ, |
|
| 329 | - [$t[1]['id_table'], reset($t[2])] |
|
| 330 | - ); |
|
| 331 | - } |
|
| 332 | - |
|
| 333 | - return ['', '']; |
|
| 242 | + $r = $boucles[$idb]->type_requete; |
|
| 243 | + // boucle recursive, c'est foutu... |
|
| 244 | + if ($r == TYPE_RECURSIF) { |
|
| 245 | + return []; |
|
| 246 | + } |
|
| 247 | + if (!$r) { |
|
| 248 | + $joker = false; // indiquer a l'appelant |
|
| 249 | + # continuer pour chercher l'erreur suivante |
|
| 250 | + return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 251 | + } |
|
| 252 | + |
|
| 253 | + $desc = $boucles[$idb]->show; |
|
| 254 | + // le nom du champ est il une exception de la table ? un alias ? |
|
| 255 | + $excep = $GLOBALS['exceptions_des_tables'][$r] ?? ''; |
|
| 256 | + if ($excep) { |
|
| 257 | + $excep = $excep[$nom_champ] ?? ''; |
|
| 258 | + } |
|
| 259 | + |
|
| 260 | + // il y a un alias connu pour ce champ |
|
| 261 | + if ($excep) { |
|
| 262 | + $joker = false; // indiquer a l'appelant |
|
| 263 | + return index_exception($boucles[$idb], $desc, $nom_champ, $excep); |
|
| 264 | + } |
|
| 265 | + |
|
| 266 | + // le champ existe dans la table, on le prend. |
|
| 267 | + if (isset($desc['field'][$nom_champ])) { |
|
| 268 | + $t = $boucles[$idb]->id_table ?? ''; |
|
| 269 | + $joker = false; // indiquer a l'appelant |
|
| 270 | + // note: dans certains cas ('valeur' d’une boucle DATA, sans id_table), retourne ['.valeur', 'valeur'] … |
|
| 271 | + return ["$t.$nom_champ", $nom_champ]; |
|
| 272 | + } |
|
| 273 | + |
|
| 274 | + // Tous les champs sont-ils acceptés ? |
|
| 275 | + // Si oui, on retourne le champ, et on lève le flag joker |
|
| 276 | + // C'est le cas des itérateurs DATA qui acceptent tout |
|
| 277 | + // et testent la présence du champ à l'exécution et non à la compilation |
|
| 278 | + // car ils ne connaissent pas ici leurs contenus. |
|
| 279 | + if ( |
|
| 280 | + /*$joker AND */ |
|
| 281 | + isset($desc['field']['*']) |
|
| 282 | + ) { |
|
| 283 | + $joker = true; // indiquer a l'appelant |
|
| 284 | + return [$nom_champ, $nom_champ]; |
|
| 285 | + } |
|
| 286 | + |
|
| 287 | + $joker = false; // indiquer a l'appelant |
|
| 288 | + |
|
| 289 | + // la table de jointure est explicitement indiquée (rubrique.titre) |
|
| 290 | + if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
|
| 291 | + [, $_table, $_nom_champ] = $r; |
|
| 292 | + if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
|
| 293 | + $_alias = $cle . '_' . $_nom_champ; |
|
| 294 | + return index_exception( |
|
| 295 | + $boucles[$idb], |
|
| 296 | + $desc, |
|
| 297 | + $_alias, |
|
| 298 | + [$_table, $_nom_champ] |
|
| 299 | + ); |
|
| 300 | + } |
|
| 301 | + return ['', '']; |
|
| 302 | + } |
|
| 303 | + |
|
| 304 | + // pas d'alias, pas de champ, pas de joker... |
|
| 305 | + // tenter via une jointure... |
|
| 306 | + |
|
| 307 | + // regarder si le champ est deja dans une jointure existante |
|
| 308 | + // sinon, si il y a des joitures explicites, la construire |
|
| 309 | + if ( |
|
| 310 | + !($t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb])) |
|
| 311 | + && $boucles[$idb]->jointures_explicites |
|
| 312 | + ) { |
|
| 313 | + // [todo] Ne pas lancer que lorsque il y a des jointures explicites !!!! |
|
| 314 | + // fonctionnel, il suffit d'utiliser $boucles[$idb]->jointures au lieu de jointures_explicites |
|
| 315 | + // mais est-ce ce qu'on veut ? |
|
| 316 | + $jointures = preg_split('/\s+/', $boucles[$idb]->jointures_explicites); |
|
| 317 | + if ($cle = trouver_jointure_champ($nom_champ, $boucles[$idb], $jointures)) { |
|
| 318 | + $t = trouver_champ_exterieur($nom_champ, $boucles[$idb]->from, $boucles[$idb]); |
|
| 319 | + } |
|
| 320 | + } |
|
| 321 | + |
|
| 322 | + if ($t) { |
|
| 323 | + // si on a trouvé une jointure possible, on fait comme |
|
| 324 | + // si c'était une exception pour le champ demandé |
|
| 325 | + return index_exception( |
|
| 326 | + $boucles[$idb], |
|
| 327 | + $desc, |
|
| 328 | + $nom_champ, |
|
| 329 | + [$t[1]['id_table'], reset($t[2])] |
|
| 330 | + ); |
|
| 331 | + } |
|
| 332 | + |
|
| 333 | + return ['', '']; |
|
| 334 | 334 | } |
| 335 | 335 | |
| 336 | 336 | |
@@ -358,52 +358,52 @@ discard block |
||
| 358 | 358 | * est une expression pour le SELECT de la boucle du style "mots.titre AS titre_mot" |
| 359 | 359 | **/ |
| 360 | 360 | function index_exception(&$boucle, $desc, $nom_champ, $excep) { |
| 361 | - static $trouver_table; |
|
| 362 | - if (!$trouver_table) { |
|
| 363 | - $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 364 | - } |
|
| 365 | - |
|
| 366 | - if (is_array($excep)) { |
|
| 367 | - // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables |
|
| 368 | - $t = null; |
|
| 369 | - if (count($excep) == 3) { |
|
| 370 | - $index_exception_derogatoire = array_pop($excep); |
|
| 371 | - $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
|
| 372 | - } |
|
| 373 | - if ($t == null) { |
|
| 374 | - [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | - $excep = $x; #PHP5 de droite a gauche ! |
|
| 376 | - $j = $trouver_table($e, $boucle->sql_serveur); |
|
| 377 | - if (!$j) { |
|
| 378 | - return ['', '']; |
|
| 379 | - } |
|
| 380 | - $e = $j['table']; |
|
| 381 | - if (!$t = array_search($e, $boucle->from)) { |
|
| 382 | - $k = $j['key']['PRIMARY KEY']; |
|
| 383 | - if (strpos($k, ',')) { |
|
| 384 | - $l = (preg_split('/\s*,\s*/', $k)); |
|
| 385 | - $k = $desc['key']['PRIMARY KEY']; |
|
| 386 | - if (!in_array($k, $l)) { |
|
| 387 | - spip_logger()->info("jointure impossible $e " . implode(',', $l)); |
|
| 388 | - |
|
| 389 | - return ['', '']; |
|
| 390 | - } |
|
| 391 | - } |
|
| 392 | - $k = [$boucle->id_table, [$e], $k]; |
|
| 393 | - fabrique_jointures($boucle, [$k]); |
|
| 394 | - $t = array_search($e, $boucle->from); |
|
| 395 | - } |
|
| 396 | - } |
|
| 397 | - } else { |
|
| 398 | - $t = $boucle->id_table; |
|
| 399 | - } |
|
| 400 | - // demander a SQL de gerer le synonyme |
|
| 401 | - // ca permet que excep soit dynamique (Cedric, 2/3/06) |
|
| 402 | - if ($excep != $nom_champ) { |
|
| 403 | - $excep .= ' AS ' . $nom_champ; |
|
| 404 | - } |
|
| 405 | - |
|
| 406 | - return ["$t.$excep", $nom_champ]; |
|
| 361 | + static $trouver_table; |
|
| 362 | + if (!$trouver_table) { |
|
| 363 | + $trouver_table = charger_fonction('trouver_table', 'base'); |
|
| 364 | + } |
|
| 365 | + |
|
| 366 | + if (is_array($excep)) { |
|
| 367 | + // permettre aux plugins de gerer eux meme des jointures derogatoire ingerables |
|
| 368 | + $t = null; |
|
| 369 | + if (count($excep) == 3) { |
|
| 370 | + $index_exception_derogatoire = array_pop($excep); |
|
| 371 | + $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
|
| 372 | + } |
|
| 373 | + if ($t == null) { |
|
| 374 | + [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | + $excep = $x; #PHP5 de droite a gauche ! |
|
| 376 | + $j = $trouver_table($e, $boucle->sql_serveur); |
|
| 377 | + if (!$j) { |
|
| 378 | + return ['', '']; |
|
| 379 | + } |
|
| 380 | + $e = $j['table']; |
|
| 381 | + if (!$t = array_search($e, $boucle->from)) { |
|
| 382 | + $k = $j['key']['PRIMARY KEY']; |
|
| 383 | + if (strpos($k, ',')) { |
|
| 384 | + $l = (preg_split('/\s*,\s*/', $k)); |
|
| 385 | + $k = $desc['key']['PRIMARY KEY']; |
|
| 386 | + if (!in_array($k, $l)) { |
|
| 387 | + spip_logger()->info("jointure impossible $e " . implode(',', $l)); |
|
| 388 | + |
|
| 389 | + return ['', '']; |
|
| 390 | + } |
|
| 391 | + } |
|
| 392 | + $k = [$boucle->id_table, [$e], $k]; |
|
| 393 | + fabrique_jointures($boucle, [$k]); |
|
| 394 | + $t = array_search($e, $boucle->from); |
|
| 395 | + } |
|
| 396 | + } |
|
| 397 | + } else { |
|
| 398 | + $t = $boucle->id_table; |
|
| 399 | + } |
|
| 400 | + // demander a SQL de gerer le synonyme |
|
| 401 | + // ca permet que excep soit dynamique (Cedric, 2/3/06) |
|
| 402 | + if ($excep != $nom_champ) { |
|
| 403 | + $excep .= ' AS ' . $nom_champ; |
|
| 404 | + } |
|
| 405 | + |
|
| 406 | + return ["$t.$excep", $nom_champ]; |
|
| 407 | 407 | } |
| 408 | 408 | |
| 409 | 409 | /** |
@@ -428,7 +428,7 @@ discard block |
||
| 428 | 428 | * Code PHP pour retrouver le champ |
| 429 | 429 | */ |
| 430 | 430 | function champ_sql($champ, $p, $defaut = null, $remonte_pile = true) { |
| 431 | - return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile); |
|
| 431 | + return index_pile($p->id_boucle, $champ, $p->boucles, $p->nom_boucle, $defaut, $remonte_pile); |
|
| 432 | 432 | } |
| 433 | 433 | |
| 434 | 434 | |
@@ -448,9 +448,9 @@ discard block |
||
| 448 | 448 | * Code PHP pour d'exécution de la balise et de ses filtres |
| 449 | 449 | **/ |
| 450 | 450 | function calculer_champ($p) { |
| 451 | - $p = calculer_balise($p->nom_champ, $p); |
|
| 451 | + $p = calculer_balise($p->nom_champ, $p); |
|
| 452 | 452 | |
| 453 | - return applique_filtres($p); |
|
| 453 | + return applique_filtres($p); |
|
| 454 | 454 | } |
| 455 | 455 | |
| 456 | 456 | |
@@ -487,26 +487,26 @@ discard block |
||
| 487 | 487 | **/ |
| 488 | 488 | function calculer_balise(string $nom, Champ $p): Champ { |
| 489 | 489 | |
| 490 | - // S'agit-t-il d'une balise_XXXX[_dist]() ? |
|
| 491 | - if ($f = charger_fonction($nom, 'balise', true)) { |
|
| 492 | - $p->balise_calculee = true; |
|
| 493 | - $res = $f($p); |
|
| 494 | - if ($res !== null && is_object($res)) { |
|
| 495 | - return $res; |
|
| 496 | - } |
|
| 497 | - } |
|
| 498 | - |
|
| 499 | - // Certaines des balises comportant un _ sont generiques |
|
| 500 | - if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 501 | - $res = $balise_generique['fonction_generique']($p); |
|
| 502 | - if ($res !== null && is_object($res)) { |
|
| 503 | - return $res; |
|
| 504 | - } |
|
| 505 | - } |
|
| 506 | - |
|
| 507 | - $f = charger_fonction('DEFAUT', 'calculer_balise'); |
|
| 508 | - |
|
| 509 | - return $f($nom, $p); |
|
| 490 | + // S'agit-t-il d'une balise_XXXX[_dist]() ? |
|
| 491 | + if ($f = charger_fonction($nom, 'balise', true)) { |
|
| 492 | + $p->balise_calculee = true; |
|
| 493 | + $res = $f($p); |
|
| 494 | + if ($res !== null && is_object($res)) { |
|
| 495 | + return $res; |
|
| 496 | + } |
|
| 497 | + } |
|
| 498 | + |
|
| 499 | + // Certaines des balises comportant un _ sont generiques |
|
| 500 | + if ($balise_generique = chercher_balise_generique($nom)) { |
|
| 501 | + $res = $balise_generique['fonction_generique']($p); |
|
| 502 | + if ($res !== null && is_object($res)) { |
|
| 503 | + return $res; |
|
| 504 | + } |
|
| 505 | + } |
|
| 506 | + |
|
| 507 | + $f = charger_fonction('DEFAUT', 'calculer_balise'); |
|
| 508 | + |
|
| 509 | + return $f($nom, $p); |
|
| 510 | 510 | } |
| 511 | 511 | |
| 512 | 512 | |
@@ -534,33 +534,33 @@ discard block |
||
| 534 | 534 | **/ |
| 535 | 535 | function calculer_balise_DEFAUT_dist($nom, $p) { |
| 536 | 536 | |
| 537 | - // ca pourrait etre un champ SQL homonyme, |
|
| 538 | - $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle); |
|
| 539 | - |
|
| 540 | - // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 541 | - // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 542 | - if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 543 | - $code = addslashes($p->fonctions[0][1]); |
|
| 544 | - $p->code .= " . '$code'"; |
|
| 545 | - } |
|
| 546 | - |
|
| 547 | - // ne pas passer le filtre securite sur les id_xxx |
|
| 548 | - if (str_starts_with($nom, 'ID_')) { |
|
| 549 | - $p->interdire_scripts = false; |
|
| 550 | - } |
|
| 551 | - |
|
| 552 | - // Compatibilite ascendante avec les couleurs html (#FEFEFE) : |
|
| 553 | - // SI le champ SQL n'est pas trouve |
|
| 554 | - // ET si la balise a une forme de couleur |
|
| 555 | - // ET s'il n'y a ni filtre ni etoile |
|
| 556 | - // ALORS retourner la couleur. |
|
| 557 | - // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)] |
|
| 558 | - if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) { |
|
| 559 | - $p->code = "'#$nom'"; |
|
| 560 | - $p->interdire_scripts = false; |
|
| 561 | - } |
|
| 562 | - |
|
| 563 | - return $p; |
|
| 537 | + // ca pourrait etre un champ SQL homonyme, |
|
| 538 | + $p->code = index_pile($p->id_boucle, $nom, $p->boucles, $p->nom_boucle); |
|
| 539 | + |
|
| 540 | + // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 541 | + // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 542 | + if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 543 | + $code = addslashes($p->fonctions[0][1]); |
|
| 544 | + $p->code .= " . '$code'"; |
|
| 545 | + } |
|
| 546 | + |
|
| 547 | + // ne pas passer le filtre securite sur les id_xxx |
|
| 548 | + if (str_starts_with($nom, 'ID_')) { |
|
| 549 | + $p->interdire_scripts = false; |
|
| 550 | + } |
|
| 551 | + |
|
| 552 | + // Compatibilite ascendante avec les couleurs html (#FEFEFE) : |
|
| 553 | + // SI le champ SQL n'est pas trouve |
|
| 554 | + // ET si la balise a une forme de couleur |
|
| 555 | + // ET s'il n'y a ni filtre ni etoile |
|
| 556 | + // ALORS retourner la couleur. |
|
| 557 | + // Ca permet si l'on veut vraiment de recuperer [(#ACCEDE*)] |
|
| 558 | + if (preg_match('/^[A-F]{1,6}$/i', $nom) && !$p->etoile && !$p->fonctions) { |
|
| 559 | + $p->code = "'#$nom'"; |
|
| 560 | + $p->interdire_scripts = false; |
|
| 561 | + } |
|
| 562 | + |
|
| 563 | + return $p; |
|
| 564 | 564 | } |
| 565 | 565 | |
| 566 | 566 | |
@@ -608,52 +608,52 @@ discard block |
||
| 608 | 608 | **/ |
| 609 | 609 | function calculer_balise_dynamique($p, $nom, $l, $supp = []) { |
| 610 | 610 | |
| 611 | - if (!balise_distante_interdite($p)) { |
|
| 612 | - $p->code = "''"; |
|
| 613 | - |
|
| 614 | - return $p; |
|
| 615 | - } |
|
| 616 | - // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 617 | - // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 618 | - if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 619 | - $p->fonctions = []; |
|
| 620 | - } |
|
| 621 | - |
|
| 622 | - if ($p->param && ($c = $p->param[0])) { |
|
| 623 | - // liste d'arguments commence toujours par la chaine vide |
|
| 624 | - array_shift($c); |
|
| 625 | - // construire la liste d'arguments comme pour un filtre |
|
| 626 | - $param = compose_filtres_args($p, $c, ','); |
|
| 627 | - } else { |
|
| 628 | - $param = ''; |
|
| 629 | - } |
|
| 630 | - $collecte = collecter_balise_dynamique($l, $p, $nom); |
|
| 631 | - |
|
| 632 | - $dans_un_modele = false; |
|
| 633 | - if ( |
|
| 634 | - !empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles' |
|
| 635 | - ) { |
|
| 636 | - $dans_un_modele = true; |
|
| 637 | - } |
|
| 638 | - |
|
| 639 | - // un modele est toujours inséré en texte dans son contenant |
|
| 640 | - // donc si on est dans le public avec un cache on va perdre le dynamisme |
|
| 641 | - // et on risque de mettre en cache les valeurs pre-remplies du formulaire |
|
| 642 | - // on passe donc par une fonction proxy qui si besoin va collecter les arguments |
|
| 643 | - // et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction |
|
| 644 | - // (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)) |
|
| 645 | - $p->code = sprintf( |
|
| 646 | - $dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE, |
|
| 647 | - $nom, |
|
| 648 | - implode(',', $collecte), |
|
| 649 | - ($collecte ? $param : substr($param, 1)), # virer la virgule |
|
| 650 | - memoriser_contexte_compil($p), |
|
| 651 | - ($supp ? ', ' . implode(',', $supp) : ('')) |
|
| 652 | - ); |
|
| 653 | - |
|
| 654 | - $p->interdire_scripts = false; |
|
| 655 | - |
|
| 656 | - return $p; |
|
| 611 | + if (!balise_distante_interdite($p)) { |
|
| 612 | + $p->code = "''"; |
|
| 613 | + |
|
| 614 | + return $p; |
|
| 615 | + } |
|
| 616 | + // compatibilite: depuis qu'on accepte #BALISE{ses_args} sans [(...)] autour |
|
| 617 | + // il faut recracher {...} quand ce n'est finalement pas des args |
|
| 618 | + if ($p->fonctions && !$p->fonctions[0][0] && $p->fonctions[0][1]) { |
|
| 619 | + $p->fonctions = []; |
|
| 620 | + } |
|
| 621 | + |
|
| 622 | + if ($p->param && ($c = $p->param[0])) { |
|
| 623 | + // liste d'arguments commence toujours par la chaine vide |
|
| 624 | + array_shift($c); |
|
| 625 | + // construire la liste d'arguments comme pour un filtre |
|
| 626 | + $param = compose_filtres_args($p, $c, ','); |
|
| 627 | + } else { |
|
| 628 | + $param = ''; |
|
| 629 | + } |
|
| 630 | + $collecte = collecter_balise_dynamique($l, $p, $nom); |
|
| 631 | + |
|
| 632 | + $dans_un_modele = false; |
|
| 633 | + if ( |
|
| 634 | + !empty($p->descr['sourcefile']) && ($f = $p->descr['sourcefile']) && basename(dirname($f)) === 'modeles' |
|
| 635 | + ) { |
|
| 636 | + $dans_un_modele = true; |
|
| 637 | + } |
|
| 638 | + |
|
| 639 | + // un modele est toujours inséré en texte dans son contenant |
|
| 640 | + // donc si on est dans le public avec un cache on va perdre le dynamisme |
|
| 641 | + // et on risque de mettre en cache les valeurs pre-remplies du formulaire |
|
| 642 | + // on passe donc par une fonction proxy qui si besoin va collecter les arguments |
|
| 643 | + // et injecter le PHP qui va appeler la fonction pour generer le formulaire au lieu de directement la fonction |
|
| 644 | + // (dans l'espace prive on a pas de cache, donc pas de soucis (et un leak serait moins grave)) |
|
| 645 | + $p->code = sprintf( |
|
| 646 | + $dans_un_modele ? CODE_EXECUTER_BALISE_MODELE : CODE_EXECUTER_BALISE, |
|
| 647 | + $nom, |
|
| 648 | + implode(',', $collecte), |
|
| 649 | + ($collecte ? $param : substr($param, 1)), # virer la virgule |
|
| 650 | + memoriser_contexte_compil($p), |
|
| 651 | + ($supp ? ', ' . implode(',', $supp) : ('')) |
|
| 652 | + ); |
|
| 653 | + |
|
| 654 | + $p->interdire_scripts = false; |
|
| 655 | + |
|
| 656 | + return $p; |
|
| 657 | 657 | } |
| 658 | 658 | |
| 659 | 659 | |
@@ -683,17 +683,17 @@ discard block |
||
| 683 | 683 | * Liste des codes PHP d'éxecution des balises collectées |
| 684 | 684 | **/ |
| 685 | 685 | function collecter_balise_dynamique(array $l, Champ &$p, string $nom): array { |
| 686 | - $args = []; |
|
| 687 | - foreach ($l as $c) { |
|
| 688 | - if ($c === null) { |
|
| 689 | - $args[] = 'null'; |
|
| 690 | - } else { |
|
| 691 | - $x = calculer_balise($c, $p); |
|
| 692 | - $args[] = $x->code; |
|
| 693 | - } |
|
| 694 | - } |
|
| 695 | - |
|
| 696 | - return $args; |
|
| 686 | + $args = []; |
|
| 687 | + foreach ($l as $c) { |
|
| 688 | + if ($c === null) { |
|
| 689 | + $args[] = 'null'; |
|
| 690 | + } else { |
|
| 691 | + $x = calculer_balise($c, $p); |
|
| 692 | + $args[] = $x->code; |
|
| 693 | + } |
|
| 694 | + } |
|
| 695 | + |
|
| 696 | + return $args; |
|
| 697 | 697 | } |
| 698 | 698 | |
| 699 | 699 | |
@@ -708,19 +708,19 @@ discard block |
||
| 708 | 708 | * Nom de la connexion |
| 709 | 709 | **/ |
| 710 | 710 | function trouver_nom_serveur_distant($p) { |
| 711 | - $nom = $p->id_boucle; |
|
| 712 | - if ( |
|
| 713 | - $nom && isset($p->boucles[$nom]) |
|
| 714 | - ) { |
|
| 715 | - $s = $p->boucles[$nom]->sql_serveur; |
|
| 716 | - if ( |
|
| 717 | - strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect']) |
|
| 718 | - ) { |
|
| 719 | - return $serveur; |
|
| 720 | - } |
|
| 721 | - } |
|
| 722 | - |
|
| 723 | - return ''; |
|
| 711 | + $nom = $p->id_boucle; |
|
| 712 | + if ( |
|
| 713 | + $nom && isset($p->boucles[$nom]) |
|
| 714 | + ) { |
|
| 715 | + $s = $p->boucles[$nom]->sql_serveur; |
|
| 716 | + if ( |
|
| 717 | + strlen($s) && strlen($serveur = strtolower($s)) && !in_array($serveur, $GLOBALS['exception_des_connect']) |
|
| 718 | + ) { |
|
| 719 | + return $serveur; |
|
| 720 | + } |
|
| 721 | + } |
|
| 722 | + |
|
| 723 | + return ''; |
|
| 724 | 724 | } |
| 725 | 725 | |
| 726 | 726 | |
@@ -744,15 +744,15 @@ discard block |
||
| 744 | 744 | * - false : La balise est interdite car le serveur est distant |
| 745 | 745 | **/ |
| 746 | 746 | function balise_distante_interdite($p) { |
| 747 | - $nom = $p->id_boucle; |
|
| 747 | + $nom = $p->id_boucle; |
|
| 748 | 748 | |
| 749 | - if ($nom && trouver_nom_serveur_distant($p)) { |
|
| 750 | - spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 749 | + if ($nom && trouver_nom_serveur_distant($p)) { |
|
| 750 | + spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 751 | 751 | |
| 752 | - return false; |
|
| 753 | - } |
|
| 752 | + return false; |
|
| 753 | + } |
|
| 754 | 754 | |
| 755 | - return true; |
|
| 755 | + return true; |
|
| 756 | 756 | } |
| 757 | 757 | |
| 758 | 758 | |
@@ -762,75 +762,75 @@ discard block |
||
| 762 | 762 | // |
| 763 | 763 | function champs_traitements($p) { |
| 764 | 764 | |
| 765 | - if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) { |
|
| 766 | - $ps = $GLOBALS['table_des_traitements'][$p->nom_champ]; |
|
| 767 | - } else { |
|
| 768 | - // quand on utilise un traitement catch-all * |
|
| 769 | - // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer |
|
| 770 | - // leur propre securite |
|
| 771 | - $ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*']; |
|
| 772 | - } |
|
| 773 | - |
|
| 774 | - if (is_array($ps)) { |
|
| 775 | - // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte |
|
| 776 | - $idb = index_boucle($p); |
|
| 777 | - // si le champ a ete trouve dans une boucle parente sa source est renseignee ici |
|
| 778 | - if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) { |
|
| 779 | - $idb = $p->boucles[$idb]->index_champ[$p->nom_champ]; |
|
| 780 | - } |
|
| 781 | - |
|
| 782 | - // mais on peut aussi etre hors boucle. Se mefier. |
|
| 783 | - $type_requete = $p->boucles[$idb]->type_requete ?? false; |
|
| 784 | - $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false; |
|
| 785 | - |
|
| 786 | - // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.) |
|
| 787 | - if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) { |
|
| 788 | - $type_alias = $type_requete; |
|
| 789 | - $type_requete = $GLOBALS['table_des_tables'][$type_requete]; |
|
| 790 | - } else { |
|
| 791 | - $type_alias = false; |
|
| 792 | - } |
|
| 793 | - |
|
| 794 | - // le traitement peut n'etre defini que pour une table en particulier "spip_articles" |
|
| 795 | - if ($table_sql && isset($ps[$table_sql])) { |
|
| 796 | - $ps = $ps[$table_sql]; |
|
| 797 | - } // ou pour une boucle en particulier "DATA","articles" |
|
| 798 | - elseif ($type_requete && isset($ps[$type_requete])) { |
|
| 799 | - $ps = $ps[$type_requete]; |
|
| 800 | - } // ou pour une boucle utilisant un alias ("hierarchie") |
|
| 801 | - elseif ($type_alias && isset($ps[$type_alias])) { |
|
| 802 | - $ps = $ps[$type_alias]; |
|
| 803 | - } // ou pour indifféremment quelle que soit la boucle |
|
| 804 | - elseif (isset($ps[0])) { |
|
| 805 | - $ps = $ps[0]; |
|
| 806 | - } else { |
|
| 807 | - $ps = false; |
|
| 808 | - } |
|
| 809 | - } |
|
| 810 | - |
|
| 811 | - if (!$ps) { |
|
| 812 | - return $p->code; |
|
| 813 | - } |
|
| 814 | - |
|
| 815 | - // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, |
|
| 816 | - // ou si in INCLURE contient {doublons} |
|
| 817 | - // on insere une fonction de remplissage du tableau des doublons |
|
| 818 | - // dans les filtres propre() ou typo() |
|
| 819 | - // (qui traitent les raccourcis <docXX> referencant les docs) |
|
| 820 | - |
|
| 821 | - if ( |
|
| 822 | - isset($p->descr['documents']) |
|
| 823 | - && $p->descr['documents'] |
|
| 824 | - && (str_contains($ps, 'propre') || str_contains($ps, 'typo')) |
|
| 825 | - ) { |
|
| 826 | - $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 827 | - } |
|
| 828 | - |
|
| 829 | - // La protection des champs par |safehtml est assuree par les extensions |
|
| 830 | - // dans la declaration des traitements des champs sensibles |
|
| 831 | - |
|
| 832 | - // Remplacer enfin le placeholder %s par le vrai code de la balise |
|
| 833 | - return str_replace('%s', $p->code, $ps); |
|
| 765 | + if (isset($GLOBALS['table_des_traitements'][$p->nom_champ])) { |
|
| 766 | + $ps = $GLOBALS['table_des_traitements'][$p->nom_champ]; |
|
| 767 | + } else { |
|
| 768 | + // quand on utilise un traitement catch-all * |
|
| 769 | + // celui-ci ne s'applique pas sur les balises calculees qui peuvent gerer |
|
| 770 | + // leur propre securite |
|
| 771 | + $ps = $p->balise_calculee ? false : $GLOBALS['table_des_traitements']['*']; |
|
| 772 | + } |
|
| 773 | + |
|
| 774 | + if (is_array($ps)) { |
|
| 775 | + // Recuperer le type de boucle (articles, DATA) et la table SQL sur laquelle elle porte |
|
| 776 | + $idb = index_boucle($p); |
|
| 777 | + // si le champ a ete trouve dans une boucle parente sa source est renseignee ici |
|
| 778 | + if (!empty($p->boucles[$idb]->index_champ[$p->nom_champ])) { |
|
| 779 | + $idb = $p->boucles[$idb]->index_champ[$p->nom_champ]; |
|
| 780 | + } |
|
| 781 | + |
|
| 782 | + // mais on peut aussi etre hors boucle. Se mefier. |
|
| 783 | + $type_requete = $p->boucles[$idb]->type_requete ?? false; |
|
| 784 | + $table_sql = $p->boucles[$idb]->show['table_sql'] ?? false; |
|
| 785 | + |
|
| 786 | + // bien prendre en compte les alias de boucles (hierarchie => rubrique, syndication => syncdic, etc.) |
|
| 787 | + if ($type_requete && isset($GLOBALS['table_des_tables'][$type_requete])) { |
|
| 788 | + $type_alias = $type_requete; |
|
| 789 | + $type_requete = $GLOBALS['table_des_tables'][$type_requete]; |
|
| 790 | + } else { |
|
| 791 | + $type_alias = false; |
|
| 792 | + } |
|
| 793 | + |
|
| 794 | + // le traitement peut n'etre defini que pour une table en particulier "spip_articles" |
|
| 795 | + if ($table_sql && isset($ps[$table_sql])) { |
|
| 796 | + $ps = $ps[$table_sql]; |
|
| 797 | + } // ou pour une boucle en particulier "DATA","articles" |
|
| 798 | + elseif ($type_requete && isset($ps[$type_requete])) { |
|
| 799 | + $ps = $ps[$type_requete]; |
|
| 800 | + } // ou pour une boucle utilisant un alias ("hierarchie") |
|
| 801 | + elseif ($type_alias && isset($ps[$type_alias])) { |
|
| 802 | + $ps = $ps[$type_alias]; |
|
| 803 | + } // ou pour indifféremment quelle que soit la boucle |
|
| 804 | + elseif (isset($ps[0])) { |
|
| 805 | + $ps = $ps[0]; |
|
| 806 | + } else { |
|
| 807 | + $ps = false; |
|
| 808 | + } |
|
| 809 | + } |
|
| 810 | + |
|
| 811 | + if (!$ps) { |
|
| 812 | + return $p->code; |
|
| 813 | + } |
|
| 814 | + |
|
| 815 | + // Si une boucle DOCUMENTS{doublons} est presente dans le squelette, |
|
| 816 | + // ou si in INCLURE contient {doublons} |
|
| 817 | + // on insere une fonction de remplissage du tableau des doublons |
|
| 818 | + // dans les filtres propre() ou typo() |
|
| 819 | + // (qui traitent les raccourcis <docXX> referencant les docs) |
|
| 820 | + |
|
| 821 | + if ( |
|
| 822 | + isset($p->descr['documents']) |
|
| 823 | + && $p->descr['documents'] |
|
| 824 | + && (str_contains($ps, 'propre') || str_contains($ps, 'typo')) |
|
| 825 | + ) { |
|
| 826 | + $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 827 | + } |
|
| 828 | + |
|
| 829 | + // La protection des champs par |safehtml est assuree par les extensions |
|
| 830 | + // dans la declaration des traitements des champs sensibles |
|
| 831 | + |
|
| 832 | + // Remplacer enfin le placeholder %s par le vrai code de la balise |
|
| 833 | + return str_replace('%s', $p->code, $ps); |
|
| 834 | 834 | } |
| 835 | 835 | |
| 836 | 836 | |
@@ -842,95 +842,95 @@ discard block |
||
| 842 | 842 | // |
| 843 | 843 | function applique_filtres($p) { |
| 844 | 844 | |
| 845 | - // Traitements standards (cf. supra) |
|
| 846 | - $code = $p->etoile == '' ? champs_traitements($p) : $p->code; |
|
| 845 | + // Traitements standards (cf. supra) |
|
| 846 | + $code = $p->etoile == '' ? champs_traitements($p) : $p->code; |
|
| 847 | 847 | |
| 848 | - // Appliquer les filtres perso |
|
| 849 | - if ($p->param) { |
|
| 850 | - $code = compose_filtres($p, $code); |
|
| 851 | - } |
|
| 848 | + // Appliquer les filtres perso |
|
| 849 | + if ($p->param) { |
|
| 850 | + $code = compose_filtres($p, $code); |
|
| 851 | + } |
|
| 852 | 852 | |
| 853 | - // S'il y a un lien avec la session, ajouter un code qui levera |
|
| 854 | - // un drapeau dans la structure d'invalidation $Cache |
|
| 855 | - if (isset($p->descr['session'])) { |
|
| 856 | - $code = "invalideur_session(\$Cache, $code)"; |
|
| 857 | - } |
|
| 853 | + // S'il y a un lien avec la session, ajouter un code qui levera |
|
| 854 | + // un drapeau dans la structure d'invalidation $Cache |
|
| 855 | + if (isset($p->descr['session'])) { |
|
| 856 | + $code = "invalideur_session(\$Cache, $code)"; |
|
| 857 | + } |
|
| 858 | 858 | |
| 859 | - return sandbox_composer_interdire_scripts($code, $p); |
|
| 859 | + return sandbox_composer_interdire_scripts($code, $p); |
|
| 860 | 860 | } |
| 861 | 861 | |
| 862 | 862 | // Cf. function pipeline dans ecrire/inc_utils.php |
| 863 | 863 | function compose_filtres(&$p, $code) { |
| 864 | 864 | |
| 865 | - $image_miette = false; |
|
| 866 | - foreach ($p->param as $filtre) { |
|
| 867 | - $fonc = array_shift($filtre); |
|
| 868 | - if (!$fonc) { |
|
| 869 | - continue; |
|
| 870 | - } // normalement qu'au premier tour. |
|
| 871 | - $is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver'); |
|
| 872 | - if ($image_miette && !$is_filtre_image) { |
|
| 873 | - // il faut graver maintenant car apres le filtre en cours |
|
| 874 | - // on est pas sur d'avoir encore le nom du fichier dans le pipe |
|
| 875 | - $code = "filtrer('image_graver', $code)"; |
|
| 876 | - $image_miette = false; |
|
| 877 | - } |
|
| 878 | - |
|
| 879 | - // recuperer les arguments du filtre, |
|
| 880 | - // a separer par "," ou ":" dans le cas du filtre "?{a,b}" |
|
| 881 | - $countfiltre = is_countable($filtre) ? count($filtre) : 0; |
|
| 882 | - if ($fonc !== '?') { |
|
| 883 | - $sep = ','; |
|
| 884 | - } else { |
|
| 885 | - $sep = ':'; |
|
| 886 | - // |?{a,b} *doit* avoir exactement 2 arguments ; on les force |
|
| 887 | - if ($countfiltre != 2) { |
|
| 888 | - $filtre = [$filtre[0] ?? '', $filtre[1] ?? '']; |
|
| 889 | - $countfiltre = 2; |
|
| 890 | - } |
|
| 891 | - } |
|
| 892 | - $arglist = compose_filtres_args($p, $filtre, $sep); |
|
| 893 | - $logique = filtre_logique($fonc, $code, substr($arglist, 1)); |
|
| 894 | - if ($logique) { |
|
| 895 | - $code = $logique; |
|
| 896 | - } else { |
|
| 897 | - $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre); |
|
| 898 | - if ($is_filtre_image) { |
|
| 899 | - $image_miette = true; |
|
| 900 | - } |
|
| 901 | - } |
|
| 902 | - } |
|
| 903 | - // ramasser les images intermediaires inutiles et graver l'image finale |
|
| 904 | - if ($image_miette) { |
|
| 905 | - $code = "filtrer('image_graver',$code)"; |
|
| 906 | - } |
|
| 907 | - |
|
| 908 | - return $code; |
|
| 865 | + $image_miette = false; |
|
| 866 | + foreach ($p->param as $filtre) { |
|
| 867 | + $fonc = array_shift($filtre); |
|
| 868 | + if (!$fonc) { |
|
| 869 | + continue; |
|
| 870 | + } // normalement qu'au premier tour. |
|
| 871 | + $is_filtre_image = (str_starts_with($fonc, 'image_') && $fonc != 'image_graver'); |
|
| 872 | + if ($image_miette && !$is_filtre_image) { |
|
| 873 | + // il faut graver maintenant car apres le filtre en cours |
|
| 874 | + // on est pas sur d'avoir encore le nom du fichier dans le pipe |
|
| 875 | + $code = "filtrer('image_graver', $code)"; |
|
| 876 | + $image_miette = false; |
|
| 877 | + } |
|
| 878 | + |
|
| 879 | + // recuperer les arguments du filtre, |
|
| 880 | + // a separer par "," ou ":" dans le cas du filtre "?{a,b}" |
|
| 881 | + $countfiltre = is_countable($filtre) ? count($filtre) : 0; |
|
| 882 | + if ($fonc !== '?') { |
|
| 883 | + $sep = ','; |
|
| 884 | + } else { |
|
| 885 | + $sep = ':'; |
|
| 886 | + // |?{a,b} *doit* avoir exactement 2 arguments ; on les force |
|
| 887 | + if ($countfiltre != 2) { |
|
| 888 | + $filtre = [$filtre[0] ?? '', $filtre[1] ?? '']; |
|
| 889 | + $countfiltre = 2; |
|
| 890 | + } |
|
| 891 | + } |
|
| 892 | + $arglist = compose_filtres_args($p, $filtre, $sep); |
|
| 893 | + $logique = filtre_logique($fonc, $code, substr($arglist, 1)); |
|
| 894 | + if ($logique) { |
|
| 895 | + $code = $logique; |
|
| 896 | + } else { |
|
| 897 | + $code = sandbox_composer_filtre($fonc, $code, $arglist, $p, $countfiltre); |
|
| 898 | + if ($is_filtre_image) { |
|
| 899 | + $image_miette = true; |
|
| 900 | + } |
|
| 901 | + } |
|
| 902 | + } |
|
| 903 | + // ramasser les images intermediaires inutiles et graver l'image finale |
|
| 904 | + if ($image_miette) { |
|
| 905 | + $code = "filtrer('image_graver',$code)"; |
|
| 906 | + } |
|
| 907 | + |
|
| 908 | + return $code; |
|
| 909 | 909 | } |
| 910 | 910 | |
| 911 | 911 | // Filtres et,ou,oui,non,sinon,xou,xor,and,or,not,yes |
| 912 | 912 | // et comparateurs |
| 913 | 913 | function filtre_logique($fonc, $code, $arg) { |
| 914 | - return match (true) { |
|
| 915 | - in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)", |
|
| 916 | - $fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')", |
|
| 917 | - $fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')", |
|
| 918 | - $fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')", |
|
| 919 | - $fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)", |
|
| 920 | - $fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')", |
|
| 921 | - $fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')", |
|
| 922 | - default => '', |
|
| 923 | - }; |
|
| 914 | + return match (true) { |
|
| 915 | + in_array($fonc, $GLOBALS['table_criteres_infixes']) => "($code $fonc $arg)", |
|
| 916 | + $fonc == 'and' || $fonc == 'et' => "((($code) AND ($arg)) ?' ' :'')", |
|
| 917 | + $fonc == 'or' || $fonc == 'ou' => "((($code) OR ($arg)) ?' ' :'')", |
|
| 918 | + $fonc == 'xor' || $fonc == 'xou' => "((($code) XOR ($arg)) ?' ' :'')", |
|
| 919 | + $fonc == 'sinon' => "(((\$a = $code) OR (is_string(\$a) AND strlen(\$a))) ? \$a : $arg)", |
|
| 920 | + $fonc == 'not' || $fonc == 'non' => "(($code) ?'' :' ')", |
|
| 921 | + $fonc == 'yes' || $fonc == 'oui' => "(($code) ?' ' :'')", |
|
| 922 | + default => '', |
|
| 923 | + }; |
|
| 924 | 924 | } |
| 925 | 925 | |
| 926 | 926 | function compose_filtres_args($p, $args, $sep) { |
| 927 | - $arglist = ''; |
|
| 928 | - foreach ($args as $arg) { |
|
| 929 | - $arglist .= $sep . |
|
| 930 | - calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
|
| 931 | - } |
|
| 927 | + $arglist = ''; |
|
| 928 | + foreach ($args as $arg) { |
|
| 929 | + $arglist .= $sep . |
|
| 930 | + calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
|
| 931 | + } |
|
| 932 | 932 | |
| 933 | - return $arglist; |
|
| 933 | + return $arglist; |
|
| 934 | 934 | } |
| 935 | 935 | |
| 936 | 936 | |
@@ -948,15 +948,15 @@ discard block |
||
| 948 | 948 | **/ |
| 949 | 949 | function calculer_argument_precedent($idb, $nom_champ, &$boucles, $defaut = null) { |
| 950 | 950 | |
| 951 | - // si recursif, forcer l'extraction du champ SQL mais ignorer le code |
|
| 952 | - if ($boucles[$idb]->externe) { |
|
| 953 | - index_pile($idb, $nom_champ, $boucles, '', $defaut); |
|
| 954 | - // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle |
|
| 955 | - // on ignore le defaut fourni dans ce cas |
|
| 956 | - $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)"; |
|
| 957 | - } |
|
| 951 | + // si recursif, forcer l'extraction du champ SQL mais ignorer le code |
|
| 952 | + if ($boucles[$idb]->externe) { |
|
| 953 | + index_pile($idb, $nom_champ, $boucles, '', $defaut); |
|
| 954 | + // retourner $Pile[$SP] et pas $Pile[0] si recursion en 1ere boucle |
|
| 955 | + // on ignore le defaut fourni dans ce cas |
|
| 956 | + $defaut = "(\$Pile[\$SP]['$nom_champ'] ?? null)"; |
|
| 957 | + } |
|
| 958 | 958 | |
| 959 | - return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut); |
|
| 959 | + return index_pile($boucles[$idb]->id_parent, $nom_champ, $boucles, '', $defaut); |
|
| 960 | 960 | } |
| 961 | 961 | |
| 962 | 962 | // |
@@ -970,30 +970,30 @@ discard block |
||
| 970 | 970 | // |
| 971 | 971 | |
| 972 | 972 | function rindex_pile($p, $champ, $motif) { |
| 973 | - $n = 0; |
|
| 974 | - $b = $p->id_boucle; |
|
| 975 | - $p->code = ''; |
|
| 976 | - while ($b != '') { |
|
| 977 | - foreach ($p->boucles[$b]->criteres as $critere) { |
|
| 978 | - if ($critere->op == $motif) { |
|
| 979 | - $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 980 | - "]['$champ']"; |
|
| 981 | - $b = ''; |
|
| 982 | - break 2; |
|
| 983 | - } |
|
| 984 | - } |
|
| 985 | - $n++; |
|
| 986 | - $b = $p->boucles[$b]->id_parent; |
|
| 987 | - } |
|
| 988 | - |
|
| 989 | - // si on est hors d'une boucle de {recherche}, cette balise est vide |
|
| 990 | - if (!$p->code) { |
|
| 991 | - $p->code = "''"; |
|
| 992 | - } |
|
| 993 | - |
|
| 994 | - $p->interdire_scripts = false; |
|
| 995 | - |
|
| 996 | - return $p; |
|
| 973 | + $n = 0; |
|
| 974 | + $b = $p->id_boucle; |
|
| 975 | + $p->code = ''; |
|
| 976 | + while ($b != '') { |
|
| 977 | + foreach ($p->boucles[$b]->criteres as $critere) { |
|
| 978 | + if ($critere->op == $motif) { |
|
| 979 | + $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 980 | + "]['$champ']"; |
|
| 981 | + $b = ''; |
|
| 982 | + break 2; |
|
| 983 | + } |
|
| 984 | + } |
|
| 985 | + $n++; |
|
| 986 | + $b = $p->boucles[$b]->id_parent; |
|
| 987 | + } |
|
| 988 | + |
|
| 989 | + // si on est hors d'une boucle de {recherche}, cette balise est vide |
|
| 990 | + if (!$p->code) { |
|
| 991 | + $p->code = "''"; |
|
| 992 | + } |
|
| 993 | + |
|
| 994 | + $p->interdire_scripts = false; |
|
| 995 | + |
|
| 996 | + return $p; |
|
| 997 | 997 | } |
| 998 | 998 | |
| 999 | 999 | /** |
@@ -1003,7 +1003,7 @@ discard block |
||
| 1003 | 1003 | * @return string Nom de la balise, avec indication de boucle explicite si présent. |
| 1004 | 1004 | */ |
| 1005 | 1005 | function zbug_presenter_champ($p, $champ = '') { |
| 1006 | - $balise = $champ ?: $p->nom_champ; |
|
| 1007 | - $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1008 | - return "#{$explicite}{$balise}"; |
|
| 1006 | + $balise = $champ ?: $p->nom_champ; |
|
| 1007 | + $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1008 | + return "#{$explicite}{$balise}"; |
|
| 1009 | 1009 | } |
@@ -126,7 +126,7 @@ discard block |
||
| 126 | 126 | $select = true |
| 127 | 127 | ) { |
| 128 | 128 | if (!is_string($defaut)) { |
| 129 | - $defaut = '($Pile[0][\'' . strtolower($nom_champ) . '\'] ?? null)'; |
|
| 129 | + $defaut = '($Pile[0][\''.strtolower($nom_champ).'\'] ?? null)'; |
|
| 130 | 130 | } |
| 131 | 131 | |
| 132 | 132 | $idb_origine = $idb; |
@@ -159,7 +159,7 @@ discard block |
||
| 159 | 159 | } |
| 160 | 160 | // renseigner la boucle source de ce champ pour les traitements |
| 161 | 161 | $boucles[$idb_origine]->index_champ[$nom_champ_origine] = $idb; |
| 162 | - $champ = '$Pile[$SP' . ($i ? "-$i" : '') . '][\'' . $c . '\']'; |
|
| 162 | + $champ = '$Pile[$SP'.($i ? "-$i" : '').'][\''.$c.'\']'; |
|
| 163 | 163 | if (!$joker) { |
| 164 | 164 | return index_compose($conditionnel, $champ); |
| 165 | 165 | } |
@@ -200,7 +200,7 @@ discard block |
||
| 200 | 200 | function index_compose($conditionnel, $defaut) { |
| 201 | 201 | while ($c = array_pop($conditionnel)) { |
| 202 | 202 | // si on passe defaut = '', ne pas générer d'erreur de compilation. |
| 203 | - $defaut = "($c:(" . ($defaut ?: "''") . '))'; |
|
| 203 | + $defaut = "($c:(".($defaut ?: "''").'))'; |
|
| 204 | 204 | } |
| 205 | 205 | |
| 206 | 206 | return $defaut; |
@@ -247,7 +247,7 @@ discard block |
||
| 247 | 247 | if (!$r) { |
| 248 | 248 | $joker = false; // indiquer a l'appelant |
| 249 | 249 | # continuer pour chercher l'erreur suivante |
| 250 | - return ["'#" . $r . ':' . $nom_champ . "'", '']; |
|
| 250 | + return ["'#".$r.':'.$nom_champ."'", '']; |
|
| 251 | 251 | } |
| 252 | 252 | |
| 253 | 253 | $desc = $boucles[$idb]->show; |
@@ -290,7 +290,7 @@ discard block |
||
| 290 | 290 | if (preg_match('/^(.*)\.(.*)$/', $nom_champ, $r)) { |
| 291 | 291 | [, $_table, $_nom_champ] = $r; |
| 292 | 292 | if ($cle = trouver_jointure_champ($_nom_champ, $boucles[$idb], [$_table])) { |
| 293 | - $_alias = $cle . '_' . $_nom_champ; |
|
| 293 | + $_alias = $cle.'_'.$_nom_champ; |
|
| 294 | 294 | return index_exception( |
| 295 | 295 | $boucles[$idb], |
| 296 | 296 | $desc, |
@@ -371,8 +371,8 @@ discard block |
||
| 371 | 371 | $t = $index_exception_derogatoire($boucle, $desc, $nom_champ, $excep); |
| 372 | 372 | } |
| 373 | 373 | if ($t == null) { |
| 374 | - [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | - $excep = $x; #PHP5 de droite a gauche ! |
|
| 374 | + [$e, $x] = $excep; #PHP4 affecte de gauche a droite |
|
| 375 | + $excep = $x; #PHP5 de droite a gauche ! |
|
| 376 | 376 | $j = $trouver_table($e, $boucle->sql_serveur); |
| 377 | 377 | if (!$j) { |
| 378 | 378 | return ['', '']; |
@@ -384,7 +384,7 @@ discard block |
||
| 384 | 384 | $l = (preg_split('/\s*,\s*/', $k)); |
| 385 | 385 | $k = $desc['key']['PRIMARY KEY']; |
| 386 | 386 | if (!in_array($k, $l)) { |
| 387 | - spip_logger()->info("jointure impossible $e " . implode(',', $l)); |
|
| 387 | + spip_logger()->info("jointure impossible $e ".implode(',', $l)); |
|
| 388 | 388 | |
| 389 | 389 | return ['', '']; |
| 390 | 390 | } |
@@ -400,7 +400,7 @@ discard block |
||
| 400 | 400 | // demander a SQL de gerer le synonyme |
| 401 | 401 | // ca permet que excep soit dynamique (Cedric, 2/3/06) |
| 402 | 402 | if ($excep != $nom_champ) { |
| 403 | - $excep .= ' AS ' . $nom_champ; |
|
| 403 | + $excep .= ' AS '.$nom_champ; |
|
| 404 | 404 | } |
| 405 | 405 | |
| 406 | 406 | return ["$t.$excep", $nom_champ]; |
@@ -648,7 +648,7 @@ discard block |
||
| 648 | 648 | implode(',', $collecte), |
| 649 | 649 | ($collecte ? $param : substr($param, 1)), # virer la virgule |
| 650 | 650 | memoriser_contexte_compil($p), |
| 651 | - ($supp ? ', ' . implode(',', $supp) : ('')) |
|
| 651 | + ($supp ? ', '.implode(',', $supp) : ('')) |
|
| 652 | 652 | ); |
| 653 | 653 | |
| 654 | 654 | $p->interdire_scripts = false; |
@@ -682,7 +682,7 @@ discard block |
||
| 682 | 682 | * @return array |
| 683 | 683 | * Liste des codes PHP d'éxecution des balises collectées |
| 684 | 684 | **/ |
| 685 | -function collecter_balise_dynamique(array $l, Champ &$p, string $nom): array { |
|
| 685 | +function collecter_balise_dynamique(array $l, Champ & $p, string $nom): array { |
|
| 686 | 686 | $args = []; |
| 687 | 687 | foreach ($l as $c) { |
| 688 | 688 | if ($c === null) { |
@@ -747,7 +747,7 @@ discard block |
||
| 747 | 747 | $nom = $p->id_boucle; |
| 748 | 748 | |
| 749 | 749 | if ($nom && trouver_nom_serveur_distant($p)) { |
| 750 | - spip_logger()->info($nom . ':' . $p->nom_champ . ' ' . _T('zbug_distant_interdit')); |
|
| 750 | + spip_logger()->info($nom.':'.$p->nom_champ.' '._T('zbug_distant_interdit')); |
|
| 751 | 751 | |
| 752 | 752 | return false; |
| 753 | 753 | } |
@@ -823,7 +823,7 @@ discard block |
||
| 823 | 823 | && $p->descr['documents'] |
| 824 | 824 | && (str_contains($ps, 'propre') || str_contains($ps, 'typo')) |
| 825 | 825 | ) { |
| 826 | - $ps = 'traiter_doublons_documents($doublons, ' . $ps . ')'; |
|
| 826 | + $ps = 'traiter_doublons_documents($doublons, '.$ps.')'; |
|
| 827 | 827 | } |
| 828 | 828 | |
| 829 | 829 | // La protection des champs par |safehtml est assuree par les extensions |
@@ -926,7 +926,7 @@ discard block |
||
| 926 | 926 | function compose_filtres_args($p, $args, $sep) { |
| 927 | 927 | $arglist = ''; |
| 928 | 928 | foreach ($args as $arg) { |
| 929 | - $arglist .= $sep . |
|
| 929 | + $arglist .= $sep. |
|
| 930 | 930 | calculer_liste($arg, $p->descr, $p->boucles, $p->id_boucle); |
| 931 | 931 | } |
| 932 | 932 | |
@@ -976,7 +976,7 @@ discard block |
||
| 976 | 976 | while ($b != '') { |
| 977 | 977 | foreach ($p->boucles[$b]->criteres as $critere) { |
| 978 | 978 | if ($critere->op == $motif) { |
| 979 | - $p->code = '$Pile[$SP' . (($n == 0) ? '' : "-$n") . |
|
| 979 | + $p->code = '$Pile[$SP'.(($n == 0) ? '' : "-$n"). |
|
| 980 | 980 | "]['$champ']"; |
| 981 | 981 | $b = ''; |
| 982 | 982 | break 2; |
@@ -1004,6 +1004,6 @@ discard block |
||
| 1004 | 1004 | */ |
| 1005 | 1005 | function zbug_presenter_champ($p, $champ = '') { |
| 1006 | 1006 | $balise = $champ ?: $p->nom_champ; |
| 1007 | - $explicite = $p->nom_boucle ? $p->nom_boucle . ':' : ''; |
|
| 1007 | + $explicite = $p->nom_boucle ? $p->nom_boucle.':' : ''; |
|
| 1008 | 1008 | return "#{$explicite}{$balise}"; |
| 1009 | 1009 | } |
@@ -13,15 +13,15 @@ discard block |
||
| 13 | 13 | \***************************************************************************/ |
| 14 | 14 | |
| 15 | 15 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 16 | - return; |
|
| 16 | + return; |
|
| 17 | 17 | } |
| 18 | 18 | |
| 19 | 19 | function phraser_vieux_modele($p) { |
| 20 | - normaliser_args_inclumodel($p); |
|
| 20 | + normaliser_args_inclumodel($p); |
|
| 21 | 21 | } |
| 22 | 22 | |
| 23 | 23 | function phraser_vieux_inclu($p) { |
| 24 | - normaliser_args_inclumodel($p); |
|
| 24 | + normaliser_args_inclumodel($p); |
|
| 25 | 25 | } |
| 26 | 26 | |
| 27 | 27 | /** |
@@ -32,24 +32,24 @@ discard block |
||
| 32 | 32 | * @return void |
| 33 | 33 | */ |
| 34 | 34 | function normaliser_args_inclumodel($p) { |
| 35 | - $params = $p->param; |
|
| 36 | - if (!$params) { |
|
| 37 | - return; |
|
| 38 | - } |
|
| 39 | - $args = $params[0]; |
|
| 40 | - if ($args[0]) { |
|
| 41 | - return; |
|
| 42 | - } // filtre immediat |
|
| 43 | - array_shift($p->param); |
|
| 44 | - foreach ($p->param as $l) { |
|
| 45 | - if (!array_shift($l)) { |
|
| 46 | - $args = array_merge($args, $l); |
|
| 47 | - array_shift($p->param); |
|
| 48 | - } else { |
|
| 49 | - break; |
|
| 50 | - } // filtre |
|
| 51 | - } |
|
| 52 | - array_unshift($p->param, $args); |
|
| 35 | + $params = $p->param; |
|
| 36 | + if (!$params) { |
|
| 37 | + return; |
|
| 38 | + } |
|
| 39 | + $args = $params[0]; |
|
| 40 | + if ($args[0]) { |
|
| 41 | + return; |
|
| 42 | + } // filtre immediat |
|
| 43 | + array_shift($p->param); |
|
| 44 | + foreach ($p->param as $l) { |
|
| 45 | + if (!array_shift($l)) { |
|
| 46 | + $args = array_merge($args, $l); |
|
| 47 | + array_shift($p->param); |
|
| 48 | + } else { |
|
| 49 | + break; |
|
| 50 | + } // filtre |
|
| 51 | + } |
|
| 52 | + array_unshift($p->param, $args); |
|
| 53 | 53 | } |
| 54 | 54 | |
| 55 | 55 | |
@@ -59,35 +59,35 @@ discard block |
||
| 59 | 59 | * @return void |
| 60 | 60 | */ |
| 61 | 61 | function normaliser_inclure($champ) { |
| 62 | - normaliser_args_inclumodel($champ); |
|
| 63 | - $l = $champ->param[0]; |
|
| 64 | - if (is_array($l) && !$l[0]) { |
|
| 65 | - foreach ($l as $k => $p) { |
|
| 66 | - if ($p && $p[0]->type == 'texte' && !strpos((string) $p[0]->texte, '=')) { |
|
| 67 | - $p[0]->texte = trim((string) $p[0]->texte); |
|
| 68 | - } |
|
| 69 | - } |
|
| 70 | - foreach ($l as $k => $p) { |
|
| 71 | - if ( |
|
| 72 | - !$p || $p[0]->type != 'texte' |
|
| 73 | - || !preg_match('/^fond\s*=\s*(.*)$/', (string) $p[0]->texte, $r) |
|
| 74 | - ) { |
|
| 75 | - continue; |
|
| 76 | - } |
|
| 62 | + normaliser_args_inclumodel($champ); |
|
| 63 | + $l = $champ->param[0]; |
|
| 64 | + if (is_array($l) && !$l[0]) { |
|
| 65 | + foreach ($l as $k => $p) { |
|
| 66 | + if ($p && $p[0]->type == 'texte' && !strpos((string) $p[0]->texte, '=')) { |
|
| 67 | + $p[0]->texte = trim((string) $p[0]->texte); |
|
| 68 | + } |
|
| 69 | + } |
|
| 70 | + foreach ($l as $k => $p) { |
|
| 71 | + if ( |
|
| 72 | + !$p || $p[0]->type != 'texte' |
|
| 73 | + || !preg_match('/^fond\s*=\s*(.*)$/', (string) $p[0]->texte, $r) |
|
| 74 | + ) { |
|
| 75 | + continue; |
|
| 76 | + } |
|
| 77 | 77 | |
| 78 | - if ($r[1]) { |
|
| 79 | - $p[0]->texte = $r[1]; |
|
| 80 | - } else { |
|
| 81 | - unset($p[0]); |
|
| 82 | - } |
|
| 83 | - $champ->texte = $p; |
|
| 84 | - unset($champ->param[0][$k]); |
|
| 85 | - if ((is_countable($champ->param[0]) ? count($champ->param[0]) : 0) == 1) { |
|
| 86 | - array_shift($champ->param); |
|
| 87 | - } |
|
| 78 | + if ($r[1]) { |
|
| 79 | + $p[0]->texte = $r[1]; |
|
| 80 | + } else { |
|
| 81 | + unset($p[0]); |
|
| 82 | + } |
|
| 83 | + $champ->texte = $p; |
|
| 84 | + unset($champ->param[0][$k]); |
|
| 85 | + if ((is_countable($champ->param[0]) ? count($champ->param[0]) : 0) == 1) { |
|
| 86 | + array_shift($champ->param); |
|
| 87 | + } |
|
| 88 | 88 | |
| 89 | - return; |
|
| 90 | - } |
|
| 91 | - } |
|
| 92 | - spip_logger('vieilles_def')->info('inclure sans fond ni fichier'); |
|
| 89 | + return; |
|
| 90 | + } |
|
| 91 | + } |
|
| 92 | + spip_logger('vieilles_def')->info('inclure sans fond ni fichier'); |
|
| 93 | 93 | } |
@@ -14,7 +14,7 @@ discard block |
||
| 14 | 14 | use Spip\Component\Hasher\Hash32; |
| 15 | 15 | |
| 16 | 16 | if (!defined('_ECRIRE_INC_VERSION')) { |
| 17 | - return; |
|
| 17 | + return; |
|
| 18 | 18 | } |
| 19 | 19 | |
| 20 | 20 | /** |
@@ -23,24 +23,24 @@ discard block |
||
| 23 | 23 | * @internal Temporary fonction until DI in SPIP |
| 24 | 24 | */ |
| 25 | 25 | function cache_instance(): CacheInterface { |
| 26 | - static $cache = null; |
|
| 27 | - return $cache ??= new LimitedFilesystem('calcul', _DIR_CACHE); |
|
| 26 | + static $cache = null; |
|
| 27 | + return $cache ??= new LimitedFilesystem('calcul', _DIR_CACHE); |
|
| 28 | 28 | } |
| 29 | 29 | |
| 30 | 30 | /** |
| 31 | 31 | * Returns a key cache (id) for this data |
| 32 | 32 | */ |
| 33 | 33 | function cache_key(array $contexte, array $page): string { |
| 34 | - static $hasher = null; |
|
| 35 | - $hasher ??= new Hash32(); |
|
| 36 | - return $hasher->hash([$contexte, $page]) . '.cache'; |
|
| 34 | + static $hasher = null; |
|
| 35 | + $hasher ??= new Hash32(); |
|
| 36 | + return $hasher->hash([$contexte, $page]) . '.cache'; |
|
| 37 | 37 | } |
| 38 | 38 | |
| 39 | 39 | /** |
| 40 | 40 | * Écrire le cache dans un casier |
| 41 | 41 | */ |
| 42 | 42 | function ecrire_cache(string $cache_key, array $valeur): bool { |
| 43 | - return cache_instance()->set($cache_key, ['cache_key' => $cache_key, 'valeur' => $valeur]); |
|
| 43 | + return cache_instance()->set($cache_key, ['cache_key' => $cache_key, 'valeur' => $valeur]); |
|
| 44 | 44 | } |
| 45 | 45 | |
| 46 | 46 | /** |
@@ -49,7 +49,7 @@ discard block |
||
| 49 | 49 | * @return null|mixed null: probably cache miss |
| 50 | 50 | */ |
| 51 | 51 | function lire_cache(string $cache_key): mixed { |
| 52 | - return cache_instance()->get($cache_key)['valeur'] ?? null; |
|
| 52 | + return cache_instance()->get($cache_key)['valeur'] ?? null; |
|
| 53 | 53 | } |
| 54 | 54 | |
| 55 | 55 | /** |
@@ -58,16 +58,16 @@ discard block |
||
| 58 | 58 | * Parano : on signe le cache, afin d'interdire un hack d'injection dans notre memcache |
| 59 | 59 | */ |
| 60 | 60 | function cache_signature(&$page): string { |
| 61 | - if (!isset($GLOBALS['meta']['cache_signature'])) { |
|
| 62 | - include_spip('inc/acces'); |
|
| 63 | - ecrire_meta( |
|
| 64 | - 'cache_signature', |
|
| 65 | - hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()), |
|
| 66 | - 'non' |
|
| 67 | - ); |
|
| 68 | - } |
|
| 69 | - |
|
| 70 | - return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']); |
|
| 61 | + if (!isset($GLOBALS['meta']['cache_signature'])) { |
|
| 62 | + include_spip('inc/acces'); |
|
| 63 | + ecrire_meta( |
|
| 64 | + 'cache_signature', |
|
| 65 | + hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()), |
|
| 66 | + 'non' |
|
| 67 | + ); |
|
| 68 | + } |
|
| 69 | + |
|
| 70 | + return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']); |
|
| 71 | 71 | } |
| 72 | 72 | |
| 73 | 73 | /** |
@@ -79,14 +79,14 @@ discard block |
||
| 79 | 79 | * on positionne un flag gz si on comprime, pour savoir si on doit decompresser ou pas |
| 80 | 80 | */ |
| 81 | 81 | function gzip_page(array $page): array { |
| 82 | - if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) { |
|
| 83 | - $page['gz'] = true; |
|
| 84 | - $page['texte'] = gzcompress((string) $page['texte']); |
|
| 85 | - } else { |
|
| 86 | - $page['gz'] = false; |
|
| 87 | - } |
|
| 88 | - |
|
| 89 | - return $page; |
|
| 82 | + if (function_exists('gzcompress') && strlen((string) $page['texte']) > 16 * 1024) { |
|
| 83 | + $page['gz'] = true; |
|
| 84 | + $page['texte'] = gzcompress((string) $page['texte']); |
|
| 85 | + } else { |
|
| 86 | + $page['gz'] = false; |
|
| 87 | + } |
|
| 88 | + |
|
| 89 | + return $page; |
|
| 90 | 90 | } |
| 91 | 91 | |
| 92 | 92 | /** |
@@ -97,10 +97,10 @@ discard block |
||
| 97 | 97 | * de decompresser deux fois de suite un cache (ce qui echoue) |
| 98 | 98 | */ |
| 99 | 99 | function gunzip_page(array &$page): void { |
| 100 | - if ($page['gz']) { |
|
| 101 | - $page['texte'] = gzuncompress($page['texte']); |
|
| 102 | - $page['gz'] = false; // ne pas gzuncompress deux fois une meme page |
|
| 103 | - } |
|
| 100 | + if ($page['gz']) { |
|
| 101 | + $page['texte'] = gzuncompress($page['texte']); |
|
| 102 | + $page['gz'] = false; // ne pas gzuncompress deux fois une meme page |
|
| 103 | + } |
|
| 104 | 104 | } |
| 105 | 105 | |
| 106 | 106 | /** |
@@ -114,72 +114,72 @@ discard block |
||
| 114 | 114 | * - -1 si il faut calculer sans stocker en cache |
| 115 | 115 | */ |
| 116 | 116 | function cache_valide(array &$page, int $date): int { |
| 117 | - $now = $_SERVER['REQUEST_TIME']; |
|
| 118 | - |
|
| 119 | - // Apparition d'un nouvel article post-date ? |
|
| 120 | - if ( |
|
| 121 | - isset($GLOBALS['meta']['post_dates']) |
|
| 122 | - && $GLOBALS['meta']['post_dates'] == 'non' |
|
| 123 | - && isset($GLOBALS['meta']['date_prochain_postdate']) |
|
| 124 | - && $now > $GLOBALS['meta']['date_prochain_postdate'] |
|
| 125 | - ) { |
|
| 126 | - spip_logger()->info('Un article post-date invalide le cache'); |
|
| 127 | - include_spip('inc/rubriques'); |
|
| 128 | - calculer_prochain_postdate(true); |
|
| 129 | - } |
|
| 130 | - |
|
| 131 | - if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) { |
|
| 132 | - return -1; |
|
| 133 | - } |
|
| 134 | - if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) { |
|
| 135 | - return -1; |
|
| 136 | - } |
|
| 137 | - if (defined('_NO_CACHE')) { |
|
| 138 | - return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE; |
|
| 139 | - } |
|
| 140 | - |
|
| 141 | - // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache) |
|
| 142 | - if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) { |
|
| 143 | - return _IS_BOT ? -1 : 1; |
|
| 144 | - } |
|
| 145 | - |
|
| 146 | - // controle de la signature |
|
| 147 | - if ($page['sig'] !== cache_signature($page)) { |
|
| 148 | - return _IS_BOT ? -1 : 1; |
|
| 149 | - } |
|
| 150 | - |
|
| 151 | - // #CACHE{n,statique} => on n'invalide pas avec derniere_modif |
|
| 152 | - // cf. ecrire/public/balises.php, balise_CACHE_dist() |
|
| 153 | - // Cache invalide par la meta 'derniere_modif' |
|
| 154 | - // sauf pour les bots, qui utilisent toujours le cache |
|
| 155 | - if ( |
|
| 156 | - (!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui') |
|
| 157 | - && ( |
|
| 158 | - !_IS_BOT |
|
| 159 | - && $GLOBALS['derniere_modif_invalide'] |
|
| 160 | - && isset($GLOBALS['meta']['derniere_modif']) |
|
| 161 | - && $date < $GLOBALS['meta']['derniere_modif'] |
|
| 162 | - ) |
|
| 163 | - ) { |
|
| 164 | - return 1; |
|
| 165 | - } |
|
| 166 | - |
|
| 167 | - // Sinon comparer l'age du fichier a sa duree de cache |
|
| 168 | - $duree = (int) $page['entetes']['X-Spip-Cache']; |
|
| 169 | - $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0); |
|
| 170 | - if ($duree == 0) { #CACHE{0} |
|
| 171 | - return -1; |
|
| 172 | - } // sauf pour les bots, qui utilisent toujours le cache |
|
| 173 | - else { |
|
| 174 | - if ( |
|
| 175 | - !_IS_BOT && $date + $duree < $now |
|
| 176 | - || $date < $cache_mark |
|
| 177 | - ) { |
|
| 178 | - return _IS_BOT ? -1 : 1; |
|
| 179 | - } else { |
|
| 180 | - return 0; |
|
| 181 | - } |
|
| 182 | - } |
|
| 117 | + $now = $_SERVER['REQUEST_TIME']; |
|
| 118 | + |
|
| 119 | + // Apparition d'un nouvel article post-date ? |
|
| 120 | + if ( |
|
| 121 | + isset($GLOBALS['meta']['post_dates']) |
|
| 122 | + && $GLOBALS['meta']['post_dates'] == 'non' |
|
| 123 | + && isset($GLOBALS['meta']['date_prochain_postdate']) |
|
| 124 | + && $now > $GLOBALS['meta']['date_prochain_postdate'] |
|
| 125 | + ) { |
|
| 126 | + spip_logger()->info('Un article post-date invalide le cache'); |
|
| 127 | + include_spip('inc/rubriques'); |
|
| 128 | + calculer_prochain_postdate(true); |
|
| 129 | + } |
|
| 130 | + |
|
| 131 | + if (defined('_VAR_NOCACHE') && _VAR_NOCACHE) { |
|
| 132 | + return -1; |
|
| 133 | + } |
|
| 134 | + if (isset($GLOBALS['meta']['cache_inhib']) && $_SERVER['REQUEST_TIME'] < $GLOBALS['meta']['cache_inhib']) { |
|
| 135 | + return -1; |
|
| 136 | + } |
|
| 137 | + if (defined('_NO_CACHE')) { |
|
| 138 | + return (_NO_CACHE == 0 && !isset($page['texte'])) ? 1 : _NO_CACHE; |
|
| 139 | + } |
|
| 140 | + |
|
| 141 | + // pas de cache ? on le met a jour, sauf pour les bots (on leur calcule la page sans mise en cache) |
|
| 142 | + if (!$page || !isset($page['texte']) || !isset($page['entetes']['X-Spip-Cache'])) { |
|
| 143 | + return _IS_BOT ? -1 : 1; |
|
| 144 | + } |
|
| 145 | + |
|
| 146 | + // controle de la signature |
|
| 147 | + if ($page['sig'] !== cache_signature($page)) { |
|
| 148 | + return _IS_BOT ? -1 : 1; |
|
| 149 | + } |
|
| 150 | + |
|
| 151 | + // #CACHE{n,statique} => on n'invalide pas avec derniere_modif |
|
| 152 | + // cf. ecrire/public/balises.php, balise_CACHE_dist() |
|
| 153 | + // Cache invalide par la meta 'derniere_modif' |
|
| 154 | + // sauf pour les bots, qui utilisent toujours le cache |
|
| 155 | + if ( |
|
| 156 | + (!isset($page['entetes']['X-Spip-Statique']) || $page['entetes']['X-Spip-Statique'] !== 'oui') |
|
| 157 | + && ( |
|
| 158 | + !_IS_BOT |
|
| 159 | + && $GLOBALS['derniere_modif_invalide'] |
|
| 160 | + && isset($GLOBALS['meta']['derniere_modif']) |
|
| 161 | + && $date < $GLOBALS['meta']['derniere_modif'] |
|
| 162 | + ) |
|
| 163 | + ) { |
|
| 164 | + return 1; |
|
| 165 | + } |
|
| 166 | + |
|
| 167 | + // Sinon comparer l'age du fichier a sa duree de cache |
|
| 168 | + $duree = (int) $page['entetes']['X-Spip-Cache']; |
|
| 169 | + $cache_mark = ($GLOBALS['meta']['cache_mark'] ?? 0); |
|
| 170 | + if ($duree == 0) { #CACHE{0} |
|
| 171 | + return -1; |
|
| 172 | + } // sauf pour les bots, qui utilisent toujours le cache |
|
| 173 | + else { |
|
| 174 | + if ( |
|
| 175 | + !_IS_BOT && $date + $duree < $now |
|
| 176 | + || $date < $cache_mark |
|
| 177 | + ) { |
|
| 178 | + return _IS_BOT ? -1 : 1; |
|
| 179 | + } else { |
|
| 180 | + return 0; |
|
| 181 | + } |
|
| 182 | + } |
|
| 183 | 183 | } |
| 184 | 184 | |
| 185 | 185 | /** |
@@ -193,58 +193,58 @@ discard block |
||
| 193 | 193 | */ |
| 194 | 194 | function creer_cache(&$page, &$cache_key) { |
| 195 | 195 | |
| 196 | - // Ne rien faire si on est en preview, debug, ou si une erreur |
|
| 197 | - // grave s'est presentee (compilation du squelette, MySQL, etc) |
|
| 198 | - // le cas var_nocache ne devrait jamais arriver ici (securite) |
|
| 199 | - // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable |
|
| 200 | - if ( |
|
| 201 | - defined('_VAR_NOCACHE') && _VAR_NOCACHE |
|
| 202 | - || defined('spip_interdire_cache') |
|
| 203 | - ) { |
|
| 204 | - return; |
|
| 205 | - } |
|
| 206 | - |
|
| 207 | - // Si la page a un invalideur de session, utiliser un cache_key spécifique |
|
| 208 | - if ( |
|
| 209 | - isset($page['invalideurs']) |
|
| 210 | - && isset($page['invalideurs']['session']) |
|
| 211 | - ) { |
|
| 212 | - // on verifie que le contenu du chemin cache indique seulement |
|
| 213 | - // "cache sessionne" ; sa date indique la date de validite |
|
| 214 | - // des caches sessionnes |
|
| 215 | - if (!$tmp = lire_cache($cache_key)) { |
|
| 216 | - spip_logger()->info('Creation cache sessionne ' . $cache_key); |
|
| 217 | - $tmp = [ |
|
| 218 | - 'invalideurs' => ['session' => ''], |
|
| 219 | - 'lastmodified' => $_SERVER['REQUEST_TIME'] |
|
| 220 | - ]; |
|
| 221 | - ecrire_cache($cache_key, $tmp); |
|
| 222 | - } |
|
| 223 | - $cache_key = cache_key( |
|
| 224 | - ['cache_key' => $cache_key], |
|
| 225 | - ['session' => $page['invalideurs']['session']] |
|
| 226 | - ); |
|
| 227 | - } |
|
| 228 | - |
|
| 229 | - // ajouter la date de production dans le cache lui meme |
|
| 230 | - // (qui contient deja sa duree de validite) |
|
| 231 | - $page['lastmodified'] = $_SERVER['REQUEST_TIME']; |
|
| 232 | - |
|
| 233 | - // compresser le contenu si besoin |
|
| 234 | - $pagez = gzip_page($page); |
|
| 235 | - |
|
| 236 | - // signer le contenu |
|
| 237 | - $pagez['sig'] = cache_signature($pagez); |
|
| 238 | - |
|
| 239 | - // l'enregistrer, compresse ou non... |
|
| 240 | - $ok = ecrire_cache($cache_key, $pagez); |
|
| 241 | - |
|
| 242 | - spip_logger()->info((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour " |
|
| 243 | - . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)')); |
|
| 244 | - |
|
| 245 | - // Inserer ses invalideurs |
|
| 246 | - include_spip('inc/invalideur'); |
|
| 247 | - maj_invalideurs($cache_key, $page); |
|
| 196 | + // Ne rien faire si on est en preview, debug, ou si une erreur |
|
| 197 | + // grave s'est presentee (compilation du squelette, MySQL, etc) |
|
| 198 | + // le cas var_nocache ne devrait jamais arriver ici (securite) |
|
| 199 | + // le cas spip_interdire_cache correspond a une ereur SQL grave non anticipable |
|
| 200 | + if ( |
|
| 201 | + defined('_VAR_NOCACHE') && _VAR_NOCACHE |
|
| 202 | + || defined('spip_interdire_cache') |
|
| 203 | + ) { |
|
| 204 | + return; |
|
| 205 | + } |
|
| 206 | + |
|
| 207 | + // Si la page a un invalideur de session, utiliser un cache_key spécifique |
|
| 208 | + if ( |
|
| 209 | + isset($page['invalideurs']) |
|
| 210 | + && isset($page['invalideurs']['session']) |
|
| 211 | + ) { |
|
| 212 | + // on verifie que le contenu du chemin cache indique seulement |
|
| 213 | + // "cache sessionne" ; sa date indique la date de validite |
|
| 214 | + // des caches sessionnes |
|
| 215 | + if (!$tmp = lire_cache($cache_key)) { |
|
| 216 | + spip_logger()->info('Creation cache sessionne ' . $cache_key); |
|
| 217 | + $tmp = [ |
|
| 218 | + 'invalideurs' => ['session' => ''], |
|
| 219 | + 'lastmodified' => $_SERVER['REQUEST_TIME'] |
|
| 220 | + ]; |
|
| 221 | + ecrire_cache($cache_key, $tmp); |
|
| 222 | + } |
|
| 223 | + $cache_key = cache_key( |
|
| 224 | + ['cache_key' => $cache_key], |
|
| 225 | + ['session' => $page['invalideurs']['session']] |
|
| 226 | + ); |
|
| 227 | + } |
|
| 228 | + |
|
| 229 | + // ajouter la date de production dans le cache lui meme |
|
| 230 | + // (qui contient deja sa duree de validite) |
|
| 231 | + $page['lastmodified'] = $_SERVER['REQUEST_TIME']; |
|
| 232 | + |
|
| 233 | + // compresser le contenu si besoin |
|
| 234 | + $pagez = gzip_page($page); |
|
| 235 | + |
|
| 236 | + // signer le contenu |
|
| 237 | + $pagez['sig'] = cache_signature($pagez); |
|
| 238 | + |
|
| 239 | + // l'enregistrer, compresse ou non... |
|
| 240 | + $ok = ecrire_cache($cache_key, $pagez); |
|
| 241 | + |
|
| 242 | + spip_logger()->info((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour " |
|
| 243 | + . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)')); |
|
| 244 | + |
|
| 245 | + // Inserer ses invalideurs |
|
| 246 | + include_spip('inc/invalideur'); |
|
| 247 | + maj_invalideurs($cache_key, $page); |
|
| 248 | 248 | } |
| 249 | 249 | |
| 250 | 250 | /** |
@@ -272,132 +272,132 @@ discard block |
||
| 272 | 272 | */ |
| 273 | 273 | function public_cacher_dist($contexte, &$use_cache, &$cache_key, &$page, &$lastmodified) { |
| 274 | 274 | |
| 275 | - # fonction de cache minimale : dire "non on ne met rien en cache" |
|
| 276 | - # $use_cache = -1; return; |
|
| 277 | - |
|
| 278 | - // Second appel, destine a l'enregistrement du cache sur le disque |
|
| 279 | - if (isset($cache_key)) { |
|
| 280 | - creer_cache($page, $cache_key); |
|
| 281 | - return; |
|
| 282 | - } |
|
| 283 | - |
|
| 284 | - // Toute la suite correspond au premier appel |
|
| 285 | - $contexte_implicite = $page['contexte_implicite']; |
|
| 286 | - |
|
| 287 | - // Cas ignorant le cache car completement dynamique |
|
| 288 | - if ( |
|
| 289 | - !empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST' |
|
| 290 | - || _request('connect') |
|
| 291 | - ) { |
|
| 292 | - $use_cache = -1; |
|
| 293 | - $lastmodified = 0; |
|
| 294 | - $cache_key = ''; |
|
| 295 | - $page = []; |
|
| 296 | - |
|
| 297 | - return; |
|
| 298 | - } |
|
| 299 | - |
|
| 300 | - // Controler l'existence d'un cache nous correspondant |
|
| 301 | - $cache_key = cache_key($contexte, $page); |
|
| 302 | - $lastmodified = 0; |
|
| 303 | - |
|
| 304 | - // charger le cache s'il existe (et si il a bien le bon hash = anticollision) |
|
| 305 | - if (!$page = lire_cache($cache_key)) { |
|
| 306 | - $page = []; |
|
| 307 | - } |
|
| 308 | - |
|
| 309 | - // s'il est sessionne, charger celui correspondant a notre session |
|
| 310 | - if ( |
|
| 311 | - isset($page['invalideurs']) |
|
| 312 | - && isset($page['invalideurs']['session']) |
|
| 313 | - ) { |
|
| 314 | - $cache_key_session = cache_key( |
|
| 315 | - ['cache_key' => $cache_key], |
|
| 316 | - ['session' => spip_session()] |
|
| 317 | - ); |
|
| 318 | - if ( |
|
| 319 | - ($page_session = lire_cache($cache_key_session)) && $page_session['lastmodified'] >= $page['lastmodified'] |
|
| 320 | - ) { |
|
| 321 | - $page = $page_session; |
|
| 322 | - } else { |
|
| 323 | - $page = []; |
|
| 324 | - } |
|
| 325 | - } |
|
| 326 | - |
|
| 327 | - |
|
| 328 | - // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ? |
|
| 329 | - // ne le faire que si la base est disponible |
|
| 330 | - $invalider = false; |
|
| 331 | - if (isset($GLOBALS['meta']['invalider']) && spip_connect()) { |
|
| 332 | - $invalider = true; |
|
| 333 | - } |
|
| 334 | - |
|
| 335 | - // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, |
|
| 336 | - // on supprime le cache |
|
| 337 | - if ( |
|
| 338 | - defined('_VAR_MODE') |
|
| 339 | - && _VAR_MODE |
|
| 340 | - && ( |
|
| 341 | - isset($_COOKIE['spip_session']) |
|
| 342 | - || isset($_COOKIE['spip_admin']) |
|
| 343 | - || @file_exists(_ACCESS_FILE_NAME) |
|
| 344 | - ) |
|
| 345 | - ) { |
|
| 346 | - $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu |
|
| 347 | - $invalider = true; |
|
| 348 | - } |
|
| 349 | - if ($invalider) { |
|
| 350 | - include_spip('inc/invalideur'); |
|
| 351 | - retire_caches($cache_key); # API invalideur inutile |
|
| 352 | - cache_instance()->delete($cache_key); |
|
| 353 | - if (isset($cache_key_session) && $cache_key_session) { |
|
| 354 | - cache_instance()->delete($cache_key_session); |
|
| 355 | - } |
|
| 356 | - } |
|
| 357 | - |
|
| 358 | - // $delais par defaut |
|
| 359 | - // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé |
|
| 360 | - // qui sont a cache nul par defaut |
|
| 361 | - if (!isset($GLOBALS['delais'])) { |
|
| 362 | - if (!defined('_DUREE_CACHE_DEFAUT')) { |
|
| 363 | - define('_DUREE_CACHE_DEFAUT', 24 * 3600); |
|
| 364 | - } |
|
| 365 | - $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; |
|
| 366 | - } |
|
| 367 | - |
|
| 368 | - // determiner la validite de la page |
|
| 369 | - if ($page) { |
|
| 370 | - $use_cache = cache_valide($page, $page['lastmodified'] ?? 0); |
|
| 371 | - // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence |
|
| 372 | - // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul |
|
| 373 | - $page['contexte_implicite'] = $contexte_implicite; |
|
| 374 | - if (!$use_cache) { |
|
| 375 | - // $page est un cache utilisable |
|
| 376 | - gunzip_page($page); |
|
| 377 | - |
|
| 378 | - return; |
|
| 379 | - } |
|
| 380 | - } else { |
|
| 381 | - $page = ['contexte_implicite' => $contexte_implicite]; |
|
| 382 | - $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul |
|
| 383 | - } |
|
| 384 | - |
|
| 385 | - // Si pas valide mais pas de connexion a la base, le garder quand meme |
|
| 386 | - if (!spip_connect()) { |
|
| 387 | - if (isset($page['texte'])) { |
|
| 388 | - gunzip_page($page); |
|
| 389 | - $use_cache = 0; |
|
| 390 | - } else { |
|
| 391 | - spip_logger()->info("Erreur base de donnees, impossible utiliser $cache_key"); |
|
| 392 | - include_spip('inc/minipres'); |
|
| 393 | - |
|
| 394 | - return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]); |
|
| 395 | - } |
|
| 396 | - } |
|
| 397 | - |
|
| 398 | - if ($use_cache < 0) { |
|
| 399 | - $cache_key = ''; |
|
| 400 | - } |
|
| 401 | - |
|
| 402 | - return; |
|
| 275 | + # fonction de cache minimale : dire "non on ne met rien en cache" |
|
| 276 | + # $use_cache = -1; return; |
|
| 277 | + |
|
| 278 | + // Second appel, destine a l'enregistrement du cache sur le disque |
|
| 279 | + if (isset($cache_key)) { |
|
| 280 | + creer_cache($page, $cache_key); |
|
| 281 | + return; |
|
| 282 | + } |
|
| 283 | + |
|
| 284 | + // Toute la suite correspond au premier appel |
|
| 285 | + $contexte_implicite = $page['contexte_implicite']; |
|
| 286 | + |
|
| 287 | + // Cas ignorant le cache car completement dynamique |
|
| 288 | + if ( |
|
| 289 | + !empty($_SERVER['REQUEST_METHOD']) && $_SERVER['REQUEST_METHOD'] === 'POST' |
|
| 290 | + || _request('connect') |
|
| 291 | + ) { |
|
| 292 | + $use_cache = -1; |
|
| 293 | + $lastmodified = 0; |
|
| 294 | + $cache_key = ''; |
|
| 295 | + $page = []; |
|
| 296 | + |
|
| 297 | + return; |
|
| 298 | + } |
|
| 299 | + |
|
| 300 | + // Controler l'existence d'un cache nous correspondant |
|
| 301 | + $cache_key = cache_key($contexte, $page); |
|
| 302 | + $lastmodified = 0; |
|
| 303 | + |
|
| 304 | + // charger le cache s'il existe (et si il a bien le bon hash = anticollision) |
|
| 305 | + if (!$page = lire_cache($cache_key)) { |
|
| 306 | + $page = []; |
|
| 307 | + } |
|
| 308 | + |
|
| 309 | + // s'il est sessionne, charger celui correspondant a notre session |
|
| 310 | + if ( |
|
| 311 | + isset($page['invalideurs']) |
|
| 312 | + && isset($page['invalideurs']['session']) |
|
| 313 | + ) { |
|
| 314 | + $cache_key_session = cache_key( |
|
| 315 | + ['cache_key' => $cache_key], |
|
| 316 | + ['session' => spip_session()] |
|
| 317 | + ); |
|
| 318 | + if ( |
|
| 319 | + ($page_session = lire_cache($cache_key_session)) && $page_session['lastmodified'] >= $page['lastmodified'] |
|
| 320 | + ) { |
|
| 321 | + $page = $page_session; |
|
| 322 | + } else { |
|
| 323 | + $page = []; |
|
| 324 | + } |
|
| 325 | + } |
|
| 326 | + |
|
| 327 | + |
|
| 328 | + // Faut-il effacer des pages invalidees (en particulier ce cache-ci) ? |
|
| 329 | + // ne le faire que si la base est disponible |
|
| 330 | + $invalider = false; |
|
| 331 | + if (isset($GLOBALS['meta']['invalider']) && spip_connect()) { |
|
| 332 | + $invalider = true; |
|
| 333 | + } |
|
| 334 | + |
|
| 335 | + // Si un calcul, recalcul [ou preview, mais c'est recalcul] est demande, |
|
| 336 | + // on supprime le cache |
|
| 337 | + if ( |
|
| 338 | + defined('_VAR_MODE') |
|
| 339 | + && _VAR_MODE |
|
| 340 | + && ( |
|
| 341 | + isset($_COOKIE['spip_session']) |
|
| 342 | + || isset($_COOKIE['spip_admin']) |
|
| 343 | + || @file_exists(_ACCESS_FILE_NAME) |
|
| 344 | + ) |
|
| 345 | + ) { |
|
| 346 | + $page = ['contexte_implicite' => $contexte_implicite]; // ignorer le cache deja lu |
|
| 347 | + $invalider = true; |
|
| 348 | + } |
|
| 349 | + if ($invalider) { |
|
| 350 | + include_spip('inc/invalideur'); |
|
| 351 | + retire_caches($cache_key); # API invalideur inutile |
|
| 352 | + cache_instance()->delete($cache_key); |
|
| 353 | + if (isset($cache_key_session) && $cache_key_session) { |
|
| 354 | + cache_instance()->delete($cache_key_session); |
|
| 355 | + } |
|
| 356 | + } |
|
| 357 | + |
|
| 358 | + // $delais par defaut |
|
| 359 | + // pour toutes les pages sans #CACHE{} hors modeles/ et espace privé |
|
| 360 | + // qui sont a cache nul par defaut |
|
| 361 | + if (!isset($GLOBALS['delais'])) { |
|
| 362 | + if (!defined('_DUREE_CACHE_DEFAUT')) { |
|
| 363 | + define('_DUREE_CACHE_DEFAUT', 24 * 3600); |
|
| 364 | + } |
|
| 365 | + $GLOBALS['delais'] = _DUREE_CACHE_DEFAUT; |
|
| 366 | + } |
|
| 367 | + |
|
| 368 | + // determiner la validite de la page |
|
| 369 | + if ($page) { |
|
| 370 | + $use_cache = cache_valide($page, $page['lastmodified'] ?? 0); |
|
| 371 | + // le contexte implicite n'est pas stocke dans le cache, mais il y a equivalence |
|
| 372 | + // par le nom du cache. On le reinjecte donc ici pour utilisation eventuelle au calcul |
|
| 373 | + $page['contexte_implicite'] = $contexte_implicite; |
|
| 374 | + if (!$use_cache) { |
|
| 375 | + // $page est un cache utilisable |
|
| 376 | + gunzip_page($page); |
|
| 377 | + |
|
| 378 | + return; |
|
| 379 | + } |
|
| 380 | + } else { |
|
| 381 | + $page = ['contexte_implicite' => $contexte_implicite]; |
|
| 382 | + $use_cache = cache_valide($page, 0); // fichier cache absent : provoque le calcul |
|
| 383 | + } |
|
| 384 | + |
|
| 385 | + // Si pas valide mais pas de connexion a la base, le garder quand meme |
|
| 386 | + if (!spip_connect()) { |
|
| 387 | + if (isset($page['texte'])) { |
|
| 388 | + gunzip_page($page); |
|
| 389 | + $use_cache = 0; |
|
| 390 | + } else { |
|
| 391 | + spip_logger()->info("Erreur base de donnees, impossible utiliser $cache_key"); |
|
| 392 | + include_spip('inc/minipres'); |
|
| 393 | + |
|
| 394 | + return minipres(_T('info_travaux_titre'), _T('titre_probleme_technique'), ['status' => 503]); |
|
| 395 | + } |
|
| 396 | + } |
|
| 397 | + |
|
| 398 | + if ($use_cache < 0) { |
|
| 399 | + $cache_key = ''; |
|
| 400 | + } |
|
| 401 | + |
|
| 402 | + return; |
|
| 403 | 403 | } |
@@ -33,7 +33,7 @@ discard block |
||
| 33 | 33 | function cache_key(array $contexte, array $page): string { |
| 34 | 34 | static $hasher = null; |
| 35 | 35 | $hasher ??= new Hash32(); |
| 36 | - return $hasher->hash([$contexte, $page]) . '.cache'; |
|
| 36 | + return $hasher->hash([$contexte, $page]).'.cache'; |
|
| 37 | 37 | } |
| 38 | 38 | |
| 39 | 39 | /** |
@@ -62,12 +62,12 @@ discard block |
||
| 62 | 62 | include_spip('inc/acces'); |
| 63 | 63 | ecrire_meta( |
| 64 | 64 | 'cache_signature', |
| 65 | - hash('sha256', $_SERVER['DOCUMENT_ROOT'] . ($_SERVER['SERVER_SIGNATURE'] ?? '') . creer_uniqid()), |
|
| 65 | + hash('sha256', $_SERVER['DOCUMENT_ROOT'].($_SERVER['SERVER_SIGNATURE'] ?? '').creer_uniqid()), |
|
| 66 | 66 | 'non' |
| 67 | 67 | ); |
| 68 | 68 | } |
| 69 | 69 | |
| 70 | - return (new Hash32())->hash($GLOBALS['meta']['cache_signature'] . $page['texte']); |
|
| 70 | + return (new Hash32())->hash($GLOBALS['meta']['cache_signature'].$page['texte']); |
|
| 71 | 71 | } |
| 72 | 72 | |
| 73 | 73 | /** |
@@ -213,7 +213,7 @@ discard block |
||
| 213 | 213 | // "cache sessionne" ; sa date indique la date de validite |
| 214 | 214 | // des caches sessionnes |
| 215 | 215 | if (!$tmp = lire_cache($cache_key)) { |
| 216 | - spip_logger()->info('Creation cache sessionne ' . $cache_key); |
|
| 216 | + spip_logger()->info('Creation cache sessionne '.$cache_key); |
|
| 217 | 217 | $tmp = [ |
| 218 | 218 | 'invalideurs' => ['session' => ''], |
| 219 | 219 | 'lastmodified' => $_SERVER['REQUEST_TIME'] |
@@ -239,8 +239,8 @@ discard block |
||
| 239 | 239 | // l'enregistrer, compresse ou non... |
| 240 | 240 | $ok = ecrire_cache($cache_key, $pagez); |
| 241 | 241 | |
| 242 | - spip_logger()->info((_IS_BOT ? 'Bot:' : '') . "Creation du cache $cache_key pour " |
|
| 243 | - . $page['entetes']['X-Spip-Cache'] . ' secondes' . ($ok ? '' : ' (erreur!)')); |
|
| 242 | + spip_logger()->info((_IS_BOT ? 'Bot:' : '')."Creation du cache $cache_key pour " |
|
| 243 | + . $page['entetes']['X-Spip-Cache'].' secondes'.($ok ? '' : ' (erreur!)')); |
|
| 244 | 244 | |
| 245 | 245 | // Inserer ses invalideurs |
| 246 | 246 | include_spip('inc/invalideur'); |